@netless/appliance-plugin 1.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +138 -0
- package/cdn/appliance-plugin.js +1 -0
- package/cdn/appliance-plugin.mjs +8639 -0
- package/cdn/style.css +1 -0
- package/dist/appliance-plugin.js +1 -0
- package/dist/appliance-plugin.mjs +8639 -0
- package/dist/collector/base.d.ts +20 -0
- package/dist/collector/collector.d.ts +53 -0
- package/dist/collector/const.d.ts +3 -0
- package/dist/collector/enum.d.ts +13 -0
- package/dist/collector/eventCollector.d.ts +29 -0
- package/dist/collector/index.d.ts +4 -0
- package/dist/collector/types.d.ts +70 -0
- package/dist/collector/utils/color.d.ts +31 -0
- package/dist/collector/utils/index.d.ts +5 -0
- package/dist/component/textEditor/index.d.ts +2 -0
- package/dist/component/textEditor/manager.d.ts +120 -0
- package/dist/component/textEditor/types.d.ts +50 -0
- package/dist/component/textEditor/utils.d.ts +3 -0
- package/dist/component/textEditor/view.d.ts +68 -0
- package/dist/core/const.d.ts +1 -0
- package/dist/core/enum.d.ts +135 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/mainEngine.d.ts +163 -0
- package/dist/core/msgEvent/activeZIndex/forMain.d.ts +12 -0
- package/dist/core/msgEvent/activeZIndex/forWorker.d.ts +8 -0
- package/dist/core/msgEvent/base.d.ts +18 -0
- package/dist/core/msgEvent/baseForWorker.d.ts +13 -0
- package/dist/core/msgEvent/copyNode/forMain.d.ts +47 -0
- package/dist/core/msgEvent/copyNode/forWorker.d.ts +8 -0
- package/dist/core/msgEvent/deleteNode/forMain.d.ts +11 -0
- package/dist/core/msgEvent/deleteNode/forWorker.d.ts +13 -0
- package/dist/core/msgEvent/forWorker.d.ts +14 -0
- package/dist/core/msgEvent/index.d.ts +15 -0
- package/dist/core/msgEvent/rotateNode/forMain.d.ts +16 -0
- package/dist/core/msgEvent/rotateNode/forWorker.d.ts +9 -0
- package/dist/core/msgEvent/scaleNode/forMain.d.ts +20 -0
- package/dist/core/msgEvent/scaleNode/forWorker.d.ts +9 -0
- package/dist/core/msgEvent/setColor/forMain.d.ts +18 -0
- package/dist/core/msgEvent/setColor/forWorker.d.ts +9 -0
- package/dist/core/msgEvent/setFont/forMain.d.ts +18 -0
- package/dist/core/msgEvent/setFont/forWorker.d.ts +9 -0
- package/dist/core/msgEvent/setLock/forMain.d.ts +12 -0
- package/dist/core/msgEvent/setLock/forWorker.d.ts +9 -0
- package/dist/core/msgEvent/setPoint/forMain.d.ts +15 -0
- package/dist/core/msgEvent/setPoint/forWorker.d.ts +9 -0
- package/dist/core/msgEvent/setShape/forMain.d.ts +18 -0
- package/dist/core/msgEvent/setShape/forWorker.d.ts +9 -0
- package/dist/core/msgEvent/setZIndex/forMain.d.ts +22 -0
- package/dist/core/msgEvent/setZIndex/forWorker.d.ts +9 -0
- package/dist/core/msgEvent/translateNode/forMain.d.ts +20 -0
- package/dist/core/msgEvent/translateNode/forWorker.d.ts +9 -0
- package/dist/core/tools/arrow.d.ts +46 -0
- package/dist/core/tools/base.d.ts +82 -0
- package/dist/core/tools/ellipse.d.ts +44 -0
- package/dist/core/tools/eraser.d.ts +41 -0
- package/dist/core/tools/image.d.ts +53 -0
- package/dist/core/tools/index.d.ts +13 -0
- package/dist/core/tools/laserPen.d.ts +42 -0
- package/dist/core/tools/pencil.d.ts +66 -0
- package/dist/core/tools/polygon.d.ts +45 -0
- package/dist/core/tools/rectangle.d.ts +46 -0
- package/dist/core/tools/selector.d.ts +83 -0
- package/dist/core/tools/speechBalloon.d.ts +49 -0
- package/dist/core/tools/star.d.ts +47 -0
- package/dist/core/tools/straight.d.ts +46 -0
- package/dist/core/tools/text.d.ts +42 -0
- package/dist/core/tools/utils.d.ts +39 -0
- package/dist/core/types.d.ts +295 -0
- package/dist/core/utils/bezier.d.ts +43 -0
- package/dist/core/utils/getSvgPathFromPoints.d.ts +10 -0
- package/dist/core/utils/index.d.ts +364 -0
- package/dist/core/utils/math.d.ts +57 -0
- package/dist/core/utils/primitives/Box2d.d.ts +100 -0
- package/dist/core/utils/primitives/Point2d.d.ts +71 -0
- package/dist/core/utils/primitives/Vec2d.d.ts +146 -0
- package/dist/core/utils/primitives/easings.d.ts +24 -0
- package/dist/core/utils/proxy.d.ts +21 -0
- package/dist/core/utils/spriteNode.d.ts +4 -0
- package/dist/core/worker/base.d.ts +103 -0
- package/dist/core/worker/fullWorker.d.ts +1 -0
- package/dist/core/worker/fullWorkerLocal.d.ts +46 -0
- package/dist/core/worker/fullWorkerService.d.ts +41 -0
- package/dist/core/worker/subWorker.d.ts +1 -0
- package/dist/core/worker/subWorkerLocal.d.ts +20 -0
- package/dist/core/worker/vNodeManager.d.ts +32 -0
- package/dist/core/worker/workerManager.d.ts +71 -0
- package/dist/cursors/index.d.ts +73 -0
- package/dist/displayer/const.d.ts +11 -0
- package/dist/displayer/cursor/index.d.ts +15 -0
- package/dist/displayer/floatBar/index.d.ts +10 -0
- package/dist/displayer/floatBtns/colors.d.ts +6 -0
- package/dist/displayer/floatBtns/del.d.ts +6 -0
- package/dist/displayer/floatBtns/duplicate.d.ts +5 -0
- package/dist/displayer/floatBtns/fontSize.d.ts +4 -0
- package/dist/displayer/floatBtns/fontStyle.d.ts +4 -0
- package/dist/displayer/floatBtns/index.d.ts +11 -0
- package/dist/displayer/floatBtns/layer.d.ts +3 -0
- package/dist/displayer/floatBtns/lock.d.ts +7 -0
- package/dist/displayer/floatBtns/shapeOpt.d.ts +3 -0
- package/dist/displayer/highlightBox/index.d.ts +5 -0
- package/dist/displayer/icons/index.d.ts +4 -0
- package/dist/displayer/resizable/index.d.ts +16 -0
- package/dist/displayer/rotate/index.d.ts +4 -0
- package/dist/displayer/types.d.ts +51 -0
- package/dist/hotkey/index.d.ts +51 -0
- package/dist/index.d.ts +1 -0
- package/dist/members/index.d.ts +15 -0
- package/dist/plugin/applianceMultiPlugin.d.ts +24 -0
- package/dist/plugin/applianceSinglePlugin.d.ts +28 -0
- package/dist/plugin/baseApplianceManager.d.ts +82 -0
- package/dist/plugin/baseViewContainerManager.d.ts +174 -0
- package/dist/plugin/displayerView.d.ts +55 -0
- package/dist/plugin/external.d.ts +2 -0
- package/dist/plugin/index.d.ts +6 -0
- package/dist/plugin/multi/applianceMultiManager.d.ts +14 -0
- package/dist/plugin/multi/containerManager.d.ts +24 -0
- package/dist/plugin/multi/displayer/appViewDisplayerManager.d.ts +24 -0
- package/dist/plugin/multi/displayer/mainViewDisplayerManager.d.ts +25 -0
- package/dist/plugin/single/applianceDisplayer.d.ts +16 -0
- package/dist/plugin/single/applianceSingleManager.d.ts +13 -0
- package/dist/plugin/single/containerManager.d.ts +11 -0
- package/dist/plugin/single/displayer/mainViewDisplayerManager.d.ts +25 -0
- package/dist/plugin/types.d.ts +310 -0
- package/dist/plugin/utils.d.ts +6 -0
- package/dist/style.css +1 -0
- package/dist/undo/index.d.ts +70 -0
- package/package.json +59 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var UZ=Object.defineProperty;var wZ=(c,l,d)=>l in c?UZ(c,l,{enumerable:!0,configurable:!0,writable:!0,value:d}):c[l]=d;var h=(c,l,d)=>(wZ(c,typeof l!="symbol"?l+"":l,d),d);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const D=require("white-web-sdk");require("spritejs");const dZ=require("lz-string");require("lineclip");const lZ=require("eventemitter2"),Xb=require("lodash"),Bl=require("react-dom"),V=require("react"),Zl=require("react-draggable"),vZ=require("re-resizable");var t=(c=>(c[c.Pencil=1]="Pencil",c[c.Eraser=2]="Eraser",c[c.Selector=3]="Selector",c[c.Clicker=4]="Clicker",c[c.Arrow=5]="Arrow",c[c.Hand=6]="Hand",c[c.LaserPen=7]="LaserPen",c[c.Text=8]="Text",c[c.Straight=9]="Straight",c[c.Rectangle=10]="Rectangle",c[c.Ellipse=11]="Ellipse",c[c.Star=12]="Star",c[c.Triangle=13]="Triangle",c[c.Rhombus=14]="Rhombus",c[c.Polygon=15]="Polygon",c[c.SpeechBalloon=16]="SpeechBalloon",c[c.Image=17]="Image",c))(t||{}),r=(c=>(c[c.Local=1]="Local",c[c.Service=2]="Service",c[c.Worker=3]="Worker",c))(r||{}),K=(c=>(c[c.Pending=0]="Pending",c[c.Start=1]="Start",c[c.Doing=2]="Doing",c[c.Done=3]="Done",c[c.Freeze=4]="Freeze",c[c.Unwritable=5]="Unwritable",c))(K||{}),N=(c=>(c[c.None=0]="None",c[c.Init=1]="Init",c[c.UpdateCamera=2]="UpdateCamera",c[c.UpdateTools=3]="UpdateTools",c[c.CreateWork=4]="CreateWork",c[c.DrawWork=5]="DrawWork",c[c.FullWork=6]="FullWork",c[c.UpdateNode=7]="UpdateNode",c[c.RemoveNode=8]="RemoveNode",c[c.Clear=9]="Clear",c[c.Select=10]="Select",c[c.Destroy=11]="Destroy",c[c.Snapshot=12]="Snapshot",c[c.BoundingBox=13]="BoundingBox",c[c.Cursor=14]="Cursor",c[c.TextUpdate=15]="TextUpdate",c[c.GetTextActive=16]="GetTextActive",c[c.TasksQueue=17]="TasksQueue",c[c.CursorHover=18]="CursorHover",c))(N||{}),cl=(c=>(c.Webgl2="webgl2",c.Webgl="webgl",c.Canvas2d="2d",c))(cl||{}),Td=(c=>(c[c.Float=1]="Float",c[c.Bg=2]="Bg",c[c.Selector=3]="Selector",c[c.ServiceFloat=4]="ServiceFloat",c[c.None=5]="None",c))(Td||{}),Od=(c=>(c[c.Cursor=1]="Cursor",c[c.TextCreate=2]="TextCreate",c))(Od||{}),Ed=(c=>(c[c.Top=1]="Top",c[c.Bottom=2]="Bottom",c))(Ed||{}),ud=(c=>(c[c.none=1]="none",c[c.all=2]="all",c[c.both=3]="both",c[c.proportional=4]="proportional",c))(ud||{}),E=(c=>(c.selector="selector",c.clicker="clicker",c.laserPointer="laserPointer",c.pencil="pencil",c.rectangle="rectangle",c.ellipse="ellipse",c.shape="shape",c.eraser="eraser",c.pencilEraser="pencilEraser",c.text="text",c.straight="straight",c.arrow="arrow",c.hand="hand",c.laserPen="laserPen",c))(E||{}),bZ=(c=>(c[c.pedding=0]="pedding",c[c.mounted=1]="mounted",c[c.update=2]="update",c[c.unmounted=3]="unmounted",c))(bZ||{}),Fl=(c=>(c.Normal="Normal",c.Stroke="Stroke",c.Dotted="Dotted",c.LongDotted="LongDotted",c))(Fl||{}),Kd=(c=>(c.Triangle="triangle",c.Rhombus="rhombus",c.Pentagram="pentagram",c.SpeechBalloon="speechBalloon",c.Star="star",c.Polygon="polygon",c))(Kd||{}),C=(c=>(c.None="None",c.ShowFloatBar="ShowFloatBar",c.ZIndexFloatBar="ZIndexFloatBar",c.DeleteNode="DeleteNode",c.CopyNode="CopyNode",c.ZIndexActive="ZIndexActive",c.ZIndexNode="ZIndexNode",c.RotateNode="RotateNode",c.SetColorNode="SetColorNode",c.TranslateNode="TranslateNode",c.ScaleNode="ScaleNode",c.OriginalEvent="OriginalEvent",c.CreateScene="CreateScene",c.ActiveCursor="ActiveCursor",c.MoveCursor="MoveCursor",c.CommandEditor="CommandEditor",c.SetEditorData="SetEditorData",c.SetFontStyle="SetFontStyle",c.SetPoint="SetPoint",c.SetLock="SetLock",c.SetShapeOpt="SetShapeOpt",c))(C||{}),v=(c=>(c.DisplayState="DisplayState",c.FloatBar="FloatBar",c.CanvasSelector="CanvasSelector",c.MainEngine="MainEngine",c.DisplayContainer="DisplayContainer",c.Cursor="Cursor",c.TextEditor="TextEditor",c.BindMainView="BindMainView",c.MountMainView="MountMainView",c.MountAppView="MountAppView",c))(v||{});const PZ={linear:c=>c,easeInQuad:c=>c*c,easeOutQuad:c=>c*(2-c),easeInOutQuad:c=>c<.5?2*c*c:-1+(4-2*c)*c,easeInCubic:c=>c*c*c,easeOutCubic:c=>--c*c*c+1,easeInOutCubic:c=>c<.5?4*c*c*c:(c-1)*(2*c-2)*(2*c-2)+1,easeInQuart:c=>c*c*c*c,easeOutQuart:c=>1- --c*c*c*c,easeInOutQuart:c=>c<.5?8*c*c*c*c:1-8*--c*c*c*c,easeInQuint:c=>c*c*c*c*c,easeOutQuint:c=>1+--c*c*c*c*c,easeInOutQuint:c=>c<.5?16*c*c*c*c*c:1+16*--c*c*c*c*c,easeInSine:c=>1-Math.cos(c*Math.PI/2),easeOutSine:c=>Math.sin(c*Math.PI/2),easeInOutSine:c=>-(Math.cos(Math.PI*c)-1)/2,easeInExpo:c=>c<=0?0:Math.pow(2,10*c-10),easeOutExpo:c=>c>=1?1:1-Math.pow(2,-10*c),easeInOutExpo:c=>c<=0?0:c>=1?1:c<.5?Math.pow(2,20*c-10)/2:(2-Math.pow(2,-20*c+10))/2};class T{constructor(l=0,d=0,b=1){this.x=l,this.y=d,this.z=b}get XY(){return[this.x,this.y]}setz(l){return this.z=l,this}setXY(l=this.x,d=this.y){return this.x=l,this.y=d,this}set(l=this.x,d=this.y,b=this.z){return this.x=l,this.y=d,this.z=b,this}setTo({x:l=0,y:d=0,z:b=1}){return this.x=l,this.y=d,this.z=b,this}rot(l){if(l===0)return this;const{x:d,y:b}=this,Z=Math.sin(l),i=Math.cos(l);return this.x=d*i-b*Z,this.y=d*Z+b*i,this}rotWith(l,d){if(d===0)return this;const b=this.x-l.x,Z=this.y-l.y,i=Math.sin(d),m=Math.cos(d);return this.x=l.x+(b*m-Z*i),this.y=l.y+(b*i+Z*m),this}clone(){const{x:l,y:d,z:b}=this;return new T(l,d,b)}sub(l){return this.x-=l.x,this.y-=l.y,this}subXY(l,d){return this.x-=l,this.y-=d,this}subScalar(l){return this.x-=l,this.y-=l,this}add(l){return this.x+=l.x,this.y+=l.y,this}addXY(l,d){return this.x+=l,this.y+=d,this}addScalar(l){return this.x+=l,this.y+=l,this}clamp(l,d){return this.x=Math.max(this.x,l),this.y=Math.max(this.y,l),d!==void 0&&(this.x=Math.min(this.x,d),this.y=Math.min(this.y,d)),this}div(l){return this.x/=l,this.y/=l,this}divV(l){return this.x/=l.x,this.y/=l.y,this}mul(l){return this.x*=l,this.y*=l,this}mulV(l){return this.x*=l.x,this.y*=l.y,this}abs(){return this.x=Math.abs(this.x),this.y=Math.abs(this.y),this}nudge(l,d){const b=T.Tan(l,this);return this.add(b.mul(d))}neg(){return this.x*=-1,this.y*=-1,this}cross(l){return this.x=this.y*l.z-this.z*l.y,this.y=this.z*l.x-this.x*l.z,this}dpr(l){return T.Dpr(this,l)}cpr(l){return T.Cpr(this,l)}len2(){return T.Len2(this)}len(){return T.Len(this)}pry(l){return T.Pry(this,l)}per(){const{x:l,y:d}=this;return this.x=d,this.y=-l,this}uni(){return T.Uni(this)}tan(l){return T.Tan(this,l)}dist(l){return T.Dist(this,l)}distanceToLineSegment(l,d){return T.DistanceToLineSegment(l,d,this)}slope(l){return T.Slope(this,l)}snapToGrid(l){return this.x=Math.round(this.x/l)*l,this.y=Math.round(this.y/l)*l,this}angle(l){return T.Angle(this,l)}toAngle(){return T.ToAngle(this)}lrp(l,d){return this.x=this.x+(l.x-this.x)*d,this.y=this.y+(l.y-this.y)*d,this}equals(l,d){return T.Equals(this,l,d)}equalsXY(l,d){return T.EqualsXY(this,l,d)}norm(){const l=this.len();return this.x=l===0?0:this.x/l,this.y=l===0?0:this.y/l,this}toFixed(){return T.ToFixed(this)}toString(){return T.ToString(T.ToFixed(this))}toJson(){return T.ToJson(this)}toArray(){return T.ToArray(this)}static Add(l,d){return new T(l.x+d.x,l.y+d.y)}static AddXY(l,d,b){return new T(l.x+d,l.y+b)}static Sub(l,d){return new T(l.x-d.x,l.y-d.y)}static SubXY(l,d,b){return new T(l.x-d,l.y-b)}static AddScalar(l,d){return new T(l.x+d,l.y+d)}static SubScalar(l,d){return new T(l.x-d,l.y-d)}static Div(l,d){return new T(l.x/d,l.y/d)}static Mul(l,d){return new T(l.x*d,l.y*d)}static DivV(l,d){return new T(l.x/d.x,l.y/d.y)}static MulV(l,d){return new T(l.x*d.x,l.y*d.y)}static Neg(l){return new T(-l.x,-l.y)}static Per(l){return new T(l.y,-l.x)}static Dist2(l,d){return T.Sub(l,d).len2()}static Abs(l){return new T(Math.abs(l.x),Math.abs(l.y))}static Dist(l,d){return Math.hypot(l.y-d.y,l.x-d.x)}static Dpr(l,d){return l.x*d.x+l.y*d.y}static Cross(l,d){return new T(l.y*d.z-l.z*d.y,l.z*d.x-l.x*d.z)}static Cpr(l,d){return l.x*d.y-d.x*l.y}static Len2(l){return l.x*l.x+l.y*l.y}static Len(l){return Math.hypot(l.x,l.y)}static Pry(l,d){return T.Dpr(l,d)/T.Len(d)}static Uni(l){return T.Div(l,T.Len(l))}static Tan(l,d){return T.Uni(T.Sub(l,d))}static Min(l,d){return new T(Math.min(l.x,d.x),Math.min(l.y,d.y))}static Max(l,d){return new T(Math.max(l.x,d.x),Math.max(l.y,d.y))}static From(l){return new T().add(l)}static FromArray(l){return new T(l[0],l[1])}static Rot(l,d=0){const b=Math.sin(d),Z=Math.cos(d);return new T(l.x*Z-l.y*b,l.x*b+l.y*Z)}static RotWith(l,d,b){const Z=l.x-d.x,i=l.y-d.y,m=Math.sin(b),X=Math.cos(b);return new T(d.x+(Z*X-i*m),d.y+(Z*m+i*X))}static NearestPointOnLineThroughPoint(l,d,b){return T.Mul(d,T.Sub(b,l).pry(d)).add(l)}static NearestPointOnLineSegment(l,d,b,Z=!0){const i=T.Tan(d,l),m=T.Add(l,T.Mul(i,T.Sub(b,l).pry(i)));if(Z){if(m.x<Math.min(l.x,d.x))return T.Cast(l.x<d.x?l:d);if(m.x>Math.max(l.x,d.x))return T.Cast(l.x>d.x?l:d);if(m.y<Math.min(l.y,d.y))return T.Cast(l.y<d.y?l:d);if(m.y>Math.max(l.y,d.y))return T.Cast(l.y>d.y?l:d)}return m}static DistanceToLineThroughPoint(l,d,b){return T.Dist(b,T.NearestPointOnLineThroughPoint(l,d,b))}static DistanceToLineSegment(l,d,b,Z=!0){return T.Dist(b,T.NearestPointOnLineSegment(l,d,b,Z))}static Snap(l,d=1){return new T(Math.round(l.x/d)*d,Math.round(l.y/d)*d)}static Cast(l){return l instanceof T?l:T.From(l)}static Slope(l,d){return l.x===d.y?NaN:(l.y-d.y)/(l.x-d.x)}static Angle(l,d){return Math.atan2(d.y-l.y,d.x-l.x)}static Lrp(l,d,b){return T.Sub(d,l).mul(b).add(l)}static Med(l,d){return new T((l.x+d.x)/2,(l.y+d.y)/2)}static Equals(l,d,b=1e-4){return Math.abs(l.x-d.x)<b&&Math.abs(l.y-d.y)<b}static EqualsXY(l,d,b){return l.x===d&&l.y===b}static EqualsXYZ(l,d,b=1e-4){return T.Equals(l,d,b)&&Math.abs((l.z||0)-(d.z||0))<b}static Clockwise(l,d,b){return(b.x-l.x)*(d.y-l.y)-(d.x-l.x)*(b.y-l.y)<0}static Rescale(l,d){const b=T.Len(l);return new T(d*l.x/b,d*l.y/b)}static ScaleWithOrigin(l,d,b){return T.Sub(l,b).mul(d).add(b)}static ScaleWOrigin(l,d,b){return T.Sub(l,b).mulV(d).add(b)}static ToFixed(l,d=2){return new T(+l.x.toFixed(d),+l.y.toFixed(d),+l.z.toFixed(d))}static Nudge(l,d,b){return T.Add(l,T.Tan(d,l).mul(b))}static ToString(l){return`${l.x}, ${l.y}`}static ToAngle(l){let d=Math.atan2(l.y,l.x);return d<0&&(d+=Math.PI*2),d}static FromAngle(l,d=1){return new T(Math.cos(l)*d,Math.sin(l)*d)}static ToArray(l){return[l.x,l.y,l.z]}static ToJson(l){const{x:d,y:b,z:Z}=l;return{x:d,y:b,z:Z}}static Average(l){const d=l.length,b=new T(0,0);for(let Z=0;Z<d;Z++)b.add(l[Z]);return b.div(d)}static Clamp(l,d,b){return b===void 0?new T(Math.min(Math.max(l.x,d)),Math.min(Math.max(l.y,d))):new T(Math.min(Math.max(l.x,d),b),Math.min(Math.max(l.y,d),b))}static PointsBetween(l,d,b=6){const Z=[];for(let i=0;i<b;i++){const m=PZ.easeInQuad(i/(b-1)),X=T.Lrp(l,d,m);X.z=Math.min(1,.5+Math.abs(.5-jZ(m))*.65),Z.push(X)}return Z}static SnapToGrid(l,d=8){return new T(Math.round(l.x/d)*d,Math.round(l.y/d)*d)}}const jZ=c=>c<.5?2*c*c:-1+(4-2*c)*c;class bd extends T{constructor(l=0,d=0,b=0,Z={x:0,y:0},i=0,m=0){super(l,d,b),this.x=l,this.y=d,this.z=b,this.v=Z,this.t=i,this.a=m}get timestamp(){return this.t}get pressure(){return this.z}get angleNum(){return this.a}get XY(){return[this.x,this.y]}setA(l){this.a=l}setT(l){this.t=l}setv(l){return this.v={x:l.x,y:l.y},this}set(l=this.x,d=this.y,b=this.z,Z=this.v,i=this.t,m=this.a){return this.x=l,this.y=d,this.z=b,this.v=Z,this.t=i,this.a=m,this}clone(){const{x:l,y:d,z:b,v:Z,t:i,a:m}=this,X={x:Z.x,y:Z.y};return new bd(l,d,b,X,i,m)}distance(l){return bd.GetDistance(this,l)}isNear(l,d){return bd.IsNear(this,l,d)}getAngleByPoints(l,d){return bd.GetAngleByPoints(l,this,d)}static Sub(l,d){return new bd(l.x-d.x,l.y-d.y)}static Add(l,d){return new bd(l.x+d.x,l.y+d.y)}static GetDistance(l,d){return bd.Len(l.clone().sub(d))}static GetAngleByPoints(l,d,b){const Z=d.x-l.x,i=b.x-d.x,m=d.y-l.y,X=b.y-d.y;let s=0;const G=Math.sqrt(Z*Z+m*m),p=Math.sqrt(i*i+X*X);if(G&&p){const W=Z*i+m*X;s=Math.acos(W/(G*p)),s=s/Math.PI*180;let I=Z*X-m*i;I=I>0?1:-1,s=180+I*s}return s}static IsNear(l,d,b){return bd.Len(l.clone().sub(d))<b}static RotWith(l,d,b,Z=2){const i=l.x-d.x,m=l.y-d.y,X=Math.sin(b),s=Math.cos(b),G=Math.pow(10,Z),p=Math.floor((d.x+(i*s-m*X))*G)/G,W=Math.floor((d.y+(i*X+m*s))*G)/G;return new bd(p,W)}static GetDotStroke(l,d,b=16){const Z=new T(1,1),i=Math.PI+.001,m=bd.Add(l,bd.Sub(l,Z).uni().per().mul(-d)),X=[];for(let s=1/b,G=s;G<=1;G+=s)X.push(bd.RotWith(m,l,i*2*G));return X}static GetSemicircleStroke(l,d,b=-1,Z=8){const i=b*(Math.PI+.001),m=[];for(let X=1/Z,s=X;s<=1;s+=X)m.push(bd.RotWith(d,l,i*s));return m}}var ml=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function vd(c){return c&&c.__esModule&&Object.prototype.hasOwnProperty.call(c,"default")?c.default:c}var BZ=typeof ml=="object"&&ml&&ml.Object===Object&&ml,ZZ=BZ,EZ=ZZ,rZ=typeof self=="object"&&self&&self.Object===Object&&self,OZ=EZ||rZ||Function("return this")(),Sd=OZ,DZ=Sd,fZ=DZ.Symbol,al=fZ,sb=al,cZ=Object.prototype,AZ=cZ.hasOwnProperty,qZ=cZ.toString,ll=sb?sb.toStringTag:void 0;function $Z(c){var l=AZ.call(c,ll),d=c[ll];try{c[ll]=void 0;var b=!0}catch{}var Z=qZ.call(c);return b&&(l?c[ll]=d:delete c[ll]),Z}var _Z=$Z,dc=Object.prototype,lc=dc.toString;function bc(c){return lc.call(c)}var Zc=bc,Gb=al,cc=_Z,ic=Zc,mc="[object Null]",Xc="[object Undefined]",Wb=Gb?Gb.toStringTag:void 0;function sc(c){return c==null?c===void 0?Xc:mc:Wb&&Wb in Object(c)?cc(c):ic(c)}var Pd=sc;function Gc(c){return c!=null&&typeof c=="object"}var kd=Gc,Wc=Pd,Vc=kd,pc="[object Number]";function oc(c){return typeof c=="number"||Vc(c)&&Wc(c)==pc}var Ic=oc;const md=vd(Ic);function Lc(){this.__data__=[],this.size=0}var hc=Lc;function uc(c,l){return c===l||c!==c&&l!==l}var El=uc,ac=El;function tc(c,l){for(var d=c.length;d--;)if(ac(c[d][0],l))return d;return-1}var tl=tc,yc=tl,nc=Array.prototype,Yc=nc.splice;function Rc(c){var l=this.__data__,d=yc(l,c);if(d<0)return!1;var b=l.length-1;return d==b?l.pop():Yc.call(l,d,1),--this.size,!0}var xc=Rc,Sc=tl;function Kc(c){var l=this.__data__,d=Sc(l,c);return d<0?void 0:l[d][1]}var Cc=Kc,ec=tl;function Jc(c){return ec(this.__data__,c)>-1}var Nc=Jc,Tc=tl;function Fc(c,l){var d=this.__data__,b=Tc(d,c);return b<0?(++this.size,d.push([c,l])):d[b][1]=l,this}var zc=Fc,Hc=hc,kc=xc,Mc=Cc,gc=Nc,Qc=zc;function Ad(c){var l=-1,d=c==null?0:c.length;for(this.clear();++l<d;){var b=c[l];this.set(b[0],b[1])}}Ad.prototype.clear=Hc;Ad.prototype.delete=kc;Ad.prototype.get=Mc;Ad.prototype.has=gc;Ad.prototype.set=Qc;var yl=Ad,Uc=yl;function wc(){this.__data__=new Uc,this.size=0}var vc=wc;function Pc(c){var l=this.__data__,d=l.delete(c);return this.size=l.size,d}var jc=Pc;function Bc(c){return this.__data__.get(c)}var Ec=Bc;function rc(c){return this.__data__.has(c)}var Oc=rc;function Dc(c){var l=typeof c;return c!=null&&(l=="object"||l=="function")}var gd=Dc,fc=Pd,Ac=gd,qc="[object AsyncFunction]",$c="[object Function]",_c="[object GeneratorFunction]",di="[object Proxy]";function li(c){if(!Ac(c))return!1;var l=fc(c);return l==$c||l==_c||l==qc||l==di}var iZ=li,bi=Sd,Zi=bi["__core-js_shared__"],ci=Zi,Cl=ci,Vb=function(){var c=/[^.]+$/.exec(Cl&&Cl.keys&&Cl.keys.IE_PROTO||"");return c?"Symbol(src)_1."+c:""}();function ii(c){return!!Vb&&Vb in c}var mi=ii,Xi=Function.prototype,si=Xi.toString;function Gi(c){if(c!=null){try{return si.call(c)}catch{}try{return c+""}catch{}}return""}var mZ=Gi,Wi=iZ,Vi=mi,pi=gd,oi=mZ,Ii=/[\\^$.*+?()[\]{}|]/g,Li=/^\[object .+?Constructor\]$/,hi=Function.prototype,ui=Object.prototype,ai=hi.toString,ti=ui.hasOwnProperty,yi=RegExp("^"+ai.call(ti).replace(Ii,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function ni(c){if(!pi(c)||Vi(c))return!1;var l=Wi(c)?yi:Li;return l.test(oi(c))}var Yi=ni;function Ri(c,l){return c==null?void 0:c[l]}var xi=Ri,Si=Yi,Ki=xi;function Ci(c,l){var d=Ki(c,l);return Si(d)?d:void 0}var jd=Ci,ei=jd,Ji=Sd,Ni=ei(Ji,"Map"),rl=Ni,Ti=jd,Fi=Ti(Object,"create"),nl=Fi,pb=nl;function zi(){this.__data__=pb?pb(null):{},this.size=0}var Hi=zi;function ki(c){var l=this.has(c)&&delete this.__data__[c];return this.size-=l?1:0,l}var Mi=ki,gi=nl,Qi="__lodash_hash_undefined__",Ui=Object.prototype,wi=Ui.hasOwnProperty;function vi(c){var l=this.__data__;if(gi){var d=l[c];return d===Qi?void 0:d}return wi.call(l,c)?l[c]:void 0}var Pi=vi,ji=nl,Bi=Object.prototype,Ei=Bi.hasOwnProperty;function ri(c){var l=this.__data__;return ji?l[c]!==void 0:Ei.call(l,c)}var Oi=ri,Di=nl,fi="__lodash_hash_undefined__";function Ai(c,l){var d=this.__data__;return this.size+=this.has(c)?0:1,d[c]=Di&&l===void 0?fi:l,this}var qi=Ai,$i=Hi,_i=Mi,d0=Pi,l0=Oi,b0=qi;function qd(c){var l=-1,d=c==null?0:c.length;for(this.clear();++l<d;){var b=c[l];this.set(b[0],b[1])}}qd.prototype.clear=$i;qd.prototype.delete=_i;qd.prototype.get=d0;qd.prototype.has=l0;qd.prototype.set=b0;var Z0=qd,ob=Z0,c0=yl,i0=rl;function m0(){this.size=0,this.__data__={hash:new ob,map:new(i0||c0),string:new ob}}var X0=m0;function s0(c){var l=typeof c;return l=="string"||l=="number"||l=="symbol"||l=="boolean"?c!=="__proto__":c===null}var G0=s0,W0=G0;function V0(c,l){var d=c.__data__;return W0(l)?d[typeof l=="string"?"string":"hash"]:d.map}var Yl=V0,p0=Yl;function o0(c){var l=p0(this,c).delete(c);return this.size-=l?1:0,l}var I0=o0,L0=Yl;function h0(c){return L0(this,c).get(c)}var u0=h0,a0=Yl;function t0(c){return a0(this,c).has(c)}var y0=t0,n0=Yl;function Y0(c,l){var d=n0(this,c),b=d.size;return d.set(c,l),this.size+=d.size==b?0:1,this}var R0=Y0,x0=X0,S0=I0,K0=u0,C0=y0,e0=R0;function $d(c){var l=-1,d=c==null?0:c.length;for(this.clear();++l<d;){var b=c[l];this.set(b[0],b[1])}}$d.prototype.clear=x0;$d.prototype.delete=S0;$d.prototype.get=K0;$d.prototype.has=C0;$d.prototype.set=e0;var XZ=$d,J0=yl,N0=rl,T0=XZ,F0=200;function z0(c,l){var d=this.__data__;if(d instanceof J0){var b=d.__data__;if(!N0||b.length<F0-1)return b.push([c,l]),this.size=++d.size,this;d=this.__data__=new T0(b)}return d.set(c,l),this.size=d.size,this}var H0=z0,k0=yl,M0=vc,g0=jc,Q0=Ec,U0=Oc,w0=H0;function _d(c){var l=this.__data__=new k0(c);this.size=l.size}_d.prototype.clear=M0;_d.prototype.delete=g0;_d.prototype.get=Q0;_d.prototype.has=U0;_d.prototype.set=w0;var sZ=_d;function v0(c,l){for(var d=-1,b=c==null?0:c.length;++d<b&&l(c[d],d,c)!==!1;);return c}var P0=v0,j0=jd,B0=function(){try{var c=j0(Object,"defineProperty");return c({},"",{}),c}catch{}}(),E0=B0,Ib=E0;function r0(c,l,d){l=="__proto__"&&Ib?Ib(c,l,{configurable:!0,enumerable:!0,value:d,writable:!0}):c[l]=d}var GZ=r0,O0=GZ,D0=El,f0=Object.prototype,A0=f0.hasOwnProperty;function q0(c,l,d){var b=c[l];(!(A0.call(c,l)&&D0(b,d))||d===void 0&&!(l in c))&&O0(c,l,d)}var WZ=q0,$0=WZ,_0=GZ;function dm(c,l,d,b){var Z=!d;d||(d={});for(var i=-1,m=l.length;++i<m;){var X=l[i],s=b?b(d[X],c[X],X,d,c):void 0;s===void 0&&(s=c[X]),Z?_0(d,X,s):$0(d,X,s)}return d}var Rl=dm;function lm(c,l){for(var d=-1,b=Array(c);++d<c;)b[d]=l(d);return b}var bm=lm,Zm=Pd,cm=kd,im="[object Arguments]";function mm(c){return cm(c)&&Zm(c)==im}var Xm=mm,Lb=Xm,sm=kd,VZ=Object.prototype,Gm=VZ.hasOwnProperty,Wm=VZ.propertyIsEnumerable,Vm=Lb(function(){return arguments}())?Lb:function(c){return sm(c)&&Gm.call(c,"callee")&&!Wm.call(c,"callee")},pm=Vm,om=Array.isArray,xl=om,ol={exports:{}};function Im(){return!1}var Lm=Im;ol.exports;(function(c,l){var d=Sd,b=Lm,Z=l&&!l.nodeType&&l,i=Z&&!0&&c&&!c.nodeType&&c,m=i&&i.exports===Z,X=m?d.Buffer:void 0,s=X?X.isBuffer:void 0,G=s||b;c.exports=G})(ol,ol.exports);var Ol=ol.exports,hm=9007199254740991,um=/^(?:0|[1-9]\d*)$/;function am(c,l){var d=typeof c;return l=l??hm,!!l&&(d=="number"||d!="symbol"&&um.test(c))&&c>-1&&c%1==0&&c<l}var tm=am,ym=9007199254740991;function nm(c){return typeof c=="number"&&c>-1&&c%1==0&&c<=ym}var pZ=nm,Ym=Pd,Rm=pZ,xm=kd,Sm="[object Arguments]",Km="[object Array]",Cm="[object Boolean]",em="[object Date]",Jm="[object Error]",Nm="[object Function]",Tm="[object Map]",Fm="[object Number]",zm="[object Object]",Hm="[object RegExp]",km="[object Set]",Mm="[object String]",gm="[object WeakMap]",Qm="[object ArrayBuffer]",Um="[object DataView]",wm="[object Float32Array]",vm="[object Float64Array]",Pm="[object Int8Array]",jm="[object Int16Array]",Bm="[object Int32Array]",Em="[object Uint8Array]",rm="[object Uint8ClampedArray]",Om="[object Uint16Array]",Dm="[object Uint32Array]",ld={};ld[wm]=ld[vm]=ld[Pm]=ld[jm]=ld[Bm]=ld[Em]=ld[rm]=ld[Om]=ld[Dm]=!0;ld[Sm]=ld[Km]=ld[Qm]=ld[Cm]=ld[Um]=ld[em]=ld[Jm]=ld[Nm]=ld[Tm]=ld[Fm]=ld[zm]=ld[Hm]=ld[km]=ld[Mm]=ld[gm]=!1;function fm(c){return xm(c)&&Rm(c.length)&&!!ld[Ym(c)]}var Am=fm;function qm(c){return function(l){return c(l)}}var Dl=qm,Il={exports:{}};Il.exports;(function(c,l){var d=ZZ,b=l&&!l.nodeType&&l,Z=b&&!0&&c&&!c.nodeType&&c,i=Z&&Z.exports===b,m=i&&d.process,X=function(){try{var s=Z&&Z.require&&Z.require("util").types;return s||m&&m.binding&&m.binding("util")}catch{}}();c.exports=X})(Il,Il.exports);var fl=Il.exports,$m=Am,_m=Dl,hb=fl,ub=hb&&hb.isTypedArray,dX=ub?_m(ub):$m,oZ=dX,lX=bm,bX=pm,ZX=xl,cX=Ol,iX=tm,mX=oZ,XX=Object.prototype,sX=XX.hasOwnProperty;function GX(c,l){var d=ZX(c),b=!d&&bX(c),Z=!d&&!b&&cX(c),i=!d&&!b&&!Z&&mX(c),m=d||b||Z||i,X=m?lX(c.length,String):[],s=X.length;for(var G in c)(l||sX.call(c,G))&&!(m&&(G=="length"||Z&&(G=="offset"||G=="parent")||i&&(G=="buffer"||G=="byteLength"||G=="byteOffset")||iX(G,s)))&&X.push(G);return X}var IZ=GX,WX=Object.prototype;function VX(c){var l=c&&c.constructor,d=typeof l=="function"&&l.prototype||WX;return c===d}var Al=VX;function pX(c,l){return function(d){return c(l(d))}}var LZ=pX,oX=LZ,IX=oX(Object.keys,Object),LX=IX,hX=Al,uX=LX,aX=Object.prototype,tX=aX.hasOwnProperty;function yX(c){if(!hX(c))return uX(c);var l=[];for(var d in Object(c))tX.call(c,d)&&d!="constructor"&&l.push(d);return l}var nX=yX,YX=iZ,RX=pZ;function xX(c){return c!=null&&RX(c.length)&&!YX(c)}var hZ=xX,SX=IZ,KX=nX,CX=hZ;function eX(c){return CX(c)?SX(c):KX(c)}var ql=eX,JX=Rl,NX=ql;function TX(c,l){return c&&JX(l,NX(l),c)}var FX=TX;function zX(c){var l=[];if(c!=null)for(var d in Object(c))l.push(d);return l}var HX=zX,kX=gd,MX=Al,gX=HX,QX=Object.prototype,UX=QX.hasOwnProperty;function wX(c){if(!kX(c))return gX(c);var l=MX(c),d=[];for(var b in c)b=="constructor"&&(l||!UX.call(c,b))||d.push(b);return d}var vX=wX,PX=IZ,jX=vX,BX=hZ;function EX(c){return BX(c)?PX(c,!0):jX(c)}var $l=EX,rX=Rl,OX=$l;function DX(c,l){return c&&rX(l,OX(l),c)}var fX=DX,Ll={exports:{}};Ll.exports;(function(c,l){var d=Sd,b=l&&!l.nodeType&&l,Z=b&&!0&&c&&!c.nodeType&&c,i=Z&&Z.exports===b,m=i?d.Buffer:void 0,X=m?m.allocUnsafe:void 0;function s(G,p){if(p)return G.slice();var W=G.length,I=X?X(W):new G.constructor(W);return G.copy(I),I}c.exports=s})(Ll,Ll.exports);var AX=Ll.exports;function qX(c,l){var d=-1,b=c.length;for(l||(l=Array(b));++d<b;)l[d]=c[d];return l}var $X=qX;function _X(c,l){for(var d=-1,b=c==null?0:c.length,Z=0,i=[];++d<b;){var m=c[d];l(m,d,c)&&(i[Z++]=m)}return i}var ds=_X;function ls(){return[]}var uZ=ls,bs=ds,Zs=uZ,cs=Object.prototype,is=cs.propertyIsEnumerable,ab=Object.getOwnPropertySymbols,ms=ab?function(c){return c==null?[]:(c=Object(c),bs(ab(c),function(l){return is.call(c,l)}))}:Zs,_l=ms,Xs=Rl,ss=_l;function Gs(c,l){return Xs(c,ss(c),l)}var Ws=Gs;function Vs(c,l){for(var d=-1,b=l.length,Z=c.length;++d<b;)c[Z+d]=l[d];return c}var aZ=Vs,ps=LZ,os=ps(Object.getPrototypeOf,Object),tZ=os,Is=aZ,Ls=tZ,hs=_l,us=uZ,as=Object.getOwnPropertySymbols,ts=as?function(c){for(var l=[];c;)Is(l,hs(c)),c=Ls(c);return l}:us,yZ=ts,ys=Rl,ns=yZ;function Ys(c,l){return ys(c,ns(c),l)}var Rs=Ys,xs=aZ,Ss=xl;function Ks(c,l,d){var b=l(c);return Ss(c)?b:xs(b,d(c))}var nZ=Ks,Cs=nZ,es=_l,Js=ql;function Ns(c){return Cs(c,Js,es)}var YZ=Ns,Ts=nZ,Fs=yZ,zs=$l;function Hs(c){return Ts(c,zs,Fs)}var ks=Hs,Ms=jd,gs=Sd,Qs=Ms(gs,"DataView"),Us=Qs,ws=jd,vs=Sd,Ps=ws(vs,"Promise"),js=Ps,Bs=jd,Es=Sd,rs=Bs(Es,"Set"),Os=rs,Ds=jd,fs=Sd,As=Ds(fs,"WeakMap"),qs=As,zl=Us,Hl=rl,kl=js,Ml=Os,gl=qs,RZ=Pd,dl=mZ,tb="[object Map]",$s="[object Object]",yb="[object Promise]",nb="[object Set]",Yb="[object WeakMap]",Rb="[object DataView]",_s=dl(zl),dG=dl(Hl),lG=dl(kl),bG=dl(Ml),ZG=dl(gl),Qd=RZ;(zl&&Qd(new zl(new ArrayBuffer(1)))!=Rb||Hl&&Qd(new Hl)!=tb||kl&&Qd(kl.resolve())!=yb||Ml&&Qd(new Ml)!=nb||gl&&Qd(new gl)!=Yb)&&(Qd=function(c){var l=RZ(c),d=l==$s?c.constructor:void 0,b=d?dl(d):"";if(b)switch(b){case _s:return Rb;case dG:return tb;case lG:return yb;case bG:return nb;case ZG:return Yb}return l});var Sl=Qd,cG=Object.prototype,iG=cG.hasOwnProperty;function mG(c){var l=c.length,d=new c.constructor(l);return l&&typeof c[0]=="string"&&iG.call(c,"index")&&(d.index=c.index,d.input=c.input),d}var XG=mG,sG=Sd,GG=sG.Uint8Array,xZ=GG,xb=xZ;function WG(c){var l=new c.constructor(c.byteLength);return new xb(l).set(new xb(c)),l}var db=WG,VG=db;function pG(c,l){var d=l?VG(c.buffer):c.buffer;return new c.constructor(d,c.byteOffset,c.byteLength)}var oG=pG,IG=/\w*$/;function LG(c){var l=new c.constructor(c.source,IG.exec(c));return l.lastIndex=c.lastIndex,l}var hG=LG,Sb=al,Kb=Sb?Sb.prototype:void 0,Cb=Kb?Kb.valueOf:void 0;function uG(c){return Cb?Object(Cb.call(c)):{}}var aG=uG,tG=db;function yG(c,l){var d=l?tG(c.buffer):c.buffer;return new c.constructor(d,c.byteOffset,c.length)}var nG=yG,YG=db,RG=oG,xG=hG,SG=aG,KG=nG,CG="[object Boolean]",eG="[object Date]",JG="[object Map]",NG="[object Number]",TG="[object RegExp]",FG="[object Set]",zG="[object String]",HG="[object Symbol]",kG="[object ArrayBuffer]",MG="[object DataView]",gG="[object Float32Array]",QG="[object Float64Array]",UG="[object Int8Array]",wG="[object Int16Array]",vG="[object Int32Array]",PG="[object Uint8Array]",jG="[object Uint8ClampedArray]",BG="[object Uint16Array]",EG="[object Uint32Array]";function rG(c,l,d){var b=c.constructor;switch(l){case kG:return YG(c);case CG:case eG:return new b(+c);case MG:return RG(c,d);case gG:case QG:case UG:case wG:case vG:case PG:case jG:case BG:case EG:return KG(c,d);case JG:return new b;case NG:case zG:return new b(c);case TG:return xG(c);case FG:return new b;case HG:return SG(c)}}var OG=rG,DG=gd,eb=Object.create,fG=function(){function c(){}return function(l){if(!DG(l))return{};if(eb)return eb(l);c.prototype=l;var d=new c;return c.prototype=void 0,d}}(),AG=fG,qG=AG,$G=tZ,_G=Al;function dW(c){return typeof c.constructor=="function"&&!_G(c)?qG($G(c)):{}}var lW=dW,bW=Sl,ZW=kd,cW="[object Map]";function iW(c){return ZW(c)&&bW(c)==cW}var mW=iW,XW=mW,sW=Dl,Jb=fl,Nb=Jb&&Jb.isMap,GW=Nb?sW(Nb):XW,WW=GW,VW=Sl,pW=kd,oW="[object Set]";function IW(c){return pW(c)&&VW(c)==oW}var LW=IW,hW=LW,uW=Dl,Tb=fl,Fb=Tb&&Tb.isSet,aW=Fb?uW(Fb):hW,tW=aW,yW=sZ,nW=P0,YW=WZ,RW=FX,xW=fX,SW=AX,KW=$X,CW=Ws,eW=Rs,JW=YZ,NW=ks,TW=Sl,FW=XG,zW=OG,HW=lW,kW=xl,MW=Ol,gW=WW,QW=gd,UW=tW,wW=ql,vW=$l,PW=1,jW=2,BW=4,SZ="[object Arguments]",EW="[object Array]",rW="[object Boolean]",OW="[object Date]",DW="[object Error]",KZ="[object Function]",fW="[object GeneratorFunction]",AW="[object Map]",qW="[object Number]",CZ="[object Object]",$W="[object RegExp]",_W="[object Set]",dV="[object String]",lV="[object Symbol]",bV="[object WeakMap]",ZV="[object ArrayBuffer]",cV="[object DataView]",iV="[object Float32Array]",mV="[object Float64Array]",XV="[object Int8Array]",sV="[object Int16Array]",GV="[object Int32Array]",WV="[object Uint8Array]",VV="[object Uint8ClampedArray]",pV="[object Uint16Array]",oV="[object Uint32Array]",dd={};dd[SZ]=dd[EW]=dd[ZV]=dd[cV]=dd[rW]=dd[OW]=dd[iV]=dd[mV]=dd[XV]=dd[sV]=dd[GV]=dd[AW]=dd[qW]=dd[CZ]=dd[$W]=dd[_W]=dd[dV]=dd[lV]=dd[WV]=dd[VV]=dd[pV]=dd[oV]=!0;dd[DW]=dd[KZ]=dd[bV]=!1;function pl(c,l,d,b,Z,i){var m,X=l&PW,s=l&jW,G=l&BW;if(d&&(m=Z?d(c,b,Z,i):d(c)),m!==void 0)return m;if(!QW(c))return c;var p=kW(c);if(p){if(m=FW(c),!X)return KW(c,m)}else{var W=TW(c),I=W==KZ||W==fW;if(MW(c))return SW(c,X);if(W==CZ||W==SZ||I&&!Z){if(m=s||I?{}:HW(c),!X)return s?eW(c,xW(m,c)):CW(c,RW(m,c))}else{if(!dd[W])return Z?c:{};m=zW(c,W,X)}}i||(i=new yW);var o=i.get(c);if(o)return o;i.set(c,m),UW(c)?c.forEach(function(Y){m.add(pl(Y,l,d,Y,c,i))}):gW(c)&&c.forEach(function(Y,L){m.set(L,pl(Y,l,d,L,c,i))});var u=G?s?NW:JW:s?vW:wW,y=p?void 0:u(c);return nW(y||c,function(Y,L){y&&(L=Y,Y=c[L]),YW(m,L,pl(Y,l,d,L,c,i))}),m}var eZ=pl,IV=eZ,LV=1,hV=4;function uV(c){return IV(c,LV|hV)}var aV=uV;const Zd=vd(aV);function tV(c){return JSON.parse(dZ.decompress(c))}function yV(c){return dZ.compress(JSON.stringify(c))}const hd=Object.keys,ed="++",k="selector",nV="all";var YV="__lodash_hash_undefined__";function RV(c){return this.__data__.set(c,YV),this}var xV=RV;function SV(c){return this.__data__.has(c)}var KV=SV,CV=XZ,eV=xV,JV=KV;function hl(c){var l=-1,d=c==null?0:c.length;for(this.__data__=new CV;++l<d;)this.add(c[l])}hl.prototype.add=hl.prototype.push=eV;hl.prototype.has=JV;var NV=hl;function TV(c,l){for(var d=-1,b=c==null?0:c.length;++d<b;)if(l(c[d],d,c))return!0;return!1}var FV=TV;function zV(c,l){return c.has(l)}var HV=zV,kV=NV,MV=FV,gV=HV,QV=1,UV=2;function wV(c,l,d,b,Z,i){var m=d&QV,X=c.length,s=l.length;if(X!=s&&!(m&&s>X))return!1;var G=i.get(c),p=i.get(l);if(G&&p)return G==l&&p==c;var W=-1,I=!0,o=d&UV?new kV:void 0;for(i.set(c,l),i.set(l,c);++W<X;){var u=c[W],y=l[W];if(b)var Y=m?b(y,u,W,l,c,i):b(u,y,W,c,l,i);if(Y!==void 0){if(Y)continue;I=!1;break}if(o){if(!MV(l,function(L,n){if(!gV(o,n)&&(u===L||Z(u,L,d,b,i)))return o.push(n)})){I=!1;break}}else if(!(u===y||Z(u,y,d,b,i))){I=!1;break}}return i.delete(c),i.delete(l),I}var JZ=wV;function vV(c){var l=-1,d=Array(c.size);return c.forEach(function(b,Z){d[++l]=[Z,b]}),d}var PV=vV;function jV(c){var l=-1,d=Array(c.size);return c.forEach(function(b){d[++l]=b}),d}var BV=jV,zb=al,Hb=xZ,EV=El,rV=JZ,OV=PV,DV=BV,fV=1,AV=2,qV="[object Boolean]",$V="[object Date]",_V="[object Error]",dp="[object Map]",lp="[object Number]",bp="[object RegExp]",Zp="[object Set]",cp="[object String]",ip="[object Symbol]",mp="[object ArrayBuffer]",Xp="[object DataView]",kb=zb?zb.prototype:void 0,el=kb?kb.valueOf:void 0;function sp(c,l,d,b,Z,i,m){switch(d){case Xp:if(c.byteLength!=l.byteLength||c.byteOffset!=l.byteOffset)return!1;c=c.buffer,l=l.buffer;case mp:return!(c.byteLength!=l.byteLength||!i(new Hb(c),new Hb(l)));case qV:case $V:case lp:return EV(+c,+l);case _V:return c.name==l.name&&c.message==l.message;case bp:case cp:return c==l+"";case dp:var X=OV;case Zp:var s=b&fV;if(X||(X=DV),c.size!=l.size&&!s)return!1;var G=m.get(c);if(G)return G==l;b|=AV,m.set(c,l);var p=rV(X(c),X(l),b,Z,i,m);return m.delete(c),p;case ip:if(el)return el.call(c)==el.call(l)}return!1}var Gp=sp,Mb=YZ,Wp=1,Vp=Object.prototype,pp=Vp.hasOwnProperty;function op(c,l,d,b,Z,i){var m=d&Wp,X=Mb(c),s=X.length,G=Mb(l),p=G.length;if(s!=p&&!m)return!1;for(var W=s;W--;){var I=X[W];if(!(m?I in l:pp.call(l,I)))return!1}var o=i.get(c),u=i.get(l);if(o&&u)return o==l&&u==c;var y=!0;i.set(c,l),i.set(l,c);for(var Y=m;++W<s;){I=X[W];var L=c[I],n=l[I];if(b)var a=m?b(n,L,I,l,c,i):b(L,n,I,c,l,i);if(!(a===void 0?L===n||Z(L,n,d,b,i):a)){y=!1;break}Y||(Y=I=="constructor")}if(y&&!Y){var x=c.constructor,R=l.constructor;x!=R&&"constructor"in c&&"constructor"in l&&!(typeof x=="function"&&x instanceof x&&typeof R=="function"&&R instanceof R)&&(y=!1)}return i.delete(c),i.delete(l),y}var Ip=op,Jl=sZ,Lp=JZ,hp=Gp,up=Ip,gb=Sl,Qb=xl,Ub=Ol,ap=oZ,tp=1,wb="[object Arguments]",vb="[object Array]",Xl="[object Object]",yp=Object.prototype,Pb=yp.hasOwnProperty;function np(c,l,d,b,Z,i){var m=Qb(c),X=Qb(l),s=m?vb:gb(c),G=X?vb:gb(l);s=s==wb?Xl:s,G=G==wb?Xl:G;var p=s==Xl,W=G==Xl,I=s==G;if(I&&Ub(c)){if(!Ub(l))return!1;m=!0,p=!1}if(I&&!p)return i||(i=new Jl),m||ap(c)?Lp(c,l,d,b,Z,i):hp(c,l,s,d,b,Z,i);if(!(d&tp)){var o=p&&Pb.call(c,"__wrapped__"),u=W&&Pb.call(l,"__wrapped__");if(o||u){var y=o?c.value():c,Y=u?l.value():l;return i||(i=new Jl),Z(y,Y,d,b,i)}}return I?(i||(i=new Jl),up(c,l,d,b,Z,i)):!1}var Yp=np,Rp=Yp,jb=kd;function NZ(c,l,d,b,Z){return c===l?!0:c==null||l==null||!jb(c)&&!jb(l)?c!==c&&l!==l:Rp(c,l,d,b,NZ,Z)}var xp=NZ,Sp=xp;function Kp(c,l){return Sp(c,l)}var Cp=Kp;const sd=vd(Cp);var ep=Pd,Jp=kd,Np="[object Boolean]";function Tp(c){return c===!0||c===!1||Jp(c)&&ep(c)==Np}var Fp=Tp;const Ld=vd(Fp);function TZ(c,l){if(c&&l){const d=Math.min(c.originX,l.originX),b=Math.min(c.originY,l.originY),Z=Math.max(c.originX+c.width,l.originX+l.width),i=Math.max(c.originY+c.height,l.originY+l.height),m=Z-d,X=i-b;return{originX:d,originY:b,width:m,height:X}}return l||c}const fd=(c,l)=>new Promise(function(d){window.requestIdleCallback?requestIdleCallback(()=>{d(1)},{timeout:l}):setTimeout(()=>{d(2)},l)}).then(function(){c()},()=>{c()}),lb=c=>{const l=c.webkitBackingStorePixelRatio||c.mozBackingStorePixelRatio||c.msBackingStorePixelRatio||c.oBackingStorePixelRatio||c.backingStorePixelRatio||1;return Math.max(1,(window.devicePixelRatio||1)/l)};class FZ{constructor(l){h(this,"plugin");h(this,"uid");this.plugin=l,this.uid=l.displayer.uid}getNamespaceData(){var l;return D.toJS((l=this.plugin)==null?void 0:l.attributes[this.namespace])||{}}getUidFromKey(l){return l.split(ed).length===2&&l.split(ed)[0]||this.uid}isLocalId(l){return l.split(ed).length===1}getLocalId(l){return l.split(ed)[1]}isSelector(l){return this.getLocalId(l)===k}}const Fd=class Fd extends FZ{constructor(d,b){super(d);h(this,"namespace");h(this,"serviceStorage",{});h(this,"storage",{});h(this,"stateDisposer");h(this,"asyncClockState",!1);Fd.syncInterval=(b||Fd.syncInterval)*.5,this.namespace=Fd.namespace,this.serviceStorage=this.getNamespaceData(),this.storage=Zd(this.serviceStorage)}getViewIdBySecenPath(d){const b=this.getNamespaceData();for(const[Z,i]of Object.entries(b))for(const m of Object.keys(i))if(m===d)return Z}getScenePathData(d){const b=this.getNamespaceData();for(const Z of Object.values(b))for(const i of Object.keys(Z))if(i===d)return Zd(Z[i])}getStorageData(d,b){const Z=this.getNamespaceData();return Z[d]&&Zd(Z[d][b])||void 0}hasSelector(d,b){const Z=this.storage&&this.storage[d]&&this.storage[d][b];return!!(Z&&Object.keys(Z).find(i=>this.isOwn(i)&&this.getLocalId(i)===k))}addStorageStateListener(d){this.stateDisposer=D.autorun(async()=>{const b=this.getNamespaceData(),Z=this.diffFun(this.serviceStorage,b);this.serviceStorage=b;for(const[i,m]of Object.entries(Z))if(m&&m.newValue===void 0){const{viewId:X,scenePath:s}=m;X&&s&&this.storage[X]&&delete this.storage[X][s][i]}else if(m&&m.newValue){const{viewId:X,scenePath:s}=m;this.storage[X]||(this.storage[X]={}),this.storage[X][s]||(this.storage[X][s]={}),this.storage[X][s][i]=Zd(m.newValue)}Object.keys(Z).length>0&&d(Z)})}removeStorageStateListener(){this.stateDisposer&&this.stateDisposer()}diffFun(d,b){const Z=hd(d),i=hd(b),m={};for(const X of Z){if(sd(d[X],b[X]))continue;const s=this.diffFunByscenePath(d[X]||{},b[X]||{},X);Object.assign(m,s)}for(const X of i)if(!Z.includes(X)){const s=this.diffFunByscenePath(d[X]||{},b[X]||{},X);Object.assign(m,s)}return m}diffFunByscenePath(d,b,Z){const i=hd(d),m=hd(b),X={};for(const s of i){if(sd(d[s],b[s]))continue;const G=this.diffFunByKeys(d[s]||{},b[s]||{},s,Z);Object.assign(X,G)}for(const s of m)if(!i.includes(s)){const G=this.diffFunByKeys(d[s]||{},b[s]||{},s,Z);Object.assign(X,G)}return X}diffFunByKeys(d,b,Z,i){const m=hd(d),X=hd(b),s={};for(const G of m){if(X.includes(G)){if(sd(d[G],b[G]))continue;s[G]={oldValue:d[G],newValue:b[G],viewId:i,scenePath:Z};continue}s[G]={oldValue:d[G],newValue:void 0,viewId:i,scenePath:Z}}for(const G of X)m.includes(G)||(s[G]={oldValue:void 0,newValue:b[G],viewId:i,scenePath:Z});return s}transformKey(d){return this.uid+ed+d}isOwn(d){return d.split(ed)[0]===this.uid}dispatch(d){const{type:b,workId:Z,ops:i,index:m,opt:X,toolsType:s,removeIds:G,updateNodeOpt:p,op:W,selectIds:I,isSync:o,scenePath:u,viewId:y}=d;if(y)switch(b){case N.Clear:const Y={};u&&this.storage[y]&&this.storage[y][u]?(delete this.storage[y][u],this.setState(Y,{isSync:o,viewId:y,scenePath:u})):this.storage[y]&&(delete this.storage[y],this.setState(Y,{isSync:o,viewId:y,scenePath:""}));break;case N.CreateWork:if(u&&Z&&s&&X){const R=this.isLocalId(Z.toString())?this.transformKey(Z):Z;this.updateValue(R.toString(),{type:N.CreateWork,workId:Z,toolsType:s,opt:X},{isSync:o,viewId:y,scenePath:u})}break;case N.DrawWork:if(u&&Z&&typeof m=="number"&&(W!=null&&W.length)){const R=this.isLocalId(Z.toString())?this.transformKey(Z):Z,S=this.storage[y]&&this.storage[y][u]&&this.storage[y][u][R]||void 0,J=m?((S==null?void 0:S.op)||[]).slice(0,m).concat(W):W||(S==null?void 0:S.op);S&&J&&this.updateValue(R.toString(),{...S,type:N.DrawWork,op:J,index:m},{isSync:o,viewId:y,scenePath:u})}break;case N.FullWork:if(u&&Z){const R=this.isLocalId(Z.toString())?this.transformKey(Z):Z,S=this.storage[y]&&this.storage[y][u]&&this.storage[y][u][R]||void 0,J=p||(S==null?void 0:S.updateNodeOpt),F=s||(S==null?void 0:S.toolsType),w=X||(S==null?void 0:S.opt),H=i||(S==null?void 0:S.ops);F&&w&&this.updateValue(R.toString(),{type:N.FullWork,updateNodeOpt:J,workId:R,toolsType:F,opt:w,ops:H},{isSync:o,viewId:y,scenePath:u})}break;case N.RemoveNode:if(u&&(G!=null&&G.length)){const R=G.map(S=>this.isLocalId(S+"")?this.transformKey(S):S);this.storage[y]&&this.storage[y][u]&&Object.keys(this.storage[y][u]).map(S=>{R!=null&&R.includes(S)&&this.updateValue(S,void 0,{isSync:o,viewId:y,scenePath:u})})}break;case N.UpdateNode:if(u&&Z&&(p||i||X)){const R=this.isLocalId(Z.toString())?this.transformKey(Z):Z,S=this.storage[y]&&this.storage[y][u]&&this.storage[y][u][R]||void 0;S&&(S.updateNodeOpt=p,(i||W)&&(S.ops=i,S.op=W),X&&(S.opt=X),S.type=N.FullWork,this.updateValue(R.toString(),S,{isSync:o,viewId:y,scenePath:u}))}break;case N.Select:if(!u)return;let L;I!=null&&I.length&&(L=I.map(R=>this.isLocalId(R+"")?this.transformKey(R):R));const n=this.transformKey(k),a=this.storage[y]&&this.storage[y][u]&&this.storage[y][u][n]||void 0,x=X||(a==null?void 0:a.opt);L&&this.checkOtherSelector(n,L,{isSync:o,viewId:y,scenePath:u}),this.updateValue(n,L&&{type:N.Select,toolsType:t.Selector,opt:x,selectIds:L},{isSync:o,viewId:y,scenePath:u});break}}checkOtherSelector(d,b,Z){const{viewId:i,scenePath:m}=Z;for(const X of Object.keys(this.storage[i][m]))if(X!==d&&this.getLocalId(X)===k){const s=this.storage[i][m][X];if(s&&s.selectIds){const G=s.selectIds.filter(p=>!b.includes(p));G.length>0&&(s.selectIds=G),this.updateValue(X,G.length&&s||void 0,Z)}}}setState(d,b){const{viewId:Z,scenePath:i}=b,m=hd(d);for(let X=0;X<m.length;X++){const s=m[X],G=d[s];typeof G<"u"?(this.storage[Z]||(this.storage[Z]={}),this.storage[Z][i]||(this.storage[Z][i]={}),this.storage[Z][i][s]=G):delete this.storage[Z][i][s]}this.runSyncService(b)}updateValue(d,b,Z){const{viewId:i,scenePath:m}=Z;b===void 0?delete this.storage[i][m][d]:(this.storage[i]||(this.storage[i]={}),this.storage[i][m]||(this.storage[i][m]={}),this.storage[i][m][d]=b),this.runSyncService(Z)}runSyncService(d){this.asyncClockState||(this.asyncClockState=!0,setTimeout(()=>{d.isSync?(this.asyncClockState=!1,this.syncSerivice(d.isAfterUpdate)):fd(()=>{this.asyncClockState=!1,this.syncSerivice(d.isAfterUpdate)},Fd.syncInterval)},d!=null&&d.isSync?0:Fd.syncInterval))}syncSerivice(d=!1){const b=hd(this.serviceStorage),Z=hd(this.storage),i=new Map;for(const m of b){if(!Z.includes(m)){i.set(m,void 0);continue}sd(this.serviceStorage[m],this.storage[m])||this.syncViewData(m,d)}for(const m of Z)b.includes(m)||i.set(m,this.storage[m]);if(i.size>5)this.syncStorageView(this.storage,d);else for(const[m,X]of i.entries())this.syncUpdataView(m,X,d)}syncViewData(d,b=!1){const Z=hd(this.serviceStorage[d]),i=hd(this.storage[d]),m=new Map;for(const X of Z){if(!i.includes(X)){m.set(X,void 0);continue}sd(this.serviceStorage[d][X],this.storage[d][X])||this.syncScenePathData(d,X,b)}for(const X of i)Z.includes(X)||m.set(X,this.storage[d][X]);if(m.size>5)this.syncStorageScenePath(d,this.storage[d],b);else for(const[X,s]of m.entries())this.syncUpdataScenePath(d,X,s,b)}syncScenePathData(d,b,Z=!1){const i=hd(this.serviceStorage[d][b]),m=hd(this.storage[d][b]),X=new Map;for(const s of i){if(!m.includes(s)){X.set(s,void 0);continue}sd(this.serviceStorage[d][b][s],this.storage[d][b][s])||X.set(s,this.storage[d][b][s])}for(const s of m)i.includes(s)||X.set(s,this.storage[d][b][s]);if(X.size>5)this.syncStorageKey(d,b,this.storage[d][b],Z);else for(const[s,G]of X.entries())this.syncUpdataKey(d,b,s,G,Z)}syncUpdataView(d,b,Z=!1){var m;Object.keys(this.serviceStorage).length?(Z||(b===void 0?delete this.serviceStorage[d]:this.serviceStorage[d]=Zd(b)),(m=this.plugin)==null||m.updateAttributes([this.namespace,d],b)):this.syncStorageView(this.storage,Z)}syncStorageView(d,b=!1){var Z;b||d&&(this.serviceStorage=Zd(d)),(Z=this.plugin)==null||Z.updateAttributes([this.namespace],d)}syncUpdataScenePath(d,b,Z,i=!1){var X;Object.keys(this.serviceStorage[d]).length?(i||(Z===void 0?delete this.serviceStorage[d][b]:this.serviceStorage[d][b]=Z),(X=this.plugin)==null||X.updateAttributes([this.namespace,d,b],Z)):this.syncStorageScenePath(d,this.storage[d],i)}syncStorageScenePath(d,b,Z=!1){var i;Z||b&&(this.serviceStorage[d]=b),(i=this.plugin)==null||i.updateAttributes([this.namespace,d],b)}syncUpdataKey(d,b,Z,i,m=!1){var s;Object.keys(this.serviceStorage[d][b]).length?(m||(i===void 0?delete this.serviceStorage[d][b][Z]:this.serviceStorage[d][b][Z]=i),(s=this.plugin)==null||s.updateAttributes([this.namespace,d,b,Z],i)):this.syncStorageKey(d,b,this.storage[d][b],m)}syncStorageKey(d,b,Z,i=!1){var m;i||(this.serviceStorage[d][b]=Z),(m=this.plugin)==null||m.updateAttributes([this.namespace,d,b],Z)}keyTransformWorkId(d){const b=d.split(ed);return b.length===2?b[1]:d}destroy(){this.removeStorageStateListener(),this.serviceStorage={},this.storage={}}};h(Fd,"namespace","PluginState"),h(Fd,"syncInterval",500);let Ql=Fd;class zp{constructor(){h(this,"roomMembers",[]);h(this,"onChangeHooks",new Set)}setRoomMembers(l){this.executChangeUidHook(this.roomMembers,l),this.roomMembers=l}executChangeUidHook(l,d){const b={online:d.map(Z=>{var i;return((i=Z.payload)==null?void 0:i.uid)||Z.session}),offline:l.map(Z=>{var i;return((i=Z.payload)==null?void 0:i.uid)||Z.session})};this.onChangeHooks.forEach(Z=>Z(b))}getRoomMember(l){return this.roomMembers.find(d=>{var b;return((b=d.payload)==null?void 0:b.uid)===l})}isOnLine(l){return!this.getRoomMember(l)}onUidChangeHook(l){this.onChangeHooks.add(l)}destroy(){this.onChangeHooks.clear()}}var xd=(c=>(c[c.Text=1]="Text",c[c.Shape=2]="Shape",c))(xd||{});const Id=class Id{createProxy(l){const d=new Proxy(l,{get(b,Z,i){const m=Id.interceptors.hasOwnProperty(Z)?Id.interceptors:b;return Reflect.get(m,Z,i)}});return Id.proxyToRaw.set(d,l),d}};h(Id,"proxyToRaw",new WeakMap),h(Id,"interceptors",{entries(...l){return Id.proxyToRaw.get(this).entries(...l)},forEach(...l){return Id.proxyToRaw.get(this).forEach(...l)},size(){return Id.proxyToRaw.get(this).size},get(l){return Id.proxyToRaw.get(this).get(l)},set(l,d){return Id.proxyToRaw.get(this).set(l,d)},delete(l,d){return Id.proxyToRaw.get(this).delete(l)},clear(){return Id.proxyToRaw.get(this).clear()}});let Ud=Id;class Hp{constructor(l){h(this,"internalMsgEmitter");h(this,"control");h(this,"editors");h(this,"activeId");h(this,"undoTickerId");h(this,"proxyMap");h(this,"taskqueue",new Map);const{control:d,internalMsgEmitter:b}=l;this.control=d,this.internalMsgEmitter=b;const Z=new Map;this.proxyMap=new Ud;const i=this,m=Ud.interceptors.set;Ud.interceptors.set=function(s,G){return i.interceptors.set(s,G),m.call(this,s,G)};const X=Ud.interceptors.delete;Ud.interceptors.delete=function(s,G){return i.interceptors.delete(s,G),X.call(this,s)},this.editors=this.proxyMap.createProxy(Z)}get collector(){return this.control.collector}filterEditor(l){const d=new Map;return this.editors.forEach((b,Z)=>{b.viewId===l&&d.set(Z,b)}),d}get interceptors(){return{set:(l,d)=>{var o,u,y,Y,L,n,a,x;if(!this.collector)return!0;const{viewId:b,scenePath:Z,canSync:i,canWorker:m,type:X,opt:s,dataType:G}=d;if(!m&&!i)return!0;const W=((o=this.collector)==null?void 0:o.isLocalId(l))?(u=this.collector)==null?void 0:u.transformKey(l):l,I=((y=this.collector)==null?void 0:y.storage[b])&&this.collector.storage[b][Z]&&this.collector.storage[b][Z][W]||void 0;I?I.toolsType===t.Text&&(m&&(this.control.worker.queryTaskBatchData({workId:l,msgType:N.UpdateNode}).forEach(R=>{var S;(S=this.control.worker)==null||S.taskBatchData.delete(R)}),(a=this.control.worker)==null||a.taskBatchData.add({workId:l,msgType:N.UpdateNode,dataType:G||r.Local,toolsType:t.Text,opt:s,viewId:b,scenePath:Z}),(x=this.control.worker)==null||x.runAnimation()),i&&fd(()=>{var R;(R=this.collector)==null||R.dispatch({type:N.UpdateNode,workId:l,toolsType:t.Text,opt:s,viewId:b,scenePath:Z})},this.control.worker.maxLastSyncTime)):X===xd.Text&&(i&&((Y=this.collector)==null||Y.dispatch({type:s.text&&N.FullWork||N.CreateWork,workId:l,toolsType:t.Text,opt:s,isSync:!0,viewId:b,scenePath:Z})),m&&((L=this.control.worker)==null||L.taskBatchData.add({workId:l,msgType:s.text&&N.FullWork||N.CreateWork,dataType:G||r.Local,toolsType:t.Text,opt:s,viewId:b,scenePath:Z}),(n=this.control.worker)==null||n.runAnimation()))},delete:l=>{var X,s;if(!this.collector)return!0;const d=this.editors.get(l);if(!d)return!0;const{viewId:b,scenePath:Z,canSync:i,canWorker:m}=d;if(!m&&!i)return!0;m&&((X=this.control.worker)==null||X.taskBatchData.add({workId:l,toolsType:t.Text,msgType:N.RemoveNode,dataType:r.Local,viewId:b,scenePath:Z}),(s=this.control.worker)==null||s.runAnimation()),i&&fd(()=>{var G;(G=this.collector)==null||G.dispatch({type:N.RemoveNode,removeIds:[l],toolsType:t.Text,viewId:b,scenePath:Z})},this.control.worker.maxLastSyncTime)},clear(){return!0}}}computeTextActive(l,d){var i,m,X,s;const b=(i=this.control.viewContainerManager)==null?void 0:i.transformToScenePoint(l,d),Z=(m=this.control.viewContainerManager)==null?void 0:m.getCurScenePath(d);d&&Z&&((X=this.control.worker)==null||X.taskBatchData.add({msgType:N.GetTextActive,dataType:r.Local,op:b,viewId:d,scenePath:Z}),(s=this.control.worker)==null||s.runAnimation())}checkEmptyTextBlur(){if(this.activeId){const l=this.editors.get(this.activeId),d=(l==null?void 0:l.opt.text)&&(l==null?void 0:l.opt.text.replace(/\s*,/g,"")),b=l==null?void 0:l.viewId;d?this.unActive():this.delete(this.activeId,!0,!0),this.undoTickerId&&b&&(this.internalMsgEmitter.emit("undoTickerEnd",this.undoTickerId,b,!0),this.undoTickerId=void 0)}}onCameraChange(l,d){var b,Z;for(const[i,m]of this.editors.entries())if(m.viewId===d){const{boxPoint:X,boxSize:s}=m.opt,G=X&&((b=this.control.viewContainerManager)==null?void 0:b.transformToOriginPoint(X,m.viewId)),p=(Z=this.control.viewContainerManager)==null?void 0:Z.getCurScenePath(d);if(p&&d){const W={x:G&&G[0]||0,y:G&&G[1]||0,w:s&&s[0]||0,h:s&&s[1]||0,opt:m.opt,scale:l.scale,type:xd.Text,viewId:d,scenePath:p,canWorker:!1,canSync:!1};this.editors.set(i,W),this.control.viewContainerManager.setActiveTextEditor(d,this.activeId)}}}onServiceDerive(l){var u,y;const{workId:d,opt:b,msgType:Z,viewId:i,scenePath:m,dataType:X}=l;if(!d||!i||!m)return;const s=d.toString();if(Z===N.RemoveNode){console.log("onServiceDerive-d",s),this.delete(s,!0,!0);return}const{boxPoint:G,boxSize:p}=b,W=G&&((u=this.control.viewContainerManager)==null?void 0:u.transformToOriginPoint(G,i)),I=this.control.viewContainerManager.getView(i),o={x:W&&W[0]||0,y:W&&W[1]||0,w:p&&p[0]||0,h:p&&p[1]||0,opt:b,type:xd.Text,canWorker:!0,canSync:!1,dataType:X,scale:((y=I==null?void 0:I.cameraOpt)==null?void 0:y.scale)||1,viewId:i,scenePath:m};this.editors.set(s,o),X===r.Service&&b.workState===K.Done&&this.activeId===s&&(this.activeId=void 0),console.log("onServiceDerive---1",s,o.opt.text,o.opt.uid,this.activeId,X),this.control.viewContainerManager.setActiveTextEditor(i,this.activeId)}updateForViewEdited(l,d){var Z;this.editors.set(l,d);const b=(Z=this.taskqueue.get(l))==null?void 0:Z.resolve;b&&b(d)}active(l){var b;const d=this.editors.get(l);d&&d.viewId&&(d.opt.workState=K.Start,d.opt.uid=(b=this.collector)==null?void 0:b.uid,this.activeId=l,d.canWorker=!0,d.canSync=!0,console.log("onServiceDerive---0",d.opt.uid),this.editors.set(l,d),this.control.viewContainerManager.setActiveTextEditor(d.viewId,this.activeId))}unActive(){const l=this.activeId&&this.editors.get(this.activeId);l&&l.viewId&&this.activeId&&(l.opt.workState=K.Done,l.opt.uid=void 0,l.canWorker=!0,l.canSync=!0,this.editors.set(this.activeId,l),this.activeId=void 0,this.control.viewContainerManager.setActiveTextEditor(l.viewId,this.activeId))}createTextForMasterController(l,d){var m;const{workId:b,isActive:Z,...i}=l;i.opt.zIndex=this.getMaxZIndex()+1,i.opt.uid=(m=this.collector)==null?void 0:m.uid,d&&(this.undoTickerId=d,this.internalMsgEmitter.emit("undoTickerStart",this.undoTickerId,i.viewId)),Z&&(this.activeId=b),i.dataType=r.Local,i.canWorker=!0,i.canSync=!0,this.editors.set(b,i),this.control.viewContainerManager.setActiveTextEditor(i.viewId,this.activeId)}updateTextForMasterController(l,d){var m;const{workId:b,...Z}=l;d&&(this.undoTickerId=d,this.internalMsgEmitter.emit("undoTickerStart",this.undoTickerId,Z.viewId));const i=this.editors.get(b)||{};Z.opt&&(Z.opt.uid=(m=this.collector)==null?void 0:m.uid),Z.dataType=r.Local,this.editors.set(b,{...i,...Z}),this.control.viewContainerManager.setActiveTextEditor(Z.viewId,this.activeId)}async updateTextControllerWithEffectAsync(l,d){var G;const{workId:b,...Z}=l;d&&(this.undoTickerId=d,this.internalMsgEmitter.emit("undoTickerStart",this.undoTickerId,Z.viewId));const i=this.editors.get(b)||{};if(Z.opt&&(Z.opt.uid=(G=this.collector)==null?void 0:G.uid),Z.dataType=r.Local,this.editors.set(b,{...i,...Z}),this.control.viewContainerManager.setActiveTextEditor(Z.viewId,this.activeId),this.taskqueue.has(b))return;const m=setTimeout(()=>{var W;const p=(W=this.taskqueue.get(b))==null?void 0:W.resolve;p&&p(void 0)},20),X=await new Promise(p=>{this.taskqueue.set(b,{resolve:p,clocker:m})}),s=this.taskqueue.get(b);return s&&(s.clocker&&clearTimeout(s.clocker),this.taskqueue.delete(b)),this.taskqueue.delete(b),X}updateTextForWorker(l,d){const{workId:b,isActive:Z,...i}=l;d&&(this.undoTickerId=d,this.internalMsgEmitter.emit("undoTickerStart",this.undoTickerId,i.viewId));const X={...this.editors.get(b)||{},...i};if(Z){X.canWorker=!1,X.canSync=!1,this.editors.set(b,X),this.active(b);return}this.editors.set(b,X),this.control.viewContainerManager.setActiveTextEditor(i.viewId,this.activeId)}get(l){return this.editors.get(l)}delete(l,d,b){const Z=this.editors.get(l);if(Z){const i=Z.viewId;Z.canSync=d,Z.canWorker=b,this.editors.delete(l),this.activeId===l&&(this.activeId=void 0),this.control.viewContainerManager.setActiveTextEditor(i,this.activeId)}}deleteBatch(l,d,b){const Z=new Set;for(const i of l){const m=this.editors.get(i);if(m){const X=m.viewId;m.canSync=d,m.canWorker=b,this.editors.delete(i),this.activeId===i&&(this.activeId=void 0),Z.add(X)}}for(const i of Z)this.control.viewContainerManager.setActiveTextEditor(i,this.activeId)}clear(l,d){this.editors.forEach((b,Z)=>{b.viewId===l&&(d&&(b.canSync=!1),b.canWorker=!1,this.editors.delete(Z))}),this.activeId=void 0,this.control.viewContainerManager.setActiveTextEditor(l,this.activeId)}destory(){this.editors.clear(),this.activeId=void 0}getMaxZIndex(){let l=0;return this.editors.forEach(d=>{d.opt.zIndex&&d.opt.zIndex>l&&(l=d.opt.zIndex)}),l}}const zd=class zd extends FZ{constructor(d,b){super(d);h(this,"serviceStorage",{});h(this,"storage",{});h(this,"stateDisposer");h(this,"asyncClockTimer");h(this,"namespace");this.namespace=zd.namespace,zd.syncInterval=(b||zd.syncInterval)*.5,this.serviceStorage=this.getNamespaceData(),this.storage=Zd(this.serviceStorage)}addStorageStateListener(d){this.stateDisposer=D.autorun(async()=>{const b=this.getNamespaceData(),Z=this.getDiffMap(this.serviceStorage,b);this.serviceStorage=b,Z.size&&d(Z)})}getDiffMap(d,b){const Z=new Map;for(const[i,m]of Object.entries(b))i!==this.uid&&(m&&sd(d[i],m)||m&&Z.set(i,m));return Z}removeStorageStateListener(){this.stateDisposer&&this.stateDisposer()}transformKey(d){return this.uid+ed+d}isOwn(d){return d===this.uid}dispatch(d){const{type:b,op:Z,isSync:i,viewId:m}=d;switch(b){case Od.Cursor:Z&&this.pushValue(this.uid,{type:Od.Cursor,op:Z,viewId:m},{isSync:i});break}}pushValue(d,b,Z){var i;this.storage[d]||(this.storage[d]=[]),(i=this.storage[d])==null||i.push(b),this.runSyncService(Z)}clearValue(d){var Z;this.storage[d]=void 0,Object.keys(this.serviceStorage).length&&((Z=this.plugin)==null||Z.updateAttributes([this.namespace,d],void 0))}runSyncService(d){this.asyncClockTimer||(this.asyncClockTimer=setTimeout(()=>{d!=null&&d.isSync?(this.asyncClockTimer=void 0,this.syncSerivice()):fd(()=>{this.asyncClockTimer=void 0,this.syncSerivice()},zd.syncInterval)},d!=null&&d.isSync?0:zd.syncInterval))}syncSerivice(){var b;Object.keys(this.serviceStorage).length?Object.keys(this.storage).forEach(Z=>{var i;(i=this.plugin)==null||i.updateAttributes([this.namespace,Z],this.storage[Z])}):(b=this.plugin)==null||b.updateAttributes(this.namespace,this.storage),this.storage={}}destroy(){this.removeStorageStateListener(),this.storage={},this.serviceStorage={}}};h(zd,"syncInterval",100),h(zd,"namespace","PluginEvent");let Ul=zd;class kp{constructor(l){h(this,"expirationTime",5e3);h(this,"internalMsgEmitter");h(this,"control");h(this,"eventCollector");h(this,"roomMember");h(this,"animationId");h(this,"removeTimerId");h(this,"asyncEndInfo");h(this,"animationPointWorkers",new Map);h(this,"animationDrawWorkers",new Map);h(this,"cursorInfoMap",new Map);const{control:d,internalMsgEmitter:b}=l;this.internalMsgEmitter=b,this.control=d,this.roomMember=d.roomMember}activeCollector(){var l,d;this.control.plugin&&(this.eventCollector=new Ul(this.control.plugin,Math.min(((d=(l=this.control.pluginOptions)==null?void 0:l.syncOpt)==null?void 0:d.interval)||100,100)),this.eventCollector.addStorageStateListener(b=>{b.forEach((Z,i)=>{var m;if(((m=this.eventCollector)==null?void 0:m.uid)!==i){const X=new Map;Z==null||Z.forEach(s=>{if(s&&s.type===Od.Cursor&&s.op&&s.viewId){const G=[];for(let p=0;p<s.op.length;p+=2){const W=s.op[p],I=s.op[p+1];if(md(W)&&md(I)){const o=this.control.viewContainerManager.transformToOriginPoint([W,I],s.viewId);G.push(o[0],o[1])}else G.push(W,I)}X.set(s.viewId,G)}}),X.size&&(this.activePointWorkShape(i,X),this.runAnimation())}})}))}onFocusViewChange(){const l=this.control.viewContainerManager.focuedViewId;for(const b of this.animationDrawWorkers.keys()){const Z=this.getUidAndviewId(b).uid,i=this.getUidAndviewId(b).viewId;i!==l&&this.activeDrawWorkShape(Z,[void 0,void 0],K.Done,i)}const d=new Map;for(const b of this.animationPointWorkers.keys()){const Z=this.getUidAndviewId(b).uid,i=this.getUidAndviewId(b).viewId;if(i!==l){const m=d.get(Z)||new Map;m.set(i,[void 0,void 0]),d.set(Z,m)}}if(d.size)for(const[b,Z]of d.entries())this.activePointWorkShape(b,Z);this.runAnimation()}activePointWorkShape(l,d){var Z;if(this.roomMember.getRoomMember(l))for(const[i,m]of d.entries()){const X=this.getKey(l,i);let s=!1;const G=this.control.viewContainerManager.getAllViews().map(W=>W==null?void 0:W.id);for(const W of G)if(W&&W!==i){const I=this.getKey(l,W),o=this.animationDrawWorkers.get(I);if((o==null?void 0:o.workState)===K.Start||(o==null?void 0:o.workState)===K.Doing||!1){s=!0;break}else if(this.removeTimerId&&(clearTimeout(this.removeTimerId),this.removeTimerId=void 0),o)this.activeDrawWorkShape(l,[void 0,void 0],K.Done,W),this.runAnimation();else{const y=this.animationPointWorkers.get(I);if(y)y.animationWorkData=[void 0,void 0],y.animationIndex=0,y.freeze=!1;else{const Y={animationIndex:0,animationWorkData:[void 0,void 0],freeze:!1};this.animationPointWorkers.set(I,Y)}}}const p=this.animationPointWorkers.get(X);if(m){if(!p){const W={animationIndex:0,animationWorkData:m,freeze:s};(Z=this.animationPointWorkers)==null||Z.set(X,W);return}p.animationWorkData=m,p.animationIndex=0,p.freeze=s}}}getKey(l,d){return`${l}${ed}${d}`}getUidAndviewId(l){const[d,b]=l.split(ed);return{uid:d,viewId:b}}animationCursor(){this.animationId=void 0;const l=Date.now();this.animationPointWorkers.forEach((d,b)=>{const{uid:Z,viewId:i}=this.getUidAndviewId(b);if(d.freeze)return;const X=d.animationIndex,s=this.roomMember.getRoomMember(Z);if(s){d.animationWorkData.length-1>X&&(d.animationIndex=X+2);const G=d.animationWorkData[X],p=d.animationWorkData[X+1],W=this.cursorInfoMap.get(i)||new Map;md(G)&&md(p)?W.set(s.memberId,{x:G,y:p,roomMember:s,timestamp:l}):W.has(s.memberId)&&W.delete(s.memberId),W.size?this.cursorInfoMap.set(i,W):this.cursorInfoMap.has(i)&&(this.cursorInfoMap.delete(i),this.internalMsgEmitter.emit([v.Cursor,i],[])),d.animationWorkData.length-1<=d.animationIndex&&this.animationPointWorkers.delete(b)}}),this.animationDrawWorkers.forEach((d,b)=>{const{uid:Z,viewId:i}=this.getUidAndviewId(b),m=d.animationIndex,X=this.roomMember.getRoomMember(Z);if(X){d.animationWorkData.length-1>m&&(d.animationIndex=m+2);const s=d.animationWorkData[m],G=d.animationWorkData[m+1],p=this.cursorInfoMap.get(i)||new Map;md(s)&&md(G)?p.set(X.memberId,{x:s,y:G,roomMember:X,timestamp:l}):p.has(X.memberId)&&p.delete(X.memberId),p.size?this.cursorInfoMap.set(i,p):this.cursorInfoMap.has(i)&&(this.cursorInfoMap.delete(i),this.internalMsgEmitter.emit([v.Cursor,i],[])),d.animationWorkData.length-1<=d.animationIndex&&this.animationDrawWorkers.delete(b)}});for(const[d,b]of this.cursorInfoMap)if(b){const Z=[],i=[];for(const[m,X]of b.entries()){const{timestamp:s,...G}=X;s+this.expirationTime<l?i.push(m):Z.push(G)}if(i.length)for(const m of i)b.delete(m);b.size?this.cursorInfoMap.set(d,b):this.cursorInfoMap.delete(d),this.internalMsgEmitter.emit([v.Cursor,d],Z)}(this.animationPointWorkers.size||this.animationDrawWorkers.size||this.cursorInfoMap.size)&&this.runAnimation()}activeDrawWorkShape(l,d,b,Z){var s,G;if(!this.roomMember.getRoomMember(l))return;const m=this.getKey(l,Z);if(b===K.Start){const p=this.animationPointWorkers.get(m);if(p)p.animationWorkData=[],p.animationIndex=0,p.freeze=!0;else{const W={animationIndex:0,animationWorkData:[],freeze:!0};(s=this.animationDrawWorkers)==null||s.set(m,W)}}else if(b===K.Done){const p=this.animationPointWorkers.get(m);p&&(p.freeze=!1)}const X=this.animationDrawWorkers.get(m);if(d){if(!X){const p={animationIndex:0,animationWorkData:d,workState:b};(G=this.animationDrawWorkers)==null||G.set(m,p);return}X.animationWorkData=d,X.animationIndex=0,X.workState=b}}runAnimation(){this.animationId||(this.animationId=requestAnimationFrame(this.animationCursor.bind(this)))}sendEvent(l,d){var b;(b=this.eventCollector)==null||b.dispatch({type:Od.Cursor,op:md(l[0])&&md(l[1])&&this.control.viewContainerManager.transformToScenePoint(l,d)||[void 0,void 0],viewId:d})}collectServiceCursor(l){const{op:d,uid:b,workState:Z,viewId:i}=l;if(b&&d&&Z&&i){const m=this.control.viewContainerManager.focuedViewId;if(Z===K.Done){if(i!==m){this.activeDrawWorkShape(b,[void 0,void 0],Z,i),this.runAnimation();return}this.removeTimerId&&(clearTimeout(this.removeTimerId),this.removeTimerId=void 0,this.asyncEndInfo&&this.asyncEndInfo.viewId!==i&&this.asyncEndInfo.uid===b&&this.activeDrawWorkShape(b,[void 0,void 0],K.Done,this.asyncEndInfo.viewId)),this.asyncEndInfo={uid:b,viewId:i},this.removeTimerId=setTimeout(()=>{this.removeTimerId=void 0,this.activeDrawWorkShape(b,[void 0,void 0],K.Done,i),this.runAnimation()},this.expirationTime)}if(md(d[0])&&md(d[1])){const X=this.control.viewContainerManager.transformToOriginPoint(d,i);this.activeDrawWorkShape(b,X,Z,i)}this.runAnimation()}}unabled(){var l;(l=this.eventCollector)==null||l.dispatch({type:Od.Cursor,op:[void 0,void 0],viewId:this.control.viewContainerManager.focuedViewId})}destroy(){var l;(l=this.eventCollector)==null||l.destroy()}}const zZ="dmFyIGFnPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgbGc9KGVlLFh0LGxlKT0+WHQgaW4gZWU/YWcoZWUsWHQse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmxlfSk6ZWVbWHRdPWxlO3ZhciBzdD0oZWUsWHQsbGUpPT4obGcoZWUsdHlwZW9mIFh0IT0ic3ltYm9sIj9YdCsiIjpYdCxsZSksbGUpOyhmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgZWU9dHlwZW9mIGdsb2JhbFRoaXM8InUiP2dsb2JhbFRoaXM6dHlwZW9mIHdpbmRvdzwidSI/d2luZG93OnR5cGVvZiBnbG9iYWw8InUiP2dsb2JhbDp0eXBlb2Ygc2VsZjwidSI/c2VsZjp7fTtmdW5jdGlvbiBYdChkKXtyZXR1cm4gZCYmZC5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZCwiZGVmYXVsdCIpP2QuZGVmYXVsdDpkfWZ1bmN0aW9uIGxlKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH12YXIgZWk9bGU7ZnVuY3Rpb24gcmkoZCxyKXtyZXR1cm4gZD09PXJ8fGQhPT1kJiZyIT09cn12YXIgUWU9cmksbmk9UWU7ZnVuY3Rpb24gaWkoZCxyKXtmb3IodmFyIHQ9ZC5sZW5ndGg7dC0tOylpZihuaShkW3RdWzBdLHIpKXJldHVybiB0O3JldHVybi0xfXZhciBiZT1paSxzaT1iZSxvaT1BcnJheS5wcm90b3R5cGUsYWk9b2kuc3BsaWNlO2Z1bmN0aW9uIGxpKGQpe3ZhciByPXRoaXMuX19kYXRhX18sdD1zaShyLGQpO2lmKHQ8MClyZXR1cm4hMTt2YXIgZT1yLmxlbmd0aC0xO3JldHVybiB0PT1lP3IucG9wKCk6YWkuY2FsbChyLHQsMSksLS10aGlzLnNpemUsITB9dmFyIGNpPWxpLGZpPWJlO2Z1bmN0aW9uIHVpKGQpe3ZhciByPXRoaXMuX19kYXRhX18sdD1maShyLGQpO3JldHVybiB0PDA/dm9pZCAwOnJbdF1bMV19dmFyIGhpPXVpLGRpPWJlO2Z1bmN0aW9uIGdpKGQpe3JldHVybiBkaSh0aGlzLl9fZGF0YV9fLGQpPi0xfXZhciBwaT1naSxtaT1iZTtmdW5jdGlvbiB2aShkLHIpe3ZhciB0PXRoaXMuX19kYXRhX18sZT1taSh0LGQpO3JldHVybiBlPDA/KCsrdGhpcy5zaXplLHQucHVzaChbZCxyXSkpOnRbZV1bMV09cix0aGlzfXZhciB5aT12aSxTaT1laSx4aT1jaSxUaT1oaSxNaT1waSxPaT15aTtmdW5jdGlvbiBwZShkKXt2YXIgcj0tMSx0PWQ9PW51bGw/MDpkLmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrcjx0Oyl7dmFyIGU9ZFtyXTt0aGlzLnNldChlWzBdLGVbMV0pfX1wZS5wcm90b3R5cGUuY2xlYXI9U2kscGUucHJvdG90eXBlLmRlbGV0ZT14aSxwZS5wcm90b3R5cGUuZ2V0PVRpLHBlLnByb3RvdHlwZS5oYXM9TWkscGUucHJvdG90eXBlLnNldD1PaTt2YXIgRGU9cGUsRWk9RGU7ZnVuY3Rpb24gUGkoKXt0aGlzLl9fZGF0YV9fPW5ldyBFaSx0aGlzLnNpemU9MH12YXIgQWk9UGk7ZnVuY3Rpb24gQ2koZCl7dmFyIHI9dGhpcy5fX2RhdGFfXyx0PXIuZGVsZXRlKGQpO3JldHVybiB0aGlzLnNpemU9ci5zaXplLHR9dmFyIFJpPUNpO2Z1bmN0aW9uIElpKGQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmdldChkKX12YXIgTGk9SWk7ZnVuY3Rpb24gYmkoZCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKGQpfXZhciBEaT1iaSx3aT10eXBlb2YgZWU9PSJvYmplY3QiJiZlZSYmZWUuT2JqZWN0PT09T2JqZWN0JiZlZSx4cj13aSxOaT14cixCaT10eXBlb2Ygc2VsZj09Im9iamVjdCImJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLFdpPU5pfHxCaXx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxRdD1XaSxGaT1RdCxqaT1GaS5TeW1ib2wsd2U9amksVHI9d2UsTXI9T2JqZWN0LnByb3RvdHlwZSxVaT1Nci5oYXNPd25Qcm9wZXJ0eSwkaT1Nci50b1N0cmluZyxBZT1Ucj9Uci50b1N0cmluZ1RhZzp2b2lkIDA7ZnVuY3Rpb24gemkoZCl7dmFyIHI9VWkuY2FsbChkLEFlKSx0PWRbQWVdO3RyeXtkW0FlXT12b2lkIDA7dmFyIGU9ITB9Y2F0Y2h7fXZhciBuPSRpLmNhbGwoZCk7cmV0dXJuIGUmJihyP2RbQWVdPXQ6ZGVsZXRlIGRbQWVdKSxufXZhciBHaT16aSxIaT1PYmplY3QucHJvdG90eXBlLEtpPUhpLnRvU3RyaW5nO2Z1bmN0aW9uIFZpKGQpe3JldHVybiBLaS5jYWxsKGQpfXZhciBZaT1WaSxPcj13ZSxYaT1HaSxaaT1ZaSxKaT0iW29iamVjdCBOdWxsXSIsUWk9IltvYmplY3QgVW5kZWZpbmVkXSIsRXI9T3I/T3IudG9TdHJpbmdUYWc6dm9pZCAwO2Z1bmN0aW9uIGtpKGQpe3JldHVybiBkPT1udWxsP2Q9PT12b2lkIDA/UWk6Smk6RXImJkVyIGluIE9iamVjdChkKT9YaShkKTpaaShkKX12YXIgY2U9a2k7ZnVuY3Rpb24gcWkoZCl7dmFyIHI9dHlwZW9mIGQ7cmV0dXJuIGQhPW51bGwmJihyPT0ib2JqZWN0Inx8cj09ImZ1bmN0aW9uIil9dmFyIHNlPXFpLF9pPWNlLHRzPXNlLGVzPSJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIixycz0iW29iamVjdCBGdW5jdGlvbl0iLG5zPSJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSIsaXM9IltvYmplY3QgUHJveHldIjtmdW5jdGlvbiBzcyhkKXtpZighdHMoZCkpcmV0dXJuITE7dmFyIHI9X2koZCk7cmV0dXJuIHI9PXJzfHxyPT1uc3x8cj09ZXN8fHI9PWlzfXZhciBQcj1zcyxvcz1RdCxhcz1vc1siX19jb3JlLWpzX3NoYXJlZF9fIl0sbHM9YXMsa2U9bHMsQXI9ZnVuY3Rpb24oKXt2YXIgZD0vW14uXSskLy5leGVjKGtlJiZrZS5rZXlzJiZrZS5rZXlzLklFX1BST1RPfHwiIik7cmV0dXJuIGQ/IlN5bWJvbChzcmMpXzEuIitkOiIifSgpO2Z1bmN0aW9uIGNzKGQpe3JldHVybiEhQXImJkFyIGluIGR9dmFyIGZzPWNzLHVzPUZ1bmN0aW9uLnByb3RvdHlwZSxocz11cy50b1N0cmluZztmdW5jdGlvbiBkcyhkKXtpZihkIT1udWxsKXt0cnl7cmV0dXJuIGhzLmNhbGwoZCl9Y2F0Y2h7fXRyeXtyZXR1cm4gZCsiIn1jYXRjaHt9fXJldHVybiIifXZhciBDcj1kcyxncz1Qcixwcz1mcyxtcz1zZSx2cz1Dcix5cz0vW1xcXiQuKis/KClbXF17fXxdL2csU3M9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8seHM9RnVuY3Rpb24ucHJvdG90eXBlLFRzPU9iamVjdC5wcm90b3R5cGUsTXM9eHMudG9TdHJpbmcsT3M9VHMuaGFzT3duUHJvcGVydHksRXM9UmVnRXhwKCJeIitNcy5jYWxsKE9zKS5yZXBsYWNlKHlzLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO2Z1bmN0aW9uIFBzKGQpe2lmKCFtcyhkKXx8cHMoZCkpcmV0dXJuITE7dmFyIHI9Z3MoZCk/RXM6U3M7cmV0dXJuIHIudGVzdCh2cyhkKSl9dmFyIEFzPVBzO2Z1bmN0aW9uIENzKGQscil7cmV0dXJuIGQ9PW51bGw/dm9pZCAwOmRbcl19dmFyIFJzPUNzLElzPUFzLExzPVJzO2Z1bmN0aW9uIGJzKGQscil7dmFyIHQ9THMoZCxyKTtyZXR1cm4gSXModCk/dDp2b2lkIDB9dmFyIGZlPWJzLERzPWZlLHdzPVF0LE5zPURzKHdzLCJNYXAiKSxxZT1OcyxCcz1mZSxXcz1CcyhPYmplY3QsImNyZWF0ZSIpLE5lPVdzLFJyPU5lO2Z1bmN0aW9uIEZzKCl7dGhpcy5fX2RhdGFfXz1Scj9ScihudWxsKTp7fSx0aGlzLnNpemU9MH12YXIganM9RnM7ZnVuY3Rpb24gVXMoZCl7dmFyIHI9dGhpcy5oYXMoZCkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW2RdO3JldHVybiB0aGlzLnNpemUtPXI/MTowLHJ9dmFyICRzPVVzLHpzPU5lLEdzPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIixIcz1PYmplY3QucHJvdG90eXBlLEtzPUhzLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIFZzKGQpe3ZhciByPXRoaXMuX19kYXRhX187aWYoenMpe3ZhciB0PXJbZF07cmV0dXJuIHQ9PT1Hcz92b2lkIDA6dH1yZXR1cm4gS3MuY2FsbChyLGQpP3JbZF06dm9pZCAwfXZhciBZcz1WcyxYcz1OZSxacz1PYmplY3QucHJvdG90eXBlLEpzPVpzLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIFFzKGQpe3ZhciByPXRoaXMuX19kYXRhX187cmV0dXJuIFhzP3JbZF0hPT12b2lkIDA6SnMuY2FsbChyLGQpfXZhciBrcz1Rcyxxcz1OZSxfcz0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI7ZnVuY3Rpb24gdG8oZCxyKXt2YXIgdD10aGlzLl9fZGF0YV9fO3JldHVybiB0aGlzLnNpemUrPXRoaXMuaGFzKGQpPzA6MSx0W2RdPXFzJiZyPT09dm9pZCAwP19zOnIsdGhpc312YXIgZW89dG8scm89anMsbm89JHMsaW89WXMsc289a3Msb289ZW87ZnVuY3Rpb24gbWUoZCl7dmFyIHI9LTEsdD1kPT1udWxsPzA6ZC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK3I8dDspe3ZhciBlPWRbcl07dGhpcy5zZXQoZVswXSxlWzFdKX19bWUucHJvdG90eXBlLmNsZWFyPXJvLG1lLnByb3RvdHlwZS5kZWxldGU9bm8sbWUucHJvdG90eXBlLmdldD1pbyxtZS5wcm90b3R5cGUuaGFzPXNvLG1lLnByb3RvdHlwZS5zZXQ9b287dmFyIGFvPW1lLElyPWFvLGxvPURlLGNvPXFlO2Z1bmN0aW9uIGZvKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgSXIsbWFwOm5ldyhjb3x8bG8pLHN0cmluZzpuZXcgSXJ9fXZhciB1bz1mbztmdW5jdGlvbiBobyhkKXt2YXIgcj10eXBlb2YgZDtyZXR1cm4gcj09InN0cmluZyJ8fHI9PSJudW1iZXIifHxyPT0ic3ltYm9sInx8cj09ImJvb2xlYW4iP2QhPT0iX19wcm90b19fIjpkPT09bnVsbH12YXIgZ289aG8scG89Z287ZnVuY3Rpb24gbW8oZCxyKXt2YXIgdD1kLl9fZGF0YV9fO3JldHVybiBwbyhyKT90W3R5cGVvZiByPT0ic3RyaW5nIj8ic3RyaW5nIjoiaGFzaCJdOnQubWFwfXZhciBCZT1tbyx2bz1CZTtmdW5jdGlvbiB5byhkKXt2YXIgcj12byh0aGlzLGQpLmRlbGV0ZShkKTtyZXR1cm4gdGhpcy5zaXplLT1yPzE6MCxyfXZhciBTbz15byx4bz1CZTtmdW5jdGlvbiBUbyhkKXtyZXR1cm4geG8odGhpcyxkKS5nZXQoZCl9dmFyIE1vPVRvLE9vPUJlO2Z1bmN0aW9uIEVvKGQpe3JldHVybiBPbyh0aGlzLGQpLmhhcyhkKX12YXIgUG89RW8sQW89QmU7ZnVuY3Rpb24gQ28oZCxyKXt2YXIgdD1Bbyh0aGlzLGQpLGU9dC5zaXplO3JldHVybiB0LnNldChkLHIpLHRoaXMuc2l6ZSs9dC5zaXplPT1lPzA6MSx0aGlzfXZhciBSbz1DbyxJbz11byxMbz1Tbyxibz1NbyxEbz1Qbyx3bz1SbztmdW5jdGlvbiB2ZShkKXt2YXIgcj0tMSx0PWQ9PW51bGw/MDpkLmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrcjx0Oyl7dmFyIGU9ZFtyXTt0aGlzLnNldChlWzBdLGVbMV0pfX12ZS5wcm90b3R5cGUuY2xlYXI9SW8sdmUucHJvdG90eXBlLmRlbGV0ZT1Mbyx2ZS5wcm90b3R5cGUuZ2V0PWJvLHZlLnByb3RvdHlwZS5oYXM9RG8sdmUucHJvdG90eXBlLnNldD13bzt2YXIgTHI9dmUsTm89RGUsQm89cWUsV289THIsRm89MjAwO2Z1bmN0aW9uIGpvKGQscil7dmFyIHQ9dGhpcy5fX2RhdGFfXztpZih0IGluc3RhbmNlb2YgTm8pe3ZhciBlPXQuX19kYXRhX187aWYoIUJvfHxlLmxlbmd0aDxGby0xKXJldHVybiBlLnB1c2goW2Qscl0pLHRoaXMuc2l6ZT0rK3Quc2l6ZSx0aGlzO3Q9dGhpcy5fX2RhdGFfXz1uZXcgV28oZSl9cmV0dXJuIHQuc2V0KGQsciksdGhpcy5zaXplPXQuc2l6ZSx0aGlzfXZhciBVbz1qbywkbz1EZSx6bz1BaSxHbz1SaSxIbz1MaSxLbz1EaSxWbz1VbztmdW5jdGlvbiB5ZShkKXt2YXIgcj10aGlzLl9fZGF0YV9fPW5ldyAkbyhkKTt0aGlzLnNpemU9ci5zaXplfXllLnByb3RvdHlwZS5jbGVhcj16byx5ZS5wcm90b3R5cGUuZGVsZXRlPUdvLHllLnByb3RvdHlwZS5nZXQ9SG8seWUucHJvdG90eXBlLmhhcz1Lbyx5ZS5wcm90b3R5cGUuc2V0PVZvO3ZhciBicj15ZTtmdW5jdGlvbiBZbyhkLHIpe2Zvcih2YXIgdD0tMSxlPWQ9PW51bGw/MDpkLmxlbmd0aDsrK3Q8ZSYmcihkW3RdLHQsZCkhPT0hMTspO3JldHVybiBkfXZhciBYbz1Zbyxabz1mZSxKbz1mdW5jdGlvbigpe3RyeXt2YXIgZD1abyhPYmplY3QsImRlZmluZVByb3BlcnR5Iik7cmV0dXJuIGQoe30sIiIse30pLGR9Y2F0Y2h7fX0oKSxRbz1KbyxEcj1RbztmdW5jdGlvbiBrbyhkLHIsdCl7cj09Il9fcHJvdG9fXyImJkRyP0RyKGQscix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6dCx3cml0YWJsZTohMH0pOmRbcl09dH12YXIgd3I9a28scW89d3IsX289UWUsdGE9T2JqZWN0LnByb3RvdHlwZSxlYT10YS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiByYShkLHIsdCl7dmFyIGU9ZFtyXTsoIShlYS5jYWxsKGQscikmJl9vKGUsdCkpfHx0PT09dm9pZCAwJiYhKHIgaW4gZCkpJiZxbyhkLHIsdCl9dmFyIE5yPXJhLG5hPU5yLGlhPXdyO2Z1bmN0aW9uIHNhKGQscix0LGUpe3ZhciBuPSF0O3R8fCh0PXt9KTtmb3IodmFyIGE9LTEscz1yLmxlbmd0aDsrK2E8czspe3ZhciBpPXJbYV0sbz1lP2UodFtpXSxkW2ldLGksdCxkKTp2b2lkIDA7bz09PXZvaWQgMCYmKG89ZFtpXSksbj9pYSh0LGksbyk6bmEodCxpLG8pfXJldHVybiB0fXZhciBXZT1zYTtmdW5jdGlvbiBvYShkLHIpe2Zvcih2YXIgdD0tMSxlPUFycmF5KGQpOysrdDxkOyllW3RdPXIodCk7cmV0dXJuIGV9dmFyIGFhPW9hO2Z1bmN0aW9uIGxhKGQpe3JldHVybiBkIT1udWxsJiZ0eXBlb2YgZD09Im9iamVjdCJ9dmFyIGllPWxhLGNhPWNlLGZhPWllLHVhPSJbb2JqZWN0IEFyZ3VtZW50c10iO2Z1bmN0aW9uIGhhKGQpe3JldHVybiBmYShkKSYmY2EoZCk9PXVhfXZhciBkYT1oYSxCcj1kYSxnYT1pZSxXcj1PYmplY3QucHJvdG90eXBlLHBhPVdyLmhhc093blByb3BlcnR5LG1hPVdyLnByb3BlcnR5SXNFbnVtZXJhYmxlLHZhPUJyKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk/QnI6ZnVuY3Rpb24oZCl7cmV0dXJuIGdhKGQpJiZwYS5jYWxsKGQsImNhbGxlZSIpJiYhbWEuY2FsbChkLCJjYWxsZWUiKX0seWE9dmEsU2E9QXJyYXkuaXNBcnJheSxGZT1TYSxqZT17ZXhwb3J0czp7fX07ZnVuY3Rpb24geGEoKXtyZXR1cm4hMX12YXIgVGE9eGE7amUuZXhwb3J0cyxmdW5jdGlvbihkLHIpe3ZhciB0PVF0LGU9VGEsbj1yJiYhci5ub2RlVHlwZSYmcixhPW4mJiEwJiZkJiYhZC5ub2RlVHlwZSYmZCxzPWEmJmEuZXhwb3J0cz09PW4saT1zP3QuQnVmZmVyOnZvaWQgMCxvPWk/aS5pc0J1ZmZlcjp2b2lkIDAsYz1vfHxlO2QuZXhwb3J0cz1jfShqZSxqZS5leHBvcnRzKTt2YXIgX2U9amUuZXhwb3J0cyxNYT05MDA3MTk5MjU0NzQwOTkxLE9hPS9eKD86MHxbMS05XVxkKikkLztmdW5jdGlvbiBFYShkLHIpe3ZhciB0PXR5cGVvZiBkO3JldHVybiByPXI/P01hLCEhciYmKHQ9PSJudW1iZXIifHx0IT0ic3ltYm9sIiYmT2EudGVzdChkKSkmJmQ+LTEmJmQlMT09MCYmZDxyfXZhciBQYT1FYSxBYT05MDA3MTk5MjU0NzQwOTkxO2Z1bmN0aW9uIENhKGQpe3JldHVybiB0eXBlb2YgZD09Im51bWJlciImJmQ+LTEmJmQlMT09MCYmZDw9QWF9dmFyIEZyPUNhLFJhPWNlLElhPUZyLExhPWllLGJhPSJbb2JqZWN0IEFyZ3VtZW50c10iLERhPSJbb2JqZWN0IEFycmF5XSIsd2E9IltvYmplY3QgQm9vbGVhbl0iLE5hPSJbb2JqZWN0IERhdGVdIixCYT0iW29iamVjdCBFcnJvcl0iLFdhPSJbb2JqZWN0IEZ1bmN0aW9uXSIsRmE9IltvYmplY3QgTWFwXSIsamE9IltvYmplY3QgTnVtYmVyXSIsVWE9IltvYmplY3QgT2JqZWN0XSIsJGE9IltvYmplY3QgUmVnRXhwXSIsemE9IltvYmplY3QgU2V0XSIsR2E9IltvYmplY3QgU3RyaW5nXSIsSGE9IltvYmplY3QgV2Vha01hcF0iLEthPSJbb2JqZWN0IEFycmF5QnVmZmVyXSIsVmE9IltvYmplY3QgRGF0YVZpZXddIixZYT0iW29iamVjdCBGbG9hdDMyQXJyYXldIixYYT0iW29iamVjdCBGbG9hdDY0QXJyYXldIixaYT0iW29iamVjdCBJbnQ4QXJyYXldIixKYT0iW29iamVjdCBJbnQxNkFycmF5XSIsUWE9IltvYmplY3QgSW50MzJBcnJheV0iLGthPSJbb2JqZWN0IFVpbnQ4QXJyYXldIixxYT0iW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLF9hPSJbb2JqZWN0IFVpbnQxNkFycmF5XSIsdGw9IltvYmplY3QgVWludDMyQXJyYXldIixXdD17fTtXdFtZYV09V3RbWGFdPVd0W1phXT1XdFtKYV09V3RbUWFdPVd0W2thXT1XdFtxYV09V3RbX2FdPVd0W3RsXT0hMCxXdFtiYV09V3RbRGFdPVd0W0thXT1XdFt3YV09V3RbVmFdPVd0W05hXT1XdFtCYV09V3RbV2FdPVd0W0ZhXT1XdFtqYV09V3RbVWFdPVd0WyRhXT1XdFt6YV09V3RbR2FdPVd0W0hhXT0hMTtmdW5jdGlvbiBlbChkKXtyZXR1cm4gTGEoZCkmJklhKGQubGVuZ3RoKSYmISFXdFtSYShkKV19dmFyIHJsPWVsO2Z1bmN0aW9uIG5sKGQpe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gZChyKX19dmFyIHRyPW5sLFVlPXtleHBvcnRzOnt9fTtVZS5leHBvcnRzLGZ1bmN0aW9uKGQscil7dmFyIHQ9eHIsZT1yJiYhci5ub2RlVHlwZSYmcixuPWUmJiEwJiZkJiYhZC5ub2RlVHlwZSYmZCxhPW4mJm4uZXhwb3J0cz09PWUscz1hJiZ0LnByb2Nlc3MsaT1mdW5jdGlvbigpe3RyeXt2YXIgbz1uJiZuLnJlcXVpcmUmJm4ucmVxdWlyZSgidXRpbCIpLnR5cGVzO3JldHVybiBvfHxzJiZzLmJpbmRpbmcmJnMuYmluZGluZygidXRpbCIpfWNhdGNoe319KCk7ZC5leHBvcnRzPWl9KFVlLFVlLmV4cG9ydHMpO3ZhciBlcj1VZS5leHBvcnRzLGlsPXJsLHNsPXRyLGpyPWVyLFVyPWpyJiZqci5pc1R5cGVkQXJyYXksb2w9VXI/c2woVXIpOmlsLCRyPW9sLGFsPWFhLGxsPXlhLGNsPUZlLGZsPV9lLHVsPVBhLGhsPSRyLGRsPU9iamVjdC5wcm90b3R5cGUsZ2w9ZGwuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gcGwoZCxyKXt2YXIgdD1jbChkKSxlPSF0JiZsbChkKSxuPSF0JiYhZSYmZmwoZCksYT0hdCYmIWUmJiFuJiZobChkKSxzPXR8fGV8fG58fGEsaT1zP2FsKGQubGVuZ3RoLFN0cmluZyk6W10sbz1pLmxlbmd0aDtmb3IodmFyIGMgaW4gZCkocnx8Z2wuY2FsbChkLGMpKSYmIShzJiYoYz09Imxlbmd0aCJ8fG4mJihjPT0ib2Zmc2V0Inx8Yz09InBhcmVudCIpfHxhJiYoYz09ImJ1ZmZlciJ8fGM9PSJieXRlTGVuZ3RoInx8Yz09ImJ5dGVPZmZzZXQiKXx8dWwoYyxvKSkpJiZpLnB1c2goYyk7cmV0dXJuIGl9dmFyIHpyPXBsLG1sPU9iamVjdC5wcm90b3R5cGU7ZnVuY3Rpb24gdmwoZCl7dmFyIHI9ZCYmZC5jb25zdHJ1Y3Rvcix0PXR5cGVvZiByPT0iZnVuY3Rpb24iJiZyLnByb3RvdHlwZXx8bWw7cmV0dXJuIGQ9PT10fXZhciBycj12bDtmdW5jdGlvbiB5bChkLHIpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZChyKHQpKX19dmFyIEdyPXlsLFNsPUdyLHhsPVNsKE9iamVjdC5rZXlzLE9iamVjdCksVGw9eGwsTWw9cnIsT2w9VGwsRWw9T2JqZWN0LnByb3RvdHlwZSxQbD1FbC5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBBbChkKXtpZighTWwoZCkpcmV0dXJuIE9sKGQpO3ZhciByPVtdO2Zvcih2YXIgdCBpbiBPYmplY3QoZCkpUGwuY2FsbChkLHQpJiZ0IT0iY29uc3RydWN0b3IiJiZyLnB1c2godCk7cmV0dXJuIHJ9dmFyIENsPUFsLFJsPVByLElsPUZyO2Z1bmN0aW9uIExsKGQpe3JldHVybiBkIT1udWxsJiZJbChkLmxlbmd0aCkmJiFSbChkKX12YXIgSHI9TGwsYmw9enIsRGw9Q2wsd2w9SHI7ZnVuY3Rpb24gTmwoZCl7cmV0dXJuIHdsKGQpP2JsKGQpOkRsKGQpfXZhciBucj1ObCxCbD1XZSxXbD1ucjtmdW5jdGlvbiBGbChkLHIpe3JldHVybiBkJiZCbChyLFdsKHIpLGQpfXZhciBqbD1GbDtmdW5jdGlvbiBVbChkKXt2YXIgcj1bXTtpZihkIT1udWxsKWZvcih2YXIgdCBpbiBPYmplY3QoZCkpci5wdXNoKHQpO3JldHVybiByfXZhciAkbD1VbCx6bD1zZSxHbD1ycixIbD0kbCxLbD1PYmplY3QucHJvdG90eXBlLFZsPUtsLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIFlsKGQpe2lmKCF6bChkKSlyZXR1cm4gSGwoZCk7dmFyIHI9R2woZCksdD1bXTtmb3IodmFyIGUgaW4gZCllPT0iY29uc3RydWN0b3IiJiYocnx8IVZsLmNhbGwoZCxlKSl8fHQucHVzaChlKTtyZXR1cm4gdH12YXIgWGw9WWwsWmw9enIsSmw9WGwsUWw9SHI7ZnVuY3Rpb24ga2woZCl7cmV0dXJuIFFsKGQpP1psKGQsITApOkpsKGQpfXZhciBpcj1rbCxxbD1XZSxfbD1pcjtmdW5jdGlvbiB0YyhkLHIpe3JldHVybiBkJiZxbChyLF9sKHIpLGQpfXZhciBlYz10YywkZT17ZXhwb3J0czp7fX07JGUuZXhwb3J0cyxmdW5jdGlvbihkLHIpe3ZhciB0PVF0LGU9ciYmIXIubm9kZVR5cGUmJnIsbj1lJiYhMCYmZCYmIWQubm9kZVR5cGUmJmQsYT1uJiZuLmV4cG9ydHM9PT1lLHM9YT90LkJ1ZmZlcjp2b2lkIDAsaT1zP3MuYWxsb2NVbnNhZmU6dm9pZCAwO2Z1bmN0aW9uIG8oYyxtKXtpZihtKXJldHVybiBjLnNsaWNlKCk7dmFyIHU9Yy5sZW5ndGgscD1pP2kodSk6bmV3IGMuY29uc3RydWN0b3IodSk7cmV0dXJuIGMuY29weShwKSxwfWQuZXhwb3J0cz1vfSgkZSwkZS5leHBvcnRzKTt2YXIgcmM9JGUuZXhwb3J0cztmdW5jdGlvbiBuYyhkLHIpe3ZhciB0PS0xLGU9ZC5sZW5ndGg7Zm9yKHJ8fChyPUFycmF5KGUpKTsrK3Q8ZTspclt0XT1kW3RdO3JldHVybiByfXZhciBpYz1uYztmdW5jdGlvbiBzYyhkLHIpe2Zvcih2YXIgdD0tMSxlPWQ9PW51bGw/MDpkLmxlbmd0aCxuPTAsYT1bXTsrK3Q8ZTspe3ZhciBzPWRbdF07cihzLHQsZCkmJihhW24rK109cyl9cmV0dXJuIGF9dmFyIG9jPXNjO2Z1bmN0aW9uIGFjKCl7cmV0dXJuW119dmFyIEtyPWFjLGxjPW9jLGNjPUtyLGZjPU9iamVjdC5wcm90b3R5cGUsdWM9ZmMucHJvcGVydHlJc0VudW1lcmFibGUsVnI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxoYz1Wcj9mdW5jdGlvbihkKXtyZXR1cm4gZD09bnVsbD9bXTooZD1PYmplY3QoZCksbGMoVnIoZCksZnVuY3Rpb24ocil7cmV0dXJuIHVjLmNhbGwoZCxyKX0pKX06Y2Msc3I9aGMsZGM9V2UsZ2M9c3I7ZnVuY3Rpb24gcGMoZCxyKXtyZXR1cm4gZGMoZCxnYyhkKSxyKX12YXIgbWM9cGM7ZnVuY3Rpb24gdmMoZCxyKXtmb3IodmFyIHQ9LTEsZT1yLmxlbmd0aCxuPWQubGVuZ3RoOysrdDxlOylkW24rdF09clt0XTtyZXR1cm4gZH12YXIgWXI9dmMseWM9R3IsU2M9eWMoT2JqZWN0LmdldFByb3RvdHlwZU9mLE9iamVjdCksWHI9U2MseGM9WXIsVGM9WHIsTWM9c3IsT2M9S3IsRWM9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxQYz1FYz9mdW5jdGlvbihkKXtmb3IodmFyIHI9W107ZDspeGMocixNYyhkKSksZD1UYyhkKTtyZXR1cm4gcn06T2MsWnI9UGMsQWM9V2UsQ2M9WnI7ZnVuY3Rpb24gUmMoZCxyKXtyZXR1cm4gQWMoZCxDYyhkKSxyKX12YXIgSWM9UmMsTGM9WXIsYmM9RmU7ZnVuY3Rpb24gRGMoZCxyLHQpe3ZhciBlPXIoZCk7cmV0dXJuIGJjKGQpP2U6TGMoZSx0KGQpKX12YXIgSnI9RGMsd2M9SnIsTmM9c3IsQmM9bnI7ZnVuY3Rpb24gV2MoZCl7cmV0dXJuIHdjKGQsQmMsTmMpfXZhciBRcj1XYyxGYz1KcixqYz1acixVYz1pcjtmdW5jdGlvbiAkYyhkKXtyZXR1cm4gRmMoZCxVYyxqYyl9dmFyIHpjPSRjLEdjPWZlLEhjPVF0LEtjPUdjKEhjLCJEYXRhVmlldyIpLFZjPUtjLFljPWZlLFhjPVF0LFpjPVljKFhjLCJQcm9taXNlIiksSmM9WmMsUWM9ZmUsa2M9UXQscWM9UWMoa2MsIlNldCIpLF9jPXFjLHRmPWZlLGVmPVF0LHJmPXRmKGVmLCJXZWFrTWFwIiksbmY9cmYsb3I9VmMsYXI9cWUsbHI9SmMsY3I9X2MsZnI9bmYsa3I9Y2UsU2U9Q3IscXI9IltvYmplY3QgTWFwXSIsc2Y9IltvYmplY3QgT2JqZWN0XSIsX3I9IltvYmplY3QgUHJvbWlzZV0iLHRuPSJbb2JqZWN0IFNldF0iLGVuPSJbb2JqZWN0IFdlYWtNYXBdIixybj0iW29iamVjdCBEYXRhVmlld10iLG9mPVNlKG9yKSxhZj1TZShhciksbGY9U2UobHIpLGNmPVNlKGNyKSxmZj1TZShmciksdWU9a3I7KG9yJiZ1ZShuZXcgb3IobmV3IEFycmF5QnVmZmVyKDEpKSkhPXJufHxhciYmdWUobmV3IGFyKSE9cXJ8fGxyJiZ1ZShsci5yZXNvbHZlKCkpIT1fcnx8Y3ImJnVlKG5ldyBjcikhPXRufHxmciYmdWUobmV3IGZyKSE9ZW4pJiYodWU9ZnVuY3Rpb24oZCl7dmFyIHI9a3IoZCksdD1yPT1zZj9kLmNvbnN0cnVjdG9yOnZvaWQgMCxlPXQ/U2UodCk6IiI7aWYoZSlzd2l0Y2goZSl7Y2FzZSBvZjpyZXR1cm4gcm47Y2FzZSBhZjpyZXR1cm4gcXI7Y2FzZSBsZjpyZXR1cm4gX3I7Y2FzZSBjZjpyZXR1cm4gdG47Y2FzZSBmZjpyZXR1cm4gZW59cmV0dXJuIHJ9KTt2YXIgemU9dWUsdWY9T2JqZWN0LnByb3RvdHlwZSxoZj11Zi5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBkZihkKXt2YXIgcj1kLmxlbmd0aCx0PW5ldyBkLmNvbnN0cnVjdG9yKHIpO3JldHVybiByJiZ0eXBlb2YgZFswXT09InN0cmluZyImJmhmLmNhbGwoZCwiaW5kZXgiKSYmKHQuaW5kZXg9ZC5pbmRleCx0LmlucHV0PWQuaW5wdXQpLHR9dmFyIGdmPWRmLHBmPVF0LG1mPXBmLlVpbnQ4QXJyYXksbm49bWYsc249bm47ZnVuY3Rpb24gdmYoZCl7dmFyIHI9bmV3IGQuY29uc3RydWN0b3IoZC5ieXRlTGVuZ3RoKTtyZXR1cm4gbmV3IHNuKHIpLnNldChuZXcgc24oZCkpLHJ9dmFyIHVyPXZmLHlmPXVyO2Z1bmN0aW9uIFNmKGQscil7dmFyIHQ9cj95ZihkLmJ1ZmZlcik6ZC5idWZmZXI7cmV0dXJuIG5ldyBkLmNvbnN0cnVjdG9yKHQsZC5ieXRlT2Zmc2V0LGQuYnl0ZUxlbmd0aCl9dmFyIHhmPVNmLFRmPS9cdyokLztmdW5jdGlvbiBNZihkKXt2YXIgcj1uZXcgZC5jb25zdHJ1Y3RvcihkLnNvdXJjZSxUZi5leGVjKGQpKTtyZXR1cm4gci5sYXN0SW5kZXg9ZC5sYXN0SW5kZXgscn12YXIgT2Y9TWYsb249d2UsYW49b24/b24ucHJvdG90eXBlOnZvaWQgMCxsbj1hbj9hbi52YWx1ZU9mOnZvaWQgMDtmdW5jdGlvbiBFZihkKXtyZXR1cm4gbG4/T2JqZWN0KGxuLmNhbGwoZCkpOnt9fXZhciBQZj1FZixBZj11cjtmdW5jdGlvbiBDZihkLHIpe3ZhciB0PXI/QWYoZC5idWZmZXIpOmQuYnVmZmVyO3JldHVybiBuZXcgZC5jb25zdHJ1Y3Rvcih0LGQuYnl0ZU9mZnNldCxkLmxlbmd0aCl9dmFyIFJmPUNmLElmPXVyLExmPXhmLGJmPU9mLERmPVBmLHdmPVJmLE5mPSJbb2JqZWN0IEJvb2xlYW5dIixCZj0iW29iamVjdCBEYXRlXSIsV2Y9IltvYmplY3QgTWFwXSIsRmY9IltvYmplY3QgTnVtYmVyXSIsamY9IltvYmplY3QgUmVnRXhwXSIsVWY9IltvYmplY3QgU2V0XSIsJGY9IltvYmplY3QgU3RyaW5nXSIsemY9IltvYmplY3QgU3ltYm9sXSIsR2Y9IltvYmplY3QgQXJyYXlCdWZmZXJdIixIZj0iW29iamVjdCBEYXRhVmlld10iLEtmPSJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLFZmPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLFlmPSJbb2JqZWN0IEludDhBcnJheV0iLFhmPSJbb2JqZWN0IEludDE2QXJyYXldIixaZj0iW29iamVjdCBJbnQzMkFycmF5XSIsSmY9IltvYmplY3QgVWludDhBcnJheV0iLFFmPSJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSIsa2Y9IltvYmplY3QgVWludDE2QXJyYXldIixxZj0iW29iamVjdCBVaW50MzJBcnJheV0iO2Z1bmN0aW9uIF9mKGQscix0KXt2YXIgZT1kLmNvbnN0cnVjdG9yO3N3aXRjaChyKXtjYXNlIEdmOnJldHVybiBJZihkKTtjYXNlIE5mOmNhc2UgQmY6cmV0dXJuIG5ldyBlKCtkKTtjYXNlIEhmOnJldHVybiBMZihkLHQpO2Nhc2UgS2Y6Y2FzZSBWZjpjYXNlIFlmOmNhc2UgWGY6Y2FzZSBaZjpjYXNlIEpmOmNhc2UgUWY6Y2FzZSBrZjpjYXNlIHFmOnJldHVybiB3ZihkLHQpO2Nhc2UgV2Y6cmV0dXJuIG5ldyBlO2Nhc2UgRmY6Y2FzZSAkZjpyZXR1cm4gbmV3IGUoZCk7Y2FzZSBqZjpyZXR1cm4gYmYoZCk7Y2FzZSBVZjpyZXR1cm4gbmV3IGU7Y2FzZSB6ZjpyZXR1cm4gRGYoZCl9fXZhciB0dT1fZixldT1zZSxjbj1PYmplY3QuY3JlYXRlLHJ1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZCgpe31yZXR1cm4gZnVuY3Rpb24ocil7aWYoIWV1KHIpKXJldHVybnt9O2lmKGNuKXJldHVybiBjbihyKTtkLnByb3RvdHlwZT1yO3ZhciB0PW5ldyBkO3JldHVybiBkLnByb3RvdHlwZT12b2lkIDAsdH19KCksbnU9cnUsaXU9bnUsc3U9WHIsb3U9cnI7ZnVuY3Rpb24gYXUoZCl7cmV0dXJuIHR5cGVvZiBkLmNvbnN0cnVjdG9yPT0iZnVuY3Rpb24iJiYhb3UoZCk/aXUoc3UoZCkpOnt9fXZhciBsdT1hdSxjdT16ZSxmdT1pZSx1dT0iW29iamVjdCBNYXBdIjtmdW5jdGlvbiBodShkKXtyZXR1cm4gZnUoZCkmJmN1KGQpPT11dX12YXIgZHU9aHUsZ3U9ZHUscHU9dHIsZm49ZXIsdW49Zm4mJmZuLmlzTWFwLG11PXVuP3B1KHVuKTpndSx2dT1tdSx5dT16ZSxTdT1pZSx4dT0iW29iamVjdCBTZXRdIjtmdW5jdGlvbiBUdShkKXtyZXR1cm4gU3UoZCkmJnl1KGQpPT14dX12YXIgTXU9VHUsT3U9TXUsRXU9dHIsaG49ZXIsZG49aG4mJmhuLmlzU2V0LFB1PWRuP0V1KGRuKTpPdSxBdT1QdSxDdT1icixSdT1YbyxJdT1OcixMdT1qbCxidT1lYyxEdT1yYyx3dT1pYyxOdT1tYyxCdT1JYyxXdT1RcixGdT16YyxqdT16ZSxVdT1nZiwkdT10dSx6dT1sdSxHdT1GZSxIdT1fZSxLdT12dSxWdT1zZSxZdT1BdSxYdT1ucixadT1pcixKdT0xLFF1PTIsa3U9NCxnbj0iW29iamVjdCBBcmd1bWVudHNdIixxdT0iW29iamVjdCBBcnJheV0iLF91PSJbb2JqZWN0IEJvb2xlYW5dIix0aD0iW29iamVjdCBEYXRlXSIsZWg9IltvYmplY3QgRXJyb3JdIixwbj0iW29iamVjdCBGdW5jdGlvbl0iLHJoPSJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSIsbmg9IltvYmplY3QgTWFwXSIsaWg9IltvYmplY3QgTnVtYmVyXSIsbW49IltvYmplY3QgT2JqZWN0XSIsc2g9IltvYmplY3QgUmVnRXhwXSIsb2g9IltvYmplY3QgU2V0XSIsYWg9IltvYmplY3QgU3RyaW5nXSIsbGg9IltvYmplY3QgU3ltYm9sXSIsY2g9IltvYmplY3QgV2Vha01hcF0iLGZoPSJbb2JqZWN0IEFycmF5QnVmZmVyXSIsdWg9IltvYmplY3QgRGF0YVZpZXddIixoaD0iW29iamVjdCBGbG9hdDMyQXJyYXldIixkaD0iW29iamVjdCBGbG9hdDY0QXJyYXldIixnaD0iW29iamVjdCBJbnQ4QXJyYXldIixwaD0iW29iamVjdCBJbnQxNkFycmF5XSIsbWg9IltvYmplY3QgSW50MzJBcnJheV0iLHZoPSJbb2JqZWN0IFVpbnQ4QXJyYXldIix5aD0iW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLFNoPSJbb2JqZWN0IFVpbnQxNkFycmF5XSIseGg9IltvYmplY3QgVWludDMyQXJyYXldIixOdD17fTtOdFtnbl09TnRbcXVdPU50W2ZoXT1OdFt1aF09TnRbX3VdPU50W3RoXT1OdFtoaF09TnRbZGhdPU50W2doXT1OdFtwaF09TnRbbWhdPU50W25oXT1OdFtpaF09TnRbbW5dPU50W3NoXT1OdFtvaF09TnRbYWhdPU50W2xoXT1OdFt2aF09TnRbeWhdPU50W1NoXT1OdFt4aF09ITAsTnRbZWhdPU50W3BuXT1OdFtjaF09ITE7ZnVuY3Rpb24gR2UoZCxyLHQsZSxuLGEpe3ZhciBzLGk9ciZKdSxvPXImUXUsYz1yJmt1O2lmKHQmJihzPW4/dChkLGUsbixhKTp0KGQpKSxzIT09dm9pZCAwKXJldHVybiBzO2lmKCFWdShkKSlyZXR1cm4gZDt2YXIgbT1HdShkKTtpZihtKXtpZihzPVV1KGQpLCFpKXJldHVybiB3dShkLHMpfWVsc2V7dmFyIHU9anUoZCkscD11PT1wbnx8dT09cmg7aWYoSHUoZCkpcmV0dXJuIER1KGQsaSk7aWYodT09bW58fHU9PWdufHxwJiYhbil7aWYocz1vfHxwP3t9Onp1KGQpLCFpKXJldHVybiBvP0J1KGQsYnUocyxkKSk6TnUoZCxMdShzLGQpKX1lbHNle2lmKCFOdFt1XSlyZXR1cm4gbj9kOnt9O3M9JHUoZCx1LGkpfX1hfHwoYT1uZXcgQ3UpO3ZhciB5PWEuZ2V0KGQpO2lmKHkpcmV0dXJuIHk7YS5zZXQoZCxzKSxZdShkKT9kLmZvckVhY2goZnVuY3Rpb24odil7cy5hZGQoR2UodixyLHQsdixkLGEpKX0pOkt1KGQpJiZkLmZvckVhY2goZnVuY3Rpb24odixUKXtzLnNldChULEdlKHYscix0LFQsZCxhKSl9KTt2YXIgTz1jP28/RnU6V3U6bz9adTpYdSx4PW0/dm9pZCAwOk8oZCk7cmV0dXJuIFJ1KHh8fGQsZnVuY3Rpb24odixUKXt4JiYoVD12LHY9ZFtUXSksSXUocyxULEdlKHYscix0LFQsZCxhKSl9KSxzfXZhciBUaD1HZSxNaD1UaCxPaD0xLEVoPTQ7ZnVuY3Rpb24gUGgoZCl7cmV0dXJuIE1oKGQsT2h8RWgpfXZhciBBaD1QaCxadD1YdChBaCksS3Q9KGQ9PihkLk5vcm1hbD0iTm9ybWFsIixkLlN0cm9rZT0iU3Ryb2tlIixkLkRvdHRlZD0iRG90dGVkIixkLkxvbmdEb3R0ZWQ9IkxvbmdEb3R0ZWQiLGQpKShLdHx8e30pLEx0PShkPT4oZC5Ob25lPSJOb25lIixkLlNob3dGbG9hdEJhcj0iU2hvd0Zsb2F0QmFyIixkLlpJbmRleEZsb2F0QmFyPSJaSW5kZXhGbG9hdEJhciIsZC5EZWxldGVOb2RlPSJEZWxldGVOb2RlIixkLkNvcHlOb2RlPSJDb3B5Tm9kZSIsZC5aSW5kZXhBY3RpdmU9IlpJbmRleEFjdGl2ZSIsZC5aSW5kZXhOb2RlPSJaSW5kZXhOb2RlIixkLlJvdGF0ZU5vZGU9IlJvdGF0ZU5vZGUiLGQuU2V0Q29sb3JOb2RlPSJTZXRDb2xvck5vZGUiLGQuVHJhbnNsYXRlTm9kZT0iVHJhbnNsYXRlTm9kZSIsZC5TY2FsZU5vZGU9IlNjYWxlTm9kZSIsZC5PcmlnaW5hbEV2ZW50PSJPcmlnaW5hbEV2ZW50IixkLkNyZWF0ZVNjZW5lPSJDcmVhdGVTY2VuZSIsZC5BY3RpdmVDdXJzb3I9IkFjdGl2ZUN1cnNvciIsZC5Nb3ZlQ3Vyc29yPSJNb3ZlQ3Vyc29yIixkLkNvbW1hbmRFZGl0b3I9IkNvbW1hbmRFZGl0b3IiLGQuU2V0RWRpdG9yRGF0YT0iU2V0RWRpdG9yRGF0YSIsZC5TZXRGb250U3R5bGU9IlNldEZvbnRTdHlsZSIsZC5TZXRQb2ludD0iU2V0UG9pbnQiLGQuU2V0TG9jaz0iU2V0TG9jayIsZC5TZXRTaGFwZU9wdD0iU2V0U2hhcGVPcHQiLGQpKShMdHx8e30pLGd0PShkPT4oZFtkLlBlbmNpbD0xXT0iUGVuY2lsIixkW2QuRXJhc2VyPTJdPSJFcmFzZXIiLGRbZC5TZWxlY3Rvcj0zXT0iU2VsZWN0b3IiLGRbZC5DbGlja2VyPTRdPSJDbGlja2VyIixkW2QuQXJyb3c9NV09IkFycm93IixkW2QuSGFuZD02XT0iSGFuZCIsZFtkLkxhc2VyUGVuPTddPSJMYXNlclBlbiIsZFtkLlRleHQ9OF09IlRleHQiLGRbZC5TdHJhaWdodD05XT0iU3RyYWlnaHQiLGRbZC5SZWN0YW5nbGU9MTBdPSJSZWN0YW5nbGUiLGRbZC5FbGxpcHNlPTExXT0iRWxsaXBzZSIsZFtkLlN0YXI9MTJdPSJTdGFyIixkW2QuVHJpYW5nbGU9MTNdPSJUcmlhbmdsZSIsZFtkLlJob21idXM9MTRdPSJSaG9tYnVzIixkW2QuUG9seWdvbj0xNV09IlBvbHlnb24iLGRbZC5TcGVlY2hCYWxsb29uPTE2XT0iU3BlZWNoQmFsbG9vbiIsZFtkLkltYWdlPTE3XT0iSW1hZ2UiLGQpKShndHx8e30pLFR0PShkPT4oZFtkLkxvY2FsPTFdPSJMb2NhbCIsZFtkLlNlcnZpY2U9Ml09IlNlcnZpY2UiLGRbZC5Xb3JrZXI9M109IldvcmtlciIsZCkpKFR0fHx7fSksSXQ9KGQ9PihkW2QuUGVuZGluZz0wXT0iUGVuZGluZyIsZFtkLlN0YXJ0PTFdPSJTdGFydCIsZFtkLkRvaW5nPTJdPSJEb2luZyIsZFtkLkRvbmU9M109IkRvbmUiLGRbZC5GcmVlemU9NF09IkZyZWV6ZSIsZFtkLlVud3JpdGFibGU9NV09IlVud3JpdGFibGUiLGQpKShJdHx8e30pLGx0PShkPT4oZFtkLk5vbmU9MF09Ik5vbmUiLGRbZC5Jbml0PTFdPSJJbml0IixkW2QuVXBkYXRlQ2FtZXJhPTJdPSJVcGRhdGVDYW1lcmEiLGRbZC5VcGRhdGVUb29scz0zXT0iVXBkYXRlVG9vbHMiLGRbZC5DcmVhdGVXb3JrPTRdPSJDcmVhdGVXb3JrIixkW2QuRHJhd1dvcms9NV09IkRyYXdXb3JrIixkW2QuRnVsbFdvcms9Nl09IkZ1bGxXb3JrIixkW2QuVXBkYXRlTm9kZT03XT0iVXBkYXRlTm9kZSIsZFtkLlJlbW92ZU5vZGU9OF09IlJlbW92ZU5vZGUiLGRbZC5DbGVhcj05XT0iQ2xlYXIiLGRbZC5TZWxlY3Q9MTBdPSJTZWxlY3QiLGRbZC5EZXN0cm95PTExXT0iRGVzdHJveSIsZFtkLlNuYXBzaG90PTEyXT0iU25hcHNob3QiLGRbZC5Cb3VuZGluZ0JveD0xM109IkJvdW5kaW5nQm94IixkW2QuQ3Vyc29yPTE0XT0iQ3Vyc29yIixkW2QuVGV4dFVwZGF0ZT0xNV09IlRleHRVcGRhdGUiLGRbZC5HZXRUZXh0QWN0aXZlPTE2XT0iR2V0VGV4dEFjdGl2ZSIsZFtkLlRhc2tzUXVldWU9MTddPSJUYXNrc1F1ZXVlIixkW2QuQ3Vyc29ySG92ZXI9MThdPSJDdXJzb3JIb3ZlciIsZCkpKGx0fHx7fSksU3Q9KGQ9PihkW2QuRmxvYXQ9MV09IkZsb2F0IixkW2QuQmc9Ml09IkJnIixkW2QuU2VsZWN0b3I9M109IlNlbGVjdG9yIixkW2QuU2VydmljZUZsb2F0PTRdPSJTZXJ2aWNlRmxvYXQiLGRbZC5Ob25lPTVdPSJOb25lIixkKSkoU3R8fHt9KSxGdD0oZD0+KGRbZC5ub25lPTFdPSJub25lIixkW2QuYWxsPTJdPSJhbGwiLGRbZC5ib3RoPTNdPSJib3RoIixkW2QucHJvcG9ydGlvbmFsPTRdPSJwcm9wb3J0aW9uYWwiLGQpKShGdHx8e30pO2NsYXNzIEp0e2NvbnN0cnVjdG9yKCl7c3QodGhpcywibG9jYWxXb3JrIik7c3QodGhpcywic2VydmljZVdvcmsiKTtzdCh0aGlzLCJzY2VuZSIpfXJlZ2lzdGVyRm9yV29ya2VyKHIsdCxlKXtyZXR1cm4gdGhpcy5sb2NhbFdvcms9cix0aGlzLnNlcnZpY2VXb3JrPXQsdGhpcy5zY2VuZT1lLHRoaXN9fWNvbnN0IENoPXtsaW5lYXI6ZD0+ZCxlYXNlSW5RdWFkOmQ9PmQqZCxlYXNlT3V0UXVhZDpkPT5kKigyLWQpLGVhc2VJbk91dFF1YWQ6ZD0+ZDwuNT8yKmQqZDotMSsoNC0yKmQpKmQsZWFzZUluQ3ViaWM6ZD0+ZCpkKmQsZWFzZU91dEN1YmljOmQ9Pi0tZCpkKmQrMSxlYXNlSW5PdXRDdWJpYzpkPT5kPC41PzQqZCpkKmQ6KGQtMSkqKDIqZC0yKSooMipkLTIpKzEsZWFzZUluUXVhcnQ6ZD0+ZCpkKmQqZCxlYXNlT3V0UXVhcnQ6ZD0+MS0gLS1kKmQqZCpkLGVhc2VJbk91dFF1YXJ0OmQ9PmQ8LjU/OCpkKmQqZCpkOjEtOCotLWQqZCpkKmQsZWFzZUluUXVpbnQ6ZD0+ZCpkKmQqZCpkLGVhc2VPdXRRdWludDpkPT4xKy0tZCpkKmQqZCpkLGVhc2VJbk91dFF1aW50OmQ9PmQ8LjU/MTYqZCpkKmQqZCpkOjErMTYqLS1kKmQqZCpkKmQsZWFzZUluU2luZTpkPT4xLU1hdGguY29zKGQqTWF0aC5QSS8yKSxlYXNlT3V0U2luZTpkPT5NYXRoLnNpbihkKk1hdGguUEkvMiksZWFzZUluT3V0U2luZTpkPT4tKE1hdGguY29zKE1hdGguUEkqZCktMSkvMixlYXNlSW5FeHBvOmQ9PmQ8PTA/MDpNYXRoLnBvdygyLDEwKmQtMTApLGVhc2VPdXRFeHBvOmQ9PmQ+PTE/MToxLU1hdGgucG93KDIsLTEwKmQpLGVhc2VJbk91dEV4cG86ZD0+ZDw9MD8wOmQ+PTE/MTpkPC41P01hdGgucG93KDIsMjAqZC0xMCkvMjooMi1NYXRoLnBvdygyLC0yMCpkKzEwKSkvMn07Y2xhc3MgZXR7Y29uc3RydWN0b3Iocj0wLHQ9MCxlPTEpe3RoaXMueD1yLHRoaXMueT10LHRoaXMuej1lfWdldCBYWSgpe3JldHVyblt0aGlzLngsdGhpcy55XX1zZXR6KHIpe3JldHVybiB0aGlzLno9cix0aGlzfXNldFhZKHI9dGhpcy54LHQ9dGhpcy55KXtyZXR1cm4gdGhpcy54PXIsdGhpcy55PXQsdGhpc31zZXQocj10aGlzLngsdD10aGlzLnksZT10aGlzLnope3JldHVybiB0aGlzLng9cix0aGlzLnk9dCx0aGlzLno9ZSx0aGlzfXNldFRvKHt4OnI9MCx5OnQ9MCx6OmU9MX0pe3JldHVybiB0aGlzLng9cix0aGlzLnk9dCx0aGlzLno9ZSx0aGlzfXJvdChyKXtpZihyPT09MClyZXR1cm4gdGhpcztjb25zdHt4OnQseTplfT10aGlzLG49TWF0aC5zaW4ociksYT1NYXRoLmNvcyhyKTtyZXR1cm4gdGhpcy54PXQqYS1lKm4sdGhpcy55PXQqbitlKmEsdGhpc31yb3RXaXRoKHIsdCl7aWYodD09PTApcmV0dXJuIHRoaXM7Y29uc3QgZT10aGlzLngtci54LG49dGhpcy55LXIueSxhPU1hdGguc2luKHQpLHM9TWF0aC5jb3ModCk7cmV0dXJuIHRoaXMueD1yLngrKGUqcy1uKmEpLHRoaXMueT1yLnkrKGUqYStuKnMpLHRoaXN9Y2xvbmUoKXtjb25zdHt4OnIseTp0LHo6ZX09dGhpcztyZXR1cm4gbmV3IGV0KHIsdCxlKX1zdWIocil7cmV0dXJuIHRoaXMueC09ci54LHRoaXMueS09ci55LHRoaXN9c3ViWFkocix0KXtyZXR1cm4gdGhpcy54LT1yLHRoaXMueS09dCx0aGlzfXN1YlNjYWxhcihyKXtyZXR1cm4gdGhpcy54LT1yLHRoaXMueS09cix0aGlzfWFkZChyKXtyZXR1cm4gdGhpcy54Kz1yLngsdGhpcy55Kz1yLnksdGhpc31hZGRYWShyLHQpe3JldHVybiB0aGlzLngrPXIsdGhpcy55Kz10LHRoaXN9YWRkU2NhbGFyKHIpe3JldHVybiB0aGlzLngrPXIsdGhpcy55Kz1yLHRoaXN9Y2xhbXAocix0KXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHRoaXMueCxyKSx0aGlzLnk9TWF0aC5tYXgodGhpcy55LHIpLHQhPT12b2lkIDAmJih0aGlzLng9TWF0aC5taW4odGhpcy54LHQpLHRoaXMueT1NYXRoLm1pbih0aGlzLnksdCkpLHRoaXN9ZGl2KHIpe3JldHVybiB0aGlzLngvPXIsdGhpcy55Lz1yLHRoaXN9ZGl2VihyKXtyZXR1cm4gdGhpcy54Lz1yLngsdGhpcy55Lz1yLnksdGhpc31tdWwocil7cmV0dXJuIHRoaXMueCo9cix0aGlzLnkqPXIsdGhpc31tdWxWKHIpe3JldHVybiB0aGlzLngqPXIueCx0aGlzLnkqPXIueSx0aGlzfWFicygpe3JldHVybiB0aGlzLng9TWF0aC5hYnModGhpcy54KSx0aGlzLnk9TWF0aC5hYnModGhpcy55KSx0aGlzfW51ZGdlKHIsdCl7Y29uc3QgZT1ldC5UYW4ocix0aGlzKTtyZXR1cm4gdGhpcy5hZGQoZS5tdWwodCkpfW5lZygpe3JldHVybiB0aGlzLngqPS0xLHRoaXMueSo9LTEsdGhpc31jcm9zcyhyKXtyZXR1cm4gdGhpcy54PXRoaXMueSpyLnotdGhpcy56KnIueSx0aGlzLnk9dGhpcy56KnIueC10aGlzLngqci56LHRoaXN9ZHByKHIpe3JldHVybiBldC5EcHIodGhpcyxyKX1jcHIocil7cmV0dXJuIGV0LkNwcih0aGlzLHIpfWxlbjIoKXtyZXR1cm4gZXQuTGVuMih0aGlzKX1sZW4oKXtyZXR1cm4gZXQuTGVuKHRoaXMpfXByeShyKXtyZXR1cm4gZXQuUHJ5KHRoaXMscil9cGVyKCl7Y29uc3R7eDpyLHk6dH09dGhpcztyZXR1cm4gdGhpcy54PXQsdGhpcy55PS1yLHRoaXN9dW5pKCl7cmV0dXJuIGV0LlVuaSh0aGlzKX10YW4ocil7cmV0dXJuIGV0LlRhbih0aGlzLHIpfWRpc3Qocil7cmV0dXJuIGV0LkRpc3QodGhpcyxyKX1kaXN0YW5jZVRvTGluZVNlZ21lbnQocix0KXtyZXR1cm4gZXQuRGlzdGFuY2VUb0xpbmVTZWdtZW50KHIsdCx0aGlzKX1zbG9wZShyKXtyZXR1cm4gZXQuU2xvcGUodGhpcyxyKX1zbmFwVG9HcmlkKHIpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngvcikqcix0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkvcikqcix0aGlzfWFuZ2xlKHIpe3JldHVybiBldC5BbmdsZSh0aGlzLHIpfXRvQW5nbGUoKXtyZXR1cm4gZXQuVG9BbmdsZSh0aGlzKX1scnAocix0KXtyZXR1cm4gdGhpcy54PXRoaXMueCsoci54LXRoaXMueCkqdCx0aGlzLnk9dGhpcy55KyhyLnktdGhpcy55KSp0LHRoaXN9ZXF1YWxzKHIsdCl7cmV0dXJuIGV0LkVxdWFscyh0aGlzLHIsdCl9ZXF1YWxzWFkocix0KXtyZXR1cm4gZXQuRXF1YWxzWFkodGhpcyxyLHQpfW5vcm0oKXtjb25zdCByPXRoaXMubGVuKCk7cmV0dXJuIHRoaXMueD1yPT09MD8wOnRoaXMueC9yLHRoaXMueT1yPT09MD8wOnRoaXMueS9yLHRoaXN9dG9GaXhlZCgpe3JldHVybiBldC5Ub0ZpeGVkKHRoaXMpfXRvU3RyaW5nKCl7cmV0dXJuIGV0LlRvU3RyaW5nKGV0LlRvRml4ZWQodGhpcykpfXRvSnNvbigpe3JldHVybiBldC5Ub0pzb24odGhpcyl9dG9BcnJheSgpe3JldHVybiBldC5Ub0FycmF5KHRoaXMpfXN0YXRpYyBBZGQocix0KXtyZXR1cm4gbmV3IGV0KHIueCt0Lngsci55K3QueSl9c3RhdGljIEFkZFhZKHIsdCxlKXtyZXR1cm4gbmV3IGV0KHIueCt0LHIueStlKX1zdGF0aWMgU3ViKHIsdCl7cmV0dXJuIG5ldyBldChyLngtdC54LHIueS10LnkpfXN0YXRpYyBTdWJYWShyLHQsZSl7cmV0dXJuIG5ldyBldChyLngtdCxyLnktZSl9c3RhdGljIEFkZFNjYWxhcihyLHQpe3JldHVybiBuZXcgZXQoci54K3Qsci55K3QpfXN0YXRpYyBTdWJTY2FsYXIocix0KXtyZXR1cm4gbmV3IGV0KHIueC10LHIueS10KX1zdGF0aWMgRGl2KHIsdCl7cmV0dXJuIG5ldyBldChyLngvdCxyLnkvdCl9c3RhdGljIE11bChyLHQpe3JldHVybiBuZXcgZXQoci54KnQsci55KnQpfXN0YXRpYyBEaXZWKHIsdCl7cmV0dXJuIG5ldyBldChyLngvdC54LHIueS90LnkpfXN0YXRpYyBNdWxWKHIsdCl7cmV0dXJuIG5ldyBldChyLngqdC54LHIueSp0LnkpfXN0YXRpYyBOZWcocil7cmV0dXJuIG5ldyBldCgtci54LC1yLnkpfXN0YXRpYyBQZXIocil7cmV0dXJuIG5ldyBldChyLnksLXIueCl9c3RhdGljIERpc3QyKHIsdCl7cmV0dXJuIGV0LlN1YihyLHQpLmxlbjIoKX1zdGF0aWMgQWJzKHIpe3JldHVybiBuZXcgZXQoTWF0aC5hYnMoci54KSxNYXRoLmFicyhyLnkpKX1zdGF0aWMgRGlzdChyLHQpe3JldHVybiBNYXRoLmh5cG90KHIueS10Lnksci54LXQueCl9c3RhdGljIERwcihyLHQpe3JldHVybiByLngqdC54K3IueSp0Lnl9c3RhdGljIENyb3NzKHIsdCl7cmV0dXJuIG5ldyBldChyLnkqdC56LXIueip0Lnksci56KnQueC1yLngqdC56KX1zdGF0aWMgQ3ByKHIsdCl7cmV0dXJuIHIueCp0LnktdC54KnIueX1zdGF0aWMgTGVuMihyKXtyZXR1cm4gci54KnIueCtyLnkqci55fXN0YXRpYyBMZW4ocil7cmV0dXJuIE1hdGguaHlwb3Qoci54LHIueSl9c3RhdGljIFByeShyLHQpe3JldHVybiBldC5EcHIocix0KS9ldC5MZW4odCl9c3RhdGljIFVuaShyKXtyZXR1cm4gZXQuRGl2KHIsZXQuTGVuKHIpKX1zdGF0aWMgVGFuKHIsdCl7cmV0dXJuIGV0LlVuaShldC5TdWIocix0KSl9c3RhdGljIE1pbihyLHQpe3JldHVybiBuZXcgZXQoTWF0aC5taW4oci54LHQueCksTWF0aC5taW4oci55LHQueSkpfXN0YXRpYyBNYXgocix0KXtyZXR1cm4gbmV3IGV0KE1hdGgubWF4KHIueCx0LngpLE1hdGgubWF4KHIueSx0LnkpKX1zdGF0aWMgRnJvbShyKXtyZXR1cm4gbmV3IGV0KCkuYWRkKHIpfXN0YXRpYyBGcm9tQXJyYXkocil7cmV0dXJuIG5ldyBldChyWzBdLHJbMV0pfXN0YXRpYyBSb3Qocix0PTApe2NvbnN0IGU9TWF0aC5zaW4odCksbj1NYXRoLmNvcyh0KTtyZXR1cm4gbmV3IGV0KHIueCpuLXIueSplLHIueCplK3IueSpuKX1zdGF0aWMgUm90V2l0aChyLHQsZSl7Y29uc3Qgbj1yLngtdC54LGE9ci55LXQueSxzPU1hdGguc2luKGUpLGk9TWF0aC5jb3MoZSk7cmV0dXJuIG5ldyBldCh0LngrKG4qaS1hKnMpLHQueSsobipzK2EqaSkpfXN0YXRpYyBOZWFyZXN0UG9pbnRPbkxpbmVUaHJvdWdoUG9pbnQocix0LGUpe3JldHVybiBldC5NdWwodCxldC5TdWIoZSxyKS5wcnkodCkpLmFkZChyKX1zdGF0aWMgTmVhcmVzdFBvaW50T25MaW5lU2VnbWVudChyLHQsZSxuPSEwKXtjb25zdCBhPWV0LlRhbih0LHIpLHM9ZXQuQWRkKHIsZXQuTXVsKGEsZXQuU3ViKGUscikucHJ5KGEpKSk7aWYobil7aWYocy54PE1hdGgubWluKHIueCx0LngpKXJldHVybiBldC5DYXN0KHIueDx0Lng/cjp0KTtpZihzLng+TWF0aC5tYXgoci54LHQueCkpcmV0dXJuIGV0LkNhc3Qoci54PnQueD9yOnQpO2lmKHMueTxNYXRoLm1pbihyLnksdC55KSlyZXR1cm4gZXQuQ2FzdChyLnk8dC55P3I6dCk7aWYocy55Pk1hdGgubWF4KHIueSx0LnkpKXJldHVybiBldC5DYXN0KHIueT50Lnk/cjp0KX1yZXR1cm4gc31zdGF0aWMgRGlzdGFuY2VUb0xpbmVUaHJvdWdoUG9pbnQocix0LGUpe3JldHVybiBldC5EaXN0KGUsZXQuTmVhcmVzdFBvaW50T25MaW5lVGhyb3VnaFBvaW50KHIsdCxlKSl9c3RhdGljIERpc3RhbmNlVG9MaW5lU2VnbWVudChyLHQsZSxuPSEwKXtyZXR1cm4gZXQuRGlzdChlLGV0Lk5lYXJlc3RQb2ludE9uTGluZVNlZ21lbnQocix0LGUsbikpfXN0YXRpYyBTbmFwKHIsdD0xKXtyZXR1cm4gbmV3IGV0KE1hdGgucm91bmQoci54L3QpKnQsTWF0aC5yb3VuZChyLnkvdCkqdCl9c3RhdGljIENhc3Qocil7cmV0dXJuIHIgaW5zdGFuY2VvZiBldD9yOmV0LkZyb20ocil9c3RhdGljIFNsb3BlKHIsdCl7cmV0dXJuIHIueD09PXQueT9OYU46KHIueS10LnkpLyhyLngtdC54KX1zdGF0aWMgQW5nbGUocix0KXtyZXR1cm4gTWF0aC5hdGFuMih0Lnktci55LHQueC1yLngpfXN0YXRpYyBMcnAocix0LGUpe3JldHVybiBldC5TdWIodCxyKS5tdWwoZSkuYWRkKHIpfXN0YXRpYyBNZWQocix0KXtyZXR1cm4gbmV3IGV0KChyLngrdC54KS8yLChyLnkrdC55KS8yKX1zdGF0aWMgRXF1YWxzKHIsdCxlPTFlLTQpe3JldHVybiBNYXRoLmFicyhyLngtdC54KTxlJiZNYXRoLmFicyhyLnktdC55KTxlfXN0YXRpYyBFcXVhbHNYWShyLHQsZSl7cmV0dXJuIHIueD09PXQmJnIueT09PWV9c3RhdGljIEVxdWFsc1hZWihyLHQsZT0xZS00KXtyZXR1cm4gZXQuRXF1YWxzKHIsdCxlKSYmTWF0aC5hYnMoKHIuenx8MCktKHQuenx8MCkpPGV9c3RhdGljIENsb2Nrd2lzZShyLHQsZSl7cmV0dXJuKGUueC1yLngpKih0Lnktci55KS0odC54LXIueCkqKGUueS1yLnkpPDB9c3RhdGljIFJlc2NhbGUocix0KXtjb25zdCBlPWV0LkxlbihyKTtyZXR1cm4gbmV3IGV0KHQqci54L2UsdCpyLnkvZSl9c3RhdGljIFNjYWxlV2l0aE9yaWdpbihyLHQsZSl7cmV0dXJuIGV0LlN1YihyLGUpLm11bCh0KS5hZGQoZSl9c3RhdGljIFNjYWxlV09yaWdpbihyLHQsZSl7cmV0dXJuIGV0LlN1YihyLGUpLm11bFYodCkuYWRkKGUpfXN0YXRpYyBUb0ZpeGVkKHIsdD0yKXtyZXR1cm4gbmV3IGV0KCtyLngudG9GaXhlZCh0KSwrci55LnRvRml4ZWQodCksK3Iuei50b0ZpeGVkKHQpKX1zdGF0aWMgTnVkZ2Uocix0LGUpe3JldHVybiBldC5BZGQocixldC5UYW4odCxyKS5tdWwoZSkpfXN0YXRpYyBUb1N0cmluZyhyKXtyZXR1cm5gJHtyLnh9LCAke3IueX1gfXN0YXRpYyBUb0FuZ2xlKHIpe2xldCB0PU1hdGguYXRhbjIoci55LHIueCk7cmV0dXJuIHQ8MCYmKHQrPU1hdGguUEkqMiksdH1zdGF0aWMgRnJvbUFuZ2xlKHIsdD0xKXtyZXR1cm4gbmV3IGV0KE1hdGguY29zKHIpKnQsTWF0aC5zaW4ocikqdCl9c3RhdGljIFRvQXJyYXkocil7cmV0dXJuW3IueCxyLnksci56XX1zdGF0aWMgVG9Kc29uKHIpe2NvbnN0e3g6dCx5OmUsejpufT1yO3JldHVybnt4OnQseTplLHo6bn19c3RhdGljIEF2ZXJhZ2Uocil7Y29uc3QgdD1yLmxlbmd0aCxlPW5ldyBldCgwLDApO2ZvcihsZXQgbj0wO248dDtuKyspZS5hZGQocltuXSk7cmV0dXJuIGUuZGl2KHQpfXN0YXRpYyBDbGFtcChyLHQsZSl7cmV0dXJuIGU9PT12b2lkIDA/bmV3IGV0KE1hdGgubWluKE1hdGgubWF4KHIueCx0KSksTWF0aC5taW4oTWF0aC5tYXgoci55LHQpKSk6bmV3IGV0KE1hdGgubWluKE1hdGgubWF4KHIueCx0KSxlKSxNYXRoLm1pbihNYXRoLm1heChyLnksdCksZSkpfXN0YXRpYyBQb2ludHNCZXR3ZWVuKHIsdCxlPTYpe2NvbnN0IG49W107Zm9yKGxldCBhPTA7YTxlO2ErKyl7Y29uc3Qgcz1DaC5lYXNlSW5RdWFkKGEvKGUtMSkpLGk9ZXQuTHJwKHIsdCxzKTtpLno9TWF0aC5taW4oMSwuNStNYXRoLmFicyguNS1SaChzKSkqLjY1KSxuLnB1c2goaSl9cmV0dXJuIG59c3RhdGljIFNuYXBUb0dyaWQocix0PTgpe3JldHVybiBuZXcgZXQoTWF0aC5yb3VuZChyLngvdCkqdCxNYXRoLnJvdW5kKHIueS90KSp0KX19Y29uc3QgUmg9ZD0+ZDwuNT8yKmQqZDotMSsoNC0yKmQpKmQ7Y2xhc3MgTXQgZXh0ZW5kcyBldHtjb25zdHJ1Y3RvcihyPTAsdD0wLGU9MCxuPXt4OjAseTowfSxhPTAscz0wKXtzdXBlcihyLHQsZSksdGhpcy54PXIsdGhpcy55PXQsdGhpcy56PWUsdGhpcy52PW4sdGhpcy50PWEsdGhpcy5hPXN9Z2V0IHRpbWVzdGFtcCgpe3JldHVybiB0aGlzLnR9Z2V0IHByZXNzdXJlKCl7cmV0dXJuIHRoaXMuen1nZXQgYW5nbGVOdW0oKXtyZXR1cm4gdGhpcy5hfWdldCBYWSgpe3JldHVyblt0aGlzLngsdGhpcy55XX1zZXRBKHIpe3RoaXMuYT1yfXNldFQocil7dGhpcy50PXJ9c2V0dihyKXtyZXR1cm4gdGhpcy52PXt4OnIueCx5OnIueX0sdGhpc31zZXQocj10aGlzLngsdD10aGlzLnksZT10aGlzLnosbj10aGlzLnYsYT10aGlzLnQscz10aGlzLmEpe3JldHVybiB0aGlzLng9cix0aGlzLnk9dCx0aGlzLno9ZSx0aGlzLnY9bix0aGlzLnQ9YSx0aGlzLmE9cyx0aGlzfWNsb25lKCl7Y29uc3R7eDpyLHk6dCx6OmUsdjpuLHQ6YSxhOnN9PXRoaXMsaT17eDpuLngseTpuLnl9O3JldHVybiBuZXcgTXQocix0LGUsaSxhLHMpfWRpc3RhbmNlKHIpe3JldHVybiBNdC5HZXREaXN0YW5jZSh0aGlzLHIpfWlzTmVhcihyLHQpe3JldHVybiBNdC5Jc05lYXIodGhpcyxyLHQpfWdldEFuZ2xlQnlQb2ludHMocix0KXtyZXR1cm4gTXQuR2V0QW5nbGVCeVBvaW50cyhyLHRoaXMsdCl9c3RhdGljIFN1YihyLHQpe3JldHVybiBuZXcgTXQoci54LXQueCxyLnktdC55KX1zdGF0aWMgQWRkKHIsdCl7cmV0dXJuIG5ldyBNdChyLngrdC54LHIueSt0LnkpfXN0YXRpYyBHZXREaXN0YW5jZShyLHQpe3JldHVybiBNdC5MZW4oci5jbG9uZSgpLnN1Yih0KSl9c3RhdGljIEdldEFuZ2xlQnlQb2ludHMocix0LGUpe2NvbnN0IG49dC54LXIueCxhPWUueC10Lngscz10Lnktci55LGk9ZS55LXQueTtsZXQgbz0wO2NvbnN0IGM9TWF0aC5zcXJ0KG4qbitzKnMpLG09TWF0aC5zcXJ0KGEqYStpKmkpO2lmKGMmJm0pe2NvbnN0IHU9biphK3MqaTtvPU1hdGguYWNvcyh1LyhjKm0pKSxvPW8vTWF0aC5QSSoxODA7bGV0IHA9bippLXMqYTtwPXA+MD8xOi0xLG89MTgwK3Aqb31yZXR1cm4gb31zdGF0aWMgSXNOZWFyKHIsdCxlKXtyZXR1cm4gTXQuTGVuKHIuY2xvbmUoKS5zdWIodCkpPGV9c3RhdGljIFJvdFdpdGgocix0LGUsbj0yKXtjb25zdCBhPXIueC10Lngscz1yLnktdC55LGk9TWF0aC5zaW4oZSksbz1NYXRoLmNvcyhlKSxjPU1hdGgucG93KDEwLG4pLG09TWF0aC5mbG9vcigodC54KyhhKm8tcyppKSkqYykvYyx1PU1hdGguZmxvb3IoKHQueSsoYSppK3MqbykpKmMpL2M7cmV0dXJuIG5ldyBNdChtLHUpfXN0YXRpYyBHZXREb3RTdHJva2Uocix0LGU9MTYpe2NvbnN0IG49bmV3IGV0KDEsMSksYT1NYXRoLlBJKy4wMDEscz1NdC5BZGQocixNdC5TdWIocixuKS51bmkoKS5wZXIoKS5tdWwoLXQpKSxpPVtdO2ZvcihsZXQgbz0xL2UsYz1vO2M8PTE7Yys9bylpLnB1c2goTXQuUm90V2l0aChzLHIsYSoyKmMpKTtyZXR1cm4gaX1zdGF0aWMgR2V0U2VtaWNpcmNsZVN0cm9rZShyLHQsZT0tMSxuPTgpe2NvbnN0IGE9ZSooTWF0aC5QSSsuMDAxKSxzPVtdO2ZvcihsZXQgaT0xL24sbz1pO288PTE7bys9aSlzLnB1c2goTXQuUm90V2l0aCh0LHIsYSpvKSk7cmV0dXJuIHN9fWZ1bmN0aW9uIE90KGQscil7aWYoZCYmcil7Y29uc3QgdD1NYXRoLm1pbihkLngsci54KSxlPU1hdGgubWluKGQueSxyLnkpLG49TWF0aC5tYXgoZC54K2QudyxyLngrci53KSxhPU1hdGgubWF4KGQueStkLmgsci55K3IuaCkscz1uLXQsaT1hLWU7cmV0dXJue3g6dCx5OmUsdzpzLGg6aX19cmV0dXJuIHJ8fGR9ZnVuY3Rpb24gQnQoZCxyPTApe2NvbnN0IHQ9e3g6MCx5OjAsdzowLGg6MH07bGV0IGU9MS8wLG49MS8wLGE9LTEvMCxzPS0xLzA7cmV0dXJuIGQuZm9yRWFjaChpPT57Y29uc3RbbyxjXT1pLlhZO2U9TWF0aC5taW4oZSxvLXIpLG49TWF0aC5taW4obixjLXIpLGE9TWF0aC5tYXgoYSxvK3IpLHM9TWF0aC5tYXgocyxjK3IpfSksdC54PWUsdC55PW4sdC53PWEtZSx0Lmg9cy1uLHR9ZnVuY3Rpb24geGUoZCxyKXtyZXR1cm4hKGQueCtkLnc8ci54fHxkLng+ci54K3Iud3x8ZC55K2QuaDxyLnl8fGQueT5yLnkrci5oKX1mdW5jdGlvbiBJaChkLHIpe3JldHVybiBkLmxlbmd0aD09PXIubGVuZ3RoJiZkLnNvcnQoKS50b1N0cmluZygpPT09ci5zb3J0KCkudG9TdHJpbmcoKX1mdW5jdGlvbiBZdChkLHI9MTApe3JldHVybnt4Ok1hdGguZmxvb3IoZC54LXIpLHk6TWF0aC5mbG9vcihkLnktciksdzpNYXRoLmZsb29yKGQudytyKjIpLGg6TWF0aC5mbG9vcihkLmgrcioyKX19ZnVuY3Rpb24gQ2UoZCxyKXtyZXR1cm57eDpkLngrclswXSx5OmQueStyWzFdLHc6ZC53LGg6ZC5ofX1mdW5jdGlvbiB2bihkLHIpe2NvbnN0IHQ9bmV3IGV0KGQueCxkLnkpLGU9bmV3IGV0KGQueCtkLncsZC55KSxuPW5ldyBldChkLngrZC53LGQueStkLmgpLGE9bmV3IGV0KGQueCxkLnkrZC5oKSxzPW5ldyBldChkLngrZC53LzIsZC55K2QuaC8yKSxpPU1hdGguUEkqci8xODAsbz1ldC5Sb3RXaXRoKHQscyxpKSxjPWV0LlJvdFdpdGgoZSxzLGkpLG09ZXQuUm90V2l0aChuLHMsaSksdT1ldC5Sb3RXaXRoKGEscyxpKTtyZXR1cm4gQnQoW28sYyxtLHVdKX1mdW5jdGlvbiB5bihkLHIpe2NvbnN0IHQ9bmV3IGV0KGQueCxkLnkpLGU9bmV3IGV0KGQueCtkLncsZC55KSxuPW5ldyBldChkLngrZC53LGQueStkLmgpLGE9bmV3IGV0KGQueCxkLnkrZC5oKSxzPW5ldyBldChkLngrZC53LzIsZC55K2QuaC8yKSxpPW5ldyBldChyWzBdLHJbMV0pLG89ZXQuU2NhbGVXT3JpZ2luKHQsaSxzKSxjPWV0LlNjYWxlV09yaWdpbihlLGkscyksbT1ldC5TY2FsZVdPcmlnaW4obixpLHMpLHU9ZXQuU2NhbGVXT3JpZ2luKGEsaSxzKTtyZXR1cm4gQnQoW28sYyxtLHVdKX1mdW5jdGlvbiBMaChkLHIsdCl7Y29uc3QgZT1uZXcgZXQoclswXSxyWzFdKTtmb3IobGV0IG49MDtuPGQubGVuZ3RoO24rPTMpe2NvbnN0IGE9bmV3IGV0KGRbbl0sZFtuKzFdKSxzPU1hdGguUEkqdC8xODAsaT1ldC5Sb3RXaXRoKGEsZSxzKTtkW25dPWkueCxkW24rMV09aS55fX1mdW5jdGlvbiBiaChkLHIsdCl7Y29uc3QgZT1uZXcgZXQoclswXSxyWzFdKTtmb3IobGV0IG49MDtuPGQubGVuZ3RoO24rPTMpe2NvbnN0IGE9bmV3IGV0KGRbbl0sZFtuKzFdKSxzPW5ldyBldCh0WzBdLHRbMV0pO2lmKG48ZC5sZW5ndGgtMyl7Y29uc3Qgbz1uZXcgZXQoZFtuKzNdLGRbbis0XSksYz1ldC5UYW4obyxhKS5wZXIoKS5tdWwoZFtuKzJdKS5tdWxWKHMpLmxlbigpO2RbbisyXT1jfWVsc2UgaWYobj09PWQubGVuZ3RoLTMpe2NvbnN0IG89bmV3IGV0KGRbbi0zXSxkW24tMl0pLGM9ZXQuVGFuKGEsbykucGVyKCkubXVsKGRbbisyXSkubXVsVihzKS5sZW4oKTtkW24rMl09Y31jb25zdCBpPWV0LlNjYWxlV09yaWdpbihhLHMsZSk7ZFtuXT1pLngsZFtuKzFdPWkueX19ZnVuY3Rpb24gRGgoZCxyKXtyZXR1cm4gZFswXT49ci54JiZkWzBdPD1yLngrci53JiZkWzFdPj1yLnkmJmRbMV08PXIueStyLmh9ZnVuY3Rpb24gU24oZCxyKXtjb25zdCB0PWQ8PXI/MTpkL3IsZT1yPD1kPzE6ci9kO3JldHVyblt0LGVdfWNvbnN0IEhlPWQ9PntpZihkLnRhZ05hbWU9PT0iR1JPVVAiKXtjb25zdCByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZCkuZmluZCh0PT50LnRvU3RyaW5nKCk9PT0iU3ltYm9sKHNlYWxlZCkiKTtpZihyJiZkW3JdKXJldHVybiEwfXJldHVybiExfSx3aD1kPT5kIT09Z3QuVGV4dDtmdW5jdGlvbiBUZShkKXtyZXR1cm5gJHtLZShkLngpfSwke0tlKGQueSl9IGB9ZnVuY3Rpb24gTWUoZCxyKXtyZXR1cm5gJHtLZSgoZC54K3IueCkvMil9LCR7S2UoKGQueStyLnkpLzIpfSBgfWZ1bmN0aW9uIEtlKGQpe3JldHVybitkLnRvRml4ZWQoNCl9dmFyIE5oPWNlLEJoPWllLFdoPSJbb2JqZWN0IE51bWJlcl0iO2Z1bmN0aW9uIEZoKGQpe3JldHVybiB0eXBlb2YgZD09Im51bWJlciJ8fEJoKGQpJiZOaChkKT09V2h9dmFyIGpoPUZoLG9lPVh0KGpoKTtjb25zdCBxdD1jbGFzcyBxdHtjb25zdHJ1Y3RvcihyKXtzdCh0aGlzLCJzeW5jVW5pdFRpbWUiLDFlMyk7c3QodGhpcywidk5vZGVzIik7c3QodGhpcywiZHJhd0xheWVyIik7c3QodGhpcywiZnVsbExheWVyIik7c3QodGhpcywid29ya0lkIik7Y29uc3R7dk5vZGVzOnQsZnVsbExheWVyOmUsZHJhd0xheWVyOm59PXI7dGhpcy52Tm9kZXM9dCx0aGlzLmZ1bGxMYXllcj1lLHRoaXMuZHJhd0xheWVyPW59c2V0V29ya0lkKHIpe3RoaXMud29ya0lkPXJ9Z2V0V29ya0lkKCl7cmV0dXJuIHRoaXMud29ya0lkfWdldFdvcmtPcHRpb25zKCl7cmV0dXJuIHRoaXMud29ya09wdGlvbnN9c2V0V29ya09wdGlvbnMocil7dmFyIG47dGhpcy53b3JrT3B0aW9ucz1yLHRoaXMuc3luY1VuaXRUaW1lPXIuc3luY1VuaXRUaW1lfHx0aGlzLnN5bmNVbml0VGltZTtjb25zdCB0PShuPXRoaXMud29ya0lkKT09bnVsbD92b2lkIDA6bi50b1N0cmluZygpLGU9dCYmdGhpcy52Tm9kZXMuZ2V0KHQpfHx2b2lkIDA7dCYmZSYmKGUub3B0PXIsdGhpcy52Tm9kZXMuc2V0SW5mbyh0LGUpKX11cGRhdGFPcHRTZXJ2aWNlKHIpe3ZhciBuO2xldCB0O2NvbnN0IGU9KG49dGhpcy53b3JrSWQpPT1udWxsP3ZvaWQgMDpuLnRvU3RyaW5nKCk7aWYoZSYmcil7Y29uc3QgYT10aGlzLmZ1bGxMYXllci5nZXRFbGVtZW50c0J5TmFtZShlKXx8dGhpcy5kcmF3TGF5ZXImJnRoaXMuZHJhd0xheWVyLmdldEVsZW1lbnRzQnlOYW1lKGUpfHxbXTtpZihhLmxlbmd0aCE9PTEpcmV0dXJuO2NvbnN0IHM9YVswXSx7cG9zOmksekluZGV4Om8sc2NhbGU6YyxhbmdsZTptLHRyYW5zbGF0ZTp1fT1yLHA9e307b2UobykmJihwLnpJbmRleD1vKSxpJiYocC5wb3M9W2lbMF0saVsxXV0pLGMmJihwLnNjYWxlPWMpLG0mJihwLnJvdGF0ZT1tKSx1JiYocC50cmFuc2xhdGU9dSkscy5hdHRyKHApO2NvbnN0IHk9cz09bnVsbD92b2lkIDA6cy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm4geSYmKHQ9T3QodCx7eDpNYXRoLmZsb29yKHkueC1xdC5TYWZlQm9yZGVyUGFkZGluZykseTpNYXRoLmZsb29yKHkueS1xdC5TYWZlQm9yZGVyUGFkZGluZyksdzpNYXRoLmZsb29yKHkud2lkdGgrcXQuU2FmZUJvcmRlclBhZGRpbmcqMiksaDpNYXRoLmZsb29yKHkuaGVpZ2h0K3F0LlNhZmVCb3JkZXJQYWRkaW5nKjIpfSkpLHRoaXMudk5vZGVzLnNldEluZm8oZSx7cmVjdDp0LGNlbnRlclBvczppfSksdH19c3RhdGljIHVwZGF0ZU5vZGVPcHQocil7Y29uc3R7bm9kZTp0LG9wdDplLHZOb2RlczpuLHdpbGxTZXJpYWxpemVEYXRhOmEsdGFyZ2V0Tm9kZTpzfT1yLHt6SW5kZXg6aSx0cmFuc2xhdGU6byxhbmdsZTpjLGJveDptLGJveFNjYWxlOnUsYm94VHJhbnNsYXRlOnAscG9pbnRNYXA6eX09ZTtsZXQgTztjb25zdCB4PXMmJlp0KHMpfHxuLmdldCh0Lm5hbWUpO2lmKCF4KXJldHVybjtvZShpKSYmKHQuc2V0QXR0cmlidXRlKCJ6SW5kZXgiLGkpLHgub3B0LnpJbmRleD1pKTtjb25zdCB2PXQucGFyZW50O2lmKHYpe2lmKG0mJnAmJnUpe2NvbnN0e3JlY3Q6VH09eCxsPVtdO2ZvcihsZXQgTD0wO0w8eC5vcC5sZW5ndGg7TCs9MylsLnB1c2gobmV3IE10KHgub3BbTF0seC5vcFtMKzFdLHgub3BbTCsyXSkpO2NvbnN0IGg9QnQobCksZj1baC53KnYud29ybGRTY2FsaW5nWzBdLGguaCp2LndvcmxkU2NhbGluZ1swXV0sZz1bVC53LWZbMF0sVC5oLWZbMV1dLE09WyhULncqdVswXS1nWzBdKS9mWzBdLChULmgqdVsxXS1nWzFdKS9mWzFdXSxBPVtwWzBdL3Yud29ybGRTY2FsaW5nWzBdLHBbMV0vdi53b3JsZFNjYWxpbmdbMV1dLEM9eC5vcC5tYXAoKEwsRCk9Pntjb25zdCBJPUQlMztyZXR1cm4gST09PTA/TCtBWzBdOkk9PT0xP0wrQVsxXTpMfSksYj1beC5jZW50ZXJQb3NbMF0rQVswXSx4LmNlbnRlclBvc1sxXStBWzFdXTtiaChDLGIsTSk7Y29uc3QgRT1bXTtmb3IobGV0IEw9MDtMPEMubGVuZ3RoO0wrPTMpRS5wdXNoKG5ldyBNdChDW0xdLENbTCsxXSxDW0wrMl0pKTt4Lm9wPUMseC5jZW50ZXJQb3M9Yn1lbHNlIGlmKG8pe2NvbnN0IFQ9W29bMF0vdi53b3JsZFNjYWxpbmdbMF0sb1sxXS92LndvcmxkU2NhbGluZ1sxXV07dC5zZXRBdHRyaWJ1dGUoInRyYW5zbGF0ZSIsVCkseC5vcHQudHJhbnNsYXRlPVQscyYmKE89Q2UoeC5yZWN0LG8pLHgucmVjdD1PKX1lbHNlIG9lKGMpJiYodC5zZXRBdHRyaWJ1dGUoInJvdGF0ZSIsYykseC5vcHQucm90YXRlPWMscyYmKE89dm4oeC5yZWN0LGMpLHgucmVjdD1PKSk7aWYoeSl7Y29uc3QgVD15LmdldCh0Lm5hbWUpO2lmKFQpZm9yKGxldCBsPTAsaD0wO2w8eC5vcC5sZW5ndGg7bCs9MyxoKyspeC5vcFtsXT1UW2hdWzBdLHgub3BbbCsxXT1UW2hdWzFdfWlmKGEpe2lmKG8pe2NvbnN0IFQ9W29bMF0vdi53b3JsZFNjYWxpbmdbMF0sb1sxXS92LndvcmxkU2NhbGluZ1sxXV0sbD14Lm9wLm1hcCgoaCxmKT0+e2NvbnN0IGc9ZiUzO3JldHVybiBnPT09MD9oK1RbMF06Zz09PTE/aCtUWzFdOmh9KTt4Lm9wPWwseC5jZW50ZXJQb3M9W3guY2VudGVyUG9zWzBdK1RbMF0seC5jZW50ZXJQb3NbMV0rVFsxXV0seCE9bnVsbCYmeC5vcHQmJih4Lm9wdC50cmFuc2xhdGU9dm9pZCAwKX1lbHNlIGlmKG9lKGMpKXtjb25zdCBUPXgub3A7TGgoVCx4LmNlbnRlclBvcyxjKSx4Lm9wPVQseCE9bnVsbCYmeC5vcHQmJih4Lm9wdC5yb3RhdGU9dm9pZCAwKX19eCYmbi5zZXRJbmZvKHQubmFtZSx4KX19c3RhdGljIGdldENlbnRlclBvcyhyLHQpe2NvbnN0e3dvcmxkUG9zaXRpb246ZSx3b3JsZFNjYWxpbmc6bn09dDtyZXR1cm5bKHIueCtyLncvMi1lWzBdKS9uWzBdLChyLnkrci5oLzItZVsxXSkvblsxXV19c3RhdGljIGdldFJlY3RGcm9tTGF5ZXIocix0KXtjb25zdCBlPXIuZ2V0RWxlbWVudHNCeU5hbWUodClbMF07aWYoZSl7Y29uc3Qgbj1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybnt4Ok1hdGguZmxvb3Iobi54LXF0LlNhZmVCb3JkZXJQYWRkaW5nKSx5Ok1hdGguZmxvb3Iobi55LXF0LlNhZmVCb3JkZXJQYWRkaW5nKSx3Ok1hdGguZmxvb3Iobi53aWR0aCtxdC5TYWZlQm9yZGVyUGFkZGluZyoyKSxoOk1hdGguZmxvb3Iobi5oZWlnaHQrcXQuU2FmZUJvcmRlclBhZGRpbmcqMil9fX19O3N0KHF0LCJTYWZlQm9yZGVyUGFkZGluZyIsMTApO2xldCB5dD1xdDt2YXIgRHQ9ZnVuY3Rpb24oZCl7dmFyIHI9e307ZnVuY3Rpb24gdChlKXtpZihyW2VdKXJldHVybiByW2VdLmV4cG9ydHM7dmFyIG49cltlXT17aTplLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIGRbZV0uY2FsbChuLmV4cG9ydHMsbixuLmV4cG9ydHMsdCksbi5sPSEwLG4uZXhwb3J0c31yZXR1cm4gdC5tPWQsdC5jPXIsdC5kPWZ1bmN0aW9uKGUsbixhKXt0Lm8oZSxuKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbix7ZW51bWVyYWJsZTohMCxnZXQ6YX0pfSx0LnI9ZnVuY3Rpb24oZSl7dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0sdC50PWZ1bmN0aW9uKGUsbil7aWYobiYxJiYoZT10KGUpKSxuJjh8fG4mNCYmdHlwZW9mIGU9PSJvYmplY3QiJiZlJiZlLl9fZXNNb2R1bGUpcmV0dXJuIGU7dmFyIGE9T2JqZWN0LmNyZWF0ZShudWxsKTtpZih0LnIoYSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsImRlZmF1bHQiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOmV9KSxuJjImJnR5cGVvZiBlIT0ic3RyaW5nIilmb3IodmFyIHMgaW4gZSl0LmQoYSxzLChmdW5jdGlvbihpKXtyZXR1cm4gZVtpXX0pLmJpbmQobnVsbCxzKSk7cmV0dXJuIGF9LHQubj1mdW5jdGlvbihlKXt2YXIgbj1lJiZlLl9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gZS5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiBlfTtyZXR1cm4gdC5kKG4sImEiLG4pLG59LHQubz1mdW5jdGlvbihlLG4pe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxuKX0sdC5wPSIvanMvIix0KHQucz0wKX0oW2Z1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsInZlcnNpb24iLGZ1bmN0aW9uKCl7cmV0dXJuIEt9KSx0LmQociwiaGVscGVycyIsZnVuY3Rpb24oKXtyZXR1cm4gQn0pLHQuZChyLCJjcmVhdGVFbGVtZW50IixmdW5jdGlvbigpe3JldHVybiBEfSksdC5kKHIsImlzU3ByaXRlTm9kZSIsZnVuY3Rpb24oKXtyZXR1cm4gSX0pLHQuZChyLCJyZWdpc3Rlck5vZGUiLGZ1bmN0aW9uKCl7cmV0dXJuIFJ9KTt2YXIgZT10KDEyKTt0LmQociwiRU5WIixmdW5jdGlvbigpe3JldHVybiBlLkVOVn0pO3ZhciBuPXQoNjgpO3QuZChyLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLGZ1bmN0aW9uKCl7cmV0dXJuIG4ucmVxdWVzdEFuaW1hdGlvbkZyYW1lfSksdC5kKHIsImNhbmNlbEFuaW1hdGlvbkZyYW1lIixmdW5jdGlvbigpe3JldHVybiBuLmNhbmNlbEFuaW1hdGlvbkZyYW1lfSk7dmFyIGE9dCg3MCk7dC5kKHIsIk5vZGUiLGZ1bmN0aW9uKCl7cmV0dXJuIGEuZGVmYXVsdH0pO3ZhciBzPXQoMjE3KTt0LmQociwiQ2xvdWQiLGZ1bmN0aW9uKCl7cmV0dXJuIHMuZGVmYXVsdH0pO3ZhciBpPXQoMjE5KTt0LmQociwiQmxvY2siLGZ1bmN0aW9uKCl7cmV0dXJuIGkuZGVmYXVsdH0pO3ZhciBvPXQoMjI0KTt0LmQociwiU3ByaXRlIixmdW5jdGlvbigpe3JldHVybiBvLmRlZmF1bHR9KTt2YXIgYz10KDIyNik7dC5kKHIsIlBhdGgiLGZ1bmN0aW9uKCl7cmV0dXJuIGMuZGVmYXVsdH0pO3ZhciBtPXQoMjI5KTt0LmQociwiUmVjdCIsZnVuY3Rpb24oKXtyZXR1cm4gbS5kZWZhdWx0fSk7dmFyIHU9dCgyMzEpO3QuZChyLCJUcmlhbmdsZSIsZnVuY3Rpb24oKXtyZXR1cm4gdS5kZWZhdWx0fSk7dmFyIHA9dCgyMzYpO3QuZChyLCJQYXJhbGxlbCIsZnVuY3Rpb24oKXtyZXR1cm4gcC5kZWZhdWx0fSk7dmFyIHk9dCgyMzgpO3QuZChyLCJSZWd1bGFyIixmdW5jdGlvbigpe3JldHVybiB5LmRlZmF1bHR9KTt2YXIgTz10KDI0MCk7dC5kKHIsIlN0YXIiLGZ1bmN0aW9uKCl7cmV0dXJuIE8uZGVmYXVsdH0pO3ZhciB4PXQoMjQyKTt0LmQociwiRWxsaXBzZSIsZnVuY3Rpb24oKXtyZXR1cm4geC5kZWZhdWx0fSk7dmFyIHY9dCgyNDQpO3QuZChyLCJBcmMiLGZ1bmN0aW9uKCl7cmV0dXJuIHYuZGVmYXVsdH0pO3ZhciBUPXQoMjQ2KTt0LmQociwiUmluZyIsZnVuY3Rpb24oKXtyZXR1cm4gVC5kZWZhdWx0fSk7dmFyIGw9dCgyMzIpO3QuZChyLCJQb2x5bGluZSIsZnVuY3Rpb24oKXtyZXR1cm4gbC5kZWZhdWx0fSk7dmFyIGg9dCgyNDgpO3QuZChyLCJMYWJlbCIsZnVuY3Rpb24oKXtyZXR1cm4gaC5kZWZhdWx0fSk7dmFyIGY9dCgyNTApO3QuZChyLCJHcm91cCIsZnVuY3Rpb24oKXtyZXR1cm4gZi5kZWZhdWx0fSk7dmFyIGc9dCgyODYpO3QuZChyLCJMYXllciIsZnVuY3Rpb24oKXtyZXR1cm4gZy5kZWZhdWx0fSk7dmFyIE09dCgyODcpO3QuZChyLCJTcHJpdGVTdmciLGZ1bmN0aW9uKCl7cmV0dXJuIE0uZGVmYXVsdH0pO3ZhciBBPXQoMjg5KTt0LmQociwiTGF5ZXJXb3JrZXIiLGZ1bmN0aW9uKCl7cmV0dXJuIEEuZGVmYXVsdH0pO3ZhciBDPXQoMjkwKTt0LmQociwiU2NlbmUiLGZ1bmN0aW9uKCl7cmV0dXJuIEMuZGVmYXVsdH0pO3ZhciBiPXQoMjEzKSxFPXQoMjIxKTt0LmQociwiQ29sb3IiLGZ1bmN0aW9uKCl7cmV0dXJuIEUuQ29sb3J9KSx0LmQociwiR3JhZGllbnQiLGZ1bmN0aW9uKCl7cmV0dXJuIEUuR3JhZGllbnR9KTt2YXIgTD10KDcyKTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7Y29uc3QgRD1iLmRlZmF1bHQuY3JlYXRlRWxlbWVudCxJPWIuZGVmYXVsdC5pc1Nwcml0ZU5vZGUsUj1iLmRlZmF1bHQucmVnaXN0ZXJOb2RlLEI9e3BhcnNlQ29sb3I6RS5wYXJzZUNvbG9yLHNpemVUb1BpeGVsOkwuc2l6ZVRvUGl4ZWwsdG9BcnJheTpMLnRvQXJyYXksdG9TdHJpbmc6TC50b1N0cmluZyx0b051bWJlcjpMLnRvTnVtYmVyfTtsZXQgejt6PSIzLjguMyI7Y29uc3QgSz16fSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpO3ZhciBlPXQoMik7dC5kKHIsImdsTWF0cml4IixmdW5jdGlvbigpe3JldHVybiBlfSk7dmFyIG49dCgzKTt0LmQociwibWF0MiIsZnVuY3Rpb24oKXtyZXR1cm4gbn0pO3ZhciBhPXQoNCk7dC5kKHIsIm1hdDJkIixmdW5jdGlvbigpe3JldHVybiBhfSk7dmFyIHM9dCg1KTt0LmQociwibWF0MyIsZnVuY3Rpb24oKXtyZXR1cm4gc30pO3ZhciBpPXQoNik7dC5kKHIsIm1hdDQiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KTt2YXIgbz10KDcpO3QuZChyLCJxdWF0IixmdW5jdGlvbigpe3JldHVybiBvfSk7dmFyIGM9dCgxMCk7dC5kKHIsInF1YXQyIixmdW5jdGlvbigpe3JldHVybiBjfSk7dmFyIG09dCgxMSk7dC5kKHIsInZlYzIiLGZ1bmN0aW9uKCl7cmV0dXJuIG19KTt2YXIgdT10KDgpO3QuZChyLCJ2ZWMzIixmdW5jdGlvbigpe3JldHVybiB1fSk7dmFyIHA9dCg5KTt0LmQociwidmVjNCIsZnVuY3Rpb24oKXtyZXR1cm4gcH0pfSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJFUFNJTE9OIixmdW5jdGlvbigpe3JldHVybiBlfSksdC5kKHIsIkFSUkFZX1RZUEUiLGZ1bmN0aW9uKCl7cmV0dXJuIG59KSx0LmQociwiUkFORE9NIixmdW5jdGlvbigpe3JldHVybiBhfSksdC5kKHIsInNldE1hdHJpeEFycmF5VHlwZSIsZnVuY3Rpb24oKXtyZXR1cm4gc30pLHQuZChyLCJ0b1JhZGlhbiIsZnVuY3Rpb24oKXtyZXR1cm4gb30pLHQuZChyLCJlcXVhbHMiLGZ1bmN0aW9uKCl7cmV0dXJuIGN9KTt2YXIgZT0xZS02LG49dHlwZW9mIEZsb2F0MzJBcnJheTwidSI/RmxvYXQzMkFycmF5OkFycmF5LGE9TWF0aC5yYW5kb207ZnVuY3Rpb24gcyhtKXtuPW19dmFyIGk9TWF0aC5QSS8xODA7ZnVuY3Rpb24gbyhtKXtyZXR1cm4gbSppfWZ1bmN0aW9uIGMobSx1KXtyZXR1cm4gTWF0aC5hYnMobS11KTw9ZSpNYXRoLm1heCgxLE1hdGguYWJzKG0pLE1hdGguYWJzKHUpKX1NYXRoLmh5cG90fHwoTWF0aC5oeXBvdD1mdW5jdGlvbigpe2Zvcih2YXIgbT0wLHU9YXJndW1lbnRzLmxlbmd0aDt1LS07KW0rPWFyZ3VtZW50c1t1XSphcmd1bWVudHNbdV07cmV0dXJuIE1hdGguc3FydChtKX0pfSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJjcmVhdGUiLGZ1bmN0aW9uKCl7cmV0dXJuIG59KSx0LmQociwiY2xvbmUiLGZ1bmN0aW9uKCl7cmV0dXJuIGF9KSx0LmQociwiY29weSIsZnVuY3Rpb24oKXtyZXR1cm4gc30pLHQuZChyLCJpZGVudGl0eSIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pLHQuZChyLCJmcm9tVmFsdWVzIixmdW5jdGlvbigpe3JldHVybiBvfSksdC5kKHIsInNldCIsZnVuY3Rpb24oKXtyZXR1cm4gY30pLHQuZChyLCJ0cmFuc3Bvc2UiLGZ1bmN0aW9uKCl7cmV0dXJuIG19KSx0LmQociwiaW52ZXJ0IixmdW5jdGlvbigpe3JldHVybiB1fSksdC5kKHIsImFkam9pbnQiLGZ1bmN0aW9uKCl7cmV0dXJuIHB9KSx0LmQociwiZGV0ZXJtaW5hbnQiLGZ1bmN0aW9uKCl7cmV0dXJuIHl9KSx0LmQociwibXVsdGlwbHkiLGZ1bmN0aW9uKCl7cmV0dXJuIE99KSx0LmQociwicm90YXRlIixmdW5jdGlvbigpe3JldHVybiB4fSksdC5kKHIsInNjYWxlIixmdW5jdGlvbigpe3JldHVybiB2fSksdC5kKHIsImZyb21Sb3RhdGlvbiIsZnVuY3Rpb24oKXtyZXR1cm4gVH0pLHQuZChyLCJmcm9tU2NhbGluZyIsZnVuY3Rpb24oKXtyZXR1cm4gbH0pLHQuZChyLCJzdHIiLGZ1bmN0aW9uKCl7cmV0dXJuIGh9KSx0LmQociwiZnJvYiIsZnVuY3Rpb24oKXtyZXR1cm4gZn0pLHQuZChyLCJMRFUiLGZ1bmN0aW9uKCl7cmV0dXJuIGd9KSx0LmQociwiYWRkIixmdW5jdGlvbigpe3JldHVybiBNfSksdC5kKHIsInN1YnRyYWN0IixmdW5jdGlvbigpe3JldHVybiBBfSksdC5kKHIsImV4YWN0RXF1YWxzIixmdW5jdGlvbigpe3JldHVybiBDfSksdC5kKHIsImVxdWFscyIsZnVuY3Rpb24oKXtyZXR1cm4gYn0pLHQuZChyLCJtdWx0aXBseVNjYWxhciIsZnVuY3Rpb24oKXtyZXR1cm4gRX0pLHQuZChyLCJtdWx0aXBseVNjYWxhckFuZEFkZCIsZnVuY3Rpb24oKXtyZXR1cm4gTH0pLHQuZChyLCJtdWwiLGZ1bmN0aW9uKCl7cmV0dXJuIER9KSx0LmQociwic3ViIixmdW5jdGlvbigpe3JldHVybiBJfSk7dmFyIGU9dCgyKTtmdW5jdGlvbiBuKCl7dmFyIFI9bmV3IGUuQVJSQVlfVFlQRSg0KTtyZXR1cm4gZS5BUlJBWV9UWVBFIT1GbG9hdDMyQXJyYXkmJihSWzFdPTAsUlsyXT0wKSxSWzBdPTEsUlszXT0xLFJ9ZnVuY3Rpb24gYShSKXt2YXIgQj1uZXcgZS5BUlJBWV9UWVBFKDQpO3JldHVybiBCWzBdPVJbMF0sQlsxXT1SWzFdLEJbMl09UlsyXSxCWzNdPVJbM10sQn1mdW5jdGlvbiBzKFIsQil7cmV0dXJuIFJbMF09QlswXSxSWzFdPUJbMV0sUlsyXT1CWzJdLFJbM109QlszXSxSfWZ1bmN0aW9uIGkoUil7cmV0dXJuIFJbMF09MSxSWzFdPTAsUlsyXT0wLFJbM109MSxSfWZ1bmN0aW9uIG8oUixCLHosSyl7dmFyIFE9bmV3IGUuQVJSQVlfVFlQRSg0KTtyZXR1cm4gUVswXT1SLFFbMV09QixRWzJdPXosUVszXT1LLFF9ZnVuY3Rpb24gYyhSLEIseixLLFEpe3JldHVybiBSWzBdPUIsUlsxXT16LFJbMl09SyxSWzNdPVEsUn1mdW5jdGlvbiBtKFIsQil7aWYoUj09PUIpe3ZhciB6PUJbMV07UlsxXT1CWzJdLFJbMl09en1lbHNlIFJbMF09QlswXSxSWzFdPUJbMl0sUlsyXT1CWzFdLFJbM109QlszXTtyZXR1cm4gUn1mdW5jdGlvbiB1KFIsQil7dmFyIHo9QlswXSxLPUJbMV0sUT1CWzJdLF89QlszXSxqPXoqXy1RKks7cmV0dXJuIGo/KGo9MS9qLFJbMF09XypqLFJbMV09LUsqaixSWzJdPS1RKmosUlszXT16KmosUik6bnVsbH1mdW5jdGlvbiBwKFIsQil7dmFyIHo9QlswXTtyZXR1cm4gUlswXT1CWzNdLFJbMV09LUJbMV0sUlsyXT0tQlsyXSxSWzNdPXosUn1mdW5jdGlvbiB5KFIpe3JldHVybiBSWzBdKlJbM10tUlsyXSpSWzFdfWZ1bmN0aW9uIE8oUixCLHope3ZhciBLPUJbMF0sUT1CWzFdLF89QlsyXSxqPUJbM10sRz16WzBdLFg9elsxXSxaPXpbMl0sdHQ9elszXTtyZXR1cm4gUlswXT1LKkcrXypYLFJbMV09USpHK2oqWCxSWzJdPUsqWitfKnR0LFJbM109USpaK2oqdHQsUn1mdW5jdGlvbiB4KFIsQix6KXt2YXIgSz1CWzBdLFE9QlsxXSxfPUJbMl0saj1CWzNdLEc9TWF0aC5zaW4oeiksWD1NYXRoLmNvcyh6KTtyZXR1cm4gUlswXT1LKlgrXypHLFJbMV09USpYK2oqRyxSWzJdPUsqLUcrXypYLFJbM109USotRytqKlgsUn1mdW5jdGlvbiB2KFIsQix6KXt2YXIgSz1CWzBdLFE9QlsxXSxfPUJbMl0saj1CWzNdLEc9elswXSxYPXpbMV07cmV0dXJuIFJbMF09SypHLFJbMV09USpHLFJbMl09XypYLFJbM109aipYLFJ9ZnVuY3Rpb24gVChSLEIpe3ZhciB6PU1hdGguc2luKEIpLEs9TWF0aC5jb3MoQik7cmV0dXJuIFJbMF09SyxSWzFdPXosUlsyXT0teixSWzNdPUssUn1mdW5jdGlvbiBsKFIsQil7cmV0dXJuIFJbMF09QlswXSxSWzFdPTAsUlsyXT0wLFJbM109QlsxXSxSfWZ1bmN0aW9uIGgoUil7cmV0dXJuIm1hdDIoIitSWzBdKyIsICIrUlsxXSsiLCAiK1JbMl0rIiwgIitSWzNdKyIpIn1mdW5jdGlvbiBmKFIpe3JldHVybiBNYXRoLmh5cG90KFJbMF0sUlsxXSxSWzJdLFJbM10pfWZ1bmN0aW9uIGcoUixCLHosSyl7cmV0dXJuIFJbMl09S1syXS9LWzBdLHpbMF09S1swXSx6WzFdPUtbMV0selszXT1LWzNdLVJbMl0qelsxXSxbUixCLHpdfWZ1bmN0aW9uIE0oUixCLHope3JldHVybiBSWzBdPUJbMF0relswXSxSWzFdPUJbMV0relsxXSxSWzJdPUJbMl0relsyXSxSWzNdPUJbM10relszXSxSfWZ1bmN0aW9uIEEoUixCLHope3JldHVybiBSWzBdPUJbMF0telswXSxSWzFdPUJbMV0telsxXSxSWzJdPUJbMl0telsyXSxSWzNdPUJbM10telszXSxSfWZ1bmN0aW9uIEMoUixCKXtyZXR1cm4gUlswXT09PUJbMF0mJlJbMV09PT1CWzFdJiZSWzJdPT09QlsyXSYmUlszXT09PUJbM119ZnVuY3Rpb24gYihSLEIpe3ZhciB6PVJbMF0sSz1SWzFdLFE9UlsyXSxfPVJbM10saj1CWzBdLEc9QlsxXSxYPUJbMl0sWj1CWzNdO3JldHVybiBNYXRoLmFicyh6LWopPD1lLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyh6KSxNYXRoLmFicyhqKSkmJk1hdGguYWJzKEstRyk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKEspLE1hdGguYWJzKEcpKSYmTWF0aC5hYnMoUS1YKTw9ZS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoUSksTWF0aC5hYnMoWCkpJiZNYXRoLmFicyhfLVopPD1lLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhfKSxNYXRoLmFicyhaKSl9ZnVuY3Rpb24gRShSLEIseil7cmV0dXJuIFJbMF09QlswXSp6LFJbMV09QlsxXSp6LFJbMl09QlsyXSp6LFJbM109QlszXSp6LFJ9ZnVuY3Rpb24gTChSLEIseixLKXtyZXR1cm4gUlswXT1CWzBdK3pbMF0qSyxSWzFdPUJbMV0relsxXSpLLFJbMl09QlsyXSt6WzJdKkssUlszXT1CWzNdK3pbM10qSyxSfXZhciBEPU8sST1BfSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJjcmVhdGUiLGZ1bmN0aW9uKCl7cmV0dXJuIG59KSx0LmQociwiY2xvbmUiLGZ1bmN0aW9uKCl7cmV0dXJuIGF9KSx0LmQociwiY29weSIsZnVuY3Rpb24oKXtyZXR1cm4gc30pLHQuZChyLCJpZGVudGl0eSIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pLHQuZChyLCJmcm9tVmFsdWVzIixmdW5jdGlvbigpe3JldHVybiBvfSksdC5kKHIsInNldCIsZnVuY3Rpb24oKXtyZXR1cm4gY30pLHQuZChyLCJpbnZlcnQiLGZ1bmN0aW9uKCl7cmV0dXJuIG19KSx0LmQociwiZGV0ZXJtaW5hbnQiLGZ1bmN0aW9uKCl7cmV0dXJuIHV9KSx0LmQociwibXVsdGlwbHkiLGZ1bmN0aW9uKCl7cmV0dXJuIHB9KSx0LmQociwicm90YXRlIixmdW5jdGlvbigpe3JldHVybiB5fSksdC5kKHIsInNjYWxlIixmdW5jdGlvbigpe3JldHVybiBPfSksdC5kKHIsInRyYW5zbGF0ZSIsZnVuY3Rpb24oKXtyZXR1cm4geH0pLHQuZChyLCJmcm9tUm90YXRpb24iLGZ1bmN0aW9uKCl7cmV0dXJuIHZ9KSx0LmQociwiZnJvbVNjYWxpbmciLGZ1bmN0aW9uKCl7cmV0dXJuIFR9KSx0LmQociwiZnJvbVRyYW5zbGF0aW9uIixmdW5jdGlvbigpe3JldHVybiBsfSksdC5kKHIsInN0ciIsZnVuY3Rpb24oKXtyZXR1cm4gaH0pLHQuZChyLCJmcm9iIixmdW5jdGlvbigpe3JldHVybiBmfSksdC5kKHIsImFkZCIsZnVuY3Rpb24oKXtyZXR1cm4gZ30pLHQuZChyLCJzdWJ0cmFjdCIsZnVuY3Rpb24oKXtyZXR1cm4gTX0pLHQuZChyLCJtdWx0aXBseVNjYWxhciIsZnVuY3Rpb24oKXtyZXR1cm4gQX0pLHQuZChyLCJtdWx0aXBseVNjYWxhckFuZEFkZCIsZnVuY3Rpb24oKXtyZXR1cm4gQ30pLHQuZChyLCJleGFjdEVxdWFscyIsZnVuY3Rpb24oKXtyZXR1cm4gYn0pLHQuZChyLCJlcXVhbHMiLGZ1bmN0aW9uKCl7cmV0dXJuIEV9KSx0LmQociwibXVsIixmdW5jdGlvbigpe3JldHVybiBMfSksdC5kKHIsInN1YiIsZnVuY3Rpb24oKXtyZXR1cm4gRH0pO3ZhciBlPXQoMik7ZnVuY3Rpb24gbigpe3ZhciBJPW5ldyBlLkFSUkFZX1RZUEUoNik7cmV0dXJuIGUuQVJSQVlfVFlQRSE9RmxvYXQzMkFycmF5JiYoSVsxXT0wLElbMl09MCxJWzRdPTAsSVs1XT0wKSxJWzBdPTEsSVszXT0xLEl9ZnVuY3Rpb24gYShJKXt2YXIgUj1uZXcgZS5BUlJBWV9UWVBFKDYpO3JldHVybiBSWzBdPUlbMF0sUlsxXT1JWzFdLFJbMl09SVsyXSxSWzNdPUlbM10sUls0XT1JWzRdLFJbNV09SVs1XSxSfWZ1bmN0aW9uIHMoSSxSKXtyZXR1cm4gSVswXT1SWzBdLElbMV09UlsxXSxJWzJdPVJbMl0sSVszXT1SWzNdLElbNF09Uls0XSxJWzVdPVJbNV0sSX1mdW5jdGlvbiBpKEkpe3JldHVybiBJWzBdPTEsSVsxXT0wLElbMl09MCxJWzNdPTEsSVs0XT0wLElbNV09MCxJfWZ1bmN0aW9uIG8oSSxSLEIseixLLFEpe3ZhciBfPW5ldyBlLkFSUkFZX1RZUEUoNik7cmV0dXJuIF9bMF09SSxfWzFdPVIsX1syXT1CLF9bM109eixfWzRdPUssX1s1XT1RLF99ZnVuY3Rpb24gYyhJLFIsQix6LEssUSxfKXtyZXR1cm4gSVswXT1SLElbMV09QixJWzJdPXosSVszXT1LLElbNF09USxJWzVdPV8sSX1mdW5jdGlvbiBtKEksUil7dmFyIEI9UlswXSx6PVJbMV0sSz1SWzJdLFE9UlszXSxfPVJbNF0saj1SWzVdLEc9QipRLXoqSztyZXR1cm4gRz8oRz0xL0csSVswXT1RKkcsSVsxXT0teipHLElbMl09LUsqRyxJWzNdPUIqRyxJWzRdPShLKmotUSpfKSpHLElbNV09KHoqXy1CKmopKkcsSSk6bnVsbH1mdW5jdGlvbiB1KEkpe3JldHVybiBJWzBdKklbM10tSVsxXSpJWzJdfWZ1bmN0aW9uIHAoSSxSLEIpe3ZhciB6PVJbMF0sSz1SWzFdLFE9UlsyXSxfPVJbM10saj1SWzRdLEc9Uls1XSxYPUJbMF0sWj1CWzFdLHR0PUJbMl0sbnQ9QlszXSxxPUJbNF0sZHQ9Qls1XTtyZXR1cm4gSVswXT16KlgrUSpaLElbMV09SypYK18qWixJWzJdPXoqdHQrUSpudCxJWzNdPUsqdHQrXypudCxJWzRdPXoqcStRKmR0K2osSVs1XT1LKnErXypkdCtHLEl9ZnVuY3Rpb24geShJLFIsQil7dmFyIHo9UlswXSxLPVJbMV0sUT1SWzJdLF89UlszXSxqPVJbNF0sRz1SWzVdLFg9TWF0aC5zaW4oQiksWj1NYXRoLmNvcyhCKTtyZXR1cm4gSVswXT16KlorUSpYLElbMV09SypaK18qWCxJWzJdPXoqLVgrUSpaLElbM109SyotWCtfKlosSVs0XT1qLElbNV09RyxJfWZ1bmN0aW9uIE8oSSxSLEIpe3ZhciB6PVJbMF0sSz1SWzFdLFE9UlsyXSxfPVJbM10saj1SWzRdLEc9Uls1XSxYPUJbMF0sWj1CWzFdO3JldHVybiBJWzBdPXoqWCxJWzFdPUsqWCxJWzJdPVEqWixJWzNdPV8qWixJWzRdPWosSVs1XT1HLEl9ZnVuY3Rpb24geChJLFIsQil7dmFyIHo9UlswXSxLPVJbMV0sUT1SWzJdLF89UlszXSxqPVJbNF0sRz1SWzVdLFg9QlswXSxaPUJbMV07cmV0dXJuIElbMF09eixJWzFdPUssSVsyXT1RLElbM109XyxJWzRdPXoqWCtRKloraixJWzVdPUsqWCtfKlorRyxJfWZ1bmN0aW9uIHYoSSxSKXt2YXIgQj1NYXRoLnNpbihSKSx6PU1hdGguY29zKFIpO3JldHVybiBJWzBdPXosSVsxXT1CLElbMl09LUIsSVszXT16LElbNF09MCxJWzVdPTAsSX1mdW5jdGlvbiBUKEksUil7cmV0dXJuIElbMF09UlswXSxJWzFdPTAsSVsyXT0wLElbM109UlsxXSxJWzRdPTAsSVs1XT0wLEl9ZnVuY3Rpb24gbChJLFIpe3JldHVybiBJWzBdPTEsSVsxXT0wLElbMl09MCxJWzNdPTEsSVs0XT1SWzBdLElbNV09UlsxXSxJfWZ1bmN0aW9uIGgoSSl7cmV0dXJuIm1hdDJkKCIrSVswXSsiLCAiK0lbMV0rIiwgIitJWzJdKyIsICIrSVszXSsiLCAiK0lbNF0rIiwgIitJWzVdKyIpIn1mdW5jdGlvbiBmKEkpe3JldHVybiBNYXRoLmh5cG90KElbMF0sSVsxXSxJWzJdLElbM10sSVs0XSxJWzVdLDEpfWZ1bmN0aW9uIGcoSSxSLEIpe3JldHVybiBJWzBdPVJbMF0rQlswXSxJWzFdPVJbMV0rQlsxXSxJWzJdPVJbMl0rQlsyXSxJWzNdPVJbM10rQlszXSxJWzRdPVJbNF0rQls0XSxJWzVdPVJbNV0rQls1XSxJfWZ1bmN0aW9uIE0oSSxSLEIpe3JldHVybiBJWzBdPVJbMF0tQlswXSxJWzFdPVJbMV0tQlsxXSxJWzJdPVJbMl0tQlsyXSxJWzNdPVJbM10tQlszXSxJWzRdPVJbNF0tQls0XSxJWzVdPVJbNV0tQls1XSxJfWZ1bmN0aW9uIEEoSSxSLEIpe3JldHVybiBJWzBdPVJbMF0qQixJWzFdPVJbMV0qQixJWzJdPVJbMl0qQixJWzNdPVJbM10qQixJWzRdPVJbNF0qQixJWzVdPVJbNV0qQixJfWZ1bmN0aW9uIEMoSSxSLEIseil7cmV0dXJuIElbMF09UlswXStCWzBdKnosSVsxXT1SWzFdK0JbMV0qeixJWzJdPVJbMl0rQlsyXSp6LElbM109UlszXStCWzNdKnosSVs0XT1SWzRdK0JbNF0qeixJWzVdPVJbNV0rQls1XSp6LEl9ZnVuY3Rpb24gYihJLFIpe3JldHVybiBJWzBdPT09UlswXSYmSVsxXT09PVJbMV0mJklbMl09PT1SWzJdJiZJWzNdPT09UlszXSYmSVs0XT09PVJbNF0mJklbNV09PT1SWzVdfWZ1bmN0aW9uIEUoSSxSKXt2YXIgQj1JWzBdLHo9SVsxXSxLPUlbMl0sUT1JWzNdLF89SVs0XSxqPUlbNV0sRz1SWzBdLFg9UlsxXSxaPVJbMl0sdHQ9UlszXSxudD1SWzRdLHE9Uls1XTtyZXR1cm4gTWF0aC5hYnMoQi1HKTw9ZS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoQiksTWF0aC5hYnMoRykpJiZNYXRoLmFicyh6LVgpPD1lLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyh6KSxNYXRoLmFicyhYKSkmJk1hdGguYWJzKEstWik8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKEspLE1hdGguYWJzKFopKSYmTWF0aC5hYnMoUS10dCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKFEpLE1hdGguYWJzKHR0KSkmJk1hdGguYWJzKF8tbnQpPD1lLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhfKSxNYXRoLmFicyhudCkpJiZNYXRoLmFicyhqLXEpPD1lLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhqKSxNYXRoLmFicyhxKSl9dmFyIEw9cCxEPU19LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImNyZWF0ZSIsZnVuY3Rpb24oKXtyZXR1cm4gbn0pLHQuZChyLCJmcm9tTWF0NCIsZnVuY3Rpb24oKXtyZXR1cm4gYX0pLHQuZChyLCJjbG9uZSIsZnVuY3Rpb24oKXtyZXR1cm4gc30pLHQuZChyLCJjb3B5IixmdW5jdGlvbigpe3JldHVybiBpfSksdC5kKHIsImZyb21WYWx1ZXMiLGZ1bmN0aW9uKCl7cmV0dXJuIG99KSx0LmQociwic2V0IixmdW5jdGlvbigpe3JldHVybiBjfSksdC5kKHIsImlkZW50aXR5IixmdW5jdGlvbigpe3JldHVybiBtfSksdC5kKHIsInRyYW5zcG9zZSIsZnVuY3Rpb24oKXtyZXR1cm4gdX0pLHQuZChyLCJpbnZlcnQiLGZ1bmN0aW9uKCl7cmV0dXJuIHB9KSx0LmQociwiYWRqb2ludCIsZnVuY3Rpb24oKXtyZXR1cm4geX0pLHQuZChyLCJkZXRlcm1pbmFudCIsZnVuY3Rpb24oKXtyZXR1cm4gT30pLHQuZChyLCJtdWx0aXBseSIsZnVuY3Rpb24oKXtyZXR1cm4geH0pLHQuZChyLCJ0cmFuc2xhdGUiLGZ1bmN0aW9uKCl7cmV0dXJuIHZ9KSx0LmQociwicm90YXRlIixmdW5jdGlvbigpe3JldHVybiBUfSksdC5kKHIsInNjYWxlIixmdW5jdGlvbigpe3JldHVybiBsfSksdC5kKHIsImZyb21UcmFuc2xhdGlvbiIsZnVuY3Rpb24oKXtyZXR1cm4gaH0pLHQuZChyLCJmcm9tUm90YXRpb24iLGZ1bmN0aW9uKCl7cmV0dXJuIGZ9KSx0LmQociwiZnJvbVNjYWxpbmciLGZ1bmN0aW9uKCl7cmV0dXJuIGd9KSx0LmQociwiZnJvbU1hdDJkIixmdW5jdGlvbigpe3JldHVybiBNfSksdC5kKHIsImZyb21RdWF0IixmdW5jdGlvbigpe3JldHVybiBBfSksdC5kKHIsIm5vcm1hbEZyb21NYXQ0IixmdW5jdGlvbigpe3JldHVybiBDfSksdC5kKHIsInByb2plY3Rpb24iLGZ1bmN0aW9uKCl7cmV0dXJuIGJ9KSx0LmQociwic3RyIixmdW5jdGlvbigpe3JldHVybiBFfSksdC5kKHIsImZyb2IiLGZ1bmN0aW9uKCl7cmV0dXJuIEx9KSx0LmQociwiYWRkIixmdW5jdGlvbigpe3JldHVybiBEfSksdC5kKHIsInN1YnRyYWN0IixmdW5jdGlvbigpe3JldHVybiBJfSksdC5kKHIsIm11bHRpcGx5U2NhbGFyIixmdW5jdGlvbigpe3JldHVybiBSfSksdC5kKHIsIm11bHRpcGx5U2NhbGFyQW5kQWRkIixmdW5jdGlvbigpe3JldHVybiBCfSksdC5kKHIsImV4YWN0RXF1YWxzIixmdW5jdGlvbigpe3JldHVybiB6fSksdC5kKHIsImVxdWFscyIsZnVuY3Rpb24oKXtyZXR1cm4gS30pLHQuZChyLCJtdWwiLGZ1bmN0aW9uKCl7cmV0dXJuIFF9KSx0LmQociwic3ViIixmdW5jdGlvbigpe3JldHVybiBffSk7dmFyIGU9dCgyKTtmdW5jdGlvbiBuKCl7dmFyIGo9bmV3IGUuQVJSQVlfVFlQRSg5KTtyZXR1cm4gZS5BUlJBWV9UWVBFIT1GbG9hdDMyQXJyYXkmJihqWzFdPTAsalsyXT0wLGpbM109MCxqWzVdPTAsals2XT0wLGpbN109MCksalswXT0xLGpbNF09MSxqWzhdPTEsan1mdW5jdGlvbiBhKGosRyl7cmV0dXJuIGpbMF09R1swXSxqWzFdPUdbMV0salsyXT1HWzJdLGpbM109R1s0XSxqWzRdPUdbNV0sals1XT1HWzZdLGpbNl09R1s4XSxqWzddPUdbOV0sals4XT1HWzEwXSxqfWZ1bmN0aW9uIHMoail7dmFyIEc9bmV3IGUuQVJSQVlfVFlQRSg5KTtyZXR1cm4gR1swXT1qWzBdLEdbMV09alsxXSxHWzJdPWpbMl0sR1szXT1qWzNdLEdbNF09als0XSxHWzVdPWpbNV0sR1s2XT1qWzZdLEdbN109als3XSxHWzhdPWpbOF0sR31mdW5jdGlvbiBpKGosRyl7cmV0dXJuIGpbMF09R1swXSxqWzFdPUdbMV0salsyXT1HWzJdLGpbM109R1szXSxqWzRdPUdbNF0sals1XT1HWzVdLGpbNl09R1s2XSxqWzddPUdbN10sals4XT1HWzhdLGp9ZnVuY3Rpb24gbyhqLEcsWCxaLHR0LG50LHEsZHQsdXQpe3ZhciBXPW5ldyBlLkFSUkFZX1RZUEUoOSk7cmV0dXJuIFdbMF09aixXWzFdPUcsV1syXT1YLFdbM109WixXWzRdPXR0LFdbNV09bnQsV1s2XT1xLFdbN109ZHQsV1s4XT11dCxXfWZ1bmN0aW9uIGMoaixHLFgsWix0dCxudCxxLGR0LHV0LFcpe3JldHVybiBqWzBdPUcsalsxXT1YLGpbMl09WixqWzNdPXR0LGpbNF09bnQsals1XT1xLGpbNl09ZHQsals3XT11dCxqWzhdPVcsan1mdW5jdGlvbiBtKGope3JldHVybiBqWzBdPTEsalsxXT0wLGpbMl09MCxqWzNdPTAsals0XT0xLGpbNV09MCxqWzZdPTAsals3XT0wLGpbOF09MSxqfWZ1bmN0aW9uIHUoaixHKXtpZihqPT09Ryl7dmFyIFg9R1sxXSxaPUdbMl0sdHQ9R1s1XTtqWzFdPUdbM10salsyXT1HWzZdLGpbM109WCxqWzVdPUdbN10sals2XT1aLGpbN109dHR9ZWxzZSBqWzBdPUdbMF0salsxXT1HWzNdLGpbMl09R1s2XSxqWzNdPUdbMV0sals0XT1HWzRdLGpbNV09R1s3XSxqWzZdPUdbMl0sals3XT1HWzVdLGpbOF09R1s4XTtyZXR1cm4gan1mdW5jdGlvbiBwKGosRyl7dmFyIFg9R1swXSxaPUdbMV0sdHQ9R1syXSxudD1HWzNdLHE9R1s0XSxkdD1HWzVdLHV0PUdbNl0sVz1HWzddLEY9R1s4XSxWPUYqcS1kdCpXLEo9LUYqbnQrZHQqdXQsTj1XKm50LXEqdXQsJD1YKlYrWipKK3R0Kk47cmV0dXJuICQ/KCQ9MS8kLGpbMF09ViokLGpbMV09KC1GKlordHQqVykqJCxqWzJdPShkdCpaLXR0KnEpKiQsalszXT1KKiQsals0XT0oRipYLXR0KnV0KSokLGpbNV09KC1kdCpYK3R0Km50KSokLGpbNl09TiokLGpbN109KC1XKlgrWip1dCkqJCxqWzhdPShxKlgtWipudCkqJCxqKTpudWxsfWZ1bmN0aW9uIHkoaixHKXt2YXIgWD1HWzBdLFo9R1sxXSx0dD1HWzJdLG50PUdbM10scT1HWzRdLGR0PUdbNV0sdXQ9R1s2XSxXPUdbN10sRj1HWzhdO3JldHVybiBqWzBdPXEqRi1kdCpXLGpbMV09dHQqVy1aKkYsalsyXT1aKmR0LXR0KnEsalszXT1kdCp1dC1udCpGLGpbNF09WCpGLXR0KnV0LGpbNV09dHQqbnQtWCpkdCxqWzZdPW50KlctcSp1dCxqWzddPVoqdXQtWCpXLGpbOF09WCpxLVoqbnQsan1mdW5jdGlvbiBPKGope3ZhciBHPWpbMF0sWD1qWzFdLFo9alsyXSx0dD1qWzNdLG50PWpbNF0scT1qWzVdLGR0PWpbNl0sdXQ9als3XSxXPWpbOF07cmV0dXJuIEcqKFcqbnQtcSp1dCkrWCooLVcqdHQrcSpkdCkrWioodXQqdHQtbnQqZHQpfWZ1bmN0aW9uIHgoaixHLFgpe3ZhciBaPUdbMF0sdHQ9R1sxXSxudD1HWzJdLHE9R1szXSxkdD1HWzRdLHV0PUdbNV0sVz1HWzZdLEY9R1s3XSxWPUdbOF0sSj1YWzBdLE49WFsxXSwkPVhbMl0sUz1YWzNdLFA9WFs0XSx3PVhbNV0sVT1YWzZdLEg9WFs3XSxZPVhbOF07cmV0dXJuIGpbMF09SipaK04qcSskKlcsalsxXT1KKnR0K04qZHQrJCpGLGpbMl09SipudCtOKnV0KyQqVixqWzNdPVMqWitQKnErdypXLGpbNF09Uyp0dCtQKmR0K3cqRixqWzVdPVMqbnQrUCp1dCt3KlYsals2XT1VKlorSCpxK1kqVyxqWzddPVUqdHQrSCpkdCtZKkYsals4XT1VKm50K0gqdXQrWSpWLGp9ZnVuY3Rpb24gdihqLEcsWCl7dmFyIFo9R1swXSx0dD1HWzFdLG50PUdbMl0scT1HWzNdLGR0PUdbNF0sdXQ9R1s1XSxXPUdbNl0sRj1HWzddLFY9R1s4XSxKPVhbMF0sTj1YWzFdO3JldHVybiBqWzBdPVosalsxXT10dCxqWzJdPW50LGpbM109cSxqWzRdPWR0LGpbNV09dXQsals2XT1KKlorTipxK1csals3XT1KKnR0K04qZHQrRixqWzhdPUoqbnQrTip1dCtWLGp9ZnVuY3Rpb24gVChqLEcsWCl7dmFyIFo9R1swXSx0dD1HWzFdLG50PUdbMl0scT1HWzNdLGR0PUdbNF0sdXQ9R1s1XSxXPUdbNl0sRj1HWzddLFY9R1s4XSxKPU1hdGguc2luKFgpLE49TWF0aC5jb3MoWCk7cmV0dXJuIGpbMF09TipaK0oqcSxqWzFdPU4qdHQrSipkdCxqWzJdPU4qbnQrSip1dCxqWzNdPU4qcS1KKlosals0XT1OKmR0LUoqdHQsals1XT1OKnV0LUoqbnQsals2XT1XLGpbN109RixqWzhdPVYsan1mdW5jdGlvbiBsKGosRyxYKXt2YXIgWj1YWzBdLHR0PVhbMV07cmV0dXJuIGpbMF09WipHWzBdLGpbMV09WipHWzFdLGpbMl09WipHWzJdLGpbM109dHQqR1szXSxqWzRdPXR0KkdbNF0sals1XT10dCpHWzVdLGpbNl09R1s2XSxqWzddPUdbN10sals4XT1HWzhdLGp9ZnVuY3Rpb24gaChqLEcpe3JldHVybiBqWzBdPTEsalsxXT0wLGpbMl09MCxqWzNdPTAsals0XT0xLGpbNV09MCxqWzZdPUdbMF0sals3XT1HWzFdLGpbOF09MSxqfWZ1bmN0aW9uIGYoaixHKXt2YXIgWD1NYXRoLnNpbihHKSxaPU1hdGguY29zKEcpO3JldHVybiBqWzBdPVosalsxXT1YLGpbMl09MCxqWzNdPS1YLGpbNF09WixqWzVdPTAsals2XT0wLGpbN109MCxqWzhdPTEsan1mdW5jdGlvbiBnKGosRyl7cmV0dXJuIGpbMF09R1swXSxqWzFdPTAsalsyXT0wLGpbM109MCxqWzRdPUdbMV0sals1XT0wLGpbNl09MCxqWzddPTAsals4XT0xLGp9ZnVuY3Rpb24gTShqLEcpe3JldHVybiBqWzBdPUdbMF0salsxXT1HWzFdLGpbMl09MCxqWzNdPUdbMl0sals0XT1HWzNdLGpbNV09MCxqWzZdPUdbNF0sals3XT1HWzVdLGpbOF09MSxqfWZ1bmN0aW9uIEEoaixHKXt2YXIgWD1HWzBdLFo9R1sxXSx0dD1HWzJdLG50PUdbM10scT1YK1gsZHQ9WitaLHV0PXR0K3R0LFc9WCpxLEY9WipxLFY9WipkdCxKPXR0KnEsTj10dCpkdCwkPXR0KnV0LFM9bnQqcSxQPW50KmR0LHc9bnQqdXQ7cmV0dXJuIGpbMF09MS1WLSQsalszXT1GLXcsals2XT1KK1AsalsxXT1GK3csals0XT0xLVctJCxqWzddPU4tUyxqWzJdPUotUCxqWzVdPU4rUyxqWzhdPTEtVy1WLGp9ZnVuY3Rpb24gQyhqLEcpe3ZhciBYPUdbMF0sWj1HWzFdLHR0PUdbMl0sbnQ9R1szXSxxPUdbNF0sZHQ9R1s1XSx1dD1HWzZdLFc9R1s3XSxGPUdbOF0sVj1HWzldLEo9R1sxMF0sTj1HWzExXSwkPUdbMTJdLFM9R1sxM10sUD1HWzE0XSx3PUdbMTVdLFU9WCpkdC1aKnEsSD1YKnV0LXR0KnEsWT1YKlctbnQqcSxrPVoqdXQtdHQqZHQscnQ9WipXLW50KmR0LGl0PXR0KlctbnQqdXQsY3Q9RipTLVYqJCxodD1GKlAtSiokLGF0PUYqdy1OKiQsb3Q9VipQLUoqUyxmdD1WKnctTipTLG10PUoqdy1OKlAsdnQ9VSptdC1IKmZ0K1kqb3QrayphdC1ydCpodCtpdCpjdDtyZXR1cm4gdnQ/KHZ0PTEvdnQsalswXT0oZHQqbXQtdXQqZnQrVypvdCkqdnQsalsxXT0odXQqYXQtcSptdC1XKmh0KSp2dCxqWzJdPShxKmZ0LWR0KmF0K1cqY3QpKnZ0LGpbM109KHR0KmZ0LVoqbXQtbnQqb3QpKnZ0LGpbNF09KFgqbXQtdHQqYXQrbnQqaHQpKnZ0LGpbNV09KFoqYXQtWCpmdC1udCpjdCkqdnQsals2XT0oUyppdC1QKnJ0K3cqaykqdnQsals3XT0oUCpZLSQqaXQtdypIKSp2dCxqWzhdPSgkKnJ0LVMqWSt3KlUpKnZ0LGopOm51bGx9ZnVuY3Rpb24gYihqLEcsWCl7cmV0dXJuIGpbMF09Mi9HLGpbMV09MCxqWzJdPTAsalszXT0wLGpbNF09LTIvWCxqWzVdPTAsals2XT0tMSxqWzddPTEsals4XT0xLGp9ZnVuY3Rpb24gRShqKXtyZXR1cm4ibWF0MygiK2pbMF0rIiwgIitqWzFdKyIsICIralsyXSsiLCAiK2pbM10rIiwgIitqWzRdKyIsICIrals1XSsiLCAiK2pbNl0rIiwgIitqWzddKyIsICIrals4XSsiKSJ9ZnVuY3Rpb24gTChqKXtyZXR1cm4gTWF0aC5oeXBvdChqWzBdLGpbMV0salsyXSxqWzNdLGpbNF0sals1XSxqWzZdLGpbN10sals4XSl9ZnVuY3Rpb24gRChqLEcsWCl7cmV0dXJuIGpbMF09R1swXStYWzBdLGpbMV09R1sxXStYWzFdLGpbMl09R1syXStYWzJdLGpbM109R1szXStYWzNdLGpbNF09R1s0XStYWzRdLGpbNV09R1s1XStYWzVdLGpbNl09R1s2XStYWzZdLGpbN109R1s3XStYWzddLGpbOF09R1s4XStYWzhdLGp9ZnVuY3Rpb24gSShqLEcsWCl7cmV0dXJuIGpbMF09R1swXS1YWzBdLGpbMV09R1sxXS1YWzFdLGpbMl09R1syXS1YWzJdLGpbM109R1szXS1YWzNdLGpbNF09R1s0XS1YWzRdLGpbNV09R1s1XS1YWzVdLGpbNl09R1s2XS1YWzZdLGpbN109R1s3XS1YWzddLGpbOF09R1s4XS1YWzhdLGp9ZnVuY3Rpb24gUihqLEcsWCl7cmV0dXJuIGpbMF09R1swXSpYLGpbMV09R1sxXSpYLGpbMl09R1syXSpYLGpbM109R1szXSpYLGpbNF09R1s0XSpYLGpbNV09R1s1XSpYLGpbNl09R1s2XSpYLGpbN109R1s3XSpYLGpbOF09R1s4XSpYLGp9ZnVuY3Rpb24gQihqLEcsWCxaKXtyZXR1cm4galswXT1HWzBdK1hbMF0qWixqWzFdPUdbMV0rWFsxXSpaLGpbMl09R1syXStYWzJdKlosalszXT1HWzNdK1hbM10qWixqWzRdPUdbNF0rWFs0XSpaLGpbNV09R1s1XStYWzVdKlosals2XT1HWzZdK1hbNl0qWixqWzddPUdbN10rWFs3XSpaLGpbOF09R1s4XStYWzhdKlosan1mdW5jdGlvbiB6KGosRyl7cmV0dXJuIGpbMF09PT1HWzBdJiZqWzFdPT09R1sxXSYmalsyXT09PUdbMl0mJmpbM109PT1HWzNdJiZqWzRdPT09R1s0XSYmals1XT09PUdbNV0mJmpbNl09PT1HWzZdJiZqWzddPT09R1s3XSYmals4XT09PUdbOF19ZnVuY3Rpb24gSyhqLEcpe3ZhciBYPWpbMF0sWj1qWzFdLHR0PWpbMl0sbnQ9alszXSxxPWpbNF0sZHQ9als1XSx1dD1qWzZdLFc9als3XSxGPWpbOF0sVj1HWzBdLEo9R1sxXSxOPUdbMl0sJD1HWzNdLFM9R1s0XSxQPUdbNV0sdz1HWzZdLFU9R1s3XSxIPUdbOF07cmV0dXJuIE1hdGguYWJzKFgtVik8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKFgpLE1hdGguYWJzKFYpKSYmTWF0aC5hYnMoWi1KKTw9ZS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoWiksTWF0aC5hYnMoSikpJiZNYXRoLmFicyh0dC1OKTw9ZS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnModHQpLE1hdGguYWJzKE4pKSYmTWF0aC5hYnMobnQtJCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKG50KSxNYXRoLmFicygkKSkmJk1hdGguYWJzKHEtUyk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHEpLE1hdGguYWJzKFMpKSYmTWF0aC5hYnMoZHQtUCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGR0KSxNYXRoLmFicyhQKSkmJk1hdGguYWJzKHV0LXcpPD1lLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyh1dCksTWF0aC5hYnModykpJiZNYXRoLmFicyhXLVUpPD1lLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhXKSxNYXRoLmFicyhVKSkmJk1hdGguYWJzKEYtSCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKEYpLE1hdGguYWJzKEgpKX12YXIgUT14LF89SX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiY3JlYXRlIixmdW5jdGlvbigpe3JldHVybiBufSksdC5kKHIsImNsb25lIixmdW5jdGlvbigpe3JldHVybiBhfSksdC5kKHIsImNvcHkiLGZ1bmN0aW9uKCl7cmV0dXJuIHN9KSx0LmQociwiZnJvbVZhbHVlcyIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pLHQuZChyLCJzZXQiLGZ1bmN0aW9uKCl7cmV0dXJuIG99KSx0LmQociwiaWRlbnRpdHkiLGZ1bmN0aW9uKCl7cmV0dXJuIGN9KSx0LmQociwidHJhbnNwb3NlIixmdW5jdGlvbigpe3JldHVybiBtfSksdC5kKHIsImludmVydCIsZnVuY3Rpb24oKXtyZXR1cm4gdX0pLHQuZChyLCJhZGpvaW50IixmdW5jdGlvbigpe3JldHVybiBwfSksdC5kKHIsImRldGVybWluYW50IixmdW5jdGlvbigpe3JldHVybiB5fSksdC5kKHIsIm11bHRpcGx5IixmdW5jdGlvbigpe3JldHVybiBPfSksdC5kKHIsInRyYW5zbGF0ZSIsZnVuY3Rpb24oKXtyZXR1cm4geH0pLHQuZChyLCJzY2FsZSIsZnVuY3Rpb24oKXtyZXR1cm4gdn0pLHQuZChyLCJyb3RhdGUiLGZ1bmN0aW9uKCl7cmV0dXJuIFR9KSx0LmQociwicm90YXRlWCIsZnVuY3Rpb24oKXtyZXR1cm4gbH0pLHQuZChyLCJyb3RhdGVZIixmdW5jdGlvbigpe3JldHVybiBofSksdC5kKHIsInJvdGF0ZVoiLGZ1bmN0aW9uKCl7cmV0dXJuIGZ9KSx0LmQociwiZnJvbVRyYW5zbGF0aW9uIixmdW5jdGlvbigpe3JldHVybiBnfSksdC5kKHIsImZyb21TY2FsaW5nIixmdW5jdGlvbigpe3JldHVybiBNfSksdC5kKHIsImZyb21Sb3RhdGlvbiIsZnVuY3Rpb24oKXtyZXR1cm4gQX0pLHQuZChyLCJmcm9tWFJvdGF0aW9uIixmdW5jdGlvbigpe3JldHVybiBDfSksdC5kKHIsImZyb21ZUm90YXRpb24iLGZ1bmN0aW9uKCl7cmV0dXJuIGJ9KSx0LmQociwiZnJvbVpSb3RhdGlvbiIsZnVuY3Rpb24oKXtyZXR1cm4gRX0pLHQuZChyLCJmcm9tUm90YXRpb25UcmFuc2xhdGlvbiIsZnVuY3Rpb24oKXtyZXR1cm4gTH0pLHQuZChyLCJmcm9tUXVhdDIiLGZ1bmN0aW9uKCl7cmV0dXJuIER9KSx0LmQociwiZ2V0VHJhbnNsYXRpb24iLGZ1bmN0aW9uKCl7cmV0dXJuIEl9KSx0LmQociwiZ2V0U2NhbGluZyIsZnVuY3Rpb24oKXtyZXR1cm4gUn0pLHQuZChyLCJnZXRSb3RhdGlvbiIsZnVuY3Rpb24oKXtyZXR1cm4gQn0pLHQuZChyLCJmcm9tUm90YXRpb25UcmFuc2xhdGlvblNjYWxlIixmdW5jdGlvbigpe3JldHVybiB6fSksdC5kKHIsImZyb21Sb3RhdGlvblRyYW5zbGF0aW9uU2NhbGVPcmlnaW4iLGZ1bmN0aW9uKCl7cmV0dXJuIEt9KSx0LmQociwiZnJvbVF1YXQiLGZ1bmN0aW9uKCl7cmV0dXJuIFF9KSx0LmQociwiZnJ1c3R1bSIsZnVuY3Rpb24oKXtyZXR1cm4gX30pLHQuZChyLCJwZXJzcGVjdGl2ZSIsZnVuY3Rpb24oKXtyZXR1cm4gan0pLHQuZChyLCJwZXJzcGVjdGl2ZUZyb21GaWVsZE9mVmlldyIsZnVuY3Rpb24oKXtyZXR1cm4gR30pLHQuZChyLCJvcnRobyIsZnVuY3Rpb24oKXtyZXR1cm4gWH0pLHQuZChyLCJsb29rQXQiLGZ1bmN0aW9uKCl7cmV0dXJuIFp9KSx0LmQociwidGFyZ2V0VG8iLGZ1bmN0aW9uKCl7cmV0dXJuIHR0fSksdC5kKHIsInN0ciIsZnVuY3Rpb24oKXtyZXR1cm4gbnR9KSx0LmQociwiZnJvYiIsZnVuY3Rpb24oKXtyZXR1cm4gcX0pLHQuZChyLCJhZGQiLGZ1bmN0aW9uKCl7cmV0dXJuIGR0fSksdC5kKHIsInN1YnRyYWN0IixmdW5jdGlvbigpe3JldHVybiB1dH0pLHQuZChyLCJtdWx0aXBseVNjYWxhciIsZnVuY3Rpb24oKXtyZXR1cm4gV30pLHQuZChyLCJtdWx0aXBseVNjYWxhckFuZEFkZCIsZnVuY3Rpb24oKXtyZXR1cm4gRn0pLHQuZChyLCJleGFjdEVxdWFscyIsZnVuY3Rpb24oKXtyZXR1cm4gVn0pLHQuZChyLCJlcXVhbHMiLGZ1bmN0aW9uKCl7cmV0dXJuIEp9KSx0LmQociwibXVsIixmdW5jdGlvbigpe3JldHVybiBOfSksdC5kKHIsInN1YiIsZnVuY3Rpb24oKXtyZXR1cm4gJH0pO3ZhciBlPXQoMik7ZnVuY3Rpb24gbigpe3ZhciBTPW5ldyBlLkFSUkFZX1RZUEUoMTYpO3JldHVybiBlLkFSUkFZX1RZUEUhPUZsb2F0MzJBcnJheSYmKFNbMV09MCxTWzJdPTAsU1szXT0wLFNbNF09MCxTWzZdPTAsU1s3XT0wLFNbOF09MCxTWzldPTAsU1sxMV09MCxTWzEyXT0wLFNbMTNdPTAsU1sxNF09MCksU1swXT0xLFNbNV09MSxTWzEwXT0xLFNbMTVdPTEsU31mdW5jdGlvbiBhKFMpe3ZhciBQPW5ldyBlLkFSUkFZX1RZUEUoMTYpO3JldHVybiBQWzBdPVNbMF0sUFsxXT1TWzFdLFBbMl09U1syXSxQWzNdPVNbM10sUFs0XT1TWzRdLFBbNV09U1s1XSxQWzZdPVNbNl0sUFs3XT1TWzddLFBbOF09U1s4XSxQWzldPVNbOV0sUFsxMF09U1sxMF0sUFsxMV09U1sxMV0sUFsxMl09U1sxMl0sUFsxM109U1sxM10sUFsxNF09U1sxNF0sUFsxNV09U1sxNV0sUH1mdW5jdGlvbiBzKFMsUCl7cmV0dXJuIFNbMF09UFswXSxTWzFdPVBbMV0sU1syXT1QWzJdLFNbM109UFszXSxTWzRdPVBbNF0sU1s1XT1QWzVdLFNbNl09UFs2XSxTWzddPVBbN10sU1s4XT1QWzhdLFNbOV09UFs5XSxTWzEwXT1QWzEwXSxTWzExXT1QWzExXSxTWzEyXT1QWzEyXSxTWzEzXT1QWzEzXSxTWzE0XT1QWzE0XSxTWzE1XT1QWzE1XSxTfWZ1bmN0aW9uIGkoUyxQLHcsVSxILFksayxydCxpdCxjdCxodCxhdCxvdCxmdCxtdCx2dCl7dmFyIHB0PW5ldyBlLkFSUkFZX1RZUEUoMTYpO3JldHVybiBwdFswXT1TLHB0WzFdPVAscHRbMl09dyxwdFszXT1VLHB0WzRdPUgscHRbNV09WSxwdFs2XT1rLHB0WzddPXJ0LHB0WzhdPWl0LHB0WzldPWN0LHB0WzEwXT1odCxwdFsxMV09YXQscHRbMTJdPW90LHB0WzEzXT1mdCxwdFsxNF09bXQscHRbMTVdPXZ0LHB0fWZ1bmN0aW9uIG8oUyxQLHcsVSxILFksayxydCxpdCxjdCxodCxhdCxvdCxmdCxtdCx2dCxwdCl7cmV0dXJuIFNbMF09UCxTWzFdPXcsU1syXT1VLFNbM109SCxTWzRdPVksU1s1XT1rLFNbNl09cnQsU1s3XT1pdCxTWzhdPWN0LFNbOV09aHQsU1sxMF09YXQsU1sxMV09b3QsU1sxMl09ZnQsU1sxM109bXQsU1sxNF09dnQsU1sxNV09cHQsU31mdW5jdGlvbiBjKFMpe3JldHVybiBTWzBdPTEsU1sxXT0wLFNbMl09MCxTWzNdPTAsU1s0XT0wLFNbNV09MSxTWzZdPTAsU1s3XT0wLFNbOF09MCxTWzldPTAsU1sxMF09MSxTWzExXT0wLFNbMTJdPTAsU1sxM109MCxTWzE0XT0wLFNbMTVdPTEsU31mdW5jdGlvbiBtKFMsUCl7aWYoUz09PVApe3ZhciB3PVBbMV0sVT1QWzJdLEg9UFszXSxZPVBbNl0saz1QWzddLHJ0PVBbMTFdO1NbMV09UFs0XSxTWzJdPVBbOF0sU1szXT1QWzEyXSxTWzRdPXcsU1s2XT1QWzldLFNbN109UFsxM10sU1s4XT1VLFNbOV09WSxTWzExXT1QWzE0XSxTWzEyXT1ILFNbMTNdPWssU1sxNF09cnR9ZWxzZSBTWzBdPVBbMF0sU1sxXT1QWzRdLFNbMl09UFs4XSxTWzNdPVBbMTJdLFNbNF09UFsxXSxTWzVdPVBbNV0sU1s2XT1QWzldLFNbN109UFsxM10sU1s4XT1QWzJdLFNbOV09UFs2XSxTWzEwXT1QWzEwXSxTWzExXT1QWzE0XSxTWzEyXT1QWzNdLFNbMTNdPVBbN10sU1sxNF09UFsxMV0sU1sxNV09UFsxNV07cmV0dXJuIFN9ZnVuY3Rpb24gdShTLFApe3ZhciB3PVBbMF0sVT1QWzFdLEg9UFsyXSxZPVBbM10saz1QWzRdLHJ0PVBbNV0saXQ9UFs2XSxjdD1QWzddLGh0PVBbOF0sYXQ9UFs5XSxvdD1QWzEwXSxmdD1QWzExXSxtdD1QWzEyXSx2dD1QWzEzXSxwdD1QWzE0XSx4dD1QWzE1XSxSdD13KnJ0LVUqayxFdD13Kml0LUgqayxQdD13KmN0LVkqayxBdD1VKml0LUgqcnQsQ3Q9VSpjdC1ZKnJ0LHp0PUgqY3QtWSppdCxqdD1odCp2dC1hdCptdCxVdD1odCpwdC1vdCptdCwkdD1odCp4dC1mdCptdCxHdD1hdCpwdC1vdCp2dCxIdD1hdCp4dC1mdCp2dCxWdD1vdCp4dC1mdCpwdCxidD1SdCpWdC1FdCpIdCtQdCpHdCtBdCokdC1DdCpVdCt6dCpqdDtyZXR1cm4gYnQ/KGJ0PTEvYnQsU1swXT0ocnQqVnQtaXQqSHQrY3QqR3QpKmJ0LFNbMV09KEgqSHQtVSpWdC1ZKkd0KSpidCxTWzJdPSh2dCp6dC1wdCpDdCt4dCpBdCkqYnQsU1szXT0ob3QqQ3QtYXQqenQtZnQqQXQpKmJ0LFNbNF09KGl0KiR0LWsqVnQtY3QqVXQpKmJ0LFNbNV09KHcqVnQtSCokdCtZKlV0KSpidCxTWzZdPShwdCpQdC1tdCp6dC14dCpFdCkqYnQsU1s3XT0oaHQqenQtb3QqUHQrZnQqRXQpKmJ0LFNbOF09KGsqSHQtcnQqJHQrY3QqanQpKmJ0LFNbOV09KFUqJHQtdypIdC1ZKmp0KSpidCxTWzEwXT0obXQqQ3QtdnQqUHQreHQqUnQpKmJ0LFNbMTFdPShhdCpQdC1odCpDdC1mdCpSdCkqYnQsU1sxMl09KHJ0KlV0LWsqR3QtaXQqanQpKmJ0LFNbMTNdPSh3Kkd0LVUqVXQrSCpqdCkqYnQsU1sxNF09KHZ0KkV0LW10KkF0LXB0KlJ0KSpidCxTWzE1XT0oaHQqQXQtYXQqRXQrb3QqUnQpKmJ0LFMpOm51bGx9ZnVuY3Rpb24gcChTLFApe3ZhciB3PVBbMF0sVT1QWzFdLEg9UFsyXSxZPVBbM10saz1QWzRdLHJ0PVBbNV0saXQ9UFs2XSxjdD1QWzddLGh0PVBbOF0sYXQ9UFs5XSxvdD1QWzEwXSxmdD1QWzExXSxtdD1QWzEyXSx2dD1QWzEzXSxwdD1QWzE0XSx4dD1QWzE1XTtyZXR1cm4gU1swXT1ydCoob3QqeHQtZnQqcHQpLWF0KihpdCp4dC1jdCpwdCkrdnQqKGl0KmZ0LWN0Km90KSxTWzFdPS0oVSoob3QqeHQtZnQqcHQpLWF0KihIKnh0LVkqcHQpK3Z0KihIKmZ0LVkqb3QpKSxTWzJdPVUqKGl0Knh0LWN0KnB0KS1ydCooSCp4dC1ZKnB0KSt2dCooSCpjdC1ZKml0KSxTWzNdPS0oVSooaXQqZnQtY3Qqb3QpLXJ0KihIKmZ0LVkqb3QpK2F0KihIKmN0LVkqaXQpKSxTWzRdPS0oayoob3QqeHQtZnQqcHQpLWh0KihpdCp4dC1jdCpwdCkrbXQqKGl0KmZ0LWN0Km90KSksU1s1XT13KihvdCp4dC1mdCpwdCktaHQqKEgqeHQtWSpwdCkrbXQqKEgqZnQtWSpvdCksU1s2XT0tKHcqKGl0Knh0LWN0KnB0KS1rKihIKnh0LVkqcHQpK210KihIKmN0LVkqaXQpKSxTWzddPXcqKGl0KmZ0LWN0Km90KS1rKihIKmZ0LVkqb3QpK2h0KihIKmN0LVkqaXQpLFNbOF09ayooYXQqeHQtZnQqdnQpLWh0KihydCp4dC1jdCp2dCkrbXQqKHJ0KmZ0LWN0KmF0KSxTWzldPS0odyooYXQqeHQtZnQqdnQpLWh0KihVKnh0LVkqdnQpK210KihVKmZ0LVkqYXQpKSxTWzEwXT13KihydCp4dC1jdCp2dCktayooVSp4dC1ZKnZ0KSttdCooVSpjdC1ZKnJ0KSxTWzExXT0tKHcqKHJ0KmZ0LWN0KmF0KS1rKihVKmZ0LVkqYXQpK2h0KihVKmN0LVkqcnQpKSxTWzEyXT0tKGsqKGF0KnB0LW90KnZ0KS1odCoocnQqcHQtaXQqdnQpK210KihydCpvdC1pdCphdCkpLFNbMTNdPXcqKGF0KnB0LW90KnZ0KS1odCooVSpwdC1IKnZ0KSttdCooVSpvdC1IKmF0KSxTWzE0XT0tKHcqKHJ0KnB0LWl0KnZ0KS1rKihVKnB0LUgqdnQpK210KihVKml0LUgqcnQpKSxTWzE1XT13KihydCpvdC1pdCphdCktayooVSpvdC1IKmF0KStodCooVSppdC1IKnJ0KSxTfWZ1bmN0aW9uIHkoUyl7dmFyIFA9U1swXSx3PVNbMV0sVT1TWzJdLEg9U1szXSxZPVNbNF0saz1TWzVdLHJ0PVNbNl0saXQ9U1s3XSxjdD1TWzhdLGh0PVNbOV0sYXQ9U1sxMF0sb3Q9U1sxMV0sZnQ9U1sxMl0sbXQ9U1sxM10sdnQ9U1sxNF0scHQ9U1sxNV0seHQ9UCprLXcqWSxSdD1QKnJ0LVUqWSxFdD1QKml0LUgqWSxQdD13KnJ0LVUqayxBdD13Kml0LUgqayxDdD1VKml0LUgqcnQsenQ9Y3QqbXQtaHQqZnQsanQ9Y3QqdnQtYXQqZnQsVXQ9Y3QqcHQtb3QqZnQsJHQ9aHQqdnQtYXQqbXQsR3Q9aHQqcHQtb3QqbXQsSHQ9YXQqcHQtb3QqdnQ7cmV0dXJuIHh0Kkh0LVJ0Kkd0K0V0KiR0K1B0KlV0LUF0Kmp0K0N0Knp0fWZ1bmN0aW9uIE8oUyxQLHcpe3ZhciBVPVBbMF0sSD1QWzFdLFk9UFsyXSxrPVBbM10scnQ9UFs0XSxpdD1QWzVdLGN0PVBbNl0saHQ9UFs3XSxhdD1QWzhdLG90PVBbOV0sZnQ9UFsxMF0sbXQ9UFsxMV0sdnQ9UFsxMl0scHQ9UFsxM10seHQ9UFsxNF0sUnQ9UFsxNV0sRXQ9d1swXSxQdD13WzFdLEF0PXdbMl0sQ3Q9d1szXTtyZXR1cm4gU1swXT1FdCpVK1B0KnJ0K0F0KmF0K0N0KnZ0LFNbMV09RXQqSCtQdCppdCtBdCpvdCtDdCpwdCxTWzJdPUV0KlkrUHQqY3QrQXQqZnQrQ3QqeHQsU1szXT1FdCprK1B0Kmh0K0F0Km10K0N0KlJ0LEV0PXdbNF0sUHQ9d1s1XSxBdD13WzZdLEN0PXdbN10sU1s0XT1FdCpVK1B0KnJ0K0F0KmF0K0N0KnZ0LFNbNV09RXQqSCtQdCppdCtBdCpvdCtDdCpwdCxTWzZdPUV0KlkrUHQqY3QrQXQqZnQrQ3QqeHQsU1s3XT1FdCprK1B0Kmh0K0F0Km10K0N0KlJ0LEV0PXdbOF0sUHQ9d1s5XSxBdD13WzEwXSxDdD13WzExXSxTWzhdPUV0KlUrUHQqcnQrQXQqYXQrQ3QqdnQsU1s5XT1FdCpIK1B0Kml0K0F0Km90K0N0KnB0LFNbMTBdPUV0KlkrUHQqY3QrQXQqZnQrQ3QqeHQsU1sxMV09RXQqaytQdCpodCtBdCptdCtDdCpSdCxFdD13WzEyXSxQdD13WzEzXSxBdD13WzE0XSxDdD13WzE1XSxTWzEyXT1FdCpVK1B0KnJ0K0F0KmF0K0N0KnZ0LFNbMTNdPUV0KkgrUHQqaXQrQXQqb3QrQ3QqcHQsU1sxNF09RXQqWStQdCpjdCtBdCpmdCtDdCp4dCxTWzE1XT1FdCprK1B0Kmh0K0F0Km10K0N0KlJ0LFN9ZnVuY3Rpb24geChTLFAsdyl7dmFyIFU9d1swXSxIPXdbMV0sWT13WzJdLGsscnQsaXQsY3QsaHQsYXQsb3QsZnQsbXQsdnQscHQseHQ7cmV0dXJuIFA9PT1TPyhTWzEyXT1QWzBdKlUrUFs0XSpIK1BbOF0qWStQWzEyXSxTWzEzXT1QWzFdKlUrUFs1XSpIK1BbOV0qWStQWzEzXSxTWzE0XT1QWzJdKlUrUFs2XSpIK1BbMTBdKlkrUFsxNF0sU1sxNV09UFszXSpVK1BbN10qSCtQWzExXSpZK1BbMTVdKTooaz1QWzBdLHJ0PVBbMV0saXQ9UFsyXSxjdD1QWzNdLGh0PVBbNF0sYXQ9UFs1XSxvdD1QWzZdLGZ0PVBbN10sbXQ9UFs4XSx2dD1QWzldLHB0PVBbMTBdLHh0PVBbMTFdLFNbMF09ayxTWzFdPXJ0LFNbMl09aXQsU1szXT1jdCxTWzRdPWh0LFNbNV09YXQsU1s2XT1vdCxTWzddPWZ0LFNbOF09bXQsU1s5XT12dCxTWzEwXT1wdCxTWzExXT14dCxTWzEyXT1rKlUraHQqSCttdCpZK1BbMTJdLFNbMTNdPXJ0KlUrYXQqSCt2dCpZK1BbMTNdLFNbMTRdPWl0KlUrb3QqSCtwdCpZK1BbMTRdLFNbMTVdPWN0KlUrZnQqSCt4dCpZK1BbMTVdKSxTfWZ1bmN0aW9uIHYoUyxQLHcpe3ZhciBVPXdbMF0sSD13WzFdLFk9d1syXTtyZXR1cm4gU1swXT1QWzBdKlUsU1sxXT1QWzFdKlUsU1syXT1QWzJdKlUsU1szXT1QWzNdKlUsU1s0XT1QWzRdKkgsU1s1XT1QWzVdKkgsU1s2XT1QWzZdKkgsU1s3XT1QWzddKkgsU1s4XT1QWzhdKlksU1s5XT1QWzldKlksU1sxMF09UFsxMF0qWSxTWzExXT1QWzExXSpZLFNbMTJdPVBbMTJdLFNbMTNdPVBbMTNdLFNbMTRdPVBbMTRdLFNbMTVdPVBbMTVdLFN9ZnVuY3Rpb24gVChTLFAsdyxVKXt2YXIgSD1VWzBdLFk9VVsxXSxrPVVbMl0scnQ9TWF0aC5oeXBvdChILFksayksaXQsY3QsaHQsYXQsb3QsZnQsbXQsdnQscHQseHQsUnQsRXQsUHQsQXQsQ3QsenQsanQsVXQsJHQsR3QsSHQsVnQsYnQsdGU7cmV0dXJuIHJ0PGUuRVBTSUxPTj9udWxsOihydD0xL3J0LEgqPXJ0LFkqPXJ0LGsqPXJ0LGl0PU1hdGguc2luKHcpLGN0PU1hdGguY29zKHcpLGh0PTEtY3QsYXQ9UFswXSxvdD1QWzFdLGZ0PVBbMl0sbXQ9UFszXSx2dD1QWzRdLHB0PVBbNV0seHQ9UFs2XSxSdD1QWzddLEV0PVBbOF0sUHQ9UFs5XSxBdD1QWzEwXSxDdD1QWzExXSx6dD1IKkgqaHQrY3QsanQ9WSpIKmh0K2sqaXQsVXQ9aypIKmh0LVkqaXQsJHQ9SCpZKmh0LWsqaXQsR3Q9WSpZKmh0K2N0LEh0PWsqWSpodCtIKml0LFZ0PUgqaypodCtZKml0LGJ0PVkqaypodC1IKml0LHRlPWsqaypodCtjdCxTWzBdPWF0Knp0K3Z0Kmp0K0V0KlV0LFNbMV09b3QqenQrcHQqanQrUHQqVXQsU1syXT1mdCp6dCt4dCpqdCtBdCpVdCxTWzNdPW10Knp0K1J0Kmp0K0N0KlV0LFNbNF09YXQqJHQrdnQqR3QrRXQqSHQsU1s1XT1vdCokdCtwdCpHdCtQdCpIdCxTWzZdPWZ0KiR0K3h0Kkd0K0F0Kkh0LFNbN109bXQqJHQrUnQqR3QrQ3QqSHQsU1s4XT1hdCpWdCt2dCpidCtFdCp0ZSxTWzldPW90KlZ0K3B0KmJ0K1B0KnRlLFNbMTBdPWZ0KlZ0K3h0KmJ0K0F0KnRlLFNbMTFdPW10KlZ0K1J0KmJ0K0N0KnRlLFAhPT1TJiYoU1sxMl09UFsxMl0sU1sxM109UFsxM10sU1sxNF09UFsxNF0sU1sxNV09UFsxNV0pLFMpfWZ1bmN0aW9uIGwoUyxQLHcpe3ZhciBVPU1hdGguc2luKHcpLEg9TWF0aC5jb3ModyksWT1QWzRdLGs9UFs1XSxydD1QWzZdLGl0PVBbN10sY3Q9UFs4XSxodD1QWzldLGF0PVBbMTBdLG90PVBbMTFdO3JldHVybiBQIT09UyYmKFNbMF09UFswXSxTWzFdPVBbMV0sU1syXT1QWzJdLFNbM109UFszXSxTWzEyXT1QWzEyXSxTWzEzXT1QWzEzXSxTWzE0XT1QWzE0XSxTWzE1XT1QWzE1XSksU1s0XT1ZKkgrY3QqVSxTWzVdPWsqSCtodCpVLFNbNl09cnQqSCthdCpVLFNbN109aXQqSCtvdCpVLFNbOF09Y3QqSC1ZKlUsU1s5XT1odCpILWsqVSxTWzEwXT1hdCpILXJ0KlUsU1sxMV09b3QqSC1pdCpVLFN9ZnVuY3Rpb24gaChTLFAsdyl7dmFyIFU9TWF0aC5zaW4odyksSD1NYXRoLmNvcyh3KSxZPVBbMF0saz1QWzFdLHJ0PVBbMl0saXQ9UFszXSxjdD1QWzhdLGh0PVBbOV0sYXQ9UFsxMF0sb3Q9UFsxMV07cmV0dXJuIFAhPT1TJiYoU1s0XT1QWzRdLFNbNV09UFs1XSxTWzZdPVBbNl0sU1s3XT1QWzddLFNbMTJdPVBbMTJdLFNbMTNdPVBbMTNdLFNbMTRdPVBbMTRdLFNbMTVdPVBbMTVdKSxTWzBdPVkqSC1jdCpVLFNbMV09aypILWh0KlUsU1syXT1ydCpILWF0KlUsU1szXT1pdCpILW90KlUsU1s4XT1ZKlUrY3QqSCxTWzldPWsqVStodCpILFNbMTBdPXJ0KlUrYXQqSCxTWzExXT1pdCpVK290KkgsU31mdW5jdGlvbiBmKFMsUCx3KXt2YXIgVT1NYXRoLnNpbih3KSxIPU1hdGguY29zKHcpLFk9UFswXSxrPVBbMV0scnQ9UFsyXSxpdD1QWzNdLGN0PVBbNF0saHQ9UFs1XSxhdD1QWzZdLG90PVBbN107cmV0dXJuIFAhPT1TJiYoU1s4XT1QWzhdLFNbOV09UFs5XSxTWzEwXT1QWzEwXSxTWzExXT1QWzExXSxTWzEyXT1QWzEyXSxTWzEzXT1QWzEzXSxTWzE0XT1QWzE0XSxTWzE1XT1QWzE1XSksU1swXT1ZKkgrY3QqVSxTWzFdPWsqSCtodCpVLFNbMl09cnQqSCthdCpVLFNbM109aXQqSCtvdCpVLFNbNF09Y3QqSC1ZKlUsU1s1XT1odCpILWsqVSxTWzZdPWF0KkgtcnQqVSxTWzddPW90KkgtaXQqVSxTfWZ1bmN0aW9uIGcoUyxQKXtyZXR1cm4gU1swXT0xLFNbMV09MCxTWzJdPTAsU1szXT0wLFNbNF09MCxTWzVdPTEsU1s2XT0wLFNbN109MCxTWzhdPTAsU1s5XT0wLFNbMTBdPTEsU1sxMV09MCxTWzEyXT1QWzBdLFNbMTNdPVBbMV0sU1sxNF09UFsyXSxTWzE1XT0xLFN9ZnVuY3Rpb24gTShTLFApe3JldHVybiBTWzBdPVBbMF0sU1sxXT0wLFNbMl09MCxTWzNdPTAsU1s0XT0wLFNbNV09UFsxXSxTWzZdPTAsU1s3XT0wLFNbOF09MCxTWzldPTAsU1sxMF09UFsyXSxTWzExXT0wLFNbMTJdPTAsU1sxM109MCxTWzE0XT0wLFNbMTVdPTEsU31mdW5jdGlvbiBBKFMsUCx3KXt2YXIgVT13WzBdLEg9d1sxXSxZPXdbMl0saz1NYXRoLmh5cG90KFUsSCxZKSxydCxpdCxjdDtyZXR1cm4gazxlLkVQU0lMT04/bnVsbDooaz0xL2ssVSo9ayxIKj1rLFkqPWsscnQ9TWF0aC5zaW4oUCksaXQ9TWF0aC5jb3MoUCksY3Q9MS1pdCxTWzBdPVUqVSpjdCtpdCxTWzFdPUgqVSpjdCtZKnJ0LFNbMl09WSpVKmN0LUgqcnQsU1szXT0wLFNbNF09VSpIKmN0LVkqcnQsU1s1XT1IKkgqY3QraXQsU1s2XT1ZKkgqY3QrVSpydCxTWzddPTAsU1s4XT1VKlkqY3QrSCpydCxTWzldPUgqWSpjdC1VKnJ0LFNbMTBdPVkqWSpjdCtpdCxTWzExXT0wLFNbMTJdPTAsU1sxM109MCxTWzE0XT0wLFNbMTVdPTEsUyl9ZnVuY3Rpb24gQyhTLFApe3ZhciB3PU1hdGguc2luKFApLFU9TWF0aC5jb3MoUCk7cmV0dXJuIFNbMF09MSxTWzFdPTAsU1syXT0wLFNbM109MCxTWzRdPTAsU1s1XT1VLFNbNl09dyxTWzddPTAsU1s4XT0wLFNbOV09LXcsU1sxMF09VSxTWzExXT0wLFNbMTJdPTAsU1sxM109MCxTWzE0XT0wLFNbMTVdPTEsU31mdW5jdGlvbiBiKFMsUCl7dmFyIHc9TWF0aC5zaW4oUCksVT1NYXRoLmNvcyhQKTtyZXR1cm4gU1swXT1VLFNbMV09MCxTWzJdPS13LFNbM109MCxTWzRdPTAsU1s1XT0xLFNbNl09MCxTWzddPTAsU1s4XT13LFNbOV09MCxTWzEwXT1VLFNbMTFdPTAsU1sxMl09MCxTWzEzXT0wLFNbMTRdPTAsU1sxNV09MSxTfWZ1bmN0aW9uIEUoUyxQKXt2YXIgdz1NYXRoLnNpbihQKSxVPU1hdGguY29zKFApO3JldHVybiBTWzBdPVUsU1sxXT13LFNbMl09MCxTWzNdPTAsU1s0XT0tdyxTWzVdPVUsU1s2XT0wLFNbN109MCxTWzhdPTAsU1s5XT0wLFNbMTBdPTEsU1sxMV09MCxTWzEyXT0wLFNbMTNdPTAsU1sxNF09MCxTWzE1XT0xLFN9ZnVuY3Rpb24gTChTLFAsdyl7dmFyIFU9UFswXSxIPVBbMV0sWT1QWzJdLGs9UFszXSxydD1VK1UsaXQ9SCtILGN0PVkrWSxodD1VKnJ0LGF0PVUqaXQsb3Q9VSpjdCxmdD1IKml0LG10PUgqY3QsdnQ9WSpjdCxwdD1rKnJ0LHh0PWsqaXQsUnQ9aypjdDtyZXR1cm4gU1swXT0xLShmdCt2dCksU1sxXT1hdCtSdCxTWzJdPW90LXh0LFNbM109MCxTWzRdPWF0LVJ0LFNbNV09MS0oaHQrdnQpLFNbNl09bXQrcHQsU1s3XT0wLFNbOF09b3QreHQsU1s5XT1tdC1wdCxTWzEwXT0xLShodCtmdCksU1sxMV09MCxTWzEyXT13WzBdLFNbMTNdPXdbMV0sU1sxNF09d1syXSxTWzE1XT0xLFN9ZnVuY3Rpb24gRChTLFApe3ZhciB3PW5ldyBlLkFSUkFZX1RZUEUoMyksVT0tUFswXSxIPS1QWzFdLFk9LVBbMl0saz1QWzNdLHJ0PVBbNF0saXQ9UFs1XSxjdD1QWzZdLGh0PVBbN10sYXQ9VSpVK0gqSCtZKlkrayprO3JldHVybiBhdD4wPyh3WzBdPShydCprK2h0KlUraXQqWS1jdCpIKSoyL2F0LHdbMV09KGl0KmsraHQqSCtjdCpVLXJ0KlkpKjIvYXQsd1syXT0oY3QqaytodCpZK3J0KkgtaXQqVSkqMi9hdCk6KHdbMF09KHJ0KmsraHQqVStpdCpZLWN0KkgpKjIsd1sxXT0oaXQqaytodCpIK2N0KlUtcnQqWSkqMix3WzJdPShjdCprK2h0KlkrcnQqSC1pdCpVKSoyKSxMKFMsUCx3KSxTfWZ1bmN0aW9uIEkoUyxQKXtyZXR1cm4gU1swXT1QWzEyXSxTWzFdPVBbMTNdLFNbMl09UFsxNF0sU31mdW5jdGlvbiBSKFMsUCl7dmFyIHc9UFswXSxVPVBbMV0sSD1QWzJdLFk9UFs0XSxrPVBbNV0scnQ9UFs2XSxpdD1QWzhdLGN0PVBbOV0saHQ9UFsxMF07cmV0dXJuIFNbMF09TWF0aC5oeXBvdCh3LFUsSCksU1sxXT1NYXRoLmh5cG90KFksayxydCksU1syXT1NYXRoLmh5cG90KGl0LGN0LGh0KSxTfWZ1bmN0aW9uIEIoUyxQKXt2YXIgdz1uZXcgZS5BUlJBWV9UWVBFKDMpO1IodyxQKTt2YXIgVT0xL3dbMF0sSD0xL3dbMV0sWT0xL3dbMl0saz1QWzBdKlUscnQ9UFsxXSpILGl0PVBbMl0qWSxjdD1QWzRdKlUsaHQ9UFs1XSpILGF0PVBbNl0qWSxvdD1QWzhdKlUsZnQ9UFs5XSpILG10PVBbMTBdKlksdnQ9aytodCttdCxwdD0wO3JldHVybiB2dD4wPyhwdD1NYXRoLnNxcnQodnQrMSkqMixTWzNdPS4yNSpwdCxTWzBdPShhdC1mdCkvcHQsU1sxXT0ob3QtaXQpL3B0LFNbMl09KHJ0LWN0KS9wdCk6az5odCYmaz5tdD8ocHQ9TWF0aC5zcXJ0KDEray1odC1tdCkqMixTWzNdPShhdC1mdCkvcHQsU1swXT0uMjUqcHQsU1sxXT0ocnQrY3QpL3B0LFNbMl09KG90K2l0KS9wdCk6aHQ+bXQ/KHB0PU1hdGguc3FydCgxK2h0LWstbXQpKjIsU1szXT0ob3QtaXQpL3B0LFNbMF09KHJ0K2N0KS9wdCxTWzFdPS4yNSpwdCxTWzJdPShhdCtmdCkvcHQpOihwdD1NYXRoLnNxcnQoMSttdC1rLWh0KSoyLFNbM109KHJ0LWN0KS9wdCxTWzBdPShvdCtpdCkvcHQsU1sxXT0oYXQrZnQpL3B0LFNbMl09LjI1KnB0KSxTfWZ1bmN0aW9uIHooUyxQLHcsVSl7dmFyIEg9UFswXSxZPVBbMV0saz1QWzJdLHJ0PVBbM10saXQ9SCtILGN0PVkrWSxodD1rK2ssYXQ9SCppdCxvdD1IKmN0LGZ0PUgqaHQsbXQ9WSpjdCx2dD1ZKmh0LHB0PWsqaHQseHQ9cnQqaXQsUnQ9cnQqY3QsRXQ9cnQqaHQsUHQ9VVswXSxBdD1VWzFdLEN0PVVbMl07cmV0dXJuIFNbMF09KDEtKG10K3B0KSkqUHQsU1sxXT0ob3QrRXQpKlB0LFNbMl09KGZ0LVJ0KSpQdCxTWzNdPTAsU1s0XT0ob3QtRXQpKkF0LFNbNV09KDEtKGF0K3B0KSkqQXQsU1s2XT0odnQreHQpKkF0LFNbN109MCxTWzhdPShmdCtSdCkqQ3QsU1s5XT0odnQteHQpKkN0LFNbMTBdPSgxLShhdCttdCkpKkN0LFNbMTFdPTAsU1sxMl09d1swXSxTWzEzXT13WzFdLFNbMTRdPXdbMl0sU1sxNV09MSxTfWZ1bmN0aW9uIEsoUyxQLHcsVSxIKXt2YXIgWT1QWzBdLGs9UFsxXSxydD1QWzJdLGl0PVBbM10sY3Q9WStZLGh0PWsrayxhdD1ydCtydCxvdD1ZKmN0LGZ0PVkqaHQsbXQ9WSphdCx2dD1rKmh0LHB0PWsqYXQseHQ9cnQqYXQsUnQ9aXQqY3QsRXQ9aXQqaHQsUHQ9aXQqYXQsQXQ9VVswXSxDdD1VWzFdLHp0PVVbMl0sanQ9SFswXSxVdD1IWzFdLCR0PUhbMl0sR3Q9KDEtKHZ0K3h0KSkqQXQsSHQ9KGZ0K1B0KSpBdCxWdD0obXQtRXQpKkF0LGJ0PShmdC1QdCkqQ3QsdGU9KDEtKG90K3h0KSkqQ3QsSWU9KHB0K1J0KSpDdCxMZT0obXQrRXQpKnp0LF9uPShwdC1SdCkqenQsdGk9KDEtKG90K3Z0KSkqenQ7cmV0dXJuIFNbMF09R3QsU1sxXT1IdCxTWzJdPVZ0LFNbM109MCxTWzRdPWJ0LFNbNV09dGUsU1s2XT1JZSxTWzddPTAsU1s4XT1MZSxTWzldPV9uLFNbMTBdPXRpLFNbMTFdPTAsU1sxMl09d1swXStqdC0oR3QqanQrYnQqVXQrTGUqJHQpLFNbMTNdPXdbMV0rVXQtKEh0Kmp0K3RlKlV0K19uKiR0KSxTWzE0XT13WzJdKyR0LShWdCpqdCtJZSpVdCt0aSokdCksU1sxNV09MSxTfWZ1bmN0aW9uIFEoUyxQKXt2YXIgdz1QWzBdLFU9UFsxXSxIPVBbMl0sWT1QWzNdLGs9dyt3LHJ0PVUrVSxpdD1IK0gsY3Q9dyprLGh0PVUqayxhdD1VKnJ0LG90PUgqayxmdD1IKnJ0LG10PUgqaXQsdnQ9WSprLHB0PVkqcnQseHQ9WSppdDtyZXR1cm4gU1swXT0xLWF0LW10LFNbMV09aHQreHQsU1syXT1vdC1wdCxTWzNdPTAsU1s0XT1odC14dCxTWzVdPTEtY3QtbXQsU1s2XT1mdCt2dCxTWzddPTAsU1s4XT1vdCtwdCxTWzldPWZ0LXZ0LFNbMTBdPTEtY3QtYXQsU1sxMV09MCxTWzEyXT0wLFNbMTNdPTAsU1sxNF09MCxTWzE1XT0xLFN9ZnVuY3Rpb24gXyhTLFAsdyxVLEgsWSxrKXt2YXIgcnQ9MS8ody1QKSxpdD0xLyhILVUpLGN0PTEvKFktayk7cmV0dXJuIFNbMF09WSoyKnJ0LFNbMV09MCxTWzJdPTAsU1szXT0wLFNbNF09MCxTWzVdPVkqMippdCxTWzZdPTAsU1s3XT0wLFNbOF09KHcrUCkqcnQsU1s5XT0oSCtVKSppdCxTWzEwXT0oaytZKSpjdCxTWzExXT0tMSxTWzEyXT0wLFNbMTNdPTAsU1sxNF09aypZKjIqY3QsU1sxNV09MCxTfWZ1bmN0aW9uIGooUyxQLHcsVSxIKXt2YXIgWT0xL01hdGgudGFuKFAvMiksaztyZXR1cm4gU1swXT1ZL3csU1sxXT0wLFNbMl09MCxTWzNdPTAsU1s0XT0wLFNbNV09WSxTWzZdPTAsU1s3XT0wLFNbOF09MCxTWzldPTAsU1sxMV09LTEsU1sxMl09MCxTWzEzXT0wLFNbMTVdPTAsSCE9bnVsbCYmSCE9PTEvMD8oaz0xLyhVLUgpLFNbMTBdPShIK1UpKmssU1sxNF09MipIKlUqayk6KFNbMTBdPS0xLFNbMTRdPS0yKlUpLFN9ZnVuY3Rpb24gRyhTLFAsdyxVKXt2YXIgSD1NYXRoLnRhbihQLnVwRGVncmVlcypNYXRoLlBJLzE4MCksWT1NYXRoLnRhbihQLmRvd25EZWdyZWVzKk1hdGguUEkvMTgwKSxrPU1hdGgudGFuKFAubGVmdERlZ3JlZXMqTWF0aC5QSS8xODApLHJ0PU1hdGgudGFuKFAucmlnaHREZWdyZWVzKk1hdGguUEkvMTgwKSxpdD0yLyhrK3J0KSxjdD0yLyhIK1kpO3JldHVybiBTWzBdPWl0LFNbMV09MCxTWzJdPTAsU1szXT0wLFNbNF09MCxTWzVdPWN0LFNbNl09MCxTWzddPTAsU1s4XT0tKChrLXJ0KSppdCouNSksU1s5XT0oSC1ZKSpjdCouNSxTWzEwXT1VLyh3LVUpLFNbMTFdPS0xLFNbMTJdPTAsU1sxM109MCxTWzE0XT1VKncvKHctVSksU1sxNV09MCxTfWZ1bmN0aW9uIFgoUyxQLHcsVSxILFksayl7dmFyIHJ0PTEvKFAtdyksaXQ9MS8oVS1IKSxjdD0xLyhZLWspO3JldHVybiBTWzBdPS0yKnJ0LFNbMV09MCxTWzJdPTAsU1szXT0wLFNbNF09MCxTWzVdPS0yKml0LFNbNl09MCxTWzddPTAsU1s4XT0wLFNbOV09MCxTWzEwXT0yKmN0LFNbMTFdPTAsU1sxMl09KFArdykqcnQsU1sxM109KEgrVSkqaXQsU1sxNF09KGsrWSkqY3QsU1sxNV09MSxTfWZ1bmN0aW9uIFooUyxQLHcsVSl7dmFyIEgsWSxrLHJ0LGl0LGN0LGh0LGF0LG90LGZ0LG10PVBbMF0sdnQ9UFsxXSxwdD1QWzJdLHh0PVVbMF0sUnQ9VVsxXSxFdD1VWzJdLFB0PXdbMF0sQXQ9d1sxXSxDdD13WzJdO3JldHVybiBNYXRoLmFicyhtdC1QdCk8ZS5FUFNJTE9OJiZNYXRoLmFicyh2dC1BdCk8ZS5FUFNJTE9OJiZNYXRoLmFicyhwdC1DdCk8ZS5FUFNJTE9OP2MoUyk6KGh0PW10LVB0LGF0PXZ0LUF0LG90PXB0LUN0LGZ0PTEvTWF0aC5oeXBvdChodCxhdCxvdCksaHQqPWZ0LGF0Kj1mdCxvdCo9ZnQsSD1SdCpvdC1FdCphdCxZPUV0Kmh0LXh0Km90LGs9eHQqYXQtUnQqaHQsZnQ9TWF0aC5oeXBvdChILFksayksZnQ/KGZ0PTEvZnQsSCo9ZnQsWSo9ZnQsayo9ZnQpOihIPTAsWT0wLGs9MCkscnQ9YXQqay1vdCpZLGl0PW90KkgtaHQqayxjdD1odCpZLWF0KkgsZnQ9TWF0aC5oeXBvdChydCxpdCxjdCksZnQ/KGZ0PTEvZnQscnQqPWZ0LGl0Kj1mdCxjdCo9ZnQpOihydD0wLGl0PTAsY3Q9MCksU1swXT1ILFNbMV09cnQsU1syXT1odCxTWzNdPTAsU1s0XT1ZLFNbNV09aXQsU1s2XT1hdCxTWzddPTAsU1s4XT1rLFNbOV09Y3QsU1sxMF09b3QsU1sxMV09MCxTWzEyXT0tKEgqbXQrWSp2dCtrKnB0KSxTWzEzXT0tKHJ0Km10K2l0KnZ0K2N0KnB0KSxTWzE0XT0tKGh0Km10K2F0KnZ0K290KnB0KSxTWzE1XT0xLFMpfWZ1bmN0aW9uIHR0KFMsUCx3LFUpe3ZhciBIPVBbMF0sWT1QWzFdLGs9UFsyXSxydD1VWzBdLGl0PVVbMV0sY3Q9VVsyXSxodD1ILXdbMF0sYXQ9WS13WzFdLG90PWstd1syXSxmdD1odCpodCthdCphdCtvdCpvdDtmdD4wJiYoZnQ9MS9NYXRoLnNxcnQoZnQpLGh0Kj1mdCxhdCo9ZnQsb3QqPWZ0KTt2YXIgbXQ9aXQqb3QtY3QqYXQsdnQ9Y3QqaHQtcnQqb3QscHQ9cnQqYXQtaXQqaHQ7cmV0dXJuIGZ0PW10Km10K3Z0KnZ0K3B0KnB0LGZ0PjAmJihmdD0xL01hdGguc3FydChmdCksbXQqPWZ0LHZ0Kj1mdCxwdCo9ZnQpLFNbMF09bXQsU1sxXT12dCxTWzJdPXB0LFNbM109MCxTWzRdPWF0KnB0LW90KnZ0LFNbNV09b3QqbXQtaHQqcHQsU1s2XT1odCp2dC1hdCptdCxTWzddPTAsU1s4XT1odCxTWzldPWF0LFNbMTBdPW90LFNbMTFdPTAsU1sxMl09SCxTWzEzXT1ZLFNbMTRdPWssU1sxNV09MSxTfWZ1bmN0aW9uIG50KFMpe3JldHVybiJtYXQ0KCIrU1swXSsiLCAiK1NbMV0rIiwgIitTWzJdKyIsICIrU1szXSsiLCAiK1NbNF0rIiwgIitTWzVdKyIsICIrU1s2XSsiLCAiK1NbN10rIiwgIitTWzhdKyIsICIrU1s5XSsiLCAiK1NbMTBdKyIsICIrU1sxMV0rIiwgIitTWzEyXSsiLCAiK1NbMTNdKyIsICIrU1sxNF0rIiwgIitTWzE1XSsiKSJ9ZnVuY3Rpb24gcShTKXtyZXR1cm4gTWF0aC5oeXBvdChTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1s4XSxTWzldLFNbMTBdLFNbMTFdLFNbMTJdLFNbMTNdLFNbMTRdLFNbMTVdKX1mdW5jdGlvbiBkdChTLFAsdyl7cmV0dXJuIFNbMF09UFswXSt3WzBdLFNbMV09UFsxXSt3WzFdLFNbMl09UFsyXSt3WzJdLFNbM109UFszXSt3WzNdLFNbNF09UFs0XSt3WzRdLFNbNV09UFs1XSt3WzVdLFNbNl09UFs2XSt3WzZdLFNbN109UFs3XSt3WzddLFNbOF09UFs4XSt3WzhdLFNbOV09UFs5XSt3WzldLFNbMTBdPVBbMTBdK3dbMTBdLFNbMTFdPVBbMTFdK3dbMTFdLFNbMTJdPVBbMTJdK3dbMTJdLFNbMTNdPVBbMTNdK3dbMTNdLFNbMTRdPVBbMTRdK3dbMTRdLFNbMTVdPVBbMTVdK3dbMTVdLFN9ZnVuY3Rpb24gdXQoUyxQLHcpe3JldHVybiBTWzBdPVBbMF0td1swXSxTWzFdPVBbMV0td1sxXSxTWzJdPVBbMl0td1syXSxTWzNdPVBbM10td1szXSxTWzRdPVBbNF0td1s0XSxTWzVdPVBbNV0td1s1XSxTWzZdPVBbNl0td1s2XSxTWzddPVBbN10td1s3XSxTWzhdPVBbOF0td1s4XSxTWzldPVBbOV0td1s5XSxTWzEwXT1QWzEwXS13WzEwXSxTWzExXT1QWzExXS13WzExXSxTWzEyXT1QWzEyXS13WzEyXSxTWzEzXT1QWzEzXS13WzEzXSxTWzE0XT1QWzE0XS13WzE0XSxTWzE1XT1QWzE1XS13WzE1XSxTfWZ1bmN0aW9uIFcoUyxQLHcpe3JldHVybiBTWzBdPVBbMF0qdyxTWzFdPVBbMV0qdyxTWzJdPVBbMl0qdyxTWzNdPVBbM10qdyxTWzRdPVBbNF0qdyxTWzVdPVBbNV0qdyxTWzZdPVBbNl0qdyxTWzddPVBbN10qdyxTWzhdPVBbOF0qdyxTWzldPVBbOV0qdyxTWzEwXT1QWzEwXSp3LFNbMTFdPVBbMTFdKncsU1sxMl09UFsxMl0qdyxTWzEzXT1QWzEzXSp3LFNbMTRdPVBbMTRdKncsU1sxNV09UFsxNV0qdyxTfWZ1bmN0aW9uIEYoUyxQLHcsVSl7cmV0dXJuIFNbMF09UFswXSt3WzBdKlUsU1sxXT1QWzFdK3dbMV0qVSxTWzJdPVBbMl0rd1syXSpVLFNbM109UFszXSt3WzNdKlUsU1s0XT1QWzRdK3dbNF0qVSxTWzVdPVBbNV0rd1s1XSpVLFNbNl09UFs2XSt3WzZdKlUsU1s3XT1QWzddK3dbN10qVSxTWzhdPVBbOF0rd1s4XSpVLFNbOV09UFs5XSt3WzldKlUsU1sxMF09UFsxMF0rd1sxMF0qVSxTWzExXT1QWzExXSt3WzExXSpVLFNbMTJdPVBbMTJdK3dbMTJdKlUsU1sxM109UFsxM10rd1sxM10qVSxTWzE0XT1QWzE0XSt3WzE0XSpVLFNbMTVdPVBbMTVdK3dbMTVdKlUsU31mdW5jdGlvbiBWKFMsUCl7cmV0dXJuIFNbMF09PT1QWzBdJiZTWzFdPT09UFsxXSYmU1syXT09PVBbMl0mJlNbM109PT1QWzNdJiZTWzRdPT09UFs0XSYmU1s1XT09PVBbNV0mJlNbNl09PT1QWzZdJiZTWzddPT09UFs3XSYmU1s4XT09PVBbOF0mJlNbOV09PT1QWzldJiZTWzEwXT09PVBbMTBdJiZTWzExXT09PVBbMTFdJiZTWzEyXT09PVBbMTJdJiZTWzEzXT09PVBbMTNdJiZTWzE0XT09PVBbMTRdJiZTWzE1XT09PVBbMTVdfWZ1bmN0aW9uIEooUyxQKXt2YXIgdz1TWzBdLFU9U1sxXSxIPVNbMl0sWT1TWzNdLGs9U1s0XSxydD1TWzVdLGl0PVNbNl0sY3Q9U1s3XSxodD1TWzhdLGF0PVNbOV0sb3Q9U1sxMF0sZnQ9U1sxMV0sbXQ9U1sxMl0sdnQ9U1sxM10scHQ9U1sxNF0seHQ9U1sxNV0sUnQ9UFswXSxFdD1QWzFdLFB0PVBbMl0sQXQ9UFszXSxDdD1QWzRdLHp0PVBbNV0sanQ9UFs2XSxVdD1QWzddLCR0PVBbOF0sR3Q9UFs5XSxIdD1QWzEwXSxWdD1QWzExXSxidD1QWzEyXSx0ZT1QWzEzXSxJZT1QWzE0XSxMZT1QWzE1XTtyZXR1cm4gTWF0aC5hYnMody1SdCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHcpLE1hdGguYWJzKFJ0KSkmJk1hdGguYWJzKFUtRXQpPD1lLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhVKSxNYXRoLmFicyhFdCkpJiZNYXRoLmFicyhILVB0KTw9ZS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoSCksTWF0aC5hYnMoUHQpKSYmTWF0aC5hYnMoWS1BdCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKFkpLE1hdGguYWJzKEF0KSkmJk1hdGguYWJzKGstQ3QpPD1lLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhrKSxNYXRoLmFicyhDdCkpJiZNYXRoLmFicyhydC16dCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHJ0KSxNYXRoLmFicyh6dCkpJiZNYXRoLmFicyhpdC1qdCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGl0KSxNYXRoLmFicyhqdCkpJiZNYXRoLmFicyhjdC1VdCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGN0KSxNYXRoLmFicyhVdCkpJiZNYXRoLmFicyhodC0kdCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGh0KSxNYXRoLmFicygkdCkpJiZNYXRoLmFicyhhdC1HdCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGF0KSxNYXRoLmFicyhHdCkpJiZNYXRoLmFicyhvdC1IdCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKG90KSxNYXRoLmFicyhIdCkpJiZNYXRoLmFicyhmdC1WdCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGZ0KSxNYXRoLmFicyhWdCkpJiZNYXRoLmFicyhtdC1idCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKG10KSxNYXRoLmFicyhidCkpJiZNYXRoLmFicyh2dC10ZSk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHZ0KSxNYXRoLmFicyh0ZSkpJiZNYXRoLmFicyhwdC1JZSk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHB0KSxNYXRoLmFicyhJZSkpJiZNYXRoLmFicyh4dC1MZSk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHh0KSxNYXRoLmFicyhMZSkpfXZhciBOPU8sJD11dH0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiY3JlYXRlIixmdW5jdGlvbigpe3JldHVybiBpfSksdC5kKHIsImlkZW50aXR5IixmdW5jdGlvbigpe3JldHVybiBvfSksdC5kKHIsInNldEF4aXNBbmdsZSIsZnVuY3Rpb24oKXtyZXR1cm4gY30pLHQuZChyLCJnZXRBeGlzQW5nbGUiLGZ1bmN0aW9uKCl7cmV0dXJuIG19KSx0LmQociwiZ2V0QW5nbGUiLGZ1bmN0aW9uKCl7cmV0dXJuIHV9KSx0LmQociwibXVsdGlwbHkiLGZ1bmN0aW9uKCl7cmV0dXJuIHB9KSx0LmQociwicm90YXRlWCIsZnVuY3Rpb24oKXtyZXR1cm4geX0pLHQuZChyLCJyb3RhdGVZIixmdW5jdGlvbigpe3JldHVybiBPfSksdC5kKHIsInJvdGF0ZVoiLGZ1bmN0aW9uKCl7cmV0dXJuIHh9KSx0LmQociwiY2FsY3VsYXRlVyIsZnVuY3Rpb24oKXtyZXR1cm4gdn0pLHQuZChyLCJleHAiLGZ1bmN0aW9uKCl7cmV0dXJuIFR9KSx0LmQociwibG4iLGZ1bmN0aW9uKCl7cmV0dXJuIGx9KSx0LmQociwicG93IixmdW5jdGlvbigpe3JldHVybiBofSksdC5kKHIsInNsZXJwIixmdW5jdGlvbigpe3JldHVybiBmfSksdC5kKHIsInJhbmRvbSIsZnVuY3Rpb24oKXtyZXR1cm4gZ30pLHQuZChyLCJpbnZlcnQiLGZ1bmN0aW9uKCl7cmV0dXJuIE19KSx0LmQociwiY29uanVnYXRlIixmdW5jdGlvbigpe3JldHVybiBBfSksdC5kKHIsImZyb21NYXQzIixmdW5jdGlvbigpe3JldHVybiBDfSksdC5kKHIsImZyb21FdWxlciIsZnVuY3Rpb24oKXtyZXR1cm4gYn0pLHQuZChyLCJzdHIiLGZ1bmN0aW9uKCl7cmV0dXJuIEV9KSx0LmQociwiY2xvbmUiLGZ1bmN0aW9uKCl7cmV0dXJuIEx9KSx0LmQociwiZnJvbVZhbHVlcyIsZnVuY3Rpb24oKXtyZXR1cm4gRH0pLHQuZChyLCJjb3B5IixmdW5jdGlvbigpe3JldHVybiBJfSksdC5kKHIsInNldCIsZnVuY3Rpb24oKXtyZXR1cm4gUn0pLHQuZChyLCJhZGQiLGZ1bmN0aW9uKCl7cmV0dXJuIEJ9KSx0LmQociwibXVsIixmdW5jdGlvbigpe3JldHVybiB6fSksdC5kKHIsInNjYWxlIixmdW5jdGlvbigpe3JldHVybiBLfSksdC5kKHIsImRvdCIsZnVuY3Rpb24oKXtyZXR1cm4gUX0pLHQuZChyLCJsZXJwIixmdW5jdGlvbigpe3JldHVybiBffSksdC5kKHIsImxlbmd0aCIsZnVuY3Rpb24oKXtyZXR1cm4gan0pLHQuZChyLCJsZW4iLGZ1bmN0aW9uKCl7cmV0dXJuIEd9KSx0LmQociwic3F1YXJlZExlbmd0aCIsZnVuY3Rpb24oKXtyZXR1cm4gWH0pLHQuZChyLCJzcXJMZW4iLGZ1bmN0aW9uKCl7cmV0dXJuIFp9KSx0LmQociwibm9ybWFsaXplIixmdW5jdGlvbigpe3JldHVybiB0dH0pLHQuZChyLCJleGFjdEVxdWFscyIsZnVuY3Rpb24oKXtyZXR1cm4gbnR9KSx0LmQociwiZXF1YWxzIixmdW5jdGlvbigpe3JldHVybiBxfSksdC5kKHIsInJvdGF0aW9uVG8iLGZ1bmN0aW9uKCl7cmV0dXJuIGR0fSksdC5kKHIsInNxbGVycCIsZnVuY3Rpb24oKXtyZXR1cm4gdXR9KSx0LmQociwic2V0QXhlcyIsZnVuY3Rpb24oKXtyZXR1cm4gV30pO3ZhciBlPXQoMiksbj10KDUpLGE9dCg4KSxzPXQoOSk7ZnVuY3Rpb24gaSgpe3ZhciBGPW5ldyBlLkFSUkFZX1RZUEUoNCk7cmV0dXJuIGUuQVJSQVlfVFlQRSE9RmxvYXQzMkFycmF5JiYoRlswXT0wLEZbMV09MCxGWzJdPTApLEZbM109MSxGfWZ1bmN0aW9uIG8oRil7cmV0dXJuIEZbMF09MCxGWzFdPTAsRlsyXT0wLEZbM109MSxGfWZ1bmN0aW9uIGMoRixWLEope0o9SiouNTt2YXIgTj1NYXRoLnNpbihKKTtyZXR1cm4gRlswXT1OKlZbMF0sRlsxXT1OKlZbMV0sRlsyXT1OKlZbMl0sRlszXT1NYXRoLmNvcyhKKSxGfWZ1bmN0aW9uIG0oRixWKXt2YXIgSj1NYXRoLmFjb3MoVlszXSkqMixOPU1hdGguc2luKEovMik7cmV0dXJuIE4+ZS5FUFNJTE9OPyhGWzBdPVZbMF0vTixGWzFdPVZbMV0vTixGWzJdPVZbMl0vTik6KEZbMF09MSxGWzFdPTAsRlsyXT0wKSxKfWZ1bmN0aW9uIHUoRixWKXt2YXIgSj1RKEYsVik7cmV0dXJuIE1hdGguYWNvcygyKkoqSi0xKX1mdW5jdGlvbiBwKEYsVixKKXt2YXIgTj1WWzBdLCQ9VlsxXSxTPVZbMl0sUD1WWzNdLHc9SlswXSxVPUpbMV0sSD1KWzJdLFk9SlszXTtyZXR1cm4gRlswXT1OKlkrUCp3KyQqSC1TKlUsRlsxXT0kKlkrUCpVK1Mqdy1OKkgsRlsyXT1TKlkrUCpIK04qVS0kKncsRlszXT1QKlktTip3LSQqVS1TKkgsRn1mdW5jdGlvbiB5KEYsVixKKXtKKj0uNTt2YXIgTj1WWzBdLCQ9VlsxXSxTPVZbMl0sUD1WWzNdLHc9TWF0aC5zaW4oSiksVT1NYXRoLmNvcyhKKTtyZXR1cm4gRlswXT1OKlUrUCp3LEZbMV09JCpVK1MqdyxGWzJdPVMqVS0kKncsRlszXT1QKlUtTip3LEZ9ZnVuY3Rpb24gTyhGLFYsSil7Sio9LjU7dmFyIE49VlswXSwkPVZbMV0sUz1WWzJdLFA9VlszXSx3PU1hdGguc2luKEopLFU9TWF0aC5jb3MoSik7cmV0dXJuIEZbMF09TipVLVMqdyxGWzFdPSQqVStQKncsRlsyXT1TKlUrTip3LEZbM109UCpVLSQqdyxGfWZ1bmN0aW9uIHgoRixWLEope0oqPS41O3ZhciBOPVZbMF0sJD1WWzFdLFM9VlsyXSxQPVZbM10sdz1NYXRoLnNpbihKKSxVPU1hdGguY29zKEopO3JldHVybiBGWzBdPU4qVSskKncsRlsxXT0kKlUtTip3LEZbMl09UypVK1AqdyxGWzNdPVAqVS1TKncsRn1mdW5jdGlvbiB2KEYsVil7dmFyIEo9VlswXSxOPVZbMV0sJD1WWzJdO3JldHVybiBGWzBdPUosRlsxXT1OLEZbMl09JCxGWzNdPU1hdGguc3FydChNYXRoLmFicygxLUoqSi1OKk4tJCokKSksRn1mdW5jdGlvbiBUKEYsVil7dmFyIEo9VlswXSxOPVZbMV0sJD1WWzJdLFM9VlszXSxQPU1hdGguc3FydChKKkorTipOKyQqJCksdz1NYXRoLmV4cChTKSxVPVA+MD93Kk1hdGguc2luKFApL1A6MDtyZXR1cm4gRlswXT1KKlUsRlsxXT1OKlUsRlsyXT0kKlUsRlszXT13Kk1hdGguY29zKFApLEZ9ZnVuY3Rpb24gbChGLFYpe3ZhciBKPVZbMF0sTj1WWzFdLCQ9VlsyXSxTPVZbM10sUD1NYXRoLnNxcnQoSipKK04qTiskKiQpLHc9UD4wP01hdGguYXRhbjIoUCxTKS9QOjA7cmV0dXJuIEZbMF09Sip3LEZbMV09Tip3LEZbMl09JCp3LEZbM109LjUqTWF0aC5sb2coSipKK04qTiskKiQrUypTKSxGfWZ1bmN0aW9uIGgoRixWLEope3JldHVybiBsKEYsViksSyhGLEYsSiksVChGLEYpLEZ9ZnVuY3Rpb24gZihGLFYsSixOKXt2YXIgJD1WWzBdLFM9VlsxXSxQPVZbMl0sdz1WWzNdLFU9SlswXSxIPUpbMV0sWT1KWzJdLGs9SlszXSxydCxpdCxjdCxodCxhdDtyZXR1cm4gaXQ9JCpVK1MqSCtQKlkrdyprLGl0PDAmJihpdD0taXQsVT0tVSxIPS1ILFk9LVksaz0tayksMS1pdD5lLkVQU0lMT04/KHJ0PU1hdGguYWNvcyhpdCksY3Q9TWF0aC5zaW4ocnQpLGh0PU1hdGguc2luKCgxLU4pKnJ0KS9jdCxhdD1NYXRoLnNpbihOKnJ0KS9jdCk6KGh0PTEtTixhdD1OKSxGWzBdPWh0KiQrYXQqVSxGWzFdPWh0KlMrYXQqSCxGWzJdPWh0KlArYXQqWSxGWzNdPWh0KncrYXQqayxGfWZ1bmN0aW9uIGcoRil7dmFyIFY9ZS5SQU5ET00oKSxKPWUuUkFORE9NKCksTj1lLlJBTkRPTSgpLCQ9TWF0aC5zcXJ0KDEtViksUz1NYXRoLnNxcnQoVik7cmV0dXJuIEZbMF09JCpNYXRoLnNpbigyKk1hdGguUEkqSiksRlsxXT0kKk1hdGguY29zKDIqTWF0aC5QSSpKKSxGWzJdPVMqTWF0aC5zaW4oMipNYXRoLlBJKk4pLEZbM109UypNYXRoLmNvcygyKk1hdGguUEkqTiksRn1mdW5jdGlvbiBNKEYsVil7dmFyIEo9VlswXSxOPVZbMV0sJD1WWzJdLFM9VlszXSxQPUoqSitOKk4rJCokK1MqUyx3PVA/MS9QOjA7cmV0dXJuIEZbMF09LUoqdyxGWzFdPS1OKncsRlsyXT0tJCp3LEZbM109Uyp3LEZ9ZnVuY3Rpb24gQShGLFYpe3JldHVybiBGWzBdPS1WWzBdLEZbMV09LVZbMV0sRlsyXT0tVlsyXSxGWzNdPVZbM10sRn1mdW5jdGlvbiBDKEYsVil7dmFyIEo9VlswXStWWzRdK1ZbOF0sTjtpZihKPjApTj1NYXRoLnNxcnQoSisxKSxGWzNdPS41Kk4sTj0uNS9OLEZbMF09KFZbNV0tVls3XSkqTixGWzFdPShWWzZdLVZbMl0pKk4sRlsyXT0oVlsxXS1WWzNdKSpOO2Vsc2V7dmFyICQ9MDtWWzRdPlZbMF0mJigkPTEpLFZbOF0+VlskKjMrJF0mJigkPTIpO3ZhciBTPSgkKzEpJTMsUD0oJCsyKSUzO049TWF0aC5zcXJ0KFZbJCozKyRdLVZbUyozK1NdLVZbUCozK1BdKzEpLEZbJF09LjUqTixOPS41L04sRlszXT0oVltTKjMrUF0tVltQKjMrU10pKk4sRltTXT0oVltTKjMrJF0rVlskKjMrU10pKk4sRltQXT0oVltQKjMrJF0rVlskKjMrUF0pKk59cmV0dXJuIEZ9ZnVuY3Rpb24gYihGLFYsSixOKXt2YXIgJD0uNSpNYXRoLlBJLzE4MDtWKj0kLEoqPSQsTio9JDt2YXIgUz1NYXRoLnNpbihWKSxQPU1hdGguY29zKFYpLHc9TWF0aC5zaW4oSiksVT1NYXRoLmNvcyhKKSxIPU1hdGguc2luKE4pLFk9TWF0aC5jb3MoTik7cmV0dXJuIEZbMF09UypVKlktUCp3KkgsRlsxXT1QKncqWStTKlUqSCxGWzJdPVAqVSpILVMqdypZLEZbM109UCpVKlkrUyp3KkgsRn1mdW5jdGlvbiBFKEYpe3JldHVybiJxdWF0KCIrRlswXSsiLCAiK0ZbMV0rIiwgIitGWzJdKyIsICIrRlszXSsiKSJ9dmFyIEw9cy5jbG9uZSxEPXMuZnJvbVZhbHVlcyxJPXMuY29weSxSPXMuc2V0LEI9cy5hZGQsej1wLEs9cy5zY2FsZSxRPXMuZG90LF89cy5sZXJwLGo9cy5sZW5ndGgsRz1qLFg9cy5zcXVhcmVkTGVuZ3RoLFo9WCx0dD1zLm5vcm1hbGl6ZSxudD1zLmV4YWN0RXF1YWxzLHE9cy5lcXVhbHMsZHQ9ZnVuY3Rpb24oKXt2YXIgRj1hLmNyZWF0ZSgpLFY9YS5mcm9tVmFsdWVzKDEsMCwwKSxKPWEuZnJvbVZhbHVlcygwLDEsMCk7cmV0dXJuIGZ1bmN0aW9uKE4sJCxTKXt2YXIgUD1hLmRvdCgkLFMpO3JldHVybiBQPC0uOTk5OTk5PyhhLmNyb3NzKEYsViwkKSxhLmxlbihGKTwxZS02JiZhLmNyb3NzKEYsSiwkKSxhLm5vcm1hbGl6ZShGLEYpLGMoTixGLE1hdGguUEkpLE4pOlA+Ljk5OTk5OT8oTlswXT0wLE5bMV09MCxOWzJdPTAsTlszXT0xLE4pOihhLmNyb3NzKEYsJCxTKSxOWzBdPUZbMF0sTlsxXT1GWzFdLE5bMl09RlsyXSxOWzNdPTErUCx0dChOLE4pKX19KCksdXQ9ZnVuY3Rpb24oKXt2YXIgRj1pKCksVj1pKCk7cmV0dXJuIGZ1bmN0aW9uKEosTiwkLFMsUCx3KXtyZXR1cm4gZihGLE4sUCx3KSxmKFYsJCxTLHcpLGYoSixGLFYsMip3KigxLXcpKSxKfX0oKSxXPWZ1bmN0aW9uKCl7dmFyIEY9bi5jcmVhdGUoKTtyZXR1cm4gZnVuY3Rpb24oVixKLE4sJCl7cmV0dXJuIEZbMF09TlswXSxGWzNdPU5bMV0sRls2XT1OWzJdLEZbMV09JFswXSxGWzRdPSRbMV0sRls3XT0kWzJdLEZbMl09LUpbMF0sRls1XT0tSlsxXSxGWzhdPS1KWzJdLHR0KFYsQyhWLEYpKX19KCl9LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImNyZWF0ZSIsZnVuY3Rpb24oKXtyZXR1cm4gbn0pLHQuZChyLCJjbG9uZSIsZnVuY3Rpb24oKXtyZXR1cm4gYX0pLHQuZChyLCJsZW5ndGgiLGZ1bmN0aW9uKCl7cmV0dXJuIHN9KSx0LmQociwiZnJvbVZhbHVlcyIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pLHQuZChyLCJjb3B5IixmdW5jdGlvbigpe3JldHVybiBvfSksdC5kKHIsInNldCIsZnVuY3Rpb24oKXtyZXR1cm4gY30pLHQuZChyLCJhZGQiLGZ1bmN0aW9uKCl7cmV0dXJuIG19KSx0LmQociwic3VidHJhY3QiLGZ1bmN0aW9uKCl7cmV0dXJuIHV9KSx0LmQociwibXVsdGlwbHkiLGZ1bmN0aW9uKCl7cmV0dXJuIHB9KSx0LmQociwiZGl2aWRlIixmdW5jdGlvbigpe3JldHVybiB5fSksdC5kKHIsImNlaWwiLGZ1bmN0aW9uKCl7cmV0dXJuIE99KSx0LmQociwiZmxvb3IiLGZ1bmN0aW9uKCl7cmV0dXJuIHh9KSx0LmQociwibWluIixmdW5jdGlvbigpe3JldHVybiB2fSksdC5kKHIsIm1heCIsZnVuY3Rpb24oKXtyZXR1cm4gVH0pLHQuZChyLCJyb3VuZCIsZnVuY3Rpb24oKXtyZXR1cm4gbH0pLHQuZChyLCJzY2FsZSIsZnVuY3Rpb24oKXtyZXR1cm4gaH0pLHQuZChyLCJzY2FsZUFuZEFkZCIsZnVuY3Rpb24oKXtyZXR1cm4gZn0pLHQuZChyLCJkaXN0YW5jZSIsZnVuY3Rpb24oKXtyZXR1cm4gZ30pLHQuZChyLCJzcXVhcmVkRGlzdGFuY2UiLGZ1bmN0aW9uKCl7cmV0dXJuIE19KSx0LmQociwic3F1YXJlZExlbmd0aCIsZnVuY3Rpb24oKXtyZXR1cm4gQX0pLHQuZChyLCJuZWdhdGUiLGZ1bmN0aW9uKCl7cmV0dXJuIEN9KSx0LmQociwiaW52ZXJzZSIsZnVuY3Rpb24oKXtyZXR1cm4gYn0pLHQuZChyLCJub3JtYWxpemUiLGZ1bmN0aW9uKCl7cmV0dXJuIEV9KSx0LmQociwiZG90IixmdW5jdGlvbigpe3JldHVybiBMfSksdC5kKHIsImNyb3NzIixmdW5jdGlvbigpe3JldHVybiBEfSksdC5kKHIsImxlcnAiLGZ1bmN0aW9uKCl7cmV0dXJuIEl9KSx0LmQociwiaGVybWl0ZSIsZnVuY3Rpb24oKXtyZXR1cm4gUn0pLHQuZChyLCJiZXppZXIiLGZ1bmN0aW9uKCl7cmV0dXJuIEJ9KSx0LmQociwicmFuZG9tIixmdW5jdGlvbigpe3JldHVybiB6fSksdC5kKHIsInRyYW5zZm9ybU1hdDQiLGZ1bmN0aW9uKCl7cmV0dXJuIEt9KSx0LmQociwidHJhbnNmb3JtTWF0MyIsZnVuY3Rpb24oKXtyZXR1cm4gUX0pLHQuZChyLCJ0cmFuc2Zvcm1RdWF0IixmdW5jdGlvbigpe3JldHVybiBffSksdC5kKHIsInJvdGF0ZVgiLGZ1bmN0aW9uKCl7cmV0dXJuIGp9KSx0LmQociwicm90YXRlWSIsZnVuY3Rpb24oKXtyZXR1cm4gR30pLHQuZChyLCJyb3RhdGVaIixmdW5jdGlvbigpe3JldHVybiBYfSksdC5kKHIsImFuZ2xlIixmdW5jdGlvbigpe3JldHVybiBafSksdC5kKHIsInplcm8iLGZ1bmN0aW9uKCl7cmV0dXJuIHR0fSksdC5kKHIsInN0ciIsZnVuY3Rpb24oKXtyZXR1cm4gbnR9KSx0LmQociwiZXhhY3RFcXVhbHMiLGZ1bmN0aW9uKCl7cmV0dXJuIHF9KSx0LmQociwiZXF1YWxzIixmdW5jdGlvbigpe3JldHVybiBkdH0pLHQuZChyLCJzdWIiLGZ1bmN0aW9uKCl7cmV0dXJuIHV0fSksdC5kKHIsIm11bCIsZnVuY3Rpb24oKXtyZXR1cm4gV30pLHQuZChyLCJkaXYiLGZ1bmN0aW9uKCl7cmV0dXJuIEZ9KSx0LmQociwiZGlzdCIsZnVuY3Rpb24oKXtyZXR1cm4gVn0pLHQuZChyLCJzcXJEaXN0IixmdW5jdGlvbigpe3JldHVybiBKfSksdC5kKHIsImxlbiIsZnVuY3Rpb24oKXtyZXR1cm4gTn0pLHQuZChyLCJzcXJMZW4iLGZ1bmN0aW9uKCl7cmV0dXJuICR9KSx0LmQociwiZm9yRWFjaCIsZnVuY3Rpb24oKXtyZXR1cm4gU30pO3ZhciBlPXQoMik7ZnVuY3Rpb24gbigpe3ZhciBQPW5ldyBlLkFSUkFZX1RZUEUoMyk7cmV0dXJuIGUuQVJSQVlfVFlQRSE9RmxvYXQzMkFycmF5JiYoUFswXT0wLFBbMV09MCxQWzJdPTApLFB9ZnVuY3Rpb24gYShQKXt2YXIgdz1uZXcgZS5BUlJBWV9UWVBFKDMpO3JldHVybiB3WzBdPVBbMF0sd1sxXT1QWzFdLHdbMl09UFsyXSx3fWZ1bmN0aW9uIHMoUCl7dmFyIHc9UFswXSxVPVBbMV0sSD1QWzJdO3JldHVybiBNYXRoLmh5cG90KHcsVSxIKX1mdW5jdGlvbiBpKFAsdyxVKXt2YXIgSD1uZXcgZS5BUlJBWV9UWVBFKDMpO3JldHVybiBIWzBdPVAsSFsxXT13LEhbMl09VSxIfWZ1bmN0aW9uIG8oUCx3KXtyZXR1cm4gUFswXT13WzBdLFBbMV09d1sxXSxQWzJdPXdbMl0sUH1mdW5jdGlvbiBjKFAsdyxVLEgpe3JldHVybiBQWzBdPXcsUFsxXT1VLFBbMl09SCxQfWZ1bmN0aW9uIG0oUCx3LFUpe3JldHVybiBQWzBdPXdbMF0rVVswXSxQWzFdPXdbMV0rVVsxXSxQWzJdPXdbMl0rVVsyXSxQfWZ1bmN0aW9uIHUoUCx3LFUpe3JldHVybiBQWzBdPXdbMF0tVVswXSxQWzFdPXdbMV0tVVsxXSxQWzJdPXdbMl0tVVsyXSxQfWZ1bmN0aW9uIHAoUCx3LFUpe3JldHVybiBQWzBdPXdbMF0qVVswXSxQWzFdPXdbMV0qVVsxXSxQWzJdPXdbMl0qVVsyXSxQfWZ1bmN0aW9uIHkoUCx3LFUpe3JldHVybiBQWzBdPXdbMF0vVVswXSxQWzFdPXdbMV0vVVsxXSxQWzJdPXdbMl0vVVsyXSxQfWZ1bmN0aW9uIE8oUCx3KXtyZXR1cm4gUFswXT1NYXRoLmNlaWwod1swXSksUFsxXT1NYXRoLmNlaWwod1sxXSksUFsyXT1NYXRoLmNlaWwod1syXSksUH1mdW5jdGlvbiB4KFAsdyl7cmV0dXJuIFBbMF09TWF0aC5mbG9vcih3WzBdKSxQWzFdPU1hdGguZmxvb3Iod1sxXSksUFsyXT1NYXRoLmZsb29yKHdbMl0pLFB9ZnVuY3Rpb24gdihQLHcsVSl7cmV0dXJuIFBbMF09TWF0aC5taW4od1swXSxVWzBdKSxQWzFdPU1hdGgubWluKHdbMV0sVVsxXSksUFsyXT1NYXRoLm1pbih3WzJdLFVbMl0pLFB9ZnVuY3Rpb24gVChQLHcsVSl7cmV0dXJuIFBbMF09TWF0aC5tYXgod1swXSxVWzBdKSxQWzFdPU1hdGgubWF4KHdbMV0sVVsxXSksUFsyXT1NYXRoLm1heCh3WzJdLFVbMl0pLFB9ZnVuY3Rpb24gbChQLHcpe3JldHVybiBQWzBdPU1hdGgucm91bmQod1swXSksUFsxXT1NYXRoLnJvdW5kKHdbMV0pLFBbMl09TWF0aC5yb3VuZCh3WzJdKSxQfWZ1bmN0aW9uIGgoUCx3LFUpe3JldHVybiBQWzBdPXdbMF0qVSxQWzFdPXdbMV0qVSxQWzJdPXdbMl0qVSxQfWZ1bmN0aW9uIGYoUCx3LFUsSCl7cmV0dXJuIFBbMF09d1swXStVWzBdKkgsUFsxXT13WzFdK1VbMV0qSCxQWzJdPXdbMl0rVVsyXSpILFB9ZnVuY3Rpb24gZyhQLHcpe3ZhciBVPXdbMF0tUFswXSxIPXdbMV0tUFsxXSxZPXdbMl0tUFsyXTtyZXR1cm4gTWF0aC5oeXBvdChVLEgsWSl9ZnVuY3Rpb24gTShQLHcpe3ZhciBVPXdbMF0tUFswXSxIPXdbMV0tUFsxXSxZPXdbMl0tUFsyXTtyZXR1cm4gVSpVK0gqSCtZKll9ZnVuY3Rpb24gQShQKXt2YXIgdz1QWzBdLFU9UFsxXSxIPVBbMl07cmV0dXJuIHcqdytVKlUrSCpIfWZ1bmN0aW9uIEMoUCx3KXtyZXR1cm4gUFswXT0td1swXSxQWzFdPS13WzFdLFBbMl09LXdbMl0sUH1mdW5jdGlvbiBiKFAsdyl7cmV0dXJuIFBbMF09MS93WzBdLFBbMV09MS93WzFdLFBbMl09MS93WzJdLFB9ZnVuY3Rpb24gRShQLHcpe3ZhciBVPXdbMF0sSD13WzFdLFk9d1syXSxrPVUqVStIKkgrWSpZO3JldHVybiBrPjAmJihrPTEvTWF0aC5zcXJ0KGspKSxQWzBdPXdbMF0qayxQWzFdPXdbMV0qayxQWzJdPXdbMl0qayxQfWZ1bmN0aW9uIEwoUCx3KXtyZXR1cm4gUFswXSp3WzBdK1BbMV0qd1sxXStQWzJdKndbMl19ZnVuY3Rpb24gRChQLHcsVSl7dmFyIEg9d1swXSxZPXdbMV0saz13WzJdLHJ0PVVbMF0saXQ9VVsxXSxjdD1VWzJdO3JldHVybiBQWzBdPVkqY3QtayppdCxQWzFdPWsqcnQtSCpjdCxQWzJdPUgqaXQtWSpydCxQfWZ1bmN0aW9uIEkoUCx3LFUsSCl7dmFyIFk9d1swXSxrPXdbMV0scnQ9d1syXTtyZXR1cm4gUFswXT1ZK0gqKFVbMF0tWSksUFsxXT1rK0gqKFVbMV0tayksUFsyXT1ydCtIKihVWzJdLXJ0KSxQfWZ1bmN0aW9uIFIoUCx3LFUsSCxZLGspe3ZhciBydD1rKmssaXQ9cnQqKDIqay0zKSsxLGN0PXJ0KihrLTIpK2ssaHQ9cnQqKGstMSksYXQ9cnQqKDMtMiprKTtyZXR1cm4gUFswXT13WzBdKml0K1VbMF0qY3QrSFswXSpodCtZWzBdKmF0LFBbMV09d1sxXSppdCtVWzFdKmN0K0hbMV0qaHQrWVsxXSphdCxQWzJdPXdbMl0qaXQrVVsyXSpjdCtIWzJdKmh0K1lbMl0qYXQsUH1mdW5jdGlvbiBCKFAsdyxVLEgsWSxrKXt2YXIgcnQ9MS1rLGl0PXJ0KnJ0LGN0PWsqayxodD1pdCpydCxhdD0zKmsqaXQsb3Q9MypjdCpydCxmdD1jdCprO3JldHVybiBQWzBdPXdbMF0qaHQrVVswXSphdCtIWzBdKm90K1lbMF0qZnQsUFsxXT13WzFdKmh0K1VbMV0qYXQrSFsxXSpvdCtZWzFdKmZ0LFBbMl09d1syXSpodCtVWzJdKmF0K0hbMl0qb3QrWVsyXSpmdCxQfWZ1bmN0aW9uIHooUCx3KXt3PXd8fDE7dmFyIFU9ZS5SQU5ET00oKSoyKk1hdGguUEksSD1lLlJBTkRPTSgpKjItMSxZPU1hdGguc3FydCgxLUgqSCkqdztyZXR1cm4gUFswXT1NYXRoLmNvcyhVKSpZLFBbMV09TWF0aC5zaW4oVSkqWSxQWzJdPUgqdyxQfWZ1bmN0aW9uIEsoUCx3LFUpe3ZhciBIPXdbMF0sWT13WzFdLGs9d1syXSxydD1VWzNdKkgrVVs3XSpZK1VbMTFdKmsrVVsxNV07cmV0dXJuIHJ0PXJ0fHwxLFBbMF09KFVbMF0qSCtVWzRdKlkrVVs4XSprK1VbMTJdKS9ydCxQWzFdPShVWzFdKkgrVVs1XSpZK1VbOV0qaytVWzEzXSkvcnQsUFsyXT0oVVsyXSpIK1VbNl0qWStVWzEwXSprK1VbMTRdKS9ydCxQfWZ1bmN0aW9uIFEoUCx3LFUpe3ZhciBIPXdbMF0sWT13WzFdLGs9d1syXTtyZXR1cm4gUFswXT1IKlVbMF0rWSpVWzNdK2sqVVs2XSxQWzFdPUgqVVsxXStZKlVbNF0raypVWzddLFBbMl09SCpVWzJdK1kqVVs1XStrKlVbOF0sUH1mdW5jdGlvbiBfKFAsdyxVKXt2YXIgSD1VWzBdLFk9VVsxXSxrPVVbMl0scnQ9VVszXSxpdD13WzBdLGN0PXdbMV0saHQ9d1syXSxhdD1ZKmh0LWsqY3Qsb3Q9ayppdC1IKmh0LGZ0PUgqY3QtWSppdCxtdD1ZKmZ0LWsqb3QsdnQ9ayphdC1IKmZ0LHB0PUgqb3QtWSphdCx4dD1ydCoyO3JldHVybiBhdCo9eHQsb3QqPXh0LGZ0Kj14dCxtdCo9Mix2dCo9MixwdCo9MixQWzBdPWl0K2F0K210LFBbMV09Y3Qrb3QrdnQsUFsyXT1odCtmdCtwdCxQfWZ1bmN0aW9uIGooUCx3LFUsSCl7dmFyIFk9W10saz1bXTtyZXR1cm4gWVswXT13WzBdLVVbMF0sWVsxXT13WzFdLVVbMV0sWVsyXT13WzJdLVVbMl0sa1swXT1ZWzBdLGtbMV09WVsxXSpNYXRoLmNvcyhIKS1ZWzJdKk1hdGguc2luKEgpLGtbMl09WVsxXSpNYXRoLnNpbihIKStZWzJdKk1hdGguY29zKEgpLFBbMF09a1swXStVWzBdLFBbMV09a1sxXStVWzFdLFBbMl09a1syXStVWzJdLFB9ZnVuY3Rpb24gRyhQLHcsVSxIKXt2YXIgWT1bXSxrPVtdO3JldHVybiBZWzBdPXdbMF0tVVswXSxZWzFdPXdbMV0tVVsxXSxZWzJdPXdbMl0tVVsyXSxrWzBdPVlbMl0qTWF0aC5zaW4oSCkrWVswXSpNYXRoLmNvcyhIKSxrWzFdPVlbMV0sa1syXT1ZWzJdKk1hdGguY29zKEgpLVlbMF0qTWF0aC5zaW4oSCksUFswXT1rWzBdK1VbMF0sUFsxXT1rWzFdK1VbMV0sUFsyXT1rWzJdK1VbMl0sUH1mdW5jdGlvbiBYKFAsdyxVLEgpe3ZhciBZPVtdLGs9W107cmV0dXJuIFlbMF09d1swXS1VWzBdLFlbMV09d1sxXS1VWzFdLFlbMl09d1syXS1VWzJdLGtbMF09WVswXSpNYXRoLmNvcyhIKS1ZWzFdKk1hdGguc2luKEgpLGtbMV09WVswXSpNYXRoLnNpbihIKStZWzFdKk1hdGguY29zKEgpLGtbMl09WVsyXSxQWzBdPWtbMF0rVVswXSxQWzFdPWtbMV0rVVsxXSxQWzJdPWtbMl0rVVsyXSxQfWZ1bmN0aW9uIFooUCx3KXt2YXIgVT1QWzBdLEg9UFsxXSxZPVBbMl0saz13WzBdLHJ0PXdbMV0saXQ9d1syXSxjdD1NYXRoLnNxcnQoVSpVK0gqSCtZKlkpLGh0PU1hdGguc3FydChrKmsrcnQqcnQraXQqaXQpLGF0PWN0Kmh0LG90PWF0JiZMKFAsdykvYXQ7cmV0dXJuIE1hdGguYWNvcyhNYXRoLm1pbihNYXRoLm1heChvdCwtMSksMSkpfWZ1bmN0aW9uIHR0KFApe3JldHVybiBQWzBdPTAsUFsxXT0wLFBbMl09MCxQfWZ1bmN0aW9uIG50KFApe3JldHVybiJ2ZWMzKCIrUFswXSsiLCAiK1BbMV0rIiwgIitQWzJdKyIpIn1mdW5jdGlvbiBxKFAsdyl7cmV0dXJuIFBbMF09PT13WzBdJiZQWzFdPT09d1sxXSYmUFsyXT09PXdbMl19ZnVuY3Rpb24gZHQoUCx3KXt2YXIgVT1QWzBdLEg9UFsxXSxZPVBbMl0saz13WzBdLHJ0PXdbMV0saXQ9d1syXTtyZXR1cm4gTWF0aC5hYnMoVS1rKTw9ZS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoVSksTWF0aC5hYnMoaykpJiZNYXRoLmFicyhILXJ0KTw9ZS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoSCksTWF0aC5hYnMocnQpKSYmTWF0aC5hYnMoWS1pdCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKFkpLE1hdGguYWJzKGl0KSl9dmFyIHV0PXUsVz1wLEY9eSxWPWcsSj1NLE49cywkPUEsUz1mdW5jdGlvbigpe3ZhciBQPW4oKTtyZXR1cm4gZnVuY3Rpb24odyxVLEgsWSxrLHJ0KXt2YXIgaXQsY3Q7Zm9yKFV8fChVPTMpLEh8fChIPTApLFk/Y3Q9TWF0aC5taW4oWSpVK0gsdy5sZW5ndGgpOmN0PXcubGVuZ3RoLGl0PUg7aXQ8Y3Q7aXQrPVUpUFswXT13W2l0XSxQWzFdPXdbaXQrMV0sUFsyXT13W2l0KzJdLGsoUCxQLHJ0KSx3W2l0XT1QWzBdLHdbaXQrMV09UFsxXSx3W2l0KzJdPVBbMl07cmV0dXJuIHd9fSgpfSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJjcmVhdGUiLGZ1bmN0aW9uKCl7cmV0dXJuIG59KSx0LmQociwiY2xvbmUiLGZ1bmN0aW9uKCl7cmV0dXJuIGF9KSx0LmQociwiZnJvbVZhbHVlcyIsZnVuY3Rpb24oKXtyZXR1cm4gc30pLHQuZChyLCJjb3B5IixmdW5jdGlvbigpe3JldHVybiBpfSksdC5kKHIsInNldCIsZnVuY3Rpb24oKXtyZXR1cm4gb30pLHQuZChyLCJhZGQiLGZ1bmN0aW9uKCl7cmV0dXJuIGN9KSx0LmQociwic3VidHJhY3QiLGZ1bmN0aW9uKCl7cmV0dXJuIG19KSx0LmQociwibXVsdGlwbHkiLGZ1bmN0aW9uKCl7cmV0dXJuIHV9KSx0LmQociwiZGl2aWRlIixmdW5jdGlvbigpe3JldHVybiBwfSksdC5kKHIsImNlaWwiLGZ1bmN0aW9uKCl7cmV0dXJuIHl9KSx0LmQociwiZmxvb3IiLGZ1bmN0aW9uKCl7cmV0dXJuIE99KSx0LmQociwibWluIixmdW5jdGlvbigpe3JldHVybiB4fSksdC5kKHIsIm1heCIsZnVuY3Rpb24oKXtyZXR1cm4gdn0pLHQuZChyLCJyb3VuZCIsZnVuY3Rpb24oKXtyZXR1cm4gVH0pLHQuZChyLCJzY2FsZSIsZnVuY3Rpb24oKXtyZXR1cm4gbH0pLHQuZChyLCJzY2FsZUFuZEFkZCIsZnVuY3Rpb24oKXtyZXR1cm4gaH0pLHQuZChyLCJkaXN0YW5jZSIsZnVuY3Rpb24oKXtyZXR1cm4gZn0pLHQuZChyLCJzcXVhcmVkRGlzdGFuY2UiLGZ1bmN0aW9uKCl7cmV0dXJuIGd9KSx0LmQociwibGVuZ3RoIixmdW5jdGlvbigpe3JldHVybiBNfSksdC5kKHIsInNxdWFyZWRMZW5ndGgiLGZ1bmN0aW9uKCl7cmV0dXJuIEF9KSx0LmQociwibmVnYXRlIixmdW5jdGlvbigpe3JldHVybiBDfSksdC5kKHIsImludmVyc2UiLGZ1bmN0aW9uKCl7cmV0dXJuIGJ9KSx0LmQociwibm9ybWFsaXplIixmdW5jdGlvbigpe3JldHVybiBFfSksdC5kKHIsImRvdCIsZnVuY3Rpb24oKXtyZXR1cm4gTH0pLHQuZChyLCJjcm9zcyIsZnVuY3Rpb24oKXtyZXR1cm4gRH0pLHQuZChyLCJsZXJwIixmdW5jdGlvbigpe3JldHVybiBJfSksdC5kKHIsInJhbmRvbSIsZnVuY3Rpb24oKXtyZXR1cm4gUn0pLHQuZChyLCJ0cmFuc2Zvcm1NYXQ0IixmdW5jdGlvbigpe3JldHVybiBCfSksdC5kKHIsInRyYW5zZm9ybVF1YXQiLGZ1bmN0aW9uKCl7cmV0dXJuIHp9KSx0LmQociwiemVybyIsZnVuY3Rpb24oKXtyZXR1cm4gS30pLHQuZChyLCJzdHIiLGZ1bmN0aW9uKCl7cmV0dXJuIFF9KSx0LmQociwiZXhhY3RFcXVhbHMiLGZ1bmN0aW9uKCl7cmV0dXJuIF99KSx0LmQociwiZXF1YWxzIixmdW5jdGlvbigpe3JldHVybiBqfSksdC5kKHIsInN1YiIsZnVuY3Rpb24oKXtyZXR1cm4gR30pLHQuZChyLCJtdWwiLGZ1bmN0aW9uKCl7cmV0dXJuIFh9KSx0LmQociwiZGl2IixmdW5jdGlvbigpe3JldHVybiBafSksdC5kKHIsImRpc3QiLGZ1bmN0aW9uKCl7cmV0dXJuIHR0fSksdC5kKHIsInNxckRpc3QiLGZ1bmN0aW9uKCl7cmV0dXJuIG50fSksdC5kKHIsImxlbiIsZnVuY3Rpb24oKXtyZXR1cm4gcX0pLHQuZChyLCJzcXJMZW4iLGZ1bmN0aW9uKCl7cmV0dXJuIGR0fSksdC5kKHIsImZvckVhY2giLGZ1bmN0aW9uKCl7cmV0dXJuIHV0fSk7dmFyIGU9dCgyKTtmdW5jdGlvbiBuKCl7dmFyIFc9bmV3IGUuQVJSQVlfVFlQRSg0KTtyZXR1cm4gZS5BUlJBWV9UWVBFIT1GbG9hdDMyQXJyYXkmJihXWzBdPTAsV1sxXT0wLFdbMl09MCxXWzNdPTApLFd9ZnVuY3Rpb24gYShXKXt2YXIgRj1uZXcgZS5BUlJBWV9UWVBFKDQpO3JldHVybiBGWzBdPVdbMF0sRlsxXT1XWzFdLEZbMl09V1syXSxGWzNdPVdbM10sRn1mdW5jdGlvbiBzKFcsRixWLEope3ZhciBOPW5ldyBlLkFSUkFZX1RZUEUoNCk7cmV0dXJuIE5bMF09VyxOWzFdPUYsTlsyXT1WLE5bM109SixOfWZ1bmN0aW9uIGkoVyxGKXtyZXR1cm4gV1swXT1GWzBdLFdbMV09RlsxXSxXWzJdPUZbMl0sV1szXT1GWzNdLFd9ZnVuY3Rpb24gbyhXLEYsVixKLE4pe3JldHVybiBXWzBdPUYsV1sxXT1WLFdbMl09SixXWzNdPU4sV31mdW5jdGlvbiBjKFcsRixWKXtyZXR1cm4gV1swXT1GWzBdK1ZbMF0sV1sxXT1GWzFdK1ZbMV0sV1syXT1GWzJdK1ZbMl0sV1szXT1GWzNdK1ZbM10sV31mdW5jdGlvbiBtKFcsRixWKXtyZXR1cm4gV1swXT1GWzBdLVZbMF0sV1sxXT1GWzFdLVZbMV0sV1syXT1GWzJdLVZbMl0sV1szXT1GWzNdLVZbM10sV31mdW5jdGlvbiB1KFcsRixWKXtyZXR1cm4gV1swXT1GWzBdKlZbMF0sV1sxXT1GWzFdKlZbMV0sV1syXT1GWzJdKlZbMl0sV1szXT1GWzNdKlZbM10sV31mdW5jdGlvbiBwKFcsRixWKXtyZXR1cm4gV1swXT1GWzBdL1ZbMF0sV1sxXT1GWzFdL1ZbMV0sV1syXT1GWzJdL1ZbMl0sV1szXT1GWzNdL1ZbM10sV31mdW5jdGlvbiB5KFcsRil7cmV0dXJuIFdbMF09TWF0aC5jZWlsKEZbMF0pLFdbMV09TWF0aC5jZWlsKEZbMV0pLFdbMl09TWF0aC5jZWlsKEZbMl0pLFdbM109TWF0aC5jZWlsKEZbM10pLFd9ZnVuY3Rpb24gTyhXLEYpe3JldHVybiBXWzBdPU1hdGguZmxvb3IoRlswXSksV1sxXT1NYXRoLmZsb29yKEZbMV0pLFdbMl09TWF0aC5mbG9vcihGWzJdKSxXWzNdPU1hdGguZmxvb3IoRlszXSksV31mdW5jdGlvbiB4KFcsRixWKXtyZXR1cm4gV1swXT1NYXRoLm1pbihGWzBdLFZbMF0pLFdbMV09TWF0aC5taW4oRlsxXSxWWzFdKSxXWzJdPU1hdGgubWluKEZbMl0sVlsyXSksV1szXT1NYXRoLm1pbihGWzNdLFZbM10pLFd9ZnVuY3Rpb24gdihXLEYsVil7cmV0dXJuIFdbMF09TWF0aC5tYXgoRlswXSxWWzBdKSxXWzFdPU1hdGgubWF4KEZbMV0sVlsxXSksV1syXT1NYXRoLm1heChGWzJdLFZbMl0pLFdbM109TWF0aC5tYXgoRlszXSxWWzNdKSxXfWZ1bmN0aW9uIFQoVyxGKXtyZXR1cm4gV1swXT1NYXRoLnJvdW5kKEZbMF0pLFdbMV09TWF0aC5yb3VuZChGWzFdKSxXWzJdPU1hdGgucm91bmQoRlsyXSksV1szXT1NYXRoLnJvdW5kKEZbM10pLFd9ZnVuY3Rpb24gbChXLEYsVil7cmV0dXJuIFdbMF09RlswXSpWLFdbMV09RlsxXSpWLFdbMl09RlsyXSpWLFdbM109RlszXSpWLFd9ZnVuY3Rpb24gaChXLEYsVixKKXtyZXR1cm4gV1swXT1GWzBdK1ZbMF0qSixXWzFdPUZbMV0rVlsxXSpKLFdbMl09RlsyXStWWzJdKkosV1szXT1GWzNdK1ZbM10qSixXfWZ1bmN0aW9uIGYoVyxGKXt2YXIgVj1GWzBdLVdbMF0sSj1GWzFdLVdbMV0sTj1GWzJdLVdbMl0sJD1GWzNdLVdbM107cmV0dXJuIE1hdGguaHlwb3QoVixKLE4sJCl9ZnVuY3Rpb24gZyhXLEYpe3ZhciBWPUZbMF0tV1swXSxKPUZbMV0tV1sxXSxOPUZbMl0tV1syXSwkPUZbM10tV1szXTtyZXR1cm4gVipWK0oqSitOKk4rJCokfWZ1bmN0aW9uIE0oVyl7dmFyIEY9V1swXSxWPVdbMV0sSj1XWzJdLE49V1szXTtyZXR1cm4gTWF0aC5oeXBvdChGLFYsSixOKX1mdW5jdGlvbiBBKFcpe3ZhciBGPVdbMF0sVj1XWzFdLEo9V1syXSxOPVdbM107cmV0dXJuIEYqRitWKlYrSipKK04qTn1mdW5jdGlvbiBDKFcsRil7cmV0dXJuIFdbMF09LUZbMF0sV1sxXT0tRlsxXSxXWzJdPS1GWzJdLFdbM109LUZbM10sV31mdW5jdGlvbiBiKFcsRil7cmV0dXJuIFdbMF09MS9GWzBdLFdbMV09MS9GWzFdLFdbMl09MS9GWzJdLFdbM109MS9GWzNdLFd9ZnVuY3Rpb24gRShXLEYpe3ZhciBWPUZbMF0sSj1GWzFdLE49RlsyXSwkPUZbM10sUz1WKlYrSipKK04qTiskKiQ7cmV0dXJuIFM+MCYmKFM9MS9NYXRoLnNxcnQoUykpLFdbMF09VipTLFdbMV09SipTLFdbMl09TipTLFdbM109JCpTLFd9ZnVuY3Rpb24gTChXLEYpe3JldHVybiBXWzBdKkZbMF0rV1sxXSpGWzFdK1dbMl0qRlsyXStXWzNdKkZbM119ZnVuY3Rpb24gRChXLEYsVixKKXt2YXIgTj1WWzBdKkpbMV0tVlsxXSpKWzBdLCQ9VlswXSpKWzJdLVZbMl0qSlswXSxTPVZbMF0qSlszXS1WWzNdKkpbMF0sUD1WWzFdKkpbMl0tVlsyXSpKWzFdLHc9VlsxXSpKWzNdLVZbM10qSlsxXSxVPVZbMl0qSlszXS1WWzNdKkpbMl0sSD1GWzBdLFk9RlsxXSxrPUZbMl0scnQ9RlszXTtyZXR1cm4gV1swXT1ZKlUtayp3K3J0KlAsV1sxXT0tKEgqVSkraypTLXJ0KiQsV1syXT1IKnctWSpTK3J0Kk4sV1szXT0tKEgqUCkrWSokLWsqTixXfWZ1bmN0aW9uIEkoVyxGLFYsSil7dmFyIE49RlswXSwkPUZbMV0sUz1GWzJdLFA9RlszXTtyZXR1cm4gV1swXT1OK0oqKFZbMF0tTiksV1sxXT0kK0oqKFZbMV0tJCksV1syXT1TK0oqKFZbMl0tUyksV1szXT1QK0oqKFZbM10tUCksV31mdW5jdGlvbiBSKFcsRil7Rj1GfHwxO3ZhciBWLEosTiwkLFMsUDtkbyBWPWUuUkFORE9NKCkqMi0xLEo9ZS5SQU5ET00oKSoyLTEsUz1WKlYrSipKO3doaWxlKFM+PTEpO2RvIE49ZS5SQU5ET00oKSoyLTEsJD1lLlJBTkRPTSgpKjItMSxQPU4qTiskKiQ7d2hpbGUoUD49MSk7dmFyIHc9TWF0aC5zcXJ0KCgxLVMpL1ApO3JldHVybiBXWzBdPUYqVixXWzFdPUYqSixXWzJdPUYqTip3LFdbM109RiokKncsV31mdW5jdGlvbiBCKFcsRixWKXt2YXIgSj1GWzBdLE49RlsxXSwkPUZbMl0sUz1GWzNdO3JldHVybiBXWzBdPVZbMF0qSitWWzRdKk4rVls4XSokK1ZbMTJdKlMsV1sxXT1WWzFdKkorVls1XSpOK1ZbOV0qJCtWWzEzXSpTLFdbMl09VlsyXSpKK1ZbNl0qTitWWzEwXSokK1ZbMTRdKlMsV1szXT1WWzNdKkorVls3XSpOK1ZbMTFdKiQrVlsxNV0qUyxXfWZ1bmN0aW9uIHooVyxGLFYpe3ZhciBKPUZbMF0sTj1GWzFdLCQ9RlsyXSxTPVZbMF0sUD1WWzFdLHc9VlsyXSxVPVZbM10sSD1VKkorUCokLXcqTixZPVUqTit3KkotUyokLGs9VSokK1MqTi1QKkoscnQ9LVMqSi1QKk4tdyokO3JldHVybiBXWzBdPUgqVStydCotUytZKi13LWsqLVAsV1sxXT1ZKlUrcnQqLVArayotUy1IKi13LFdbMl09aypVK3J0Ki13K0gqLVAtWSotUyxXWzNdPUZbM10sV31mdW5jdGlvbiBLKFcpe3JldHVybiBXWzBdPTAsV1sxXT0wLFdbMl09MCxXWzNdPTAsV31mdW5jdGlvbiBRKFcpe3JldHVybiJ2ZWM0KCIrV1swXSsiLCAiK1dbMV0rIiwgIitXWzJdKyIsICIrV1szXSsiKSJ9ZnVuY3Rpb24gXyhXLEYpe3JldHVybiBXWzBdPT09RlswXSYmV1sxXT09PUZbMV0mJldbMl09PT1GWzJdJiZXWzNdPT09RlszXX1mdW5jdGlvbiBqKFcsRil7dmFyIFY9V1swXSxKPVdbMV0sTj1XWzJdLCQ9V1szXSxTPUZbMF0sUD1GWzFdLHc9RlsyXSxVPUZbM107cmV0dXJuIE1hdGguYWJzKFYtUyk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKFYpLE1hdGguYWJzKFMpKSYmTWF0aC5hYnMoSi1QKTw9ZS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoSiksTWF0aC5hYnMoUCkpJiZNYXRoLmFicyhOLXcpPD1lLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhOKSxNYXRoLmFicyh3KSkmJk1hdGguYWJzKCQtVSk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKCQpLE1hdGguYWJzKFUpKX12YXIgRz1tLFg9dSxaPXAsdHQ9ZixudD1nLHE9TSxkdD1BLHV0PWZ1bmN0aW9uKCl7dmFyIFc9bigpO3JldHVybiBmdW5jdGlvbihGLFYsSixOLCQsUyl7dmFyIFAsdztmb3IoVnx8KFY9NCksSnx8KEo9MCksTj93PU1hdGgubWluKE4qVitKLEYubGVuZ3RoKTp3PUYubGVuZ3RoLFA9SjtQPHc7UCs9VilXWzBdPUZbUF0sV1sxXT1GW1ArMV0sV1syXT1GW1ArMl0sV1szXT1GW1ArM10sJChXLFcsUyksRltQXT1XWzBdLEZbUCsxXT1XWzFdLEZbUCsyXT1XWzJdLEZbUCszXT1XWzNdO3JldHVybiBGfX0oKX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiY3JlYXRlIixmdW5jdGlvbigpe3JldHVybiBzfSksdC5kKHIsImNsb25lIixmdW5jdGlvbigpe3JldHVybiBpfSksdC5kKHIsImZyb21WYWx1ZXMiLGZ1bmN0aW9uKCl7cmV0dXJuIG99KSx0LmQociwiZnJvbVJvdGF0aW9uVHJhbnNsYXRpb25WYWx1ZXMiLGZ1bmN0aW9uKCl7cmV0dXJuIGN9KSx0LmQociwiZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24iLGZ1bmN0aW9uKCl7cmV0dXJuIG19KSx0LmQociwiZnJvbVRyYW5zbGF0aW9uIixmdW5jdGlvbigpe3JldHVybiB1fSksdC5kKHIsImZyb21Sb3RhdGlvbiIsZnVuY3Rpb24oKXtyZXR1cm4gcH0pLHQuZChyLCJmcm9tTWF0NCIsZnVuY3Rpb24oKXtyZXR1cm4geX0pLHQuZChyLCJjb3B5IixmdW5jdGlvbigpe3JldHVybiBPfSksdC5kKHIsImlkZW50aXR5IixmdW5jdGlvbigpe3JldHVybiB4fSksdC5kKHIsInNldCIsZnVuY3Rpb24oKXtyZXR1cm4gdn0pLHQuZChyLCJnZXRSZWFsIixmdW5jdGlvbigpe3JldHVybiBUfSksdC5kKHIsImdldER1YWwiLGZ1bmN0aW9uKCl7cmV0dXJuIGx9KSx0LmQociwic2V0UmVhbCIsZnVuY3Rpb24oKXtyZXR1cm4gaH0pLHQuZChyLCJzZXREdWFsIixmdW5jdGlvbigpe3JldHVybiBmfSksdC5kKHIsImdldFRyYW5zbGF0aW9uIixmdW5jdGlvbigpe3JldHVybiBnfSksdC5kKHIsInRyYW5zbGF0ZSIsZnVuY3Rpb24oKXtyZXR1cm4gTX0pLHQuZChyLCJyb3RhdGVYIixmdW5jdGlvbigpe3JldHVybiBBfSksdC5kKHIsInJvdGF0ZVkiLGZ1bmN0aW9uKCl7cmV0dXJuIEN9KSx0LmQociwicm90YXRlWiIsZnVuY3Rpb24oKXtyZXR1cm4gYn0pLHQuZChyLCJyb3RhdGVCeVF1YXRBcHBlbmQiLGZ1bmN0aW9uKCl7cmV0dXJuIEV9KSx0LmQociwicm90YXRlQnlRdWF0UHJlcGVuZCIsZnVuY3Rpb24oKXtyZXR1cm4gTH0pLHQuZChyLCJyb3RhdGVBcm91bmRBeGlzIixmdW5jdGlvbigpe3JldHVybiBEfSksdC5kKHIsImFkZCIsZnVuY3Rpb24oKXtyZXR1cm4gSX0pLHQuZChyLCJtdWx0aXBseSIsZnVuY3Rpb24oKXtyZXR1cm4gUn0pLHQuZChyLCJtdWwiLGZ1bmN0aW9uKCl7cmV0dXJuIEJ9KSx0LmQociwic2NhbGUiLGZ1bmN0aW9uKCl7cmV0dXJuIHp9KSx0LmQociwiZG90IixmdW5jdGlvbigpe3JldHVybiBLfSksdC5kKHIsImxlcnAiLGZ1bmN0aW9uKCl7cmV0dXJuIFF9KSx0LmQociwiaW52ZXJ0IixmdW5jdGlvbigpe3JldHVybiBffSksdC5kKHIsImNvbmp1Z2F0ZSIsZnVuY3Rpb24oKXtyZXR1cm4gan0pLHQuZChyLCJsZW5ndGgiLGZ1bmN0aW9uKCl7cmV0dXJuIEd9KSx0LmQociwibGVuIixmdW5jdGlvbigpe3JldHVybiBYfSksdC5kKHIsInNxdWFyZWRMZW5ndGgiLGZ1bmN0aW9uKCl7cmV0dXJuIFp9KSx0LmQociwic3FyTGVuIixmdW5jdGlvbigpe3JldHVybiB0dH0pLHQuZChyLCJub3JtYWxpemUiLGZ1bmN0aW9uKCl7cmV0dXJuIG50fSksdC5kKHIsInN0ciIsZnVuY3Rpb24oKXtyZXR1cm4gcX0pLHQuZChyLCJleGFjdEVxdWFscyIsZnVuY3Rpb24oKXtyZXR1cm4gZHR9KSx0LmQociwiZXF1YWxzIixmdW5jdGlvbigpe3JldHVybiB1dH0pO3ZhciBlPXQoMiksbj10KDcpLGE9dCg2KTtmdW5jdGlvbiBzKCl7dmFyIFc9bmV3IGUuQVJSQVlfVFlQRSg4KTtyZXR1cm4gZS5BUlJBWV9UWVBFIT1GbG9hdDMyQXJyYXkmJihXWzBdPTAsV1sxXT0wLFdbMl09MCxXWzRdPTAsV1s1XT0wLFdbNl09MCxXWzddPTApLFdbM109MSxXfWZ1bmN0aW9uIGkoVyl7dmFyIEY9bmV3IGUuQVJSQVlfVFlQRSg4KTtyZXR1cm4gRlswXT1XWzBdLEZbMV09V1sxXSxGWzJdPVdbMl0sRlszXT1XWzNdLEZbNF09V1s0XSxGWzVdPVdbNV0sRls2XT1XWzZdLEZbN109V1s3XSxGfWZ1bmN0aW9uIG8oVyxGLFYsSixOLCQsUyxQKXt2YXIgdz1uZXcgZS5BUlJBWV9UWVBFKDgpO3JldHVybiB3WzBdPVcsd1sxXT1GLHdbMl09Vix3WzNdPUosd1s0XT1OLHdbNV09JCx3WzZdPVMsd1s3XT1QLHd9ZnVuY3Rpb24gYyhXLEYsVixKLE4sJCxTKXt2YXIgUD1uZXcgZS5BUlJBWV9UWVBFKDgpO1BbMF09VyxQWzFdPUYsUFsyXT1WLFBbM109Sjt2YXIgdz1OKi41LFU9JCouNSxIPVMqLjU7cmV0dXJuIFBbNF09dypKK1UqVi1IKkYsUFs1XT1VKkorSCpXLXcqVixQWzZdPUgqSit3KkYtVSpXLFBbN109LXcqVy1VKkYtSCpWLFB9ZnVuY3Rpb24gbShXLEYsVil7dmFyIEo9VlswXSouNSxOPVZbMV0qLjUsJD1WWzJdKi41LFM9RlswXSxQPUZbMV0sdz1GWzJdLFU9RlszXTtyZXR1cm4gV1swXT1TLFdbMV09UCxXWzJdPXcsV1szXT1VLFdbNF09SipVK04qdy0kKlAsV1s1XT1OKlUrJCpTLUoqdyxXWzZdPSQqVStKKlAtTipTLFdbN109LUoqUy1OKlAtJCp3LFd9ZnVuY3Rpb24gdShXLEYpe3JldHVybiBXWzBdPTAsV1sxXT0wLFdbMl09MCxXWzNdPTEsV1s0XT1GWzBdKi41LFdbNV09RlsxXSouNSxXWzZdPUZbMl0qLjUsV1s3XT0wLFd9ZnVuY3Rpb24gcChXLEYpe3JldHVybiBXWzBdPUZbMF0sV1sxXT1GWzFdLFdbMl09RlsyXSxXWzNdPUZbM10sV1s0XT0wLFdbNV09MCxXWzZdPTAsV1s3XT0wLFd9ZnVuY3Rpb24geShXLEYpe3ZhciBWPW4uY3JlYXRlKCk7YS5nZXRSb3RhdGlvbihWLEYpO3ZhciBKPW5ldyBlLkFSUkFZX1RZUEUoMyk7cmV0dXJuIGEuZ2V0VHJhbnNsYXRpb24oSixGKSxtKFcsVixKKSxXfWZ1bmN0aW9uIE8oVyxGKXtyZXR1cm4gV1swXT1GWzBdLFdbMV09RlsxXSxXWzJdPUZbMl0sV1szXT1GWzNdLFdbNF09Rls0XSxXWzVdPUZbNV0sV1s2XT1GWzZdLFdbN109Rls3XSxXfWZ1bmN0aW9uIHgoVyl7cmV0dXJuIFdbMF09MCxXWzFdPTAsV1syXT0wLFdbM109MSxXWzRdPTAsV1s1XT0wLFdbNl09MCxXWzddPTAsV31mdW5jdGlvbiB2KFcsRixWLEosTiwkLFMsUCx3KXtyZXR1cm4gV1swXT1GLFdbMV09VixXWzJdPUosV1szXT1OLFdbNF09JCxXWzVdPVMsV1s2XT1QLFdbN109dyxXfXZhciBUPW4uY29weTtmdW5jdGlvbiBsKFcsRil7cmV0dXJuIFdbMF09Rls0XSxXWzFdPUZbNV0sV1syXT1GWzZdLFdbM109Rls3XSxXfXZhciBoPW4uY29weTtmdW5jdGlvbiBmKFcsRil7cmV0dXJuIFdbNF09RlswXSxXWzVdPUZbMV0sV1s2XT1GWzJdLFdbN109RlszXSxXfWZ1bmN0aW9uIGcoVyxGKXt2YXIgVj1GWzRdLEo9Rls1XSxOPUZbNl0sJD1GWzddLFM9LUZbMF0sUD0tRlsxXSx3PS1GWzJdLFU9RlszXTtyZXR1cm4gV1swXT0oVipVKyQqUytKKnctTipQKSoyLFdbMV09KEoqVSskKlArTipTLVYqdykqMixXWzJdPShOKlUrJCp3K1YqUC1KKlMpKjIsV31mdW5jdGlvbiBNKFcsRixWKXt2YXIgSj1GWzBdLE49RlsxXSwkPUZbMl0sUz1GWzNdLFA9VlswXSouNSx3PVZbMV0qLjUsVT1WWzJdKi41LEg9Rls0XSxZPUZbNV0saz1GWzZdLHJ0PUZbN107cmV0dXJuIFdbMF09SixXWzFdPU4sV1syXT0kLFdbM109UyxXWzRdPVMqUCtOKlUtJCp3K0gsV1s1XT1TKncrJCpQLUoqVStZLFdbNl09UypVK0oqdy1OKlArayxXWzddPS1KKlAtTip3LSQqVStydCxXfWZ1bmN0aW9uIEEoVyxGLFYpe3ZhciBKPS1GWzBdLE49LUZbMV0sJD0tRlsyXSxTPUZbM10sUD1GWzRdLHc9Rls1XSxVPUZbNl0sSD1GWzddLFk9UCpTK0gqSit3KiQtVSpOLGs9dypTK0gqTitVKkotUCokLHJ0PVUqUytIKiQrUCpOLXcqSixpdD1IKlMtUCpKLXcqTi1VKiQ7cmV0dXJuIG4ucm90YXRlWChXLEYsViksSj1XWzBdLE49V1sxXSwkPVdbMl0sUz1XWzNdLFdbNF09WSpTK2l0KkorayokLXJ0Kk4sV1s1XT1rKlMraXQqTitydCpKLVkqJCxXWzZdPXJ0KlMraXQqJCtZKk4taypKLFdbN109aXQqUy1ZKkotaypOLXJ0KiQsV31mdW5jdGlvbiBDKFcsRixWKXt2YXIgSj0tRlswXSxOPS1GWzFdLCQ9LUZbMl0sUz1GWzNdLFA9Rls0XSx3PUZbNV0sVT1GWzZdLEg9Rls3XSxZPVAqUytIKkordyokLVUqTixrPXcqUytIKk4rVSpKLVAqJCxydD1VKlMrSCokK1AqTi13KkosaXQ9SCpTLVAqSi13Kk4tVSokO3JldHVybiBuLnJvdGF0ZVkoVyxGLFYpLEo9V1swXSxOPVdbMV0sJD1XWzJdLFM9V1szXSxXWzRdPVkqUytpdCpKK2sqJC1ydCpOLFdbNV09aypTK2l0Kk4rcnQqSi1ZKiQsV1s2XT1ydCpTK2l0KiQrWSpOLWsqSixXWzddPWl0KlMtWSpKLWsqTi1ydCokLFd9ZnVuY3Rpb24gYihXLEYsVil7dmFyIEo9LUZbMF0sTj0tRlsxXSwkPS1GWzJdLFM9RlszXSxQPUZbNF0sdz1GWzVdLFU9Rls2XSxIPUZbN10sWT1QKlMrSCpKK3cqJC1VKk4saz13KlMrSCpOK1UqSi1QKiQscnQ9VSpTK0gqJCtQKk4tdypKLGl0PUgqUy1QKkotdypOLVUqJDtyZXR1cm4gbi5yb3RhdGVaKFcsRixWKSxKPVdbMF0sTj1XWzFdLCQ9V1syXSxTPVdbM10sV1s0XT1ZKlMraXQqSitrKiQtcnQqTixXWzVdPWsqUytpdCpOK3J0KkotWSokLFdbNl09cnQqUytpdCokK1kqTi1rKkosV1s3XT1pdCpTLVkqSi1rKk4tcnQqJCxXfWZ1bmN0aW9uIEUoVyxGLFYpe3ZhciBKPVZbMF0sTj1WWzFdLCQ9VlsyXSxTPVZbM10sUD1GWzBdLHc9RlsxXSxVPUZbMl0sSD1GWzNdO3JldHVybiBXWzBdPVAqUytIKkordyokLVUqTixXWzFdPXcqUytIKk4rVSpKLVAqJCxXWzJdPVUqUytIKiQrUCpOLXcqSixXWzNdPUgqUy1QKkotdypOLVUqJCxQPUZbNF0sdz1GWzVdLFU9Rls2XSxIPUZbN10sV1s0XT1QKlMrSCpKK3cqJC1VKk4sV1s1XT13KlMrSCpOK1UqSi1QKiQsV1s2XT1VKlMrSCokK1AqTi13KkosV1s3XT1IKlMtUCpKLXcqTi1VKiQsV31mdW5jdGlvbiBMKFcsRixWKXt2YXIgSj1GWzBdLE49RlsxXSwkPUZbMl0sUz1GWzNdLFA9VlswXSx3PVZbMV0sVT1WWzJdLEg9VlszXTtyZXR1cm4gV1swXT1KKkgrUypQK04qVS0kKncsV1sxXT1OKkgrUyp3KyQqUC1KKlUsV1syXT0kKkgrUypVK0oqdy1OKlAsV1szXT1TKkgtSipQLU4qdy0kKlUsUD1WWzRdLHc9Vls1XSxVPVZbNl0sSD1WWzddLFdbNF09SipIK1MqUCtOKlUtJCp3LFdbNV09TipIK1MqdyskKlAtSipVLFdbNl09JCpIK1MqVStKKnctTipQLFdbN109UypILUoqUC1OKnctJCpVLFd9ZnVuY3Rpb24gRChXLEYsVixKKXtpZihNYXRoLmFicyhKKTxlLkVQU0lMT04pcmV0dXJuIE8oVyxGKTt2YXIgTj1NYXRoLmh5cG90KFZbMF0sVlsxXSxWWzJdKTtKPUoqLjU7dmFyICQ9TWF0aC5zaW4oSiksUz0kKlZbMF0vTixQPSQqVlsxXS9OLHc9JCpWWzJdL04sVT1NYXRoLmNvcyhKKSxIPUZbMF0sWT1GWzFdLGs9RlsyXSxydD1GWzNdO1dbMF09SCpVK3J0KlMrWSp3LWsqUCxXWzFdPVkqVStydCpQK2sqUy1IKncsV1syXT1rKlUrcnQqdytIKlAtWSpTLFdbM109cnQqVS1IKlMtWSpQLWsqdzt2YXIgaXQ9Rls0XSxjdD1GWzVdLGh0PUZbNl0sYXQ9Rls3XTtyZXR1cm4gV1s0XT1pdCpVK2F0KlMrY3Qqdy1odCpQLFdbNV09Y3QqVSthdCpQK2h0KlMtaXQqdyxXWzZdPWh0KlUrYXQqdytpdCpQLWN0KlMsV1s3XT1hdCpVLWl0KlMtY3QqUC1odCp3LFd9ZnVuY3Rpb24gSShXLEYsVil7cmV0dXJuIFdbMF09RlswXStWWzBdLFdbMV09RlsxXStWWzFdLFdbMl09RlsyXStWWzJdLFdbM109RlszXStWWzNdLFdbNF09Rls0XStWWzRdLFdbNV09Rls1XStWWzVdLFdbNl09Rls2XStWWzZdLFdbN109Rls3XStWWzddLFd9ZnVuY3Rpb24gUihXLEYsVil7dmFyIEo9RlswXSxOPUZbMV0sJD1GWzJdLFM9RlszXSxQPVZbNF0sdz1WWzVdLFU9Vls2XSxIPVZbN10sWT1GWzRdLGs9Rls1XSxydD1GWzZdLGl0PUZbN10sY3Q9VlswXSxodD1WWzFdLGF0PVZbMl0sb3Q9VlszXTtyZXR1cm4gV1swXT1KKm90K1MqY3QrTiphdC0kKmh0LFdbMV09TipvdCtTKmh0KyQqY3QtSiphdCxXWzJdPSQqb3QrUyphdCtKKmh0LU4qY3QsV1szXT1TKm90LUoqY3QtTipodC0kKmF0LFdbNF09SipIK1MqUCtOKlUtJCp3K1kqb3QraXQqY3QrayphdC1ydCpodCxXWzVdPU4qSCtTKncrJCpQLUoqVStrKm90K2l0Kmh0K3J0KmN0LVkqYXQsV1s2XT0kKkgrUypVK0oqdy1OKlArcnQqb3QraXQqYXQrWSpodC1rKmN0LFdbN109UypILUoqUC1OKnctJCpVK2l0Km90LVkqY3QtaypodC1ydCphdCxXfXZhciBCPVI7ZnVuY3Rpb24geihXLEYsVil7cmV0dXJuIFdbMF09RlswXSpWLFdbMV09RlsxXSpWLFdbMl09RlsyXSpWLFdbM109RlszXSpWLFdbNF09Rls0XSpWLFdbNV09Rls1XSpWLFdbNl09Rls2XSpWLFdbN109Rls3XSpWLFd9dmFyIEs9bi5kb3Q7ZnVuY3Rpb24gUShXLEYsVixKKXt2YXIgTj0xLUo7cmV0dXJuIEsoRixWKTwwJiYoSj0tSiksV1swXT1GWzBdKk4rVlswXSpKLFdbMV09RlsxXSpOK1ZbMV0qSixXWzJdPUZbMl0qTitWWzJdKkosV1szXT1GWzNdKk4rVlszXSpKLFdbNF09Rls0XSpOK1ZbNF0qSixXWzVdPUZbNV0qTitWWzVdKkosV1s2XT1GWzZdKk4rVls2XSpKLFdbN109Rls3XSpOK1ZbN10qSixXfWZ1bmN0aW9uIF8oVyxGKXt2YXIgVj1aKEYpO3JldHVybiBXWzBdPS1GWzBdL1YsV1sxXT0tRlsxXS9WLFdbMl09LUZbMl0vVixXWzNdPUZbM10vVixXWzRdPS1GWzRdL1YsV1s1XT0tRls1XS9WLFdbNl09LUZbNl0vVixXWzddPUZbN10vVixXfWZ1bmN0aW9uIGooVyxGKXtyZXR1cm4gV1swXT0tRlswXSxXWzFdPS1GWzFdLFdbMl09LUZbMl0sV1szXT1GWzNdLFdbNF09LUZbNF0sV1s1XT0tRls1XSxXWzZdPS1GWzZdLFdbN109Rls3XSxXfXZhciBHPW4ubGVuZ3RoLFg9RyxaPW4uc3F1YXJlZExlbmd0aCx0dD1aO2Z1bmN0aW9uIG50KFcsRil7dmFyIFY9WihGKTtpZihWPjApe1Y9TWF0aC5zcXJ0KFYpO3ZhciBKPUZbMF0vVixOPUZbMV0vViwkPUZbMl0vVixTPUZbM10vVixQPUZbNF0sdz1GWzVdLFU9Rls2XSxIPUZbN10sWT1KKlArTip3KyQqVStTKkg7V1swXT1KLFdbMV09TixXWzJdPSQsV1szXT1TLFdbNF09KFAtSipZKS9WLFdbNV09KHctTipZKS9WLFdbNl09KFUtJCpZKS9WLFdbN109KEgtUypZKS9WfXJldHVybiBXfWZ1bmN0aW9uIHEoVyl7cmV0dXJuInF1YXQyKCIrV1swXSsiLCAiK1dbMV0rIiwgIitXWzJdKyIsICIrV1szXSsiLCAiK1dbNF0rIiwgIitXWzVdKyIsICIrV1s2XSsiLCAiK1dbN10rIikifWZ1bmN0aW9uIGR0KFcsRil7cmV0dXJuIFdbMF09PT1GWzBdJiZXWzFdPT09RlsxXSYmV1syXT09PUZbMl0mJldbM109PT1GWzNdJiZXWzRdPT09Rls0XSYmV1s1XT09PUZbNV0mJldbNl09PT1GWzZdJiZXWzddPT09Rls3XX1mdW5jdGlvbiB1dChXLEYpe3ZhciBWPVdbMF0sSj1XWzFdLE49V1syXSwkPVdbM10sUz1XWzRdLFA9V1s1XSx3PVdbNl0sVT1XWzddLEg9RlswXSxZPUZbMV0saz1GWzJdLHJ0PUZbM10saXQ9Rls0XSxjdD1GWzVdLGh0PUZbNl0sYXQ9Rls3XTtyZXR1cm4gTWF0aC5hYnMoVi1IKTw9ZS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoViksTWF0aC5hYnMoSCkpJiZNYXRoLmFicyhKLVkpPD1lLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhKKSxNYXRoLmFicyhZKSkmJk1hdGguYWJzKE4tayk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKE4pLE1hdGguYWJzKGspKSYmTWF0aC5hYnMoJC1ydCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKCQpLE1hdGguYWJzKHJ0KSkmJk1hdGguYWJzKFMtaXQpPD1lLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhTKSxNYXRoLmFicyhpdCkpJiZNYXRoLmFicyhQLWN0KTw9ZS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoUCksTWF0aC5hYnMoY3QpKSYmTWF0aC5hYnMody1odCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHcpLE1hdGguYWJzKGh0KSkmJk1hdGguYWJzKFUtYXQpPD1lLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhVKSxNYXRoLmFicyhhdCkpfX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiY3JlYXRlIixmdW5jdGlvbigpe3JldHVybiBufSksdC5kKHIsImNsb25lIixmdW5jdGlvbigpe3JldHVybiBhfSksdC5kKHIsImZyb21WYWx1ZXMiLGZ1bmN0aW9uKCl7cmV0dXJuIHN9KSx0LmQociwiY29weSIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pLHQuZChyLCJzZXQiLGZ1bmN0aW9uKCl7cmV0dXJuIG99KSx0LmQociwiYWRkIixmdW5jdGlvbigpe3JldHVybiBjfSksdC5kKHIsInN1YnRyYWN0IixmdW5jdGlvbigpe3JldHVybiBtfSksdC5kKHIsIm11bHRpcGx5IixmdW5jdGlvbigpe3JldHVybiB1fSksdC5kKHIsImRpdmlkZSIsZnVuY3Rpb24oKXtyZXR1cm4gcH0pLHQuZChyLCJjZWlsIixmdW5jdGlvbigpe3JldHVybiB5fSksdC5kKHIsImZsb29yIixmdW5jdGlvbigpe3JldHVybiBPfSksdC5kKHIsIm1pbiIsZnVuY3Rpb24oKXtyZXR1cm4geH0pLHQuZChyLCJtYXgiLGZ1bmN0aW9uKCl7cmV0dXJuIHZ9KSx0LmQociwicm91bmQiLGZ1bmN0aW9uKCl7cmV0dXJuIFR9KSx0LmQociwic2NhbGUiLGZ1bmN0aW9uKCl7cmV0dXJuIGx9KSx0LmQociwic2NhbGVBbmRBZGQiLGZ1bmN0aW9uKCl7cmV0dXJuIGh9KSx0LmQociwiZGlzdGFuY2UiLGZ1bmN0aW9uKCl7cmV0dXJuIGZ9KSx0LmQociwic3F1YXJlZERpc3RhbmNlIixmdW5jdGlvbigpe3JldHVybiBnfSksdC5kKHIsImxlbmd0aCIsZnVuY3Rpb24oKXtyZXR1cm4gTX0pLHQuZChyLCJzcXVhcmVkTGVuZ3RoIixmdW5jdGlvbigpe3JldHVybiBBfSksdC5kKHIsIm5lZ2F0ZSIsZnVuY3Rpb24oKXtyZXR1cm4gQ30pLHQuZChyLCJpbnZlcnNlIixmdW5jdGlvbigpe3JldHVybiBifSksdC5kKHIsIm5vcm1hbGl6ZSIsZnVuY3Rpb24oKXtyZXR1cm4gRX0pLHQuZChyLCJkb3QiLGZ1bmN0aW9uKCl7cmV0dXJuIEx9KSx0LmQociwiY3Jvc3MiLGZ1bmN0aW9uKCl7cmV0dXJuIER9KSx0LmQociwibGVycCIsZnVuY3Rpb24oKXtyZXR1cm4gSX0pLHQuZChyLCJyYW5kb20iLGZ1bmN0aW9uKCl7cmV0dXJuIFJ9KSx0LmQociwidHJhbnNmb3JtTWF0MiIsZnVuY3Rpb24oKXtyZXR1cm4gQn0pLHQuZChyLCJ0cmFuc2Zvcm1NYXQyZCIsZnVuY3Rpb24oKXtyZXR1cm4gen0pLHQuZChyLCJ0cmFuc2Zvcm1NYXQzIixmdW5jdGlvbigpe3JldHVybiBLfSksdC5kKHIsInRyYW5zZm9ybU1hdDQiLGZ1bmN0aW9uKCl7cmV0dXJuIFF9KSx0LmQociwicm90YXRlIixmdW5jdGlvbigpe3JldHVybiBffSksdC5kKHIsImFuZ2xlIixmdW5jdGlvbigpe3JldHVybiBqfSksdC5kKHIsInplcm8iLGZ1bmN0aW9uKCl7cmV0dXJuIEd9KSx0LmQociwic3RyIixmdW5jdGlvbigpe3JldHVybiBYfSksdC5kKHIsImV4YWN0RXF1YWxzIixmdW5jdGlvbigpe3JldHVybiBafSksdC5kKHIsImVxdWFscyIsZnVuY3Rpb24oKXtyZXR1cm4gdHR9KSx0LmQociwibGVuIixmdW5jdGlvbigpe3JldHVybiBudH0pLHQuZChyLCJzdWIiLGZ1bmN0aW9uKCl7cmV0dXJuIHF9KSx0LmQociwibXVsIixmdW5jdGlvbigpe3JldHVybiBkdH0pLHQuZChyLCJkaXYiLGZ1bmN0aW9uKCl7cmV0dXJuIHV0fSksdC5kKHIsImRpc3QiLGZ1bmN0aW9uKCl7cmV0dXJuIFd9KSx0LmQociwic3FyRGlzdCIsZnVuY3Rpb24oKXtyZXR1cm4gRn0pLHQuZChyLCJzcXJMZW4iLGZ1bmN0aW9uKCl7cmV0dXJuIFZ9KSx0LmQociwiZm9yRWFjaCIsZnVuY3Rpb24oKXtyZXR1cm4gSn0pO3ZhciBlPXQoMik7ZnVuY3Rpb24gbigpe3ZhciBOPW5ldyBlLkFSUkFZX1RZUEUoMik7cmV0dXJuIGUuQVJSQVlfVFlQRSE9RmxvYXQzMkFycmF5JiYoTlswXT0wLE5bMV09MCksTn1mdW5jdGlvbiBhKE4pe3ZhciAkPW5ldyBlLkFSUkFZX1RZUEUoMik7cmV0dXJuICRbMF09TlswXSwkWzFdPU5bMV0sJH1mdW5jdGlvbiBzKE4sJCl7dmFyIFM9bmV3IGUuQVJSQVlfVFlQRSgyKTtyZXR1cm4gU1swXT1OLFNbMV09JCxTfWZ1bmN0aW9uIGkoTiwkKXtyZXR1cm4gTlswXT0kWzBdLE5bMV09JFsxXSxOfWZ1bmN0aW9uIG8oTiwkLFMpe3JldHVybiBOWzBdPSQsTlsxXT1TLE59ZnVuY3Rpb24gYyhOLCQsUyl7cmV0dXJuIE5bMF09JFswXStTWzBdLE5bMV09JFsxXStTWzFdLE59ZnVuY3Rpb24gbShOLCQsUyl7cmV0dXJuIE5bMF09JFswXS1TWzBdLE5bMV09JFsxXS1TWzFdLE59ZnVuY3Rpb24gdShOLCQsUyl7cmV0dXJuIE5bMF09JFswXSpTWzBdLE5bMV09JFsxXSpTWzFdLE59ZnVuY3Rpb24gcChOLCQsUyl7cmV0dXJuIE5bMF09JFswXS9TWzBdLE5bMV09JFsxXS9TWzFdLE59ZnVuY3Rpb24geShOLCQpe3JldHVybiBOWzBdPU1hdGguY2VpbCgkWzBdKSxOWzFdPU1hdGguY2VpbCgkWzFdKSxOfWZ1bmN0aW9uIE8oTiwkKXtyZXR1cm4gTlswXT1NYXRoLmZsb29yKCRbMF0pLE5bMV09TWF0aC5mbG9vcigkWzFdKSxOfWZ1bmN0aW9uIHgoTiwkLFMpe3JldHVybiBOWzBdPU1hdGgubWluKCRbMF0sU1swXSksTlsxXT1NYXRoLm1pbigkWzFdLFNbMV0pLE59ZnVuY3Rpb24gdihOLCQsUyl7cmV0dXJuIE5bMF09TWF0aC5tYXgoJFswXSxTWzBdKSxOWzFdPU1hdGgubWF4KCRbMV0sU1sxXSksTn1mdW5jdGlvbiBUKE4sJCl7cmV0dXJuIE5bMF09TWF0aC5yb3VuZCgkWzBdKSxOWzFdPU1hdGgucm91bmQoJFsxXSksTn1mdW5jdGlvbiBsKE4sJCxTKXtyZXR1cm4gTlswXT0kWzBdKlMsTlsxXT0kWzFdKlMsTn1mdW5jdGlvbiBoKE4sJCxTLFApe3JldHVybiBOWzBdPSRbMF0rU1swXSpQLE5bMV09JFsxXStTWzFdKlAsTn1mdW5jdGlvbiBmKE4sJCl7dmFyIFM9JFswXS1OWzBdLFA9JFsxXS1OWzFdO3JldHVybiBNYXRoLmh5cG90KFMsUCl9ZnVuY3Rpb24gZyhOLCQpe3ZhciBTPSRbMF0tTlswXSxQPSRbMV0tTlsxXTtyZXR1cm4gUypTK1AqUH1mdW5jdGlvbiBNKE4pe3ZhciAkPU5bMF0sUz1OWzFdO3JldHVybiBNYXRoLmh5cG90KCQsUyl9ZnVuY3Rpb24gQShOKXt2YXIgJD1OWzBdLFM9TlsxXTtyZXR1cm4gJCokK1MqU31mdW5jdGlvbiBDKE4sJCl7cmV0dXJuIE5bMF09LSRbMF0sTlsxXT0tJFsxXSxOfWZ1bmN0aW9uIGIoTiwkKXtyZXR1cm4gTlswXT0xLyRbMF0sTlsxXT0xLyRbMV0sTn1mdW5jdGlvbiBFKE4sJCl7dmFyIFM9JFswXSxQPSRbMV0sdz1TKlMrUCpQO3JldHVybiB3PjAmJih3PTEvTWF0aC5zcXJ0KHcpKSxOWzBdPSRbMF0qdyxOWzFdPSRbMV0qdyxOfWZ1bmN0aW9uIEwoTiwkKXtyZXR1cm4gTlswXSokWzBdK05bMV0qJFsxXX1mdW5jdGlvbiBEKE4sJCxTKXt2YXIgUD0kWzBdKlNbMV0tJFsxXSpTWzBdO3JldHVybiBOWzBdPU5bMV09MCxOWzJdPVAsTn1mdW5jdGlvbiBJKE4sJCxTLFApe3ZhciB3PSRbMF0sVT0kWzFdO3JldHVybiBOWzBdPXcrUCooU1swXS13KSxOWzFdPVUrUCooU1sxXS1VKSxOfWZ1bmN0aW9uIFIoTiwkKXskPSR8fDE7dmFyIFM9ZS5SQU5ET00oKSoyKk1hdGguUEk7cmV0dXJuIE5bMF09TWF0aC5jb3MoUykqJCxOWzFdPU1hdGguc2luKFMpKiQsTn1mdW5jdGlvbiBCKE4sJCxTKXt2YXIgUD0kWzBdLHc9JFsxXTtyZXR1cm4gTlswXT1TWzBdKlArU1syXSp3LE5bMV09U1sxXSpQK1NbM10qdyxOfWZ1bmN0aW9uIHooTiwkLFMpe3ZhciBQPSRbMF0sdz0kWzFdO3JldHVybiBOWzBdPVNbMF0qUCtTWzJdKncrU1s0XSxOWzFdPVNbMV0qUCtTWzNdKncrU1s1XSxOfWZ1bmN0aW9uIEsoTiwkLFMpe3ZhciBQPSRbMF0sdz0kWzFdO3JldHVybiBOWzBdPVNbMF0qUCtTWzNdKncrU1s2XSxOWzFdPVNbMV0qUCtTWzRdKncrU1s3XSxOfWZ1bmN0aW9uIFEoTiwkLFMpe3ZhciBQPSRbMF0sdz0kWzFdO3JldHVybiBOWzBdPVNbMF0qUCtTWzRdKncrU1sxMl0sTlsxXT1TWzFdKlArU1s1XSp3K1NbMTNdLE59ZnVuY3Rpb24gXyhOLCQsUyxQKXt2YXIgdz0kWzBdLVNbMF0sVT0kWzFdLVNbMV0sSD1NYXRoLnNpbihQKSxZPU1hdGguY29zKFApO3JldHVybiBOWzBdPXcqWS1VKkgrU1swXSxOWzFdPXcqSCtVKlkrU1sxXSxOfWZ1bmN0aW9uIGooTiwkKXt2YXIgUz1OWzBdLFA9TlsxXSx3PSRbMF0sVT0kWzFdLEg9TWF0aC5zcXJ0KFMqUytQKlApKk1hdGguc3FydCh3KncrVSpVKSxZPUgmJihTKncrUCpVKS9IO3JldHVybiBNYXRoLmFjb3MoTWF0aC5taW4oTWF0aC5tYXgoWSwtMSksMSkpfWZ1bmN0aW9uIEcoTil7cmV0dXJuIE5bMF09MCxOWzFdPTAsTn1mdW5jdGlvbiBYKE4pe3JldHVybiJ2ZWMyKCIrTlswXSsiLCAiK05bMV0rIikifWZ1bmN0aW9uIFooTiwkKXtyZXR1cm4gTlswXT09PSRbMF0mJk5bMV09PT0kWzFdfWZ1bmN0aW9uIHR0KE4sJCl7dmFyIFM9TlswXSxQPU5bMV0sdz0kWzBdLFU9JFsxXTtyZXR1cm4gTWF0aC5hYnMoUy13KTw9ZS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoUyksTWF0aC5hYnModykpJiZNYXRoLmFicyhQLVUpPD1lLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhQKSxNYXRoLmFicyhVKSl9dmFyIG50PU0scT1tLGR0PXUsdXQ9cCxXPWYsRj1nLFY9QSxKPWZ1bmN0aW9uKCl7dmFyIE49bigpO3JldHVybiBmdW5jdGlvbigkLFMsUCx3LFUsSCl7dmFyIFksaztmb3IoU3x8KFM9MiksUHx8KFA9MCksdz9rPU1hdGgubWluKHcqUytQLCQubGVuZ3RoKTprPSQubGVuZ3RoLFk9UDtZPGs7WSs9UylOWzBdPSRbWV0sTlsxXT0kW1krMV0sVShOLE4sSCksJFtZXT1OWzBdLCRbWSsxXT1OWzFdO3JldHVybiAkfX0oKX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKTt2YXIgZT10KDEzKTt0LmQociwiUmVuZGVyZXIiLGZ1bmN0aW9uKCl7cmV0dXJuIGUuZGVmYXVsdH0pO3ZhciBuPXQoNDApO3QuZChyLCJGaWd1cmUyRCIsZnVuY3Rpb24oKXtyZXR1cm4gbi5kZWZhdWx0fSk7dmFyIGE9dCg1Nik7dC5kKHIsIk1lc2gyRCIsZnVuY3Rpb24oKXtyZXR1cm4gYS5kZWZhdWx0fSk7dmFyIHM9dCgyOSk7dC5kKHIsIk1lc2hDbG91ZCIsZnVuY3Rpb24oKXtyZXR1cm4gcy5kZWZhdWx0fSk7dmFyIGk9dCgyMyk7dC5kKHIsInBhcnNlRm9udCIsZnVuY3Rpb24oKXtyZXR1cm4gaS5kZWZhdWx0fSk7dmFyIG89dCgzMSk7dC5kKHIsInBhcnNlQ29sb3IiLGZ1bmN0aW9uKCl7cmV0dXJuIG8uZGVmYXVsdH0pO3ZhciBjPXQoMjEpO3QuZChyLCJFTlYiLGZ1bmN0aW9uKCl7cmV0dXJuIGMuZGVmYXVsdH0pLHQoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gYn0pO3ZhciBlPXQoMTQpLG49dCgxKSxhPXQoMjApLHM9dCgyNyksaT10KDI1KSxvPXQoNDApLGM9dCg1NiksbT10KDI5KSx1PXQoNTkpLHA9dCgyMSkseT10KDYzKTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7Y29uc3QgTz17YXV0b1VwZGF0ZTohMSxwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6ITEsYnVmZmVyU2l6ZToxNTAwfSx4PWBhdHRyaWJ1dGUgdmVjMyBhX3ZlcnRleFBvc2l0aW9uOwphdHRyaWJ1dGUgdmVjMyBhX3ZlcnRleFRleHR1cmVDb29yZDsKdmFyeWluZyB2ZWMzIHZUZXh0dXJlQ29vcmQ7CnVuaWZvcm0gbWF0MyB2aWV3TWF0cml4Owp1bmlmb3JtIG1hdDMgcHJvamVjdGlvbk1hdHJpeDsKCnZvaWQgbWFpbigpIHsKICBnbF9Qb2ludFNpemUgPSAxLjA7CiAgdmVjMyBwb3MgPSBwcm9qZWN0aW9uTWF0cml4ICogdmlld01hdHJpeCAqIHZlYzMoYV92ZXJ0ZXhQb3NpdGlvbi54eSwgMS4wKTsKICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zLnh5LCAxLjAsIDEuMCk7ICAgIAogIHZUZXh0dXJlQ29vcmQgPSBhX3ZlcnRleFRleHR1cmVDb29yZDsgICAgICAgICAgICAgIAp9CmAsdj1gcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7CnZhcnlpbmcgdmVjMyB2VGV4dHVyZUNvb3JkOwp1bmlmb3JtIHNhbXBsZXIyRCB1X3RleFNhbXBsZXI7CnZvaWQgbWFpbigpIHsKICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodV90ZXhTYW1wbGVyLCB2VGV4dHVyZUNvb3JkLnh5KTsKfQpgLFQ9U3ltYm9sKCJnbFJlbmRlcmVyIiksbD1TeW1ib2woImNhbnZhc1JlbmRlcmVyIiksaD1TeW1ib2woIm9wdGlvbnMiKSxmPVN5bWJvbCgiZ2xvYmFsVHJhbnNmb3JtIiksZz1TeW1ib2woImFwcGx5R2xvYmFsVHJhbnNmb3JtIiksTT1TeW1ib2woImNhbnZhcyIpO2Z1bmN0aW9uIEEoRSl7Y29uc3QgTD1FLmdsLEQ9RS5mYm87RCYmTC5iaW5kRnJhbWVidWZmZXIoTC5GUkFNRUJVRkZFUixEKSxFLl9kcmF3KCksRCYmTC5iaW5kRnJhbWVidWZmZXIoTC5GUkFNRUJVRkZFUixudWxsKX1mdW5jdGlvbiBDKEUsTCxELEkpe2NvbnN0IFI9RS5jcmVhdGVUZXh0dXJlKEwuY2FudmFzKSxCPVtbWzAsMF0sW0QsMF0sW0QsSV0sWzAsSV0sWzAsMF1dXTtCLmNsb3NlZD0hMDtjb25zdCB6PW5ldyBjLmRlZmF1bHQoe2NvbnRvdXJzOkJ9KTt6LnNldFRleHR1cmUoUiksRS5zZXRNZXNoRGF0YShbei5tZXNoRGF0YV0pLEEoRSksUi5kZWxldGUoKSxMLmNsZWFyUmVjdCgwLDAsRCxJKSxkZWxldGUgTC5fZmlsdGVyfWNsYXNzIGJ7Y29uc3RydWN0b3IoTCxEPXt9KXtsZXQgST1ELmNvbnRleHRUeXBlO2lmKEl8fCh0eXBlb2YgV2ViR0wyUmVuZGVyaW5nQ29udGV4dD09ImZ1bmN0aW9uIj9JPSJ3ZWJnbDIiOnR5cGVvZiBXZWJHTFJlbmRlcmluZ0NvbnRleHQ9PSJmdW5jdGlvbiI/ST0id2ViZ2wiOkk9IjJkIiksIUwuZ2V0Q29udGV4dCl7Y29uc3QgUj1MO0w9e2dldENvbnRleHQoKXtyZXR1cm4gUn0sd2lkdGg6RC53aWR0aCxoZWlnaHQ6RC5oZWlnaHR9LFIuY2FudmFzPUwsST0iMmQifWlmKHRoaXNbTV09TCxJIT09IndlYmdsIiYmSSE9PSJ3ZWJnbDIiJiZJIT09IjJkIil0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY29udGV4dCB0eXBlICR7SX1gKTtpZihELmNvbnRleHRUeXBlPUksdGhpc1toXT1PYmplY3QuYXNzaWduKHt9LE8sRCksST09PSJ3ZWJnbCJ8fEk9PT0id2ViZ2wyIil7ST09PSJ3ZWJnbDIiJiYodGhpc1toXS53ZWJnbDI9ITApO2NvbnN0IFI9bmV3IGUuZGVmYXVsdChMLHRoaXNbaF0pO0k9PT0id2ViZ2wyIiYmIVIuaXNXZWJHTDImJihELmNvbnRleHRUeXBlPSJ3ZWJnbCIpLE9iamVjdCh5LmNyZWF0ZVNoYWRlcnMpKFIpLE9iamVjdCh5LmFwcGx5U2hhZGVyKShSKSxPYmplY3QoeS5jcmVhdGVDbG91ZFNoYWRlcnMpKFIpO2NvbnN0IEI9Ui5nbDtCLmNsZWFyQ29sb3IoMCwwLDAsMCksQi5ibGVuZEZ1bmNTZXBhcmF0ZShCLlNSQ19BTFBIQSxCLk9ORV9NSU5VU19TUkNfQUxQSEEsQi5PTkUsQi5PTkVfTUlOVVNfU1JDX0FMUEhBKSx0aGlzW1RdPVJ9ZWxzZSB0aGlzW2xdPW5ldyBhLmRlZmF1bHQoTCx0aGlzW2hdKTt0aGlzW2ZdPVsxLDAsMCwwLDEsMCwwLDAsMV0sdGhpcy51cGRhdGVSZXNvbHV0aW9uKCl9Z2V0IGNhbnZhcygpe3JldHVybiB0aGlzW01dfWdldCBjYW52YXNSZW5kZXJlcigpe3JldHVybiB0aGlzW2xdfWdldCBnbFJlbmRlcmVyKCl7cmV0dXJuIHRoaXNbVF19Z2V0IGlzV2ViR0wyKCl7cmV0dXJuIHRoaXNbVF0mJnRoaXNbVF0uaXNXZWJHTDJ9Z2V0IG9wdGlvbnMoKXtyZXR1cm4gdGhpc1toXX1nZXQgZ2xvYmFsVHJhbnNmb3JtTWF0cml4KCl7Y29uc3QgTD10aGlzW2ZdO3JldHVybltMWzBdLExbMV0sTFszXSxMWzRdLExbNl0sTFs3XV19Z2V0IHZpZXdNYXRyaXgoKXtyZXR1cm4gdGhpc1tmXX1bZ10oKXtjb25zdCBMPXRoaXNbVF18fHRoaXNbbF07aWYodGhpc1tUXSl7Y29uc3R7d2lkdGg6RCxoZWlnaHQ6SX09dGhpcy5jYW52YXM7TC51bmlmb3Jtcy52aWV3TWF0cml4PXRoaXMudmlld01hdHJpeCxMLnVuaWZvcm1zLnByb2plY3Rpb25NYXRyaXg9dGhpcy5wcm9qZWN0aW9uTWF0cml4LEwudW5pZm9ybXMudV9yZXNvbHV0aW9uPVtELEldfX11cGRhdGVSZXNvbHV0aW9uKCl7Y29uc3R7d2lkdGg6TCxoZWlnaHQ6RH09dGhpcy5jYW52YXMsST1bMSwwLDAsMCwxLDAsLUwvMiwtRC8yLDFdLFI9WzIvTCwwLDAsMCwtMi9ELDAsMCwwLDFdLEI9bi5tYXQzLm11bHRpcGx5KEFycmF5Lm9mKDAsMCwwLDAsMCwwLDAsMCwwKSxSLEkpO3RoaXMucHJvamVjdGlvbk1hdHJpeD1CLHRoaXNbVF0mJnRoaXNbVF0uZ2wudmlld3BvcnQoMCwwLEwsRCl9Y3JlYXRlVGV4dHVyZShMLEQpe3JldHVybih0aGlzW1RdfHx0aGlzW2xdKS5jcmVhdGVUZXh0dXJlKEwsRCl9bG9hZFRleHR1cmUoTCx7dXNlSW1hZ2VCaXRtYXA6RD0hMX09e30pe3JldHVybih0aGlzW1RdfHx0aGlzW2xdKS5sb2FkVGV4dHVyZShMLHt1c2VJbWFnZUJpdG1hcDpEfSl9Y3JlYXRlVGV4dChMLHtmb250OkQ9IjE2cHggYXJpYWwiLGZpbGxDb2xvcjpJPW51bGwsc3Ryb2tlQ29sb3I6Uj1udWxsLHN0cm9rZVdpZHRoOkI9MX09e30pe2lmKHRoaXNbVF0pe2NvbnN0IHo9cC5kZWZhdWx0LmNyZWF0ZVRleHQoTCx7Zm9udDpELGZpbGxDb2xvcjpJLHN0cm9rZUNvbG9yOlIsc3Ryb2tlV2lkdGg6Qn0pO3JldHVybntpbWFnZTp0aGlzLmNyZWF0ZVRleHR1cmUoei5pbWFnZSkscmVjdDp6LnJlY3R9fXJldHVybntfaW1nOntmb250OkQsZmlsbENvbG9yOkksc3Ryb2tlQ29sb3I6UixzdHJva2VXaWR0aDpCLHRleHQ6TH19fWNyZWF0ZVByb2dyYW0oe3ZlcnRleDpMLGZyYWdtZW50OkQsb3B0aW9uczpJfT17fSl7aWYodGhpc1tUXSl7Y29uc3QgUj10aGlzW1RdLmNvbXBpbGVTeW5jKEQsTCk7cmV0dXJuIFIuX2F0dHJpYk9wdHM9SSxSfXRocm93IG5ldyBFcnJvcigiQ29udGV4dCAyRCBjYW5ub3QgY3JlYXRlIHdlYmdsIHByb2dyYW0uIil9Y3JlYXRlUGFzc1Byb2dyYW0oe3ZlcnRleDpMPXgsZnJhZ21lbnQ6RD12LG9wdGlvbnM6SX09e30pe3JldHVybiB0aGlzLmNyZWF0ZVByb2dyYW0oe3ZlcnRleDpMLGZyYWdtZW50OkQsb3B0aW9uczpJfSl9dXNlUHJvZ3JhbShMLEQ9e30pe2lmKHRoaXNbVF0pe2NvbnN0IEk9T2JqZWN0LmFzc2lnbih7fSxMLl9hdHRyaWJPcHRzLEQpO3JldHVybiB0aGlzW1RdLnVzZVByb2dyYW0oTCxJKX10aHJvdyBuZXcgRXJyb3IoIkNvbnRleHQgMkQgY2Fubm90IHVzZSB3ZWJnbCBwcm9ncmFtLiIpfWRlbGV0ZVRleHR1cmUoTCl7cmV0dXJuKHRoaXNbVF18fHRoaXNbbF0pLmRlbGV0ZVRleHR1cmUoTCl9Y2xlYXIoLi4uTCl7aWYodGhpc1tUXSl7Y29uc3QgRD10aGlzW1RdLmdsO0QuY2xlYXIoRC5DT0xPUl9CVUZGRVJfQklUKX1lbHNlIHRoaXNbbF0uY2xlYXIoLi4uTCl9ZHJhd01lc2hDbG91ZChMLHtjbGVhcjpEPSExLHByb2dyYW06ST1udWxsfT17fSl7Y29uc3QgUj10aGlzW1RdfHx0aGlzW2xdLEI9SXx8TC5wcm9ncmFtO2lmKHRoaXNbVF0pe2NvbnN0IHo9Ui5nbDtpZihEJiZ6LmNsZWFyKHouQ09MT1JfQlVGRkVSX0JJVCksQilSLnByb2dyYW0hPT1CJiZ0aGlzLnVzZVByb2dyYW0oQix7YV9jb2xvcjp7dHlwZToiVU5TSUdORURfQllURSIsbm9ybWFsaXplOiEwfSxhX2ZpbGxDbG91ZENvbG9yOnt0eXBlOiJVTlNJR05FRF9CWVRFIixub3JtYWxpemU6ITB9LGFfc3Ryb2tlQ2xvdWRDb2xvcjp7dHlwZToiVU5TSUdORURfQllURSIsbm9ybWFsaXplOiEwfSxhX2ZyYW1lSW5kZXg6e3R5cGU6IlVOU0lHTkVEX0JZVEUiLG5vcm1hbGl6ZTohMX19KTtlbHNle2NvbnN0IEs9TC5tZXNoLm1lc2hEYXRhLFE9ISFLLnVuaWZvcm1zLnVfdGV4U2FtcGxlcixfPSEhSy51bmlmb3Jtcy51X2ZpbHRlckZsYWcsaj0hIUsudW5pZm9ybXMudV9yYWRpYWxHcmFkaWVudFZlY3RvcixHPUwuaGFzQ2xvdWRDb2xvcixYPUwuaGFzQ2xvdWRGaWx0ZXIsWj0hIUsudW5pZm9ybXMudV9jbGlwU2FtcGxlcjtPYmplY3QoeS5hcHBseUNsb3VkU2hhZGVyKShSLHtoYXNUZXh0dXJlOlEsaGFzRmlsdGVyOl8saGFzR3JhZGllbnQ6aixoYXNDbG91ZENvbG9yOkcsaGFzQ2xvdWRGaWx0ZXI6WCxoYXNDbGlwUGF0aDpafSl9dGhpc1tnXSgpLFIuc2V0TWVzaERhdGEoW0wubWVzaERhdGFdKSxMLmJlZm9yZVJlbmRlciYmTC5iZWZvcmVSZW5kZXIoeixMKSxBKFIpLEwuYWZ0ZXJSZW5kZXImJkwuYWZ0ZXJSZW5kZXIoeixMKX1lbHNlIFIuc2V0VHJhbnNmb3JtKHRoaXMuZ2xvYmFsVHJhbnNmb3JtTWF0cml4KSxSLmRyYXdNZXNoQ2xvdWQoTCx7Y2xlYXI6RCxob29rOiExfSl9ZHJhd01lc2hlcyhMLHtjbGVhcjpEPSExLHByb2dyYW06ST1udWxsfT17fSl7Y29uc3QgUj10aGlzW1RdfHx0aGlzW2xdO2lmKHRoaXNbVF0pe2NvbnN0IEI9Ui5mYm8sej1PYmplY3Qocy5kZWZhdWx0KSh0aGlzLEwsST09bnVsbCksSz1SLmdsO0QmJksuY2xlYXIoSy5DT0xPUl9CVUZGRVJfQklUKTtjb25zdCBRPSFPYmplY3QodS5pc1VuaXRUcmFuc2Zvcm0pKHRoaXMuZ2xvYmFsVHJhbnNmb3JtTWF0cml4KTt0aGlzLl9kcmF3Q2FsbHM9MDtmb3IoY29uc3QgXyBvZiB6KXt0aGlzLl9kcmF3Q2FsbHMrKztjb25zdCBqPUl8fF8ucHJvZ3JhbTtpZihfIGluc3RhbmNlb2YgbS5kZWZhdWx0KXRoaXMuZHJhd01lc2hDbG91ZChfLHtjbGVhcjpELHByb2dyYW06an0pO2Vsc2V7Y29uc3R7d2lkdGg6RyxoZWlnaHQ6WH09dGhpcy5jYW52YXM7aWYoXy5iZWZvcmVSZW5kZXImJl8uYmVmb3JlUmVuZGVyKEssXyksXy5wYXNzLmxlbmd0aCYmKCghdGhpcy5mYm98fHRoaXMuZmJvLndpZHRoIT09R3x8dGhpcy5mYm8uaGVpZ2h0IT09WCkmJih0aGlzLmZibz17d2lkdGg6RyxoZWlnaHQ6WCx0YXJnZXQ6Ui5jcmVhdGVGQk8oKSxidWZmZXI6Ui5jcmVhdGVGQk8oKSxzd2FwKCl7W3RoaXMudGFyZ2V0LHRoaXMuYnVmZmVyXT1bdGhpcy5idWZmZXIsdGhpcy50YXJnZXRdfX0pLFIuYmluZEZCTyh0aGlzLmZiby50YXJnZXQpKSwhaiYmXy5maWx0ZXJDYW52YXMpe09iamVjdCh5LmFwcGx5U2hhZGVyKShSLHtoYXNUZXh0dXJlOiEwfSk7bGV0IFo9dGhpcy5maWx0ZXJDb250ZXh0O1p8fChaPXAuZGVmYXVsdC5jcmVhdGVDYW52YXMoRyxYKS5nZXRDb250ZXh0KCIyZCIpLHRoaXMuZmlsdGVyQ29udGV4dD1aKTtjb25zdCB0dD1MW18ucGFja0luZGV4XSxudD10dC5maWx0ZXIscT1MW18ucGFja0luZGV4KzFdLGR0PUxbXy5wYWNrSW5kZXgtMV07KCFkdHx8IWR0LmZpbHRlckNhbnZhc3x8ZHQuZmlsdGVyIT09bnQpJiYoIXF8fCFxLmZpbHRlckNhbnZhc3x8cS5maWx0ZXIhPT1udCk/KFE/KFouc2F2ZSgpLE9iamVjdChpLmRyYXdNZXNoMkQpKHR0LFosITEpLFoucmVzdG9yZSgpLE9iamVjdChpLmFwcGx5RmlsdGVyKShaLG50KSk6T2JqZWN0KGkuZHJhd01lc2gyRCkodHQsWiwhMCksdGhpc1tnXSgpLEMoUixaLEcsWCkpOihRJiZaLnNhdmUoKSxPYmplY3QoaS5kcmF3TWVzaDJEKSh0dCxaLCExKSxRJiZaLnJlc3RvcmUoKSwoIXF8fCFxLmZpbHRlckNhbnZhc3x8dHQuZmlsdGVyIT09cS5maWx0ZXIpJiYoT2JqZWN0KGkuYXBwbHlGaWx0ZXIpKFosbnQpLHRoaXNbZ10oKSxDKFIsWixHLFgpKSl9ZWxzZXtpZihqKVIucHJvZ3JhbSE9PWomJnRoaXMudXNlUHJvZ3JhbShqLHthX2NvbG9yOnt0eXBlOiJVTlNJR05FRF9CWVRFIixub3JtYWxpemU6ITB9fSk7ZWxzZXtjb25zdCBaPSEhXy51bmlmb3Jtcy51X3RleFNhbXBsZXIsdHQ9ISFfLnVuaWZvcm1zLnVfZmlsdGVyRmxhZyxudD0hIV8udW5pZm9ybXMudV9yYWRpYWxHcmFkaWVudFZlY3RvcixxPSEhXy51bmlmb3Jtcy51X2NsaXBTYW1wbGVyO09iamVjdCh5LmFwcGx5U2hhZGVyKShSLHtoYXNUZXh0dXJlOlosaGFzRmlsdGVyOnR0LGhhc0dyYWRpZW50Om50LGhhc0NsaXBQYXRoOnF9KX1fLmZpbHRlckNhbnZhcyYmY29uc29sZS53YXJuKCJVc2VyIHByb2dyYW0gaWdub3JlZCBzb21lIGZpbHRlciBlZmZlY3RzLiIpLHRoaXNbZ10oKSxSLnNldE1lc2hEYXRhKFtfXSksQShSKX1pZihfLnBhc3MubGVuZ3RoKXtjb25zdCBaPV8ucGFzcy5sZW5ndGg7Xy5wYXNzLmZvckVhY2goKHR0LG50KT0+e3R0LmJsZW5kPV8uZW5hYmxlQmxlbmQsdHQuc2V0VGV4dHVyZShSLmZiby50ZXh0dXJlKSxudD09PVotMT9SLmJpbmRGQk8oQik6KHRoaXMuZmJvLnN3YXAoKSxSLmJpbmRGQk8odGhpcy5mYm8udGFyZ2V0KSksdHQucHJvZ3JhbT9SLnVzZVByb2dyYW0odHQucHJvZ3JhbSk6KHRoaXMuZGVmYXVsdFBhc3NQcm9ncmFtPXRoaXMuZGVmYXVsdFBhc3NQcm9ncmFtfHx0aGlzLmNyZWF0ZVBhc3NQcm9ncmFtKCksUi51c2VQcm9ncmFtKHRoaXMuZGVmYXVsdFBhc3NQcm9ncmFtKSksUi5zZXRNZXNoRGF0YShbdHQubWVzaERhdGFdKSxLLmNsZWFyKEsuQ09MT1JfQlVGRkVSX0JJVCksQShSKX0pfV8uYWZ0ZXJSZW5kZXImJl8uYWZ0ZXJSZW5kZXIoSyxfKX19fWVsc2UgUi5zZXRUcmFuc2Zvcm0odGhpcy5nbG9iYWxUcmFuc2Zvcm1NYXRyaXgpLFIuZHJhd01lc2hlcyhMLHtjbGVhcjpEfSl9ZHJhd0ltYWdlKEwsLi4uRCl7Y29uc3QgST1ELmxlbmd0aDtpZihJPDIpdGhyb3cgbmV3IFR5cGVFcnJvcihgRmFpbGVkIHRvIGV4ZWN1dGUgJ2RyYXdJbWFnZScgb24gJ1JlbmRlcmVyJzogMyBhcmd1bWVudHMgcmVxdWlyZWQsIGJ1dCBvbmx5ICR7RC5sZW5ndGgrMX0gcHJlc2VudC5gKTtpZihJIT09MiYmSSE9PTQmJkkhPT04KXRocm93IG5ldyBUeXBlRXJyb3IoYEZhaWxlZCB0byBleGVjdXRlICdkcmF3SW1hZ2UnIG9uICdSZW5kZXJlcic6IFZhbGlkIGFyaXRpZXMgYXJlOiBbMywgNSwgOV0sIGJ1dCAke0QubGVuZ3RoKzF9IGFyZ3VtZW50cyBwcm92aWRlZC5gKTtsZXQgUj1udWxsLEI9bnVsbDtJPT09Mj9SPVtEWzBdLERbMV0sTC53aWR0aCxMLmhlaWdodF06ST09PTQ/Uj1EOkk9PT04JiYoQj1ELnNsaWNlKDAsNCksUj1ELnNsaWNlKDQpKTtjb25zdCB6PXRoaXMuY3JlYXRlVGV4dHVyZShMKSx7d2lkdGg6SyxoZWlnaHQ6UX09dGhpcy5jYW52YXMsXz1uZXcgby5kZWZhdWx0O18ucmVjdChSWzBdLFJbMV0sSyxRKTtjb25zdCBqPW5ldyBjLmRlZmF1bHQoXyx7d2lkdGg6SyxoZWlnaHQ6UX0pO2ouc2V0VGV4dHVyZSh6LHtyZWN0OlIsc3JjUmVjdDpCfSksdGhpcy5kcmF3TWVzaGVzKFtqXSksdGhpcy5kZWxldGVUZXh0dXJlKHopfXNldEdsb2JhbFRyYW5zZm9ybSguLi5MKXtyZXR1cm4gdGhpc1tmXT1bTFswXSxMWzFdLDAsTFsyXSxMWzNdLDAsTFs0XSxMWzVdLDFdLHRoaXN9Z2xvYmFsVHJhbnNmb3JtKC4uLkwpe2NvbnN0IEQ9dGhpc1tmXTtyZXR1cm4gdGhpc1tmXT1uLm1hdDMubXVsdGlwbHkoQXJyYXkub2YoMCwwLDAsMCwwLDAsMCwwLDApLEQsTCksdGhpc31nbG9iYWxUcmFuc2xhdGUoTCxEKXtsZXQgST1uLm1hdDMuY3JlYXRlKCk7cmV0dXJuIEk9bi5tYXQzLnRyYW5zbGF0ZShBcnJheS5vZigwLDAsMCwwLDAsMCwwLDAsMCksSSxbTCxEXSksdGhpcy5nbG9iYWxUcmFuc2Zvcm0oLi4uSSl9Z2xvYmFsUm90YXRlKEwsW0QsSV09WzAsMF0pe2xldCBSPW4ubWF0My5jcmVhdGUoKTtyZXR1cm4gUj1uLm1hdDMudHJhbnNsYXRlKEFycmF5Lm9mKDAsMCwwLDAsMCwwLDAsMCwwKSxSLFtELEldKSxSPW4ubWF0My5yb3RhdGUoQXJyYXkub2YoMCwwLDAsMCwwLDAsMCwwLDApLFIsTCksUj1uLm1hdDMudHJhbnNsYXRlKEFycmF5Lm9mKDAsMCwwLDAsMCwwLDAsMCwwKSxSLFstRCwtSV0pLHRoaXMuZ2xvYmFsVHJhbnNmb3JtKC4uLlIpfWdsb2JhbFNjYWxlKEwsRD1MLFtJLFJdPVswLDBdKXtsZXQgQj1uLm1hdDMuY3JlYXRlKCk7cmV0dXJuIEI9bi5tYXQzLnRyYW5zbGF0ZShBcnJheS5vZigwLDAsMCwwLDAsMCwwLDAsMCksQixbSSxSXSksQj1uLm1hdDMuc2NhbGUoQXJyYXkub2YoMCwwLDAsMCwwLDAsMCwwLDApLEIsW0wsRF0pLEI9bi5tYXQzLnRyYW5zbGF0ZShBcnJheS5vZigwLDAsMCwwLDAsMCwwLDAsMCksQixbLUksLVJdKSx0aGlzLmdsb2JhbFRyYW5zZm9ybSguLi5CKX1nbG9iYWxTa2V3KEwsRD1MLFtJLFJdPVswLDBdKXtsZXQgQj1uLm1hdDMuY3JlYXRlKCk7cmV0dXJuIEI9bi5tYXQzLnRyYW5zbGF0ZShBcnJheS5vZigwLDAsMCwwLDAsMCwwLDAsMCksQixbSSxSXSksQj1uLm1hdDMubXVsdGlwbHkoQXJyYXkub2YoMCwwLDAsMCwwLDAsMCwwLDApLEIsbi5tYXQzLmZyb21WYWx1ZXMoMSxNYXRoLnRhbihEKSxNYXRoLnRhbihMKSwxLDAsMCkpLEI9bi5tYXQzLnRyYW5zbGF0ZShBcnJheS5vZigwLDAsMCwwLDAsMCwwLDAsMCksQixbLUksLVJdKSx0aGlzLmdsb2JhbFRyYW5zZm9ybSguLi5CKX10cmFuc2Zvcm1Qb2ludChMLEQsSSl7bGV0IFI9dGhpcy5nbG9iYWxUcmFuc2Zvcm1NYXRyaXg7SSYmKFI9bi5tYXQzLm11bHRpcGx5KEFycmF5Lm9mKDAsMCwwLDAsMCwwLDAsMCwwKSxSLEkpKTtjb25zdCBCPUwqUlswXStEKlJbMl0rUls0XSx6PUwqUlsxXStEKlJbM10rUls1XTtyZXR1cm5bQix6XX19fSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpO3ZhciBlPXQoMTUpO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KSxyLmRlZmF1bHQ9ZS5kZWZhdWx0fSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJkZWZhdWx0IixmdW5jdGlvbigpe3JldHVybiB5fSk7dmFyIGU9dCgxNiksbj10KDE3KSxhPXQoMTgpLHM9dCgxOSk7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2Z1bmN0aW9uIGkoTyx4LHYpe3JldHVybiB4IGluIE8/T2JqZWN0LmRlZmluZVByb3BlcnR5KE8seCx7dmFsdWU6dixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOk9beF09dixPfWNvbnN0IG89e307ZnVuY3Rpb24gYyhPLHg9Myl7Y29uc3Qgdj1bXSxUPU8ubGVuZ3RoO2ZvcihsZXQgbD0wO2w8VDtsKyspbCV4PDImJnYucHVzaCguNSooT1tsXSsxKSk7cmV0dXJuIHZ9ZnVuY3Rpb24gbShPLHgpe2NvbnN0IHY9eC5fYnVmZmVycztPYmplY3QudmFsdWVzKHYpLmZvckVhY2goVD0+e08uZGVsZXRlQnVmZmVyKFQpfSkseC5fYnVmZmVycz17fX1mdW5jdGlvbiB1KE8seCx2KXtyZXR1cm4gTy5hY3RpdmVUZXh0dXJlKE8uVEVYVFVSRTArdiksQXJyYXkuaXNBcnJheSh4Ll9pbWcpP08uYmluZFRleHR1cmUoTy5URVhUVVJFX0NVQkVfTUFQLHgpOk8uYmluZFRleHR1cmUoTy5URVhUVVJFXzJELHgpLHh9Y29uc3QgcD17aW50OiIxaSIsaXZlYzI6IjJpIixpdmVjMzoiM2kiLGl2ZWM0OiI0aSIsZmxvYXQ6IjFmIix2ZWMyOiIyZiIsdmVjMzoiM2YiLHZlYzQ6IjRmIixtYXQyOiJNYXRyaXgyZnYiLG1hdDM6Ik1hdHJpeDNmdiIsbWF0NDoiTWF0cml4NGZ2IixzYW1wbGVyMUQ6InNhbXBsZXIxRCIsc2FtcGxlcjJEOiJzYW1wbGVyMkQiLHNhbXBsZXIzRDoic2FtcGxlcjNEIixzYW1wbGVyQ3ViZToic2FtcGxlckN1YmUiLHNhbXBsZXIxRFNoYWRvdzoic2FtcGxlcjFEU2hhZG93IixzYW1wbGVyMkRTaGFkb3c6InNhbXBsZXIyRFNoYWRvdyIsc2FtcGxlcjJEUmVjdDoic2FtcGxlcjJEUmVjdCIsc2FtcGxlcjJEUmVjdFNoYWRvdzoic2FtcGxlcjJEUmVjdFNoYWRvdyJ9O2NsYXNzIHl7c3RhdGljIGFkZExpYnMoeD17fSl7T2JqZWN0LmFzc2lnbihvLHgpfXN0YXRpYyBGTE9BVCh4LHYpe3JldHVybiBPYmplY3QoZS5wb2ludHNUb0J1ZmZlcikoeCxGbG9hdDMyQXJyYXksdil9c3RhdGljIFVOU0lHTkVEX0JZVEUoeCx2KXtyZXR1cm4gT2JqZWN0KGUucG9pbnRzVG9CdWZmZXIpKHgsVWludDhBcnJheSx2KX1zdGF0aWMgVU5TSUdORURfU0hPUlQoeCx2KXtyZXR1cm4gT2JqZWN0KGUucG9pbnRzVG9CdWZmZXIpKHgsVWludDE2QXJyYXksdil9c3RhdGljIEJZVEUoeCx2KXtyZXR1cm4gT2JqZWN0KGUucG9pbnRzVG9CdWZmZXIpKHgsSW50OEFycmF5LHYpfXN0YXRpYyBTSE9SVCh4LHYpe3JldHVybiBPYmplY3QoZS5wb2ludHNUb0J1ZmZlcikoeCxJbnQxNkFycmF5LHYpfWNvbnN0cnVjdG9yKHgsdj17fSl7dGhpcy5vcHRpb25zPU9iamVjdC5hc3NpZ24oe30seS5kZWZhdWx0T3B0aW9ucyx2KSx0aGlzLmNhbnZhcz14O2xldCBUO3RoaXMub3B0aW9ucy53ZWJnbDImJihUPXguZ2V0Q29udGV4dCgid2ViZ2wyIix0aGlzLm9wdGlvbnMpKSxUPT1udWxsJiYoVD1PYmplY3QoZS5zZXR1cFdlYkdMKSh4LHRoaXMub3B0aW9ucyksdGhpcy5haWFfZXh0PVQuZ2V0RXh0ZW5zaW9uKCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIikpLHRoaXMuZ2w9VCxULnZpZXdwb3J0KDAsMCx4LndpZHRoLHguaGVpZ2h0KSxULmNsZWFyQ29sb3IoMCwwLDAsMCksVC5ibGVuZEZ1bmNTZXBhcmF0ZShULlNSQ19BTFBIQSxULk9ORV9NSU5VU19TUkNfQUxQSEEsVC5PTkUsVC5PTkVfTUlOVVNfU1JDX0FMUEhBKSx0aGlzLnByb2dyYW1zPVtdLHRoaXMuX2V2ZW50cz17fX1nZXQgcHJvZ3JhbSgpe2NvbnN0IHg9dGhpcy5nbDtyZXR1cm4geC5nZXRQYXJhbWV0ZXIoeC5DVVJSRU5UX1BST0dSQU0pfV9kZWNsYXJlVW5pZm9ybSh4LHYsVD0iMWYiKXtjb25zdCBsPXRoaXMuZ2wsaD1sLmdldFVuaWZvcm1Mb2NhdGlvbih4LHYpO2xldCBmO2NvbnN0IGc9dGhpcztpZigvXnNhbXBsZXIvLnRlc3QoVCkpe2NvbnN0IE09eC5fc2FtcGxlck1hcCxBPXguX2JpbmRUZXh0dXJlcztPYmplY3QuZGVmaW5lUHJvcGVydHkoeC51bmlmb3Jtcyx2LHtnZXQoKXtyZXR1cm4gZn0sc2V0KEMpe2Y9Qztjb25zdCBiPU1bdl0hPW51bGw/TVt2XTpBLmxlbmd0aDtBW2JdPUMsdShsLEMsYiksTVt2XXx8KE1bdl09YixsLnVuaWZvcm0xaShoLGIpKSxnLm9wdGlvbnMuYXV0b1VwZGF0ZSYmZy51cGRhdGUoKX0sY29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITB9KX1lbHNle2NvbnN0IE09VC5pbmRleE9mKCJNYXRyaXgiKT09PTAsQT0hTSYmL3YkLy50ZXN0KFQpLEM9bFtgdW5pZm9ybSR7VH1gXS5iaW5kKGwpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh4LnVuaWZvcm1zLHYse2dldCgpe3JldHVybiBmfSxzZXQoYil7Zj1iLHR5cGVvZiBiPT0ibnVtYmVyIiYmKGI9W2JdKSxNP0MoaCwhMSxiKTpBP0MoaCxiKTpDKGgsLi4uYiksZy5vcHRpb25zLmF1dG9VcGRhdGUmJmcudXBkYXRlKCl9LGNvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwfSl9fV9kcmF3KCl7Y29uc3QgeD10aGlzLnByb2dyYW07eC5tZXNoRGF0YS5mb3JFYWNoKCh2LFQpPT57Y29uc3R7cG9zaXRpb25zOmwsY2VsbHM6aCxpbnN0YW5jZUNvdW50OmYsY2VsbHNDb3VudDpnLGF0dHJpYnV0ZXM6TSx1bmlmb3JtczpBLHRleHR1cmVDb29yZDpDLGVuYWJsZUJsZW5kOmJ9PXYsRT10aGlzLmdsO2xldCBMPXYubW9kZSE9bnVsbD92Lm1vZGU6RS5UUklBTkdMRVM7dHlwZW9mIEw9PSJzdHJpbmciJiYoTD1FW0xdKSxiP0UuZW5hYmxlKEUuQkxFTkQpOkUuZGlzYWJsZShFLkJMRU5EKSxFLmJpbmRCdWZmZXIoRS5BUlJBWV9CVUZGRVIseC5fYnVmZmVycy52ZXJ0aWNlc0J1ZmZlciksRS5idWZmZXJEYXRhKEUuQVJSQVlfQlVGRkVSLGwsRS5TVEFUSUNfRFJBVyksaCYmKEUuYmluZEJ1ZmZlcihFLkVMRU1FTlRfQVJSQVlfQlVGRkVSLHguX2J1ZmZlcnMuY2VsbHNCdWZmZXIpLEUuYnVmZmVyRGF0YShFLkVMRU1FTlRfQVJSQVlfQlVGRkVSLGgsRS5TVEFUSUNfRFJBVykpO2NvbnN0IEQ9W107TSYmT2JqZWN0LnZhbHVlcyhNKS5mb3JFYWNoKCh7bmFtZTpSLGRhdGE6QixkaXZpc29yOnp9KT0+e2lmKEUuYmluZEJ1ZmZlcihFLkFSUkFZX0JVRkZFUix4Ll9idWZmZXJzW1JdKSxFLmJ1ZmZlckRhdGEoRS5BUlJBWV9CVUZGRVIsQixFLlNUQVRJQ19EUkFXKSx6IT1udWxsKXtjb25zdCBLPUUuZ2V0QXR0cmliTG9jYXRpb24oeCxSKTtLPj0wJiYoRS5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShLKSxELnB1c2goSyksRS52ZXJ0ZXhBdHRyaWJEaXZpc29yP0UudmVydGV4QXR0cmliRGl2aXNvcihLLHopOnRoaXMuYWlhX2V4dCYmdGhpcy5haWFfZXh0LnZlcnRleEF0dHJpYkRpdmlzb3JBTkdMRShLLHopKX19KSxBJiZPYmplY3QuZW50cmllcyhBKS5mb3JFYWNoKChbUixCXSk9Pnt0aGlzLnVuaWZvcm1zW1JdPUJ9KTtsZXQgSTtpZighaCl7Y29uc3QgUj14Ll9kaW1lbnNpb247ST1sLmxlbmd0aC9SfWlmKHguX2VuYWJsZVRleHR1cmVzJiZ4Ll9idWZmZXJzLnRleENvb3JkQnVmZmVyKXtjb25zdCBSPUN8fGMobCx4Ll9kaW1lbnNpb24pO0UuYmluZEJ1ZmZlcihFLkFSUkFZX0JVRkZFUix4Ll9idWZmZXJzLnRleENvb3JkQnVmZmVyKSxFLmJ1ZmZlckRhdGEoRS5BUlJBWV9CVUZGRVIseS5GTE9BVChSKSxFLlNUQVRJQ19EUkFXKX1mIT1udWxsPyhoP0UuZHJhd0VsZW1lbnRzSW5zdGFuY2VkP0UuZHJhd0VsZW1lbnRzSW5zdGFuY2VkKEwsZyxFLlVOU0lHTkVEX1NIT1JULDAsZik6dGhpcy5haWFfZXh0JiZ0aGlzLmFpYV9leHQuZHJhd0VsZW1lbnRzSW5zdGFuY2VkQU5HTEUoTCxnLEUuVU5TSUdORURfU0hPUlQsMCxmKTpFLmRyYXdBcnJheXNJbnN0YW5jZWQ/RS5kcmF3QXJyYXlzSW5zdGFuY2VkKEwsMCxJLGYpOnRoaXMuYWlhX2V4dC5kcmF3QXJyYXlzSW5zdGFuY2VkQU5HTEUoTCwwLEksZiksRC5mb3JFYWNoKFI9PntFLnZlcnRleEF0dHJpYkRpdmlzb3I/RS52ZXJ0ZXhBdHRyaWJEaXZpc29yKFIsbnVsbCk6dGhpcy5haWFfZXh0JiZ0aGlzLmFpYV9leHQudmVydGV4QXR0cmliRGl2aXNvckFOR0xFKFIsbnVsbCl9KSk6aD9FLmRyYXdFbGVtZW50cyhMLGcsRS5VTlNJR05FRF9TSE9SVCwwKTpFLmRyYXdBcnJheXMoTCwwLEkpfSl9Z2V0IGlzV2ViR0wyKCl7cmV0dXJuIHR5cGVvZiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0PCJ1IiYmdGhpcy5nbCBpbnN0YW5jZW9mIFdlYkdMMlJlbmRlcmluZ0NvbnRleHR9Z2V0IGVuYWJsZVRleHR1cmVzKCl7cmV0dXJuIHRoaXMucHJvZ3JhbSYmdGhpcy5wcm9ncmFtLl9lbmFibGVUZXh0dXJlc31nZXQgdW5pZm9ybXMoKXtjb25zdCB4PXRoaXMucHJvZ3JhbTtpZigheHx8IXgudW5pZm9ybXMpdGhyb3cgRXJyb3IoIk5vIGF2YWxpYWJsZSBwcm9ncmFtLiIpO3JldHVybiB4LnVuaWZvcm1zfWRlbGV0ZVByb2dyYW0oeCl7Y29uc3Qgdj10aGlzLmdsO3RoaXMucHJvZ3JhbT09PXgmJih0aGlzLnN0YXJ0UmVuZGVyPSExLHRoaXMuX3JlbmRlckZyYW1lSUQmJihjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yZW5kZXJGcmFtZUlEKSxkZWxldGUgdGhpcy5fcmVuZGVyRnJhbWVJRCksdi51c2VQcm9ncmFtKG51bGwpKTtjb25zdCBUPXRoaXMucHJvZ3JhbXMuaW5kZXhPZih4KTtUPj0wJiZ0aGlzLnByb2dyYW1zLnNwbGljZShULDEpLG0odix4KSx2LmRlbGV0ZVByb2dyYW0oeCl9c2V0TWVzaERhdGEoeCl7QXJyYXkuaXNBcnJheSh4KXx8KHg9W3hdKTtjb25zdCB2PXRoaXMucHJvZ3JhbTt2Lm1lc2hEYXRhPXgubWFwKCh7bW9kZTpULHBvc2l0aW9uczpsLGluc3RhbmNlQ291bnQ6aCxjZWxsczpmLGNlbGxzQ291bnQ6ZyxhdHRyaWJ1dGVzOk0sdW5pZm9ybXM6QSx0ZXh0dXJlQ29vcmQ6QyxlbmFibGVCbGVuZDpifSk9Pntjb25zdCBFPXtwb3NpdGlvbnM6eS5GTE9BVChsKSx1bmlmb3JtczpBLGVuYWJsZUJsZW5kOiEhYix0ZXh0dXJlQ29vcmQ6eS5GTE9BVChDKX07aWYoZiYmKEUuY2VsbHM9eS5VU0hPUlQoZiksRS5jZWxsc0NvdW50PWd8fEUuY2VsbHMubGVuZ3RoKSxUIT1udWxsJiYoRS5tb2RlPVQpLGghPW51bGwpe2lmKCF0aGlzLmlzV2ViR0wyJiYhdGhpcy5haWFfZXh0KXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHVzZSBpbnN0YW5jZUNvdW50IGluIHRoaXMgcmVuZGVyaW5nIGNvbnRleHQsIHVzZSB3ZWJnbDIgY29udGV4dCBpbnN0ZWFkLiIpO0UuaW5zdGFuY2VDb3VudD1ofWlmKE0pe2NvbnN0IEw9e307T2JqZWN0LmVudHJpZXMoTSkuZm9yRWFjaCgoW0QsSV0pPT57aWYoIXYuX2F0dHJpYnV0ZVtEXSl2Ll9hdHRyaWJ1dGVbRF09Imlnbm9yZWQiO2Vsc2UgaWYodi5fYXR0cmlidXRlW0RdIT09Imlnbm9yZWQiKXtjb25zdHtuYW1lOlIsdHlwZTpCfT12Ll9hdHRyaWJ1dGVbRF07bGV0IHo9SS5kYXRhfHxJO2lmKEFycmF5LmlzQXJyYXkoeikmJih6PXlbQl0oeikpLExbRF09e25hbWU6UixkYXRhOnp9LEkuZGl2aXNvciE9bnVsbCl7aWYoIXRoaXMuaXNXZWJHTDImJiF0aGlzLmFpYV9leHQpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgdXNlIGRpdmlzb3IgaW4gdGhpcyByZW5kZXJpbmcgY29udGV4dCwgdXNlIHdlYmdsMiBjb250ZXh0IGluc3RlYWQuIik7TFtEXS5kaXZpc29yPUkuZGl2aXNvcn19fSksRS5hdHRyaWJ1dGVzPUx9cmV0dXJuIEV9KSx0aGlzLm9wdGlvbnMuYXV0b1VwZGF0ZSYmdGhpcy51cGRhdGUoKX1jcmVhdGVQcm9ncmFtKHgsdil7Y29uc3QgVD0vXlxzKnVuaWZvcm1ccytzYW1wbGVyL21nLnRlc3QoeCk7eD09bnVsbCYmKHg9YS5kZWZhdWx0KSx2PT1udWxsJiYodj1UP3MuZGVmYXVsdDpuLmRlZmF1bHQpO2NvbnN0IGw9dGhpcy5nbCxoPU9iamVjdChlLmNyZWF0ZVByb2dyYW0pKGwsdix4KTtoLnNoYWRlclRleHQ9e3ZlcnRleFNoYWRlcjp2LGZyYWdtZW50U2hhZGVyOnh9LGguX2J1ZmZlcnM9e30saC5fYXR0cmlidXRlPXt9LGgudW5pZm9ybXM9e30saC5fc2FtcGxlck1hcD17fSxoLl9iaW5kVGV4dHVyZXM9W107Y29uc3QgZj1uZXcgUmVnRXhwKGAoPzphdHRyaWJ1dGV8aW4pIHZlYyhcXGQpICR7dGhpcy5vcHRpb25zLnZlcnRleFBvc2l0aW9ufWAsImltIik7bGV0IGc9di5tYXRjaChmKTtnJiYoaC5fZGltZW5zaW9uPU51bWJlcihnWzFdKSk7Y29uc3QgTT1uZXcgUmVnRXhwKGAoPzphdHRyaWJ1dGV8aW4pIHZlYyhcXGQpICR7dGhpcy5vcHRpb25zLnZlcnRleFRleHR1cmVDb29yZH1gLCJpbSIpO2c9di5tYXRjaChNKSxnJiYoaC5fdGV4Q29vcmRTaXplPU51bWJlcihnWzFdKSk7Y29uc3QgQT0vXlxzKig/OmF0dHJpYnV0ZXxpbikgKFx3Kz8pKFxkKikgKFx3KykvZ2ltO2lmKGc9di5tYXRjaChBKSxnKWZvcihsZXQgRT0wO0U8Zy5sZW5ndGg7RSsrKXtjb25zdCBMPS9eXHMqKD86YXR0cmlidXRlfGluKSAoXHcrPykoXGQqKSAoXHcrKS9pbSxEPWdbRV0ubWF0Y2goTCk7aWYoRCYmRFszXSE9PXRoaXMub3B0aW9ucy52ZXJ0ZXhQb3NpdGlvbiYmRFszXSE9PXRoaXMub3B0aW9ucy52ZXJ0ZXhUZXh0dXJlQ29vcmQpe2xldFssSSxSLEJdPUQ7ST09PSJtYXQiJiYoUioqPTIpLGguX2J1ZmZlcnNbQl09bC5jcmVhdGVCdWZmZXIoKSxoLl9hdHRyaWJ1dGVbQl09e25hbWU6Qix0eXBlOkksc2l6ZTpOdW1iZXIoUil8fDF9fX1jb25zdCBDPS9eXHMqdW5pZm9ybVxzKyhcdyspXHMrKFx3KykoXFtcZCtcXSk/L21nO2c9di5tYXRjaChDKXx8W10sZz1nLmNvbmNhdCh4Lm1hdGNoKEMpfHxbXSksZy5mb3JFYWNoKEU9Pntjb25zdCBMPUUubWF0Y2goL15ccyp1bmlmb3JtXHMrKFx3KylccysoXHcrKShcW1xkK1xdKT8vKTtsZXRbRCxJLFJdPUwuc2xpY2UoMSk7RD1wW0RdLFI9ISFSLEQuaW5kZXhPZigiTWF0cml4IikhPT0wJiZSJiYoRCs9InYiKSx0aGlzLl9kZWNsYXJlVW5pZm9ybShoLEksRCl9KSxoLl9idWZmZXJzLnZlcnRpY2VzQnVmZmVyPWwuY3JlYXRlQnVmZmVyKCksaC5fYnVmZmVycy5jZWxsc0J1ZmZlcj1sLmNyZWF0ZUJ1ZmZlcigpO2NvbnN0IGI9bC5nZXRBdHRyaWJMb2NhdGlvbihoLHRoaXMub3B0aW9ucy52ZXJ0ZXhUZXh0dXJlQ29vcmQpO3JldHVybiBoLl9lbmFibGVUZXh0dXJlcz1iPj0wLGguX2VuYWJsZVRleHR1cmVzJiYoaC5fYnVmZmVycy50ZXhDb29yZEJ1ZmZlcj1sLmNyZWF0ZUJ1ZmZlcigpKSx0aGlzLnByb2dyYW1zLnB1c2goaCksaH11c2VQcm9ncmFtKHgsdj17fSl7dGhpcy5zdGFydFJlbmRlcj0hMSx0aGlzLl9yZW5kZXJGcmFtZUlEJiYoY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmVuZGVyRnJhbWVJRCksZGVsZXRlIHRoaXMuX3JlbmRlckZyYW1lSUQpO2NvbnN0IFQ9dGhpcy5nbDtULnVzZVByb2dyYW0oeCk7Y29uc3QgbD14Ll9kaW1lbnNpb247VC5iaW5kQnVmZmVyKFQuQVJSQVlfQlVGRkVSLHguX2J1ZmZlcnMudmVydGljZXNCdWZmZXIpO2NvbnN0IGg9VC5nZXRBdHRyaWJMb2NhdGlvbih4LHRoaXMub3B0aW9ucy52ZXJ0ZXhQb3NpdGlvbik7aWYoVC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGgsbCxULkZMT0FULCExLDAsMCksVC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShoKSx4Ll9lbmFibGVUZXh0dXJlcyl7VC5iaW5kQnVmZmVyKFQuQVJSQVlfQlVGRkVSLHguX2J1ZmZlcnMudGV4Q29vcmRCdWZmZXIpO2NvbnN0IGY9VC5nZXRBdHRyaWJMb2NhdGlvbih4LHRoaXMub3B0aW9ucy52ZXJ0ZXhUZXh0dXJlQ29vcmQpO1QudmVydGV4QXR0cmliUG9pbnRlcihmLHguX3RleENvb3JkU2l6ZXx8MixULkZMT0FULCExLDAsMCksVC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShmKX1pZihPYmplY3QuZW50cmllcyh4Ll9hdHRyaWJ1dGUpLmZvckVhY2goKFtmLGddKT0+e2lmKGchPT0iaWdub3JlZCIpe2NvbnN0IE09Zy5zaXplLEE9dltmXXx8e30sQz0hIUEubm9ybWFsaXplO2xldCBiPUEudHlwZXx8IkZMT0FUIjtjb25zdCBFPUEua2V5fHxmO2I9PT0iVUJZVEUiJiYoYj0iVU5TSUdORURfQllURSIpLGI9PT0iVVNIT1JUIiYmKGI9IlVOU0lHTkVEX1NIT1JUIiksZy50eXBlPWIsRSYmRSE9PWYmJih4Ll9hdHRyaWJ1dGVbRV09ZyksVC5iaW5kQnVmZmVyKFQuQVJSQVlfQlVGRkVSLHguX2J1ZmZlcnNbZl0pO2NvbnN0IEw9VC5nZXRBdHRyaWJMb2NhdGlvbih4LGYpO0w+PTAmJihULnZlcnRleEF0dHJpYlBvaW50ZXIoTCxNLFRbYl0sQywwLDApLFQuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoTCkpfX0pLCF4Lm1lc2hEYXRhKXtjb25zdCBmPVtbLTEsLTEsMCwxXS5zbGljZSgwLGwpLFsxLC0xLDAsMV0uc2xpY2UoMCxsKSxbMSwxLDAsMV0uc2xpY2UoMCxsKSxbLTEsMSwwLDFdLnNsaWNlKDAsbCldLGc9W1swLDEsM10sWzMsMSwyXV07dGhpcy5zZXRNZXNoRGF0YSh7cG9zaXRpb25zOmYsY2VsbHM6Z30pfXJldHVybiB4fWNvbXBpbGVTeW5jKHgsdil7eD14fHxhLmRlZmF1bHQ7Y29uc3QgVD17fTtmdW5jdGlvbiBsKE0pe009TS5yZXBsYWNlKC9eXHMqL21nLCIiKTtjb25zdCBBPVtdLEM9TS5tYXRjaCgvXiNwcmFnbWFccytpbmNsdWRlXHMrLiovbWcpO2lmKEMpe2ZvcihsZXQgYj0wO2I8Qy5sZW5ndGg7YisrKXtjb25zdCBMPUNbYl0ubWF0Y2goLyg/Ojx8IikoLiopKD86PnwiKS8pO2lmKEwpe2NvbnN0IEQ9TFswXS5pbmRleE9mKCI8Iik9PT0wPyJsaWIiOiJsaW5rIjtsZXQgST1MWzFdO2lmKEk9PT0iZ3JhcGgiJiYoST0iZ3JhcGhpY3MiKSxUW0ldKUEucHVzaChgLyogaW5jbHVkZWQgJHtJfSAqL2ApO2Vsc2UgaWYoVFtJXT0hMCxEPT09ImxpYiIpe2NvbnN0IFI9bChvW0ldKTtBLnB1c2goUil9ZWxzZSBpZihEPT09ImxpbmsiKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGxvYWQgZXh0ZXJuYWwgbGlua3Mgc3luY2hyb25vdXNseS4gVXNlIGNvbXBpbGUgaW5zdGVhZCBvZiBjb21waWxlU3luYy4iKX19QS5mb3JFYWNoKGI9PntNPU0ucmVwbGFjZSgvXiNwcmFnbWFccytpbmNsdWRlXHMrLiovbSxiKX0pfXJldHVybiBNfWNvbnN0IGg9bCh4KSxmPXY/bCh2KTpudWxsO3JldHVybiB0aGlzLmNyZWF0ZVByb2dyYW0oaCxmKX1hc3luYyBjb21waWxlKHgsdil7eD14fHxhLmRlZmF1bHQ7Y29uc3QgVD17fTthc3luYyBmdW5jdGlvbiBsKE0pe009TS5yZXBsYWNlKC9eXHMqL21nLCIiKTtjb25zdCBBPVtdLEM9TS5tYXRjaCgvXiNwcmFnbWFccytpbmNsdWRlXHMrLiovbWcpO2lmKEMpe2ZvcihsZXQgYj0wO2I8Qy5sZW5ndGg7YisrKXtjb25zdCBMPUNbYl0ubWF0Y2goLyg/Ojx8IikoLiopKD86PnwiKS8pO2lmKEwpe2NvbnN0IEQ9TFswXS5pbmRleE9mKCI8Iik9PT0wPyJsaWIiOiJsaW5rIjtsZXQgST1MWzFdO2lmKEk9PT0iZ3JhcGgiJiYoST0iZ3JhcGhpY3MiKSxUW0ldKUEucHVzaChgLyogaW5jbHVkZWQgJHtJfSAqL2ApO2Vsc2UgaWYoVFtJXT0hMCxEPT09ImxpYiIpe2NvbnN0IFI9YXdhaXQgbChvW0ldKTtBLnB1c2goUil9ZWxzZSBpZihEPT09ImxpbmsiKXtsZXQgUj1hd2FpdCB5LmZldGNoU2hhZGVyKEkpO1I9YXdhaXQgbChSKSxBLnB1c2goUil9fX1BLmZvckVhY2goYj0+e009TS5yZXBsYWNlKC9eI3ByYWdtYVxzK2luY2x1ZGVccysuKi9tLGIpfSl9cmV0dXJuIE19Y29uc3QgaD1hd2FpdCBsKHgpLGY9dj9hd2FpdCBsKHYpOm51bGw7cmV0dXJuIHRoaXMuY3JlYXRlUHJvZ3JhbShoLGYpfWFzeW5jIGxvYWQoeCx2PW51bGwpe3JldHVybiB4PWF3YWl0IHkuZmV0Y2hTaGFkZXIoeCksdiYmKHY9YXdhaXQgeS5mZXRjaFNoYWRlcih2KSksdGhpcy5jb21waWxlKHgsdil9Y3JlYXRlVGV4dHVyZSh4PW51bGwse3dyYXBTOnY9dGhpcy5nbC5DTEFNUF9UT19FREdFLHdyYXBUOlQ9dGhpcy5nbC5DTEFNUF9UT19FREdFLG1pbkZpbHRlcjpsPXRoaXMuZ2wuTElORUFSLG1hZ0ZpbHRlcjpoPXRoaXMuZ2wuTElORUFSfT17fSl7Y29uc3QgZj10aGlzLmdsLGc9QXJyYXkuaXNBcnJheSh4KT9mLlRFWFRVUkVfQ1VCRV9NQVA6Zi5URVhUVVJFXzJEO3RoaXMuX21heF90ZXh0dXJlX2ltYWdlX3VuaXRzPXRoaXMuX21heF90ZXh0dXJlX2ltYWdlX3VuaXRzfHxmLmdldFBhcmFtZXRlcihmLk1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTKSxmLmFjdGl2ZVRleHR1cmUoZi5URVhUVVJFMCt0aGlzLl9tYXhfdGV4dHVyZV9pbWFnZV91bml0cy0xKTtjb25zdCBNPWYuY3JlYXRlVGV4dHVyZSgpO2YuYmluZFRleHR1cmUoZyxNKSxmLnBpeGVsU3RvcmVpKGYuVU5QQUNLX0ZMSVBfWV9XRUJHTCwhMCk7Y29uc3R7d2lkdGg6QSxoZWlnaHQ6Q309dGhpcy5jYW52YXM7aWYoeClpZihnPT09Zi5URVhUVVJFX0NVQkVfTUFQKWZvcihsZXQgYj0wO2I8NjtiKyspZi50ZXhJbWFnZTJEKGYuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK2IsMCxmLlJHQkEsZi5SR0JBLGYuVU5TSUdORURfQllURSx4W2JdKTtlbHNlIGYudGV4SW1hZ2UyRChnLDAsZi5SR0JBLGYuUkdCQSxmLlVOU0lHTkVEX0JZVEUseCk7ZWxzZSBpZihnPT09Zi5URVhUVVJFX0NVQkVfTUFQKWZvcihsZXQgYj0wO2I8NjtiKyspdGhpcy5nbC50ZXhJbWFnZTJEKHRoaXMuZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK2IsMCxmLlJHQkEsQSxDLDAsZi5SR0JBLGYuVU5TSUdORURfQllURSxudWxsKTtlbHNlIGYudGV4SW1hZ2UyRChnLDAsZi5SR0JBLEEsQywwLGYuUkdCQSxmLlVOU0lHTkVEX0JZVEUsbnVsbCk7cmV0dXJuIGYudGV4UGFyYW1ldGVyaShnLGYuVEVYVFVSRV9NSU5fRklMVEVSLGwpLGYudGV4UGFyYW1ldGVyaShnLGYuVEVYVFVSRV9NQUdfRklMVEVSLGgpLGYudGV4UGFyYW1ldGVyaShnLGYuVEVYVFVSRV9XUkFQX1MsdiksZi50ZXhQYXJhbWV0ZXJpKGcsZi5URVhUVVJFX1dSQVBfVCxUKSxnPT09Zi5URVhUVVJFX0NVQkVfTUFQJiYoeC53aWR0aD14WzBdLndpZHRoLHguaGVpZ2h0PXhbMF0uaGVpZ2h0KSxmLmJpbmRUZXh0dXJlKGcsbnVsbCksTS5faW1nPXh8fHt3aWR0aDpBLGhlaWdodDpDfSxNLmRlbGV0ZT0oKT0+e3RoaXMuZGVsZXRlVGV4dHVyZShNKX0sTX1kZWxldGVUZXh0dXJlKHgpe2NvbnN0IHY9eC5faW1nO3RoaXMuZ2wuZGVsZXRlVGV4dHVyZSh4KSx0eXBlb2Ygdi5jbG9zZT09ImZ1bmN0aW9uIiYmdi5jbG9zZSgpfWFzeW5jIGxvYWRUZXh0dXJlKHgse3VzZUltYWdlQml0bWFwOnY9ITB9PXt9KXtjb25zdCBUPWF3YWl0IHkubG9hZEltYWdlKHgse3VzZUltYWdlQml0bWFwOnZ9KTtyZXR1cm4gdGhpcy5jcmVhdGVUZXh0dXJlKFQpfWNyZWF0ZUZCTyh7Y29sb3I6eD0xLGJsZW5kOnY9ITEsZGVwdGg6VD10aGlzLm9wdGlvbnMuZGVwdGghPT0hMSxzdGVuY2lsOmw9ISF0aGlzLm9wdGlvbnMuc3RlbmNpbH09e30pe2NvbnN0IGg9dGhpcy5nbCxmPWguY3JlYXRlRnJhbWVidWZmZXIoKTtoLmJpbmRGcmFtZWJ1ZmZlcihoLkZSQU1FQlVGRkVSLGYpO2NvbnN0IGc9W107Zm9yKGxldCBDPTA7Qzx4O0MrKyl7Y29uc3QgYj10aGlzLmNyZWF0ZVRleHR1cmUoKTtoLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGguRlJBTUVCVUZGRVIsaC5DT0xPUl9BVFRBQ0hNRU5UMCtDLGguVEVYVFVSRV8yRCxiLDApLGcucHVzaChiKX1mLnRleHR1cmVzPWcsZi50ZXh0dXJlPWdbMF0sZi5ibGVuZD12O2NvbnN0e3dpZHRoOk0saGVpZ2h0OkF9PXRoaXMuY2FudmFzO3JldHVybiBUJiYhbCYmKGYuZGVwdGhCdWZmZXI9aC5jcmVhdGVSZW5kZXJidWZmZXIoKSxoLmJpbmRSZW5kZXJidWZmZXIoaC5SRU5ERVJCVUZGRVIsZi5kZXB0aEJ1ZmZlciksaC5yZW5kZXJidWZmZXJTdG9yYWdlKGguUkVOREVSQlVGRkVSLGguREVQVEhfQ09NUE9ORU5UMTYsTSxBKSxoLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKGguRlJBTUVCVUZGRVIsaC5ERVBUSF9BVFRBQ0hNRU5ULGguUkVOREVSQlVGRkVSLGYuZGVwdGhCdWZmZXIpKSxsJiYhVCYmKGYuc3RlbmNpbEJ1ZmZlcj1oLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLGguYmluZFJlbmRlcmJ1ZmZlcihoLlJFTkRFUkJVRkZFUixmLnN0ZW5jaWxCdWZmZXIpLGgucmVuZGVyYnVmZmVyU3RvcmFnZShoLlJFTkRFUkJVRkZFUixoLlNURU5DSUxfSU5ERVg4LE0sQSksaC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihoLkZSQU1FQlVGRkVSLGguU1RFTkNJTF9BVFRBQ0hNRU5ULGguUkVOREVSQlVGRkVSLGYuc3RlbmNpbEJ1ZmZlcikpLFQmJmwmJihmLmRlcHRoU3RlbmNpbEJ1ZmZlcj1oLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLGguYmluZFJlbmRlcmJ1ZmZlcihoLlJFTkRFUkJVRkZFUixmLmRlcHRoU3RlbmNpbEJ1ZmZlciksaC5yZW5kZXJidWZmZXJTdG9yYWdlKGguUkVOREVSQlVGRkVSLGguREVQVEhfU1RFTkNJTCxNLEEpLGguZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoaC5GUkFNRUJVRkZFUixoLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCxoLlJFTkRFUkJVRkZFUixmLmRlcHRoU3RlbmNpbEJ1ZmZlcikpLGguYmluZEZyYW1lYnVmZmVyKGguRlJBTUVCVUZGRVIsbnVsbCksZn1iaW5kRkJPKHg9bnVsbCl7dGhpcy5mYm89eH1yZW5kZXIoe2NsZWFyQnVmZmVyOng9ITB9PXt9KXt0aGlzLnN0YXJ0UmVuZGVyPSEwO2NvbnN0IHY9dGhpcy5nbDtsZXQgVD10aGlzLnByb2dyYW07VHx8KFQ9dGhpcy5jcmVhdGVQcm9ncmFtKCksdGhpcy51c2VQcm9ncmFtKFQpKSx0aGlzLmZibyYmdi5iaW5kRnJhbWVidWZmZXIodi5GUkFNRUJVRkZFUix0aGlzLmZibyk7Y29uc3QgbD10aGlzLm9wdGlvbnMuZGVwdGg7bCYmdi5lbmFibGUodi5ERVBUSF9URVNUKSx0aGlzLmdsLmNsZWFyKHRoaXMuZ2wuQ09MT1JfQlVGRkVSX0JJVHwobD90aGlzLmdsLkRFUFRIX0JVRkZFUl9CSVQ6MCl8KHRoaXMub3B0aW9ucy5zdGVuY2lsP3RoaXMuZ2wuU1RFTkNJTF9CVUZGRVJfQklUOjApKTtjb25zdCBoPXRoaXMuX3JlbmRlckZyYW1lSUQ7dGhpcy5fZHJhdygpLHRoaXMuZmJvJiZ2LmJpbmRGcmFtZWJ1ZmZlcih2LkZSQU1FQlVGRkVSLG51bGwpLHRoaXMuX3JlbmRlckZyYW1lSUQ9PT1oJiYodGhpcy5fcmVuZGVyRnJhbWVJRD1udWxsKX11cGRhdGUoKXt0aGlzLnN0YXJ0UmVuZGVyJiZ0aGlzLl9yZW5kZXJGcmFtZUlEPT1udWxsJiYodGhpcy5fcmVuZGVyRnJhbWVJRD1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5yZW5kZXIuYmluZCh0aGlzKSkpfX1pKHksImRlZmF1bHRPcHRpb25zIix7cHJlc2VydmVEcmF3aW5nQnVmZmVyOiEwLGF1dG9VcGRhdGU6ITAsdmVydGV4UG9zaXRpb246ImFfdmVydGV4UG9zaXRpb24iLHZlcnRleFRleHR1cmVDb29yZDoiYV92ZXJ0ZXhUZXh0dXJlQ29vcmQiLHdlYmdsMjohMX0pLGkoeSwiVUJZVEUiLHkuVU5TSUdORURfQllURSksaSh5LCJVU0hPUlQiLHkuVU5TSUdORURfU0hPUlQpLGkoeSwiZmV0Y2hTaGFkZXIiLGUuZmV0Y2hTaGFkZXIpLGkoeSwibG9hZEltYWdlIixlLmxvYWRJbWFnZSl9LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsInNldHVwV2ViR0wiLGZ1bmN0aW9uKCl7cmV0dXJuIG59KSx0LmQociwiY3JlYXRlUHJvZ3JhbSIsZnVuY3Rpb24oKXtyZXR1cm4gYX0pLHQuZChyLCJwb2ludHNUb0J1ZmZlciIsZnVuY3Rpb24oKXtyZXR1cm4gc30pLHQuZChyLCJsb2FkSW1hZ2UiLGZ1bmN0aW9uKCl7cmV0dXJuIG99KSx0LmQociwiZmV0Y2hTaGFkZXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG19KSx0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7ZnVuY3Rpb24gZSh1LHApe2NvbnN0IHk9WyJ3ZWJnbCIsImV4cGVyaW1lbnRhbC13ZWJnbCIsIndlYmtpdC0zZCIsIm1vei13ZWJnbCJdO2xldCBPPW51bGw7Zm9yKGxldCB4PTA7eDx5Lmxlbmd0aDsrK3gpe3RyeXtPPXUuZ2V0Q29udGV4dCh5W3hdLHApfWNhdGNoe31pZihPKWJyZWFrfXJldHVybiBPfWZ1bmN0aW9uIG4odSxwKXtjb25zdCB5PWUodSxwKTtpZigheSl0aHJvdyBuZXcgRXJyb3IoIlNvcnJ5LCB5b3VyIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IFdlYkdMLiIpO3JldHVybiB5fWZ1bmN0aW9uIGEodSxwLHkpe2NvbnN0IE89dS5jcmVhdGVTaGFkZXIodS5WRVJURVhfU0hBREVSKTtpZih1LnNoYWRlclNvdXJjZShPLHApLHUuY29tcGlsZVNoYWRlcihPKSwhdS5nZXRTaGFkZXJQYXJhbWV0ZXIoTyx1LkNPTVBJTEVfU1RBVFVTKSl7Y29uc3QgVD1gVmVydGV4IHNoYWRlciBmYWlsZWQgdG8gY29tcGlsZS4gIFRoZSBlcnJvciBsb2cgaXM6JHt1LmdldFNoYWRlckluZm9Mb2coTyl9YDt0aHJvdyBuZXcgRXJyb3IoVCl9Y29uc3QgeD11LmNyZWF0ZVNoYWRlcih1LkZSQUdNRU5UX1NIQURFUik7aWYodS5zaGFkZXJTb3VyY2UoeCx5KSx1LmNvbXBpbGVTaGFkZXIoeCksIXUuZ2V0U2hhZGVyUGFyYW1ldGVyKHgsdS5DT01QSUxFX1NUQVRVUykpe2NvbnN0IFQ9YEZyYWdtZW50IHNoYWRlciBmYWlsZWQgdG8gY29tcGlsZS4gIFRoZSBlcnJvciBsb2cgaXM6JHt1LmdldFNoYWRlckluZm9Mb2coeCl9YDt0aHJvdyBuZXcgRXJyb3IoVCl9Y29uc3Qgdj11LmNyZWF0ZVByb2dyYW0oKTtpZih1LmF0dGFjaFNoYWRlcih2LE8pLHUuYXR0YWNoU2hhZGVyKHYseCksdS5saW5rUHJvZ3JhbSh2KSwhdS5nZXRQcm9ncmFtUGFyYW1ldGVyKHYsdS5MSU5LX1NUQVRVUykpe2NvbnN0IFQ9YFNoYWRlciBwcm9ncmFtIGZhaWxlZCB0byBsaW5rLiAgVGhlIGVycm9yIGxvZyBpczoke3UuZ2V0UHJvZ3JhbUluZm9Mb2codil9YDt0aHJvdyBuZXcgRXJyb3IoVCl9cmV0dXJuIHUuZGVsZXRlU2hhZGVyKE8pLHUuZGVsZXRlU2hhZGVyKHgpLHZ9ZnVuY3Rpb24gcyh1LHA9RmxvYXQzMkFycmF5LHk9bnVsbCl7aWYoeSYmISh5IGluc3RhbmNlb2YgcCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiV3JvbmcgYnVmZmVyIHR5cGUuIik7aWYodT09bnVsbHx8dSBpbnN0YW5jZW9mIHApcmV0dXJuIHU7aWYodVswXT09bnVsbHx8dVswXS5sZW5ndGg9PW51bGwpcmV0dXJuIHk/KHkuc2V0KHUsMCkseSk6bmV3IHAodSk7Y29uc3QgTz11WzBdLmxlbmd0aCx4PXUubGVuZ3RoO3l8fCh5PW5ldyBwKE8qeCkpO2xldCB2PTA7Zm9yKGxldCBUPTA7VDx4O1QrKylmb3IobGV0IGw9MDtsPE87bCsrKXlbdisrXT11W1RdW2xdO3JldHVybiB5fWNvbnN0IGk9e307ZnVuY3Rpb24gbyh1LHt1c2VJbWFnZUJpdG1hcDpwPSEwLGFsaWFzOnk9bnVsbH09e30pe2lmKCFpW3VdKXtpZih0eXBlb2YgSW1hZ2U9PSJmdW5jdGlvbiIpe2NvbnN0IE89bmV3IEltYWdlO3R5cGVvZiB1PT0ic3RyaW5nIiYmISh0eXBlb2YgbG9jYXRpb249PSJvYmplY3QiJiYvXmZpbGU6Ly50ZXN0KGxvY2F0aW9uLmhyZWYpKSYmIS9eZGF0YTovLnRlc3QodSkmJihPLmNyb3NzT3JpZ2luPSJhbm9ueW1vdXMiKSxpW3VdPW5ldyBQcm9taXNlKHg9PntPLm9ubG9hZD1mdW5jdGlvbigpe3AmJnR5cGVvZiBjcmVhdGVJbWFnZUJpdG1hcD09ImZ1bmN0aW9uIj9jcmVhdGVJbWFnZUJpdG1hcChPLHtpbWFnZU9yaWVudGF0aW9uOiJmbGlwWSJ9KS50aGVuKHY9PntpW3VdPXYseSYmKGlbeV09dikseCh2KX0pOihpW3VdPU8seSYmKGlbeV09TykseChPKSl9LE8uc3JjPXV9KSx5JiYoaVt5XT1pW3VdKX1lbHNlIGlmKHR5cGVvZiBmZXRjaD09ImZ1bmN0aW9uIilyZXR1cm4gZmV0Y2godSx7bWV0aG9kOiJHRVQiLG1vZGU6ImNvcnMiLGNhY2hlOiJkZWZhdWx0In0pLnRoZW4oTz0+Ty5ibG9iKCkpLnRoZW4oTz0+Y3JlYXRlSW1hZ2VCaXRtYXAoTyx7aW1hZ2VPcmllbnRhdGlvbjoiZmxpcFkifSkudGhlbih4PT4oaVt1XT14LHkmJihpW3ldPXgpLHgpKSl9cmV0dXJuIGlbdV19Y29uc3QgYz17fTthc3luYyBmdW5jdGlvbiBtKHUpe2lmKGNbdV0pcmV0dXJuIGNbdV07Y29uc3QgcD1hd2FpdCBmZXRjaCh1KTtpZihwLnN0YXR1cz49MjAwJiZwLnN0YXR1czwzMDApe2NvbnN0IHk9YXdhaXQgcC50ZXh0KCk7cmV0dXJuIGNbdV09eSx5fXRocm93IG5ldyBFcnJvcigiU2hhZGVyIGxvYWRlZCBlcnJvci4iKX19LGZ1bmN0aW9uKGQscix0KXt0LnIociksci5kZWZhdWx0PWBhdHRyaWJ1dGUgdmVjMyBhX3ZlcnRleFBvc2l0aW9uOwoKdm9pZCBtYWluKCkgewogIGdsX1BvaW50U2l6ZSA9IDEuMDsKICBnbF9Qb3NpdGlvbiA9IHZlYzQoYV92ZXJ0ZXhQb3NpdGlvbiwgMSk7Cn1gfSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHIuZGVmYXVsdD1gI2lmZGVmIEdMX0VTCnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwojZW5kaWYKCnZvaWQgbWFpbigpIHsKICBnbF9GcmFnQ29sb3IgPSB2ZWM0KDAuMCwgMC4wLCAwLjAsIDAuMSk7Cn1gfSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHIuZGVmYXVsdD1gYXR0cmlidXRlIHZlYzQgYV92ZXJ0ZXhQb3NpdGlvbjsKYXR0cmlidXRlIHZlYzIgYV92ZXJ0ZXhUZXh0dXJlQ29vcmQ7CnZhcnlpbmcgdmVjMiB2VGV4dHVyZUNvb3JkOwoKdm9pZCBtYWluKCkgewogIGdsX1BvaW50U2l6ZSA9IDEuMDsKICBnbF9Qb3NpdGlvbiA9IGFfdmVydGV4UG9zaXRpb247CiAgdlRleHR1cmVDb29yZCA9IGFfdmVydGV4VGV4dHVyZUNvb3JkOwp9YH0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gc30pO3ZhciBlPXQoMjEpLG49dCgyNSk7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2NvbnN0IGE9U3ltYm9sKCJ0cmFuc2Zvcm0iKTtjbGFzcyBze2NvbnN0cnVjdG9yKG8sYyl7dGhpcy5jb250ZXh0PW8uZ2V0Q29udGV4dCgiMmQiKSx0aGlzLm9wdGlvbnM9Yyx0aGlzW2FdPVsxLDAsMCwxLDAsMF19Y3JlYXRlVGV4dHVyZShvKXtyZXR1cm57X2ltZzpvfX1hc3luYyBsb2FkVGV4dHVyZShvKXtjb25zdCBjPWF3YWl0IGUuZGVmYXVsdC5sb2FkSW1hZ2Uobyx7dXNlSW1hZ2VCaXRtYXA6ITF9KTtyZXR1cm4gdGhpcy5jcmVhdGVUZXh0dXJlKGMpfWRlbGV0ZVRleHR1cmUobyl7cmV0dXJuIG99Y2xlYXIobyxjLG0sdSl7Y29uc3QgcD10aGlzLmNvbnRleHQ7bz1vfHwwLGM9Y3x8MCxtPW18fHAuY2FudmFzLndpZHRoLW8sdT11fHxwLmNhbnZhcy5oZWlnaHQtYyxwLmNsZWFyUmVjdChvLGMsbSx1KX1kcmF3TWVzaENsb3VkKG8se2NsZWFyOmM9ITF9PXt9KXtjb25zdCBtPVtdO2ZvcihsZXQgdT0wO3U8by5hbW91bnQ7dSsrKXtjb25zdCBwPW8uZ2V0VHJhbnNmb3JtKHUpO2xldCB5PW8uZ2V0VGV4dHVyZUZyYW1lKHUpO3kmJih5PXkuX2ltZyk7Y29uc3QgTz1vLmdldEZpbHRlcih1KSx7ZmlsbDp4LHN0cm9rZTp2fT1vLmdldENsb3VkUkdCQSh1KTttLnB1c2goe21lc2g6by5tZXNoLF9jbG91ZE9wdGlvbnM6W3gsdix5LHAsT119KX1vLmJlZm9yZVJlbmRlciYmby5iZWZvcmVSZW5kZXIodGhpcy5jb250ZXh0LG8pLHRoaXMuZHJhd01lc2hlcyhtLHtjbGVhcjpjLGhvb2s6ITF9KSxvLmFmdGVyUmVuZGVyJiZvLmFmdGVyUmVuZGVyKHRoaXMuY29udGV4dCxvKX1kcmF3TWVzaGVzKG8se2NsZWFyOmM9ITEsaG9vazptPSEwfT17fSl7Y29uc3QgdT10aGlzLmNvbnRleHQ7YyYmdS5jbGVhclJlY3QoMCwwLHUuY2FudmFzLndpZHRoLHUuY2FudmFzLmhlaWdodCk7bGV0IHA9bnVsbDtjb25zdHt3aWR0aDp5LGhlaWdodDpPfT11LmNhbnZhcyx4PW8ubGVuZ3RoO28uZm9yRWFjaCgodixUKT0+e2xldCBsLGgsZixnLE07bSYmdi5iZWZvcmVSZW5kZXImJnYuYmVmb3JlUmVuZGVyKHUsdiksdi5fY2xvdWRPcHRpb25zJiYoW2wsaCxmLGcsTV09di5fY2xvdWRPcHRpb25zLHY9di5tZXNoKTtsZXQgQT12LmZpbHRlcjtpZihNJiYoQT1BP2Ake0F9ICR7TX1gOk0pLEEmJiF0aGlzLmZpbHRlckJ1ZmZlciYmdGhpcy5maWx0ZXJCdWZmZXIhPT0hMSl7Y29uc3QgQz1lLmRlZmF1bHQuY3JlYXRlQ2FudmFzKHksTyk7Qz90aGlzLmZpbHRlckJ1ZmZlcj1DLmdldENvbnRleHQoIjJkIik6dGhpcy5maWx0ZXJCdWZmZXI9ITF9cCYmcCE9PUEmJihPYmplY3Qobi5hcHBseUZpbHRlcikodGhpcy5maWx0ZXJCdWZmZXIscCksdS5kcmF3SW1hZ2UodGhpcy5maWx0ZXJCdWZmZXIuY2FudmFzLDAsMCx5LE8pLHRoaXMuZmlsdGVyQnVmZmVyLmNsZWFyUmVjdCgwLDAseSxPKSxwPW51bGwpLEEmJnRoaXMuZmlsdGVyQnVmZmVyPyh0aGlzLmZpbHRlckJ1ZmZlci5zYXZlKCksdGhpcy5maWx0ZXJCdWZmZXIudHJhbnNmb3JtKC4uLnRoaXNbYV0pLE9iamVjdChuLmRyYXdNZXNoMkQpKHYsdGhpcy5maWx0ZXJCdWZmZXIsITEsbCxoLGYsZyksdGhpcy5maWx0ZXJCdWZmZXIucmVzdG9yZSgpLFQ9PT14LTE/KE9iamVjdChuLmFwcGx5RmlsdGVyKSh0aGlzLmZpbHRlckJ1ZmZlcixBKSx1LmRyYXdJbWFnZSh0aGlzLmZpbHRlckJ1ZmZlci5jYW52YXMsMCwwLHksTyksdGhpcy5maWx0ZXJCdWZmZXIuY2xlYXJSZWN0KDAsMCx5LE8pKTpwPUEpOih1LnNhdmUoKSx1LnRyYW5zZm9ybSguLi50aGlzW2FdKSxPYmplY3Qobi5kcmF3TWVzaDJEKSh2LHUsITEsbCxoLGYsZyksdS5yZXN0b3JlKCkpLG0mJnYuYWZ0ZXJSZW5kZXImJnYuYWZ0ZXJSZW5kZXIodSx2KX0pfXNldFRyYW5zZm9ybShvKXt0aGlzW2FdPW99fX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSwoZnVuY3Rpb24oZSl7dmFyIG49dCgxNCksYT10KDIzKSxzPXQoMjQpO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtjb25zdCBpPXt9O2Z1bmN0aW9uIG8oeSxPKXtjb25zdHtzdHlsZTp4LHZhcmlhbnQ6dix3ZWlnaHQ6VCxzdHJldGNoOmwsc2l6ZTpoLHB4TGluZUhlaWdodDpmLGZhbWlseTpnfT15O3JldHVybiBsPT09Im5vcm1hbCI/YCR7eH0gJHt2fSAke1R9ICR7aCpPfXB4LyR7ZipPfXB4ICR7Z31gOmAke3h9ICR7dn0gJHtUfSAke2x9ICR7aCpPfXB4LyR7ZipPfXB4ICR7Z31gfWZ1bmN0aW9uIGMoeSx7Zm9udDpPLGZpbGxDb2xvcjp4LHN0cm9rZUNvbG9yOnYsc3Ryb2tlV2lkdGg6VCxyYXRpbzpsPTEsdGV4dENhbnZhczpoLGNhY2hhYmxlOmY9ITF9KXtsZXQgZztpZihmKXtnPVt5LE8sU3RyaW5nKHgpLFN0cmluZyh2KSxTdHJpbmcoVCldLmpvaW4oIiMjIyIpO2NvbnN0IHo9aVtnXTtpZih6KXJldHVybiB6fWh8fChoPXUoMSwxKSk7Y29uc3QgTT1oLmdldENvbnRleHQoIjJkIik7TS5zYXZlKCksTS5mb250PU87bGV0e3dpZHRoOkF9PU0ubWVhc3VyZVRleHQoeSk7TS5yZXN0b3JlKCk7Y29uc3QgQz1PYmplY3QoYS5kZWZhdWx0KShPKSxiPU1hdGgubWF4KEMucHhMaW5lSGVpZ2h0LEMucHhIZWlnaHQqMS4xMyk7L2l0YWxpY3xvYmxpcXVlLy50ZXN0KE8pJiYoQSs9YipNYXRoLnRhbigxNSpNYXRoLlBJLzE4MCkpLCF4JiYhdiYmKHg9IiMwMDAiKTtjb25zdCBFPU0uY2FudmFzLEw9TWF0aC5jZWlsKEEpLEQ9TWF0aC5jZWlsKGIpO0Uud2lkdGg9TWF0aC5yb3VuZChMKmwpLEUuaGVpZ2h0PU1hdGgucm91bmQoRCpsKSxNLnNhdmUoKSxNLmZvbnQ9byhDLGwpLE0udGV4dEFsaWduPSJjZW50ZXIiLE0udGV4dEJhc2VsaW5lPSJtaWRkbGUiO2NvbnN0IEk9RS5oZWlnaHQqLjUrQy5weEhlaWdodCouMDUqbCxSPUUud2lkdGgqLjU7aWYoeCl7aWYoQXJyYXkuaXNBcnJheSh4KSl4PU9iamVjdChzLmRlZmF1bHQpKHgpO2Vsc2UgaWYoeC52ZWN0b3Ipe2xldCB6O2NvbnN0e3ZlY3RvcjpLLGNvbG9yczpRfT14O0subGVuZ3RoPT09Nj96PU0uY3JlYXRlUmFkaWFsR3JhZGllbnQoLi4uSyk6ej1NLmNyZWF0ZUxpbmVhckdyYWRpZW50KC4uLkspLFEuZm9yRWFjaCgoe29mZnNldDpfLGNvbG9yOmp9KT0+e3ouYWRkQ29sb3JTdG9wKF8sail9KSx4PXp9TS5maWxsU3R5bGU9eCxNLmZpbGxUZXh0KHksUixJKX1pZih2KXtpZihNLmxpbmVXaWR0aD1UKmwsQXJyYXkuaXNBcnJheSh2KSl2PU9iamVjdChzLmRlZmF1bHQpKHYpO2Vsc2UgaWYodi52ZWN0b3Ipe2xldCB6O2NvbnN0e3ZlY3RvcjpLLGNvbG9yczpRfT12O0subGVuZ3RoPT09Nj96PU0uY3JlYXRlUmFkaWFsR3JhZGllbnQoLi4uSyk6ej1NLmNyZWF0ZUxpbmVhckdyYWRpZW50KC4uLkspLFEuZm9yRWFjaCgoe29mZnNldDpfLGNvbG9yOmp9KT0+e3ouYWRkQ29sb3JTdG9wKF8sail9KSx2PXp9TS5zdHJva2VTdHlsZT12LE0uc3Ryb2tlVGV4dCh5LFIsSSl9TS5yZXN0b3JlKCk7Y29uc3QgQj17aW1hZ2U6aCxyZWN0OlswLDAsTCxEXX07cmV0dXJuIGYmJihpW2ddPUIpLEJ9bGV0IG09ITE7aWYodHlwZW9mIG5hdmlnYXRvcj09Im9iamVjdCImJnR5cGVvZiBuYXZpZ2F0b3IudXNlckFnZW50PT0ic3RyaW5nIil7Y29uc3QgeT1uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2Nocm9tZVwvKFxkKykvKTt5JiYobT1OdW1iZXIoeVsxXSk8NzApfWZ1bmN0aW9uIHUoeSxPLHg9e30pe2NvbnN0IHY9eC5vZmZzY3JlZW58fCFtJiZ4Lm9mZnNjcmVlbiE9PSExO2xldCBUO3JldHVybiB0eXBlb2YgZTwidSImJnR5cGVvZiBlLmNyZWF0ZUNhbnZhcz09ImZ1bmN0aW9uIj9UPWUuY3JlYXRlQ2FudmFzKHksTyx4KTp2JiZ0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzPT0iZnVuY3Rpb24iP1Q9bmV3IE9mZnNjcmVlbkNhbnZhcyh5LE8pOihUPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLFQud2lkdGg9eSxULmhlaWdodD1PKSxUfWNvbnN0IHA9e2NyZWF0ZUNhbnZhczp1LGNyZWF0ZVRleHQ6Yyxsb2FkSW1hZ2U6bi5kZWZhdWx0LmxvYWRJbWFnZX07ci5kZWZhdWx0PXB9KS5jYWxsKHRoaXMsdCgyMikpfSxmdW5jdGlvbihkLHIpe3ZhciB0O3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30oKTt0cnl7dD10fHxuZXcgRnVuY3Rpb24oInJldHVybiB0aGlzIikoKX1jYXRjaHt0eXBlb2Ygd2luZG93PT0ib2JqZWN0IiYmKHQ9d2luZG93KX1kLmV4cG9ydHM9dH0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4geH0pLHQoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtmdW5jdGlvbiBlKHYsVCl7aWYodHlwZW9mIHY9PSJzdHJpbmciKXtjb25zdCBmPXYudHJpbSgpLm1hdGNoKC9eKFtcZC5dKykocHh8cHR8cGN8aW58Y218bW18ZW18ZXh8cmVtfHF8dnd8dmh8dm1heHx2bWlufCUpJC8pO2Y/dj17c2l6ZTpwYXJzZUZsb2F0KGZbMV0pLHVuaXQ6ZlsyXX06dj17c2l6ZTpwYXJzZUludCh2LDEwKSx1bml0OiJweCJ9fWxldHtzaXplOmwsdW5pdDpofT12O2lmKGg9PT0icHQiKWwvPS43NTtlbHNlIGlmKGg9PT0icGMiKWwqPTE2O2Vsc2UgaWYoaD09PSJpbiIpbCo9OTY7ZWxzZSBpZihoPT09ImNtIilsKj05Ni8yLjU0O2Vsc2UgaWYoaD09PSJtbSIpbCo9OTYvMjUuNDtlbHNlIGlmKGg9PT0iZW0ifHxoPT09InJlbSJ8fGg9PT0iZXgiKXtpZighVCYmdHlwZW9mIGdldENvbXB1dGVkU3R5bGU9PSJmdW5jdGlvbiImJnR5cGVvZiBkb2N1bWVudDwidSIpe2NvbnN0IGY9Z2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmZvbnRTaXplO1Q9ZShmLDE2KX1sKj1ULGg9PT0iZXgiJiYobC89Mil9ZWxzZSBpZihoPT09InEiKWwqPTk2LzI1LjQvNDtlbHNlIGlmKGg9PT0idncifHxoPT09InZoIil7aWYodHlwZW9mIGRvY3VtZW50PCJ1Iil7Y29uc3QgZj1oPT09InZ3Ij9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg6ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDtsKj1mLzEwMH19ZWxzZSBpZigoaD09PSJ2bWF4Inx8aD09PSJ2bWluIikmJnR5cGVvZiBkb2N1bWVudDwidSIpe2NvbnN0IGY9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLGc9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDtoPT09InZtYXgiP2wqPU1hdGgubWF4KGYsZykvMTAwOmwqPU1hdGgubWluKGYsZykvMTAwfXJldHVybiBsfWNvbnN0IG49ImJvbGR8Ym9sZGVyfGxpZ2h0ZXJ8WzEtOV0wMCIsYT0iaXRhbGljfG9ibGlxdWUiLHM9InNtYWxsLWNhcHMiLGk9InVsdHJhLWNvbmRlbnNlZHxleHRyYS1jb25kZW5zZWR8Y29uZGVuc2VkfHNlbWktY29uZGVuc2VkfHNlbWktZXhwYW5kZWR8ZXhwYW5kZWR8ZXh0cmEtZXhwYW5kZWR8dWx0cmEtZXhwYW5kZWQiLG89InB4fHB0fHBjfGlufGNtfG1tfGVtfGV4fHJlbXxxfHZ3fHZofHZtYXh8dm1pbnwlIixjPWAnKFteJ10rKSd8IihbXiJdKykifChbXFx3LV18W+S4gC3pvqVdKStgLG09bmV3IFJlZ0V4cChgKCR7bn0pICtgLCJpIiksdT1uZXcgUmVnRXhwKGAoJHthfSkgK2AsImkiKSxwPW5ldyBSZWdFeHAoYCgke3N9KSArYCwiaSIpLHk9bmV3IFJlZ0V4cChgKCR7aX0pICtgLCJpIiksTz1uZXcgUmVnRXhwKCIoW1xcZFxcLl0rKSgiK28rIikoPzpcXC8oW1xcZFxcLl0rKSgiK28rIikpPyAqKCg/OiIrYysiKSggKiwgKig/OiIrYysiKSkqKSIpO2Z1bmN0aW9uIHgodixUKXtjb25zdCBsPU8uZXhlYyh2KTtpZighbClyZXR1cm47Y29uc3QgaD1wYXJzZUZsb2F0KGxbM10pLGY9e3dlaWdodDoibm9ybWFsIixzdHlsZToibm9ybWFsIixzdHJldGNoOiJub3JtYWwiLHZhcmlhbnQ6Im5vcm1hbCIsc2l6ZTpwYXJzZUZsb2F0KGxbMV0pLHVuaXQ6bFsyXSxsaW5lSGVpZ2h0Ok51bWJlci5pc0Zpbml0ZShoKT9oOnZvaWQgMCxsaW5lSGVpZ2h0VW5pdDpsWzRdLGZhbWlseTpsWzVdLnJlcGxhY2UoLyAqLCAqL2csIiwiKX0sZz12LnN1YnN0cmluZygwLGwuaW5kZXgpLE09bS5leGVjKGcpLEE9dS5leGVjKGcpLEM9cC5leGVjKGcpLGI9eS5leGVjKGcpO3JldHVybiBNJiYoZi53ZWlnaHQ9TVsxXSksQSYmKGYuc3R5bGU9QVsxXSksQyYmKGYudmFyaWFudD1DWzFdKSxiJiYoZi5zdHJldGNoPWJbMV0pLGYucHhIZWlnaHQ9ZSh7c2l6ZTpmLnNpemUsdW5pdDpmLnVuaXR9LFQpLGYucHhMaW5lSGVpZ2h0PWUoe3NpemU6Zi5saW5lSGVpZ2h0fHxmLnNpemUsdW5pdDpmLmxpbmVIZWlnaHRVbml0fHxmLnVuaXR9LFQpLGZ9fSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJkZWZhdWx0IixmdW5jdGlvbigpe3JldHVybiBlfSksdCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2Z1bmN0aW9uIGUobil7cmV0dXJuYHJnYmEoJHtuLm1hcCgoYSxzKT0+czwzP01hdGgucm91bmQoYSoyNTUpOmEpLmpvaW4oKX0pYH19LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImFwcGx5RmlsdGVyIixmdW5jdGlvbigpe3JldHVybiBpfSksdC5kKHIsImRyYXdNZXNoMkQiLGZ1bmN0aW9uKCl7cmV0dXJuIGN9KTt2YXIgZT10KDEpLG49dCgyNCksYT10KDIzKSxzPXQoMjYpO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtmdW5jdGlvbiBpKG0sdSl7Y29uc3QgcD1tLmNhbnZhczttLnNhdmUoKSxtLmZpbHRlcj11LG0uZHJhd0ltYWdlKHAsMCwwLHAud2lkdGgscC5oZWlnaHQpLG0ucmVzdG9yZSgpfWZ1bmN0aW9uIG8obSx1KXtjb25zdCBwPS9yZ2JhXCgoXGQrKSwoXGQrKSwoXGQrKSwoXGQrKVwpLzttPW0ubWF0Y2gocCkuc2xpY2UoMSw1KS5tYXAoTnVtYmVyKSx1PXUubWF0Y2gocCkuc2xpY2UoMSw1KS5tYXAoTnVtYmVyKTtjb25zdCB5PVtdLE89dVszXTtmb3IobGV0IHg9MDt4PDQ7eCsrKXlbeF09T2JqZWN0KHMubWl4KShtW3hdLHVbeF0sTyk7cmV0dXJuYHJnYmEoJHt5LmpvaW4oKX0pYH1mdW5jdGlvbiBjKG0sdSxwPSEwLHk9bnVsbCxPPW51bGwseD1udWxsLHY9bnVsbCl7dS5zYXZlKCk7bGV0IFQ9ITEsbD0hMTtpZih1Lmdsb2JhbEFscGhhPW0uZ2V0T3BhY2l0eSgpLG0uX3VwZGF0ZU1hdHJpeCYmbS50cmFuc2Zvcm1TY2FsZS9tLmNvbnRvdXJzLnNjYWxlPjEuNSYmbS5hY2N1cmF0ZShtLnRyYW5zZm9ybVNjYWxlKSxtLmxpbmVXaWR0aCl7bGV0IGc9bS5ncmFkaWVudCYmbS5ncmFkaWVudC5zdHJva2U7aWYoZyl7Y29uc3R7dmVjdG9yOk0sY29sb3JzOkF9PWc7aWYoTS5sZW5ndGg9PT02KWc9dS5jcmVhdGVSYWRpYWxHcmFkaWVudCguLi5NKTtlbHNlIGlmKE0ubGVuZ3RoPT09NClnPXUuY3JlYXRlTGluZWFyR3JhZGllbnQoLi4uTSk7ZWxzZSBpZihNLmxlbmd0aD09PTMpZz11LmNyZWF0ZUNpcmN1bGFyR3JhZGllbnQoLi4uTSk7ZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIHZlY3RvciBkaW1lbnNpb24uIik7QS5mb3JFYWNoKCh7b2Zmc2V0OkMsY29sb3I6Yn0pPT57bGV0IEU9T2JqZWN0KG4uZGVmYXVsdCkoYik7TyYmKEU9byhFLE8pKSxnLmFkZENvbG9yU3RvcChDLEUpfSksdS5zdHJva2VTdHlsZT1nLFQ9ITB9ZWxzZSBtLnN0cm9rZVN0eWxlJiYoTz91LnN0cm9rZVN0eWxlPW8obS5zdHJva2VTdHlsZSxPKTp1LnN0cm9rZVN0eWxlPW0uc3Ryb2tlU3R5bGUsVD0hMCl9VCYmKHUubGluZVdpZHRoPW0ubGluZVdpZHRoLHUubGluZUpvaW49bS5saW5lSm9pbix1LmxpbmVDYXA9bS5saW5lQ2FwLHUubWl0ZXJMaW1pdD1tLm1pdGVyTGltaXQsbS5saW5lRGFzaCYmKHUuc2V0TGluZURhc2gobS5saW5lRGFzaCksbS5saW5lRGFzaE9mZnNldCYmKHUubGluZURhc2hPZmZzZXQ9bS5saW5lRGFzaE9mZnNldCkpKTtsZXQgaD1tLmdyYWRpZW50JiZtLmdyYWRpZW50LmZpbGw7aWYoaCl7Y29uc3R7dmVjdG9yOmcsY29sb3JzOk19PWg7aWYoZy5sZW5ndGg9PT02KWg9dS5jcmVhdGVSYWRpYWxHcmFkaWVudCguLi5nKTtlbHNlIGlmKGcubGVuZ3RoPT09NCloPXUuY3JlYXRlTGluZWFyR3JhZGllbnQoLi4uZyk7ZWxzZSBpZihnLmxlbmd0aD09PTMpaD11LmNyZWF0ZUNpcmN1bGFyR3JhZGllbnQoLi4uZyk7ZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIHZlY3RvciBkaW1lbnNpb24uIik7TS5mb3JFYWNoKCh7b2Zmc2V0OkEsY29sb3I6Q30pPT57bGV0IGI9T2JqZWN0KG4uZGVmYXVsdCkoQyk7TyYmKGI9byhiLE8pKSxoLmFkZENvbG9yU3RvcChBLGIpfSksdS5maWxsU3R5bGU9aCxsPSEwfWVsc2UgbS5maWxsU3R5bGUmJih5P3UuZmlsbFN0eWxlPW8obS5maWxsU3R5bGUseSk6dS5maWxsU3R5bGU9bS5maWxsU3R5bGUsbD0hMCk7aWYodiYmdS50cmFuc2Zvcm0oLi4udiksdS50cmFuc2Zvcm0oLi4ubS50cmFuc2Zvcm1NYXRyaXgpLG0uY2xpcFBhdGgpe2NvbnN0IGc9bS5jbGlwUGF0aCxNPW5ldyBQYXRoMkQoZyk7dS5jbGlwKE0pfWNvbnN0IGY9bS5jb250b3Vycy5sZW5ndGg7aWYobS5jb250b3Vycy5mb3JFYWNoKChnLE0pPT57Y29uc3QgQT1nLmxlbmd0aCxDPUE+MSYmZS52ZWMyLmVxdWFscyhnWzBdLGdbQS0xXSksYj1NPT09Zi0xJiZtLnRleHR1cmU7aWYoZyYmQT4wKXtpZihsfHxUfHxiKXt1LmJlZ2luUGF0aCgpLHUubW92ZVRvKC4uLmdbMF0pO2ZvcihsZXQgRT0xO0U8QTtFKyspRT09PUEtMSYmQz91LmNsb3NlUGF0aCgpOnUubGluZVRvKC4uLmdbRV0pfWlmKGwmJnUuZmlsbChtLmZpbGxSdWxlKSxiKXt1LnNhdmUoKSx1LmNsaXAoKTtsZXR7aW1hZ2U6RSxvcHRpb25zOkx9PW0udGV4dHVyZTtpZih4JiYoRT14KSxMLnJlcGVhdCYmY29uc29sZS53YXJuKCJDb250ZXh0IDJEIG5vdCBzdXBwb3J0ZWQgaW1hZ2UgcmVwZWF0IHlldC4iKSxFLmZvbnQpe0wuc2NhbGUmJmNvbnNvbGUud2FybigiQ29udGV4dCAyRCBub3Qgc3VwcG9ydGVkIHRleHQgc2NhbGUgeWV0LiIpLEwuc3JjUmVjdCYmY29uc29sZS53YXJuKCJDb250ZXh0IDJEIG5vdCBzdXBwb3J0ZWQgdGV4dCBzcmNSZWN0IHlldC4iKTtsZXR7Zm9udDpELGZpbGxDb2xvcjpJLHN0cm9rZUNvbG9yOlIsc3Ryb2tlV2lkdGg6Qix0ZXh0Onp9PUU7IUkmJiFSJiYoST0iIzAwMCIpLEFycmF5LmlzQXJyYXkoSSkmJihJPU9iamVjdChuLmRlZmF1bHQpKEkpKSxBcnJheS5pc0FycmF5KFIpJiYoUj1PYmplY3Qobi5kZWZhdWx0KShSKSksdS5mb250PUQ7Y29uc3R7d2lkdGg6S309dS5tZWFzdXJlVGV4dCh6KSxRPU9iamVjdChhLmRlZmF1bHQpKEQpLF89TWF0aC5tYXgoUS5weExpbmVIZWlnaHQsUS5weEhlaWdodCoxLjEzKTt1LnRleHRBbGlnbj0iY2VudGVyIix1LnRleHRCYXNlbGluZT0ibWlkZGxlIjtjb25zdCBqPUwucmVjdCxHPWpbMF0rXyouNStRLnB4SGVpZ2h0Ki4wNixYPWpbMV0rSyouNTtqWzJdIT1udWxsJiZ1LnNjYWxlKGpbMl0vSyxqWzNdL18pLEkmJih1LmZpbGxTdHlsZT1JLHUuZmlsbFRleHQoeixYLEcpKSxSJiYodS5saW5lV2lkdGg9Qix1LnN0cm9rZVN0eWxlPVIsdS5zdHJva2VUZXh0KHosWCxHKSl9ZWxzZXtsZXQgRD1MLnJlY3Q7Y29uc3QgST1MLnNyY1JlY3Q7TC5zY2FsZSYmKEQ9WzAsMCx1LmNhbnZhcy53aWR0aCx1LmNhbnZhcy5oZWlnaHRdKSxMLnJvdGF0ZWQmJkQmJihEPVstRFsxXSxEWzBdLERbM10sRFsyXV0pLEkmJihEPUR8fFswLDAsSVsyXSxJWzNdXSksTC5yb3RhdGVkJiYodS50cmFuc2xhdGUoMCxEP0RbMl06RS53aWR0aCksdS5yb3RhdGUoLS41Kk1hdGguUEkpKSxJP3UuZHJhd0ltYWdlKEUsLi4uSSwuLi5EKTpEP3UuZHJhd0ltYWdlKEUsLi4uRCk6dS5kcmF3SW1hZ2UoRSwwLDApfXUucmVzdG9yZSgpfVQmJnUuc3Ryb2tlKCl9fSksdS5yZXN0b3JlKCkscCl7Y29uc3QgZz1tLmZpbHRlcjtnJiZpKHUsZyl9fX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiY2xhbXAiLGZ1bmN0aW9uKCl7cmV0dXJuIGV9KSx0LmQociwibWl4IixmdW5jdGlvbigpe3JldHVybiBufSksdC5kKHIsInRyYW5zZm9ybVBvaW50IixmdW5jdGlvbigpe3JldHVybiBhfSksdCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2Z1bmN0aW9uIGUocyxpLG8pe3JldHVybiBpPm8mJihbaSxvXT1bbyxpXSksczxpP2k6cz5vP286c31mdW5jdGlvbiBuKHMsaSxvKXtyZXR1cm4gcyooMS1vKStpKm99ZnVuY3Rpb24gYShzLGkpe2NvbnN0W28sY109cztyZXR1cm5bbyppWzBdK2MqaVsyXStpWzRdLG8qaVsxXStjKmlbM10raVs1XV19fSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJkZWZhdWx0IixmdW5jdGlvbigpe3JldHVybiBvfSk7dmFyIGU9dCgyOCksbj10KDI5KTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7ZnVuY3Rpb24gYShjLG0sdSl7Y29uc3QgcD1jLnVuaWZvcm1zfHx7fSx5PW0udW5pZm9ybXN8fHt9O2lmKHAudV90ZXhTYW1wbGVyJiZ5LnVfdGV4U2FtcGxlciYmcC51X3RleFNhbXBsZXIhPT15LnVfdGV4U2FtcGxlcilyZXR1cm4hMTtjb25zdCBPPU9iamVjdC5rZXlzKHApLHg9T2JqZWN0LmtleXMoeSksdj1PLmluZGV4T2YoInVfdGV4U2FtcGxlciIpLFQ9eC5pbmRleE9mKCJ1X3RleFNhbXBsZXIiKTtpZih2Pj0wJiZPLnNwbGljZSh2LDEpLFQ+PTAmJnguc3BsaWNlKFQsMSksTy5sZW5ndGghPT14Lmxlbmd0aClyZXR1cm4hMTtjb25zdCBsPU8uZXZlcnkoaD0+e2NvbnN0IGY9cFtoXSxnPXlbaF07aWYoZj09PWcpcmV0dXJuITA7aWYoZi5sZW5ndGgmJmcubGVuZ3RoJiZmLmxlbmd0aD09PWcubGVuZ3RoKXtmb3IobGV0IE09MDtNPGYubGVuZ3RoO00rKylpZihmW01dIT09Z1tNXSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX0pO2lmKGwpe2lmKHAudV90ZXhTYW1wbGVyJiYheS51X3RleFNhbXBsZXIpbS5zZXRUZXh0dXJlKHAudV90ZXhTYW1wbGVyLHtoaWRkZW46ITB9KTtlbHNlIGlmKCFwLnVfdGV4U2FtcGxlciYmeS51X3RleFNhbXBsZXIpZm9yKGxldCBoPTA7aDx1Lmxlbmd0aDtoKyspdVtoXS5zZXRUZXh0dXJlKHkudV90ZXhTYW1wbGVyLHtoaWRkZW46ITB9KX1yZXR1cm4gbH1jb25zdCBzPXt9O2Z1bmN0aW9uIGkoYyxtKXtpZihjLmxlbmd0aCl7Y29uc3QgdT1PYmplY3QoZS5kZWZhdWx0KShjLHMpO3JldHVybiB1LmVuYWJsZUJsZW5kPW0sY1swXS5maWx0ZXJDYW52YXMmJih1LmZpbHRlckNhbnZhcz0hMCksdS5wYWNrSW5kZXg9Y1swXS5wYWNrSW5kZXgsdS5wYWNrTGVuZ3RoPWMubGVuZ3RoLHUuYmVmb3JlUmVuZGVyPWNbMF0uYmVmb3JlUmVuZGVyLHUucGFzcz1jWzBdLnBhc3MsdS5hZnRlclJlbmRlcj1jW2MubGVuZ3RoLTFdLmFmdGVyUmVuZGVyLGMubGVuZ3RoPTAsdX19ZnVuY3Rpb24qbyhjLG0sdT0hMSl7Y29uc3QgcD1bXSx5PWMub3B0aW9ucy5idWZmZXJTaXplO2xldCBPPTAseD0hMTtmb3IobGV0IHY9MDt2PG0ubGVuZ3RoO3YrKyl7Y29uc3QgVD1tW3ZdO2lmKFQgaW5zdGFuY2VvZiBuLmRlZmF1bHQpcC5sZW5ndGgmJih5aWVsZCBpKHAseCkpLE89MCx4PSExLHlpZWxkIFQ7ZWxzZXtjb25zdCBsPVQubWVzaERhdGE7aWYobC5jbGlwUGF0aCYmIWwudW5pZm9ybXMudV9jbGlwU2FtcGxlcil7Y29uc3QgZj1jLmNyZWF0ZVRleHR1cmUobC5jbGlwUGF0aCk7bC51bmlmb3Jtcy51X2NsaXBTYW1wbGVyPWZ9bGV0IGg9MDtpZigoIXV8fCFULmNhbklnbm9yZSgpKSYmbCYmbC5wb3NpdGlvbnMubGVuZ3RoKXtULnBhY2tJbmRleD12O2NvbnN0IGY9VC5maWx0ZXJDYW52YXM7aWYoaD1sLnBvc2l0aW9ucy5sZW5ndGgsZnx8TytoPnkpcC5sZW5ndGgmJih5aWVsZCBpKHAseCkpLE89MCx4PSExO2Vsc2UgaWYoTyl7Y29uc3QgZz1wW3AubGVuZ3RoLTFdO2cmJihnLmZpbHRlckNhbnZhc3x8Zy5hZnRlclJlbmRlcnx8VC5iZWZvcmVSZW5kZXJ8fGcucGFzcy5sZW5ndGh8fFQucGFzcy5sZW5ndGh8fGcucHJvZ3JhbSE9PVQucHJvZ3JhbXx8IWEoZyxULHApKSYmKHlpZWxkIGkocCx4KSxPPTAseD0hMSl9cC5wdXNoKFQpLHg9eHx8VC5lbmFibGVCbGVuZCxPKz1ofXY9PT1tLmxlbmd0aC0xJiZwLmxlbmd0aCYmKHlpZWxkIGkocCx4KSl9fX19LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImRlZmF1bHQiLGZ1bmN0aW9uKCl7cmV0dXJuIGF9KSx0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7Y29uc3QgZT17VU5TSUdORURfQllURTpVaW50OEFycmF5LFVOU0lHTkVEX1NIT1JUOlVpbnQxNkFycmF5LEJZVEU6SW50OEFycmF5LFNIT1JUOkludDE2QXJyYXksRkxPQVQ6RmxvYXQzMkFycmF5fTtmdW5jdGlvbiBuKHMsaSl7bGV0IG89MCxjPTAsbT0wLHU9MCxwPTAseT0wLE89MDtjb25zdCB4PXNbMF0ucHJvZ3JhbTtmb3IobGV0IHY9MDt2PHMubGVuZ3RoO3YrKyl7Y29uc3QgVD1zW3ZdLm1lc2hEYXRhO2lmKFQpe08rPVQucG9zaXRpb25zLmxlbmd0aDtjb25zdCBsPVQucG9zaXRpb25zWzBdLmxlbmd0aDtvKz1ULnBvc2l0aW9ucy5sZW5ndGgqbCxjKz1ULmNlbGxzLmxlbmd0aCozLHkrPVQuYXR0cmlidXRlcy5hX2NvbG9yLmxlbmd0aCo0O2NvbnN0IGg9VC50ZXh0dXJlQ29vcmQ7aCYmKG0rPWgubGVuZ3RoKmhbMF0ubGVuZ3RoKTtjb25zdCBmPVQuYXR0cmlidXRlcy5hX3NvdXJjZVJlY3Q7ZiYmKHUrPWYubGVuZ3RoKjQpO2NvbnN0IGc9VC5hdHRyaWJ1dGVzLmFfY2xpcFVWO2cmJihwKz1nLmxlbmd0aCoyKX19aWYoKCFpLnBvc2l0aW9uc3x8aS5wb3NpdGlvbnMubGVuZ3RoPG8pJiYoaS5wb3NpdGlvbnM9bmV3IEZsb2F0MzJBcnJheShvKSksKCFpLmNlbGxzfHxpLmNlbGxzLmxlbmd0aDxjKSYmKGkuY2VsbHM9bmV3IFVpbnQxNkFycmF5KGMpKSxtJiYoIWkudGV4dHVyZUNvb3JkfHxpLnRleHR1cmVDb29yZC5sZW5ndGg8bSkmJihpLnRleHR1cmVDb29yZD1uZXcgRmxvYXQzMkFycmF5KG0pKSwoIWkuYV9jb2xvcnx8aS5hX2NvbG9yLmxlbmd0aDx5KSYmKGkuYV9jb2xvcj1uZXcgVWludDhBcnJheSh5KSksdSYmKCFpLmFfc291cmNlUmVjdHx8aS5hX3NvdXJjZVJlY3QubGVuZ3RoPHUpJiYoaS5hX3NvdXJjZVJlY3Q9bmV3IEZsb2F0MzJBcnJheSh1KSkscCYmKCFpLmFfY2xpcFVWfHxpLmFfY2xpcFVWLmxlbmd0aDxwKSYmKGkuYV9jbGlwVVY9bmV3IEZsb2F0MzJBcnJheShwKSkseCl7Y29uc3Qgdj1PYmplY3QuZW50cmllcyh4Ll9hdHRyaWJ1dGUpLFQ9eC5fYXR0cmliT3B0c3x8e307Zm9yKGxldCBsPTA7bDx2Lmxlbmd0aDtsKyspe2NvbnN0W2gsZl09dltsXTtpZihoIT09ImFfY29sb3IiJiZoIT09ImFfc291cmNlUmVjdCImJmYhPT0iaWdub3JlZCIpe2NvbnN0IGc9VFtoXT9UW2hdLnR5cGU6IkZMT0FUIixNPWVbZ10sQT1mLnNpemUqTzsoIWlbaF18fGlbaF0ubGVuZ3RoPEEpJiYoaVtoXT1uZXcgTShBKSl9fX1yZXR1cm4gaX1mdW5jdGlvbiBhKHMsaSl7bGV0IG89W10sYz1bXSxtPVtdLHU9W10scD1bXSx5PVtdLE89MCx4PTA7Y29uc3Qgdj1zWzBdP3NbMF0udW5pZm9ybXN8fHt9Ont9LFQ9c1swXT9zWzBdLnByb2dyYW06bnVsbDtpJiYobihzLGkpLGM9aS5jZWxscyxvPWkucG9zaXRpb25zLG09aS50ZXh0dXJlQ29vcmQsdT1pLmFfY29sb3IscD1pLmFfc291cmNlUmVjdCx5PWkuYV9jbGlwVVYpO2xldCBsPSExLGg9ITE7Y29uc3QgZj17fTtmb3IobGV0IE09MDtNPHMubGVuZ3RoO00rKyl7bGV0IEE9c1tNXTtpZihBKXtpZihBLm1lc2hEYXRhJiYoQT1BLm1lc2hEYXRhKSxpKXtjb25zdCBiPUEucG9zaXRpb25zO2ZvcihsZXQgRT0wO0U8Yi5sZW5ndGg7RSsrKXtjb25zdCBMPWJbRV0sRD0zKihPK0UpO2ZvcihsZXQgST0wO0k8TC5sZW5ndGg7SSsrKW9bRCtJXT1MW0ldfX1lbHNlIG8ucHVzaCguLi5BLnBvc2l0aW9ucyk7Y29uc3QgQz1BLmNlbGxzO2ZvcihsZXQgYj0wO2I8Qy5sZW5ndGg7YisrKXtjb25zdCBFPUNbYl07aWYoaSl7Y29uc3QgTD0zKih4K2IpO2NbTF09RVswXStPLGNbTCsxXT1FWzFdK08sY1tMKzJdPUVbMl0rT31lbHNlIGMucHVzaChbRVswXStPLEVbMV0rTyxFWzJdK09dKX1pZihpKXtjb25zdCBiPUEuYXR0cmlidXRlcy5hX2NvbG9yO2ZvcihsZXQgRT0wO0U8Yi5sZW5ndGg7RSsrKXtjb25zdCBMPWJbRV0sRD00KihPK0UpO3VbRF09TFswXSx1W0QrMV09TFsxXSx1W0QrMl09TFsyXSx1W0QrM109TFszXX19ZWxzZSB1LnB1c2goLi4uQS5hdHRyaWJ1dGVzLmFfY29sb3IpO2lmKEEuYXR0cmlidXRlcy5hX3NvdXJjZVJlY3QpaWYobD0hMCxpKXtjb25zdCBiPUEuYXR0cmlidXRlcy5hX3NvdXJjZVJlY3Q7Zm9yKGxldCBFPTA7RTxiLmxlbmd0aDtFKyspe2NvbnN0IEw9YltFXSxEPTQqKE8rRSk7cFtEXT1MWzBdLHBbRCsxXT1MWzFdLHBbRCsyXT1MWzJdLHBbRCszXT1MWzNdfX1lbHNlIHAucHVzaCguLi5BLmF0dHJpYnV0ZXMuYV9zb3VyY2VSZWN0KTtpZihBLmF0dHJpYnV0ZXMuYV9jbGlwVVYpaWYoaD0hMCxpKXtjb25zdCBiPUEuYXR0cmlidXRlcy5hX2NsaXBVVjtmb3IobGV0IEU9MDtFPGIubGVuZ3RoO0UrKyl7Y29uc3QgTD1iW0VdLEQ9MiooTytFKTt5W0RdPUxbMF0seVtEKzFdPUxbMV19fWVsc2UgeS5wdXNoKC4uLkEuYXR0cmlidXRlcy5hX2NsaXBVVik7aWYoQS50ZXh0dXJlQ29vcmQpaWYoaSl7Y29uc3QgYj1BLnRleHR1cmVDb29yZDtmb3IobGV0IEU9MDtFPGIubGVuZ3RoO0UrKyl7Y29uc3QgTD1iW0VdLEQ9MyooTytFKTtmb3IobGV0IEk9MDtJPEwubGVuZ3RoO0krKyltW0QrSV09TFtJXX19ZWxzZSBtLnB1c2goLi4uQS50ZXh0dXJlQ29vcmQpO2lmKFQpe2NvbnN0IGI9T2JqZWN0LmVudHJpZXMoVC5fYXR0cmlidXRlKTtmb3IobGV0IEU9MDtFPGIubGVuZ3RoO0UrKyl7Y29uc3RbTCxEXT1iW0VdO2lmKEwhPT0iYV9jb2xvciImJkwhPT0iYV9zb3VyY2VSZWN0IiYmRCE9PSJpZ25vcmVkIilpZihmW0xdPVtdLGkpe2ZbTF09aVtMXTtjb25zdCBJPUEuYXR0cmlidXRlc1tMXSxSPUlbMF0ubGVuZ3RoO2ZvcihsZXQgQj0wO0I8SS5sZW5ndGg7QisrKXtjb25zdCB6PUlbQl0sSz1SKihPK0IpO2ZvcihsZXQgUT0wO1E8ei5sZW5ndGg7USsrKWZbTF1bSytRXT16W1FdfX1lbHNlIGZbTF0ucHVzaCguLi5BLmF0dHJpYnV0ZXNbTF0pfX1PKz1BLnBvc2l0aW9ucy5sZW5ndGgseCs9QS5jZWxscy5sZW5ndGh9fWYuYV9jb2xvcj11LGwmJnAmJnAubGVuZ3RoPjAmJihmLmFfc291cmNlUmVjdD1wKTtjb25zdCBnPXtwb3NpdGlvbnM6byxjZWxsczpjLGF0dHJpYnV0ZXM6Zix1bmlmb3Jtczp2LGNlbGxzQ291bnQ6eCozLHByb2dyYW06VH07cmV0dXJuIG0mJm0ubGVuZ3RoJiYoZy50ZXh0dXJlQ29vcmQ9bSksaCYmeS5sZW5ndGg+MCYmKGYuYV9jbGlwVVY9eSksZ319LGZ1bmN0aW9uKGQscix0KXt0LnIocik7dmFyIGU9dCgxKSxuPXQoMzApLGE9dCgyNikscz10KDMxKTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7ZnVuY3Rpb24gaShmLGcpe3ZhciBNPU9iamVjdC5rZXlzKGYpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBBPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZik7ZyYmKEE9QS5maWx0ZXIoZnVuY3Rpb24oQyl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZixDKS5lbnVtZXJhYmxlfSkpLE0ucHVzaC5hcHBseShNLEEpfXJldHVybiBNfWZ1bmN0aW9uIG8oZil7Zm9yKHZhciBnPTE7Zzxhcmd1bWVudHMubGVuZ3RoO2crKyl7dmFyIE09YXJndW1lbnRzW2ddIT1udWxsP2FyZ3VtZW50c1tnXTp7fTtnJTI/aShPYmplY3QoTSksITApLmZvckVhY2goZnVuY3Rpb24oQSl7YyhmLEEsTVtBXSl9KTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyhmLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKE0pKTppKE9iamVjdChNKSkuZm9yRWFjaChmdW5jdGlvbihBKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZixBLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTSxBKSl9KX1yZXR1cm4gZn1mdW5jdGlvbiBjKGYsZyxNKXtyZXR1cm4gZyBpbiBmP09iamVjdC5kZWZpbmVQcm9wZXJ0eShmLGcse3ZhbHVlOk0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTpmW2ddPU0sZn1jb25zdCBtPVN5bWJvbCgibWVzaCIpLHU9U3ltYm9sKCJjb3VudCIpLHA9U3ltYm9sKCJibGVuZCIpLHk9U3ltYm9sKCJmaWx0ZXIiKSxPPVN5bWJvbCgidGV4dHVyZXMiKSx4PVN5bWJvbCgidGV4dHVyZU9wdGlvbnMiKSx2PVN5bWJvbCgiY2xvdWRDb2xvciIpLFQ9U3ltYm9sKCJjbG91ZEZpbHRlciIpLGw9U3ltYm9sKCJidWZmZXIiKTtmdW5jdGlvbiBoKGYsZz1udWxsKXtjb25zdCBNPW5ldyBGbG9hdDMyQXJyYXkoMypmKSxBPW5ldyBGbG9hdDMyQXJyYXkoMypmKSxDPW5ldyBGbG9hdDMyQXJyYXkoNCpmKSxiPW5ldyBGbG9hdDMyQXJyYXkoNCpmKSxFPW5ldyBGbG9hdDMyQXJyYXkoNCpmKSxMPW5ldyBGbG9hdDMyQXJyYXkoNCpmKSxEPW5ldyBGbG9hdDMyQXJyYXkoNCpmKSxJPW5ldyBVaW50OEFycmF5KGYpLFI9bmV3IFVpbnQ4QXJyYXkoNCpmKSxCPW5ldyBVaW50OEFycmF5KDQqZik7cmV0dXJuIGcmJihNLnNldChnLnRyYW5zZm9ybTAsMCksQS5zZXQoZy50cmFuc2Zvcm0xLDApLEMuc2V0KGcuY29sb3IwLDApLGIuc2V0KGcuY29sb3IxLDApLEUuc2V0KGcuY29sb3IyLDApLEwuc2V0KGcuY29sb3IzLDApLEQuc2V0KGcuY29sb3I0LDApLEkuc2V0KGcuZnJhbWVJbmRleCwwKSxSLnNldChnLmZpbGxDb2xvciwwKSxCLnNldChnLnN0cm9rZUNvbG9yLDApKSx7YnVmZmVyU2l6ZTpmLHRyYW5zZm9ybTA6TSx0cmFuc2Zvcm0xOkEsY29sb3IwOkMsY29sb3IxOmIsY29sb3IyOkUsY29sb3IzOkwsY29sb3I0OkQsZnJhbWVJbmRleDpJLGZpbGxDb2xvcjpSLHN0cm9rZUNvbG9yOkJ9fXIuZGVmYXVsdD1jbGFzc3tjb25zdHJ1Y3RvcihmLGc9MSx7YnVmZmVyOk09MWUzfT17fSl7TT1NYXRoLm1heChNLGcpLHRoaXNbdV09Zyx0aGlzW21dPWYsdGhpc1tsXT1oKE0pLHRoaXNbT109W10sdGhpc1t5XT1bXSx0aGlzW3ZdPSExLHRoaXNbVF09ITEsdGhpc1twXT0hMSx0aGlzLmluaXRCdWZmZXIoKX1pbml0QnVmZmVyKGY9MCl7Y29uc3QgZz10aGlzW3VdO2ZvcihsZXQgTT1mO008ZztNKyspdGhpc1tsXS50cmFuc2Zvcm0wLnNldChbMSwwLDBdLE0qMyksdGhpc1tsXS50cmFuc2Zvcm0xLnNldChbMCwxLDBdLE0qMyksdGhpc1tsXS5mcmFtZUluZGV4LnNldChbLTFdLE0pLHRoaXNbbF0uZmlsbENvbG9yLnNldChbMCwwLDAsMF0sTSo0KSx0aGlzW2xdLnN0cm9rZUNvbG9yLnNldChbMCwwLDAsMF0sTSo0KSx0aGlzLnNldENvbG9yVHJhbnNmb3JtKE0sbnVsbCl9Z2V0IGJ1ZmZlclNpemUoKXtyZXR1cm4gdGhpc1tsXS5idWZmZXJTaXplfWdldCBtZXNoKCl7cmV0dXJuIHRoaXNbbV19c2V0IG1lc2goZil7dGhpc1ttXT1mLHRoaXNbT10mJnRoaXMuc2V0VGV4dHVyZUZyYW1lcyh0aGlzW09dLHRoaXNbeF0pfWdldCBoYXNDbG91ZENvbG9yKCl7cmV0dXJuIHRoaXNbdl19Z2V0IGhhc0Nsb3VkRmlsdGVyKCl7cmV0dXJuIHRoaXNbVF19X2dldEZpbHRlcihmKXtyZXR1cm4gdGhpc1t5XVtmXT10aGlzW3ldW2ZdfHxbXSx0aGlzW3ldW2ZdfWdldEZpbHRlcihmKXtyZXR1cm4gdGhpcy5fZ2V0RmlsdGVyKGYpLmpvaW4oIiAiKX1nZXQgZW5hYmxlQmxlbmQoKXtyZXR1cm4gdGhpc1ttXS5lbmFibGVCbGVuZHx8dGhpc1twXX1jYW5JZ25vcmUoKXtyZXR1cm4gdGhpc1ttXS5jYW5JZ25vcmUoKX1kZWxldGUoZil7aWYoZj49dGhpc1t1XXx8ZjwwKXRocm93IG5ldyBFcnJvcigiT3V0IG9mIHJhbmdlLiIpO2NvbnN0e3RyYW5zZm9ybTA6Zyx0cmFuc2Zvcm0xOk0sY29sb3IwOkEsY29sb3IxOkMsY29sb3IyOmIsY29sb3IzOkUsY29sb3I0OkwsZnJhbWVJbmRleDpELGZpbGxDb2xvcjpJLHN0cm9rZUNvbG9yOlJ9PXRoaXNbbF07Zy5zZXQoZy5zdWJhcnJheSgzKihmKzEpKSwzKmYpLE0uc2V0KE0uc3ViYXJyYXkoMyooZisxKSksMypmKSxBLnNldChBLnN1YmFycmF5KDQqKGYrMSkpLDQqZiksQy5zZXQoQy5zdWJhcnJheSg0KihmKzEpKSw0KmYpLGIuc2V0KGIuc3ViYXJyYXkoNCooZisxKSksNCpmKSxFLnNldChFLnN1YmFycmF5KDQqKGYrMSkpLDQqZiksTC5zZXQoTC5zdWJhcnJheSg0KihmKzEpKSw0KmYpLEQuc2V0KEQuc3ViYXJyYXkoZisxKSxmKSxJLnNldChJLnN1YmFycmF5KDQqKGYrMSkpLDQqZiksUi5zZXQoUi5zdWJhcnJheSg0KihmKzEpKSw0KmYpO2Zvcihjb25zdCBCIGluIHRoaXNbeV0pQj09PWY/ZGVsZXRlIHRoaXNbeV1bQl06Qj5mJiYodGhpc1t5XVtCLTFdPXRoaXNbeV1bQl0sZGVsZXRlIHRoaXNbeV1bQl0pO3RoaXNbdV0tLX1zZXRDb2xvclRyYW5zZm9ybShmLGcpe2lmKGY+PXRoaXNbdV18fGY8MCl0aHJvdyBuZXcgRXJyb3IoIk91dCBvZiByYW5nZS4iKTtmKj00O2NvbnN0e2NvbG9yMDpNLGNvbG9yMTpBLGNvbG9yMjpDLGNvbG9yMzpiLGNvbG9yNDpFfT10aGlzW2xdO3JldHVybiBnIT1udWxsPyhNLnNldChbZ1swXSxnWzVdLGdbMTBdLGdbMTVdXSxmKSxBLnNldChbZ1sxXSxnWzZdLGdbMTFdLGdbMTZdXSxmKSxDLnNldChbZ1syXSxnWzddLGdbMTJdLGdbMTddXSxmKSxiLnNldChbZ1szXSxnWzhdLGdbMTNdLGdbMThdXSxmKSxFLnNldChbZ1s0XSxnWzldLGdbMTRdLGdbMTldXSxmKSx0aGlzW3BdPXRoaXNbcF18fGdbMThdPDEsdGhpc1tUXT0hMCk6KE0uc2V0KFsxLDAsMCwwXSxmKSxBLnNldChbMCwxLDAsMF0sZiksQy5zZXQoWzAsMCwxLDBdLGYpLGIuc2V0KFswLDAsMCwxXSxmKSxFLnNldChbMCwwLDAsMF0sZikpLHRoaXN9Z2V0Q29sb3JUcmFuc2Zvcm0oZil7aWYoZj49dGhpc1t1XXx8ZjwwKXRocm93IG5ldyBFcnJvcigiT3V0IG9mIHJhbmdlLiIpO2YqPTQ7Y29uc3R7Y29sb3IwOmcsY29sb3IxOk0sY29sb3IyOkEsY29sb3IzOkMsY29sb3I0OmJ9PXRoaXNbbF07cmV0dXJuW2dbZl0sTVtmXSxBW2ZdLENbZl0sYltmXSxnW2YrMV0sTVtmKzFdLEFbZisxXSxDW2YrMV0sYltmKzFdLGdbZisyXSxNW2YrMl0sQVtmKzJdLENbZisyXSxiW2YrMl0sZ1tmKzNdLE1bZiszXSxBW2YrM10sQ1tmKzNdLGJbZiszXV19dHJhbnNmb3JtQ29sb3IoZixnKXtsZXQgTT10aGlzLmdldENvbG9yVHJhbnNmb3JtKGYpO3JldHVybiBNPU9iamVjdChuLm11bHRpcGx5KShNLGcpLHRoaXMuc2V0Q29sb3JUcmFuc2Zvcm0oZixNKSx0aGlzfXNldEZpbGxDb2xvcihmLGcpe2lmKGY+PXRoaXNbdV18fGY8MCl0aHJvdyBuZXcgRXJyb3IoIk91dCBvZiByYW5nZS4iKTt0eXBlb2YgZz09InN0cmluZyImJihnPU9iamVjdChzLmRlZmF1bHQpKGcpKSxnWzNdPjAmJih0aGlzW3ZdPSEwKSx0aGlzW2xdLmZpbGxDb2xvci5zZXQoZy5tYXAoTT0+TWF0aC5yb3VuZCgyNTUqTSkpLDQqZil9c2V0U3Ryb2tlQ29sb3IoZixnKXtpZihmPj10aGlzW3VdfHxmPDApdGhyb3cgbmV3IEVycm9yKCJPdXQgb2YgcmFuZ2UuIik7dHlwZW9mIGc9PSJzdHJpbmciJiYoZz1PYmplY3Qocy5kZWZhdWx0KShnKSksZ1szXT4wJiYodGhpc1t2XT0hMCksdGhpc1tsXS5zdHJva2VDb2xvci5zZXQoZy5tYXAoTT0+TWF0aC5yb3VuZCgyNTUqTSkpLDQqZil9Z2V0Q2xvdWRSR0JBKGYpe2lmKGY+PXRoaXNbdV18fGY8MCl0aHJvdyBuZXcgRXJyb3IoIk91dCBvZiByYW5nZS4iKTtmKj00O2NvbnN0e2ZpbGxDb2xvcjpnLHN0cm9rZUNvbG9yOk19PXRoaXNbbF0sQT1bZ1tmXSxnW2YrMV0sZ1tmKzJdLGdbZiszXV0sQz1bTVtmXSxNW2YrMV0sTVtmKzJdLE1bZiszXV07cmV0dXJuIEFbM10vPTI1NSxDWzNdLz0yNTUse2ZpbGw6YHJnYmEoJHtBLmpvaW4oKX0pYCxzdHJva2U6YHJnYmEoJHtDLmpvaW4oKX0pYH19Z3JheXNjYWxlKGYsZyl7dGhpcy50cmFuc2Zvcm1Db2xvcihmLE9iamVjdChuLmdyYXlzY2FsZSkoZykpLHRoaXMuX2dldEZpbHRlcihmKS5wdXNoKGBncmF5c2NhbGUoJHsxMDAqZ30lKWApfWJyaWdodG5lc3MoZixnKXt0aGlzLnRyYW5zZm9ybUNvbG9yKGYsT2JqZWN0KG4uYnJpZ2h0bmVzcykoZykpLHRoaXMuX2dldEZpbHRlcihmKS5wdXNoKGBicmlnaHRuZXNzKCR7MTAwKmd9JSlgKX1zYXR1cmF0ZShmLGcpe3RoaXMudHJhbnNmb3JtQ29sb3IoZixPYmplY3Qobi5zYXR1cmF0ZSkoZykpLHRoaXMuX2dldEZpbHRlcihmKS5wdXNoKGBzYXR1cmF0ZSgkezEwMCpnfSUpYCl9Y29udHJhc3QoZixnKXt0aGlzLnRyYW5zZm9ybUNvbG9yKGYsT2JqZWN0KG4uY29udHJhc3QpKGcpKSx0aGlzLl9nZXRGaWx0ZXIoZikucHVzaChgY29udHJhc3QoJHsxMDAqZ30lKWApfWludmVydChmLGcpe3RoaXMudHJhbnNmb3JtQ29sb3IoZixPYmplY3Qobi5pbnZlcnQpKGcpKSx0aGlzLl9nZXRGaWx0ZXIoZikucHVzaChgaW52ZXJ0KCR7MTAwKmd9JSlgKX1zZXBpYShmLGcpe3RoaXMudHJhbnNmb3JtQ29sb3IoZixPYmplY3Qobi5zZXBpYSkoZykpLHRoaXMuX2dldEZpbHRlcihmKS5wdXNoKGBzZXBpYSgkezEwMCpnfSUpYCl9b3BhY2l0eShmLGcpe3RoaXMudHJhbnNmb3JtQ29sb3IoZixPYmplY3Qobi5vcGFjaXR5KShnKSksdGhpcy5fZ2V0RmlsdGVyKGYpLnB1c2goYG9wYWNpdHkoJHsxMDAqZ30lKWApfWh1ZVJvdGF0ZShmLGcpe3RoaXMudHJhbnNmb3JtQ29sb3IoZixPYmplY3Qobi5odWVSb3RhdGUpKGcpKSx0aGlzLl9nZXRGaWx0ZXIoZikucHVzaChgaHVlLXJvdGF0ZSgke2d9ZGVnKWApfXNldFRyYW5zZm9ybShmLGcpe2lmKGY+PXRoaXNbdV18fGY8MCl0aHJvdyBuZXcgRXJyb3IoIk91dCBvZiByYW5nZS4iKTtmKj0zLGc9PW51bGwmJihnPVsxLDAsMCwxLDAsMF0pO2NvbnN0e3RyYW5zZm9ybTA6TSx0cmFuc2Zvcm0xOkF9PXRoaXNbbF07cmV0dXJuIE0uc2V0KFtnWzBdLGdbMl0sZ1s0XV0sZiksQS5zZXQoW2dbMV0sZ1szXSxnWzVdXSxmKSx0aGlzfWdldFRyYW5zZm9ybShmKXtpZihmPj10aGlzW3VdfHxmPDApdGhyb3cgbmV3IEVycm9yKCJPdXQgb2YgcmFuZ2UuIik7Zio9Mztjb25zdHt0cmFuc2Zvcm0wOmcsdHJhbnNmb3JtMTpNfT10aGlzW2xdO3JldHVybltnW2ZdLE1bZl0sZ1tmKzFdLE1bZisxXSxnW2YrMl0sTVtmKzJdXX1nZXRUZXh0dXJlRnJhbWUoZil7cmV0dXJuIHRoaXNbT11bdGhpc1tsXS5mcmFtZUluZGV4W2ZdXX1zZXRUZXh0dXJlRnJhbWVzKGY9W10sZz17fSl7aWYoZi5sZW5ndGg+MTIpdGhyb3cgbmV3IEVycm9yKCJNYXggZnJhbWVzIGV4Y2VlZC4gQWxsb3cgMTIgZnJhbWVzLiIpO2YubGVuZ3RoJiZ0aGlzW21dLnNldFRleHR1cmUoZlswXSxnKSx0aGlzW09dPWYsdGhpc1t4XT1nfXNldEZyYW1lSW5kZXgoZixnKXtpZihmPj10aGlzW3VdfHxmPDApdGhyb3cgbmV3IEVycm9yKCJPdXQgb2YgcmFuZ2UuIik7Y29uc3QgTT10aGlzW09dLmxlbmd0aDtpZihNPD0wKXRocm93IG5ldyBFcnJvcigiTm8gZnJhbWVzIik7dGhpc1tsXS5mcmFtZUluZGV4W2ZdPWclTX1nZXQgYW1vdW50KCl7cmV0dXJuIHRoaXNbdV19c2V0IGFtb3VudChmKXtjb25zdCBnPXRoaXNbdV07ZiE9PWcmJihmPnRoaXNbbF0uYnVmZmVyU2l6ZSYmKHRoaXNbbF09aChNYXRoLm1heChmLHRoaXNbbF0uYnVmZmVyU2l6ZSsxZTMpLHRoaXNbbF0pKSx0aGlzW3VdPWYsZj5nJiZ0aGlzLmluaXRCdWZmZXIoZykpfWdldCBtZXNoRGF0YSgpe2NvbnN0e2F0dHJpYnV0ZXM6ZixjZWxsczpnLHBvc2l0aW9uczpNLHRleHR1cmVDb29yZDpBLHVuaWZvcm1zOkN9PXRoaXNbbV0ubWVzaERhdGEsYj10aGlzW09dLEU9e2F0dHJpYnV0ZXM6byh7fSxmKSxjZWxsczpnLHBvc2l0aW9uczpNLHRleHR1cmVDb29yZDpBLHVuaWZvcm1zOm8oe30sQyksaW5zdGFuY2VDb3VudDp0aGlzW3VdLGVuYWJsZUJsZW5kOnRoaXMuZW5hYmxlQmxlbmR9O2IubGVuZ3RoJiZiLmZvckVhY2goKEcsWCk9PntFLnVuaWZvcm1zW2B1X3RleEZyYW1lJHtYfWBdPUd9KTtjb25zdHt0cmFuc2Zvcm0wOkwsdHJhbnNmb3JtMTpELGNvbG9yMDpJLGNvbG9yMTpSLGNvbG9yMjpCLGNvbG9yMzp6LGNvbG9yNDpLLGZpbGxDb2xvcjpRLHN0cm9rZUNvbG9yOl8sZnJhbWVJbmRleDpqfT10aGlzW2xdO3JldHVybiB0aGlzW21dLnVuaWZvcm1zLnVfdGV4U2FtcGxlciYmKEUuYXR0cmlidXRlcy5hX2ZyYW1lSW5kZXg9e2RhdGE6aixkaXZpc29yOjF9KSxFLmF0dHJpYnV0ZXMuYV90cmFuc2Zvcm0wPXtkYXRhOkwsZGl2aXNvcjoxfSxFLmF0dHJpYnV0ZXMuYV90cmFuc2Zvcm0xPXtkYXRhOkQsZGl2aXNvcjoxfSxFLmF0dHJpYnV0ZXMuYV9jb2xvckNsb3VkMD17ZGF0YTpJLGRpdmlzb3I6MX0sRS5hdHRyaWJ1dGVzLmFfY29sb3JDbG91ZDE9e2RhdGE6UixkaXZpc29yOjF9LEUuYXR0cmlidXRlcy5hX2NvbG9yQ2xvdWQyPXtkYXRhOkIsZGl2aXNvcjoxfSxFLmF0dHJpYnV0ZXMuYV9jb2xvckNsb3VkMz17ZGF0YTp6LGRpdmlzb3I6MX0sRS5hdHRyaWJ1dGVzLmFfY29sb3JDbG91ZDQ9e2RhdGE6SyxkaXZpc29yOjF9LHRoaXMuaGFzQ2xvdWRDb2xvciYmKEUuYXR0cmlidXRlcy5hX2ZpbGxDbG91ZENvbG9yPXtkYXRhOlEsZGl2aXNvcjoxfSxFLmF0dHJpYnV0ZXMuYV9zdHJva2VDbG91ZENvbG9yPXtkYXRhOl8sZGl2aXNvcjoxfSksRX1zZXRQcm9ncmFtKGYpe3RoaXNbbV0uc2V0UHJvZ3JhbShmKX1nZXQgcHJvZ3JhbSgpe3JldHVybiB0aGlzW21dLnByb2dyYW19dHJhbnNmb3JtKGYsZyl7Y29uc3QgTT10aGlzLmdldFRyYW5zZm9ybShmKTtyZXR1cm4gZz1lLm1hdDJkLm11bHRpcGx5KEFycmF5Lm9mKDAsMCwwLDAsMCwwKSxNLGcpLHRoaXMuc2V0VHJhbnNmb3JtKGYsZyksdGhpc310cmFuc2xhdGUoZixbZyxNXSl7bGV0IEE9ZS5tYXQyZC5jcmVhdGUoKTtyZXR1cm4gQT1lLm1hdDJkLnRyYW5zbGF0ZShBcnJheS5vZigwLDAsMCwwLDAsMCksQSxbZyxNXSksdGhpcy50cmFuc2Zvcm0oZixBKX1yb3RhdGUoZixnLFtNLEFdPVswLDBdKXtsZXQgQz1lLm1hdDJkLmNyZWF0ZSgpO3JldHVybiBDPWUubWF0MmQudHJhbnNsYXRlKEFycmF5Lm9mKDAsMCwwLDAsMCwwKSxDLFtNLEFdKSxDPWUubWF0MmQucm90YXRlKEFycmF5Lm9mKDAsMCwwLDAsMCwwKSxDLGcpLEM9ZS5tYXQyZC50cmFuc2xhdGUoQXJyYXkub2YoMCwwLDAsMCwwLDApLEMsWy1NLC1BXSksdGhpcy50cmFuc2Zvcm0oZixDKX1zY2FsZShmLFtnLE09Z10sW0EsQ109WzAsMF0pe2xldCBiPWUubWF0MmQuY3JlYXRlKCk7cmV0dXJuIGI9ZS5tYXQyZC50cmFuc2xhdGUoQXJyYXkub2YoMCwwLDAsMCwwLDApLGIsW0EsQ10pLGI9ZS5tYXQyZC5zY2FsZShBcnJheS5vZigwLDAsMCwwLDAsMCksYixbZyxNXSksYj1lLm1hdDJkLnRyYW5zbGF0ZShBcnJheS5vZigwLDAsMCwwLDAsMCksYixbLUEsLUNdKSx0aGlzLnRyYW5zZm9ybShmLGIpfXNrZXcoZixbZyxNPWddLFtBLENdPVswLDBdKXtsZXQgYj1lLm1hdDJkLmNyZWF0ZSgpO3JldHVybiBiPWUubWF0MmQudHJhbnNsYXRlKEFycmF5Lm9mKDAsMCwwLDAsMCwwKSxiLFtBLENdKSxiPWUubWF0MmQubXVsdGlwbHkoQXJyYXkub2YoMCwwLDAsMCwwLDApLGIsZS5tYXQyZC5mcm9tVmFsdWVzKDEsTWF0aC50YW4oTSksTWF0aC50YW4oZyksMSwwLDApKSxiPWUubWF0MmQudHJhbnNsYXRlKEFycmF5Lm9mKDAsMCwwLDAsMCwwKSxiLFstQSwtQ10pLHRoaXMudHJhbnNmb3JtKGYsYil9aXNQb2ludENvbGxpc2lvbihmLFtnLE1dLEE9ImJvdGgiKXtjb25zdCBDPXRoaXMuZ2V0VHJhbnNmb3JtKGYpLGI9T2JqZWN0KGEudHJhbnNmb3JtUG9pbnQpKFtnLE1dLGUubWF0MmQuaW52ZXJ0KEFycmF5Lm9mKDAsMCwwLDAsMCwwKSxDKSk7cmV0dXJuIHRoaXNbbV0uaXNQb2ludENvbGxpc2lvbiguLi5iLEEpfWlzUG9pbnRJbkZpbGwoZixbZyxNXSl7cmV0dXJuIHRoaXMuaXNQb2ludENvbGxpc2lvbihmLFtnLE1dLCJmaWxsIil9aXNQb2ludEluU3Ryb2tlKGYsW2csTV0pe3JldHVybiB0aGlzLmlzUG9pbnRDb2xsaXNpb24oZixbZyxNXSwic3Ryb2tlIil9fX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwibXVsdGlwbHkiLGZ1bmN0aW9uKCl7cmV0dXJuIG59KSx0LmQociwiZ3JheXNjYWxlIixmdW5jdGlvbigpe3JldHVybiBhfSksdC5kKHIsImJyaWdodG5lc3MiLGZ1bmN0aW9uKCl7cmV0dXJuIHN9KSx0LmQociwic2F0dXJhdGUiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KSx0LmQociwiY29udHJhc3QiLGZ1bmN0aW9uKCl7cmV0dXJuIG99KSx0LmQociwiaW52ZXJ0IixmdW5jdGlvbigpe3JldHVybiBjfSksdC5kKHIsInNlcGlhIixmdW5jdGlvbigpe3JldHVybiBtfSksdC5kKHIsIm9wYWNpdHkiLGZ1bmN0aW9uKCl7cmV0dXJuIHV9KSx0LmQociwiaHVlUm90YXRlIixmdW5jdGlvbigpe3JldHVybiBwfSk7dmFyIGU9dCgyNik7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2Z1bmN0aW9uIG4oeSxPKXtjb25zdCB4PVtdLHY9eVswXSxUPXlbMV0sbD15WzJdLGg9eVszXSxmPXlbNF0sZz15WzVdLE09eVs2XSxBPXlbN10sQz15WzhdLGI9eVs5XSxFPXlbMTBdLEw9eVsxMV0sRD15WzEyXSxJPXlbMTNdLFI9eVsxNF0sQj15WzE1XSx6PXlbMTZdLEs9eVsxN10sUT15WzE4XSxfPXlbMTldO2xldCBqPU9bMF0sRz1PWzFdLFg9T1syXSxaPU9bM10sdHQ9T1s0XTtyZXR1cm4geFswXT1qKnYrRypnK1gqRStaKkIseFsxXT1qKlQrRypNK1gqTCtaKnoseFsyXT1qKmwrRypBK1gqRCtaKksseFszXT1qKmgrRypDK1gqSStaKlEseFs0XT1qKmYrRypiK1gqUitaKl8rdHQsaj1PWzVdLEc9T1s2XSxYPU9bN10sWj1PWzhdLHR0PU9bOV0seFs1XT1qKnYrRypnK1gqRStaKkIseFs2XT1qKlQrRypNK1gqTCtaKnoseFs3XT1qKmwrRypBK1gqRCtaKksseFs4XT1qKmgrRypDK1gqSStaKlEseFs5XT1qKmYrRypiK1gqUitaKl8rdHQsaj1PWzEwXSxHPU9bMTFdLFg9T1sxMl0sWj1PWzEzXSx0dD1PWzE0XSx4WzEwXT1qKnYrRypnK1gqRStaKkIseFsxMV09aipUK0cqTStYKkwrWip6LHhbMTJdPWoqbCtHKkErWCpEK1oqSyx4WzEzXT1qKmgrRypDK1gqSStaKlEseFsxNF09aipmK0cqYitYKlIrWipfK3R0LGo9T1sxNV0sRz1PWzE2XSxYPU9bMTddLFo9T1sxOF0sdHQ9T1sxOV0seFsxNV09aip2K0cqZytYKkUrWipCLHhbMTZdPWoqVCtHKk0rWCpMK1oqeix4WzE3XT1qKmwrRypBK1gqRCtaKksseFsxOF09aipoK0cqQytYKkkrWipRLHhbMTldPWoqZitHKmIrWCpSK1oqXyt0dCx4fWZ1bmN0aW9uIGEoeSl7eT1PYmplY3QoZS5jbGFtcCkoMCwxLHkpO2NvbnN0IE89LjIxMjYqeSx4PS43MTUyKnksdj0uMDcyMip5O3JldHVybltPKzEteSx4LHYsMCwwLE8seCsxLXksdiwwLDAsTyx4LHYrMS15LDAsMCwwLDAsMCwxLDBdfWZ1bmN0aW9uIHMoeSl7cmV0dXJuW3ksMCwwLDAsMCwwLHksMCwwLDAsMCwwLHksMCwwLDAsMCwwLDEsMF19ZnVuY3Rpb24gaSh5KXtjb25zdCBPPS4yMTI2KigxLXkpLHg9LjcxNTIqKDEteSksdj0uMDcyMiooMS15KTtyZXR1cm5bTyt5LHgsdiwwLDAsTyx4K3ksdiwwLDAsTyx4LHYreSwwLDAsMCwwLDAsMSwwXX1mdW5jdGlvbiBvKHkpe2NvbnN0IE89LjUqKDEteSk7cmV0dXJuW3ksMCwwLDAsTywwLHksMCwwLE8sMCwwLHksMCxPLDAsMCwwLDEsMF19ZnVuY3Rpb24gYyh5KXtjb25zdCBPPTEtMip5O3JldHVybltPLDAsMCwwLHksMCxPLDAsMCx5LDAsMCxPLDAseSwwLDAsMCwxLDBdfWZ1bmN0aW9uIG0oeSl7cmV0dXJuWzEtLjYwNyp5LC43NjkqeSwuMTg5KnksMCwwLC4zNDkqeSwxLS4zMTQqeSwuMTY4KnksMCwwLC4yNzIqeSwuNTM0KnksMS0uODY5KnksMCwwLDAsMCwwLDEsMF19ZnVuY3Rpb24gdSh5KXtyZXR1cm5bMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAseSwwXX1mdW5jdGlvbiBwKHkpe2NvbnN0IE89eS8xODAqTWF0aC5QSSx4PU1hdGguY29zKE8pLHY9TWF0aC5zaW4oTyksVD0uMjEyNixsPS43MTUyLGg9LjA3MjI7cmV0dXJuW1QreCooMS1UKSt2Ki1ULGwreCotbCt2Ki1sLGgreCotaCt2KigxLWgpLDAsMCxUK3gqLVQrdiouMTQzLGwreCooMS1sKSt2Ki4xNCxoK3gqLWgrdiotLjI4MywwLDAsVCt4Ki1UK3YqLSgxLVQpLGwreCotbCt2KmwsaCt4KigxLWgpK3YqaCwwLDAsMCwwLDAsMSwwXX19LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImRlZmF1bHQiLGZ1bmN0aW9uKCl7cmV0dXJuIGF9KTt2YXIgZT10KDMyKSxuPXQubihlKTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7ZnVuY3Rpb24gYShzKXtjb25zdCBpPW4oKShzKTtpZighaXx8IWkubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgY29sb3IgdmFsdWUuIik7cmV0dXJuW2lbMF0vMjU1LGlbMV0vMjU1LGlbMl0vMjU1LGlbM11dfX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoMzMpLG49dCgzNyksYT10KDM5KTtkLmV4cG9ydHM9ZnVuY3Rpb24oaSl7dmFyIG8sYz1lKGkpO3JldHVybiBjLnNwYWNlPyhvPUFycmF5KDMpLG9bMF09YShjLnZhbHVlc1swXSwwLDI1NSksb1sxXT1hKGMudmFsdWVzWzFdLDAsMjU1KSxvWzJdPWEoYy52YWx1ZXNbMl0sMCwyNTUpLGMuc3BhY2VbMF09PT0iaCImJihvPW4ucmdiKG8pKSxvLnB1c2goYShjLmFscGhhLDAsMSkpLG8pOltdfX0sZnVuY3Rpb24oZCxyLHQpeyhmdW5jdGlvbihlKXt2YXIgbj10KDM0KSxhPXQoMzUpLHM9dCgzNik7ZC5leHBvcnRzPW87dmFyIGk9e3JlZDowLG9yYW5nZTo2MCx5ZWxsb3c6MTIwLGdyZWVuOjE4MCxibHVlOjI0MCxwdXJwbGU6MzAwfTtmdW5jdGlvbiBvKGMpe3ZhciBtLHU9W10scD0xLHk7aWYodHlwZW9mIGM9PSJzdHJpbmciKWlmKG5bY10pdT1uW2NdLnNsaWNlKCkseT0icmdiIjtlbHNlIGlmKGM9PT0idHJhbnNwYXJlbnQiKXA9MCx5PSJyZ2IiLHU9WzAsMCwwXTtlbHNlIGlmKC9eI1tBLUZhLWYwLTldKyQvLnRlc3QoYykpe3ZhciBPPWMuc2xpY2UoMSkseD1PLmxlbmd0aCx2PXg8PTQ7cD0xLHY/KHU9W3BhcnNlSW50KE9bMF0rT1swXSwxNikscGFyc2VJbnQoT1sxXStPWzFdLDE2KSxwYXJzZUludChPWzJdK09bMl0sMTYpXSx4PT09NCYmKHA9cGFyc2VJbnQoT1szXStPWzNdLDE2KS8yNTUpKToodT1bcGFyc2VJbnQoT1swXStPWzFdLDE2KSxwYXJzZUludChPWzJdK09bM10sMTYpLHBhcnNlSW50KE9bNF0rT1s1XSwxNildLHg9PT04JiYocD1wYXJzZUludChPWzZdK09bN10sMTYpLzI1NSkpLHVbMF18fCh1WzBdPTApLHVbMV18fCh1WzFdPTApLHVbMl18fCh1WzJdPTApLHk9InJnYiJ9ZWxzZSBpZihtPS9eKCg/OnJnYnxoc1tsdmJdfGh3YnxjbXlrP3x4eVt6eV18Z3JheXxsYWJ8bGNodT92P3xbbHlddXZ8bG1zKWE/KVxzKlwoKFteXCldKilcKS8uZXhlYyhjKSl7dmFyIFQ9bVsxXSxsPVQ9PT0icmdiIixPPVQucmVwbGFjZSgvYSQvLCIiKTt5PU87dmFyIHg9Tz09PSJjbXlrIj80Ok89PT0iZ3JheSI/MTozO3U9bVsyXS50cmltKCkuc3BsaXQoL1xzKixccyovKS5tYXAoZnVuY3Rpb24oTSxBKXtpZigvJSQvLnRlc3QoTSkpcmV0dXJuIEE9PT14P3BhcnNlRmxvYXQoTSkvMTAwOk89PT0icmdiIj9wYXJzZUZsb2F0KE0pKjI1NS8xMDA6cGFyc2VGbG9hdChNKTtpZihPW0FdPT09ImgiKXtpZigvZGVnJC8udGVzdChNKSlyZXR1cm4gcGFyc2VGbG9hdChNKTtpZihpW01dIT09dm9pZCAwKXJldHVybiBpW01dfXJldHVybiBwYXJzZUZsb2F0KE0pfSksVD09PU8mJnUucHVzaCgxKSxwPWx8fHVbeF09PT12b2lkIDA/MTp1W3hdLHU9dS5zbGljZSgwLHgpfWVsc2UgYy5sZW5ndGg+MTAmJi9bMC05XSg/OlxzfFwvKS8udGVzdChjKSYmKHU9Yy5tYXRjaCgvKFswLTldKykvZykubWFwKGZ1bmN0aW9uKGYpe3JldHVybiBwYXJzZUZsb2F0KGYpfSkseT1jLm1hdGNoKC8oW2Etel0pL2lnKS5qb2luKCIiKS50b0xvd2VyQ2FzZSgpKTtlbHNlIGlmKCFpc05hTihjKSl5PSJyZ2IiLHU9W2M+Pj4xNiwoYyY2NTI4MCk+Pj44LGMmMjU1XTtlbHNlIGlmKGEoYykpe3ZhciBoPXMoYy5yLGMucmVkLGMuUixudWxsKTtoIT09bnVsbD8oeT0icmdiIix1PVtoLHMoYy5nLGMuZ3JlZW4sYy5HKSxzKGMuYixjLmJsdWUsYy5CKV0pOih5PSJoc2wiLHU9W3MoYy5oLGMuaHVlLGMuSCkscyhjLnMsYy5zYXR1cmF0aW9uLGMuUykscyhjLmwsYy5saWdodG5lc3MsYy5MLGMuYixjLmJyaWdodG5lc3MpXSkscD1zKGMuYSxjLmFscGhhLGMub3BhY2l0eSwxKSxjLm9wYWNpdHkhPW51bGwmJihwLz0xMDApfWVsc2UoQXJyYXkuaXNBcnJheShjKXx8ZS5BcnJheUJ1ZmZlciYmQXJyYXlCdWZmZXIuaXNWaWV3JiZBcnJheUJ1ZmZlci5pc1ZpZXcoYykpJiYodT1bY1swXSxjWzFdLGNbMl1dLHk9InJnYiIscD1jLmxlbmd0aD09PTQ/Y1szXToxKTtyZXR1cm57c3BhY2U6eSx2YWx1ZXM6dSxhbHBoYTpwfX19KS5jYWxsKHRoaXMsdCgyMikpfSxmdW5jdGlvbihkLHIsdCl7ZC5leHBvcnRzPXthbGljZWJsdWU6WzI0MCwyNDgsMjU1XSxhbnRpcXVld2hpdGU6WzI1MCwyMzUsMjE1XSxhcXVhOlswLDI1NSwyNTVdLGFxdWFtYXJpbmU6WzEyNywyNTUsMjEyXSxhenVyZTpbMjQwLDI1NSwyNTVdLGJlaWdlOlsyNDUsMjQ1LDIyMF0sYmlzcXVlOlsyNTUsMjI4LDE5Nl0sYmxhY2s6WzAsMCwwXSxibGFuY2hlZGFsbW9uZDpbMjU1LDIzNSwyMDVdLGJsdWU6WzAsMCwyNTVdLGJsdWV2aW9sZXQ6WzEzOCw0MywyMjZdLGJyb3duOlsxNjUsNDIsNDJdLGJ1cmx5d29vZDpbMjIyLDE4NCwxMzVdLGNhZGV0Ymx1ZTpbOTUsMTU4LDE2MF0sY2hhcnRyZXVzZTpbMTI3LDI1NSwwXSxjaG9jb2xhdGU6WzIxMCwxMDUsMzBdLGNvcmFsOlsyNTUsMTI3LDgwXSxjb3JuZmxvd2VyYmx1ZTpbMTAwLDE0OSwyMzddLGNvcm5zaWxrOlsyNTUsMjQ4LDIyMF0sY3JpbXNvbjpbMjIwLDIwLDYwXSxjeWFuOlswLDI1NSwyNTVdLGRhcmtibHVlOlswLDAsMTM5XSxkYXJrY3lhbjpbMCwxMzksMTM5XSxkYXJrZ29sZGVucm9kOlsxODQsMTM0LDExXSxkYXJrZ3JheTpbMTY5LDE2OSwxNjldLGRhcmtncmVlbjpbMCwxMDAsMF0sZGFya2dyZXk6WzE2OSwxNjksMTY5XSxkYXJra2hha2k6WzE4OSwxODMsMTA3XSxkYXJrbWFnZW50YTpbMTM5LDAsMTM5XSxkYXJrb2xpdmVncmVlbjpbODUsMTA3LDQ3XSxkYXJrb3JhbmdlOlsyNTUsMTQwLDBdLGRhcmtvcmNoaWQ6WzE1Myw1MCwyMDRdLGRhcmtyZWQ6WzEzOSwwLDBdLGRhcmtzYWxtb246WzIzMywxNTAsMTIyXSxkYXJrc2VhZ3JlZW46WzE0MywxODgsMTQzXSxkYXJrc2xhdGVibHVlOls3Miw2MSwxMzldLGRhcmtzbGF0ZWdyYXk6WzQ3LDc5LDc5XSxkYXJrc2xhdGVncmV5Ols0Nyw3OSw3OV0sZGFya3R1cnF1b2lzZTpbMCwyMDYsMjA5XSxkYXJrdmlvbGV0OlsxNDgsMCwyMTFdLGRlZXBwaW5rOlsyNTUsMjAsMTQ3XSxkZWVwc2t5Ymx1ZTpbMCwxOTEsMjU1XSxkaW1ncmF5OlsxMDUsMTA1LDEwNV0sZGltZ3JleTpbMTA1LDEwNSwxMDVdLGRvZGdlcmJsdWU6WzMwLDE0NCwyNTVdLGZpcmVicmljazpbMTc4LDM0LDM0XSxmbG9yYWx3aGl0ZTpbMjU1LDI1MCwyNDBdLGZvcmVzdGdyZWVuOlszNCwxMzksMzRdLGZ1Y2hzaWE6WzI1NSwwLDI1NV0sZ2FpbnNib3JvOlsyMjAsMjIwLDIyMF0sZ2hvc3R3aGl0ZTpbMjQ4LDI0OCwyNTVdLGdvbGQ6WzI1NSwyMTUsMF0sZ29sZGVucm9kOlsyMTgsMTY1LDMyXSxncmF5OlsxMjgsMTI4LDEyOF0sZ3JlZW46WzAsMTI4LDBdLGdyZWVueWVsbG93OlsxNzMsMjU1LDQ3XSxncmV5OlsxMjgsMTI4LDEyOF0saG9uZXlkZXc6WzI0MCwyNTUsMjQwXSxob3RwaW5rOlsyNTUsMTA1LDE4MF0saW5kaWFucmVkOlsyMDUsOTIsOTJdLGluZGlnbzpbNzUsMCwxMzBdLGl2b3J5OlsyNTUsMjU1LDI0MF0sa2hha2k6WzI0MCwyMzAsMTQwXSxsYXZlbmRlcjpbMjMwLDIzMCwyNTBdLGxhdmVuZGVyYmx1c2g6WzI1NSwyNDAsMjQ1XSxsYXduZ3JlZW46WzEyNCwyNTIsMF0sbGVtb25jaGlmZm9uOlsyNTUsMjUwLDIwNV0sbGlnaHRibHVlOlsxNzMsMjE2LDIzMF0sbGlnaHRjb3JhbDpbMjQwLDEyOCwxMjhdLGxpZ2h0Y3lhbjpbMjI0LDI1NSwyNTVdLGxpZ2h0Z29sZGVucm9keWVsbG93OlsyNTAsMjUwLDIxMF0sbGlnaHRncmF5OlsyMTEsMjExLDIxMV0sbGlnaHRncmVlbjpbMTQ0LDIzOCwxNDRdLGxpZ2h0Z3JleTpbMjExLDIxMSwyMTFdLGxpZ2h0cGluazpbMjU1LDE4MiwxOTNdLGxpZ2h0c2FsbW9uOlsyNTUsMTYwLDEyMl0sbGlnaHRzZWFncmVlbjpbMzIsMTc4LDE3MF0sbGlnaHRza3libHVlOlsxMzUsMjA2LDI1MF0sbGlnaHRzbGF0ZWdyYXk6WzExOSwxMzYsMTUzXSxsaWdodHNsYXRlZ3JleTpbMTE5LDEzNiwxNTNdLGxpZ2h0c3RlZWxibHVlOlsxNzYsMTk2LDIyMl0sbGlnaHR5ZWxsb3c6WzI1NSwyNTUsMjI0XSxsaW1lOlswLDI1NSwwXSxsaW1lZ3JlZW46WzUwLDIwNSw1MF0sbGluZW46WzI1MCwyNDAsMjMwXSxtYWdlbnRhOlsyNTUsMCwyNTVdLG1hcm9vbjpbMTI4LDAsMF0sbWVkaXVtYXF1YW1hcmluZTpbMTAyLDIwNSwxNzBdLG1lZGl1bWJsdWU6WzAsMCwyMDVdLG1lZGl1bW9yY2hpZDpbMTg2LDg1LDIxMV0sbWVkaXVtcHVycGxlOlsxNDcsMTEyLDIxOV0sbWVkaXVtc2VhZ3JlZW46WzYwLDE3OSwxMTNdLG1lZGl1bXNsYXRlYmx1ZTpbMTIzLDEwNCwyMzhdLG1lZGl1bXNwcmluZ2dyZWVuOlswLDI1MCwxNTRdLG1lZGl1bXR1cnF1b2lzZTpbNzIsMjA5LDIwNF0sbWVkaXVtdmlvbGV0cmVkOlsxOTksMjEsMTMzXSxtaWRuaWdodGJsdWU6WzI1LDI1LDExMl0sbWludGNyZWFtOlsyNDUsMjU1LDI1MF0sbWlzdHlyb3NlOlsyNTUsMjI4LDIyNV0sbW9jY2FzaW46WzI1NSwyMjgsMTgxXSxuYXZham93aGl0ZTpbMjU1LDIyMiwxNzNdLG5hdnk6WzAsMCwxMjhdLG9sZGxhY2U6WzI1MywyNDUsMjMwXSxvbGl2ZTpbMTI4LDEyOCwwXSxvbGl2ZWRyYWI6WzEwNywxNDIsMzVdLG9yYW5nZTpbMjU1LDE2NSwwXSxvcmFuZ2VyZWQ6WzI1NSw2OSwwXSxvcmNoaWQ6WzIxOCwxMTIsMjE0XSxwYWxlZ29sZGVucm9kOlsyMzgsMjMyLDE3MF0scGFsZWdyZWVuOlsxNTIsMjUxLDE1Ml0scGFsZXR1cnF1b2lzZTpbMTc1LDIzOCwyMzhdLHBhbGV2aW9sZXRyZWQ6WzIxOSwxMTIsMTQ3XSxwYXBheWF3aGlwOlsyNTUsMjM5LDIxM10scGVhY2hwdWZmOlsyNTUsMjE4LDE4NV0scGVydTpbMjA1LDEzMyw2M10scGluazpbMjU1LDE5MiwyMDNdLHBsdW06WzIyMSwxNjAsMjIxXSxwb3dkZXJibHVlOlsxNzYsMjI0LDIzMF0scHVycGxlOlsxMjgsMCwxMjhdLHJlYmVjY2FwdXJwbGU6WzEwMiw1MSwxNTNdLHJlZDpbMjU1LDAsMF0scm9zeWJyb3duOlsxODgsMTQzLDE0M10scm95YWxibHVlOls2NSwxMDUsMjI1XSxzYWRkbGVicm93bjpbMTM5LDY5LDE5XSxzYWxtb246WzI1MCwxMjgsMTE0XSxzYW5keWJyb3duOlsyNDQsMTY0LDk2XSxzZWFncmVlbjpbNDYsMTM5LDg3XSxzZWFzaGVsbDpbMjU1LDI0NSwyMzhdLHNpZW5uYTpbMTYwLDgyLDQ1XSxzaWx2ZXI6WzE5MiwxOTIsMTkyXSxza3libHVlOlsxMzUsMjA2LDIzNV0sc2xhdGVibHVlOlsxMDYsOTAsMjA1XSxzbGF0ZWdyYXk6WzExMiwxMjgsMTQ0XSxzbGF0ZWdyZXk6WzExMiwxMjgsMTQ0XSxzbm93OlsyNTUsMjUwLDI1MF0sc3ByaW5nZ3JlZW46WzAsMjU1LDEyN10sc3RlZWxibHVlOls3MCwxMzAsMTgwXSx0YW46WzIxMCwxODAsMTQwXSx0ZWFsOlswLDEyOCwxMjhdLHRoaXN0bGU6WzIxNiwxOTEsMjE2XSx0b21hdG86WzI1NSw5OSw3MV0sdHVycXVvaXNlOls2NCwyMjQsMjA4XSx2aW9sZXQ6WzIzOCwxMzAsMjM4XSx3aGVhdDpbMjQ1LDIyMiwxNzldLHdoaXRlOlsyNTUsMjU1LDI1NV0sd2hpdGVzbW9rZTpbMjQ1LDI0NSwyNDVdLHllbGxvdzpbMjU1LDI1NSwwXSx5ZWxsb3dncmVlbjpbMTU0LDIwNSw1MF19fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztkLmV4cG9ydHM9ZnVuY3Rpb24obil7dmFyIGE7cmV0dXJuIGUuY2FsbChuKT09PSJbb2JqZWN0IE9iamVjdF0iJiYoYT1PYmplY3QuZ2V0UHJvdG90eXBlT2YobiksYT09PW51bGx8fGE9PT1PYmplY3QuZ2V0UHJvdG90eXBlT2Yoe30pKX19LGZ1bmN0aW9uKGQscil7ZC5leHBvcnRzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDxhcmd1bWVudHMubGVuZ3RoO3QrKylpZihhcmd1bWVudHNbdF0hPT12b2lkIDApcmV0dXJuIGFyZ3VtZW50c1t0XX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDM4KTtkLmV4cG9ydHM9e25hbWU6ImhzbCIsbWluOlswLDAsMF0sbWF4OlszNjAsMTAwLDEwMF0sY2hhbm5lbDpbImh1ZSIsInNhdHVyYXRpb24iLCJsaWdodG5lc3MiXSxhbGlhczpbIkhTTCJdLHJnYjpmdW5jdGlvbihuKXt2YXIgYT1uWzBdLzM2MCxzPW5bMV0vMTAwLGk9blsyXS8xMDAsbyxjLG0sdSxwO2lmKHM9PT0wKXJldHVybiBwPWkqMjU1LFtwLHAscF07aTwuNT9jPWkqKDErcyk6Yz1pK3MtaSpzLG89MippLWMsdT1bMCwwLDBdO2Zvcih2YXIgeT0wO3k8Mzt5KyspbT1hKzEvMyotKHktMSksbTwwP20rKzptPjEmJm0tLSw2Km08MT9wPW8rKGMtbykqNiptOjIqbTwxP3A9YzozKm08Mj9wPW8rKGMtbykqKDIvMy1tKSo2OnA9byx1W3ldPXAqMjU1O3JldHVybiB1fX0sZS5oc2w9ZnVuY3Rpb24obil7dmFyIGE9blswXS8yNTUscz1uWzFdLzI1NSxpPW5bMl0vMjU1LG89TWF0aC5taW4oYSxzLGkpLGM9TWF0aC5tYXgoYSxzLGkpLG09Yy1vLHUscCx5O3JldHVybiBjPT09bz91PTA6YT09PWM/dT0ocy1pKS9tOnM9PT1jP3U9MisoaS1hKS9tOmk9PT1jJiYodT00KyhhLXMpL20pLHU9TWF0aC5taW4odSo2MCwzNjApLHU8MCYmKHUrPTM2MCkseT0obytjKS8yLGM9PT1vP3A9MDp5PD0uNT9wPW0vKGMrbyk6cD1tLygyLWMtbyksW3UscCoxMDAseSoxMDBdfX0sZnVuY3Rpb24oZCxyLHQpe2QuZXhwb3J0cz17bmFtZToicmdiIixtaW46WzAsMCwwXSxtYXg6WzI1NSwyNTUsMjU1XSxjaGFubmVsOlsicmVkIiwiZ3JlZW4iLCJibHVlIl0sYWxpYXM6WyJSR0IiXX19LGZ1bmN0aW9uKGQscil7ZC5leHBvcnRzPXQ7ZnVuY3Rpb24gdChlLG4sYSl7cmV0dXJuIG48YT9lPG4/bjplPmE/YTplOmU8YT9hOmU+bj9uOmV9fSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJkZWZhdWx0IixmdW5jdGlvbigpe3JldHVybiBofSk7dmFyIGU9dCg0MSksbj10Lm4oZSksYT10KDQyKSxzPXQubihhKSxpPXQoNDMpLG89dC5uKGkpLGM9dCg0NCksbT10KDQ2KSx1PXQubihtKSxwPXQoNTMpLHk9dCg1NSk7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2NvbnN0IE89U3ltYm9sKCJjb250b3VycyIpLHg9U3ltYm9sKCJwYXRoIiksdj1TeW1ib2woInNpbXBsaWZ5IiksVD1TeW1ib2woInNjYWxlIiksbD0yKk1hdGguUEk7Y2xhc3MgaHtjb25zdHJ1Y3RvcihnPXt9KXt0eXBlb2YgZz09InN0cmluZyImJihnPXtwYXRoOmd9KSxnLnBhdGg/dGhpc1t4XT1uKCkoZy5wYXRoKTp0aGlzW3hdPVtdLHRoaXNbT109bnVsbCx0aGlzW3ZdPWcuc2ltcGxpZnkhPW51bGw/Zy5zaW1wbGlmeTowLHRoaXNbVF09Zy5zY2FsZSE9bnVsbD9nLnNjYWxlOjJ9Z2V0IGNvbnRvdXJzKCl7bGV0IGc9bnVsbDtpZighdGhpc1tPXSYmdGhpc1t4XSl7Y29uc3QgTT1PYmplY3QoYy5kZWZhdWx0KShvKCkodGhpc1t4XSkpO3RoaXNbT109dSgpKE0sdGhpc1tUXSx0aGlzW3ZdKSx0aGlzW09dLnBhdGg9TSx0aGlzW09dLnNpbXBsaWZ5PXRoaXNbdl0sdGhpc1tPXS5zY2FsZT10aGlzW1RdfXJldHVybiB0aGlzW09dJiYoZz10aGlzW09dLm1hcChNPT5bLi4uTV0pLGcucGF0aD10aGlzW09dLnBhdGgsZy5zaW1wbGlmeT10aGlzW09dLnNpbXBsaWZ5LGcuc2NhbGU9dGhpc1tPXS5zY2FsZSksZ31nZXQgcGF0aCgpe3JldHVybiB0aGlzW3hdfWdldCBzaW1wbGlmeSgpe3JldHVybiB0aGlzW3ZdfWdldCBib3VuZGluZ0JveCgpe2NvbnN0IGc9dGhpcy5jb250b3VycztpZihnJiZnLmxlbmd0aCl7Y29uc3QgTT1nLnJlZHVjZSgoQSxDKT0+Wy4uLkEsLi4uQ10pO3JldHVybiBzKCkoTSl9cmV0dXJuW1swLDBdLFswLDBdXX1nZXQgYm91bmRpbmdDZW50ZXIoKXtjb25zdCBnPXRoaXMuYm91bmRpbmdCb3g7cmV0dXJuIGc/Wy41KihnWzBdWzBdK2dbMV1bMF0pLC41KihnWzBdWzFdK2dbMV1bMV0pXTpbMCwwXX1ub3JtYWxpemUoZz0wLE09MCl7Y29uc3QgQT1PYmplY3QoYy5kZWZhdWx0KShvKCkodGhpc1t4XSkpLm1hcCgoW0MsLi4uYl0pPT57Y29uc3QgRT1bQ107Zm9yKGxldCBMPTA7TDxiLmxlbmd0aDtMKz0yKXtjb25zdCBEPWJbTF0tZyxJPWJbTCsxXS1NO0UucHVzaChELEkpfXJldHVybiBFfSk7cmV0dXJuIHRoaXMuYmVnaW5QYXRoKCksdGhpc1t4XS5wdXNoKC4uLkEpLHRoaXN9Z2V0UG9pbnRBdExlbmd0aChnKXtyZXR1cm4gdGhpcy5jb250b3Vycz9PYmplY3QocC5nZXRQb2ludEF0TGVuZ3RoKSh0aGlzW09dLGcpOm51bGx9Z2V0VG90YWxMZW5ndGgoKXtyZXR1cm4gdGhpcy5jb250b3Vycz9PYmplY3QocC5nZXRUb3RhbExlbmd0aCkodGhpc1tPXSk6MH1hZGRQYXRoKGcpe3RoaXNbT109bnVsbCx0eXBlb2YgZz09InN0cmluZyImJihnPW4oKShnKSksdGhpc1t4XS5wdXNoKC4uLmcpfWJlZ2luUGF0aCgpe3RoaXNbeF09W10sdGhpc1tPXT1udWxsfWNsZWFyKCl7dGhpcy5iZWdpblBhdGgoKX1lbGxpcHNlKGcsTSxBLEMsYixFLEwsRD0wKXtpZihFKz1iLEwrPWIsQTw9MHx8Qzw9MHx8TD09PUUpcmV0dXJuO0w8RSYmKEw9RStsKyhMLUUpJWwpLEwtRT5sJiYoTD1FK2wpO2NvbnN0IEk9TC1FO0k+PWwmJihMLT0uMDAxKTtsZXQgUj10aGlzW3hdLmxlbmd0aD4wJiZJPGw/IkwiOiJNIjtjb25zdCBCPU9iamVjdCh5LmdldFBvaW50KShnLE0sQSxDLEUpLHo9T2JqZWN0KHkuZ2V0UG9pbnQpKGcsTSxBLEMsTCksSz0rIUQ7bGV0IFE9ST5NYXRoLlBJPzE6MDtEJiYoUT0xLVEpLFIrPUIuam9pbigiICIpLFIrPWBBJHtBfSAke0N9IDAgJHtRfSAke0t9ICR7ei5qb2luKCIgIil9YCxJPj1sJiYoUis9IloiKSx0aGlzLmFkZFBhdGgoUil9YXJjKGcsTSxBLEMsYixFPTApe3JldHVybiB0aGlzLmVsbGlwc2UoZyxNLEEsQSwwLEMsYixFKX1hcmNUbyhnLE0sQSxDLGIsRSxMKXt0aGlzW09dPW51bGwsdGhpc1t4XS5wdXNoKFsiQSIsZyxNLEEsQyxiLEUsTF0pfW1vdmVUbyhnLE0pe3RoaXNbT109bnVsbCx0aGlzW3hdLnB1c2goWyJNIixnLE1dKX1saW5lVG8oZyxNKXt0aGlzW09dPW51bGwsdGhpc1t4XS5wdXNoKFsiTCIsZyxNXSl9YmV6aWVyQ3VydmVUbyhnLE0sQSxDLGIsRSl7dGhpc1tPXT1udWxsLHRoaXNbeF0ucHVzaChbIkMiLGcsTSxBLEMsYixFXSl9cXVhZHJhdGljQ3VydmVUbyhnLE0sQSxDKXt0aGlzW09dPW51bGwsdGhpc1t4XS5wdXNoKFsiUSIsZyxNLEEsQ10pfXJlY3QoZyxNLEEsQyl7Y29uc3QgYj1gTSR7Z30gJHtNfUwke2crQX0gJHtNfUwke2crQX0gJHtNK0N9TCR7Z30gJHtNK0N9WmA7dGhpcy5hZGRQYXRoKGIpfWNsb3NlUGF0aCgpe3RoaXNbT109bnVsbDtsZXQgZz1bXTtjb25zdCBNPXRoaXNbeF0ubGVuZ3RoO00+MCYmKGc9dGhpc1t4XVtNLTFdKSxnWzBdIT09IloiJiZnWzBdIT09InoiJiZ0aGlzW3hdLnB1c2goWyJaIl0pfX19LGZ1bmN0aW9uKGQscil7ZC5leHBvcnRzPW47dmFyIHQ9e2E6NyxjOjYsaDoxLGw6MixtOjIscTo0LHM6NCx0OjIsdjoxLHo6MH0sZT0vKFthc3R2enFtaGxjXSkoW15hc3R2enFtaGxjXSopL2lnO2Z1bmN0aW9uIG4oaSl7dmFyIG89W107cmV0dXJuIGkucmVwbGFjZShlLGZ1bmN0aW9uKGMsbSx1KXt2YXIgcD1tLnRvTG93ZXJDYXNlKCk7Zm9yKHU9cyh1KSxwPT0ibSImJnUubGVuZ3RoPjImJihvLnB1c2goW21dLmNvbmNhdCh1LnNwbGljZSgwLDIpKSkscD0ibCIsbT1tPT0ibSI/ImwiOiJMIik7Oyl7aWYodS5sZW5ndGg9PXRbcF0pcmV0dXJuIHUudW5zaGlmdChtKSxvLnB1c2godSk7aWYodS5sZW5ndGg8dFtwXSl0aHJvdyBuZXcgRXJyb3IoIm1hbGZvcm1lZCBwYXRoIGRhdGEiKTtvLnB1c2goW21dLmNvbmNhdCh1LnNwbGljZSgwLHRbcF0pKSl9fSksb312YXIgYT0vLT9bMC05XSpcLj9bMC05XSsoPzplWy0rXT9cZCspPy9pZztmdW5jdGlvbiBzKGkpe3ZhciBvPWkubWF0Y2goYSk7cmV0dXJuIG8/by5tYXAoTnVtYmVyKTpbXX19LGZ1bmN0aW9uKGQscix0KXtkLmV4cG9ydHM9ZTtmdW5jdGlvbiBlKG4pe3ZhciBhPW4ubGVuZ3RoO2lmKGE9PT0wKXJldHVybltbXSxbXV07Zm9yKHZhciBzPW5bMF0ubGVuZ3RoLGk9blswXS5zbGljZSgpLG89blswXS5zbGljZSgpLGM9MTtjPGE7KytjKWZvcih2YXIgbT1uW2NdLHU9MDt1PHM7Kyt1KXt2YXIgcD1tW3VdO2lbdV09TWF0aC5taW4oaVt1XSxwKSxvW3VdPU1hdGgubWF4KG9bdV0scCl9cmV0dXJuW2ksb119fSxmdW5jdGlvbihkLHIpe2QuZXhwb3J0cz10O2Z1bmN0aW9uIHQoZSl7dmFyIG49MCxhPTAscz0wLGk9MDtyZXR1cm4gZS5tYXAoZnVuY3Rpb24obyl7bz1vLnNsaWNlKCk7dmFyIGM9b1swXSxtPWMudG9VcHBlckNhc2UoKTtpZihjIT1tKXN3aXRjaChvWzBdPW0sYyl7Y2FzZSJhIjpvWzZdKz1zLG9bN10rPWk7YnJlYWs7Y2FzZSJ2IjpvWzFdKz1pO2JyZWFrO2Nhc2UiaCI6b1sxXSs9czticmVhaztkZWZhdWx0OmZvcih2YXIgdT0xO3U8by5sZW5ndGg7KW9bdSsrXSs9cyxvW3UrK10rPWl9c3dpdGNoKG0pe2Nhc2UiWiI6cz1uLGk9YTticmVhaztjYXNlIkgiOnM9b1sxXTticmVhaztjYXNlIlYiOmk9b1sxXTticmVhaztjYXNlIk0iOnM9bj1vWzFdLGk9YT1vWzJdO2JyZWFrO2RlZmF1bHQ6cz1vW28ubGVuZ3RoLTJdLGk9b1tvLmxlbmd0aC0xXX1yZXR1cm4gb30pfX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gbn0pO3ZhciBlPXQoNDUpO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtmdW5jdGlvbiBuKGkpe2Zvcih2YXIgbyxjPVtdLG09MCx1PTAscD0wLHk9MCxPPW51bGwseD1udWxsLHY9MCxUPTAsbD0wLGg9aS5sZW5ndGg7bDxoO2wrKyl7dmFyIGY9aVtsXSxnPWZbMF07c3dpdGNoKGcpe2Nhc2UiTSI6cD1mWzFdLHk9ZlsyXTticmVhaztjYXNlIkEiOnZhciBNPU9iamVjdChlLmRlZmF1bHQpKHYsVCxmWzZdLGZbN10sZls0XSxmWzVdLGZbMV0sZlsyXSxmWzNdKTtpZighTS5sZW5ndGgpY29udGludWU7TT1NLm1hcChMPT57Y29uc3RbRCxJLFIsQix6LEssUSxfXT1MO3JldHVybnt4MTpSLHkxOkIseDI6eix5MjpLLHg6USx5Ol99fSk7Zm9yKHZhciBBPTAsQztBPE0ubGVuZ3RoO0ErKylDPU1bQV0sZj1bIkMiLEMueDEsQy55MSxDLngyLEMueTIsQy54LEMueV0sQTxNLmxlbmd0aC0xJiZjLnB1c2goZik7YnJlYWs7Y2FzZSJTIjp2YXIgYj12LEU9VDsobz09IkMifHxvPT0iUyIpJiYoYis9Yi1tLEUrPUUtdSksZj1bIkMiLGIsRSxmWzFdLGZbMl0sZlszXSxmWzRdXTticmVhaztjYXNlIlQiOm89PSJRInx8bz09IlQiPyhPPXYqMi1PLHg9VCoyLXgpOihPPXYseD1UKSxmPXModixULE8seCxmWzFdLGZbMl0pO2JyZWFrO2Nhc2UiUSI6Tz1mWzFdLHg9ZlsyXSxmPXModixULGZbMV0sZlsyXSxmWzNdLGZbNF0pO2JyZWFrO2Nhc2UiTCI6Zj1hKHYsVCxmWzFdLGZbMl0pO2JyZWFrO2Nhc2UiSCI6Zj1hKHYsVCxmWzFdLFQpO2JyZWFrO2Nhc2UiViI6Zj1hKHYsVCx2LGZbMV0pO2JyZWFrO2Nhc2UiWiI6Zj1hKHYsVCxwLHkpO2JyZWFrfW89Zyx2PWZbZi5sZW5ndGgtMl0sVD1mW2YubGVuZ3RoLTFdLGYubGVuZ3RoPjQ/KG09ZltmLmxlbmd0aC00XSx1PWZbZi5sZW5ndGgtM10pOihtPXYsdT1UKSxjLnB1c2goZil9cmV0dXJuIGN9ZnVuY3Rpb24gYShpLG8sYyxtKXtyZXR1cm5bIkMiLGksbyxjLG0sYyxtXX1mdW5jdGlvbiBzKGksbyxjLG0sdSxwKXtyZXR1cm5bIkMiLGkvMysyLzMqYyxvLzMrMi8zKm0sdS8zKzIvMypjLHAvMysyLzMqbSx1LHBdfX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pLHQoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtjb25zdCBlPU1hdGguUEkqMjtmdW5jdGlvbiBuKG8sYyxtLHUpe2NvbnN0IHA9byp1LWMqbTwwPy0xOjE7bGV0IHk9byptK2MqdTtyZXR1cm4geT4xJiYoeT0xKSx5PC0xJiYoeT0tMSkscCpNYXRoLmFjb3MoeSl9ZnVuY3Rpb24gYShvLGMsbSx1LHAseSxPLHgsdixUKXtjb25zdCBsPVQqKG8tbSkvMit2KihjLXUpLzIsaD0tdiooby1tKS8yK1QqKGMtdSkvMixmPU8qTyxnPXgqeCxNPWwqbCxBPWgqaDtsZXQgQz1mKmctZipBLWcqTTtDPDAmJihDPTApLEMvPWYqQStnKk0sQz1NYXRoLnNxcnQoQykqKHA9PT15Py0xOjEpO2NvbnN0IGI9QypPL3gqaCxFPUMqLXgvTypsLEw9VCpiLXYqRSsobyttKS8yLEQ9dipiK1QqRSsoYyt1KS8yLEk9KGwtYikvTyxSPShoLUUpL3gsQj0oLWwtYikvTyx6PSgtaC1FKS94LEs9bigxLDAsSSxSKTtsZXQgUT1uKEksUixCLHopO3JldHVybiB5PT09MCYmUT4wJiYoUS09ZSkseT09PTEmJlE8MCYmKFErPWUpLFtMLEQsSyxRXX1mdW5jdGlvbiBzKG8sYyl7Y29uc3QgbT0xLjMzMzMzMzMzMzMzMzMzMzMqTWF0aC50YW4oYy80KSx1PU1hdGguY29zKG8pLHA9TWF0aC5zaW4obykseT1NYXRoLmNvcyhvK2MpLE89TWF0aC5zaW4obytjKTtyZXR1cm5bdSxwLHUtcCptLHArdSptLHkrTyptLE8teSptLHksT119ZnVuY3Rpb24gaShvLGMsbSx1LHAseSxPLHgsdil7Y29uc3QgVD1NYXRoLnNpbih2KmUvMzYwKSxsPU1hdGguY29zKHYqZS8zNjApLGg9bCooby1tKS8yK1QqKGMtdSkvMixmPS1UKihvLW0pLzIrbCooYy11KS8yO2lmKGg9PT0wJiZmPT09MClyZXR1cm5bXTtpZihPPT09MHx8eD09PTApcmV0dXJuW107Tz1NYXRoLmFicyhPKSx4PU1hdGguYWJzKHgpO2NvbnN0IGc9aCpoLyhPKk8pK2YqZi8oeCp4KTtnPjEmJihPKj1NYXRoLnNxcnQoZykseCo9TWF0aC5zcXJ0KGcpKTtjb25zdCBNPWEobyxjLG0sdSxwLHksTyx4LFQsbCksQT1bXTtsZXQgQz1NWzJdLGI9TVszXTtjb25zdCBFPU1hdGgubWF4KE1hdGguY2VpbChNYXRoLmFicyhiKS8oZS80KSksMSk7Yi89RTtmb3IobGV0IEw9MDtMPEU7TCsrKUEucHVzaChzKEMsYikpLEMrPWI7cmV0dXJuIEEubWFwKEw9Pntmb3IobGV0IEQ9MDtEPEwubGVuZ3RoO0QrPTIpe2xldCBJPUxbRCswXSxSPUxbRCsxXTtJKj1PLFIqPXg7Y29uc3QgQj1sKkktVCpSLHo9VCpJK2wqUjtMW0QrMF09QitNWzBdLExbRCsxXT16K01bMV19cmV0dXJuIEx9KX19LGZ1bmN0aW9uKGQscix0KXt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7dmFyIGU9dCg0Nykse2NvcHk6bn09dCg0OSksYT10KDUwKTtmdW5jdGlvbiBzKHUscCx5KXtyZXR1cm4gdVswXT1wLHVbMV09eSx1fXZhciBpPVswLDBdLG89WzAsMF0sYz1bMCwwXTtmdW5jdGlvbiBtKHUscCx5LE8pe2UoeSxzKGksT1sxXSxPWzJdKSxzKG8sT1szXSxPWzRdKSxzKGMsT1s1XSxPWzZdKSxwLHUpfWQuZXhwb3J0cz1mdW5jdGlvbihwLHksTyl7dmFyIHg9W10sdj1bXSxUPVswLDBdO3JldHVybiBwLmZvckVhY2goZnVuY3Rpb24obCxoLGYpe2lmKGxbMF09PT0iTSIpbihULGwuc2xpY2UoMSkpLHYubGVuZ3RoPjAmJih4LnB1c2godiksdj1bXSk7ZWxzZSBpZihsWzBdPT09IkMiKW0odix5LFQsbCkscyhULGxbNV0sbFs2XSk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgdHlwZSBpbiBTVkc6ICIrbFswXSl9KSx2Lmxlbmd0aD4wJiZ4LnB1c2godikseC5tYXAoZnVuY3Rpb24obCl7cmV0dXJuIGEobCxPfHwwKX0pfX0sZnVuY3Rpb24oZCxyLHQpe2QuZXhwb3J0cz10KDQ4KSgpfSxmdW5jdGlvbihkLHIpe2Z1bmN0aW9uIHQobil7cmV0dXJuW25bMF0sblsxXV19ZnVuY3Rpb24gZShuLGEpe3JldHVybltuLGFdfWQuZXhwb3J0cz1mdW5jdGlvbihhKXthPWF8fHt9O3ZhciBzPXR5cGVvZiBhLnJlY3Vyc2lvbj09Im51bWJlciI/YS5yZWN1cnNpb246OCxpPXR5cGVvZiBhLmVwc2lsb249PSJudW1iZXIiP2EuZXBzaWxvbjoxMTkyMDkyOWUtMTQsbz10eXBlb2YgYS5wYXRoRXBzaWxvbj09Im51bWJlciI/YS5wYXRoRXBzaWxvbjoxLGM9dHlwZW9mIGEuYW5nbGVFcHNpbG9uPT0ibnVtYmVyIj9hLmFuZ2xlRXBzaWxvbjouMDEsbT1hLmFuZ2xlVG9sZXJhbmNlfHwwLHU9YS5jdXNwTGltaXR8fDA7cmV0dXJuIGZ1bmN0aW9uKHgsdixULGwsaCxmKXtmfHwoZj1bXSksaD10eXBlb2YgaD09Im51bWJlciI/aDoxO3ZhciBnPW8vaDtyZXR1cm4gZyo9ZyxwKHgsdixULGwsZixnKSxmfTtmdW5jdGlvbiBwKE8seCx2LFQsbCxoKXtsLnB1c2godChPKSk7dmFyIGY9T1swXSxnPU9bMV0sTT14WzBdLEE9eFsxXSxDPXZbMF0sYj12WzFdLEU9VFswXSxMPVRbMV07eShmLGcsTSxBLEMsYixFLEwsbCxoLDApLGwucHVzaCh0KFQpKX1mdW5jdGlvbiB5KE8seCx2LFQsbCxoLGYsZyxNLEEsQyl7aWYoIShDPnMpKXt2YXIgYj1NYXRoLlBJLEU9KE8rdikvMixMPSh4K1QpLzIsRD0oditsKS8yLEk9KFQraCkvMixSPShsK2YpLzIsQj0oaCtnKS8yLHo9KEUrRCkvMixLPShMK0kpLzIsUT0oRCtSKS8yLF89KEkrQikvMixqPSh6K1EpLzIsRz0oSytfKS8yO2lmKEM+MCl7dmFyIFg9Zi1PLFo9Zy14LHR0PU1hdGguYWJzKCh2LWYpKlotKFQtZykqWCksbnQ9TWF0aC5hYnMoKGwtZikqWi0oaC1nKSpYKSxxLGR0O2lmKHR0PmkmJm50Pmkpe2lmKCh0dCtudCkqKHR0K250KTw9QSooWCpYK1oqWikpe2lmKG08Yyl7TS5wdXNoKGUoaixHKSk7cmV0dXJufXZhciB1dD1NYXRoLmF0YW4yKGgtVCxsLXYpO2lmKHE9TWF0aC5hYnModXQtTWF0aC5hdGFuMihULXgsdi1PKSksZHQ9TWF0aC5hYnMoTWF0aC5hdGFuMihnLWgsZi1sKS11dCkscT49YiYmKHE9MipiLXEpLGR0Pj1iJiYoZHQ9MipiLWR0KSxxK2R0PG0pe00ucHVzaChlKGosRykpO3JldHVybn1pZih1IT09MCl7aWYocT51KXtNLnB1c2goZSh2LFQpKTtyZXR1cm59aWYoZHQ+dSl7TS5wdXNoKGUobCxoKSk7cmV0dXJufX19fWVsc2UgaWYodHQ+aSl7aWYodHQqdHQ8PUEqKFgqWCtaKlopKXtpZihtPGMpe00ucHVzaChlKGosRykpO3JldHVybn1pZihxPU1hdGguYWJzKE1hdGguYXRhbjIoaC1ULGwtdiktTWF0aC5hdGFuMihULXgsdi1PKSkscT49YiYmKHE9MipiLXEpLHE8bSl7TS5wdXNoKGUodixUKSksTS5wdXNoKGUobCxoKSk7cmV0dXJufWlmKHUhPT0wJiZxPnUpe00ucHVzaChlKHYsVCkpO3JldHVybn19fWVsc2UgaWYobnQ+aSl7aWYobnQqbnQ8PUEqKFgqWCtaKlopKXtpZihtPGMpe00ucHVzaChlKGosRykpO3JldHVybn1pZihxPU1hdGguYWJzKE1hdGguYXRhbjIoZy1oLGYtbCktTWF0aC5hdGFuMihoLVQsbC12KSkscT49YiYmKHE9MipiLXEpLHE8bSl7TS5wdXNoKGUodixUKSksTS5wdXNoKGUobCxoKSk7cmV0dXJufWlmKHUhPT0wJiZxPnUpe00ucHVzaChlKGwsaCkpO3JldHVybn19fWVsc2UgaWYoWD1qLShPK2YpLzIsWj1HLSh4K2cpLzIsWCpYK1oqWjw9QSl7TS5wdXNoKGUoaixHKSk7cmV0dXJufX15KE8seCxFLEwseixLLGosRyxNLEEsQysxKSx5KGosRyxRLF8sUixCLGYsZyxNLEEsQysxKX19fX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiY3JlYXRlIixmdW5jdGlvbigpe3JldHVybiBhfSksdC5kKHIsImNsb25lIixmdW5jdGlvbigpe3JldHVybiBufSksdC5kKHIsImNvcHkiLGZ1bmN0aW9uKCl7cmV0dXJuIHN9KSx0LmQociwic2NhbGVBbmRBZGQiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KSx0LmQociwiZG90IixmdW5jdGlvbigpe3JldHVybiBvfSksdC5kKHIsInJvdGF0ZSIsZnVuY3Rpb24oKXtyZXR1cm4gY30pLHQuZChyLCJjcm9zcyIsZnVuY3Rpb24oKXtyZXR1cm4gbX0pLHQuZChyLCJzdWIiLGZ1bmN0aW9uKCl7cmV0dXJuIHV9KSx0LmQociwiYWRkIixmdW5jdGlvbigpe3JldHVybiBwfSksdC5kKHIsImNvbXB1dGVNaXRlciIsZnVuY3Rpb24oKXtyZXR1cm4gdn0pLHQuZChyLCJub3JtYWwiLGZ1bmN0aW9uKCl7cmV0dXJuIFR9KSx0LmQociwiZGlyZWN0aW9uIixmdW5jdGlvbigpe3JldHVybiBsfSk7dmFyIGU9dCgxKTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7ZnVuY3Rpb24gbihoKXtyZXR1cm5baFswXSxoWzFdXX1mdW5jdGlvbiBhKCl7cmV0dXJuWzAsMF19Y29uc3Qgcz1lLnZlYzIuY29weSxpPWUudmVjMi5zY2FsZUFuZEFkZCxvPWUudmVjMi5kb3QsYz1lLnZlYzIucm90YXRlLG09ZS52ZWMyLmNyb3NzLHU9ZS52ZWMyLnN1YixwPWUudmVjMi5hZGQseT1lLnZlYzIubm9ybWFsaXplLE89ZS52ZWMyLnNldCx4PWEoKTtmdW5jdGlvbiB2KGgsZixnLE0sQSl7cChoLGcsTSkseShoLGgpLE8oZiwtaFsxXSxoWzBdKSxPKHgsLWdbMV0sZ1swXSk7Y29uc3QgQz1BL28oZix4KTtyZXR1cm4gTWF0aC5hYnMoQyl9ZnVuY3Rpb24gVChoLGYpe3JldHVybiBPKGgsLWZbMV0sZlswXSksaH1mdW5jdGlvbiBsKGgsZixnKXtyZXR1cm4gdShoLGYsZykseShoLGgpLGh9fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg1MSksbj10KDUyKTtkLmV4cG9ydHM9ZnVuY3Rpb24ocyxpKXtyZXR1cm4gcz1lKHMsaSkscz1uKHMsaSksc30sZC5leHBvcnRzLnJhZGlhbERpc3RhbmNlPWUsZC5leHBvcnRzLmRvdWdsYXNQZXVja2VyPW59LGZ1bmN0aW9uKGQscil7ZnVuY3Rpb24gdChlLG4pe3ZhciBhPWVbMF0tblswXSxzPWVbMV0tblsxXTtyZXR1cm4gYSphK3Mqc31kLmV4cG9ydHM9ZnVuY3Rpb24obixhKXtpZihuLmxlbmd0aDw9MSlyZXR1cm4gbjthPXR5cGVvZiBhPT0ibnVtYmVyIj9hOjE7Zm9yKHZhciBzPWEqYSxpPW5bMF0sbz1baV0sYyxtPTEsdT1uLmxlbmd0aDttPHU7bSsrKWM9blttXSx0KGMsaSk+cyYmKG8ucHVzaChjKSxpPWMpO3JldHVybiBpIT09YyYmby5wdXNoKGMpLG99fSxmdW5jdGlvbihkLHIpe2Z1bmN0aW9uIHQobixhLHMpe3ZhciBpPWFbMF0sbz1hWzFdLGM9c1swXS1pLG09c1sxXS1vO2lmKGMhPT0wfHxtIT09MCl7dmFyIHU9KChuWzBdLWkpKmMrKG5bMV0tbykqbSkvKGMqYyttKm0pO3U+MT8oaT1zWzBdLG89c1sxXSk6dT4wJiYoaSs9Yyp1LG8rPW0qdSl9cmV0dXJuIGM9blswXS1pLG09blsxXS1vLGMqYyttKm19ZnVuY3Rpb24gZShuLGEscyxpLG8pe2Zvcih2YXIgYz1pLG0sdT1hKzE7dTxzO3UrKyl7dmFyIHA9dChuW3VdLG5bYV0sbltzXSk7cD5jJiYobT11LGM9cCl9Yz5pJiYobS1hPjEmJmUobixhLG0saSxvKSxvLnB1c2goblttXSkscy1tPjEmJmUobixtLHMsaSxvKSl9ZC5leHBvcnRzPWZ1bmN0aW9uKGEscyl7aWYoYS5sZW5ndGg8PTEpcmV0dXJuIGE7cz10eXBlb2Ygcz09Im51bWJlciI/czoxO3ZhciBpPXMqcyxvPWEubGVuZ3RoLTEsYz1bYVswXV07cmV0dXJuIGUoYSwwLG8saSxjKSxjLnB1c2goYVtvXSksY319LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImdldFRvdGFsTGVuZ3RoIixmdW5jdGlvbigpe3JldHVybiBufSksdC5kKHIsImdldFBvaW50QXRMZW5ndGgiLGZ1bmN0aW9uKCl7cmV0dXJuIHN9KSx0LmQociwiZ2V0RGFzaENvbnRvdXJzIixmdW5jdGlvbigpe3JldHVybiBpfSk7dmFyIGU9dCg1NCk7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2Z1bmN0aW9uIG4obyl7aWYoby50b3RhbExlbmd0aCE9bnVsbClyZXR1cm4gby50b3RhbExlbmd0aDtsZXQgYz0wO3JldHVybiBvLmZvckVhY2gobT0+e2xldCB1PW1bMF07Zm9yKGxldCBwPTE7cDxtLmxlbmd0aDtwKyspe2NvbnN0IHk9bVtwXTtjKz1PYmplY3QoZS5kaXN0YW5jZSkodSx5KSx1PXl9fSksby50b3RhbExlbmd0aD1jLGN9ZnVuY3Rpb24gYShvLGMsbT0hMCl7aWYoYz1OdW1iZXIoYyksIU51bWJlci5pc0Zpbml0ZShjKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJGYWlsZWQgdG8gZXhlY3V0ZSAnZ2V0UG9pbnRBdExlbmd0aCcgb24gZmlndXJlOiBUaGUgcHJvdmlkZWQgZmxvYXQgdmFsdWUgaXMgbm9uLWZpbml0ZS4iKTtpZihjPD0wKXRocm93IG5ldyBUeXBlRXJyb3IoIkxlbmd0aCBtdXN0ID4gMCIpO2NvbnN0IHU9bihvKTtpZihjPj11KXtjb25zdCB5PW9bby5sZW5ndGgtMV0sTz15W3kubGVuZ3RoLTJdLHg9eVt5Lmxlbmd0aC0xXSx2PU1hdGguYXRhbjIoeFsxXS1PWzFdLHhbMF0tT1swXSk7cmV0dXJue2N1cnJlbnQ6by5tYXAoVD0+Wy4uLlRdKSxwb2ludDp7eDp4WzBdLHk6eFsxXSxhbmdsZTp2fX19Y29uc3QgcD1bXTtmb3IobGV0IHk9MDt5PG8ubGVuZ3RoO3krKyl7cFt5XT1bXTtjb25zdCBPPW9beV07bGV0IHg9T1swXTtmb3IobGV0IHY9MTt2PE8ubGVuZ3RoO3YrKyl7Y29uc3QgVD1PW3ZdLGw9T2JqZWN0KGUuZGlzdGFuY2UpKHgsVCk7aWYoYzxsKXtjb25zdCBoPWMvbCxmPU1hdGguYXRhbjIoVFsxXS14WzFdLFRbMF0teFswXSksZz17eDp4WzBdKigxLWgpK1RbMF0qaCx5OnhbMV0qKDEtaCkrVFsxXSpoLGFuZ2xlOmZ9O2lmKHBbeV0ucHVzaCh4KSxjPjAmJnBbeV0ucHVzaChbZy54LGcueV0pLCFtKXJldHVybntjdXJyZW50OnAscG9pbnQ6Z307Y29uc3QgTT1bXSxBPXk7Zm9yKDt5PG8ubGVuZ3RoO3krKyl7Zm9yKE1beS1BXT1bXSx5PT09QSYmTVswXS5wdXNoKFtnLngsZy55XSk7djxPLmxlbmd0aDt2KyspTVt5LUFdLnB1c2goT1t2XSk7dj0wfXJldHVybntjdXJyZW50OnAscG9pbnQ6ZyxyZXN0Ok19fWMtPWwscFt5XS5wdXNoKHgpLHg9VH19fWZ1bmN0aW9uIHMobyxjKXtpZihjPU51bWJlcihjKSwhTnVtYmVyLmlzRmluaXRlKGMpKXRocm93IG5ldyBUeXBlRXJyb3IoIkZhaWxlZCB0byBleGVjdXRlICdnZXRQb2ludEF0TGVuZ3RoJyBvbiBmaWd1cmU6IFRoZSBwcm92aWRlZCBmbG9hdCB2YWx1ZSBpcyBub24tZmluaXRlLiIpO2lmKG8ubGVuZ3RoPD0wKXJldHVybnt4OjAseTowLGFuZ2xlOjB9O2lmKGM8PTApe2NvbnN0IG09b1swXVswXSx1PW9bMF1bMV0scD1NYXRoLmF0YW4yKHVbMV0tbVsxXSx1WzBdLW1bMF0pO3JldHVybnt4Om1bMF0seTptWzFdLGFuZ2xlOnB9fXJldHVybiBhKG8sYywhMSkucG9pbnR9ZnVuY3Rpb24gaShvLGMsbSl7bGV0IHU9MCxwPWNbMF0seT1vO2NvbnN0IE89W10seD1jLmxlbmd0aDtpZihtPjApe2RvIG0tPWNbdSV4XSx1Kys7d2hpbGUobT4wKTttPDAmJihwPS1tLHUtLSl9ZWxzZSBpZihtPDApe3U9LTE7ZG8gbSs9Y1t1JXgreC0xXSx1LS07d2hpbGUobTwwKTttPj0wJiYodSsrLHA9Y1t1JXgreC0xXS1tKX1kb3tjb25zdCB2PWEoeSxwKTt5PXYucmVzdCwrK3UlMiYmTy5wdXNoKC4uLnYuY3VycmVudCk7bGV0IFQ9dSV4O1Q8MCYmKFQrPXgpLHA9Y1tUXX13aGlsZSh5KTtyZXR1cm4gT319LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsIm5vcm1hbGl6ZSIsZnVuY3Rpb24oKXtyZXR1cm4gZX0pLHQuZChyLCJkaXN0YW5jZSIsZnVuY3Rpb24oKXtyZXR1cm4gbn0pLHQoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtmdW5jdGlvbiBlKFthLHMsaV0sbyxjLG0pe3JldHVybiBhPWEqMi9vLTEscz0xLXMqMi9jLE51bWJlci5pc0Zpbml0ZShtKT8oaT1pKjIvbS0xLFthLHMsaV0pOlthLHNdfWZ1bmN0aW9uIG4oW2EscyxpPTBdLFtvLGMsbT0wXSl7cmV0dXJuIE1hdGguaHlwb3Qoby1hLGMtcyxtLWkpfX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZ2V0UG9pbnQiLGZ1bmN0aW9uKCl7cmV0dXJuIG59KSx0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7Y29uc3QgZT1NYXRoLlBJKjI7ZnVuY3Rpb24gbihhLHMsaSxvLGMpe2MlPWUsYzwwJiYoYys9ZSk7Y29uc3QgbT1NYXRoLnRhbihjKTtpZihNYXRoLmFicyhtKTwxZTUpe2NvbnN0IHU9cy1tKmEscD0xL2kqKjIrbSoqMi9vKioyO2xldCB5PS0xOyhjPD1NYXRoLlBJLzJ8fGM+MypNYXRoLlBJLzIpJiYoeT0xKTtjb25zdCBPPXkqTWF0aC5zcXJ0KDEvcCkrYSx4PW0qTyt1O3JldHVybltPLHhdfXJldHVybiBjPE1hdGguUEk/W2EscytvXTpbYSxzLW9dfX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gVn0pO3ZhciBlPXQoMSksbj10KDQyKSxhPXQubihuKSxzPXQoNTcpLGk9dCgyOCksbz10KDI0KSxjPXQoMzApLG09dCg1OSksdT10KDUzKSxwPXQoNjApLHk9dC5uKHApLE89dCg0NikseD10Lm4oTyksdj10KDMxKSxUPXQoNDApLGw9dCgyMSk7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2Z1bmN0aW9uIGgoSixOKXtpZihKPT1udWxsKXJldHVybnt9O3ZhciAkPWYoSixOKSxTLFA7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHc9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhKKTtmb3IoUD0wO1A8dy5sZW5ndGg7UCsrKVM9d1tQXSwhKE4uaW5kZXhPZihTKT49MCkmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChKLFMpJiYoJFtTXT1KW1NdKX1yZXR1cm4gJH1mdW5jdGlvbiBmKEosTil7aWYoSj09bnVsbClyZXR1cm57fTt2YXIgJD17fSxTPU9iamVjdC5rZXlzKEopLFAsdztmb3Iodz0wO3c8Uy5sZW5ndGg7dysrKVA9U1t3XSwhKE4uaW5kZXhPZihQKT49MCkmJigkW1BdPUpbUF0pO3JldHVybiAkfWNvbnN0IGc9U3ltYm9sKCJtZXNoIiksTT1TeW1ib2woImNvbnRvdXJzIiksQT1TeW1ib2woInN0cm9rZSIpLEM9U3ltYm9sKCJmaWxsIiksYj1TeW1ib2woInN0cm9rZUNvbG9yIiksRT1TeW1ib2woImZpbGxDb2xvciIpLEw9U3ltYm9sKCJ0cmFuc2Zvcm0iKSxEPVN5bWJvbCgiaW52ZXJ0VHJhbnNmb3JtIiksST1TeW1ib2woInVuaWZvcm1zIiksUj1TeW1ib2woInRleE9wdGlvbnMiKSxCPVN5bWJvbCgiYmxlbmQiKSx6PVN5bWJvbCgiYXBwbHlUZXh0dXJlIiksSz1TeW1ib2woImFwcGx5VHJhbnNmb3JtIiksUT1TeW1ib2woImFwcGx5R3JhZGllbnRUcmFuc2Zvcm0iKSxfPVN5bWJvbCgiYXBwbHlQcm9ncmFtIiksaj1TeW1ib2woImdyYWRpZW50IiksRz1TeW1ib2woImZpbHRlciIpLFg9U3ltYm9sKCJvcGFjaXR5IiksWj1TeW1ib2woInByb2dyYW0iKSx0dD1TeW1ib2woImF0dHJpYnV0ZXMiKSxudD1TeW1ib2woInBhc3MiKSxxPVN5bWJvbCgiY2xpcENvbnRleHQiKSxkdD1TeW1ib2woImFwcGx5Q2xpcFBhdGgiKTtmdW5jdGlvbiB1dChKLE4pe2NvbnN0WyQsU109W0pbMV1bMF0tSlswXVswXSxKWzFdWzFdLUpbMF1bMV1dLFA9W107Zm9yKGxldCB3PTA7dzxOLmxlbmd0aDt3Kyspe2NvbnN0IFU9Tlt3XSxIPVsoVVswXS1KWzBdWzBdKS8kLDEtKFVbMV0tSlswXVsxXSkvU107UC5wdXNoKEgpfXJldHVybiBQfWZ1bmN0aW9uIFcoW0osTl0sWyQsUyxQLHddLHtzY2FsZTpVfSl7cmV0dXJuIFV8fChKLz1QLE49MS1OL3csSi09JCxOKz1TKSxbSixOLDBdfWZ1bmN0aW9uIEYoSixOLCQpe2NvbnN0IFM9eCgpKEosTiwkKTtyZXR1cm4gUy5wYXRoPUosUy5zaW1wbGlmeT0kLFMuc2NhbGU9TixTfWNsYXNzIFZ7Y29uc3RydWN0b3IoTil7dGhpc1tBXT1udWxsLHRoaXNbQ109bnVsbCx0aGlzW0xdPVsxLDAsMCwxLDAsMF0sdGhpc1tYXT0xLHRoaXNbSV09e30sdGhpc1tHXT1bXSx0aGlzW0JdPW51bGwsdGhpc1tSXT17fSx0aGlzLmNvbnRvdXJzPU4uY29udG91cnMsdGhpc1taXT1udWxsLHRoaXNbdHRdPXt9LHRoaXNbbnRdPVtdfWdldCBjb250b3Vycygpe3JldHVybiB0aGlzW01dfXNldCBjb250b3VycyhOKXt0aGlzW2ddPW51bGwsdGhpc1tNXT1OO2NvbnN0ICQ9Ti5zY2FsZTt0aGlzLnRyYW5zZm9ybVNjYWxlLyQ+MS41JiZ0aGlzLmFjY3VyYXRlKHRoaXMudHJhbnNmb3JtU2NhbGUpfXNldFByb2dyYW0oTil7dGhpc1taXT1OLHRoaXNbZ10mJnRoaXNbX10oTil9Z2V0IHByb2dyYW0oKXtyZXR1cm4gdGhpc1taXX1zZXRBdHRyaWJ1dGUoTiwkKXskPT1udWxsP2RlbGV0ZSB0aGlzW3R0XVtOXTp0aGlzW3R0XVtOXT0kfWdldE9wYWNpdHkoKXtyZXR1cm4gdGhpc1tYXX1zZXRPcGFjaXR5KE4pe2lmKE48MHx8Tj4xKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgb3BhY2l0eSB2YWx1ZS4iKTt0aGlzW2ddJiZ0aGlzW2ddLnBvc2l0aW9ucy5mb3JFYWNoKCQ9PnskWzJdPTEvJFsyXT4wP046LU59KSx0aGlzW1hdPU59c2V0Q2xpcFBhdGgoTil7dGhpcy5jbGlwUGF0aD1OLHRoaXNbSV0udV9jbGlwU2FtcGxlciYmdGhpc1tJXS51X2NsaXBTYW1wbGVyLmRlbGV0ZSgpLHRoaXMuc2V0VW5pZm9ybXMoe3VfY2xpcFNhbXBsZXI6bnVsbH0pLHRoaXNbZ10mJmRlbGV0ZSB0aGlzW2ddLmF0dHJpYnV0ZXMuYV9jbGlwVVYsTiYmdGhpc1tnXSYmdGhpc1tkdF0oKX1bZHRdKCl7aWYodGhpcy5jbGlwUGF0aCl7dGhpc1txXXx8KHRoaXNbcV09bC5kZWZhdWx0LmNyZWF0ZUNhbnZhcygxLDEpKTtjb25zdFtbTiwkXSxbUyxQXV09dGhpcy5ib3VuZGluZ0JveDtTJiZQJiYodGhpc1txXS53aWR0aD1TLU4sdGhpc1txXS5oZWlnaHQ9UC0kKTtjb25zdCB3PXRoaXNbcV0uZ2V0Q29udGV4dCgiMmQiKSxVPW5ldyBQYXRoMkQodGhpcy5jbGlwUGF0aCk7dy5jbGVhclJlY3QoMCwwLHRoaXNbcV0ud2lkdGgsdGhpc1txXS5oZWlnaHQpLHcuc2F2ZSgpLHcudHJhbnNsYXRlKC1OLC0kKSx3LmZpbGxTdHlsZT0id2hpdGUiLHcuZmlsbChVKSx3LnJlc3RvcmUoKSx0aGlzW2ddLmNsaXBQYXRoPXRoaXNbcV07Y29uc3QgSD11dCh0aGlzLmJvdW5kaW5nQm94LHRoaXNbZ10ucG9zaXRpb24wKTt0aGlzW2ddLmF0dHJpYnV0ZXMuYV9jbGlwVVY9SH19Z2V0UG9pbnRBdExlbmd0aChOKXtyZXR1cm4gT2JqZWN0KHUuZ2V0UG9pbnRBdExlbmd0aCkodGhpc1tNXSxOKX1nZXRUb3RhbExlbmd0aCgpe3JldHVybiBPYmplY3QodS5nZXRUb3RhbExlbmd0aCkodGhpc1tNXSl9Z2V0IGJsZW5kKCl7cmV0dXJuIHRoaXNbQl09PW51bGw/ImF1dG8iOnRoaXNbQl19c2V0IGJsZW5kKE4pe3RoaXNbQl09Tix0aGlzW2ddJiYodGhpc1tnXS5lbmFibGVCbGVuZD10aGlzLmVuYWJsZUJsZW5kKX1nZXQgYm91bmRpbmdCb3goKXtpZih0aGlzW2ddJiZ0aGlzW2ddLmJvdW5kaW5nQm94KXJldHVybiB0aGlzW2ddLmJvdW5kaW5nQm94O2NvbnN0IE49dGhpcy5tZXNoRGF0YTtpZihOKXtjb25zdCAkPU4ucG9zaXRpb24wO2lmKCQubGVuZ3RoKU4uYm91bmRpbmdCb3g9YSgpKCQpO2Vsc2UgcmV0dXJuW1swLDBdLFswLDBdXTtyZXR1cm4gTi5ib3VuZGluZ0JveH1yZXR1cm5bWzAsMF0sWzAsMF1dfWdldCBib3VuZGluZ0NlbnRlcigpe2NvbnN0IE49dGhpcy5ib3VuZGluZ0JveDtyZXR1cm4gTj9bLjUqKE5bMF1bMF0rTlsxXVswXSksLjUqKE5bMF1bMV0rTlsxXVsxXSldOlswLDBdfWdldCBmaWxsUnVsZSgpe3JldHVybiB0aGlzW0NdP3RoaXNbQ10ucnVsZToibm9uemVybyJ9Z2V0IGxpbmVXaWR0aCgpe3JldHVybiB0aGlzW0FdP3RoaXNbQV0ubGluZVdpZHRoOjB9Z2V0IGxpbmVDYXAoKXtyZXR1cm4gdGhpc1tBXT90aGlzW0FdLmxpbmVDYXA6IiJ9Z2V0IGxpbmVKb2luKCl7cmV0dXJuIHRoaXNbQV0/dGhpc1tBXS5saW5lSm9pbjoiIn1nZXQgbWl0ZXJMaW1pdCgpe3JldHVybiB0aGlzW0FdP3RoaXNbQV0ubWl0ZXJMaW1pdDowfWdldCBzdHJva2VTdHlsZSgpe3JldHVybiB0aGlzW2JdJiZ0aGlzW2JdWzNdIT09MD9PYmplY3Qoby5kZWZhdWx0KSh0aGlzW2JdKToiIn1nZXQgbGluZURhc2goKXtyZXR1cm4gdGhpc1tBXT90aGlzW0FdLmxpbmVEYXNoOm51bGx9Z2V0IGxpbmVEYXNoT2Zmc2V0KCl7cmV0dXJuIHRoaXNbQV0/dGhpc1tBXS5saW5lRGFzaE9mZnNldDowfWdldCBmaWxsU3R5bGUoKXtyZXR1cm4gdGhpc1tFXSYmdGhpc1tFXVszXSE9PTA/T2JqZWN0KG8uZGVmYXVsdCkodGhpc1tFXSk6IiJ9Z2V0IGdyYWRpZW50KCl7cmV0dXJuIHRoaXNbal19Z2V0IHRleHR1cmUoKXtyZXR1cm4gdGhpc1tJXS51X3RleFNhbXBsZXI/e2ltYWdlOnRoaXNbSV0udV90ZXhTYW1wbGVyLl9pbWcsb3B0aW9uczp0aGlzW1JdfTpudWxsfWdldCBlbmFibGVCbGVuZCgpe3JldHVybiB0aGlzW0JdPT09ITB8fHRoaXNbQl09PT0hMT90aGlzW0JdOnRoaXNbWF08MXx8dGhpc1tiXSE9bnVsbCYmdGhpc1tiXVszXTwxfHx0aGlzW0VdIT1udWxsJiZ0aGlzW0VdWzNdPDF8fHRoaXNbSV0udV9jb2xvck1hdHJpeCE9bnVsbCYmdGhpc1tJXS51X2NvbG9yTWF0cml4WzE4XTwxfHx0aGlzW0ldLnVfcmFkaWFsR3JhZGllbnRWZWN0b3IhPW51bGx8fHRoaXMuYmVmb3JlUmVuZGVyfHx0aGlzLmFmdGVyUmVuZGVyfWdldCBmaWx0ZXJDYW52YXMoKXtyZXR1cm4vYmx1cnxkcm9wLXNoYWRvd3x1cmwvLnRlc3QodGhpcy5maWx0ZXIpfWdldCBmaWx0ZXIoKXtyZXR1cm4gdGhpc1tHXS5qb2luKCIgIil9Z2V0IHRyYW5zZm9ybU1hdHJpeCgpe3JldHVybiB0aGlzW0xdfWdldCBpbnZlcnRNYXRyaXgoKXtpZighdGhpc1tEXSl7Y29uc3QgTj1lLm1hdDJkLmludmVydChBcnJheS5vZigwLDAsMCwwLDAsMCksdGhpc1tMXSk7dGhpc1tEXT1OfXJldHVybiB0aGlzW0RdfWdldCB0cmFuc2Zvcm1TY2FsZSgpe2NvbnN0IE49dGhpc1tMXTtyZXR1cm4gTWF0aC5tYXgoTWF0aC5oeXBvdChOWzBdLE5bMV0pLE1hdGguaHlwb3QoTlsyXSxOWzNdKSl9Z2V0IHVuaWZvcm1zKCl7cmV0dXJuIHRoaXNbSV19Z2V0IHBhc3MoKXtyZXR1cm4gdGhpc1tudF19W19dKE4pe2NvbnN0ICQ9dGhpc1t0dF0sUz10aGlzW2ddLnBvc2l0aW9uMCxQPU9iamVjdC5lbnRyaWVzKE4uX2F0dHJpYnV0ZSk7Zm9yKGxldCB3PTA7dzxQLmxlbmd0aDt3Kyspe2NvbnN0W1UsSF09UFt3XTtpZihVIT09ImFfY29sb3IiJiZVIT09ImFfc291cmNlUmVjdCImJkghPT0iaWdub3JlZCIpe2NvbnN0IFk9JFtVXTtpZihVPT09InV2IiYmIVkpe2NvbnN0IGs9dGhpc1tnXS5ib3VuZGluZ0JveHx8YSgpKFMpO3RoaXNbZ10uYXR0cmlidXRlc1tVXT11dChrLFMpfWVsc2V7dGhpc1tnXS5hdHRyaWJ1dGVzW1VdPVtdO2ZvcihsZXQgaz0wO2s8Uy5sZW5ndGg7aysrKXtjb25zdCBydD1TW2tdO3RoaXNbZ10uYXR0cmlidXRlc1tVXS5wdXNoKFk/WShydCx3LFMpOkFycmF5KEguc2l6ZSkuZmlsbCgwKSl9fX19fWdldCBtZXNoRGF0YSgpe2lmKHRoaXMuX3VwZGF0ZU1hdHJpeCYmdGhpcy50cmFuc2Zvcm1TY2FsZS90aGlzLmNvbnRvdXJzLnNjYWxlPjEuNSYmdGhpcy5hY2N1cmF0ZSh0aGlzLnRyYW5zZm9ybVNjYWxlKSwhdGhpc1tnXSl7IXRoaXNbQ10mJiF0aGlzW0FdJiZ0aGlzLnNldEZpbGwoKTtjb25zdCBOPXRoaXNbTV0sJD17fTtpZihOJiZOLmxlbmd0aCl7aWYodGhpc1tDXSl0cnl7Y29uc3Qgdz15KCkoTix0aGlzW0NdKTt3LnBvc2l0aW9ucz13LnBvc2l0aW9ucy5tYXAoVT0+KFUucHVzaCh0aGlzW1hdKSxVKSksdy5hdHRyaWJ1dGVzPXthX2NvbG9yOkFycmF5LmZyb20oe2xlbmd0aDp3LnBvc2l0aW9ucy5sZW5ndGh9KS5tYXAoKCk9PnRoaXNbRV0ubWFwKFU9Pk1hdGgucm91bmQoMjU1KlUpKSl9LCQuZmlsbD13fWNhdGNoe31pZih0aGlzW0FdKXtjb25zdCB3PXRoaXNbQV0ubGluZURhc2g7bGV0IFU9TjtpZih3KXtjb25zdCBZPXRoaXNbQV0ubGluZURhc2hPZmZzZXQ7VT1PYmplY3QodS5nZXREYXNoQ29udG91cnMpKE4sdyxZKX1jb25zdCBIPVUubWFwKChZLGspPT57Y29uc3QgcnQ9WS5sZW5ndGg+MSYmZS52ZWMyLmVxdWFscyhZWzBdLFlbWS5sZW5ndGgtMV0pLGl0PXRoaXNbQV0uYnVpbGQoWSxydCk7cmV0dXJuIHkoKShbaXRdKX0pO0guZm9yRWFjaChZPT57WS5wb3NpdGlvbnM9WS5wb3NpdGlvbnMubWFwKGs9PihrLnB1c2goLXRoaXNbWF0pLGspKSxZLmF0dHJpYnV0ZXM9e2FfY29sb3I6QXJyYXkuZnJvbSh7bGVuZ3RoOlkucG9zaXRpb25zLmxlbmd0aH0pLm1hcCgoKT0+dGhpc1tiXS5tYXAoaz0+TWF0aC5yb3VuZCgyNTUqaykpKX19KSwkLnN0cm9rZT1PYmplY3QoaS5kZWZhdWx0KShIKX19Y29uc3QgUz1PYmplY3QoaS5kZWZhdWx0KShbJC5maWxsLCQuc3Ryb2tlXSk7Uy5maWxsUG9pbnRDb3VudD0kLmZpbGw/JC5maWxsLnBvc2l0aW9ucy5sZW5ndGg6MCxTLmVuYWJsZUJsZW5kPXRoaXMuZW5hYmxlQmxlbmQsUy5wb3NpdGlvbjA9Uy5wb3NpdGlvbnMubWFwKChbdyxVLEhdKT0+W3csVSxIXSksUy51bmlmb3Jtcz10aGlzW0ldLHRoaXNbZ109Uyx0aGlzW0ldLnVfdGV4U2FtcGxlciYmdGhpc1t6XShTLHRoaXNbUl0pO2NvbnN0IFA9dGhpc1tMXTtPYmplY3QobS5pc1VuaXRUcmFuc2Zvcm0pKFApfHwodGhpc1tLXShTLFApLHRoaXNbSV0udV9yYWRpYWxHcmFkaWVudFZlY3RvciYmdGhpc1tRXSgpKSx0aGlzLmNsaXBQYXRoJiZ0aGlzW2R0XSgpLHRoaXNbWl0mJnRoaXNbX10odGhpc1taXSl9cmV0dXJuIHRoaXMuX3VwZGF0ZU1hdHJpeCYmKHRoaXNbZ10ubWF0cml4PXRoaXNbTF0sdGhpc1tLXSh0aGlzW2ddLHRoaXNbTF0pLHRoaXNbSV0udV9yYWRpYWxHcmFkaWVudFZlY3RvciYmdGhpc1tRXSgpKSx0aGlzW2ddfVtLXShOLCQpe2NvbnN0e3Bvc2l0aW9uczpTLHBvc2l0aW9uMDpQfT1OO2ZvcihsZXQgdz0wO3c8Uy5sZW5ndGg7dysrKXtjb25zdFtVLEhdPVBbd10sWT1TW3ddO1lbMF09VSokWzBdK0gqJFsyXSskWzRdLFlbMV09VSokWzFdK0gqJFszXSskWzVdfXRoaXMuX3VwZGF0ZU1hdHJpeD0hMX1bUV0oKXtjb25zdCBOPXRoaXNbTF0sJD1bLi4udGhpcy5fcmFkaWFsR3JhZGllbnRWZWN0b3JdO2lmKCQpe2NvbnN0W1MsUCwsdyxVXT0kOyRbMF09UypOWzBdK1AqTlsyXStOWzRdLCRbMV09UypOWzFdK1AqTlszXStOWzVdLCRbM109dypOWzBdK1UqTlsyXStOWzRdLCRbNF09dypOWzFdK1UqTlszXStOWzVdLHRoaXNbSV0udV9yYWRpYWxHcmFkaWVudFZlY3Rvcj0kfX1bel0oTiwkKXtmdW5jdGlvbiBTKGsscnQpe3JldHVybiBrPT1udWxsJiZydD09bnVsbD8hMDprPT1udWxsfHxydD09bnVsbD8hMTprWzBdPT09cnRbMF0mJmtbMV09PT1ydFsxXSYma1syXT09PXJ0WzJdJiZrWzNdPT09cnRbM119Y29uc3QgUD10aGlzW0ldLnVfdGV4U2FtcGxlcjtpZighUClyZXR1cm47Y29uc3R7d2lkdGg6dyxoZWlnaHQ6VX09UC5faW1nLEg9JC5zcmNSZWN0O2xldCBZPSQucmVjdHx8WzAsMF07aWYoJC5yb3RhdGVkJiYoWT1bLVlbMV0sWVswXSxZWzNdLFlbMl1dKSxZWzJdPT1udWxsJiYoWVsyXT1IP0hbMl06dyksWVszXT09bnVsbCYmKFlbM109SD9IWzNdOlUpLCQuaGlkZGVuKU4udGV4dHVyZUNvb3JkPU4ucG9zaXRpb25zLm1hcCgoKT0+Wy0xLC0xLC0xXSk7ZWxzZSBpZighTi50ZXh0dXJlQ29vcmR8fCFTKHRoaXNbUl0ucmVjdCwkLnJlY3QpfHx0aGlzW1JdLmhpZGRlbiE9PSQuaGlkZGVufHx0aGlzW1JdLnJvdGF0ZWQhPT0kLnJvdGF0ZWQpe2xldCBrPW51bGw7JC5yb3RhdGVkJiYoaz1lLm1hdDJkLnJvdGF0ZShBcnJheS5vZigwLDAsMCwwLDAsMCksZS5tYXQyZC5mcm9tVmFsdWVzKDEsMCwwLDEsMCwwKSwuNSpNYXRoLlBJKSxrPWUubWF0MmQudHJhbnNsYXRlKEFycmF5Lm9mKDAsMCwwLDAsMCwwKSxrLFswLC1ZWzJdXSkpLE4udGV4dHVyZUNvb3JkPU4ucG9zaXRpb24wLm1hcCgoW3J0LGl0LGN0XSk9PntpZigxL2N0PjApe2lmKCQucm90YXRlZCl7Y29uc3QgYXQ9cnQqa1swXStpdCprWzJdK2tbNF0sb3Q9cnQqa1sxXStpdCprWzNdK2tbNV07W3J0LGl0XT1bYXQsb3RdfWNvbnN0IGh0PVcoW3J0LGl0XSxbWVswXS9ZWzJdLFlbMV0vWVszXSxZWzJdLFlbM11dLCQpO3JldHVybiAkLnJlcGVhdCYmKGh0WzJdPTEpLGh0fXJldHVyblstMSwtMSwtMV19KX1pZihIKXtjb25zdCBrPVtIWzBdL3csSFsxXS9VLEhbMl0vdyxIWzNdL1VdO04uYXR0cmlidXRlcy5hX3NvdXJjZVJlY3Q9Ti5wb3NpdGlvbnMubWFwKCgpPT5bLi4ua10pfWVsc2UgTi5hdHRyaWJ1dGVzLmFfc291cmNlUmVjdD1OLnBvc2l0aW9ucy5tYXAoKCk9PlswLDAsMCwwXSl9YWNjdXJhdGUoTil7aWYoIXRoaXMuY29udG91cnMpcmV0dXJuO2lmKHRoaXMuY29udG91cnMucGF0aCl7Y29uc3QgUz10aGlzLmNvbnRvdXJzLnNpbXBsaWZ5LFA9Rih0aGlzLmNvbnRvdXJzLnBhdGgsMipOLFMpO3RoaXNbZ109bnVsbCx0aGlzW01dPVB9fWNhbklnbm9yZSgpe2NvbnN0IE49dGhpc1tBXT09bnVsbHx8dGhpc1tBXS5saW5lV2lkdGg9PT0wfHx0aGlzW2JdWzNdPT09MCwkPXRoaXNbQ109PW51bGx8fHRoaXNbRV1bM109PT0wLFM9dGhpc1tJXS51X3JhZGlhbEdyYWRpZW50VmVjdG9yPT1udWxsLFA9dGhpc1tJXS51X3RleFNhbXBsZXI9PW51bGw7cmV0dXJuIHRoaXNbWF09PT0wfHx0aGlzW1pdPT1udWxsJiZOJiYkJiZTJiZQJiYhdGhpcy5iZWZvcmVSZW5kZXImJiF0aGlzLmFmdGVyUmVuZGVyfXNldFN0cm9rZSh7dGhpY2tuZXNzOk49MSxjYXA6JD0iYnV0dCIsam9pbjpTPSJtaXRlciIsbWl0ZXJMaW1pdDpQPTEwLGNvbG9yOnc9WzAsMCwwLDBdLGxpbmVEYXNoOlU9bnVsbCxsaW5lRGFzaE9mZnNldDpIPTAscm91bmRTZWdtZW50czpZPTIwfT17fSl7cmV0dXJuIHRoaXNbZ109bnVsbCx0aGlzW0FdPW5ldyBzLmRlZmF1bHQoe2xpbmVXaWR0aDpOLGxpbmVDYXA6JCxsaW5lSm9pbjpTLG1pdGVyTGltaXQ6UCxyb3VuZFNlZ21lbnRzOll9KSx0eXBlb2Ygdz09InN0cmluZyImJih3PU9iamVjdCh2LmRlZmF1bHQpKHcpKSx0aGlzW2JdPXcsdGhpc1tBXS5saW5lRGFzaD1VLHRoaXNbQV0ubGluZURhc2hPZmZzZXQ9SCx0aGlzfXNldEZpbGwoe3J1bGU6Tj10aGlzLmZpbGxSdWxlLGNvbG9yOiQ9WzAsMCwwLDBdfT17fSl7cmV0dXJuIHRoaXNbZ109bnVsbCx0aGlzW0NdPXtydWxlOk59LHR5cGVvZiAkPT0ic3RyaW5nIiYmKCQ9T2JqZWN0KHYuZGVmYXVsdCkoJCkpLHRoaXNbRV09JCx0aGlzfXNldFRleHR1cmUoTiwkPXt9KXtpZihOJiZOLmltYWdlKXtjb25zdHtpbWFnZTpTLHJlY3Q6UH09TjtpZihOPVMsJC5yZWN0KWZvcihsZXQgdz0wO3c8JC5yZWN0Lmxlbmd0aDt3KyspUFt3XT0kLnJlY3Rbd107JC5yZWN0PVB9cmV0dXJuIHRoaXNbQ118fHRoaXMuc2V0RmlsbCgpLHRoaXMuc2V0VW5pZm9ybXMoe3VfdGV4U2FtcGxlcjpOfSksdGhpc1tnXSYmdGhpc1t6XSh0aGlzW2ddLCQpLHRoaXNbUl09JCx0aGlzfXNldENpcmN1bGFyR3JhZGllbnQoe3ZlY3RvcjpOLGNvbG9yczokLHR5cGU6Uz0iZmlsbCJ9PXt9KXtpZihOLmxlbmd0aCE9PTMpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBsaW5lYXJHcmFkaWVudC4iKTt0aGlzLnNldEdyYWRpZW50KHt2ZWN0b3I6Tixjb2xvcnM6JCx0eXBlOlN9KX1zZXRMaW5lYXJHcmFkaWVudCh7dmVjdG9yOk4sY29sb3JzOiQsdHlwZTpTPSJmaWxsIn09e30pe2lmKE4ubGVuZ3RoIT09NCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGxpbmVhckdyYWRpZW50LiIpO3RoaXMuc2V0R3JhZGllbnQoe3ZlY3RvcjpOLGNvbG9yczokLHR5cGU6U30pfXNldFJhZGlhbEdyYWRpZW50KHt2ZWN0b3I6Tixjb2xvcnM6JCx0eXBlOlM9ImZpbGwifT17fSl7aWYoTi5sZW5ndGghPT02KXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgcmFkaWFsR3JhZGllbnQuIik7dGhpcy5zZXRHcmFkaWVudCh7dmVjdG9yOk4sY29sb3JzOiQsdHlwZTpTfSl9c2V0R3JhZGllbnQoe3ZlY3RvcjpOLGNvbG9yczokLHR5cGU6Uz0iZmlsbCJ9PXt9KXskPSQubWFwKCh7b2Zmc2V0OlUsY29sb3I6SH0pPT4odHlwZW9mIEg9PSJzdHJpbmciJiYoSD1PYmplY3Qodi5kZWZhdWx0KShIKSkse29mZnNldDpVLGNvbG9yOkh9KSksdGhpc1tqXT10aGlzW2pdfHx7fSx0aGlzW2pdW1NdPXt2ZWN0b3I6Tixjb2xvcnM6JH0sJC5zb3J0KChVLEgpPT5VLm9mZnNldC1ILm9mZnNldCk7Y29uc3QgUD1bXTskLmZvckVhY2goKHtvZmZzZXQ6VSxjb2xvcjpIfSk9PntQLnB1c2goVSwuLi5IKX0pO2xldCB3O2lmKE4ubGVuZ3RoPT09ND93PVtOWzBdLE5bMV0sMCxOWzJdLE5bM10sMF06dz1bLi4uTl0sUC5sZW5ndGg8NDAmJlAucHVzaCgtMSksUC5sZW5ndGg+NDApdGhyb3cgbmV3IEVycm9yKCJUb28gbWFueSBjb2xvcnMsIHNob3VsZCBiZSBsZXNzIHRoYW4gOCBjb2xvcnMiKTtyZXR1cm4gdGhpcy5fcmFkaWFsR3JhZGllbnRWZWN0b3I9dyx0aGlzW0ldLnVfY29sb3JTdGVwcz1QLFM9PT0iZmlsbCI/dGhpc1tJXS51X2dyYWRpZW50VHlwZT0xOnRoaXNbSV0udV9ncmFkaWVudFR5cGU9MCx0aGlzW1FdKCksdGhpc31zZXRVbmlmb3JtcyhOPXt9KXtyZXR1cm4gT2JqZWN0LmFzc2lnbih0aGlzW0ldLE4pLHRoaXN9c2V0VHJhbnNmb3JtKC4uLk4pe2NvbnN0ICQ9dGhpc1tMXTtyZXR1cm4gZS5tYXQyZC5lcXVhbHMoTiwkKXx8KHRoaXNbTF09TixkZWxldGUgdGhpc1tEXSx0aGlzLl91cGRhdGVNYXRyaXg9ITApLHRoaXN9dHJhbnNmb3JtKC4uLk4pe2NvbnN0ICQ9dGhpc1tMXTtyZXR1cm4gdGhpc1tMXT1lLm1hdDJkLm11bHRpcGx5KEFycmF5Lm9mKDAsMCwwLDAsMCwwKSwkLE4pLGRlbGV0ZSB0aGlzW0RdLHRoaXMuX3VwZGF0ZU1hdHJpeD0hMCx0aGlzfXRyYW5zbGF0ZShOLCQpe2xldCBTPWUubWF0MmQuY3JlYXRlKCk7cmV0dXJuIFM9ZS5tYXQyZC50cmFuc2xhdGUoQXJyYXkub2YoMCwwLDAsMCwwLDApLFMsW04sJF0pLHRoaXMudHJhbnNmb3JtKC4uLlMpfXJvdGF0ZShOLFskLFNdPVswLDBdKXtsZXQgUD1lLm1hdDJkLmNyZWF0ZSgpO3JldHVybiBQPWUubWF0MmQudHJhbnNsYXRlKEFycmF5Lm9mKDAsMCwwLDAsMCwwKSxQLFskLFNdKSxQPWUubWF0MmQucm90YXRlKEFycmF5Lm9mKDAsMCwwLDAsMCwwKSxQLE4pLFA9ZS5tYXQyZC50cmFuc2xhdGUoQXJyYXkub2YoMCwwLDAsMCwwLDApLFAsWy0kLC1TXSksdGhpcy50cmFuc2Zvcm0oLi4uUCl9c2NhbGUoTiwkPU4sW1MsUF09WzAsMF0pe2xldCB3PWUubWF0MmQuY3JlYXRlKCk7cmV0dXJuIHc9ZS5tYXQyZC50cmFuc2xhdGUoQXJyYXkub2YoMCwwLDAsMCwwLDApLHcsW1MsUF0pLHc9ZS5tYXQyZC5zY2FsZShBcnJheS5vZigwLDAsMCwwLDAsMCksdyxbTiwkXSksdz1lLm1hdDJkLnRyYW5zbGF0ZShBcnJheS5vZigwLDAsMCwwLDAsMCksdyxbLVMsLVBdKSx0aGlzLnRyYW5zZm9ybSguLi53KX1za2V3KE4sJD1OLFtTLFBdPVswLDBdKXtsZXQgdz1lLm1hdDJkLmNyZWF0ZSgpO3JldHVybiB3PWUubWF0MmQudHJhbnNsYXRlKEFycmF5Lm9mKDAsMCwwLDAsMCwwKSx3LFtTLFBdKSx3PWUubWF0MmQubXVsdGlwbHkoQXJyYXkub2YoMCwwLDAsMCwwLDApLHcsZS5tYXQyZC5mcm9tVmFsdWVzKDEsTWF0aC50YW4oJCksTWF0aC50YW4oTiksMSwwLDApKSx3PWUubWF0MmQudHJhbnNsYXRlKEFycmF5Lm9mKDAsMCwwLDAsMCwwKSx3LFstUywtUF0pLHRoaXMudHJhbnNmb3JtKC4uLncpfWNsZWFyRmlsdGVyKCl7cmV0dXJuIHRoaXMuc2V0Q29sb3JUcmFuc2Zvcm0obnVsbCksdGhpc1tHXS5sZW5ndGg9MCx0aGlzfXNldENvbG9yVHJhbnNmb3JtKC4uLk4pe3JldHVybiBOWzBdPT09bnVsbD90aGlzLnNldFVuaWZvcm1zKHt1X2ZpbHRlckZsYWc6MCx1X2NvbG9yTWF0cml4OjB9KTp0aGlzLnNldFVuaWZvcm1zKHt1X2ZpbHRlckZsYWc6MSx1X2NvbG9yTWF0cml4Ok59KSx0aGlzfXRyYW5zZm9ybUNvbG9yKC4uLk4pe2xldCAkPXRoaXMudW5pZm9ybXMudV9jb2xvck1hdHJpeDtyZXR1cm4gJD8kPU9iamVjdChjLm11bHRpcGx5KSgkLE4pOiQ9Tix0aGlzLnNldENvbG9yVHJhbnNmb3JtKC4uLiQpLHRoaXN9Ymx1cihOKXtyZXR1cm4gdGhpc1tHXS5wdXNoKGBibHVyKCR7Tn1weClgKSx0aGlzfWJyaWdodG5lc3MoTj0xKXtyZXR1cm4gdGhpc1tHXS5wdXNoKGBicmlnaHRuZXNzKCR7MTAwKk59JSlgKSx0aGlzLnRyYW5zZm9ybUNvbG9yKC4uLk9iamVjdChjLmJyaWdodG5lc3MpKE4pKX1jb250cmFzdChOPTEpe3JldHVybiB0aGlzW0ddLnB1c2goYGNvbnRyYXN0KCR7MTAwKk59JSlgKSx0aGlzLnRyYW5zZm9ybUNvbG9yKC4uLk9iamVjdChjLmNvbnRyYXN0KShOKSl9ZHJvcFNoYWRvdyhOLCQsUz0wLFA9WzAsMCwwLDFdKXtyZXR1cm4gQXJyYXkuaXNBcnJheShQKSYmKFA9T2JqZWN0KG8uZGVmYXVsdCkoUCkpLHRoaXNbR10ucHVzaChgZHJvcC1zaGFkb3coJHtOfXB4ICR7JH1weCAke1N9cHggJHtQfSlgKSx0aGlzfWdyYXlzY2FsZShOPTEpe3JldHVybiB0aGlzW0ddLnB1c2goYGdyYXlzY2FsZSgkezEwMCpOfSUpYCksdGhpcy50cmFuc2Zvcm1Db2xvciguLi5PYmplY3QoYy5ncmF5c2NhbGUpKE4pKX1odWVSb3RhdGUoTj0wKXtyZXR1cm4gdGhpc1tHXS5wdXNoKGBodWUtcm90YXRlKCR7Tn1kZWcpYCksdGhpcy50cmFuc2Zvcm1Db2xvciguLi5PYmplY3QoYy5odWVSb3RhdGUpKE4pKX1pbnZlcnQoTj0xKXtyZXR1cm4gdGhpc1tHXS5wdXNoKGBpbnZlcnQoJHsxMDAqTn0lKWApLHRoaXMudHJhbnNmb3JtQ29sb3IoLi4uT2JqZWN0KGMuaW52ZXJ0KShOKSl9b3BhY2l0eShOPTEpe3JldHVybiB0aGlzW0ddLnB1c2goYG9wYWNpdHkoJHsxMDAqTn0lKWApLHRoaXMudHJhbnNmb3JtQ29sb3IoLi4uT2JqZWN0KGMub3BhY2l0eSkoTikpfXNhdHVyYXRlKE49MSl7cmV0dXJuIHRoaXNbR10ucHVzaChgc2F0dXJhdGUoJHsxMDAqTn0lKWApLHRoaXMudHJhbnNmb3JtQ29sb3IoLi4uT2JqZWN0KGMuc2F0dXJhdGUpKE4pKX1zZXBpYShOPTEpe3JldHVybiB0aGlzW0ddLnB1c2goYHNlcGlhKCR7MTAwKk59JSlgKSx0aGlzLnRyYW5zZm9ybUNvbG9yKC4uLk9iamVjdChjLnNlcGlhKShOKSl9dXJsKE4pe3JldHVybiB0aGlzW0ddLnB1c2goYHVybCgke059KWApLHRoaXN9aXNQb2ludENvbGxpc2lvbihOLCQsUz0iYm90aCIpe2NvbnN0IFA9dGhpcy5tZXNoRGF0YSx7cG9zaXRpb25zOncsY2VsbHM6VX09UCxIPXRoaXMuaW52ZXJ0TWF0cml4LFk9SFswXSpOK0hbMl0qJCtIWzRdLGs9SFsxXSpOK0hbM10qJCtIWzVdLHJ0PXRoaXMuYm91bmRpbmdCb3g7aWYoWTxydFswXVswXXx8WT5ydFsxXVswXXx8azxydFswXVsxXXx8az5ydFsxXVsxXSlyZXR1cm4hMTtmdW5jdGlvbiBpdChbY3QsaHRdLFthdCxvdF0sW2Z0LG10XSl7Y29uc3QgdnQ9ZnQtYXQscHQ9bXQtb3QseHQ9KChjdC1hdCkqdnQrKGh0LW90KSpwdCkvKHZ0KioyK3B0KioyKTtyZXR1cm4geHQ+PTAmJnh0PD0xfWZvcihsZXQgY3Q9MDtjdDxVLmxlbmd0aDtjdCsrKXtjb25zdCBodD1VW2N0XTtpZihTPT09ImZpbGwiJiZodFswXT49UC5maWxsUG9pbnRDb3VudClicmVhaztpZihTPT09InN0cm9rZSImJmh0WzBdPFAuZmlsbFBvaW50Q291bnQpY29udGludWU7Y29uc3RbW2F0LG90XSxbZnQsbXRdLFt2dCxwdF1dPWh0Lm1hcChQdD0+d1tQdF0pLHh0PU1hdGguc2lnbigoTi1hdCkqKG10LW90KS0oZnQtYXQpKigkLW90KSk7aWYoeHQ9PT0wJiZpdChbTiwkXSxbYXQsb3RdLFtmdCxtdF0pKXJldHVybiEwO2NvbnN0IFJ0PU1hdGguc2lnbigoTi1mdCkqKHB0LW10KS0odnQtZnQpKigkLW10KSk7aWYoUnQ9PT0wJiZpdChbTiwkXSxbZnQsbXRdLFt2dCxwdF0pKXJldHVybiEwO2NvbnN0IEV0PU1hdGguc2lnbigoTi12dCkqKG90LXB0KS0oYXQtdnQpKigkLXB0KSk7aWYoRXQ9PT0wJiZpdChbTiwkXSxbdnQscHRdLFthdCxvdF0pfHx4dD09PTEmJlJ0PT09MSYmRXQ9PT0xfHx4dD09PS0xJiZSdD09PS0xJiZFdD09PS0xKXJldHVybiEwfXJldHVybiExfWlzUG9pbnRJbkZpbGwoTiwkKXtyZXR1cm4gdGhpcy5pc1BvaW50Q29sbGlzaW9uKE4sJCwiZmlsbCIpfWlzUG9pbnRJblN0cm9rZShOLCQpe3JldHVybiB0aGlzLmlzUG9pbnRDb2xsaXNpb24oTiwkLCJzdHJva2UiKX1hZGRQYXNzKE4sJD17fSl7bGV0e3dpZHRoOlMsaGVpZ2h0OlB9PSQsdz1oKCQsWyJ3aWR0aCIsImhlaWdodCJdKTtjb25zdCBVPW5ldyBULmRlZmF1bHQ7VS5yZWN0KDAsMCxTLFApO2NvbnN0IEg9bmV3IFYoVSx7d2lkdGg6UyxoZWlnaHQ6UH0pO0guc2V0VW5pZm9ybXModyksSC5zZXRQcm9ncmFtKE4pLHRoaXNbbnRdLnB1c2goSCl9fX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKTt2YXIgZT10KDU4KTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSksci5kZWZhdWx0PWUuU3Ryb2tlfSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJTdHJva2UiLGZ1bmN0aW9uKCl7cmV0dXJuIG19KTt2YXIgZT10KDQ5KTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7Y29uc3Qgbj1PYmplY3QoZS5jcmVhdGUpKCksYT1PYmplY3QoZS5jcmVhdGUpKCkscz1PYmplY3QoZS5jcmVhdGUpKCksaT1PYmplY3QoZS5jcmVhdGUpKCksbz1PYmplY3QoZS5jcmVhdGUpKCksYz0xZTIwO2NsYXNzIG17Y29uc3RydWN0b3Ioe2xpbmVXaWR0aDp4PTEsbGluZUpvaW46dj0ibWl0ZXIiLG1pdGVyTGltaXQ6VD0xMCxsaW5lQ2FwOmw9ImJ1dHQiLHJvdW5kU2VnbWVudHM6aD0yMH09e30pe3RoaXMubGluZVdpZHRoPXgsdGhpcy5saW5lSm9pbj12LHRoaXMubWl0ZXJMaW1pdD1ULHRoaXMubGluZUNhcD1sLHRoaXMucm91bmRTZWdtZW50cz1oLHRoaXMuX25vcm1hbD1udWxsfWJ1aWxkKHgsdj0hMSl7bGV0IFQ9eC5sZW5ndGg7aWYoeD1bLi4ueF0sVDwyKXJldHVybiB4O3YmJigoeFswXVswXSE9PXhbVC0xXVswXXx8eFswXVsxXSE9PXhbVC0xXVsxXSkmJngucHVzaChbLi4ueFswXV0pLHgucHVzaChbLi4ueFsxXV0pKSxUPXgubGVuZ3RoLHRoaXMuX25vcm1hbD1udWxsO2NvbnN0IGw9e2xlZnQ6W10scmlnaHQ6W119LGg9dGhpcy5saW5lV2lkdGgvMixmPXRoaXMubGluZUNhcDtpZighdiYmZj09PSJzcXVhcmUiKXtPYmplY3QoZS5kaXJlY3Rpb24pKGEseFswXSx4WzFdKSxPYmplY3QoZS5zY2FsZUFuZEFkZCkoeFswXSx4WzBdLGEsaCk7Y29uc3QgTT14Lmxlbmd0aC0xO09iamVjdChlLmRpcmVjdGlvbikoYSx4W01dLHhbTS0xXSksT2JqZWN0KGUuc2NhbGVBbmRBZGQpKHhbTV0seFtNXSxhLGgpfWZvcihsZXQgTT0xO008VDtNKyspe2NvbnN0IEE9eFtNLTFdLEM9eFtNXSxiPXhbTSsxXTt0aGlzLl9zZWcobCxBLEMsYixoLHYpfXJldHVybiF2JiZmPT09InJvdW5kIiYmeShsLHRoaXMucm91bmRTZWdtZW50cyksWy4uLmwubGVmdCwuLi5sLnJpZ2h0LnJldmVyc2UoKV19X3NlZyh4LHYsVCxsLGgsZil7Y29uc3QgZz10aGlzLmxpbmVKb2luPT09ImJldmVsIixNPXRoaXMubGluZUpvaW49PT0icm91bmQiO2lmKE9iamVjdChlLmRpcmVjdGlvbikoYSxULHYpLHRoaXMuX25vcm1hbHx8KHRoaXMuX25vcm1hbD1PYmplY3QoZS5jcmVhdGUpKCksT2JqZWN0KGUubm9ybWFsKSh0aGlzLl9ub3JtYWwsYSkpLHgubGVmdC5sZW5ndGh8fHAoeCx2LHRoaXMuX25vcm1hbCxoKSwhbClPYmplY3QoZS5ub3JtYWwpKHRoaXMuX25vcm1hbCxhKSxmP3AoeCx2LHRoaXMuX25vcm1hbCxoKTpwKHgsVCx0aGlzLl9ub3JtYWwsaCk7ZWxzZXtPYmplY3QoZS5kaXJlY3Rpb24pKHMsbCxUKTtsZXQgQT1PYmplY3QoZS5jb21wdXRlTWl0ZXIpKGksbyxhLHMsaCk7QT1NYXRoLm1pbihBLGMpO2NvbnN0IEM9T2JqZWN0KGUuZG90KShpLHRoaXMuX25vcm1hbCk8MD8tMToxO2xldCBiPWd8fE07aWYoIWImJnRoaXMubGluZUpvaW49PT0ibWl0ZXIiJiZBL2g+dGhpcy5taXRlckxpbWl0JiYoYj0hMCksYil7T2JqZWN0KGUuc2NhbGVBbmRBZGQpKG4sVCx0aGlzLl9ub3JtYWwsLWgqQyksdSh4LG4sQyk7bGV0IEU9MS8wO3YmJihFPU1hdGgubWluKEUsTWF0aC5oeXBvdChUWzBdLXZbMF0sVFsxXS12WzFdKSkpLGwmJihFPU1hdGgubWluKEUsTWF0aC5oeXBvdChsWzBdLVRbMF0sbFsxXS1UWzFdKSkpO2NvbnN0IEw9TWF0aC5tYXgoaCxNYXRoLm1pbihBLEUpKTtpZihPYmplY3QoZS5zY2FsZUFuZEFkZCkobixULG8sTCpDKSx1KHgsbiwtQyksbClpZihPYmplY3QoZS5ub3JtYWwpKG4scyksT2JqZWN0KGUuY29weSkodGhpcy5fbm9ybWFsLG4pLE9iamVjdChlLnNjYWxlQW5kQWRkKShuLFQsbiwtaCpDKSxNKXtjb25zdCBEPU9iamVjdChlLmNsb25lKShuKSxJPUM+MD94LmxlZnRbeC5sZWZ0Lmxlbmd0aC0xXTp4LnJpZ2h0W3gucmlnaHQubGVuZ3RoLTFdLFI9T2JqZWN0KGUuY2xvbmUpKFQpLEI9T2JqZWN0KGUuc3ViKShPYmplY3QoZS5jcmVhdGUpKCksSSxSKSx6PU9iamVjdChlLnN1YikoT2JqZWN0KGUuY3JlYXRlKSgpLEQsUiksSz1NYXRoLlBJL3RoaXMucm91bmRTZWdtZW50cztmb3IobGV0IFE9MDtRPHRoaXMucm91bmRTZWdtZW50cyYmKE9iamVjdChlLnJvdGF0ZSkoQixCLFswLDBdLEMqSyksTWF0aC5zaWduKE9iamVjdChlLmNyb3NzKShuLEIseilbMl0pPT09Qyk7USsrKU9iamVjdChlLmFkZCkobixCLFIpLHUoeCxuLEMpO3UoeCxELEMpfWVsc2UgdSh4LG4sQyl9ZWxzZSBwKHgsVCxvLEEpLE9iamVjdChlLmNvcHkpKHRoaXMuX25vcm1hbCxvKX19fWZ1bmN0aW9uIHUoTyx4LHYpe3Y+MD9PLmxlZnQucHVzaChPYmplY3QoZS5jbG9uZSkoeCkpOk8ucmlnaHQucHVzaChPYmplY3QoZS5jbG9uZSkoeCkpfWZ1bmN0aW9uIHAoTyx4LHYsVCxsPS0xKXtPYmplY3QoZS5zY2FsZUFuZEFkZCkobix4LHYsLVQpLHUoTyxuLC1sKSxPYmplY3QoZS5zY2FsZUFuZEFkZCkobix4LHYsVCksdShPLG4sbCl9ZnVuY3Rpb24geSh7bGVmdDpPLHJpZ2h0Onh9LHYpe2NvbnN0IFQ9T2JqZWN0KGUuY3JlYXRlKSgpLGw9T2JqZWN0KGUuY3JlYXRlKSgpO2xldCBoPU9bMF0sZj14WzBdLGc9Wy41KihoWzBdK2ZbMF0pLC41KihoWzFdK2ZbMV0pXTtPYmplY3QoZS5zdWIpKGwsaCxnKTtmb3IobGV0IE09MTtNPD12O00rKyl7Y29uc3QgQT0tMSpNYXRoLlBJKk0vdjtPYmplY3QoZS5yb3RhdGUpKFQsbCxbMCwwXSxBKSxPYmplY3QoZS5hZGQpKG4sZyxUKSxPLnVuc2hpZnQoT2JqZWN0KGUuY2xvbmUpKG4pKX1oPXhbeC5sZW5ndGgtMV0sZj1PW08ubGVuZ3RoLTFdLGc9Wy41KihoWzBdK2ZbMF0pLC41KihoWzFdK2ZbMV0pXSxPYmplY3QoZS5zdWIpKGwsaCxnKTtmb3IobGV0IE09MTtNPD12O00rKyl7Y29uc3QgQT0tMSpNYXRoLlBJKk0vdjtPYmplY3QoZS5yb3RhdGUpKFQsbCxbMCwwXSxBKSxPYmplY3QoZS5hZGQpKG4sZyxUKSx4LnB1c2goT2JqZWN0KGUuY2xvbmUpKG4pKX19fSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJpc1VuaXRUcmFuc2Zvcm0iLGZ1bmN0aW9uKCl7cmV0dXJuIGV9KSx0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7ZnVuY3Rpb24gZShuKXtyZXR1cm4gblswXT09PTEmJm5bMV09PT0wJiZuWzJdPT09MCYmblszXT09PTEmJm5bNF09PT0wJiZuWzVdPT09MH19LGZ1bmN0aW9uKGQscix0KXt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7dmFyIGU9dCg2MSksbj10KDYyKTtkLmV4cG9ydHM9ZnVuY3Rpb24oYSxzKXtpZihzPXN8fHt9LGE9YS5maWx0ZXIoZnVuY3Rpb24odil7cmV0dXJuIHYubGVuZ3RoPjJ9KSxhLmxlbmd0aD09PTApcmV0dXJue3Bvc2l0aW9uczpbXSxjZWxsczpbXX07dHlwZW9mIHMudmVydGV4U2l6ZSE9Im51bWJlciImJihzLnZlcnRleFNpemU9YVswXVswXS5sZW5ndGgpLGE9YS5tYXAoZnVuY3Rpb24odil7cmV0dXJuIHYucmVkdWNlKGZ1bmN0aW9uKFQsbCl7cmV0dXJuIFQuY29uY2F0KGwpfSl9KTtjb25zdCBpPXMucnVsZT09PSJldmVub2RkIj9lLldJTkRJTkdfT0REOmUuV0lORElOR19OT05aRVJPO2Zvcih2YXIgbz1lLnRlc3NlbGF0ZShuKHtjb250b3VyczphLHdpbmRpbmdSdWxlOmksZWxlbWVudFR5cGU6ZS5QT0xZR09OUyxwb2x5U2l6ZTozLHZlcnRleFNpemU6Mn0scykpLGM9W10sbT0wO208by52ZXJ0aWNlcy5sZW5ndGg7bSs9cy52ZXJ0ZXhTaXplKXt2YXIgdT1vLnZlcnRpY2VzLnNsaWNlKG0sbStzLnZlcnRleFNpemUpO2MucHVzaCh1KX12YXIgcD1bXTtmb3IobT0wO208by5lbGVtZW50cy5sZW5ndGg7bSs9Myl7dmFyIHk9by5lbGVtZW50c1ttXSxPPW8uZWxlbWVudHNbbSsxXSx4PW8uZWxlbWVudHNbbSsyXTtwLnB1c2goW3ksTyx4XSl9cmV0dXJue3Bvc2l0aW9uczpjLGNlbGxzOnB9fX0sZnVuY3Rpb24oZCxyLHQpe3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTt2YXIgZT17fSxuPXt9O2QuZXhwb3J0cz1lLGUuV0lORElOR19PREQ9MCxlLldJTkRJTkdfTk9OWkVSTz0xLGUuV0lORElOR19QT1NJVElWRT0yLGUuV0lORElOR19ORUdBVElWRT0zLGUuV0lORElOR19BQlNfR0VRX1RXTz00LGUuUE9MWUdPTlM9MCxlLkNPTk5FQ1RFRF9QT0xZR09OUz0xLGUuQk9VTkRBUllfQ09OVE9VUlM9MixlLnRlc3NlbGF0ZT1mdW5jdGlvbihsKXtmb3IodmFyIGg9bC5kZWJ1Z3x8ITEsZj1uZXcgVCxnPTA7ZzxsLmNvbnRvdXJzLmxlbmd0aDtnKyspZi5hZGRDb250b3VyKGwudmVydGV4U2l6ZXx8MixsLmNvbnRvdXJzW2ddKTtyZXR1cm4gZi50ZXNzZWxhdGUobC53aW5kaW5nUnVsZXx8ZS5XSU5ESU5HX09ERCxsLmVsZW1lbnRUeXBlfHxlLlBPTFlHT05TLGwucG9seVNpemV8fDMsbC52ZXJ0ZXhTaXplfHwyLGwubm9ybWFsfHxbMCwwLDFdKSx7dmVydGljZXM6Zi52ZXJ0aWNlcyx2ZXJ0ZXhJbmRpY2VzOmYudmVydGV4SW5kaWNlcyx2ZXJ0ZXhDb3VudDpmLnZlcnRleENvdW50LGVsZW1lbnRzOmYuZWxlbWVudHMsZWxlbWVudENvdW50OmYuZWxlbWVudENvdW50LG1lc2g6aD9mLm1lc2g6dm9pZCAwfX07dmFyIGE9ZnVuY3Rpb24obCl7aWYoIWwpdGhyb3ciQXNzZXJ0aW9uIEZhaWxlZCEifTtmdW5jdGlvbiBzKCl7dGhpcy5uZXh0PW51bGwsdGhpcy5wcmV2PW51bGwsdGhpcy5hbkVkZ2U9bnVsbCx0aGlzLmNvb3Jkcz1bMCwwLDBdLHRoaXMucz0wLHRoaXMudD0wLHRoaXMucHFIYW5kbGU9MCx0aGlzLm49MCx0aGlzLmlkeD0wfWZ1bmN0aW9uIGkoKXt0aGlzLm5leHQ9bnVsbCx0aGlzLnByZXY9bnVsbCx0aGlzLmFuRWRnZT1udWxsLHRoaXMudHJhaWw9bnVsbCx0aGlzLm49MCx0aGlzLm1hcmtlZD0hMSx0aGlzLmluc2lkZT0hMX1mdW5jdGlvbiBvKGwpe3RoaXMubmV4dD1udWxsLHRoaXMuU3ltPW51bGwsdGhpcy5PbmV4dD1udWxsLHRoaXMuTG5leHQ9bnVsbCx0aGlzLk9yZz1udWxsLHRoaXMuTGZhY2U9bnVsbCx0aGlzLmFjdGl2ZVJlZ2lvbj1udWxsLHRoaXMud2luZGluZz0wLHRoaXMuc2lkZT1sfW8ucHJvdG90eXBlPXtnZXQgUmZhY2UoKXtyZXR1cm4gdGhpcy5TeW0uTGZhY2V9LHNldCBSZmFjZShsKXt0aGlzLlN5bS5MZmFjZT1sfSxnZXQgRHN0KCl7cmV0dXJuIHRoaXMuU3ltLk9yZ30sc2V0IERzdChsKXt0aGlzLlN5bS5Pcmc9bH0sZ2V0IE9wcmV2KCl7cmV0dXJuIHRoaXMuU3ltLkxuZXh0fSxzZXQgT3ByZXYobCl7dGhpcy5TeW0uTG5leHQ9bH0sZ2V0IExwcmV2KCl7cmV0dXJuIHRoaXMuT25leHQuU3ltfSxzZXQgTHByZXYobCl7dGhpcy5PbmV4dC5TeW09bH0sZ2V0IERwcmV2KCl7cmV0dXJuIHRoaXMuTG5leHQuU3ltfSxzZXQgRHByZXYobCl7dGhpcy5MbmV4dC5TeW09bH0sZ2V0IFJwcmV2KCl7cmV0dXJuIHRoaXMuU3ltLk9uZXh0fSxzZXQgUnByZXYobCl7dGhpcy5TeW0uT25leHQ9bH0sZ2V0IERuZXh0KCl7cmV0dXJuIHRoaXMuU3ltLk9uZXh0LlN5bX0sc2V0IERuZXh0KGwpe3RoaXMuU3ltLk9uZXh0LlN5bT1sfSxnZXQgUm5leHQoKXtyZXR1cm4gdGhpcy5TeW0uTG5leHQuU3ltfSxzZXQgUm5leHQobCl7dGhpcy5TeW0uTG5leHQuU3ltPWx9fTtmdW5jdGlvbiBjKCl7dmFyIGw9bmV3IHMsaD1uZXcgaSxmPW5ldyBvKDApLGc9bmV3IG8oMSk7bC5uZXh0PWwucHJldj1sLGwuYW5FZGdlPW51bGwsaC5uZXh0PWgucHJldj1oLGguYW5FZGdlPW51bGwsaC50cmFpbD1udWxsLGgubWFya2VkPSExLGguaW5zaWRlPSExLGYubmV4dD1mLGYuU3ltPWcsZi5PbmV4dD1udWxsLGYuTG5leHQ9bnVsbCxmLk9yZz1udWxsLGYuTGZhY2U9bnVsbCxmLndpbmRpbmc9MCxmLmFjdGl2ZVJlZ2lvbj1udWxsLGcubmV4dD1nLGcuU3ltPWYsZy5PbmV4dD1udWxsLGcuTG5leHQ9bnVsbCxnLk9yZz1udWxsLGcuTGZhY2U9bnVsbCxnLndpbmRpbmc9MCxnLmFjdGl2ZVJlZ2lvbj1udWxsLHRoaXMudkhlYWQ9bCx0aGlzLmZIZWFkPWgsdGhpcy5lSGVhZD1mLHRoaXMuZUhlYWRTeW09Z31jLnByb3RvdHlwZT17bWFrZUVkZ2VfOmZ1bmN0aW9uKGwpe3ZhciBoPW5ldyBvKDApLGY9bmV3IG8oMSk7bC5TeW0uc2lkZTxsLnNpZGUmJihsPWwuU3ltKTt2YXIgZz1sLlN5bS5uZXh0O3JldHVybiBmLm5leHQ9ZyxnLlN5bS5uZXh0PWgsaC5uZXh0PWwsbC5TeW0ubmV4dD1mLGguU3ltPWYsaC5PbmV4dD1oLGguTG5leHQ9ZixoLk9yZz1udWxsLGguTGZhY2U9bnVsbCxoLndpbmRpbmc9MCxoLmFjdGl2ZVJlZ2lvbj1udWxsLGYuU3ltPWgsZi5PbmV4dD1mLGYuTG5leHQ9aCxmLk9yZz1udWxsLGYuTGZhY2U9bnVsbCxmLndpbmRpbmc9MCxmLmFjdGl2ZVJlZ2lvbj1udWxsLGh9LHNwbGljZV86ZnVuY3Rpb24obCxoKXt2YXIgZj1sLk9uZXh0LGc9aC5PbmV4dDtmLlN5bS5MbmV4dD1oLGcuU3ltLkxuZXh0PWwsbC5PbmV4dD1nLGguT25leHQ9Zn0sbWFrZVZlcnRleF86ZnVuY3Rpb24obCxoLGYpe3ZhciBnPWw7YShnIT09bnVsbCk7dmFyIE09Zi5wcmV2O2cucHJldj1NLE0ubmV4dD1nLGcubmV4dD1mLGYucHJldj1nLGcuYW5FZGdlPWg7dmFyIEE9aDtkbyBBLk9yZz1nLEE9QS5PbmV4dDt3aGlsZShBIT09aCl9LG1ha2VGYWNlXzpmdW5jdGlvbihsLGgsZil7dmFyIGc9bDthKGchPT1udWxsKTt2YXIgTT1mLnByZXY7Zy5wcmV2PU0sTS5uZXh0PWcsZy5uZXh0PWYsZi5wcmV2PWcsZy5hbkVkZ2U9aCxnLnRyYWlsPW51bGwsZy5tYXJrZWQ9ITEsZy5pbnNpZGU9Zi5pbnNpZGU7dmFyIEE9aDtkbyBBLkxmYWNlPWcsQT1BLkxuZXh0O3doaWxlKEEhPT1oKX0sa2lsbEVkZ2VfOmZ1bmN0aW9uKGwpe2wuU3ltLnNpZGU8bC5zaWRlJiYobD1sLlN5bSk7dmFyIGg9bC5uZXh0LGY9bC5TeW0ubmV4dDtoLlN5bS5uZXh0PWYsZi5TeW0ubmV4dD1ofSxraWxsVmVydGV4XzpmdW5jdGlvbihsLGgpe3ZhciBmPWwuYW5FZGdlLGc9ZjtkbyBnLk9yZz1oLGc9Zy5PbmV4dDt3aGlsZShnIT09Zik7dmFyIE09bC5wcmV2LEE9bC5uZXh0O0EucHJldj1NLE0ubmV4dD1BfSxraWxsRmFjZV86ZnVuY3Rpb24obCxoKXt2YXIgZj1sLmFuRWRnZSxnPWY7ZG8gZy5MZmFjZT1oLGc9Zy5MbmV4dDt3aGlsZShnIT09Zik7dmFyIE09bC5wcmV2LEE9bC5uZXh0O0EucHJldj1NLE0ubmV4dD1BfSxtYWtlRWRnZTpmdW5jdGlvbigpe3ZhciBsPW5ldyBzLGg9bmV3IHMsZj1uZXcgaSxnPXRoaXMubWFrZUVkZ2VfKHRoaXMuZUhlYWQpO3JldHVybiB0aGlzLm1ha2VWZXJ0ZXhfKGwsZyx0aGlzLnZIZWFkKSx0aGlzLm1ha2VWZXJ0ZXhfKGgsZy5TeW0sdGhpcy52SGVhZCksdGhpcy5tYWtlRmFjZV8oZixnLHRoaXMuZkhlYWQpLGd9LHNwbGljZTpmdW5jdGlvbihsLGgpe3ZhciBmPSExLGc9ITE7aWYobCE9PWgpe2lmKGguT3JnIT09bC5PcmcmJihnPSEwLHRoaXMua2lsbFZlcnRleF8oaC5PcmcsbC5PcmcpKSxoLkxmYWNlIT09bC5MZmFjZSYmKGY9ITAsdGhpcy5raWxsRmFjZV8oaC5MZmFjZSxsLkxmYWNlKSksdGhpcy5zcGxpY2VfKGgsbCksIWcpe3ZhciBNPW5ldyBzO3RoaXMubWFrZVZlcnRleF8oTSxoLGwuT3JnKSxsLk9yZy5hbkVkZ2U9bH1pZighZil7dmFyIEE9bmV3IGk7dGhpcy5tYWtlRmFjZV8oQSxoLGwuTGZhY2UpLGwuTGZhY2UuYW5FZGdlPWx9fX0sZGVsZXRlOmZ1bmN0aW9uKGwpe3ZhciBoPWwuU3ltLGY9ITE7aWYobC5MZmFjZSE9PWwuUmZhY2UmJihmPSEwLHRoaXMua2lsbEZhY2VfKGwuTGZhY2UsbC5SZmFjZSkpLGwuT25leHQ9PT1sKXRoaXMua2lsbFZlcnRleF8obC5PcmcsbnVsbCk7ZWxzZSBpZihsLlJmYWNlLmFuRWRnZT1sLk9wcmV2LGwuT3JnLmFuRWRnZT1sLk9uZXh0LHRoaXMuc3BsaWNlXyhsLGwuT3ByZXYpLCFmKXt2YXIgZz1uZXcgaTt0aGlzLm1ha2VGYWNlXyhnLGwsbC5MZmFjZSl9aC5PbmV4dD09PWg/KHRoaXMua2lsbFZlcnRleF8oaC5PcmcsbnVsbCksdGhpcy5raWxsRmFjZV8oaC5MZmFjZSxudWxsKSk6KGwuTGZhY2UuYW5FZGdlPWguT3ByZXYsaC5PcmcuYW5FZGdlPWguT25leHQsdGhpcy5zcGxpY2VfKGgsaC5PcHJldikpLHRoaXMua2lsbEVkZ2VfKGwpfSxhZGRFZGdlVmVydGV4OmZ1bmN0aW9uKGwpe3ZhciBoPXRoaXMubWFrZUVkZ2VfKGwpLGY9aC5TeW07dGhpcy5zcGxpY2VfKGgsbC5MbmV4dCksaC5Pcmc9bC5Ec3Q7dmFyIGc9bmV3IHM7cmV0dXJuIHRoaXMubWFrZVZlcnRleF8oZyxmLGguT3JnKSxoLkxmYWNlPWYuTGZhY2U9bC5MZmFjZSxofSxzcGxpdEVkZ2U6ZnVuY3Rpb24obCxoKXt2YXIgZj10aGlzLmFkZEVkZ2VWZXJ0ZXgobCksZz1mLlN5bTtyZXR1cm4gdGhpcy5zcGxpY2VfKGwuU3ltLGwuU3ltLk9wcmV2KSx0aGlzLnNwbGljZV8obC5TeW0sZyksbC5Ec3Q9Zy5PcmcsZy5Ec3QuYW5FZGdlPWcuU3ltLGcuUmZhY2U9bC5SZmFjZSxnLndpbmRpbmc9bC53aW5kaW5nLGcuU3ltLndpbmRpbmc9bC5TeW0ud2luZGluZyxnfSxjb25uZWN0OmZ1bmN0aW9uKGwsaCl7dmFyIGY9ITEsZz10aGlzLm1ha2VFZGdlXyhsKSxNPWcuU3ltO2lmKGguTGZhY2UhPT1sLkxmYWNlJiYoZj0hMCx0aGlzLmtpbGxGYWNlXyhoLkxmYWNlLGwuTGZhY2UpKSx0aGlzLnNwbGljZV8oZyxsLkxuZXh0KSx0aGlzLnNwbGljZV8oTSxoKSxnLk9yZz1sLkRzdCxNLk9yZz1oLk9yZyxnLkxmYWNlPU0uTGZhY2U9bC5MZmFjZSxsLkxmYWNlLmFuRWRnZT1NLCFmKXt2YXIgQT1uZXcgaTt0aGlzLm1ha2VGYWNlXyhBLGcsbC5MZmFjZSl9cmV0dXJuIGd9LHphcEZhY2U6ZnVuY3Rpb24obCl7dmFyIGg9bC5hbkVkZ2UsZixnLE0sQSxDO2c9aC5MbmV4dDtkbyBmPWcsZz1mLkxuZXh0LGYuTGZhY2U9bnVsbCxmLlJmYWNlPT09bnVsbCYmKGYuT25leHQ9PT1mP3RoaXMua2lsbFZlcnRleF8oZi5PcmcsbnVsbCk6KGYuT3JnLmFuRWRnZT1mLk9uZXh0LHRoaXMuc3BsaWNlXyhmLGYuT3ByZXYpKSxNPWYuU3ltLE0uT25leHQ9PT1NP3RoaXMua2lsbFZlcnRleF8oTS5PcmcsbnVsbCk6KE0uT3JnLmFuRWRnZT1NLk9uZXh0LHRoaXMuc3BsaWNlXyhNLE0uT3ByZXYpKSx0aGlzLmtpbGxFZGdlXyhmKSk7d2hpbGUoZiE9aCk7QT1sLnByZXYsQz1sLm5leHQsQy5wcmV2PUEsQS5uZXh0PUN9LGNvdW50RmFjZVZlcnRzXzpmdW5jdGlvbihsKXt2YXIgaD1sLmFuRWRnZSxmPTA7ZG8gZisrLGg9aC5MbmV4dDt3aGlsZShoIT09bC5hbkVkZ2UpO3JldHVybiBmfSxtZXJnZUNvbnZleEZhY2VzOmZ1bmN0aW9uKGwpe3ZhciBoLGYsZyxNLEEsQyxiO2ZvcihoPXRoaXMuZkhlYWQubmV4dDtoIT09dGhpcy5mSGVhZDtoPWgubmV4dClpZihoLmluc2lkZSlmb3IoZj1oLmFuRWRnZSxBPWYuT3JnO2c9Zi5MbmV4dCxNPWYuU3ltLE0mJk0uTGZhY2UmJk0uTGZhY2UuaW5zaWRlJiYoQz10aGlzLmNvdW50RmFjZVZlcnRzXyhoKSxiPXRoaXMuY291bnRGYWNlVmVydHNfKE0uTGZhY2UpLEMrYi0yPD1sJiZuLnZlcnRDQ1coZi5McHJldi5PcmcsZi5PcmcsTS5MbmV4dC5MbmV4dC5PcmcpJiZuLnZlcnRDQ1coTS5McHJldi5PcmcsTS5PcmcsZi5MbmV4dC5MbmV4dC5PcmcpJiYoZz1NLkxuZXh0LHRoaXMuZGVsZXRlKE0pLGY9bnVsbCxNPW51bGwpKSwhKGYmJmYuTG5leHQuT3JnPT09QSk7KWY9ZztyZXR1cm4hMH0sY2hlY2s6ZnVuY3Rpb24oKXt2YXIgbD10aGlzLmZIZWFkLGg9dGhpcy52SGVhZCxmPXRoaXMuZUhlYWQsZyxNLEEsQyxiLEU7Zm9yKE09bCxNPWw7KGc9TS5uZXh0KSE9PWw7TT1nKXthKGcucHJldj09PU0pLGI9Zy5hbkVkZ2U7ZG8gYShiLlN5bSE9PWIpLGEoYi5TeW0uU3ltPT09YiksYShiLkxuZXh0Lk9uZXh0LlN5bT09PWIpLGEoYi5PbmV4dC5TeW0uTG5leHQ9PT1iKSxhKGIuTGZhY2U9PT1nKSxiPWIuTG5leHQ7d2hpbGUoYiE9PWcuYW5FZGdlKX1mb3IoYShnLnByZXY9PT1NJiZnLmFuRWRnZT09PW51bGwpLEM9aCxDPWg7KEE9Qy5uZXh0KSE9PWg7Qz1BKXthKEEucHJldj09PUMpLGI9QS5hbkVkZ2U7ZG8gYShiLlN5bSE9PWIpLGEoYi5TeW0uU3ltPT09YiksYShiLkxuZXh0Lk9uZXh0LlN5bT09PWIpLGEoYi5PbmV4dC5TeW0uTG5leHQ9PT1iKSxhKGIuT3JnPT09QSksYj1iLk9uZXh0O3doaWxlKGIhPT1BLmFuRWRnZSl9Zm9yKGEoQS5wcmV2PT09QyYmQS5hbkVkZ2U9PT1udWxsKSxFPWYsRT1mOyhiPUUubmV4dCkhPT1mO0U9YilhKGIuU3ltLm5leHQ9PT1FLlN5bSksYShiLlN5bSE9PWIpLGEoYi5TeW0uU3ltPT09YiksYShiLk9yZyE9PW51bGwpLGEoYi5Ec3QhPT1udWxsKSxhKGIuTG5leHQuT25leHQuU3ltPT09YiksYShiLk9uZXh0LlN5bS5MbmV4dD09PWIpO2EoYi5TeW0ubmV4dD09PUUuU3ltJiZiLlN5bT09PXRoaXMuZUhlYWRTeW0mJmIuU3ltLlN5bT09PWImJmIuT3JnPT09bnVsbCYmYi5Ec3Q9PT1udWxsJiZiLkxmYWNlPT09bnVsbCYmYi5SZmFjZT09PW51bGwpfX0sbi52ZXJ0RXE9ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5zPT09aC5zJiZsLnQ9PT1oLnR9LG4udmVydExlcT1mdW5jdGlvbihsLGgpe3JldHVybiBsLnM8aC5zfHxsLnM9PT1oLnMmJmwudDw9aC50fSxuLnRyYW5zTGVxPWZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwudDxoLnR8fGwudD09PWgudCYmbC5zPD1oLnN9LG4uZWRnZUdvZXNMZWZ0PWZ1bmN0aW9uKGwpe3JldHVybiBuLnZlcnRMZXEobC5Ec3QsbC5PcmcpfSxuLmVkZ2VHb2VzUmlnaHQ9ZnVuY3Rpb24obCl7cmV0dXJuIG4udmVydExlcShsLk9yZyxsLkRzdCl9LG4udmVydEwxZGlzdD1mdW5jdGlvbihsLGgpe3JldHVybiBNYXRoLmFicyhsLnMtaC5zKStNYXRoLmFicyhsLnQtaC50KX0sbi5lZGdlRXZhbD1mdW5jdGlvbihsLGgsZil7YShuLnZlcnRMZXEobCxoKSYmbi52ZXJ0TGVxKGgsZikpO3ZhciBnPWgucy1sLnMsTT1mLnMtaC5zO3JldHVybiBnK00+MD9nPE0/aC50LWwudCsobC50LWYudCkqKGcvKGcrTSkpOmgudC1mLnQrKGYudC1sLnQpKihNLyhnK00pKTowfSxuLmVkZ2VTaWduPWZ1bmN0aW9uKGwsaCxmKXthKG4udmVydExlcShsLGgpJiZuLnZlcnRMZXEoaCxmKSk7dmFyIGc9aC5zLWwucyxNPWYucy1oLnM7cmV0dXJuIGcrTT4wPyhoLnQtZi50KSpnKyhoLnQtbC50KSpNOjB9LG4udHJhbnNFdmFsPWZ1bmN0aW9uKGwsaCxmKXthKG4udHJhbnNMZXEobCxoKSYmbi50cmFuc0xlcShoLGYpKTt2YXIgZz1oLnQtbC50LE09Zi50LWgudDtyZXR1cm4gZytNPjA/ZzxNP2gucy1sLnMrKGwucy1mLnMpKihnLyhnK00pKTpoLnMtZi5zKyhmLnMtbC5zKSooTS8oZytNKSk6MH0sbi50cmFuc1NpZ249ZnVuY3Rpb24obCxoLGYpe2Eobi50cmFuc0xlcShsLGgpJiZuLnRyYW5zTGVxKGgsZikpO3ZhciBnPWgudC1sLnQsTT1mLnQtaC50O3JldHVybiBnK00+MD8oaC5zLWYucykqZysoaC5zLWwucykqTTowfSxuLnZlcnRDQ1c9ZnVuY3Rpb24obCxoLGYpe3JldHVybiBsLnMqKGgudC1mLnQpK2gucyooZi50LWwudCkrZi5zKihsLnQtaC50KT49MH0sbi5pbnRlcnBvbGF0ZT1mdW5jdGlvbihsLGgsZixnKXtyZXR1cm4gbD1sPDA/MDpsLGY9ZjwwPzA6ZixsPD1mP2Y9PT0wPyhoK2cpLzI6aCsoZy1oKSoobC8obCtmKSk6ZysoaC1nKSooZi8obCtmKSl9LG4uaW50ZXJzZWN0PWZ1bmN0aW9uKGwsaCxmLGcsTSl7dmFyIEEsQyxiO24udmVydExlcShsLGgpfHwoYj1sLGw9aCxoPWIpLG4udmVydExlcShmLGcpfHwoYj1mLGY9ZyxnPWIpLG4udmVydExlcShsLGYpfHwoYj1sLGw9ZixmPWIsYj1oLGg9ZyxnPWIpLG4udmVydExlcShmLGgpP24udmVydExlcShoLGcpPyhBPW4uZWRnZUV2YWwobCxmLGgpLEM9bi5lZGdlRXZhbChmLGgsZyksQStDPDAmJihBPS1BLEM9LUMpLE0ucz1uLmludGVycG9sYXRlKEEsZi5zLEMsaC5zKSk6KEE9bi5lZGdlU2lnbihsLGYsaCksQz0tbi5lZGdlU2lnbihsLGcsaCksQStDPDAmJihBPS1BLEM9LUMpLE0ucz1uLmludGVycG9sYXRlKEEsZi5zLEMsZy5zKSk6TS5zPShmLnMraC5zKS8yLG4udHJhbnNMZXEobCxoKXx8KGI9bCxsPWgsaD1iKSxuLnRyYW5zTGVxKGYsZyl8fChiPWYsZj1nLGc9Yiksbi50cmFuc0xlcShsLGYpfHwoYj1sLGw9ZixmPWIsYj1oLGg9ZyxnPWIpLG4udHJhbnNMZXEoZixoKT9uLnRyYW5zTGVxKGgsZyk/KEE9bi50cmFuc0V2YWwobCxmLGgpLEM9bi50cmFuc0V2YWwoZixoLGcpLEErQzwwJiYoQT0tQSxDPS1DKSxNLnQ9bi5pbnRlcnBvbGF0ZShBLGYudCxDLGgudCkpOihBPW4udHJhbnNTaWduKGwsZixoKSxDPS1uLnRyYW5zU2lnbihsLGcsaCksQStDPDAmJihBPS1BLEM9LUMpLE0udD1uLmludGVycG9sYXRlKEEsZi50LEMsZy50KSk6TS50PShmLnQraC50KS8yfTtmdW5jdGlvbiBtKCl7dGhpcy5rZXk9bnVsbCx0aGlzLm5leHQ9bnVsbCx0aGlzLnByZXY9bnVsbH1mdW5jdGlvbiB1KGwsaCl7dGhpcy5oZWFkPW5ldyBtLHRoaXMuaGVhZC5uZXh0PXRoaXMuaGVhZCx0aGlzLmhlYWQucHJldj10aGlzLmhlYWQsdGhpcy5mcmFtZT1sLHRoaXMubGVxPWh9dS5wcm90b3R5cGU9e21pbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhlYWQubmV4dH0sbWF4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGVhZC5wcmV2fSxpbnNlcnQ6ZnVuY3Rpb24obCl7cmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKHRoaXMuaGVhZCxsKX0sc2VhcmNoOmZ1bmN0aW9uKGwpe3ZhciBoPXRoaXMuaGVhZDtkbyBoPWgubmV4dDt3aGlsZShoLmtleSE9PW51bGwmJiF0aGlzLmxlcSh0aGlzLmZyYW1lLGwsaC5rZXkpKTtyZXR1cm4gaH0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKGwsaCl7ZG8gbD1sLnByZXY7d2hpbGUobC5rZXkhPT1udWxsJiYhdGhpcy5sZXEodGhpcy5mcmFtZSxsLmtleSxoKSk7dmFyIGY9bmV3IG07cmV0dXJuIGYua2V5PWgsZi5uZXh0PWwubmV4dCxsLm5leHQucHJldj1mLGYucHJldj1sLGwubmV4dD1mLGZ9LGRlbGV0ZTpmdW5jdGlvbihsKXtsLm5leHQucHJldj1sLnByZXYsbC5wcmV2Lm5leHQ9bC5uZXh0fX07ZnVuY3Rpb24gcCgpe3RoaXMuaGFuZGxlPW51bGx9ZnVuY3Rpb24geSgpe3RoaXMua2V5PW51bGwsdGhpcy5ub2RlPW51bGx9ZnVuY3Rpb24gTyhsLGgpe3RoaXMuc2l6ZT0wLHRoaXMubWF4PWwsdGhpcy5ub2Rlcz1bXSx0aGlzLm5vZGVzLmxlbmd0aD1sKzE7dmFyIGY7Zm9yKGY9MDtmPHRoaXMubm9kZXMubGVuZ3RoO2YrKyl0aGlzLm5vZGVzW2ZdPW5ldyBwO2Zvcih0aGlzLmhhbmRsZXM9W10sdGhpcy5oYW5kbGVzLmxlbmd0aD1sKzEsZj0wO2Y8dGhpcy5oYW5kbGVzLmxlbmd0aDtmKyspdGhpcy5oYW5kbGVzW2ZdPW5ldyB5O3RoaXMuaW5pdGlhbGl6ZWQ9ITEsdGhpcy5mcmVlTGlzdD0wLHRoaXMubGVxPWgsdGhpcy5ub2Rlc1sxXS5oYW5kbGU9MSx0aGlzLmhhbmRsZXNbMV0ua2V5PW51bGx9Ty5wcm90b3R5cGU9e2Zsb2F0RG93bl86ZnVuY3Rpb24obCl7dmFyIGg9dGhpcy5ub2RlcyxmPXRoaXMuaGFuZGxlcyxnLE0sQTtmb3IoZz1oW2xdLmhhbmRsZTs7KXtpZihBPWw8PDEsQTx0aGlzLnNpemUmJnRoaXMubGVxKGZbaFtBKzFdLmhhbmRsZV0ua2V5LGZbaFtBXS5oYW5kbGVdLmtleSkmJisrQSxhKEE8PXRoaXMubWF4KSxNPWhbQV0uaGFuZGxlLEE+dGhpcy5zaXplfHx0aGlzLmxlcShmW2ddLmtleSxmW01dLmtleSkpe2hbbF0uaGFuZGxlPWcsZltnXS5ub2RlPWw7YnJlYWt9aFtsXS5oYW5kbGU9TSxmW01dLm5vZGU9bCxsPUF9fSxmbG9hdFVwXzpmdW5jdGlvbihsKXt2YXIgaD10aGlzLm5vZGVzLGY9dGhpcy5oYW5kbGVzLGcsTSxBO2ZvcihnPWhbbF0uaGFuZGxlOzspe2lmKEE9bD4+MSxNPWhbQV0uaGFuZGxlLEE9PT0wfHx0aGlzLmxlcShmW01dLmtleSxmW2ddLmtleSkpe2hbbF0uaGFuZGxlPWcsZltnXS5ub2RlPWw7YnJlYWt9aFtsXS5oYW5kbGU9TSxmW01dLm5vZGU9bCxsPUF9fSxpbml0OmZ1bmN0aW9uKCl7Zm9yKHZhciBsPXRoaXMuc2l6ZTtsPj0xOy0tbCl0aGlzLmZsb2F0RG93bl8obCk7dGhpcy5pbml0aWFsaXplZD0hMH0sbWluOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGFuZGxlc1t0aGlzLm5vZGVzWzFdLmhhbmRsZV0ua2V5fSxpbnNlcnQ6ZnVuY3Rpb24obCl7dmFyIGgsZjtpZihoPSsrdGhpcy5zaXplLGgqMj50aGlzLm1heCl7dGhpcy5tYXgqPTI7dmFyIGcsTTtmb3IoTT10aGlzLm5vZGVzLmxlbmd0aCx0aGlzLm5vZGVzLmxlbmd0aD10aGlzLm1heCsxLGc9TTtnPHRoaXMubm9kZXMubGVuZ3RoO2crKyl0aGlzLm5vZGVzW2ddPW5ldyBwO2ZvcihNPXRoaXMuaGFuZGxlcy5sZW5ndGgsdGhpcy5oYW5kbGVzLmxlbmd0aD10aGlzLm1heCsxLGc9TTtnPHRoaXMuaGFuZGxlcy5sZW5ndGg7ZysrKXRoaXMuaGFuZGxlc1tnXT1uZXcgeX1yZXR1cm4gdGhpcy5mcmVlTGlzdD09PTA/Zj1oOihmPXRoaXMuZnJlZUxpc3QsdGhpcy5mcmVlTGlzdD10aGlzLmhhbmRsZXNbZl0ubm9kZSksdGhpcy5ub2Rlc1toXS5oYW5kbGU9Zix0aGlzLmhhbmRsZXNbZl0ubm9kZT1oLHRoaXMuaGFuZGxlc1tmXS5rZXk9bCx0aGlzLmluaXRpYWxpemVkJiZ0aGlzLmZsb2F0VXBfKGgpLGZ9LGV4dHJhY3RNaW46ZnVuY3Rpb24oKXt2YXIgbD10aGlzLm5vZGVzLGg9dGhpcy5oYW5kbGVzLGY9bFsxXS5oYW5kbGUsZz1oW2ZdLmtleTtyZXR1cm4gdGhpcy5zaXplPjAmJihsWzFdLmhhbmRsZT1sW3RoaXMuc2l6ZV0uaGFuZGxlLGhbbFsxXS5oYW5kbGVdLm5vZGU9MSxoW2ZdLmtleT1udWxsLGhbZl0ubm9kZT10aGlzLmZyZWVMaXN0LHRoaXMuZnJlZUxpc3Q9ZiwtLXRoaXMuc2l6ZSx0aGlzLnNpemU+MCYmdGhpcy5mbG9hdERvd25fKDEpKSxnfSxkZWxldGU6ZnVuY3Rpb24obCl7dmFyIGg9dGhpcy5ub2RlcyxmPXRoaXMuaGFuZGxlcyxnO2EobD49MSYmbDw9dGhpcy5tYXgmJmZbbF0ua2V5IT09bnVsbCksZz1mW2xdLm5vZGUsaFtnXS5oYW5kbGU9aFt0aGlzLnNpemVdLmhhbmRsZSxmW2hbZ10uaGFuZGxlXS5ub2RlPWcsLS10aGlzLnNpemUsZzw9dGhpcy5zaXplJiYoZzw9MXx8dGhpcy5sZXEoZltoW2c+PjFdLmhhbmRsZV0ua2V5LGZbaFtnXS5oYW5kbGVdLmtleSk/dGhpcy5mbG9hdERvd25fKGcpOnRoaXMuZmxvYXRVcF8oZykpLGZbbF0ua2V5PW51bGwsZltsXS5ub2RlPXRoaXMuZnJlZUxpc3QsdGhpcy5mcmVlTGlzdD1sfX07ZnVuY3Rpb24geCgpe3RoaXMuZVVwPW51bGwsdGhpcy5ub2RlVXA9bnVsbCx0aGlzLndpbmRpbmdOdW1iZXI9MCx0aGlzLmluc2lkZT0hMSx0aGlzLnNlbnRpbmVsPSExLHRoaXMuZGlydHk9ITEsdGhpcy5maXhVcHBlckVkZ2U9ITF9dmFyIHY9e307di5yZWdpb25CZWxvdz1mdW5jdGlvbihsKXtyZXR1cm4gbC5ub2RlVXAucHJldi5rZXl9LHYucmVnaW9uQWJvdmU9ZnVuY3Rpb24obCl7cmV0dXJuIGwubm9kZVVwLm5leHQua2V5fSx2LmRlYnVnRXZlbnQ9ZnVuY3Rpb24obCl7fSx2LmFkZFdpbmRpbmc9ZnVuY3Rpb24obCxoKXtsLndpbmRpbmcrPWgud2luZGluZyxsLlN5bS53aW5kaW5nKz1oLlN5bS53aW5kaW5nfSx2LmVkZ2VMZXE9ZnVuY3Rpb24obCxoLGYpe3ZhciBnPWwuZXZlbnQsQyxiLE09aC5lVXAsQT1mLmVVcDtpZihNLkRzdD09PWcpcmV0dXJuIEEuRHN0PT09Zz9uLnZlcnRMZXEoTS5PcmcsQS5PcmcpP24uZWRnZVNpZ24oQS5Ec3QsTS5PcmcsQS5PcmcpPD0wOm4uZWRnZVNpZ24oTS5Ec3QsQS5PcmcsTS5PcmcpPj0wOm4uZWRnZVNpZ24oQS5Ec3QsZyxBLk9yZyk8PTA7aWYoQS5Ec3Q9PT1nKXJldHVybiBuLmVkZ2VTaWduKE0uRHN0LGcsTS5PcmcpPj0wO3ZhciBDPW4uZWRnZUV2YWwoTS5Ec3QsZyxNLk9yZyksYj1uLmVkZ2VFdmFsKEEuRHN0LGcsQS5PcmcpO3JldHVybiBDPj1ifSx2LmRlbGV0ZVJlZ2lvbj1mdW5jdGlvbihsLGgpe2guZml4VXBwZXJFZGdlJiZhKGguZVVwLndpbmRpbmc9PT0wKSxoLmVVcC5hY3RpdmVSZWdpb249bnVsbCxsLmRpY3QuZGVsZXRlKGgubm9kZVVwKX0sdi5maXhVcHBlckVkZ2U9ZnVuY3Rpb24obCxoLGYpe2EoaC5maXhVcHBlckVkZ2UpLGwubWVzaC5kZWxldGUoaC5lVXApLGguZml4VXBwZXJFZGdlPSExLGguZVVwPWYsZi5hY3RpdmVSZWdpb249aH0sdi50b3BMZWZ0UmVnaW9uPWZ1bmN0aW9uKGwsaCl7dmFyIGY9aC5lVXAuT3JnLGc7ZG8gaD12LnJlZ2lvbkFib3ZlKGgpO3doaWxlKGguZVVwLk9yZz09PWYpO2lmKGguZml4VXBwZXJFZGdlKXtpZihnPWwubWVzaC5jb25uZWN0KHYucmVnaW9uQmVsb3coaCkuZVVwLlN5bSxoLmVVcC5MbmV4dCksZz09PW51bGwpcmV0dXJuIG51bGw7di5maXhVcHBlckVkZ2UobCxoLGcpLGg9di5yZWdpb25BYm92ZShoKX1yZXR1cm4gaH0sdi50b3BSaWdodFJlZ2lvbj1mdW5jdGlvbihsKXt2YXIgaD1sLmVVcC5Ec3Q7ZG8gbD12LnJlZ2lvbkFib3ZlKGwpO3doaWxlKGwuZVVwLkRzdD09PWgpO3JldHVybiBsfSx2LmFkZFJlZ2lvbkJlbG93PWZ1bmN0aW9uKGwsaCxmKXt2YXIgZz1uZXcgeDtyZXR1cm4gZy5lVXA9ZixnLm5vZGVVcD1sLmRpY3QuaW5zZXJ0QmVmb3JlKGgubm9kZVVwLGcpLGcuZml4VXBwZXJFZGdlPSExLGcuc2VudGluZWw9ITEsZy5kaXJ0eT0hMSxmLmFjdGl2ZVJlZ2lvbj1nLGd9LHYuaXNXaW5kaW5nSW5zaWRlPWZ1bmN0aW9uKGwsaCl7c3dpdGNoKGwud2luZGluZ1J1bGUpe2Nhc2UgZS5XSU5ESU5HX09ERDpyZXR1cm4oaCYxKSE9PTA7Y2FzZSBlLldJTkRJTkdfTk9OWkVSTzpyZXR1cm4gaCE9PTA7Y2FzZSBlLldJTkRJTkdfUE9TSVRJVkU6cmV0dXJuIGg+MDtjYXNlIGUuV0lORElOR19ORUdBVElWRTpyZXR1cm4gaDwwO2Nhc2UgZS5XSU5ESU5HX0FCU19HRVFfVFdPOnJldHVybiBoPj0yfHxoPD0tMn1yZXR1cm4gYSghMSksITF9LHYuY29tcHV0ZVdpbmRpbmc9ZnVuY3Rpb24obCxoKXtoLndpbmRpbmdOdW1iZXI9di5yZWdpb25BYm92ZShoKS53aW5kaW5nTnVtYmVyK2guZVVwLndpbmRpbmcsaC5pbnNpZGU9di5pc1dpbmRpbmdJbnNpZGUobCxoLndpbmRpbmdOdW1iZXIpfSx2LmZpbmlzaFJlZ2lvbj1mdW5jdGlvbihsLGgpe3ZhciBmPWguZVVwLGc9Zi5MZmFjZTtnLmluc2lkZT1oLmluc2lkZSxnLmFuRWRnZT1mLHYuZGVsZXRlUmVnaW9uKGwsaCl9LHYuZmluaXNoTGVmdFJlZ2lvbnM9ZnVuY3Rpb24obCxoLGYpe2Zvcih2YXIgZyxDLE09bnVsbCxBPWgsQz1oLmVVcDtBIT09Zjspe2lmKEEuZml4VXBwZXJFZGdlPSExLE09di5yZWdpb25CZWxvdyhBKSxnPU0uZVVwLGcuT3JnIT1DLk9yZyl7aWYoIU0uZml4VXBwZXJFZGdlKXt2LmZpbmlzaFJlZ2lvbihsLEEpO2JyZWFrfWc9bC5tZXNoLmNvbm5lY3QoQy5McHJldixnLlN5bSksdi5maXhVcHBlckVkZ2UobCxNLGcpfUMuT25leHQhPT1nJiYobC5tZXNoLnNwbGljZShnLk9wcmV2LGcpLGwubWVzaC5zcGxpY2UoQyxnKSksdi5maW5pc2hSZWdpb24obCxBKSxDPU0uZVVwLEE9TX1yZXR1cm4gQ30sdi5hZGRSaWdodEVkZ2VzPWZ1bmN0aW9uKGwsaCxmLGcsTSxBKXt2YXIgQyxiLEUsTCxEPSEwO0U9ZjtkbyBhKG4udmVydExlcShFLk9yZyxFLkRzdCkpLHYuYWRkUmVnaW9uQmVsb3cobCxoLEUuU3ltKSxFPUUuT25leHQ7d2hpbGUoRSE9PWcpO2ZvcihNPT09bnVsbCYmKE09di5yZWdpb25CZWxvdyhoKS5lVXAuUnByZXYpLGI9aCxMPU07Qz12LnJlZ2lvbkJlbG93KGIpLEU9Qy5lVXAuU3ltLEUuT3JnPT09TC5Pcmc7KUUuT25leHQhPT1MJiYobC5tZXNoLnNwbGljZShFLk9wcmV2LEUpLGwubWVzaC5zcGxpY2UoTC5PcHJldixFKSksQy53aW5kaW5nTnVtYmVyPWIud2luZGluZ051bWJlci1FLndpbmRpbmcsQy5pbnNpZGU9di5pc1dpbmRpbmdJbnNpZGUobCxDLndpbmRpbmdOdW1iZXIpLGIuZGlydHk9ITAsIUQmJnYuY2hlY2tGb3JSaWdodFNwbGljZShsLGIpJiYodi5hZGRXaW5kaW5nKEUsTCksdi5kZWxldGVSZWdpb24obCxiKSxsLm1lc2guZGVsZXRlKEwpKSxEPSExLGI9QyxMPUU7Yi5kaXJ0eT0hMCxhKGIud2luZGluZ051bWJlci1FLndpbmRpbmc9PT1DLndpbmRpbmdOdW1iZXIpLEEmJnYud2Fsa0RpcnR5UmVnaW9ucyhsLGIpfSx2LnNwbGljZU1lcmdlVmVydGljZXM9ZnVuY3Rpb24obCxoLGYpe2wubWVzaC5zcGxpY2UoaCxmKX0sdi52ZXJ0ZXhXZWlnaHRzPWZ1bmN0aW9uKGwsaCxmKXt2YXIgZz1uLnZlcnRMMWRpc3QoaCxsKSxNPW4udmVydEwxZGlzdChmLGwpLEE9LjUqTS8oZytNKSxDPS41KmcvKGcrTSk7bC5jb29yZHNbMF0rPUEqaC5jb29yZHNbMF0rQypmLmNvb3Jkc1swXSxsLmNvb3Jkc1sxXSs9QSpoLmNvb3Jkc1sxXStDKmYuY29vcmRzWzFdLGwuY29vcmRzWzJdKz1BKmguY29vcmRzWzJdK0MqZi5jb29yZHNbMl19LHYuZ2V0SW50ZXJzZWN0RGF0YT1mdW5jdGlvbihsLGgsZixnLE0sQSl7aC5jb29yZHNbMF09aC5jb29yZHNbMV09aC5jb29yZHNbMl09MCxoLmlkeD0tMSx2LnZlcnRleFdlaWdodHMoaCxmLGcpLHYudmVydGV4V2VpZ2h0cyhoLE0sQSl9LHYuY2hlY2tGb3JSaWdodFNwbGljZT1mdW5jdGlvbihsLGgpe3ZhciBmPXYucmVnaW9uQmVsb3coaCksZz1oLmVVcCxNPWYuZVVwO2lmKG4udmVydExlcShnLk9yZyxNLk9yZykpe2lmKG4uZWRnZVNpZ24oTS5Ec3QsZy5PcmcsTS5PcmcpPjApcmV0dXJuITE7bi52ZXJ0RXEoZy5PcmcsTS5PcmcpP2cuT3JnIT09TS5PcmcmJihsLnBxLmRlbGV0ZShnLk9yZy5wcUhhbmRsZSksdi5zcGxpY2VNZXJnZVZlcnRpY2VzKGwsTS5PcHJldixnKSk6KGwubWVzaC5zcGxpdEVkZ2UoTS5TeW0pLGwubWVzaC5zcGxpY2UoZyxNLk9wcmV2KSxoLmRpcnR5PWYuZGlydHk9ITApfWVsc2V7aWYobi5lZGdlU2lnbihnLkRzdCxNLk9yZyxnLk9yZyk8MClyZXR1cm4hMTt2LnJlZ2lvbkFib3ZlKGgpLmRpcnR5PWguZGlydHk9ITAsbC5tZXNoLnNwbGl0RWRnZShnLlN5bSksbC5tZXNoLnNwbGljZShNLk9wcmV2LGcpfXJldHVybiEwfSx2LmNoZWNrRm9yTGVmdFNwbGljZT1mdW5jdGlvbihsLGgpe3ZhciBmPXYucmVnaW9uQmVsb3coaCksZz1oLmVVcCxNPWYuZVVwLEE7aWYoYSghbi52ZXJ0RXEoZy5Ec3QsTS5Ec3QpKSxuLnZlcnRMZXEoZy5Ec3QsTS5Ec3QpKXtpZihuLmVkZ2VTaWduKGcuRHN0LE0uRHN0LGcuT3JnKTwwKXJldHVybiExO3YucmVnaW9uQWJvdmUoaCkuZGlydHk9aC5kaXJ0eT0hMCxBPWwubWVzaC5zcGxpdEVkZ2UoZyksbC5tZXNoLnNwbGljZShNLlN5bSxBKSxBLkxmYWNlLmluc2lkZT1oLmluc2lkZX1lbHNle2lmKG4uZWRnZVNpZ24oTS5Ec3QsZy5Ec3QsTS5PcmcpPjApcmV0dXJuITE7aC5kaXJ0eT1mLmRpcnR5PSEwLEE9bC5tZXNoLnNwbGl0RWRnZShNKSxsLm1lc2guc3BsaWNlKGcuTG5leHQsTS5TeW0pLEEuUmZhY2UuaW5zaWRlPWguaW5zaWRlfXJldHVybiEwfSx2LmNoZWNrRm9ySW50ZXJzZWN0PWZ1bmN0aW9uKGwsaCl7dmFyIGY9di5yZWdpb25CZWxvdyhoKSxnPWguZVVwLE09Zi5lVXAsQT1nLk9yZyxDPU0uT3JnLGI9Zy5Ec3QsRT1NLkRzdCxMLEQsST1uZXcgcyxSLEI7aWYoYSghbi52ZXJ0RXEoRSxiKSksYShuLmVkZ2VTaWduKGIsbC5ldmVudCxBKTw9MCksYShuLmVkZ2VTaWduKEUsbC5ldmVudCxDKT49MCksYShBIT09bC5ldmVudCYmQyE9PWwuZXZlbnQpLGEoIWguZml4VXBwZXJFZGdlJiYhZi5maXhVcHBlckVkZ2UpLEE9PT1DfHwoTD1NYXRoLm1pbihBLnQsYi50KSxEPU1hdGgubWF4KEMudCxFLnQpLEw+RCkpcmV0dXJuITE7aWYobi52ZXJ0TGVxKEEsQykpe2lmKG4uZWRnZVNpZ24oRSxBLEMpPjApcmV0dXJuITF9ZWxzZSBpZihuLmVkZ2VTaWduKGIsQyxBKTwwKXJldHVybiExO3JldHVybiB2LmRlYnVnRXZlbnQobCksbi5pbnRlcnNlY3QoYixBLEUsQyxJKSxhKE1hdGgubWluKEEudCxiLnQpPD1JLnQpLGEoSS50PD1NYXRoLm1heChDLnQsRS50KSksYShNYXRoLm1pbihFLnMsYi5zKTw9SS5zKSxhKEkuczw9TWF0aC5tYXgoQy5zLEEucykpLG4udmVydExlcShJLGwuZXZlbnQpJiYoSS5zPWwuZXZlbnQucyxJLnQ9bC5ldmVudC50KSxSPW4udmVydExlcShBLEMpP0E6QyxuLnZlcnRMZXEoUixJKSYmKEkucz1SLnMsSS50PVIudCksbi52ZXJ0RXEoSSxBKXx8bi52ZXJ0RXEoSSxDKT8odi5jaGVja0ZvclJpZ2h0U3BsaWNlKGwsaCksITEpOiFuLnZlcnRFcShiLGwuZXZlbnQpJiZuLmVkZ2VTaWduKGIsbC5ldmVudCxJKT49MHx8IW4udmVydEVxKEUsbC5ldmVudCkmJm4uZWRnZVNpZ24oRSxsLmV2ZW50LEkpPD0wP0U9PT1sLmV2ZW50PyhsLm1lc2guc3BsaXRFZGdlKGcuU3ltKSxsLm1lc2guc3BsaWNlKE0uU3ltLGcpLGg9di50b3BMZWZ0UmVnaW9uKGwsaCksZz12LnJlZ2lvbkJlbG93KGgpLmVVcCx2LmZpbmlzaExlZnRSZWdpb25zKGwsdi5yZWdpb25CZWxvdyhoKSxmKSx2LmFkZFJpZ2h0RWRnZXMobCxoLGcuT3ByZXYsZyxnLCEwKSwhMCk6Yj09PWwuZXZlbnQ/KGwubWVzaC5zcGxpdEVkZ2UoTS5TeW0pLGwubWVzaC5zcGxpY2UoZy5MbmV4dCxNLk9wcmV2KSxmPWgsaD12LnRvcFJpZ2h0UmVnaW9uKGgpLEI9di5yZWdpb25CZWxvdyhoKS5lVXAuUnByZXYsZi5lVXA9TS5PcHJldixNPXYuZmluaXNoTGVmdFJlZ2lvbnMobCxmLG51bGwpLHYuYWRkUmlnaHRFZGdlcyhsLGgsTS5PbmV4dCxnLlJwcmV2LEIsITApLCEwKToobi5lZGdlU2lnbihiLGwuZXZlbnQsSSk+PTAmJih2LnJlZ2lvbkFib3ZlKGgpLmRpcnR5PWguZGlydHk9ITAsbC5tZXNoLnNwbGl0RWRnZShnLlN5bSksZy5Pcmcucz1sLmV2ZW50LnMsZy5PcmcudD1sLmV2ZW50LnQpLG4uZWRnZVNpZ24oRSxsLmV2ZW50LEkpPD0wJiYoaC5kaXJ0eT1mLmRpcnR5PSEwLGwubWVzaC5zcGxpdEVkZ2UoTS5TeW0pLE0uT3JnLnM9bC5ldmVudC5zLE0uT3JnLnQ9bC5ldmVudC50KSwhMSk6KGwubWVzaC5zcGxpdEVkZ2UoZy5TeW0pLGwubWVzaC5zcGxpdEVkZ2UoTS5TeW0pLGwubWVzaC5zcGxpY2UoTS5PcHJldixnKSxnLk9yZy5zPUkucyxnLk9yZy50PUkudCxnLk9yZy5wcUhhbmRsZT1sLnBxLmluc2VydChnLk9yZyksdi5nZXRJbnRlcnNlY3REYXRhKGwsZy5PcmcsQSxiLEMsRSksdi5yZWdpb25BYm92ZShoKS5kaXJ0eT1oLmRpcnR5PWYuZGlydHk9ITAsITEpfSx2LndhbGtEaXJ0eVJlZ2lvbnM9ZnVuY3Rpb24obCxoKXtmb3IodmFyIGY9di5yZWdpb25CZWxvdyhoKSxnLE07Oyl7Zm9yKDtmLmRpcnR5OyloPWYsZj12LnJlZ2lvbkJlbG93KGYpO2lmKCFoLmRpcnR5JiYoZj1oLGg9di5yZWdpb25BYm92ZShoKSxoPT09bnVsbHx8IWguZGlydHkpKXJldHVybjtpZihoLmRpcnR5PSExLGc9aC5lVXAsTT1mLmVVcCxnLkRzdCE9PU0uRHN0JiZ2LmNoZWNrRm9yTGVmdFNwbGljZShsLGgpJiYoZi5maXhVcHBlckVkZ2U/KHYuZGVsZXRlUmVnaW9uKGwsZiksbC5tZXNoLmRlbGV0ZShNKSxmPXYucmVnaW9uQmVsb3coaCksTT1mLmVVcCk6aC5maXhVcHBlckVkZ2UmJih2LmRlbGV0ZVJlZ2lvbihsLGgpLGwubWVzaC5kZWxldGUoZyksaD12LnJlZ2lvbkFib3ZlKGYpLGc9aC5lVXApKSxnLk9yZyE9PU0uT3JnKWlmKGcuRHN0IT09TS5Ec3QmJiFoLmZpeFVwcGVyRWRnZSYmIWYuZml4VXBwZXJFZGdlJiYoZy5Ec3Q9PT1sLmV2ZW50fHxNLkRzdD09PWwuZXZlbnQpKXtpZih2LmNoZWNrRm9ySW50ZXJzZWN0KGwsaCkpcmV0dXJufWVsc2Ugdi5jaGVja0ZvclJpZ2h0U3BsaWNlKGwsaCk7Zy5Pcmc9PT1NLk9yZyYmZy5Ec3Q9PT1NLkRzdCYmKHYuYWRkV2luZGluZyhNLGcpLHYuZGVsZXRlUmVnaW9uKGwsaCksbC5tZXNoLmRlbGV0ZShnKSxoPXYucmVnaW9uQWJvdmUoZikpfX0sdi5jb25uZWN0UmlnaHRWZXJ0ZXg9ZnVuY3Rpb24obCxoLGYpe3ZhciBnLE09Zi5PbmV4dCxBPXYucmVnaW9uQmVsb3coaCksQz1oLmVVcCxiPUEuZVVwLEU9ITE7aWYoQy5Ec3QhPT1iLkRzdCYmdi5jaGVja0ZvckludGVyc2VjdChsLGgpLG4udmVydEVxKEMuT3JnLGwuZXZlbnQpJiYobC5tZXNoLnNwbGljZShNLk9wcmV2LEMpLGg9di50b3BMZWZ0UmVnaW9uKGwsaCksTT12LnJlZ2lvbkJlbG93KGgpLmVVcCx2LmZpbmlzaExlZnRSZWdpb25zKGwsdi5yZWdpb25CZWxvdyhoKSxBKSxFPSEwKSxuLnZlcnRFcShiLk9yZyxsLmV2ZW50KSYmKGwubWVzaC5zcGxpY2UoZixiLk9wcmV2KSxmPXYuZmluaXNoTGVmdFJlZ2lvbnMobCxBLG51bGwpLEU9ITApLEUpe3YuYWRkUmlnaHRFZGdlcyhsLGgsZi5PbmV4dCxNLE0sITApO3JldHVybn1uLnZlcnRMZXEoYi5PcmcsQy5PcmcpP2c9Yi5PcHJldjpnPUMsZz1sLm1lc2guY29ubmVjdChmLkxwcmV2LGcpLHYuYWRkUmlnaHRFZGdlcyhsLGgsZyxnLk9uZXh0LGcuT25leHQsITEpLGcuU3ltLmFjdGl2ZVJlZ2lvbi5maXhVcHBlckVkZ2U9ITAsdi53YWxrRGlydHlSZWdpb25zKGwsaCl9LHYuY29ubmVjdExlZnREZWdlbmVyYXRlPWZ1bmN0aW9uKGwsaCxmKXt2YXIgZyxNLEEsQyxiO2lmKGc9aC5lVXAsbi52ZXJ0RXEoZy5PcmcsZikpe2EoITEpLHYuc3BsaWNlTWVyZ2VWZXJ0aWNlcyhsLGcsZi5hbkVkZ2UpO3JldHVybn1pZighbi52ZXJ0RXEoZy5Ec3QsZikpe2wubWVzaC5zcGxpdEVkZ2UoZy5TeW0pLGguZml4VXBwZXJFZGdlJiYobC5tZXNoLmRlbGV0ZShnLk9uZXh0KSxoLmZpeFVwcGVyRWRnZT0hMSksbC5tZXNoLnNwbGljZShmLmFuRWRnZSxnKSx2LnN3ZWVwRXZlbnQobCxmKTtyZXR1cm59YSghMSksaD12LnRvcFJpZ2h0UmVnaW9uKGgpLGI9di5yZWdpb25CZWxvdyhoKSxBPWIuZVVwLlN5bSxNPUM9QS5PbmV4dCxiLmZpeFVwcGVyRWRnZSYmKGEoTSE9PUEpLHYuZGVsZXRlUmVnaW9uKGwsYiksbC5tZXNoLmRlbGV0ZShBKSxBPU0uT3ByZXYpLGwubWVzaC5zcGxpY2UoZi5hbkVkZ2UsQSksbi5lZGdlR29lc0xlZnQoTSl8fChNPW51bGwpLHYuYWRkUmlnaHRFZGdlcyhsLGgsQS5PbmV4dCxDLE0sITApfSx2LmNvbm5lY3RMZWZ0VmVydGV4PWZ1bmN0aW9uKGwsaCl7dmFyIGYsZyxNLEEsQyxiLEU9bmV3IHg7aWYoRS5lVXA9aC5hbkVkZ2UuU3ltLGY9bC5kaWN0LnNlYXJjaChFKS5rZXksZz12LnJlZ2lvbkJlbG93KGYpLCEhZyl7aWYoQT1mLmVVcCxDPWcuZVVwLG4uZWRnZVNpZ24oQS5Ec3QsaCxBLk9yZyk9PT0wKXt2LmNvbm5lY3RMZWZ0RGVnZW5lcmF0ZShsLGYsaCk7cmV0dXJufWlmKE09bi52ZXJ0TGVxKEMuRHN0LEEuRHN0KT9mOmcsZi5pbnNpZGV8fE0uZml4VXBwZXJFZGdlKXtpZihNPT09ZiliPWwubWVzaC5jb25uZWN0KGguYW5FZGdlLlN5bSxBLkxuZXh0KTtlbHNle3ZhciBMPWwubWVzaC5jb25uZWN0KEMuRG5leHQsaC5hbkVkZ2UpO2I9TC5TeW19TS5maXhVcHBlckVkZ2U/di5maXhVcHBlckVkZ2UobCxNLGIpOnYuY29tcHV0ZVdpbmRpbmcobCx2LmFkZFJlZ2lvbkJlbG93KGwsZixiKSksdi5zd2VlcEV2ZW50KGwsaCl9ZWxzZSB2LmFkZFJpZ2h0RWRnZXMobCxmLGguYW5FZGdlLGguYW5FZGdlLG51bGwsITApfX0sdi5zd2VlcEV2ZW50PWZ1bmN0aW9uKGwsaCl7bC5ldmVudD1oLHYuZGVidWdFdmVudChsKTtmb3IodmFyIGY9aC5hbkVkZ2U7Zi5hY3RpdmVSZWdpb249PT1udWxsOylpZihmPWYuT25leHQsZj09PWguYW5FZGdlKXt2LmNvbm5lY3RMZWZ0VmVydGV4KGwsaCk7cmV0dXJufXZhciBnPXYudG9wTGVmdFJlZ2lvbihsLGYuYWN0aXZlUmVnaW9uKTthKGchPT1udWxsKTt2YXIgTT12LnJlZ2lvbkJlbG93KGcpLEE9TS5lVXAsQz12LmZpbmlzaExlZnRSZWdpb25zKGwsTSxudWxsKTtDLk9uZXh0PT09QT92LmNvbm5lY3RSaWdodFZlcnRleChsLGcsQyk6di5hZGRSaWdodEVkZ2VzKGwsZyxDLk9uZXh0LEEsQSwhMCl9LHYuYWRkU2VudGluZWw9ZnVuY3Rpb24obCxoLGYsZyl7dmFyIE09bmV3IHgsQT1sLm1lc2gubWFrZUVkZ2UoKTtBLk9yZy5zPWYsQS5PcmcudD1nLEEuRHN0LnM9aCxBLkRzdC50PWcsbC5ldmVudD1BLkRzdCxNLmVVcD1BLE0ud2luZGluZ051bWJlcj0wLE0uaW5zaWRlPSExLE0uZml4VXBwZXJFZGdlPSExLE0uc2VudGluZWw9ITAsTS5kaXJ0eT0hMSxNLm5vZGVVcD1sLmRpY3QuaW5zZXJ0KE0pfSx2LmluaXRFZGdlRGljdD1mdW5jdGlvbihsKXtsLmRpY3Q9bmV3IHUobCx2LmVkZ2VMZXEpO3ZhciBoPWwuYm1heFswXS1sLmJtaW5bMF0sZj1sLmJtYXhbMV0tbC5ibWluWzFdLGc9bC5ibWluWzBdLWgsTT1sLmJtYXhbMF0raCxBPWwuYm1pblsxXS1mLEM9bC5ibWF4WzFdK2Y7di5hZGRTZW50aW5lbChsLGcsTSxBKSx2LmFkZFNlbnRpbmVsKGwsZyxNLEMpfSx2LmRvbmVFZGdlRGljdD1mdW5jdGlvbihsKXtmb3IodmFyIGgsZj0wOyhoPWwuZGljdC5taW4oKS5rZXkpIT09bnVsbDspaC5zZW50aW5lbHx8KGEoaC5maXhVcHBlckVkZ2UpLGEoKytmPT09MSkpLGEoaC53aW5kaW5nTnVtYmVyPT09MCksdi5kZWxldGVSZWdpb24obCxoKX0sdi5yZW1vdmVEZWdlbmVyYXRlRWRnZXM9ZnVuY3Rpb24obCl7dmFyIGgsZixnLE09bC5tZXNoLmVIZWFkO2ZvcihoPU0ubmV4dDtoIT09TTtoPWYpZj1oLm5leHQsZz1oLkxuZXh0LG4udmVydEVxKGguT3JnLGguRHN0KSYmaC5MbmV4dC5MbmV4dCE9PWgmJih2LnNwbGljZU1lcmdlVmVydGljZXMobCxnLGgpLGwubWVzaC5kZWxldGUoaCksaD1nLGc9aC5MbmV4dCksZy5MbmV4dD09PWgmJihnIT09aCYmKChnPT09Znx8Zz09PWYuU3ltKSYmKGY9Zi5uZXh0KSxsLm1lc2guZGVsZXRlKGcpKSwoaD09PWZ8fGg9PT1mLlN5bSkmJihmPWYubmV4dCksbC5tZXNoLmRlbGV0ZShoKSl9LHYuaW5pdFByaW9yaXR5UT1mdW5jdGlvbihsKXt2YXIgaCxmLGcsTT0wO2ZvcihnPWwubWVzaC52SGVhZCxmPWcubmV4dDtmIT09ZztmPWYubmV4dClNKys7Zm9yKE0rPTgsaD1sLnBxPW5ldyBPKE0sbi52ZXJ0TGVxKSxnPWwubWVzaC52SGVhZCxmPWcubmV4dDtmIT09ZztmPWYubmV4dClmLnBxSGFuZGxlPWguaW5zZXJ0KGYpO3JldHVybiBmIT09Zz8hMTooaC5pbml0KCksITApfSx2LmRvbmVQcmlvcml0eVE9ZnVuY3Rpb24obCl7bC5wcT1udWxsfSx2LnJlbW92ZURlZ2VuZXJhdGVGYWNlcz1mdW5jdGlvbihsLGgpe3ZhciBmLGcsTTtmb3IoZj1oLmZIZWFkLm5leHQ7ZiE9PWguZkhlYWQ7Zj1nKWc9Zi5uZXh0LE09Zi5hbkVkZ2UsYShNLkxuZXh0IT09TSksTS5MbmV4dC5MbmV4dD09PU0mJih2LmFkZFdpbmRpbmcoTS5PbmV4dCxNKSxsLm1lc2guZGVsZXRlKE0pKTtyZXR1cm4hMH0sdi5jb21wdXRlSW50ZXJpb3I9ZnVuY3Rpb24obCl7dmFyIGgsZjtpZih2LnJlbW92ZURlZ2VuZXJhdGVFZGdlcyhsKSwhdi5pbml0UHJpb3JpdHlRKGwpKXJldHVybiExO2Zvcih2LmluaXRFZGdlRGljdChsKTsoaD1sLnBxLmV4dHJhY3RNaW4oKSkhPT1udWxsOyl7Zm9yKDtmPWwucHEubWluKCksIShmPT09bnVsbHx8IW4udmVydEVxKGYsaCkpOylmPWwucHEuZXh0cmFjdE1pbigpLHYuc3BsaWNlTWVyZ2VWZXJ0aWNlcyhsLGguYW5FZGdlLGYuYW5FZGdlKTt2LnN3ZWVwRXZlbnQobCxoKX1yZXR1cm4gbC5ldmVudD1sLmRpY3QubWluKCkua2V5LmVVcC5Pcmcsdi5kZWJ1Z0V2ZW50KGwpLHYuZG9uZUVkZ2VEaWN0KGwpLHYuZG9uZVByaW9yaXR5UShsKSx2LnJlbW92ZURlZ2VuZXJhdGVGYWNlcyhsLGwubWVzaCk/KGwubWVzaC5jaGVjaygpLCEwKTohMX07ZnVuY3Rpb24gVCgpe3RoaXMubWVzaD1udWxsLHRoaXMubm9ybWFsPVswLDAsMF0sdGhpcy5zVW5pdD1bMCwwLDBdLHRoaXMudFVuaXQ9WzAsMCwwXSx0aGlzLmJtaW49WzAsMF0sdGhpcy5ibWF4PVswLDBdLHRoaXMud2luZGluZ1J1bGU9ZS5XSU5ESU5HX09ERCx0aGlzLmRpY3Q9bnVsbCx0aGlzLnBxPW51bGwsdGhpcy5ldmVudD1udWxsLHRoaXMudmVydGV4SW5kZXhDb3VudGVyPTAsdGhpcy52ZXJ0aWNlcz1bXSx0aGlzLnZlcnRleEluZGljZXM9W10sdGhpcy52ZXJ0ZXhDb3VudD0wLHRoaXMuZWxlbWVudHM9W10sdGhpcy5lbGVtZW50Q291bnQ9MH1ULnByb3RvdHlwZT17ZG90XzpmdW5jdGlvbihsLGgpe3JldHVybiBsWzBdKmhbMF0rbFsxXSpoWzFdK2xbMl0qaFsyXX0sbm9ybWFsaXplXzpmdW5jdGlvbihsKXt2YXIgaD1sWzBdKmxbMF0rbFsxXSpsWzFdK2xbMl0qbFsyXTthKGg+MCksaD1NYXRoLnNxcnQoaCksbFswXS89aCxsWzFdLz1oLGxbMl0vPWh9LGxvbmdBeGlzXzpmdW5jdGlvbihsKXt2YXIgaD0wO3JldHVybiBNYXRoLmFicyhsWzFdKT5NYXRoLmFicyhsWzBdKSYmKGg9MSksTWF0aC5hYnMobFsyXSk+TWF0aC5hYnMobFtoXSkmJihoPTIpLGh9LGNvbXB1dGVOb3JtYWxfOmZ1bmN0aW9uKGwpe3ZhciBoLGYsZyxNLEEsQyxiPVswLDAsMF0sRT1bMCwwLDBdLEw9WzAsMCwwXSxEPVswLDAsMF0sST1bMCwwLDBdLFI9W251bGwsbnVsbCxudWxsXSxCPVtudWxsLG51bGwsbnVsbF0sej10aGlzLm1lc2gudkhlYWQsSztmb3IoaD16Lm5leHQsSz0wO0s8MzsrK0spTT1oLmNvb3Jkc1tLXSxFW0tdPU0sQltLXT1oLGJbS109TSxSW0tdPWg7Zm9yKGg9ei5uZXh0O2ghPT16O2g9aC5uZXh0KWZvcihLPTA7SzwzOysrSylNPWguY29vcmRzW0tdLE08RVtLXSYmKEVbS109TSxCW0tdPWgpLE0+YltLXSYmKGJbS109TSxSW0tdPWgpO2lmKEs9MCxiWzFdLUVbMV0+YlswXS1FWzBdJiYoSz0xKSxiWzJdLUVbMl0+YltLXS1FW0tdJiYoSz0yKSxFW0tdPj1iW0tdKXtsWzBdPTAsbFsxXT0wLGxbMl09MTtyZXR1cm59Zm9yKEM9MCxmPUJbS10sZz1SW0tdLExbMF09Zi5jb29yZHNbMF0tZy5jb29yZHNbMF0sTFsxXT1mLmNvb3Jkc1sxXS1nLmNvb3Jkc1sxXSxMWzJdPWYuY29vcmRzWzJdLWcuY29vcmRzWzJdLGg9ei5uZXh0O2ghPT16O2g9aC5uZXh0KURbMF09aC5jb29yZHNbMF0tZy5jb29yZHNbMF0sRFsxXT1oLmNvb3Jkc1sxXS1nLmNvb3Jkc1sxXSxEWzJdPWguY29vcmRzWzJdLWcuY29vcmRzWzJdLElbMF09TFsxXSpEWzJdLUxbMl0qRFsxXSxJWzFdPUxbMl0qRFswXS1MWzBdKkRbMl0sSVsyXT1MWzBdKkRbMV0tTFsxXSpEWzBdLEE9SVswXSpJWzBdK0lbMV0qSVsxXStJWzJdKklbMl0sQT5DJiYoQz1BLGxbMF09SVswXSxsWzFdPUlbMV0sbFsyXT1JWzJdKTtDPD0wJiYobFswXT1sWzFdPWxbMl09MCxsW3RoaXMubG9uZ0F4aXNfKEwpXT0xKX0sY2hlY2tPcmllbnRhdGlvbl86ZnVuY3Rpb24oKXt2YXIgbCxoLGY9dGhpcy5tZXNoLmZIZWFkLGcsTT10aGlzLm1lc2gudkhlYWQsQTtmb3IobD0wLGg9Zi5uZXh0O2ghPT1mO2g9aC5uZXh0KWlmKEE9aC5hbkVkZ2UsIShBLndpbmRpbmc8PTApKWRvIGwrPShBLk9yZy5zLUEuRHN0LnMpKihBLk9yZy50K0EuRHN0LnQpLEE9QS5MbmV4dDt3aGlsZShBIT09aC5hbkVkZ2UpO2lmKGw8MCl7Zm9yKGc9TS5uZXh0O2chPT1NO2c9Zy5uZXh0KWcudD0tZy50O3RoaXMudFVuaXRbMF09LXRoaXMudFVuaXRbMF0sdGhpcy50VW5pdFsxXT0tdGhpcy50VW5pdFsxXSx0aGlzLnRVbml0WzJdPS10aGlzLnRVbml0WzJdfX0scHJvamVjdFBvbHlnb25fOmZ1bmN0aW9uKCl7dmFyIGwsaD10aGlzLm1lc2gudkhlYWQsZj1bMCwwLDBdLGcsTSxBLEMsYj0hMTtmb3IoZlswXT10aGlzLm5vcm1hbFswXSxmWzFdPXRoaXMubm9ybWFsWzFdLGZbMl09dGhpcy5ub3JtYWxbMl0sZlswXT09PTAmJmZbMV09PT0wJiZmWzJdPT09MCYmKHRoaXMuY29tcHV0ZU5vcm1hbF8oZiksYj0hMCksZz10aGlzLnNVbml0LE09dGhpcy50VW5pdCxBPXRoaXMubG9uZ0F4aXNfKGYpLGdbQV09MCxnWyhBKzEpJTNdPTEsZ1soQSsyKSUzXT0wLE1bQV09MCxNWyhBKzEpJTNdPTAsTVsoQSsyKSUzXT1mW0FdPjA/MTotMSxsPWgubmV4dDtsIT09aDtsPWwubmV4dClsLnM9dGhpcy5kb3RfKGwuY29vcmRzLGcpLGwudD10aGlzLmRvdF8obC5jb29yZHMsTSk7Zm9yKGImJnRoaXMuY2hlY2tPcmllbnRhdGlvbl8oKSxDPSEwLGw9aC5uZXh0O2whPT1oO2w9bC5uZXh0KUM/KHRoaXMuYm1pblswXT10aGlzLmJtYXhbMF09bC5zLHRoaXMuYm1pblsxXT10aGlzLmJtYXhbMV09bC50LEM9ITEpOihsLnM8dGhpcy5ibWluWzBdJiYodGhpcy5ibWluWzBdPWwucyksbC5zPnRoaXMuYm1heFswXSYmKHRoaXMuYm1heFswXT1sLnMpLGwudDx0aGlzLmJtaW5bMV0mJih0aGlzLmJtaW5bMV09bC50KSxsLnQ+dGhpcy5ibWF4WzFdJiYodGhpcy5ibWF4WzFdPWwudCkpfSxhZGRXaW5kaW5nXzpmdW5jdGlvbihsLGgpe2wud2luZGluZys9aC53aW5kaW5nLGwuU3ltLndpbmRpbmcrPWguU3ltLndpbmRpbmd9LHRlc3NlbGxhdGVNb25vUmVnaW9uXzpmdW5jdGlvbihsLGgpe3ZhciBmLGc7Zm9yKGY9aC5hbkVkZ2UsYShmLkxuZXh0IT09ZiYmZi5MbmV4dC5MbmV4dCE9PWYpO24udmVydExlcShmLkRzdCxmLk9yZyk7Zj1mLkxwcmV2KTtmb3IoO24udmVydExlcShmLk9yZyxmLkRzdCk7Zj1mLkxuZXh0KTtmb3IoZz1mLkxwcmV2O2YuTG5leHQhPT1nOylpZihuLnZlcnRMZXEoZi5Ec3QsZy5PcmcpKXtmb3IoO2cuTG5leHQhPT1mJiYobi5lZGdlR29lc0xlZnQoZy5MbmV4dCl8fG4uZWRnZVNpZ24oZy5PcmcsZy5Ec3QsZy5MbmV4dC5Ec3QpPD0wKTspe3ZhciBNPWwuY29ubmVjdChnLkxuZXh0LGcpO2c9TS5TeW19Zz1nLkxwcmV2fWVsc2V7Zm9yKDtnLkxuZXh0IT09ZiYmKG4uZWRnZUdvZXNSaWdodChmLkxwcmV2KXx8bi5lZGdlU2lnbihmLkRzdCxmLk9yZyxmLkxwcmV2Lk9yZyk+PTApOyl7dmFyIE09bC5jb25uZWN0KGYsZi5McHJldik7Zj1NLlN5bX1mPWYuTG5leHR9Zm9yKGEoZy5MbmV4dCE9PWYpO2cuTG5leHQuTG5leHQhPT1mOyl7dmFyIE09bC5jb25uZWN0KGcuTG5leHQsZyk7Zz1NLlN5bX1yZXR1cm4hMH0sdGVzc2VsbGF0ZUludGVyaW9yXzpmdW5jdGlvbihsKXt2YXIgaCxmO2ZvcihoPWwuZkhlYWQubmV4dDtoIT09bC5mSGVhZDtoPWYpaWYoZj1oLm5leHQsaC5pbnNpZGUmJiF0aGlzLnRlc3NlbGxhdGVNb25vUmVnaW9uXyhsLGgpKXJldHVybiExO3JldHVybiEwfSxkaXNjYXJkRXh0ZXJpb3JfOmZ1bmN0aW9uKGwpe3ZhciBoLGY7Zm9yKGg9bC5mSGVhZC5uZXh0O2ghPT1sLmZIZWFkO2g9ZilmPWgubmV4dCxoLmluc2lkZXx8bC56YXBGYWNlKGgpfSxzZXRXaW5kaW5nTnVtYmVyXzpmdW5jdGlvbihsLGgsZil7dmFyIGcsTTtmb3IoZz1sLmVIZWFkLm5leHQ7ZyE9PWwuZUhlYWQ7Zz1NKU09Zy5uZXh0LGcuUmZhY2UuaW5zaWRlIT09Zy5MZmFjZS5pbnNpZGU/Zy53aW5kaW5nPWcuTGZhY2UuaW5zaWRlP2g6LWg6Zj9sLmRlbGV0ZShnKTpnLndpbmRpbmc9MH0sZ2V0TmVpZ2hib3VyRmFjZV86ZnVuY3Rpb24obCl7cmV0dXJuIWwuUmZhY2V8fCFsLlJmYWNlLmluc2lkZT8tMTpsLlJmYWNlLm59LG91dHB1dFBvbHltZXNoXzpmdW5jdGlvbihsLGgsZixnKXt2YXIgTSxBLEMsYj0wLEU9MCxMLEQ7Zm9yKGY+MyYmbC5tZXJnZUNvbnZleEZhY2VzKGYpLE09bC52SGVhZC5uZXh0O00hPT1sLnZIZWFkO009TS5uZXh0KU0ubj0tMTtmb3IoQT1sLmZIZWFkLm5leHQ7QSE9PWwuZkhlYWQ7QT1BLm5leHQpaWYoQS5uPS0xLCEhQS5pbnNpZGUpe0M9QS5hbkVkZ2UsTD0wO2RvIE09Qy5PcmcsTS5uPT09LTEmJihNLm49RSxFKyspLEwrKyxDPUMuTG5leHQ7d2hpbGUoQyE9PUEuYW5FZGdlKTthKEw8PWYpLEEubj1iLCsrYn1mb3IodGhpcy5lbGVtZW50Q291bnQ9YixoPT09ZS5DT05ORUNURURfUE9MWUdPTlMmJihiKj0yKSx0aGlzLmVsZW1lbnRzPVtdLHRoaXMuZWxlbWVudHMubGVuZ3RoPWIqZix0aGlzLnZlcnRleENvdW50PUUsdGhpcy52ZXJ0aWNlcz1bXSx0aGlzLnZlcnRpY2VzLmxlbmd0aD1FKmcsdGhpcy52ZXJ0ZXhJbmRpY2VzPVtdLHRoaXMudmVydGV4SW5kaWNlcy5sZW5ndGg9RSxNPWwudkhlYWQubmV4dDtNIT09bC52SGVhZDtNPU0ubmV4dClpZihNLm4hPT0tMSl7dmFyIEk9TS5uKmc7dGhpcy52ZXJ0aWNlc1tJKzBdPU0uY29vcmRzWzBdLHRoaXMudmVydGljZXNbSSsxXT1NLmNvb3Jkc1sxXSxnPjImJih0aGlzLnZlcnRpY2VzW0krMl09TS5jb29yZHNbMl0pLHRoaXMudmVydGV4SW5kaWNlc1tNLm5dPU0uaWR4fXZhciBSPTA7Zm9yKEE9bC5mSGVhZC5uZXh0O0EhPT1sLmZIZWFkO0E9QS5uZXh0KWlmKEEuaW5zaWRlKXtDPUEuYW5FZGdlLEw9MDtkbyBNPUMuT3JnLHRoaXMuZWxlbWVudHNbUisrXT1NLm4sTCsrLEM9Qy5MbmV4dDt3aGlsZShDIT09QS5hbkVkZ2UpO2ZvcihEPUw7RDxmOysrRCl0aGlzLmVsZW1lbnRzW1IrK109LTE7aWYoaD09PWUuQ09OTkVDVEVEX1BPTFlHT05TKXtDPUEuYW5FZGdlO2RvIHRoaXMuZWxlbWVudHNbUisrXT10aGlzLmdldE5laWdoYm91ckZhY2VfKEMpLEM9Qy5MbmV4dDt3aGlsZShDIT09QS5hbkVkZ2UpO2ZvcihEPUw7RDxmOysrRCl0aGlzLmVsZW1lbnRzW1IrK109LTF9fX0sb3V0cHV0Q29udG91cnNfOmZ1bmN0aW9uKGwsaCl7dmFyIGYsZyxNLEE9MCxDPTA7Zm9yKHRoaXMudmVydGV4Q291bnQ9MCx0aGlzLmVsZW1lbnRDb3VudD0wLGY9bC5mSGVhZC5uZXh0O2YhPT1sLmZIZWFkO2Y9Zi5uZXh0KWlmKGYuaW5zaWRlKXtNPWc9Zi5hbkVkZ2U7ZG8gdGhpcy52ZXJ0ZXhDb3VudCsrLGc9Zy5MbmV4dDt3aGlsZShnIT09TSk7dGhpcy5lbGVtZW50Q291bnQrK310aGlzLmVsZW1lbnRzPVtdLHRoaXMuZWxlbWVudHMubGVuZ3RoPXRoaXMuZWxlbWVudENvdW50KjIsdGhpcy52ZXJ0aWNlcz1bXSx0aGlzLnZlcnRpY2VzLmxlbmd0aD10aGlzLnZlcnRleENvdW50KmgsdGhpcy52ZXJ0ZXhJbmRpY2VzPVtdLHRoaXMudmVydGV4SW5kaWNlcy5sZW5ndGg9dGhpcy52ZXJ0ZXhDb3VudDt2YXIgYj0wLEU9MCxMPTA7Zm9yKEE9MCxmPWwuZkhlYWQubmV4dDtmIT09bC5mSGVhZDtmPWYubmV4dClpZihmLmluc2lkZSl7Qz0wLE09Zz1mLmFuRWRnZTtkbyB0aGlzLnZlcnRpY2VzW2IrK109Zy5PcmcuY29vcmRzWzBdLHRoaXMudmVydGljZXNbYisrXT1nLk9yZy5jb29yZHNbMV0saD4yJiYodGhpcy52ZXJ0aWNlc1tiKytdPWcuT3JnLmNvb3Jkc1syXSksdGhpcy52ZXJ0ZXhJbmRpY2VzW0UrK109Zy5PcmcuaWR4LEMrKyxnPWcuTG5leHQ7d2hpbGUoZyE9PU0pO3RoaXMuZWxlbWVudHNbTCsrXT1BLHRoaXMuZWxlbWVudHNbTCsrXT1DLEErPUN9fSxhZGRDb250b3VyOmZ1bmN0aW9uKGwsaCl7dmFyIGYsZztmb3IodGhpcy5tZXNoPT09bnVsbCYmKHRoaXMubWVzaD1uZXcgYyksbDwyJiYobD0yKSxsPjMmJihsPTMpLGY9bnVsbCxnPTA7ZzxoLmxlbmd0aDtnKz1sKWY9PT1udWxsPyhmPXRoaXMubWVzaC5tYWtlRWRnZSgpLHRoaXMubWVzaC5zcGxpY2UoZixmLlN5bSkpOih0aGlzLm1lc2guc3BsaXRFZGdlKGYpLGY9Zi5MbmV4dCksZi5PcmcuY29vcmRzWzBdPWhbZyswXSxmLk9yZy5jb29yZHNbMV09aFtnKzFdLGw+Mj9mLk9yZy5jb29yZHNbMl09aFtnKzJdOmYuT3JnLmNvb3Jkc1syXT0wLGYuT3JnLmlkeD10aGlzLnZlcnRleEluZGV4Q291bnRlcisrLGYud2luZGluZz0xLGYuU3ltLndpbmRpbmc9LTF9LHRlc3NlbGF0ZTpmdW5jdGlvbihsLGgsZixnLE0pe2lmKHRoaXMudmVydGljZXM9W10sdGhpcy5lbGVtZW50cz1bXSx0aGlzLnZlcnRleEluZGljZXM9W10sdGhpcy52ZXJ0ZXhJbmRleENvdW50ZXI9MCxNJiYodGhpcy5ub3JtYWxbMF09TVswXSx0aGlzLm5vcm1hbFsxXT1NWzFdLHRoaXMubm9ybWFsWzJdPU1bMl0pLHRoaXMud2luZGluZ1J1bGU9bCxnPDImJihnPTIpLGc+MyYmKGc9MyksIXRoaXMubWVzaClyZXR1cm4hMTt0aGlzLnByb2plY3RQb2x5Z29uXygpLHYuY29tcHV0ZUludGVyaW9yKHRoaXMpO3ZhciBBPXRoaXMubWVzaDtyZXR1cm4gaD09PWUuQk9VTkRBUllfQ09OVE9VUlM/dGhpcy5zZXRXaW5kaW5nTnVtYmVyXyhBLDEsITApOnRoaXMudGVzc2VsbGF0ZUludGVyaW9yXyhBKSxBLmNoZWNrKCksaD09PWUuQk9VTkRBUllfQ09OVE9VUlM/dGhpcy5vdXRwdXRDb250b3Vyc18oQSxnKTp0aGlzLm91dHB1dFBvbHltZXNoXyhBLGgsZixnKSwhMH19fSxmdW5jdGlvbihkLHIpe2QuZXhwb3J0cz1lO3ZhciB0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gZSgpe2Zvcih2YXIgbj17fSxhPTA7YTxhcmd1bWVudHMubGVuZ3RoO2ErKyl7dmFyIHM9YXJndW1lbnRzW2FdO2Zvcih2YXIgaSBpbiBzKXQuY2FsbChzLGkpJiYobltpXT1zW2ldKX1yZXR1cm4gbn19LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImNyZWF0ZVNoYWRlcnMiLGZ1bmN0aW9uKCl7cmV0dXJuIG99KSx0LmQociwiYXBwbHlTaGFkZXIiLGZ1bmN0aW9uKCl7cmV0dXJuIGN9KSx0LmQociwiY3JlYXRlQ2xvdWRTaGFkZXJzIixmdW5jdGlvbigpe3JldHVybiB1fSksdC5kKHIsImFwcGx5Q2xvdWRTaGFkZXIiLGZ1bmN0aW9uKCl7cmV0dXJuIHB9KTt2YXIgZT10KDY0KSxuPXQoNjUpLGE9dCg2Nikscz10KDY3KTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7Y29uc3QgaT1TeW1ib2woInNoYWRlcnMiKTtmdW5jdGlvbiBvKHkpe3lbaV09W107Zm9yKGxldCBPPTA7TzwxNjtPKyspe2NvbnN0IHg9W10sdj0hIShPJjEpLFQ9ISEoTyYyKSxsPSEhKE8mNCksaD0hIShPJjgpO3YmJngucHVzaCgiI2RlZmluZSBURVhUVVJFIDEiKSxUJiZ4LnB1c2goIiNkZWZpbmUgRklMVEVSIDEiKSxsJiZ4LnB1c2goIiNkZWZpbmUgR1JBRElFTlQgMSIpLGgmJngucHVzaCgiI2RlZmluZSBDTElQUEFUSCAxIik7Y29uc3QgZj1gJHt4LmpvaW4oYApgKX0KYCxnPVtdO3YmJmcucHVzaCgidW5pZm9ybSBzYW1wbGVyMkQgdV90ZXhTYW1wbGVyOyIpLGgmJmcucHVzaCgidW5pZm9ybSBzYW1wbGVyMkQgdV9jbGlwU2FtcGxlcjsiKSx5W2ldW09dPVtmK2cuam9pbihgCmApK24uZGVmYXVsdCxmK2UuZGVmYXVsdF19fWZ1bmN0aW9uIGMoeSx7aGFzVGV4dHVyZTpPPSExLGhhc0ZpbHRlcjp4PSExLGhhc0dyYWRpZW50OnY9ITEsaGFzQ2xpcFBhdGg6VD0hMX09e30pe2NvbnN0IGw9T3x4PDwxfHY8PDJ8VDw8MztsZXQgaD15W2ldW2xdO0FycmF5LmlzQXJyYXkoaCkmJihoPXkuY3JlYXRlUHJvZ3JhbSguLi5oKSx5W2ldW2xdPWgpLHkucHJvZ3JhbSE9PWgmJnkudXNlUHJvZ3JhbShoLHthX2NvbG9yOnt0eXBlOiJVTlNJR05FRF9CWVRFIixub3JtYWxpemU6ITB9fSl9Y29uc3QgbT1bXTtmdW5jdGlvbiB1KHkpe2ZvcihsZXQgTz0wO088NjQ7TysrKXtjb25zdCB4PVtdLHY9ISEoTyYxKSxUPSEhKE8mMiksbD0hIShPJjQpLGg9ISEoTyY4KSxmPSEhKE8mMTYpLGc9ISEoTyYzMik7diYmeC5wdXNoKCIjZGVmaW5lIFRFWFRVUkUgMSIpLFQmJngucHVzaCgiI2RlZmluZSBGSUxURVIgMSIpLGwmJngucHVzaCgiI2RlZmluZSBHUkFESUVOVCAxIiksaCYmeC5wdXNoKCIjZGVmaW5lIENMT1VEQ09MT1IgMSIpLGYmJngucHVzaCgiI2RlZmluZSBDTE9VREZJTFRFUiAxIiksZyYmeC5wdXNoKCIjZGVmaW5lIENMSVBQQVRIIDEiKTtjb25zdCBNPWAke3guam9pbihgCmApfQpgLEE9W107aWYodil7QS5wdXNoKCJ1bmlmb3JtIHNhbXBsZXIyRCB1X3RleFNhbXBsZXI7Iik7Zm9yKGxldCBDPTA7QzwxMjtDKyspQS5wdXNoKGB1bmlmb3JtIHNhbXBsZXIyRCB1X3RleEZyYW1lJHtDfTtgKX1nJiZBLnB1c2goInVuaWZvcm0gc2FtcGxlcjJEIHVfY2xpcFNhbXBsZXI7IiksbVtPXT1bTStBLmpvaW4oYApgKStzLmRlZmF1bHQsTSthLmRlZmF1bHRdfX1mdW5jdGlvbiBwKHkse2hhc1RleHR1cmU6Tz0hMSxoYXNGaWx0ZXI6eD0hMSxoYXNHcmFkaWVudDp2PSExLGhhc0Nsb3VkQ29sb3I6VD0hMSxoYXNDbG91ZEZpbHRlcjpsPSExLGhhc0NsaXBQYXRoOmg9ITF9PXt9KXtjb25zdCBmPU98eDw8MXx2PDwyfFQ8PDN8bDw8NHxoPDw1O2xldCBnPW1bZl07QXJyYXkuaXNBcnJheShnKSYmKGc9eS5jcmVhdGVQcm9ncmFtKC4uLmcpLG1bZl09ZykseS5wcm9ncmFtIT09ZyYmeS51c2VQcm9ncmFtKGcse2FfY29sb3I6e3R5cGU6IlVOU0lHTkVEX0JZVEUiLG5vcm1hbGl6ZTohMH0sYV9maWxsQ2xvdWRDb2xvcjp7dHlwZToiVU5TSUdORURfQllURSIsbm9ybWFsaXplOiEwfSxhX3N0cm9rZUNsb3VkQ29sb3I6e3R5cGU6IlVOU0lHTkVEX0JZVEUiLG5vcm1hbGl6ZTohMH0sYV9mcmFtZUluZGV4Ont0eXBlOiJVTlNJR05FRF9CWVRFIixub3JtYWxpemU6ITF9fSl9fSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHIuZGVmYXVsdD1gYXR0cmlidXRlIHZlYzMgYV92ZXJ0ZXhQb3NpdGlvbjsKYXR0cmlidXRlIHZlYzQgYV9jb2xvcjsKdmFyeWluZyB2ZWM0IHZDb2xvcjsKdmFyeWluZyBmbG9hdCBmbGFnQmFja2dyb3VuZDsKdW5pZm9ybSB2ZWMyIHVfcmVzb2x1dGlvbjsKdW5pZm9ybSBtYXQzIHZpZXdNYXRyaXg7CnVuaWZvcm0gbWF0MyBwcm9qZWN0aW9uTWF0cml4OwoKI2lmZGVmIFRFWFRVUkUKYXR0cmlidXRlIHZlYzMgYV92ZXJ0ZXhUZXh0dXJlQ29vcmQ7CnZhcnlpbmcgdmVjMyB2VGV4dHVyZUNvb3JkOwphdHRyaWJ1dGUgdmVjNCBhX3NvdXJjZVJlY3Q7CnZhcnlpbmcgdmVjNCB2U291cmNlUmVjdDsKI2VuZGlmCgojaWZkZWYgQ0xJUFBBVEgKYXR0cmlidXRlIHZlYzIgYV9jbGlwVVY7CnZhcnlpbmcgdmVjMiB2Q2xpcFVWOwojZW5kaWYKCiNpZmRlZiBHUkFESUVOVAp1bmlmb3JtIGZsb2F0IHVfcmFkaWFsR3JhZGllbnRWZWN0b3JbNl07CnZhcnlpbmcgdmVjMyB2R3JhZGllbnRWZWN0b3IxOwp2YXJ5aW5nIHZlYzMgdkdyYWRpZW50VmVjdG9yMjsKI2VuZGlmCgp2b2lkIG1haW4oKSB7CiAgZ2xfUG9pbnRTaXplID0gMS4wOwoKICB2ZWMzIHBvcyA9IHByb2plY3Rpb25NYXRyaXggKiB2aWV3TWF0cml4ICogdmVjMyhhX3ZlcnRleFBvc2l0aW9uLnh5LCAxLjApOwogIGdsX1Bvc2l0aW9uID0gdmVjNChwb3MueHksIDEuMCwgMS4wKTsKCiNpZmRlZiBHUkFESUVOVAogIHZlYzMgdmcxID0gdmlld01hdHJpeCAqIHZlYzModV9yYWRpYWxHcmFkaWVudFZlY3RvclswXSwgdV9yYWRpYWxHcmFkaWVudFZlY3RvclsxXSwgMS4wKTsKICB2ZWMzIHZnMiA9IHZpZXdNYXRyaXggKiB2ZWMzKHVfcmFkaWFsR3JhZGllbnRWZWN0b3JbM10sIHVfcmFkaWFsR3JhZGllbnRWZWN0b3JbNF0sIDEuMCk7CiAgZmxvYXQgaCA9IHVfcmVzb2x1dGlvbi55OwogIHZnMS55ID0gaCAtIHZnMS55OwogIHZnMi55ID0gaCAtIHZnMi55OwogIHZHcmFkaWVudFZlY3RvcjEgPSB2ZWMzKHZnMS54eSwgdV9yYWRpYWxHcmFkaWVudFZlY3RvclsyXSk7CiAgdkdyYWRpZW50VmVjdG9yMiA9IHZlYzModmcyLnh5LCB1X3JhZGlhbEdyYWRpZW50VmVjdG9yWzVdKTsKI2VuZGlmCiAgCiAgZmxhZ0JhY2tncm91bmQgPSBhX3ZlcnRleFBvc2l0aW9uLno7CiAgdkNvbG9yID0gYV9jb2xvcjsKCiNpZmRlZiBURVhUVVJFCiAgdlRleHR1cmVDb29yZCA9IGFfdmVydGV4VGV4dHVyZUNvb3JkOwogIHZTb3VyY2VSZWN0ID0gYV9zb3VyY2VSZWN0OwojZW5kaWYKCiNpZmRlZiBDTElQUEFUSAogIHZDbGlwVVYgPSBhX2NsaXBVVjsKI2VuZGlmCn1gfSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHIuZGVmYXVsdD1gcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7Cgp2YXJ5aW5nIHZlYzQgdkNvbG9yOwp2YXJ5aW5nIGZsb2F0IGZsYWdCYWNrZ3JvdW5kOwoKI2lmZGVmIFRFWFRVUkUKdmFyeWluZyB2ZWMzIHZUZXh0dXJlQ29vcmQ7CnZhcnlpbmcgdmVjNCB2U291cmNlUmVjdDsKI2VuZGlmCgojaWZkZWYgQ0xJUFBBVEgKdmFyeWluZyB2ZWMyIHZDbGlwVVY7CiNlbmRpZgoKI2lmZGVmIEZJTFRFUgp1bmlmb3JtIGludCB1X2ZpbHRlckZsYWc7CnVuaWZvcm0gZmxvYXQgdV9jb2xvck1hdHJpeFsyMF07CiNlbmRpZgoKI2lmZGVmIEdSQURJRU5UCnZhcnlpbmcgdmVjMyB2R3JhZGllbnRWZWN0b3IxOwp2YXJ5aW5nIHZlYzMgdkdyYWRpZW50VmVjdG9yMjsKdW5pZm9ybSBmbG9hdCB1X2NvbG9yU3RlcHNbNDBdOwp1bmlmb3JtIGludCB1X2dyYWRpZW50VHlwZTsKLy8gdW5pZm9ybSBmbG9hdCB1X3JhZGlhbEdyYWRpZW50VmVjdG9yWzZdOwoKdm9pZCBncmFkaWVudChpbm91dCB2ZWM0IGNvbG9yLCB2ZWMzIGd2MSwgdmVjMyBndjIsIGZsb2F0IGNvbG9yU3RlcHNbNDBdKSB7CiAgZmxvYXQgdDsKICAvLyBjZW50ZXIgY2lyY2xlIHJhZGl1cwogIGZsb2F0IGNyID0gZ3YxLno7CiAgLy8gZm9jYWwgY2lyY2xlIHJhZGl1cwogIGZsb2F0IGZyID0gZ3YyLno7CgogIGlmKGNyID4gMC4wIHx8IGZyID4gMC4wKSB7CiAgICAvLyByYWRpYWwgZ3JhZGllbnQKICAgIHZlYzIgY2VudGVyID0gZ3YxLnh5OwogICAgdmVjMiBmb2NhbCA9IGd2Mi54eTsKICAgIGZsb2F0IHggPSBmb2NhbC54IC0gZ2xfRnJhZ0Nvb3JkLng7CiAgICBmbG9hdCB5ID0gZm9jYWwueSAtIGdsX0ZyYWdDb29yZC55OwogICAgZmxvYXQgZHggPSBmb2NhbC54IC0gY2VudGVyLng7CiAgICBmbG9hdCBkeSA9IGZvY2FsLnkgLSBjZW50ZXIueTsKICAgIGZsb2F0IGRyID0gY3IgLSBmcjsKICAgIGZsb2F0IGEgPSBkeCAqIGR4ICsgZHkgKiBkeSAtIGRyICogZHI7CiAgICBmbG9hdCBiID0gLTIuMCAqICh5ICogZHkgKyB4ICogZHggKyBmciAqIGRyKTsKICAgIGZsb2F0IGMgPSB4ICogeCArIHkgKiB5IC0gZnIgKiBmcjsKICAgIHQgPSAxLjAgLSAwLjUgKiAoMS4wIC8gYSkgKiAoLWIgKyBzcXJ0KGIgKiBiIC0gNC4wICogYSAqIGMpKTsKICB9IGVsc2UgewogICAgLy8gbGluZWFyIGdyYWRpZW50CiAgICB2ZWMyIHYxID0gZ2xfRnJhZ0Nvb3JkLnh5IC0gZ3YxLnh5OwogICAgdmVjMiB2MiA9IGd2Mi54eSAtIGd2MS54eTsKICAgIHQgPSAodjEueCAqIHYyLnggKyB2MS55ICogdjIueSkgLyAodjIueCAqIHYyLnggKyB2Mi55ICogdjIueSk7CiAgfQoKICB2ZWM0IGNvbG9yc1s4XTsKICBjb2xvcnNbMF0gPSB2ZWM0KGNvbG9yU3RlcHNbMV0sIGNvbG9yU3RlcHNbMl0sIGNvbG9yU3RlcHNbM10sIGNvbG9yU3RlcHNbNF0pOwogIGNvbG9yc1sxXSA9IHZlYzQoY29sb3JTdGVwc1s2XSwgY29sb3JTdGVwc1s3XSwgY29sb3JTdGVwc1s4XSwgY29sb3JTdGVwc1s5XSk7CiAgY29sb3JzWzJdID0gdmVjNChjb2xvclN0ZXBzWzExXSwgY29sb3JTdGVwc1sxMl0sIGNvbG9yU3RlcHNbMTNdLCBjb2xvclN0ZXBzWzE0XSk7CiAgY29sb3JzWzNdID0gdmVjNChjb2xvclN0ZXBzWzE2XSwgY29sb3JTdGVwc1sxN10sIGNvbG9yU3RlcHNbMThdLCBjb2xvclN0ZXBzWzE5XSk7CiAgY29sb3JzWzRdID0gdmVjNChjb2xvclN0ZXBzWzIxXSwgY29sb3JTdGVwc1syMl0sIGNvbG9yU3RlcHNbMjNdLCBjb2xvclN0ZXBzWzI0XSk7CiAgY29sb3JzWzVdID0gdmVjNChjb2xvclN0ZXBzWzI2XSwgY29sb3JTdGVwc1syN10sIGNvbG9yU3RlcHNbMjhdLCBjb2xvclN0ZXBzWzI5XSk7CiAgY29sb3JzWzZdID0gdmVjNChjb2xvclN0ZXBzWzMxXSwgY29sb3JTdGVwc1szMl0sIGNvbG9yU3RlcHNbMzNdLCBjb2xvclN0ZXBzWzM0XSk7CiAgY29sb3JzWzddID0gdmVjNChjb2xvclN0ZXBzWzM2XSwgY29sb3JTdGVwc1szN10sIGNvbG9yU3RlcHNbMzhdLCBjb2xvclN0ZXBzWzM5XSk7CiAgCiAgZmxvYXQgc3RlcHNbOF07CiAgc3RlcHNbMF0gPSBjb2xvclN0ZXBzWzBdOwogIHN0ZXBzWzFdID0gY29sb3JTdGVwc1s1XTsKICBzdGVwc1syXSA9IGNvbG9yU3RlcHNbMTBdOwogIHN0ZXBzWzNdID0gY29sb3JTdGVwc1sxNV07CiAgc3RlcHNbNF0gPSBjb2xvclN0ZXBzWzIwXTsKICBzdGVwc1s1XSA9IGNvbG9yU3RlcHNbMjVdOwogIHN0ZXBzWzZdID0gY29sb3JTdGVwc1szMF07CiAgc3RlcHNbN10gPSBjb2xvclN0ZXBzWzM1XTsKCiAgY29sb3IgPSBjb2xvcnNbMF07CiAgZm9yIChpbnQgaSA9IDE7IGkgPCA4OyBpKyspIHsKICAgIGlmIChzdGVwc1tpXSA8IDAuMCB8fCBzdGVwc1tpXSA+IDEuMCkgewogICAgICBicmVhazsKICAgIH0KICAgIGlmKHN0ZXBzW2ldID09IHN0ZXBzW2kgLSAxXSkgewogICAgICBjb2xvciA9IGNvbG9yc1tpXTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbG9yID0gbWl4KGNvbG9yLCBjb2xvcnNbaV0sIGNsYW1wKCh0IC0gc3RlcHNbaSAtIDFdKSAvIChzdGVwc1tpXSAtIHN0ZXBzW2kgLSAxXSksIDAuMCwgMS4wKSk7CiAgICB9CiAgICBpZiAoc3RlcHNbaV0gPj0gdCkgewogICAgICBicmVhazsKICAgIH0KICB9Cn0KI2VuZGlmCgojaWZkZWYgRklMVEVSCnZvaWQgdHJhbnNmb3JtQ29sb3IoaW5vdXQgdmVjNCBjb2xvciwgaW4gZmxvYXQgY29sb3JNYXRyaXhbMjBdKSB7CiAgZmxvYXQgciA9IGNvbG9yLnIsIGcgPSBjb2xvci5nLCBiID0gY29sb3IuYiwgYSA9IGNvbG9yLmE7CiAgY29sb3JbMF0gPSBjb2xvck1hdHJpeFswXSAqIHIgKyBjb2xvck1hdHJpeFsxXSAqIGcgKyBjb2xvck1hdHJpeFsyXSAqIGIgKyBjb2xvck1hdHJpeFszXSAqIGEgKyBjb2xvck1hdHJpeFs0XTsKICBjb2xvclsxXSA9IGNvbG9yTWF0cml4WzVdICogciArIGNvbG9yTWF0cml4WzZdICogZyArIGNvbG9yTWF0cml4WzddICogYiArIGNvbG9yTWF0cml4WzhdICogYSArIGNvbG9yTWF0cml4WzldOwogIGNvbG9yWzJdID0gY29sb3JNYXRyaXhbMTBdICogciArIGNvbG9yTWF0cml4WzExXSAqIGcgKyBjb2xvck1hdHJpeFsxMl0gKiBiICsgY29sb3JNYXRyaXhbMTNdICogYSArIGNvbG9yTWF0cml4WzE0XTsKICBjb2xvclszXSA9IGNvbG9yTWF0cml4WzE1XSAqIHIgKyBjb2xvck1hdHJpeFsxNl0gKiBnICsgY29sb3JNYXRyaXhbMTddICogYiArIGNvbG9yTWF0cml4WzE4XSAqIGEgKyBjb2xvck1hdHJpeFsxOV07Cn0KI2VuZGlmCgp2b2lkIG1haW4oKSB7CiAgdmVjNCBjb2xvciA9IHZDb2xvcjsKICBmbG9hdCBvcGFjaXR5ID0gYWJzKGZsYWdCYWNrZ3JvdW5kKTsKCiNpZmRlZiBHUkFESUVOVAogIGlmKHVfZ3JhZGllbnRUeXBlID4gMCAmJiBmbGFnQmFja2dyb3VuZCA+IDAuMCB8fCB1X2dyYWRpZW50VHlwZSA9PSAwICYmIGZsYWdCYWNrZ3JvdW5kIDw9IDAuMCkgewogICAgZ3JhZGllbnQoY29sb3IsIHZHcmFkaWVudFZlY3RvcjEsIHZHcmFkaWVudFZlY3RvcjIsIHVfY29sb3JTdGVwcyk7CiAgfQojZW5kaWYKCiAgaWYob3BhY2l0eSA8IDEuMCkgewogICAgY29sb3IuYSAqPSBvcGFjaXR5OwogIH0KCiNpZmRlZiBURVhUVVJFCiAgaWYoZmxhZ0JhY2tncm91bmQgPiAwLjApIHsKICAgIHZlYzMgdGV4Q29vcmQgPSB2VGV4dHVyZUNvb3JkOwoKICAgIGlmKHRleENvb3JkLnogPT0gMS4wKSB7CiAgICAgIHRleENvb3JkID0gZnJhY3QodGV4Q29vcmQpOwogICAgfQoKICAgIGlmKHRleENvb3JkLnggPD0gMS4wICYmIHRleENvb3JkLnggPj0gMC4wCiAgICAgICYmIHRleENvb3JkLnkgPD0gMS4wICYmIHRleENvb3JkLnkgPj0gMC4wKSB7CiAgICAgIGlmKHZTb3VyY2VSZWN0LnogPiAwLjApIHsKICAgICAgICB0ZXhDb29yZC54ID0gdlNvdXJjZVJlY3QueCArIHRleENvb3JkLnggKiB2U291cmNlUmVjdC56OwogICAgICAgIHRleENvb3JkLnkgPSAxLjAgLSAodlNvdXJjZVJlY3QueSArICgxLjAgLSB0ZXhDb29yZC55KSAqIHZTb3VyY2VSZWN0LncpOwogICAgICB9CiAgICAgIHZlYzQgdGV4Q29sb3IgPSB0ZXh0dXJlMkQodV90ZXhTYW1wbGVyLCB0ZXhDb29yZC54eSk7CiAgICAgIGZsb2F0IGFscGhhID0gdGV4Q29sb3IuYTsKICAgICAgaWYob3BhY2l0eSA8IDEuMCkgewogICAgICAgIHRleENvbG9yLmEgKj0gb3BhY2l0eTsKICAgICAgICBhbHBoYSAqPSBtaXgoMC40NjUsIDEuMCwgb3BhY2l0eSk7CiAgICAgIH0KICAgICAgLy8gY29sb3IgPSBtaXgoY29sb3IsIHRleENvbG9yLCB0ZXhDb2xvci5hKTsKICAgICAgY29sb3IucmdiID0gbWl4KGNvbG9yLnJnYiwgdGV4Q29sb3IucmdiLCBhbHBoYSk7CiAgICAgIC8vIGNvbG9yLnJnYiA9IG1peCh0ZXhDb2xvci5yZ2IsIGNvbG9yLnJnYiwgY29sb3IuYSk7CiAgICAgIGNvbG9yLnJnYiA9IG1peCh0ZXhDb2xvci5yZ2IsIGNvbG9yLnJnYiwgY2xhbXAoY29sb3IuYSAvIG1heCgwLjAwMDEsIHRleENvbG9yLmEpLCAwLjAsIDEuMCkpOwogICAgICBjb2xvci5hID0gdGV4Q29sb3IuYSArICgxLjAgLSB0ZXhDb2xvci5hKSAqIGNvbG9yLmE7CiAgICB9CiAgfQojZW5kaWYKCiNpZmRlZiBGSUxURVIKICBpZih1X2ZpbHRlckZsYWcgPiAwKSB7CiAgICB0cmFuc2Zvcm1Db2xvcihjb2xvciwgdV9jb2xvck1hdHJpeCk7CiAgfQojZW5kaWYKCiNpZmRlZiBDTElQUEFUSAogIGZsb2F0IGNsaXAgPSB0ZXh0dXJlMkQodV9jbGlwU2FtcGxlciwgdkNsaXBVVikucjsKICBjb2xvciAqPSBjbGlwOwojZW5kaWYKCiAgZ2xfRnJhZ0NvbG9yID0gY29sb3I7Cn1gfSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHIuZGVmYXVsdD1gYXR0cmlidXRlIHZlYzMgYV92ZXJ0ZXhQb3NpdGlvbjsKYXR0cmlidXRlIHZlYzQgYV9jb2xvcjsKdmFyeWluZyB2ZWM0IHZDb2xvcjsKdmFyeWluZyBmbG9hdCBmbGFnQmFja2dyb3VuZDsKYXR0cmlidXRlIHZlYzMgYV90cmFuc2Zvcm0wOwphdHRyaWJ1dGUgdmVjMyBhX3RyYW5zZm9ybTE7CnVuaWZvcm0gdmVjMiB1X3Jlc29sdXRpb247CnVuaWZvcm0gbWF0MyB2aWV3TWF0cml4Owp1bmlmb3JtIG1hdDMgcHJvamVjdGlvbk1hdHJpeDsKCiNpZmRlZiBURVhUVVJFCmF0dHJpYnV0ZSB2ZWMzIGFfdmVydGV4VGV4dHVyZUNvb3JkOwp2YXJ5aW5nIHZlYzMgdlRleHR1cmVDb29yZDsKYXR0cmlidXRlIGZsb2F0IGFfZnJhbWVJbmRleDsKdmFyeWluZyBmbG9hdCBmcmFtZUluZGV4OwphdHRyaWJ1dGUgdmVjNCBhX3NvdXJjZVJlY3Q7CnZhcnlpbmcgdmVjNCB2U291cmNlUmVjdDsKI2VuZGlmCgojaWZkZWYgQ0xJUFBBVEgKYXR0cmlidXRlIHZlYzIgYV9jbGlwVVY7CnZhcnlpbmcgdmVjMiB2Q2xpcFVWOwojZW5kaWYKCiNpZmRlZiBDTE9VREZJTFRFUgphdHRyaWJ1dGUgdmVjNCBhX2NvbG9yQ2xvdWQwOwphdHRyaWJ1dGUgdmVjNCBhX2NvbG9yQ2xvdWQxOwphdHRyaWJ1dGUgdmVjNCBhX2NvbG9yQ2xvdWQyOwphdHRyaWJ1dGUgdmVjNCBhX2NvbG9yQ2xvdWQzOwphdHRyaWJ1dGUgdmVjNCBhX2NvbG9yQ2xvdWQ0Owp2YXJ5aW5nIHZlYzQgY29sb3JDbG91ZDA7CnZhcnlpbmcgdmVjNCBjb2xvckNsb3VkMTsKdmFyeWluZyB2ZWM0IGNvbG9yQ2xvdWQyOwp2YXJ5aW5nIHZlYzQgY29sb3JDbG91ZDM7CnZhcnlpbmcgdmVjNCBjb2xvckNsb3VkNDsKI2VuZGlmCgojaWZkZWYgQ0xPVURDT0xPUgphdHRyaWJ1dGUgdmVjNCBhX2ZpbGxDbG91ZENvbG9yOwphdHRyaWJ1dGUgdmVjNCBhX3N0cm9rZUNsb3VkQ29sb3I7CiNlbmRpZgoKI2lmZGVmIEdSQURJRU5UCnVuaWZvcm0gZmxvYXQgdV9yYWRpYWxHcmFkaWVudFZlY3Rvcls2XTsKdmFyeWluZyB2ZWMzIHZHcmFkaWVudFZlY3RvcjE7CnZhcnlpbmcgdmVjMyB2R3JhZGllbnRWZWN0b3IyOwojZW5kaWYKCnZvaWQgbWFpbigpIHsKICBnbF9Qb2ludFNpemUgPSAxLjA7CgogIG1hdDMgbW9kZWxNYXRyaXggPSBtYXQzKAogICAgYV90cmFuc2Zvcm0wLngsIGFfdHJhbnNmb3JtMS54LCAwLCAKICAgIGFfdHJhbnNmb3JtMC55LCBhX3RyYW5zZm9ybTEueSwgMCwKICAgIGFfdHJhbnNmb3JtMC56LCBhX3RyYW5zZm9ybTEueiwgMQogICk7CgogIHZlYzMgcG9zID0gcHJvamVjdGlvbk1hdHJpeCAqIHZpZXdNYXRyaXggKiBtb2RlbE1hdHJpeCAqIHZlYzMoYV92ZXJ0ZXhQb3NpdGlvbi54eSwgMS4wKTsKICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zLnh5LCAxLjAsIDEuMCk7CgojaWZkZWYgR1JBRElFTlQKICB2ZWMzIHZnMSA9IHZpZXdNYXRyaXggKiB2ZWMzKHVfcmFkaWFsR3JhZGllbnRWZWN0b3JbMF0sIHVfcmFkaWFsR3JhZGllbnRWZWN0b3JbMV0sIDEuMCk7CiAgdmVjMyB2ZzIgPSB2aWV3TWF0cml4ICogdmVjMyh1X3JhZGlhbEdyYWRpZW50VmVjdG9yWzNdLCB1X3JhZGlhbEdyYWRpZW50VmVjdG9yWzRdLCAxLjApOwogIGZsb2F0IGggPSB1X3Jlc29sdXRpb24ueTsKICB2ZzEueSA9IGggLSB2ZzEueTsKICB2ZzIueSA9IGggLSB2ZzIueTsKICB2R3JhZGllbnRWZWN0b3IxID0gdmVjMyh2ZzEueHksIHVfcmFkaWFsR3JhZGllbnRWZWN0b3JbMl0pOwogIHZHcmFkaWVudFZlY3RvcjIgPSB2ZWMzKHZnMi54eSwgdV9yYWRpYWxHcmFkaWVudFZlY3Rvcls1XSk7CiNlbmRpZgogIAogIGZsYWdCYWNrZ3JvdW5kID0gYV92ZXJ0ZXhQb3NpdGlvbi56OwoKI2lmZGVmIENMT1VEQ09MT1IKICBpZihmbGFnQmFja2dyb3VuZCA+IDAuMCkgewogICAgdkNvbG9yID0gbWl4KGFfY29sb3IsIGFfZmlsbENsb3VkQ29sb3IsIGFfZmlsbENsb3VkQ29sb3IuYSk7CiAgfSBlbHNlIHsKICAgIHZDb2xvciA9IG1peChhX2NvbG9yLCBhX3N0cm9rZUNsb3VkQ29sb3IsIGFfc3Ryb2tlQ2xvdWRDb2xvci5hKTsKICB9CiNlbHNlCiAgdkNvbG9yID0gYV9jb2xvcjsKI2VuZGlmCgojaWZkZWYgVEVYVFVSRQogIHZUZXh0dXJlQ29vcmQgPSBhX3ZlcnRleFRleHR1cmVDb29yZDsKICBmcmFtZUluZGV4ID0gYV9mcmFtZUluZGV4OwogIHZTb3VyY2VSZWN0ID0gYV9zb3VyY2VSZWN0OwojZW5kaWYKCiNpZmRlZiBDTElQUEFUSAogIHZDbGlwVVYgPSBhX2NsaXBVVjsKI2VuZGlmCgojaWZkZWYgQ0xPVURGSUxURVIKICBjb2xvckNsb3VkMCA9IGFfY29sb3JDbG91ZDA7CiAgY29sb3JDbG91ZDEgPSBhX2NvbG9yQ2xvdWQxOwogIGNvbG9yQ2xvdWQyID0gYV9jb2xvckNsb3VkMjsKICBjb2xvckNsb3VkMyA9IGFfY29sb3JDbG91ZDM7CiAgY29sb3JDbG91ZDQgPSBhX2NvbG9yQ2xvdWQ0OwojZW5kaWYKfWB9LGZ1bmN0aW9uKGQscix0KXt0LnIociksci5kZWZhdWx0PWBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKCnZhcnlpbmcgdmVjNCB2Q29sb3I7CnZhcnlpbmcgZmxvYXQgZmxhZ0JhY2tncm91bmQ7CgojaWZkZWYgVEVYVFVSRQp2YXJ5aW5nIGZsb2F0IGZyYW1lSW5kZXg7CnZhcnlpbmcgdmVjMyB2VGV4dHVyZUNvb3JkOwp2YXJ5aW5nIHZlYzQgdlNvdXJjZVJlY3Q7CiNlbmRpZgoKI2lmZGVmIENMSVBQQVRICnZhcnlpbmcgdmVjMiB2Q2xpcFVWOwojZW5kaWYKCiNpZmRlZiBGSUxURVIKdW5pZm9ybSBpbnQgdV9maWx0ZXJGbGFnOwp1bmlmb3JtIGZsb2F0IHVfY29sb3JNYXRyaXhbMjBdOwojZW5kaWYKCiNpZmRlZiBDTE9VREZJTFRFUgp2YXJ5aW5nIHZlYzQgY29sb3JDbG91ZDA7CnZhcnlpbmcgdmVjNCBjb2xvckNsb3VkMTsKdmFyeWluZyB2ZWM0IGNvbG9yQ2xvdWQyOwp2YXJ5aW5nIHZlYzQgY29sb3JDbG91ZDM7CnZhcnlpbmcgdmVjNCBjb2xvckNsb3VkNDsKI2VuZGlmCgojaWZkZWYgR1JBRElFTlQKdmFyeWluZyB2ZWMzIHZHcmFkaWVudFZlY3RvcjE7CnZhcnlpbmcgdmVjMyB2R3JhZGllbnRWZWN0b3IyOwp1bmlmb3JtIGZsb2F0IHVfY29sb3JTdGVwc1s0MF07CnVuaWZvcm0gaW50IHVfZ3JhZGllbnRUeXBlOwoKdm9pZCBncmFkaWVudChpbm91dCB2ZWM0IGNvbG9yLCB2ZWMzIGd2MSwgdmVjMyBndjIsIGZsb2F0IGNvbG9yU3RlcHNbNDBdKSB7CiAgZmxvYXQgdDsKICAvLyBjZW50ZXIgY2lyY2xlIHJhZGl1cwogIGZsb2F0IGNyID0gZ3YxLno7CiAgLy8gZm9jYWwgY2lyY2xlIHJhZGl1cwogIGZsb2F0IGZyID0gZ3YyLno7CgogIGlmKGNyID4gMC4wIHx8IGZyID4gMC4wKSB7CiAgICAvLyByYWRpYWwgZ3JhZGllbnQKICAgIHZlYzIgY2VudGVyID0gZ3YxLnh5OwogICAgdmVjMiBmb2NhbCA9IGd2Mi54eTsKICAgIGZsb2F0IHggPSBmb2NhbC54IC0gZ2xfRnJhZ0Nvb3JkLng7CiAgICBmbG9hdCB5ID0gZm9jYWwueSAtIGdsX0ZyYWdDb29yZC55OwogICAgZmxvYXQgZHggPSBmb2NhbC54IC0gY2VudGVyLng7CiAgICBmbG9hdCBkeSA9IGZvY2FsLnkgLSBjZW50ZXIueTsKICAgIGZsb2F0IGRyID0gY3IgLSBmcjsKICAgIGZsb2F0IGEgPSBkeCAqIGR4ICsgZHkgKiBkeSAtIGRyICogZHI7CiAgICBmbG9hdCBiID0gLTIuMCAqICh5ICogZHkgKyB4ICogZHggKyBmciAqIGRyKTsKICAgIGZsb2F0IGMgPSB4ICogeCArIHkgKiB5IC0gZnIgKiBmcjsKICAgIHQgPSAxLjAgLSAwLjUgKiAoMS4wIC8gYSkgKiAoLWIgKyBzcXJ0KGIgKiBiIC0gNC4wICogYSAqIGMpKTsKICB9IGVsc2UgewogICAgLy8gbGluZWFyIGdyYWRpZW50CiAgICB2ZWMyIHYxID0gZ2xfRnJhZ0Nvb3JkLnh5IC0gZ3YxLnh5OwogICAgdmVjMiB2MiA9IGd2Mi54eSAtIGd2MS54eTsKICAgIHQgPSAodjEueCAqIHYyLnggKyB2MS55ICogdjIueSkgLyAodjIueCAqIHYyLnggKyB2Mi55ICogdjIueSk7CiAgfQoKICB2ZWM0IGNvbG9yc1s4XTsKICBjb2xvcnNbMF0gPSB2ZWM0KGNvbG9yU3RlcHNbMV0sIGNvbG9yU3RlcHNbMl0sIGNvbG9yU3RlcHNbM10sIGNvbG9yU3RlcHNbNF0pOwogIGNvbG9yc1sxXSA9IHZlYzQoY29sb3JTdGVwc1s2XSwgY29sb3JTdGVwc1s3XSwgY29sb3JTdGVwc1s4XSwgY29sb3JTdGVwc1s5XSk7CiAgY29sb3JzWzJdID0gdmVjNChjb2xvclN0ZXBzWzExXSwgY29sb3JTdGVwc1sxMl0sIGNvbG9yU3RlcHNbMTNdLCBjb2xvclN0ZXBzWzE0XSk7CiAgY29sb3JzWzNdID0gdmVjNChjb2xvclN0ZXBzWzE2XSwgY29sb3JTdGVwc1sxN10sIGNvbG9yU3RlcHNbMThdLCBjb2xvclN0ZXBzWzE5XSk7CiAgY29sb3JzWzRdID0gdmVjNChjb2xvclN0ZXBzWzIxXSwgY29sb3JTdGVwc1syMl0sIGNvbG9yU3RlcHNbMjNdLCBjb2xvclN0ZXBzWzI0XSk7CiAgY29sb3JzWzVdID0gdmVjNChjb2xvclN0ZXBzWzI2XSwgY29sb3JTdGVwc1syN10sIGNvbG9yU3RlcHNbMjhdLCBjb2xvclN0ZXBzWzI5XSk7CiAgY29sb3JzWzZdID0gdmVjNChjb2xvclN0ZXBzWzMxXSwgY29sb3JTdGVwc1szMl0sIGNvbG9yU3RlcHNbMzNdLCBjb2xvclN0ZXBzWzM0XSk7CiAgY29sb3JzWzddID0gdmVjNChjb2xvclN0ZXBzWzM2XSwgY29sb3JTdGVwc1szN10sIGNvbG9yU3RlcHNbMzhdLCBjb2xvclN0ZXBzWzM5XSk7CiAgCiAgZmxvYXQgc3RlcHNbOF07CiAgc3RlcHNbMF0gPSBjb2xvclN0ZXBzWzBdOwogIHN0ZXBzWzFdID0gY29sb3JTdGVwc1s1XTsKICBzdGVwc1syXSA9IGNvbG9yU3RlcHNbMTBdOwogIHN0ZXBzWzNdID0gY29sb3JTdGVwc1sxNV07CiAgc3RlcHNbNF0gPSBjb2xvclN0ZXBzWzIwXTsKICBzdGVwc1s1XSA9IGNvbG9yU3RlcHNbMjVdOwogIHN0ZXBzWzZdID0gY29sb3JTdGVwc1szMF07CiAgc3RlcHNbN10gPSBjb2xvclN0ZXBzWzM1XTsKCiAgY29sb3IgPSBjb2xvcnNbMF07CiAgZm9yIChpbnQgaSA9IDE7IGkgPCA4OyBpKyspIHsKICAgIGlmIChzdGVwc1tpXSA8IDAuMCB8fCBzdGVwc1tpXSA+IDEuMCkgewogICAgICBicmVhazsKICAgIH0KICAgIGlmKHN0ZXBzW2ldID09IHN0ZXBzW2kgLSAxXSkgewogICAgICBjb2xvciA9IGNvbG9yc1tpXTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbG9yID0gbWl4KGNvbG9yLCBjb2xvcnNbaV0sIGNsYW1wKCh0IC0gc3RlcHNbaSAtIDFdKSAvIChzdGVwc1tpXSAtIHN0ZXBzW2kgLSAxXSksIDAuMCwgMS4wKSk7CiAgICB9CiAgICBpZiAoc3RlcHNbaV0gPj0gdCkgewogICAgICBicmVhazsKICAgIH0KICB9Cn0KI2VuZGlmCgp2b2lkIHRyYW5zZm9ybUNvbG9yKGlub3V0IHZlYzQgY29sb3IsIGluIGZsb2F0IGNvbG9yTWF0cml4WzIwXSkgewogIGZsb2F0IHIgPSBjb2xvci5yLCBnID0gY29sb3IuZywgYiA9IGNvbG9yLmIsIGEgPSBjb2xvci5hOwogIGNvbG9yWzBdID0gY29sb3JNYXRyaXhbMF0gKiByICsgY29sb3JNYXRyaXhbMV0gKiBnICsgY29sb3JNYXRyaXhbMl0gKiBiICsgY29sb3JNYXRyaXhbM10gKiBhICsgY29sb3JNYXRyaXhbNF07CiAgY29sb3JbMV0gPSBjb2xvck1hdHJpeFs1XSAqIHIgKyBjb2xvck1hdHJpeFs2XSAqIGcgKyBjb2xvck1hdHJpeFs3XSAqIGIgKyBjb2xvck1hdHJpeFs4XSAqIGEgKyBjb2xvck1hdHJpeFs5XTsKICBjb2xvclsyXSA9IGNvbG9yTWF0cml4WzEwXSAqIHIgKyBjb2xvck1hdHJpeFsxMV0gKiBnICsgY29sb3JNYXRyaXhbMTJdICogYiArIGNvbG9yTWF0cml4WzEzXSAqIGEgKyBjb2xvck1hdHJpeFsxNF07CiAgY29sb3JbM10gPSBjb2xvck1hdHJpeFsxNV0gKiByICsgY29sb3JNYXRyaXhbMTZdICogZyArIGNvbG9yTWF0cml4WzE3XSAqIGIgKyBjb2xvck1hdHJpeFsxOF0gKiBhICsgY29sb3JNYXRyaXhbMTldOwp9CgojaWZkZWYgQ0xPVURGSUxURVIKdm9pZCBidWlsZENsb3VkQ29sb3IoaW5vdXQgZmxvYXQgY29sb3JDbG91ZE1hdHJpeFsyMF0pIHsKICBjb2xvckNsb3VkTWF0cml4WzBdID0gY29sb3JDbG91ZDBbMF07CiAgY29sb3JDbG91ZE1hdHJpeFsxXSA9IGNvbG9yQ2xvdWQxWzBdOwogIGNvbG9yQ2xvdWRNYXRyaXhbMl0gPSBjb2xvckNsb3VkMlswXTsKICBjb2xvckNsb3VkTWF0cml4WzNdID0gY29sb3JDbG91ZDNbMF07CiAgY29sb3JDbG91ZE1hdHJpeFs0XSA9IGNvbG9yQ2xvdWQ0WzBdOwoKICBjb2xvckNsb3VkTWF0cml4WzVdID0gY29sb3JDbG91ZDBbMV07CiAgY29sb3JDbG91ZE1hdHJpeFs2XSA9IGNvbG9yQ2xvdWQxWzFdOwogIGNvbG9yQ2xvdWRNYXRyaXhbN10gPSBjb2xvckNsb3VkMlsxXTsKICBjb2xvckNsb3VkTWF0cml4WzhdID0gY29sb3JDbG91ZDNbMV07CiAgY29sb3JDbG91ZE1hdHJpeFs5XSA9IGNvbG9yQ2xvdWQ0WzFdOwoKICBjb2xvckNsb3VkTWF0cml4WzEwXSA9IGNvbG9yQ2xvdWQwWzJdOwogIGNvbG9yQ2xvdWRNYXRyaXhbMTFdID0gY29sb3JDbG91ZDFbMl07CiAgY29sb3JDbG91ZE1hdHJpeFsxMl0gPSBjb2xvckNsb3VkMlsyXTsKICBjb2xvckNsb3VkTWF0cml4WzEzXSA9IGNvbG9yQ2xvdWQzWzJdOwogIGNvbG9yQ2xvdWRNYXRyaXhbMTRdID0gY29sb3JDbG91ZDRbMl07CgogIGNvbG9yQ2xvdWRNYXRyaXhbMTVdID0gY29sb3JDbG91ZDBbM107CiAgY29sb3JDbG91ZE1hdHJpeFsxNl0gPSBjb2xvckNsb3VkMVszXTsKICBjb2xvckNsb3VkTWF0cml4WzE3XSA9IGNvbG9yQ2xvdWQyWzNdOwogIGNvbG9yQ2xvdWRNYXRyaXhbMThdID0gY29sb3JDbG91ZDNbM107CiAgY29sb3JDbG91ZE1hdHJpeFsxOV0gPSBjb2xvckNsb3VkNFszXTsKfQojZW5kaWYKCnZvaWQgbWFpbigpIHsKICB2ZWM0IGNvbG9yID0gdkNvbG9yOwogIGZsb2F0IG9wYWNpdHkgPSBhYnMoZmxhZ0JhY2tncm91bmQpOwoKI2lmZGVmIEdSQURJRU5UCiAgaWYodV9ncmFkaWVudFR5cGUgPiAwICYmIGZsYWdCYWNrZ3JvdW5kID4gMC4wIHx8IHVfZ3JhZGllbnRUeXBlID09IDAgJiYgZmxhZ0JhY2tncm91bmQgPD0gMC4wKSB7CiAgICBncmFkaWVudChjb2xvciwgdkdyYWRpZW50VmVjdG9yMSwgdkdyYWRpZW50VmVjdG9yMiwgdV9jb2xvclN0ZXBzKTsKICB9CiNlbmRpZgoKICBpZihvcGFjaXR5IDwgMS4wKSB7CiAgICBjb2xvci5hICo9IG9wYWNpdHk7CiAgfQoKI2lmZGVmIFRFWFRVUkUKICBpZihmbGFnQmFja2dyb3VuZCA+IDAuMCkgewogICAgdmVjMyB0ZXhDb29yZCA9IHZUZXh0dXJlQ29vcmQ7CgogICAgaWYodGV4Q29vcmQueiA9PSAxLjApIHsKICAgICAgdGV4Q29vcmQgPSBmcmFjdCh0ZXhDb29yZCk7CiAgICB9CgogICAgaWYodGV4Q29vcmQueCA8PSAxLjAgJiYgdGV4Q29vcmQueCA+PSAwLjAKICAgICAgJiYgdGV4Q29vcmQueSA8PSAxLjAgJiYgdGV4Q29vcmQueSA+PSAwLjApIHsKICAgICAgaWYodlNvdXJjZVJlY3QueiA+IDAuMCkgewogICAgICAgIHRleENvb3JkLnggPSB2U291cmNlUmVjdC54ICsgdGV4Q29vcmQueCAqIHZTb3VyY2VSZWN0Lno7CiAgICAgICAgdGV4Q29vcmQueSA9IDEuMCAtICh2U291cmNlUmVjdC55ICsgKDEuMCAtIHRleENvb3JkLnkpICogdlNvdXJjZVJlY3Qudyk7CiAgICAgIH0KICAgICAgaWYoZnJhbWVJbmRleCA8IDAuMCkgewogICAgICAgIHZlYzQgdGV4Q29sb3IgPSB0ZXh0dXJlMkQodV90ZXhTYW1wbGVyLCB0ZXhDb29yZC54eSk7CiAgICAgICAgY29sb3IgPSBtaXgoY29sb3IsIHRleENvbG9yLCB0ZXhDb2xvci5hKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbnQgaW5kZXggPSBpbnQoZmxvb3IoY2xhbXAoMC4wLCAxMS4wLCBmcmFtZUluZGV4KSkpOwogICAgICAgIHZlYzQgdGV4Q29sb3I7CiAgICAgICAgaWYoaW5kZXggPT0gMCkgdGV4Q29sb3IgPSB0ZXh0dXJlMkQodV90ZXhGcmFtZTAsIHRleENvb3JkLnh5KTsKICAgICAgICBlbHNlIGlmKGluZGV4ID09IDEpIHRleENvbG9yID0gdGV4dHVyZTJEKHVfdGV4RnJhbWUxLCB0ZXhDb29yZC54eSk7CiAgICAgICAgZWxzZSBpZihpbmRleCA9PSAyKSB0ZXhDb2xvciA9IHRleHR1cmUyRCh1X3RleEZyYW1lMiwgdGV4Q29vcmQueHkpOwogICAgICAgIGVsc2UgaWYoaW5kZXggPT0gMykgdGV4Q29sb3IgPSB0ZXh0dXJlMkQodV90ZXhGcmFtZTMsIHRleENvb3JkLnh5KTsKICAgICAgICBlbHNlIGlmKGluZGV4ID09IDQpIHRleENvbG9yID0gdGV4dHVyZTJEKHVfdGV4RnJhbWU0LCB0ZXhDb29yZC54eSk7CiAgICAgICAgZWxzZSBpZihpbmRleCA9PSA1KSB0ZXhDb2xvciA9IHRleHR1cmUyRCh1X3RleEZyYW1lNSwgdGV4Q29vcmQueHkpOwogICAgICAgIGVsc2UgaWYoaW5kZXggPT0gNikgdGV4Q29sb3IgPSB0ZXh0dXJlMkQodV90ZXhGcmFtZTYsIHRleENvb3JkLnh5KTsKICAgICAgICBlbHNlIGlmKGluZGV4ID09IDcpIHRleENvbG9yID0gdGV4dHVyZTJEKHVfdGV4RnJhbWU3LCB0ZXhDb29yZC54eSk7CiAgICAgICAgZWxzZSBpZihpbmRleCA9PSA4KSB0ZXhDb2xvciA9IHRleHR1cmUyRCh1X3RleEZyYW1lOCwgdGV4Q29vcmQueHkpOwogICAgICAgIGVsc2UgaWYoaW5kZXggPT0gOSkgdGV4Q29sb3IgPSB0ZXh0dXJlMkQodV90ZXhGcmFtZTksIHRleENvb3JkLnh5KTsKICAgICAgICBlbHNlIGlmKGluZGV4ID09IDEwKSB0ZXhDb2xvciA9IHRleHR1cmUyRCh1X3RleEZyYW1lMTAsIHRleENvb3JkLnh5KTsKICAgICAgICBlbHNlIHRleENvbG9yID0gdGV4dHVyZTJEKHVfdGV4RnJhbWUxMSwgdGV4Q29vcmQueHkpOwogICAgICAgIGZsb2F0IGFscGhhID0gdGV4Q29sb3IuYTsKICAgICAgICBpZihvcGFjaXR5IDwgMS4wKSB7CiAgICAgICAgICB0ZXhDb2xvci5hICo9IG9wYWNpdHk7CiAgICAgICAgICBhbHBoYSAqPSBtaXgoMC40NjUsIDEuMCwgb3BhY2l0eSk7CiAgICAgICAgfQogICAgICAgIC8vIGNvbG9yID0gbWl4KGNvbG9yLCB0ZXhDb2xvciwgdGV4Q29sb3IuYSk7CiAgICAgICAgY29sb3IucmdiID0gbWl4KGNvbG9yLnJnYiwgdGV4Q29sb3IucmdiLCBhbHBoYSk7CiAgICAgICAgLy8gY29sb3IucmdiID0gbWl4KHRleENvbG9yLnJnYiwgY29sb3IucmdiLCBjb2xvci5hKTsKICAgICAgICBjb2xvci5yZ2IgPSBtaXgodGV4Q29sb3IucmdiLCBjb2xvci5yZ2IsIGNsYW1wKGNvbG9yLmEgLyBtYXgoMC4wMDAxLCB0ZXhDb2xvci5hKSwgMC4wLCAxLjApKTsKICAgICAgICBjb2xvci5hID0gdGV4Q29sb3IuYSArICgxLjAgLSB0ZXhDb2xvci5hKSAqIGNvbG9yLmE7CiAgICAgIH0KICAgIH0KICB9CiNlbmRpZgoKI2lmZGVmIEZJTFRFUgogIGlmKHVfZmlsdGVyRmxhZyA+IDApIHsKICAgIHRyYW5zZm9ybUNvbG9yKGNvbG9yLCB1X2NvbG9yTWF0cml4KTsKICB9CiNlbmRpZgoKI2lmZGVmIENMT1VERklMVEVSCiAgZmxvYXQgY29sb3JDbG91ZE1hdHJpeFsyMF07CiAgYnVpbGRDbG91ZENvbG9yKGNvbG9yQ2xvdWRNYXRyaXgpOwogIHRyYW5zZm9ybUNvbG9yKGNvbG9yLCBjb2xvckNsb3VkTWF0cml4KTsKI2VuZGlmCgojaWZkZWYgQ0xJUFBBVEgKICBmbG9hdCBjbGlwID0gdGV4dHVyZTJEKHVfY2xpcFNhbXBsZXIsIHZDbGlwVVYpLnI7CiAgY29sb3IgKj0gY2xpcDsKI2VuZGlmCgogIGdsX0ZyYWdDb2xvciA9IGNvbG9yOwp9YH0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSwoZnVuY3Rpb24oZSxuKXt0LmQociwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIixmdW5jdGlvbigpe3JldHVybiBzfSksdC5kKHIsImNhbmNlbEFuaW1hdGlvbkZyYW1lIixmdW5jdGlvbigpe3JldHVybiBpfSksdCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2Z1bmN0aW9uIGEoKXtpZih0eXBlb2YgcGVyZm9ybWFuY2U8InUiJiZwZXJmb3JtYW5jZS5ub3cpcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpO2lmKHR5cGVvZiBlPCJ1IiYmZS5ocnRpbWUpe2NvbnN0W28sY109ZS5ocnRpbWUoKTtyZXR1cm4gbyoxZTMrYyoxZS02fXJldHVybiBEYXRlLm5vdz9EYXRlLm5vdygpOm5ldyBEYXRlKCkuZ2V0VGltZSgpfWxldCBzLGk7dHlwZW9mIG48InUiJiZ0eXBlb2Ygbi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9PSJmdW5jdGlvbiI/KHM9bi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUsaT1uLmNhbmNlbEFuaW1hdGlvbkZyYW1lKToocz1mdW5jdGlvbihvKXtyZXR1cm4gc2V0VGltZW91dCgoKT0+e28oYSgpKX0sMTYpfSxpPWZ1bmN0aW9uKG8pe3JldHVybiBjbGVhclRpbWVvdXQobyl9KX0pLmNhbGwodGhpcyx0KDY5KSx0KDIyKSl9LGZ1bmN0aW9uKGQscil7dmFyIHQ9ZC5leHBvcnRzPXt9LGUsbjtmdW5jdGlvbiBhKCl7dGhyb3cgbmV3IEVycm9yKCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9ZnVuY3Rpb24gcygpe3Rocm93IG5ldyBFcnJvcigiY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9KGZ1bmN0aW9uKCl7dHJ5e3R5cGVvZiBzZXRUaW1lb3V0PT0iZnVuY3Rpb24iP2U9c2V0VGltZW91dDplPWF9Y2F0Y2h7ZT1hfXRyeXt0eXBlb2YgY2xlYXJUaW1lb3V0PT0iZnVuY3Rpb24iP249Y2xlYXJUaW1lb3V0Om49c31jYXRjaHtuPXN9fSkoKTtmdW5jdGlvbiBpKFQpe2lmKGU9PT1zZXRUaW1lb3V0KXJldHVybiBzZXRUaW1lb3V0KFQsMCk7aWYoKGU9PT1hfHwhZSkmJnNldFRpbWVvdXQpcmV0dXJuIGU9c2V0VGltZW91dCxzZXRUaW1lb3V0KFQsMCk7dHJ5e3JldHVybiBlKFQsMCl9Y2F0Y2h7dHJ5e3JldHVybiBlLmNhbGwobnVsbCxULDApfWNhdGNoe3JldHVybiBlLmNhbGwodGhpcyxULDApfX19ZnVuY3Rpb24gbyhUKXtpZihuPT09Y2xlYXJUaW1lb3V0KXJldHVybiBjbGVhclRpbWVvdXQoVCk7aWYoKG49PT1zfHwhbikmJmNsZWFyVGltZW91dClyZXR1cm4gbj1jbGVhclRpbWVvdXQsY2xlYXJUaW1lb3V0KFQpO3RyeXtyZXR1cm4gbihUKX1jYXRjaHt0cnl7cmV0dXJuIG4uY2FsbChudWxsLFQpfWNhdGNoe3JldHVybiBuLmNhbGwodGhpcyxUKX19fXZhciBjPVtdLG09ITEsdSxwPS0xO2Z1bmN0aW9uIHkoKXshbXx8IXV8fChtPSExLHUubGVuZ3RoP2M9dS5jb25jYXQoYyk6cD0tMSxjLmxlbmd0aCYmTygpKX1mdW5jdGlvbiBPKCl7aWYoIW0pe3ZhciBUPWkoeSk7bT0hMDtmb3IodmFyIGw9Yy5sZW5ndGg7bDspe2Zvcih1PWMsYz1bXTsrK3A8bDspdSYmdVtwXS5ydW4oKTtwPS0xLGw9Yy5sZW5ndGh9dT1udWxsLG09ITEsbyhUKX19dC5uZXh0VGljaz1mdW5jdGlvbihUKXt2YXIgbD1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZihhcmd1bWVudHMubGVuZ3RoPjEpZm9yKHZhciBoPTE7aDxhcmd1bWVudHMubGVuZ3RoO2grKylsW2gtMV09YXJndW1lbnRzW2hdO2MucHVzaChuZXcgeChULGwpKSxjLmxlbmd0aD09PTEmJiFtJiZpKE8pfTtmdW5jdGlvbiB4KFQsbCl7dGhpcy5mdW49VCx0aGlzLmFycmF5PWx9eC5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX0sdC50aXRsZT0iYnJvd3NlciIsdC5icm93c2VyPSEwLHQuZW52PXt9LHQuYXJndj1bXSx0LnZlcnNpb249IiIsdC52ZXJzaW9ucz17fTtmdW5jdGlvbiB2KCl7fXQub249dix0LmFkZExpc3RlbmVyPXYsdC5vbmNlPXYsdC5vZmY9dix0LnJlbW92ZUxpc3RlbmVyPXYsdC5yZW1vdmVBbGxMaXN0ZW5lcnM9dix0LmVtaXQ9dix0LnByZXBlbmRMaXN0ZW5lcj12LHQucHJlcGVuZE9uY2VMaXN0ZW5lcj12LHQubGlzdGVuZXJzPWZ1bmN0aW9uKFQpe3JldHVybltdfSx0LmJpbmRpbmc9ZnVuY3Rpb24oVCl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCIpfSx0LmN3ZD1mdW5jdGlvbigpe3JldHVybiIvIn0sdC5jaGRpcj1mdW5jdGlvbihUKXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCIpfSx0LnVtYXNrPWZ1bmN0aW9uKCl7cmV0dXJuIDB9fSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJkZWZhdWx0IixmdW5jdGlvbigpe3JldHVybiBDfSk7dmFyIGU9dCgxKSxuPXQoNzEpLGE9dCg3Mykscz10KDIxMyksaT10KDIxNCksbz10KDIxNSksYz10KDIxNik7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2Z1bmN0aW9uIG0oYixFKXt2YXIgTD1PYmplY3Qua2V5cyhiKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgRD1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGIpO0UmJihEPUQuZmlsdGVyKGZ1bmN0aW9uKEkpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGIsSSkuZW51bWVyYWJsZX0pKSxMLnB1c2guYXBwbHkoTCxEKX1yZXR1cm4gTH1mdW5jdGlvbiB1KGIpe2Zvcih2YXIgRT0xO0U8YXJndW1lbnRzLmxlbmd0aDtFKyspe3ZhciBMPWFyZ3VtZW50c1tFXSE9bnVsbD9hcmd1bWVudHNbRV06e307RSUyP20oT2JqZWN0KEwpLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKEQpe3AoYixELExbRF0pfSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYixPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhMKSk6bShPYmplY3QoTCkpLmZvckVhY2goZnVuY3Rpb24oRCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGIsRCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEwsRCkpfSl9cmV0dXJuIGJ9ZnVuY3Rpb24gcChiLEUsTCl7cmV0dXJuIEUgaW4gYj9PYmplY3QuZGVmaW5lUHJvcGVydHkoYixFLHt2YWx1ZTpMLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6YltFXT1MLGJ9Y29uc3QgeT1TeW1ib2wuZm9yKCJzcHJpdGVqc19jaGFuZ2VkQXR0cnMiKSxPPVN5bWJvbC5mb3IoInNwcml0ZWpzX2F0dHJpYnV0ZXMiKSx4PVN5bWJvbCgicmVzb2x1dGlvbiIpLHY9U3ltYm9sKCJhbmltYXRpb25zIiksVD1TeW1ib2woImV2ZW50TGlzdGVuZXJzIiksbD1TeW1ib2woImNhcHR1cmVFdmVudExpc3RlbmVycyIpLGg9U3ltYm9sKCJmaWx0ZXJzIiksZj1TeW1ib2woImRpc3BsYXkiKSxnPVN5bWJvbCgicHJvZ3JhbSIpLE09U3ltYm9sKCJzaGFkZXJBdHRycyIpLEE9U3ltYm9sKCJ1bmlmb3JtcyIpO2NsYXNzIEN7Y29uc3RydWN0b3IoRT17fSl7dGhpcy5hdHRyaWJ1dGVzPW5ldyB0aGlzLmNvbnN0cnVjdG9yLkF0dHIodGhpcyksdGhpc1t4XT17d2lkdGg6MzAwLGhlaWdodDoxNTB9LE9iamVjdC5hc3NpZ24odGhpcy5hdHRyaWJ1dGVzLEUpLHRoaXNbdl09bmV3IFNldCx0aGlzW1RdPXt9LHRoaXNbbF09e319Z2V0IGFuY2VzdG9ycygpe2xldCBFPXRoaXMucGFyZW50O2NvbnN0IEw9W107Zm9yKDtFOylMLnB1c2goRSksRT1FLnBhcmVudDtyZXR1cm4gTH1nZXQgYW5pbWF0aW9ucygpe3JldHVybiB0aGlzW3ZdfWdldCBmaWx0ZXJzKCl7cmV0dXJuIHRoaXNbaF18fHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5maWx0ZXJzfWdldCBpc1Zpc2libGUoKXtyZXR1cm4hMX1nZXQgbGF5ZXIoKXtyZXR1cm4gdGhpcy5wYXJlbnQ/dGhpcy5wYXJlbnQubGF5ZXI6bnVsbH1nZXQgbG9jYWxNYXRyaXgoKXtjb25zdCBFPXRoaXMudHJhbnNmb3JtTWF0cml4LHt4OkwseTpEfT10aGlzLmF0dHJpYnV0ZXM7cmV0dXJuIEVbNF0rPUwsRVs1XSs9RCxFfWdldCBvcGFjaXR5KCl7bGV0IEU9dGhpcy5hdHRyaWJ1dGVzLm9wYWNpdHk7cmV0dXJuIHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5vcGFjaXR5IT1udWxsJiYoRSo9dGhpcy5wYXJlbnQub3BhY2l0eSksRX1nZXQgcGFyZW50Tm9kZSgpe3JldHVybiB0aGlzLnBhcmVudH1nZXQgbmV4dFNpYmxpbmcoKXtyZXR1cm4gdGhpcy5nZXROb2RlTmVhckJ5KDEpfWdldCBwcmV2aW91c1NpYmxpbmcoKXtyZXR1cm4gdGhpcy5nZXROb2RlTmVhckJ5KC0xKX1nZXQgcHJvZ3JhbSgpe3JldHVybiB0aGlzW2ddfWdldCByZW5kZXJlcigpe3JldHVybiB0aGlzLnBhcmVudD90aGlzLnBhcmVudC5yZW5kZXJlcjpudWxsfWdldCByZW5kZXJNYXRyaXgoKXtpZih0aGlzLl9fY2FjaGVSZW5kZXJNYXRyaXgpcmV0dXJuIHRoaXMuX19jYWNoZVJlbmRlck1hdHJpeDtsZXQgRT10aGlzLmxvY2FsTWF0cml4O2NvbnN0IEw9dGhpcy5wYXJlbnQ7aWYoTCl7Y29uc3QgRD1MLl9fY2FjaGVSZW5kZXJNYXRyaXh8fEwucmVuZGVyTWF0cml4O0QmJihFPWUubWF0MmQubXVsdGlwbHkoQXJyYXkub2YoMCwwLDAsMCwwLDApLEQsRSkpfXJldHVybiBFfWdldCB3b3JsZFNjYWxpbmcoKXtjb25zdCBFPXRoaXMucmVuZGVyTWF0cml4O3JldHVybltNYXRoLmh5cG90KEVbMF0sRVsxXSksTWF0aC5oeXBvdChFWzJdLEVbM10pXX1nZXQgd29ybGRSb3RhdGlvbigpe2NvbnN0IEU9dGhpcy5yZW5kZXJNYXRyaXg7cmV0dXJuIE1hdGguYXRhbjIoRVsxXSxFWzNdKX1nZXQgd29ybGRQb3NpdGlvbigpe2NvbnN0IEU9dGhpcy5yZW5kZXJNYXRyaXg7cmV0dXJuW0VbNF0sRVs1XV19Z2V0IHVuaWZvcm1zKCl7cmV0dXJuIHRoaXNbQV19Z2V0IGNsYXNzTmFtZSgpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXMuY2xhc3NOYW1lfXNldCBjbGFzc05hbWUoRSl7dGhpcy5hdHRyaWJ1dGVzLmNsYXNzTmFtZT1FfWdldCBpZCgpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXMuaWR9c2V0IGlkKEUpe3RoaXMuYXR0cmlidXRlcy5pZD1FfWdldCBuYW1lKCl7cmV0dXJuIHRoaXMuYXR0cmlidXRlcy5uYW1lfXNldCBuYW1lKEUpe3RoaXMuYXR0cmlidXRlcy5uYW1lPUV9Z2V0IHpJbmRleCgpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXMuekluZGV4fXNldCB6SW5kZXgoRSl7dGhpcy5hdHRyaWJ1dGVzLnpJbmRleD1FfWdldCBtZXNoKCl7cmV0dXJuIG51bGx9Z2V0IHNoYWRlckF0dHJzKCl7cmV0dXJuIHRoaXNbTV18fHt9fWFjdGl2YXRlQW5pbWF0aW9ucygpe2NvbnN0IEU9dGhpcy5sYXllcjtpZihFKXtjb25zdCBMPXRoaXNbdl07TC5mb3JFYWNoKEk9PntJLmJhc2VUaW1lbGluZT1FLnRpbWVsaW5lLEkucGxheSgpLEkuZmluaXNoZWQudGhlbigoKT0+e0wuZGVsZXRlKEkpfSl9KTtjb25zdCBEPXRoaXMuY2hpbGRyZW47RCYmRC5mb3JFYWNoKEk9PntJLmFjdGl2YXRlQW5pbWF0aW9ucyYmSS5hY3RpdmF0ZUFuaW1hdGlvbnMoKX0pfX1hZGRFdmVudExpc3RlbmVyKEUsTCxEPXt9KXtFPT09Im1vdXNld2hlZWwiJiYoRT0id2hlZWwiKSx0eXBlb2YgRD09ImJvb2xlYW4iJiYoRD17Y2FwdHVyZTpEfSk7Y29uc3R7Y2FwdHVyZTpJLG9uY2U6Un09RCxCPUk/bDpUO3JldHVybiB0aGlzW0JdW0VdPXRoaXNbQl1bRV18fFtdLHRoaXNbQl1bRV0ucHVzaCh7bGlzdGVuZXI6TCxvbmNlOlJ9KSx0aGlzfWFuaW1hdGUoRSxMKXtjb25zdCBEPW5ldyBhLmRlZmF1bHQodGhpcyxFLEwpO3JldHVybiB0aGlzLmVmZmVjdHMmJkQuYXBwbHlFZmZlY3RzKHRoaXMuZWZmZWN0cyksdGhpcy5sYXllciYmKEQuYmFzZVRpbWVsaW5lPXRoaXMubGF5ZXIudGltZWxpbmUsRC5wbGF5KCksRC5maW5pc2hlZC50aGVuKCgpPT57dGhpc1t2XS5kZWxldGUoRCl9KSksdGhpc1t2XS5hZGQoRCksRH1hdHRyKC4uLkUpe2lmKEUubGVuZ3RoPT09MClyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW09dO2lmKEUubGVuZ3RoPjEpe2xldFtMLERdPUU7cmV0dXJuIHR5cGVvZiBEPT0iZnVuY3Rpb24iJiYoRD1EKHRoaXMuYXR0cihMKSkpLHRoaXMuc2V0QXR0cmlidXRlKEwsRCksdGhpc31yZXR1cm4gdHlwZW9mIEVbMF09PSJzdHJpbmciP3RoaXMuZ2V0QXR0cmlidXRlKEVbMF0pOihPYmplY3QuYXNzaWduKHRoaXMuYXR0cmlidXRlcyxFWzBdKSx0aGlzKX1jbG9uZU5vZGUoKXtjb25zdCBFPW5ldyB0aGlzLmNvbnN0cnVjdG9yLEw9dGhpcy5hdHRyaWJ1dGVzW3ldO3JldHVybiBFLmF0dHIoTCksRX1jb25uZWN0KEUsTCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInBhcmVudCIse3ZhbHVlOkUsd3JpdGFibGU6ITEsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInpPcmRlciIse3ZhbHVlOkwsd3JpdGFibGU6ITEsY29uZmlndXJhYmxlOiEwfSksRS50aW1lbGluZSYmdGhpcy5hY3RpdmF0ZUFuaW1hdGlvbnMoKSx0aGlzLnNldFJlc29sdXRpb24oRS5nZXRSZXNvbHV0aW9uKCkpLHRoaXMuZm9yY2VVcGRhdGUoKSx0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImFwcGVuZCIsZGV0YWlsOntwYXJlbnQ6RSx6T3JkZXI6TH19KX1jb250YWlucyhFKXtmb3IoO0UmJnRoaXMhPT1FOylFPUUucGFyZW50O3JldHVybiEhRX1kZWFjdGl2YXRlQW5pbWF0aW9ucygpe3RoaXNbdl0uZm9yRWFjaChMPT5MLmNhbmNlbCgpKTtjb25zdCBFPXRoaXMuY2hpbGRyZW47RSYmRS5mb3JFYWNoKEw9PntMLmRlYWN0aXZhdGVBbmltYXRpb25zJiZMLmRlYWN0aXZhdGVBbmltYXRpb25zKCl9KX1kaXNjb25uZWN0KCl7Y29uc3R7cGFyZW50OkUsek9yZGVyOkx9PXRoaXM7ZGVsZXRlIHRoaXMucGFyZW50LGRlbGV0ZSB0aGlzLnpPcmRlcix0aGlzLmRlYWN0aXZhdGVBbmltYXRpb25zKCksdGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJyZW1vdmUiLGRldGFpbDp7cGFyZW50OkUsek9yZGVyOkx9fSksRSYmRS5mb3JjZVVwZGF0ZSgpfWRpc3BhdGNoRXZlbnQoRSl7RSBpbnN0YW5jZW9mIGkuZGVmYXVsdHx8KEU9bmV3IGkuZGVmYXVsdChFKSksRS50YXJnZXQ9dGhpcztsZXQgTD1FLnR5cGU7TD09PSJtb3VzZXdoZWVsIiYmKEw9IndoZWVsIik7Y29uc3QgRD1bdGhpc107bGV0IEk9dGhpcy5wYXJlbnQ7Zm9yKDtFLmJ1YmJsZXMmJkk7KUQucHVzaChJKSxJPUkucGFyZW50O2ZvcihsZXQgUj1ELmxlbmd0aC0xO1I+PTA7Ui0tKXtjb25zdCBCPURbUl0sej1CW2xdJiZCW2xdW0xdO2lmKHomJnoubGVuZ3RoJiYoRS5jdXJyZW50VGFyZ2V0PUIsei5mb3JFYWNoKCh7bGlzdGVuZXI6SyxvbmNlOlF9KT0+e0suY2FsbCh0aGlzLEUpLFEmJkQucmVtb3ZlRXZlbnRMaXN0ZW5lcihLKX0pLGRlbGV0ZSBFLmN1cnJlbnRUYXJnZXQpLCFFLmJ1YmJsZXMmJkUuY2FuY2VsQnViYmxlKWJyZWFrfWlmKCFFLmNhbmNlbEJ1YmJsZSlmb3IobGV0IFI9MDtSPEQubGVuZ3RoO1IrKyl7Y29uc3QgQj1EW1JdLHo9QltUXSYmQltUXVtMXTtpZih6JiZ6Lmxlbmd0aCYmKEUuY3VycmVudFRhcmdldD1CLHouZm9yRWFjaCgoe2xpc3RlbmVyOkssb25jZTpRfSk9PntLLmNhbGwodGhpcyxFKSxRJiZELnJlbW92ZUV2ZW50TGlzdGVuZXIoSyl9KSxkZWxldGUgRS5jdXJyZW50VGFyZ2V0KSwhRS5idWJibGVzfHxFLmNhbmNlbEJ1YmJsZSlicmVha319ZGlzcGF0Y2hQb2ludGVyRXZlbnQoRSl7Y29uc3R7bGF5ZXJYOkwsbGF5ZXJZOkR9PUU7cmV0dXJuIHRoaXMuaXNQb2ludENvbGxpc2lvbihMLEQpPyh0aGlzLmRpc3BhdGNoRXZlbnQoRSksITApOiExfWRyYXcoRT1bXSl7Y29uc3QgTD10aGlzLm1lc2g7aWYoTCl7aWYoT2JqZWN0KG8uYXBwbHlGaWx0ZXJzKShMLHRoaXMuZmlsdGVycyksRS5wdXNoKEwpLHRoaXNbZ10pe0wuc2V0UHJvZ3JhbSh0aGlzW2ddKTtjb25zdCBEPXRoaXNbTV07RCYmT2JqZWN0LmVudHJpZXMoRCkuZm9yRWFjaCgoW1IsQl0pPT57TC5zZXRBdHRyaWJ1dGUoUixCKX0pO2NvbnN0IEk9dGhpc1tBXTtpZih0aGlzW0FdKXtjb25zdCBSPXt9O09iamVjdC5lbnRyaWVzKEkpLmZvckVhY2goKFtCLHpdKT0+e3R5cGVvZiB6PT0iZnVuY3Rpb24iJiYoej16KHRoaXMsQikpLFJbQl09en0pLEwuc2V0VW5pZm9ybXMoUil9fU9iamVjdChjLmRlZmF1bHQpKHRoaXMsTCl9cmV0dXJuIEV9Zm9yY2VVcGRhdGUoKXt0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuZm9yY2VVcGRhdGUoKX1nZXRBdHRyaWJ1dGUoRSl7cmV0dXJuIHRoaXMuYXR0cmlidXRlc1tFXX1nZXRMaXN0ZW5lcnMoRSx7Y2FwdHVyZTpMPSExfT17fSl7cmV0dXJuWy4uLnRoaXNbTD9sOlRdW0VdfHxbXV19Z2V0Tm9kZU5lYXJCeShFPTEpe2lmKCF0aGlzLnBhcmVudClyZXR1cm4gbnVsbDtpZihFPT09MClyZXR1cm4gdGhpcztjb25zdCBMPXRoaXMucGFyZW50LmNoaWxkcmVuLEQ9TC5pbmRleE9mKHRoaXMpO3JldHVybiBMW0QrRV19Z2V0V29ybGRQb3NpdGlvbihFLEwpe2NvbnN0IEQ9dGhpcy5yZW5kZXJNYXRyaXgsST1FKkRbMF0rTCpEWzJdK0RbNF0sUj1FKkRbMV0rTCpEWzNdK0RbNV07cmV0dXJuW0ksUl19Z2V0T2Zmc2V0UG9zaXRpb24oRSxMKXtjb25zdCBEPWUubWF0MmQuaW52ZXJ0KEFycmF5Lm9mKDAsMCwwLDAsMCwwKSx0aGlzLnJlbmRlck1hdHJpeCksST1FKkRbMF0rTCpEWzJdK0RbNF0sUj1FKkRbMV0rTCpEWzNdK0RbNV07cmV0dXJuW0ksUl19Z2V0UmVzb2x1dGlvbigpe3JldHVybiB1KHt9LHRoaXNbeF0pfWlzUG9pbnRDb2xsaXNpb24oRSxMKXtpZighdGhpcy5tZXNoKXJldHVybiExO2NvbnN0IEQ9dGhpcy5hdHRyaWJ1dGVzLnBvaW50ZXJFdmVudHM7aWYoRD09PSJub25lInx8RCE9PSJhbGwiJiYhdGhpcy5pc1Zpc2libGUpcmV0dXJuITE7bGV0IEk9ImJvdGgiO3JldHVybiBEPT09InZpc2libGVGaWxsIiYmKEk9ImZpbGwiKSxEPT09InZpc2libGVTdHJva2UiJiYoST0ic3Ryb2tlIiksdGhpcy5tZXNoLmlzUG9pbnRDb2xsaXNpb24oRSxMLEkpfW9uUHJvcGVydHlDaGFuZ2UoRSxMLEQpe0UhPT0iaWQiJiZFIT09Im5hbWUiJiZFIT09ImNsYXNzTmFtZSImJkUhPT0icG9pbnRlckV2ZW50cyImJkUhPT0icGFzc0V2ZW50cyImJnRoaXMuZm9yY2VVcGRhdGUoKSxFPT09ImZpbHRlciImJih0aGlzW2hdPU9iamVjdChvLnBhcnNlRmlsdGVyU3RyaW5nKShMKSksRT09PSJ6SW5kZXgiJiZ0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucmVvcmRlcigpfXNldEF0dHJpYnV0ZShFLEwpe0U9PT0iYXR0cnMiJiZ0aGlzLmF0dHIoTCksdGhpcy5hdHRyaWJ1dGVzW0VdPUx9c2V0TW91c2VDYXB0dXJlKCl7dGhpcy5sYXllciYmKHRoaXMubGF5ZXIuX19tb3VzZUNhcHR1cmVkVGFyZ2V0PXRoaXMpfXNldFByb2dyYW0oRSl7dGhpc1tnXT1FLHRoaXMuZm9yY2VVcGRhdGUoKX1zZXRTaGFkZXJBdHRyaWJ1dGUoRSxMKXt0aGlzW01dPXRoaXNbTV18fHt9LHRoaXNbTV1bRV09TCx0aGlzLmZvcmNlVXBkYXRlKCl9c2V0VW5pZm9ybXMoRSl7dGhpc1tBXT10aGlzW0FdfHx7fSxPYmplY3QuYXNzaWduKHRoaXNbQV0sRSksdGhpcy5mb3JjZVVwZGF0ZSgpfXNldFJlc29sdXRpb24oe3dpZHRoOkUsaGVpZ2h0Okx9KXtjb25zdHt3aWR0aDpELGhlaWdodDpJfT10aGlzW3hdOyhEIT09RXx8SSE9PUwpJiYodGhpc1t4XT17d2lkdGg6RSxoZWlnaHQ6TH0sdGhpcy5mb3JjZVVwZGF0ZSgpLHRoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToicmVzb2x1dGlvbmNoYW5nZSIsZGV0YWlsOnt3aWR0aDpFLGhlaWdodDpMfX0pKX1zaG93KCl7dGhpcy5hdHRyaWJ1dGVzLmRpc3BsYXk9PT0ibm9uZSImJih0aGlzLmF0dHJpYnV0ZXMuZGlzcGxheT10aGlzW2ZdfHwiIil9aGlkZSgpe3RoaXMuYXR0cmlidXRlcy5kaXNwbGF5IT09Im5vbmUiJiYodGhpc1tmXT10aGlzLmF0dHJpYnV0ZXMuZGlzcGxheSx0aGlzLmF0dHJpYnV0ZXMuZGlzcGxheT0ibm9uZSIpfXJlbGVhc2VNb3VzZUNhcHR1cmUoKXt0aGlzLmxheWVyJiZ0aGlzLmxheWVyLl9fbW91c2VDYXB0dXJlZFRhcmdldD09PXRoaXMmJih0aGlzLmxheWVyLl9fbW91c2VDYXB0dXJlZFRhcmdldD1udWxsKX1yZW1vdmUoKXtyZXR1cm4gdGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJlbW92ZUNoaWxkPyh0aGlzLnBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKSwhMCk6ITF9cmVtb3ZlQWxsTGlzdGVuZXJzKEUsTD17fSl7dHlwZW9mIEw9PSJib29sZWFuIiYmKEw9e2NhcHR1cmU6TH0pO2NvbnN0IEk9TC5jYXB0dXJlP2w6VDtyZXR1cm4gdGhpc1tJXVtFXSYmKHRoaXNbSV1bRV09W10pLHRoaXN9cmVtb3ZlQXR0cmlidXRlKEUpe3RoaXMuc2V0QXR0cmlidXRlKEUsbnVsbCl9cmVtb3ZlRXZlbnRMaXN0ZW5lcihFLEwsRD17fSl7dHlwZW9mIEQ9PSJib29sZWFuIiYmKEQ9e2NhcHR1cmU6RH0pO2NvbnN0IFI9RC5jYXB0dXJlP2w6VDtpZih0aGlzW1JdW0VdKXtjb25zdCBCPXRoaXNbUl1bRV07aWYoQilmb3IobGV0IHo9MDt6PEIubGVuZ3RoO3orKyl7Y29uc3R7bGlzdGVuZXI6S309Qlt6XTtpZihLPT09TCl7dGhpc1tSXVtFXS5zcGxpY2UoeiwxKTticmVha319fXJldHVybiB0aGlzfXRyYW5zaXRpb24oRSxMPSJsaW5lYXIiKXtjb25zdCBEPXRoaXMsST1TeW1ib2woImFuaW1hdGlvbiIpO0w9THx8ImxpbmVhciI7bGV0IFI9MDtyZXR1cm4gdHlwZW9mIEU9PSJvYmplY3QiJiYoUj1FLmRlbGF5fHwwLEU9RS5kdXJhdGlvbikse1tJXTpudWxsLGNhbmNlbChCPSExKXtjb25zdCB6PXRoaXNbSV07eiYmei5jYW5jZWwoQil9LGVuZCgpe2NvbnN0IEI9dGhpc1tJXTtCJiYoQi5wbGF5U3RhdGU9PT0icnVubmluZyJ8fEIucGxheVN0YXRlPT09InBlbmRpbmciKSYmQi5maW5pc2goKX0scmV2ZXJzZSgpe2NvbnN0IEI9dGhpc1tJXTtpZihCKWlmKEIucGxheVN0YXRlPT09InJ1bm5pbmcifHxCLnBsYXlTdGF0ZT09PSJwZW5kaW5nIilCLnBsYXliYWNrUmF0ZT0tQi5wbGF5YmFja1JhdGU7ZWxzZXtjb25zdCB6PUIudGltaW5nLmRpcmVjdGlvbjtCLnRpbWluZy5kaXJlY3Rpb249ej09PSJyZXZlcnNlIj8ibm9ybWFsIjoicmV2ZXJzZSIsQi5wbGF5KCl9cmV0dXJuIEIuZmluaXNoZWR9LGF0dHIoQix6KXtyZXR1cm4gdGhpcy5lbmQoKSx0eXBlb2YgQj09InN0cmluZyImJihCPXtbQl06en0pLE9iamVjdC5lbnRyaWVzKEIpLmZvckVhY2goKFtLLFFdKT0+e3R5cGVvZiBRPT0iZnVuY3Rpb24iJiYoQltLXT1RKEQuYXR0cihLKSkpfSksdGhpc1tJXT1ELmFuaW1hdGUoW0JdLHtkdXJhdGlvbjpFKjFlMyxkZWxheTpSKjFlMyxmaWxsOiJmb3J3YXJkcyIsZWFzaW5nOkx9KSx0aGlzW0ldLmZpbmlzaGVkfX19dXBkYXRlQ29udG91cnMoKXt9fXAoQywiQXR0ciIsbi5kZWZhdWx0KSxzLmRlZmF1bHQucmVnaXN0ZXJOb2RlKEMsIm5vZGUiKX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gQ30pO3ZhciBlPXQoMSksbj10KDEyKSxhPXQoNzIpO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtjb25zdCBzPVN5bWJvbC5mb3IoInNwcml0ZWpzX3NldEF0dHJpYnV0ZURlZmF1bHQiKSxpPVN5bWJvbC5mb3IoInNwcml0ZWpzX2RlY2xhcmVBbGlhcyIpLG89U3ltYm9sLmZvcigic3ByaXRlanNfc2V0QXR0cmlidXRlIiksYz1TeW1ib2wuZm9yKCJzcHJpdGVqc19nZXRBdHRyaWJ1dGUiKSxtPVN5bWJvbC5mb3IoInNwcml0ZWpzX2F0dHJpYnV0ZXMiKSx1PVN5bWJvbC5mb3IoInNwcml0ZWpzX2NoYW5nZWRBdHRycyIpLHA9U3ltYm9sKCJzdWJqZWN0IikseT1TeW1ib2woImF0dHIiKSxPPVN5bWJvbCgiZGVmYXVsdCIpLHg9U3ltYm9sKCJhbGlhcyIpO2Z1bmN0aW9uIHYoYixbRSxMXSl7bGV0IEQ9ZS5tYXQyZC5mcm9tVmFsdWVzKDEsMCwwLDEsMCwwKTtyZXR1cm5bLi4uYl0uZm9yRWFjaCgoW0ksUl0pPT57aWYoKEV8fEwpJiYoRD1lLm1hdDJkLnRyYW5zbGF0ZShBcnJheS5vZigwLDAsMCwwLDAsMCksRCxbRSxMXSkpLEk9PT0ibWF0cml4IilEPWUubWF0MmQubXVsdGlwbHkoRCxELFIpO2Vsc2UgaWYoST09PSJvZmZzZXRUcmFuc2xhdGUiKURbNF0rPVJbMF0sRFs1XSs9UlsxXTtlbHNlIGlmKEk9PT0ib2Zmc2V0Um90YXRlIilEPWUubWF0MmQucm90YXRlKEFycmF5Lm9mKDAsMCwwLDAsMCwwKSxELFIpO2Vsc2UgaWYoST09PSJza2V3Iil7Y29uc3RbQix6XT1SO0Q9ZS5tYXQyZC5tdWx0aXBseShELEQsZS5tYXQyZC5mcm9tVmFsdWVzKDEsTWF0aC50YW4oeiksTWF0aC50YW4oQiksMSwwLDApKX1lbHNlIGUubWF0MmRbSV0oRCxELFIpOyhFfHxMKSYmKEQ9ZS5tYXQyZC50cmFuc2xhdGUoQXJyYXkub2YoMCwwLDAsMCwwLDApLEQsWy1FLC1MXSkpfSksRH1jb25zdCBUPVN5bWJvbCgidHJhbnNmb3JtTWF0cml4IiksbD1TeW1ib2woInRyYW5zZm9ybXMiKSxoPVN5bWJvbCgiY2hhbmdlZEF0dHJzIiksZj1TeW1ib2woImxhc3RDaGFuZ2VkQXR0ciIpLGc9U3ltYm9sKCJvZmZzZXRGaWd1cmUiKTtmdW5jdGlvbiBNKGIsRSxMKXtjb25zdCBEPWJbeV1bRV07aWYoYltvXShFLEwsITEpfHxiW2ZdIT09RSl7Y29uc3QgUj1iW2xdO1IuaGFzKEUpJiZSLmRlbGV0ZShFKSxMJiYoRT09PSJyb3RhdGUiJiYoTD1NYXRoLlBJKkwvMTgwKSxFPT09InNjYWxlIiYmKEw9TC5tYXAoQj0+TWF0aC5hYnMoQik+MWUtNT9COjEvQj4wPzFlLTU6LTFlLTUpKSxSLnNldChFLEwpKSxiW1RdPW51bGwsYltwXS5vblByb3BlcnR5Q2hhbmdlKEUsTCxELGIpfX1mdW5jdGlvbiBBKGIpe2NvbnN0IEU9YltnXSxMPWIub2Zmc2V0RGlzdGFuY2UqRS5nZXRUb3RhbExlbmd0aCgpLEQ9RS5nZXRQb2ludEF0TGVuZ3RoKEwpO2lmKEQpe2NvbnN0IEk9YltsXTtsZXQgUj1iLm9mZnNldFJvdGF0ZTtSPT09ImF1dG8iP1I9RC5hbmdsZTpSPT09InJldmVyc2UiP1I9TWF0aC5QSStELmFuZ2xlOlI9TWF0aC5QSSpSLzE4MCxJLnNldCgib2Zmc2V0Um90YXRlIixSKSxJLnNldCgib2Zmc2V0VHJhbnNsYXRlIixbRC54LEQueV0pLGJbVF09bnVsbH19Y2xhc3MgQ3tzdGF0aWMgc2V0RGVmYXVsdChFLC4uLkwpe3JldHVybiBFW3NdKC4uLkwpfXN0YXRpYyBkZWNsYXJlQWxpYXMoRSwuLi5MKXtyZXR1cm4gRVtpXSguLi5MKX1zdGF0aWMgc2V0QXR0cmlidXRlKEUsLi4uTCl7cmV0dXJuIEVbb10oLi4uTCl9c3RhdGljIGdldEF0dHJpYnV0ZShFLC4uLkwpe3JldHVybiBFW2NdKC4uLkwpfXN0YXRpYyBnZXRBdHRyaWJ1dGVzKEUpe3JldHVybiBFW21dfXN0YXRpYyBnZXRDaGFuZ2VkQXR0cmlidXRlcyhFKXtyZXR1cm4gRVt1XX1jb25zdHJ1Y3RvcihFKXt0aGlzW3BdPUUsdGhpc1t5XT17fSx0aGlzW1RdPWUubWF0MmQuZnJvbVZhbHVlcygxLDAsMCwxLDAsMCksdGhpc1tsXT1uZXcgTWFwLHRoaXNbT109e30sdGhpc1t4XT1bXSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRSwidHJhbnNmb3JtTWF0cml4Iix7Z2V0OigpPT4odGhpc1tUXXx8KHRoaXNbVF09dih0aGlzW2xdLHRoaXMudHJhbnNmb3JtT3JpZ2luKSksWy4uLnRoaXNbVF1dKX0pLHRoaXNbc10oe2lkOiIiLG5hbWU6IiIsY2xhc3NOYW1lOiIiLHg6MCx5OjAsdHJhbnNmb3JtT3JpZ2luOlswLDBdLHRyYW5zZm9ybToiIix0cmFuc2xhdGU6WzAsMF0scm90YXRlOjAsc2NhbGU6WzEsMV0sc2tldzpbMCwwXSxvcGFjaXR5OjEsekluZGV4OjAsb2Zmc2V0UGF0aDp2b2lkIDAsb2Zmc2V0RGlzdGFuY2U6MCxvZmZzZXRSb3RhdGU6ImF1dG8iLHBvaW50ZXJFdmVudHM6InZpc2libGUiLGZpbHRlcjoibm9uZSIsZGlzcGxheToiIn0pLHRoaXNbaV0oImNsYXNzIiwicG9zIiksdGhpc1toXT1uZXcgU2V0LHRoaXNbZ109bmV3IG4uRmlndXJlMkQoe3NjYWxlOjUsc2ltcGxpZnk6MH0pfWdldFt1XSgpe2NvbnN0IEU9e307cmV0dXJuWy4uLnRoaXNbaF1dLmZvckVhY2goTD0+e0VbTF09dGhpc1t5XVtMXX0pLEV9Z2V0W21dKCl7Y29uc3QgRT1PYmplY3QuYXNzaWduKHt9LHRoaXNbeV0pO2ZvcihsZXQgTD0wO0w8dGhpc1t4XS5sZW5ndGg7TCsrKXtjb25zdCBEPXRoaXNbeF1bTF07RVtEXT10aGlzW0RdfXJldHVybiBFfVtzXShFKXtPYmplY3QuYXNzaWduKHRoaXNbT10sRSksT2JqZWN0LmFzc2lnbih0aGlzW3ldLEUpfVtpXSguLi5FKXt0aGlzW3hdLnB1c2goLi4uRSl9W29dKEUsTCxEPSEwKXtjb25zdCBJPXRoaXNbeV1bRV0sUj10aGlzW3BdO3JldHVybiBMPT1udWxsJiYoTD10aGlzW09dW0VdKSxPYmplY3QoYS5jb21wYXJlVmFsdWUpKEksTCk/ITE6KHRoaXNbeV1bRV09TCx0aGlzW2hdLmhhcyhFKSYmdGhpc1toXS5kZWxldGUoRSksdGhpc1toXS5hZGQoRSksdGhpc1tmXT1FLEQmJlIub25Qcm9wZXJ0eUNoYW5nZShFLEwsSSx0aGlzKSwhMCl9W2NdKEUpe3JldHVybiB0aGlzW3ldW0VdfXNldCBpZChFKXt0aGlzW29dKCJpZCIsRSl9Z2V0IGlkKCl7cmV0dXJuIHRoaXNbY10oImlkIil9c2V0IG5hbWUoRSl7dGhpc1tvXSgibmFtZSIsRSl9Z2V0IG5hbWUoKXtyZXR1cm4gdGhpc1tjXSgibmFtZSIpfXNldCBjbGFzc05hbWUoRSl7dGhpc1tvXSgiY2xhc3NOYW1lIixFKX1nZXQgY2xhc3NOYW1lKCl7cmV0dXJuIHRoaXNbY10oImNsYXNzTmFtZSIpfXNldCBjbGFzcyhFKXt0aGlzLmNsYXNzTmFtZT1FfWdldCBjbGFzcygpe3JldHVybiB0aGlzLmNsYXNzTmFtZX1nZXQgeCgpe3JldHVybiB0aGlzW2NdKCJ4Iil9c2V0IHgoRSl7dGhpc1tvXSgieCIsT2JqZWN0KGEudG9OdW1iZXIpKEUpKX1nZXQgeSgpe3JldHVybiB0aGlzW2NdKCJ5Iil9c2V0IHkoRSl7dGhpc1tvXSgieSIsT2JqZWN0KGEudG9OdW1iZXIpKEUpKX1nZXQgcG9zKCl7cmV0dXJuW3RoaXMueCx0aGlzLnldfXNldCBwb3MoRSl7RT1PYmplY3QoYS50b0FycmF5KShFKSxBcnJheS5pc0FycmF5KEUpfHwoRT1bRSxFXSksdGhpcy54PUVbMF0sdGhpcy55PUVbMV19Z2V0IHRyYW5zZm9ybSgpe3JldHVybiB0aGlzW2NdKCJ0cmFuc2Zvcm0iKX1zZXQgdHJhbnNmb3JtKEUpe2xldCBMPW51bGw7aWYoQXJyYXkuaXNBcnJheShFKSYmKEw9RSxFPWBtYXRyaXgoJHtFLm1hcChhLnRvTnVtYmVyKS5qb2luKCl9KWApLHR5cGVvZiBFPT0ic3RyaW5nIilFPUUucmVwbGFjZSgvXHMqLFxzKi9nLCIsIik7ZWxzZSBpZihFIT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgdHJhbnNmb3JtIHZhbHVlLiIpO2NvbnN0IEQ9dGhpc1t5XS50cmFuc2Zvcm07aWYodGhpc1tvXSgidHJhbnNmb3JtIixFLCExKSl7Y29uc3QgST10aGlzW2xdO2lmKEkuaGFzKCJtYXRyaXgiKSYmSS5kZWxldGUoIm1hdHJpeCIpLEwpSS5zZXQoIm1hdHJpeCIsTCk7ZWxzZSBpZihFKXtjb25zdCBSPUUubWF0Y2goLyhtYXRyaXh8dHJhbnNsYXRlfHJvdGF0ZXxzY2FsZXxza2V3KVwoW14oKV0rXCkvZyk7aWYoUil7bGV0IEI9ZS5tYXQyZC5mcm9tVmFsdWVzKDEsMCwwLDEsMCwwKTtmb3IobGV0IHo9MDt6PFIubGVuZ3RoO3orKyl7Y29uc3QgUT1SW3pdLm1hdGNoKC9eKG1hdHJpeHx0cmFuc2xhdGV8cm90YXRlfHNjYWxlfHNrZXcpXCgoW14oKV0rKVwpLyk7aWYoUSl7bGV0WyxfLGpdPVE7Xz09PSJyb3RhdGUiP2o9TWF0aC5QSSpwYXJzZUZsb2F0KGopLzE4MDpqPWoudHJpbSgpLnNwbGl0KC9bXHMsXSsvKS5tYXAoRz0+T2JqZWN0KGEudG9OdW1iZXIpKEcpKSxfPT09Im1hdHJpeCI/Qj1lLm1hdDJkLm11bHRpcGx5KEIsQixqKTpfPT09InNrZXciP0I9ZS5tYXQyZC5tdWx0aXBseShCLEIsZS5tYXQyZC5mcm9tVmFsdWVzKDEsTWF0aC50YW4oalsxXSksTWF0aC50YW4oalswXSksMSwwLDApKTplLm1hdDJkW19dKEIsQixqKSxJLnNldCgibWF0cml4IixCKX19fWVsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCB0cmFuc2Zvcm0gdmFsdWUuIil9dGhpc1tUXT1udWxsLHRoaXNbcF0ub25Qcm9wZXJ0eUNoYW5nZSgidHJhbnNmb3JtIixFLEQsdGhpcyl9fWdldCB0cmFuc2Zvcm1PcmlnaW4oKXtyZXR1cm4gdGhpc1tjXSgidHJhbnNmb3JtT3JpZ2luIil9c2V0IHRyYW5zZm9ybU9yaWdpbihFKXtFPU9iamVjdChhLnRvQXJyYXkpKEUsITApLEUhPW51bGwmJiFBcnJheS5pc0FycmF5KEUpJiYoRT1bRSxFXSksdGhpc1tvXSgidHJhbnNmb3JtT3JpZ2luIixFKSYmKHRoaXNbVF09bnVsbCl9Z2V0IHJvdGF0ZSgpe3JldHVybiB0aGlzW2NdKCJyb3RhdGUiKX1zZXQgcm90YXRlKEUpe00odGhpcywicm90YXRlIixFKX1nZXQgdHJhbnNsYXRlKCl7cmV0dXJuIHRoaXNbY10oInRyYW5zbGF0ZSIpfXNldCB0cmFuc2xhdGUoRSl7RT1PYmplY3QoYS50b0FycmF5KShFLCEwKSxFIT1udWxsJiYhQXJyYXkuaXNBcnJheShFKSYmKEU9W0UsRV0pLE0odGhpcywidHJhbnNsYXRlIixFKX1nZXQgc2NhbGUoKXtyZXR1cm4gdGhpc1tjXSgic2NhbGUiKX1zZXQgc2NhbGUoRSl7RT1PYmplY3QoYS50b0FycmF5KShFLCEwKSxFIT1udWxsJiYhQXJyYXkuaXNBcnJheShFKSYmKEU9W0UsRV0pLE0odGhpcywic2NhbGUiLEUpfWdldCBza2V3KCl7cmV0dXJuIHRoaXNbY10oInNrZXciKX1zZXQgc2tldyhFKXtFPU9iamVjdChhLnRvQXJyYXkpKEUsITApLEUhPW51bGwmJiFBcnJheS5pc0FycmF5KEUpJiYoRT1bRSxFXSksTSh0aGlzLCJza2V3IixFKX1nZXQgb3BhY2l0eSgpe3JldHVybiB0aGlzW2NdKCJvcGFjaXR5Iil9c2V0IG9wYWNpdHkoRSl7RSE9bnVsbCYmKEU9TnVtYmVyKEUpKSx0aGlzW29dKCJvcGFjaXR5IixFKX1nZXQgekluZGV4KCl7cmV0dXJuIHRoaXNbY10oInpJbmRleCIpfXNldCB6SW5kZXgoRSl7RSE9bnVsbCYmKEU9TnVtYmVyKEUpKSx0aGlzW29dKCJ6SW5kZXgiLEUpfWdldCBvZmZzZXRQYXRoKCl7cmV0dXJuIHRoaXNbY10oIm9mZnNldFBhdGgiKX1zZXQgb2Zmc2V0UGF0aChFKXt0aGlzW29dKCJvZmZzZXRQYXRoIixFKSYmKHRoaXNbZ10uYmVnaW5QYXRoKCksRSE9bnVsbCYmdGhpc1tnXS5hZGRQYXRoKEUpLEEodGhpcykpfWdldCBvZmZzZXREaXN0YW5jZSgpe3JldHVybiB0aGlzW2NdKCJvZmZzZXREaXN0YW5jZSIpfXNldCBvZmZzZXREaXN0YW5jZShFKXt0aGlzW29dKCJvZmZzZXREaXN0YW5jZSIsT2JqZWN0KGEudG9OdW1iZXIpKEUpKSYmQSh0aGlzKX1nZXQgb2Zmc2V0Um90YXRlKCl7cmV0dXJuIHRoaXNbY10oIm9mZnNldFJvdGF0ZSIpfXNldCBvZmZzZXRSb3RhdGUoRSl7dGhpc1tvXSgib2Zmc2V0Um90YXRlIixFKSxBKHRoaXMpfWdldCBwb2ludGVyRXZlbnRzKCl7cmV0dXJuIHRoaXNbY10oInBvaW50ZXJFdmVudHMiKX1zZXQgcG9pbnRlckV2ZW50cyhFKXtpZihFIT1udWxsJiZFIT09Im5vbmUiJiZFIT09InZpc2libGUiJiZFIT09InZpc2libGVGaWxsIiYmRSE9PSJ2aXNpYmxlU3Ryb2tlIiYmRSE9PSJhbGwiKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgcG9pbnRlckV2ZW50cyB0eXBlLiIpO3RoaXNbb10oInBvaW50ZXJFdmVudHMiLEUpfWdldCBmaWx0ZXIoKXtyZXR1cm4gdGhpc1tjXSgiZmlsdGVyIil9c2V0IGZpbHRlcihFKXt0aGlzW29dKCJmaWx0ZXIiLEUpfWdldCBkaXNwbGF5KCl7cmV0dXJuIHRoaXNbY10oImRpc3BsYXkiKX1zZXQgZGlzcGxheShFKXt0aGlzW29dKCJkaXNwbGF5IixFKX1zZXQgb2Zmc2V0KEUpe319fSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJzaXplVG9QaXhlbCIsZnVuY3Rpb24oKXtyZXR1cm4gZX0pLHQuZChyLCJ0b1N0cmluZyIsZnVuY3Rpb24oKXtyZXR1cm4gbn0pLHQuZChyLCJ0b051bWJlciIsZnVuY3Rpb24oKXtyZXR1cm4gYX0pLHQuZChyLCJ0b0FycmF5IixmdW5jdGlvbigpe3JldHVybiBzfSksdC5kKHIsImNvbXBhcmVWYWx1ZSIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pLHQoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtmdW5jdGlvbiBlKG8sYyl7Y29uc3QgbT1vLnRyaW0oKS5tYXRjaCgvXihbXGQuXSspKHB4fHB0fHBjfGlufGNtfG1tfGVtfGV4fHJlbXxxfHZ3fHZofHZtYXh8dm1pbikkLyk7bT9vPXtzaXplOnBhcnNlRmxvYXQobVsxXSksdW5pdDptWzJdfTpvPXtzaXplOnBhcnNlRmxvYXQobyksdW5pdDoicHgifTtsZXR7c2l6ZTp1LHVuaXQ6cH09bztpZihwPT09InB0Iil1Lz0uNzU7ZWxzZSBpZihwPT09InBjIil1Kj0xNjtlbHNlIGlmKHA9PT0iaW4iKXUqPTk2O2Vsc2UgaWYocD09PSJjbSIpdSo9OTYvMi41NDtlbHNlIGlmKHA9PT0ibW0iKXUqPTk2LzI1LjQ7ZWxzZSBpZihwPT09ImVtInx8cD09PSJyZW0ifHxwPT09ImV4Iil7aWYoIWMmJnR5cGVvZiBnZXRDb21wdXRlZFN0eWxlPT0iZnVuY3Rpb24iJiZ0eXBlb2YgZG9jdW1lbnQ8InUiKXtjb25zdCB5PWdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5mb250U2l6ZTt5P2M9ZSh5LDE2KTpjPTE2fXUqPWMscD09PSJleCImJih1Lz0yKX1lbHNlIGlmKHA9PT0icSIpdSo9OTYvMjUuNC80O2Vsc2UgaWYocD09PSJ2dyJ8fHA9PT0idmgiKXtpZih0eXBlb2YgZG9jdW1lbnQ8InUiKXtjb25zdCB5PXA9PT0idnciP3dpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg6d2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O3UqPXkvMTAwfX1lbHNlIGlmKChwPT09InZtYXgifHxwPT09InZtaW4iKSYmdHlwZW9mIGRvY3VtZW50PCJ1Iil7Y29uc3QgeT13aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLE89d2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O3A9PT0idm1heCI/dSo9TWF0aC5tYXgoeSxPKS8xMDA6dSo9TWF0aC5taW4oeSxPKS8xMDB9cmV0dXJuIHV9ZnVuY3Rpb24gbihvKXtyZXR1cm4gbz09bnVsbD9vOlN0cmluZyhvKX1mdW5jdGlvbiBhKG8pe2lmKG89PW51bGwpcmV0dXJuIG87aWYodHlwZW9mIG89PSJzdHJpbmciJiYobz1lKG8pKSwhTnVtYmVyLmlzRmluaXRlKG8pKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgdmFsdWUiKTtyZXR1cm4gb31mdW5jdGlvbiBzKG8sYz0hMSl7cmV0dXJuIG89PT0iIj9udWxsOih0eXBlb2Ygbz09InN0cmluZyImJihvPW8uc3BsaXQoL1tccyxdKy9nKSksQXJyYXkuaXNBcnJheShvKSYmKGMmJihvPW8ubWFwKGEpKSxvLmxlbmd0aD09PTEpP29bMF06byl9ZnVuY3Rpb24gaShvLGMpe2lmKEFycmF5LmlzQXJyYXkobykmJkFycmF5LmlzQXJyYXkoYykpe2lmKG8ubGVuZ3RoIT09Yy5sZW5ndGgpcmV0dXJuITE7Zm9yKGxldCBtPTA7bTxvLmxlbmd0aDttKyspaWYob1ttXSE9PWNbbV0pcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuIG89PW51bGwmJmM9PW51bGx8fG89PT1jfX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gcH0pO3ZhciBlPXQoNzQpLG49dCgzMiksYT10Lm4obikscz10KDY4KSxpPXQoNzIpO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtmdW5jdGlvbiBvKCl7cmV0dXJuIG89T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oeSl7Zm9yKHZhciBPPTE7Tzxhcmd1bWVudHMubGVuZ3RoO08rKyl7dmFyIHg9YXJndW1lbnRzW09dO2Zvcih2YXIgdiBpbiB4KU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LHYpJiYoeVt2XT14W3ZdKX1yZXR1cm4geX0sby5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gYyh5KXtpZih0eXBlb2YgeT09InN0cmluZyIpe2lmKHk9eS50cmltKCksL15bMC05Ll0rJSQvLnRlc3QoeSkpcmV0dXJuIHBhcnNlRmxvYXQoeSkvMTAwO2lmKC9eKFtcZC5dKykocHh8cHR8cGN8aW58Y218bW18ZW18ZXh8cmVtfHF8dnd8dmh8dm1heHx2bWluKSQvLnRlc3QoeSkpcmV0dXJuIE9iamVjdChpLnNpemVUb1BpeGVsKSh5KX1yZXR1cm4geX1mdW5jdGlvbiBtKHksTyx4LHYsVCl7cmV0dXJuIHR5cGVvZiB5PT0ic3RyaW5nIiYmKHk9YSgpKHkpKSx0eXBlb2YgTz09InN0cmluZyImJihPPWEoKShPKSksZS5FZmZlY3RzLmRlZmF1bHQoeSxPLHgsdixUKX1mdW5jdGlvbiB1KHksTyx4LHYsVCl7cmV0dXJuIGUuRWZmZWN0cy5kZWZhdWx0KHksTyx4LHYsVCl9ZS5FZmZlY3RzLmRlZmF1bHQ9ZnVuY3Rpb24oeSxPLHgsdixUKXtyZXR1cm4gQXJyYXkuaXNBcnJheSh5KSYmQXJyYXkuaXNBcnJheShPKT95Lm1hcCgobCxoKT0+bCsoeC12KS8oVC12KSooT1toXS1sKSk6dHlwZW9mIHk9PSJudW1iZXIiJiZ0eXBlb2YgTz09Im51bWJlciI/eSsoeC12KS8oVC12KSooTy15KTp4LXY+VC14P086eX0sZS5FZmZlY3RzLmZpbGxDb2xvcj1tLGUuRWZmZWN0cy5zdHJva2VDb2xvcj1tLGUuRWZmZWN0cy5iZ2NvbG9yPW0sZS5FZmZlY3RzLmJvcmRlckNvbG9yPW0sZS5FZmZlY3RzLnRleHQ9dTtjbGFzcyBwIGV4dGVuZHMgZS5BbmltYXRvcntjb25zdHJ1Y3RvcihPLHgsdil7Y29uc3QgVD1PLmF0dHIoKTtPYmplY3QuZW50cmllcyhUKS5mb3JFYWNoKChbbCxoXSk9PntUW2xdPWUuRWZmZWN0c1tsXT9oOmMoaCl9KSx4PXgubWFwKGw9PntsZXQgaD1vKHt9LGwpO2NvbnN0IGY9e307cmV0dXJuIE9iamVjdC5lbnRyaWVzKGgpLmZvckVhY2goKFtnLE1dKT0+e2ZbZ109ZS5FZmZlY3RzW2ddP006YyhNKX0pLGZ9KSxzdXBlcihULHgsdiksdGhpcy50YXJnZXQ9Tyx0aGlzLnNldHRlcj1mdW5jdGlvbihsLGgpe2guYXR0cihsKX19Z2V0IHBsYXlTdGF0ZSgpe3JldHVybiB0aGlzLnRhcmdldC5wYXJlbnQ/c3VwZXIucGxheVN0YXRlOiJpZGxlIn1nZXQgZmluaXNoZWQoKXtyZXR1cm4gc3VwZXIuZmluaXNoZWQudGhlbigoKT0+e2NvbnN0IE89dGhpcztyZXR1cm4gbmV3IFByb21pc2UoeD0+e2Z1bmN0aW9uIHYoKXtPLnNldHRlcihPLmZyYW1lLE8udGFyZ2V0KTtjb25zdCBUPU8ucGxheVN0YXRlO1Q9PT0iZmluaXNoZWQifHxUPT09ImlkbGUiPyhPYmplY3Qocy5jYW5jZWxBbmltYXRpb25GcmFtZSkoTy5yZXF1ZXN0SWQpLHgoKSk6T2JqZWN0KHMucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSh2KX12KCl9KX0pfWZpbmlzaCgpe3N1cGVyLmZpbmlzaCgpLE9iamVjdChzLmNhbmNlbEFuaW1hdGlvbkZyYW1lKSh0aGlzLnJlcXVlc3RJZCksdGhpcy5zZXR0ZXIodGhpcy5mcmFtZSx0aGlzLnRhcmdldCl9cGxheSgpe2lmKCF0aGlzLnRhcmdldC5wYXJlbnR8fHRoaXMucGxheVN0YXRlPT09InJ1bm5pbmciKXJldHVybjtzdXBlci5wbGF5KCksdGhpcy5zZXR0ZXIodGhpcy5mcmFtZSx0aGlzLnRhcmdldCk7Y29uc3QgTz10aGlzO3RoaXMucmVhZHkudGhlbigoKT0+e08uc2V0dGVyKE8uZnJhbWUsTy50YXJnZXQpLE8ucmVxdWVzdElkPU9iamVjdChzLnJlcXVlc3RBbmltYXRpb25GcmFtZSkoZnVuY3Rpb24geCgpe2NvbnN0IHY9Ty50YXJnZXQ7aWYodHlwZW9mIGRvY3VtZW50PCJ1IiYmZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50JiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29udGFpbnMmJnYubGF5ZXImJnYubGF5ZXIuY2FudmFzJiYhZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zKHYubGF5ZXIuY2FudmFzKSl7Ty5jYW5jZWwoKTtyZXR1cm59Y29uc3QgVD1PLnBsYXlTdGF0ZTtPLnNldHRlcihPLmZyYW1lLE8udGFyZ2V0KSxUIT09ImlkbGUiJiYoVD09PSJydW5uaW5nIj9PLnJlcXVlc3RJZD1PYmplY3Qocy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUpKHgpOihUPT09InBhdXNlZCJ8fFQ9PT0icGVuZGluZyImJk8udGltZWxpbmUuY3VycmVudFRpbWU8MCkmJk8ucmVhZHkudGhlbigoKT0+e08uc2V0dGVyKE8uZnJhbWUsTy50YXJnZXQpLE8ucmVxdWVzdElkPU9iamVjdChzLnJlcXVlc3RBbmltYXRpb25GcmFtZSkoeCl9KSl9KX0pfWNhbmNlbChPPSExKXtPYmplY3Qocy5jYW5jZWxBbmltYXRpb25GcmFtZSkodGhpcy5yZXF1ZXN0SWQpLE8/KHRoaXMuc2V0dGVyKHRoaXMuZnJhbWUsdGhpcy50YXJnZXQpLHN1cGVyLmNhbmNlbCgpKTooc3VwZXIuY2FuY2VsKCksdGhpcy5zZXR0ZXIodGhpcy5mcmFtZSx0aGlzLnRhcmdldCkpfX19LGZ1bmN0aW9uKGQscix0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksci5UaW1lbGluZT1yLkVmZmVjdHM9ci5FYXNpbmdzPXIuQW5pbWF0b3I9dm9pZCAwO3ZhciBlPXQoNzUpLG49bShlKSxhPXQoMTg3KSxzPW0oYSksaT10KDE4OCksbz10KDE5MCksYz1tKG8pO2Z1bmN0aW9uIG0odSl7cmV0dXJuIHUmJnUuX19lc01vZHVsZT91OntkZWZhdWx0OnV9fXIuQW5pbWF0b3I9Yy5kZWZhdWx0LHIuRWFzaW5ncz1pLkVhc2luZ3Msci5FZmZlY3RzPXMuZGVmYXVsdCxyLlRpbWVsaW5lPW4uZGVmYXVsdH0sZnVuY3Rpb24oZCxyLHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZT10KDc2KSxuPWwoZSksYT10KDEzMykscz1sKGEpLGk9dCgxNDEpLG89bChpKSxjPXQoMTY0KSxtPWwoYyksdT10KDE3MCkscD1sKHUpLHk9dCgxNzEpLE89bCh5KSx4PXQoMTc1KSx2PWwoeCksVD10KDE4Nik7ZnVuY3Rpb24gbChEKXtyZXR1cm4gRCYmRC5fX2VzTW9kdWxlP0Q6e2RlZmF1bHQ6RH19dmFyIGg9KDAsVC5jcmVhdGVOb3dUaW1lKSgpLGY9e29yaWdpblRpbWU6MCxwbGF5YmFja1JhdGU6MX0sZz0oMCx2LmRlZmF1bHQpKCJ0aW1lTWFyayIpLE09KDAsdi5kZWZhdWx0KSgicGxheWJhY2tSYXRlIiksQT0oMCx2LmRlZmF1bHQpKCJ0aW1lcnMiKSxDPSgwLHYuZGVmYXVsdCkoIm9yaWdpblRpbWUiKSxiPSgwLHYuZGVmYXVsdCkoInNldFRpbWVyIiksRT0oMCx2LmRlZmF1bHQpKCJwYXJlbnQiKSxMPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gRChJLFIpeygwLHAuZGVmYXVsdCkodGhpcyxEKSxJIGluc3RhbmNlb2YgRCYmKFI9SSxJPXt9KSxJPSgwLG0uZGVmYXVsdCkoe30sZixJKSxSJiYodGhpc1tFXT1SKTt2YXIgQj1JLm5vd3RpbWV8fGg7aWYoUilPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiZ2xvYmFsVGltZSIse2dldDpmdW5jdGlvbigpe3JldHVybiBSLmN1cnJlbnRUaW1lfX0pO2Vsc2V7dmFyIHo9QigpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJnbG9iYWxUaW1lIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEIoKS16fX0pfXRoaXNbZ109W3tnbG9iYWxUaW1lOnRoaXMuZ2xvYmFsVGltZSxsb2NhbFRpbWU6LUkub3JpZ2luVGltZSxlbnRyb3B5Oi1JLm9yaWdpblRpbWUscGxheWJhY2tSYXRlOkkucGxheWJhY2tSYXRlLGdsb2JhbEVudHJvcHk6MH1dLHRoaXNbRV0mJih0aGlzW2ddWzBdLmdsb2JhbEVudHJvcHk9dGhpc1tFXS5lbnRyb3B5KSx0aGlzW0NdPUkub3JpZ2luVGltZSx0aGlzW01dPUkucGxheWJhY2tSYXRlLHRoaXNbQV09bmV3IG8uZGVmYXVsdH1yZXR1cm4oMCxPLmRlZmF1bHQpKEQsW3trZXk6Im1hcmtUaW1lIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBSPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dm9pZCAwP2FyZ3VtZW50c1swXTp7fSxCPVIudGltZSx6PUI9PT12b2lkIDA/dGhpcy5jdXJyZW50VGltZTpCLEs9Ui5lbnRyb3B5LFE9Sz09PXZvaWQgMD90aGlzLmVudHJvcHk6SyxfPVIucGxheWJhY2tSYXRlLGo9Xz09PXZvaWQgMD90aGlzLnBsYXliYWNrUmF0ZTpfLEc9e2dsb2JhbFRpbWU6dGhpcy5nbG9iYWxUaW1lLGxvY2FsVGltZTp6LGVudHJvcHk6USxwbGF5YmFja1JhdGU6aixnbG9iYWxFbnRyb3B5OnRoaXMuZ2xvYmFsRW50cm9weX07dGhpc1tnXS5wdXNoKEcpfX0se2tleToiZm9yayIsdmFsdWU6ZnVuY3Rpb24oUil7cmV0dXJuIG5ldyBEKFIsdGhpcyl9fSx7a2V5OiJzZWVrR2xvYmFsVGltZSIsdmFsdWU6ZnVuY3Rpb24oUil7dmFyIEI9dGhpcy5zZWVrVGltZU1hcmsoUiksej10aGlzW2ddW0JdLEs9ei5lbnRyb3B5LFE9ei5wbGF5YmFja1JhdGUsXz16Lmdsb2JhbFRpbWU7cmV0dXJuIF8rKFItSykvTWF0aC5hYnMoUSl9fSx7a2V5OiJzZWVrTG9jYWxUaW1lIix2YWx1ZTpmdW5jdGlvbihSKXt2YXIgQj10aGlzLnNlZWtUaW1lTWFyayhSKSx6PXRoaXNbZ11bQl0sSz16LmxvY2FsVGltZSxRPXouZW50cm9weSxfPXoucGxheWJhY2tSYXRlO3JldHVybiBfPjA/SysoUi1RKTpLLShSLVEpfX0se2tleToic2Vla1RpbWVNYXJrIix2YWx1ZTpmdW5jdGlvbihSKXt2YXIgQj10aGlzW2ddLHo9MCxLPUIubGVuZ3RoLTE7aWYoUjw9Qlt6XS5lbnRyb3B5KXJldHVybiB6O2lmKFI+PUJbS10uZW50cm9weSlyZXR1cm4gSztmb3IodmFyIFE9TWF0aC5mbG9vcigoeitLKS8yKTtRPnomJlE8Szspe2lmKFI9PT1CW1FdLmVudHJvcHkpcmV0dXJuIFE7UjxCW1FdLmVudHJvcHk/Sz1ROlI+QltRXS5lbnRyb3B5JiYoej1RKSxRPU1hdGguZmxvb3IoKHorSykvMil9cmV0dXJuIHp9fSx7a2V5OiJ1cGRhdGVUaW1lcnMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIFI9dGhpcyxCPVtdLmNvbmNhdCgoMCxzLmRlZmF1bHQpKHRoaXNbQV0pKTtCLmZvckVhY2goZnVuY3Rpb24oeil7dmFyIEs9KDAsbi5kZWZhdWx0KSh6LDIpLFE9S1swXSxfPUtbMV07UltiXShfLmhhbmRsZXIsXy50aW1lLFEpfSl9fSx7a2V5OiJjbGVhclRpbWVvdXQiLHZhbHVlOmZ1bmN0aW9uKEkpe2Z1bmN0aW9uIFIoQil7cmV0dXJuIEkuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBSLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIEkudG9TdHJpbmcoKX0sUn0oZnVuY3Rpb24oSSl7dmFyIFI9dGhpc1tBXS5nZXQoSSk7UiYmUi50aW1lcklEIT1udWxsJiYodGhpc1tFXT90aGlzW0VdLmNsZWFyVGltZW91dChSLnRpbWVySUQpOmNsZWFyVGltZW91dChSLnRpbWVySUQpKSx0aGlzW0FdLmRlbGV0ZShJKX0pfSx7a2V5OiJjbGVhckludGVydmFsIix2YWx1ZTpmdW5jdGlvbihSKXtyZXR1cm4gdGhpcy5jbGVhclRpbWVvdXQoUil9fSx7a2V5OiJjbGVhciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgUj10aGlzLEI9dGhpc1tBXTtbXS5jb25jYXQoKDAscy5kZWZhdWx0KShCLmtleXMoKSkpLmZvckVhY2goZnVuY3Rpb24oeil7Ui5jbGVhclRpbWVvdXQoeil9KX19LHtrZXk6InNldFRpbWVvdXQiLHZhbHVlOmZ1bmN0aW9uKFIpe3ZhciBCPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7ZGVsYXk6MH07cmV0dXJuIHRoaXNbYl0oUixCKX19LHtrZXk6InNldEludGVydmFsIix2YWx1ZTpmdW5jdGlvbihSKXt2YXIgQj1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e2RlbGF5OjB9LHo9dGhpcyxLPXRoaXNbYl0oZnVuY3Rpb24gUSgpe3pbYl0oUSxCLEspLFIoKX0sQik7cmV0dXJuIEt9fSx7a2V5OmIsdmFsdWU6ZnVuY3Rpb24oUixCKXt2YXIgej10aGlzLEs9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOigwLHYuZGVmYXVsdCkoInRpbWVySUQiKTtCPSgwLFQuZm9ybWF0RGVsYXkpKEIpO3ZhciBRPXRoaXNbQV0uZ2V0KEspLF89dm9pZCAwLGo9bnVsbCxHPXZvaWQgMCxYPXZvaWQgMDtRPyh0aGlzLmNsZWFyVGltZW91dChLKSxCLmlzRW50cm9weT9fPShCLmRlbGF5LSh0aGlzLmVudHJvcHktUS5zdGFydEVudHJvcHkpKS9NYXRoLmFicyh0aGlzLnBsYXliYWNrUmF0ZSk6Xz0oQi5kZWxheS0odGhpcy5jdXJyZW50VGltZS1RLnN0YXJ0VGltZSkpL3RoaXMucGxheWJhY2tSYXRlLEc9US5zdGFydFRpbWUsWD1RLnN0YXJ0RW50cm9weSk6KF89Qi5kZWxheS8oQi5pc0VudHJvcHk/TWF0aC5hYnModGhpcy5wbGF5YmFja1JhdGUpOnRoaXMucGxheWJhY2tSYXRlKSxHPXRoaXMuY3VycmVudFRpbWUsWD10aGlzLmVudHJvcHkpO3ZhciBaPXRoaXNbRV0sdHQ9Wj9aLnNldFRpbWVvdXQuYmluZChaKTpzZXRUaW1lb3V0LG50PUIuaGVhZGluZztyZXR1cm4hWiYmbnQ9PT0hMSYmXzwwJiYoXz0xLzApLChpc0Zpbml0ZShfKXx8WikmJihfPU1hdGguY2VpbChfKSx0dCE9PXNldFRpbWVvdXQmJihfPXtkZWxheTpfLGhlYWRpbmc6bnR9KSxqPXR0KGZ1bmN0aW9uKCl7eltBXS5kZWxldGUoSyksUigpfSxfKSksdGhpc1tBXS5zZXQoSyx7dGltZXJJRDpqLGhhbmRsZXI6Uix0aW1lOkIsc3RhcnRUaW1lOkcsc3RhcnRFbnRyb3B5Olh9KSxLfX0se2tleToicGFyZW50IixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tFXX19LHtrZXk6Imxhc3RUaW1lTWFyayIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbZ11bdGhpc1tnXS5sZW5ndGgtMV19fSx7a2V5OiJjdXJyZW50VGltZSIsZ2V0OmZ1bmN0aW9uKCl7dmFyIFI9dGhpcy5sYXN0VGltZU1hcmssQj1SLmxvY2FsVGltZSx6PVIuZ2xvYmFsVGltZTtyZXR1cm4gQisodGhpcy5nbG9iYWxUaW1lLXopKnRoaXMucGxheWJhY2tSYXRlfSxzZXQ6ZnVuY3Rpb24oUil7dmFyIEI9dGhpcyx6PXRoaXMuY3VycmVudFRpbWUsSz1SLFE9dGhpc1tBXTt0aGlzLm1hcmtUaW1lKHt0aW1lOlJ9KSxbXS5jb25jYXQoKDAscy5kZWZhdWx0KShRKSkuZm9yRWFjaChmdW5jdGlvbihfKXt2YXIgaj0oMCxuLmRlZmF1bHQpKF8sMiksRz1qWzBdLFg9alsxXTtpZihRLmhhcyhHKSl7dmFyIFo9WC50aW1lLHR0PVouaXNFbnRyb3B5LG50PVouZGVsYXkscT1aLmhlYWRpbmcsZHQ9WC5oYW5kbGVyLHV0PVguc3RhcnRUaW1lO2lmKHR0KW50PT09MCYmKGR0KCksQi5jbGVhclRpbWVvdXQoRykpO2Vsc2V7dmFyIFc9dXQrbnQ7KG50PT09MHx8cSE9PSExJiYoSy16KSpudDw9MHx8ejw9VyYmVzw9S3x8ej49VyYmVz49SykmJihkdCgpLEIuY2xlYXJUaW1lb3V0KEcpKX19fSksdGhpcy51cGRhdGVUaW1lcnMoKX19LHtrZXk6ImVudHJvcHkiLGdldDpmdW5jdGlvbigpe3ZhciBSPXRoaXMubGFzdFRpbWVNYXJrLEI9Ui5lbnRyb3B5LHo9Ui5nbG9iYWxFbnRyb3B5O3JldHVybiBCK01hdGguYWJzKCh0aGlzLmdsb2JhbEVudHJvcHkteikqdGhpcy5wbGF5YmFja1JhdGUpfSxzZXQ6ZnVuY3Rpb24oUil7aWYodGhpcy5lbnRyb3B5PlIpe3ZhciBCPXRoaXMuc2Vla1RpbWVNYXJrKFIpO3RoaXNbZ10ubGVuZ3RoPUIrMX10aGlzLm1hcmtUaW1lKHtlbnRyb3B5OlJ9KSx0aGlzLnVwZGF0ZVRpbWVycygpfX0se2tleToiZ2xvYmFsRW50cm9weSIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbRV0/dGhpc1tFXS5lbnRyb3B5OnRoaXMuZ2xvYmFsVGltZX19LHtrZXk6InBsYXliYWNrUmF0ZSIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbTV19LHNldDpmdW5jdGlvbihSKXtSIT09dGhpcy5wbGF5YmFja1JhdGUmJih0aGlzLm1hcmtUaW1lKHtwbGF5YmFja1JhdGU6Un0pLHRoaXNbTV09Uix0aGlzLnVwZGF0ZVRpbWVycygpKX19LHtrZXk6InBhdXNlZCIsZ2V0OmZ1bmN0aW9uKCl7aWYodGhpcy5wbGF5YmFja1JhdGU9PT0wKXJldHVybiEwO2Zvcih2YXIgUj10aGlzLnBhcmVudDtSOyl7aWYoUi5wbGF5YmFja1JhdGU9PT0wKXJldHVybiEwO1I9Ui5wYXJlbnR9cmV0dXJuITF9fV0pLER9KCk7ci5kZWZhdWx0PUx9LGZ1bmN0aW9uKGQscix0KXtyLl9fZXNNb2R1bGU9ITA7dmFyIGU9dCg3Nyksbj1pKGUpLGE9dCgxMjkpLHM9aShhKTtmdW5jdGlvbiBpKG8pe3JldHVybiBvJiZvLl9fZXNNb2R1bGU/bzp7ZGVmYXVsdDpvfX1yLmRlZmF1bHQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBvKGMsbSl7dmFyIHU9W10scD0hMCx5PSExLE89dm9pZCAwO3RyeXtmb3IodmFyIHg9KDAscy5kZWZhdWx0KShjKSx2OyEocD0odj14Lm5leHQoKSkuZG9uZSkmJih1LnB1c2godi52YWx1ZSksIShtJiZ1Lmxlbmd0aD09PW0pKTtwPSEwKTt9Y2F0Y2goVCl7eT0hMCxPPVR9ZmluYWxseXt0cnl7IXAmJngucmV0dXJuJiZ4LnJldHVybigpfWZpbmFsbHl7aWYoeSl0aHJvdyBPfX1yZXR1cm4gdX1yZXR1cm4gZnVuY3Rpb24oYyxtKXtpZihBcnJheS5pc0FycmF5KGMpKXJldHVybiBjO2lmKCgwLG4uZGVmYXVsdCkoT2JqZWN0KGMpKSlyZXR1cm4gbyhjLG0pO3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UiKX19KCl9LGZ1bmN0aW9uKGQscix0KXtkLmV4cG9ydHM9e2RlZmF1bHQ6dCg3OCksX19lc01vZHVsZTohMH19LGZ1bmN0aW9uKGQscix0KXt0KDc5KSx0KDEyNSksZC5leHBvcnRzPXQoMTI3KX0sZnVuY3Rpb24oZCxyLHQpe3QoODApO2Zvcih2YXIgZT10KDkxKSxuPXQoOTUpLGE9dCg4Mykscz10KDEyMikoInRvU3RyaW5nVGFnIiksaT0iQ1NTUnVsZUxpc3QsQ1NTU3R5bGVEZWNsYXJhdGlvbixDU1NWYWx1ZUxpc3QsQ2xpZW50UmVjdExpc3QsRE9NUmVjdExpc3QsRE9NU3RyaW5nTGlzdCxET01Ub2tlbkxpc3QsRGF0YVRyYW5zZmVySXRlbUxpc3QsRmlsZUxpc3QsSFRNTEFsbENvbGxlY3Rpb24sSFRNTENvbGxlY3Rpb24sSFRNTEZvcm1FbGVtZW50LEhUTUxTZWxlY3RFbGVtZW50LE1lZGlhTGlzdCxNaW1lVHlwZUFycmF5LE5hbWVkTm9kZU1hcCxOb2RlTGlzdCxQYWludFJlcXVlc3RMaXN0LFBsdWdpbixQbHVnaW5BcnJheSxTVkdMZW5ndGhMaXN0LFNWR051bWJlckxpc3QsU1ZHUGF0aFNlZ0xpc3QsU1ZHUG9pbnRMaXN0LFNWR1N0cmluZ0xpc3QsU1ZHVHJhbnNmb3JtTGlzdCxTb3VyY2VCdWZmZXJMaXN0LFN0eWxlU2hlZXRMaXN0LFRleHRUcmFja0N1ZUxpc3QsVGV4dFRyYWNrTGlzdCxUb3VjaExpc3QiLnNwbGl0KCIsIiksbz0wO288aS5sZW5ndGg7bysrKXt2YXIgYz1pW29dLG09ZVtjXSx1PW0mJm0ucHJvdG90eXBlO3UmJiF1W3NdJiZuKHUscyxjKSxhW2NdPWEuQXJyYXl9fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg4MSksbj10KDgyKSxhPXQoODMpLHM9dCg4NCk7ZC5leHBvcnRzPXQoODgpKEFycmF5LCJBcnJheSIsZnVuY3Rpb24oaSxvKXt0aGlzLl90PXMoaSksdGhpcy5faT0wLHRoaXMuX2s9b30sZnVuY3Rpb24oKXt2YXIgaT10aGlzLl90LG89dGhpcy5fayxjPXRoaXMuX2krKztyZXR1cm4haXx8Yz49aS5sZW5ndGg/KHRoaXMuX3Q9dm9pZCAwLG4oMSkpOm89PSJrZXlzIj9uKDAsYyk6bz09InZhbHVlcyI/bigwLGlbY10pOm4oMCxbYyxpW2NdXSl9LCJ2YWx1ZXMiKSxhLkFyZ3VtZW50cz1hLkFycmF5LGUoImtleXMiKSxlKCJ2YWx1ZXMiKSxlKCJlbnRyaWVzIil9LGZ1bmN0aW9uKGQscil7ZC5leHBvcnRzPWZ1bmN0aW9uKCl7fX0sZnVuY3Rpb24oZCxyKXtkLmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm57dmFsdWU6ZSxkb25lOiEhdH19fSxmdW5jdGlvbihkLHIpe2QuZXhwb3J0cz17fX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoODUpLG49dCg4Nyk7ZC5leHBvcnRzPWZ1bmN0aW9uKGEpe3JldHVybiBlKG4oYSkpfX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoODYpO2QuZXhwb3J0cz1PYmplY3QoInoiKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKT9PYmplY3Q6ZnVuY3Rpb24obil7cmV0dXJuIGUobik9PSJTdHJpbmciP24uc3BsaXQoIiIpOk9iamVjdChuKX19LGZ1bmN0aW9uKGQscil7dmFyIHQ9e30udG9TdHJpbmc7ZC5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiB0LmNhbGwoZSkuc2xpY2UoOCwtMSl9fSxmdW5jdGlvbihkLHIpe2QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZih0PT1udWxsKXRocm93IFR5cGVFcnJvcigiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gICIrdCk7cmV0dXJuIHR9fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg4OSksbj10KDkwKSxhPXQoMTA2KSxzPXQoOTUpLGk9dCg4Myksbz10KDEwNyksYz10KDEyMSksbT10KDEyMyksdT10KDEyMikoIml0ZXJhdG9yIikscD0hKFtdLmtleXMmJiJuZXh0ImluW10ua2V5cygpKSx5PSJAQGl0ZXJhdG9yIixPPSJrZXlzIix4PSJ2YWx1ZXMiLHY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307ZC5leHBvcnRzPWZ1bmN0aW9uKFQsbCxoLGYsZyxNLEEpe28oaCxsLGYpO3ZhciBDPWZ1bmN0aW9uKGope2lmKCFwJiZqIGluIEQpcmV0dXJuIERbal07c3dpdGNoKGope2Nhc2UgTzpyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGgodGhpcyxqKX07Y2FzZSB4OnJldHVybiBmdW5jdGlvbigpe3JldHVybiBuZXcgaCh0aGlzLGopfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGgodGhpcyxqKX19LGI9bCsiIEl0ZXJhdG9yIixFPWc9PXgsTD0hMSxEPVQucHJvdG90eXBlLEk9RFt1XXx8RFt5XXx8ZyYmRFtnXSxSPUl8fEMoZyksQj1nP0U/QygiZW50cmllcyIpOlI6dm9pZCAwLHo9bD09IkFycmF5IiYmRC5lbnRyaWVzfHxJLEssUSxfO2lmKHomJihfPW0oei5jYWxsKG5ldyBUKSksXyE9PU9iamVjdC5wcm90b3R5cGUmJl8ubmV4dCYmKGMoXyxiLCEwKSwhZSYmdHlwZW9mIF9bdV0hPSJmdW5jdGlvbiImJnMoXyx1LHYpKSksRSYmSSYmSS5uYW1lIT09eCYmKEw9ITAsUj1mdW5jdGlvbigpe3JldHVybiBJLmNhbGwodGhpcyl9KSwoIWV8fEEpJiYocHx8THx8IURbdV0pJiZzKEQsdSxSKSxpW2xdPVIsaVtiXT12LGcpaWYoSz17dmFsdWVzOkU/UjpDKHgpLGtleXM6TT9SOkMoTyksZW50cmllczpCfSxBKWZvcihRIGluIEspUSBpbiBEfHxhKEQsUSxLW1FdKTtlbHNlIG4obi5QK24uRioocHx8TCksbCxLKTtyZXR1cm4gS319LGZ1bmN0aW9uKGQscil7ZC5leHBvcnRzPSEwfSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5MSksbj10KDkyKSxhPXQoOTMpLHM9dCg5NSksaT10KDEwNSksbz0icHJvdG90eXBlIixjPWZ1bmN0aW9uKG0sdSxwKXt2YXIgeT1tJmMuRixPPW0mYy5HLHg9bSZjLlMsdj1tJmMuUCxUPW0mYy5CLGw9bSZjLlcsaD1PP246blt1XXx8KG5bdV09e30pLGY9aFtvXSxnPU8/ZTp4P2VbdV06KGVbdV18fHt9KVtvXSxNLEEsQztPJiYocD11KTtmb3IoTSBpbiBwKUE9IXkmJmcmJmdbTV0hPT12b2lkIDAsIShBJiZpKGgsTSkpJiYoQz1BP2dbTV06cFtNXSxoW01dPU8mJnR5cGVvZiBnW01dIT0iZnVuY3Rpb24iP3BbTV06VCYmQT9hKEMsZSk6bCYmZ1tNXT09Qz9mdW5jdGlvbihiKXt2YXIgRT1mdW5jdGlvbihMLEQsSSl7aWYodGhpcyBpbnN0YW5jZW9mIGIpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIG5ldyBiO2Nhc2UgMTpyZXR1cm4gbmV3IGIoTCk7Y2FzZSAyOnJldHVybiBuZXcgYihMLEQpfXJldHVybiBuZXcgYihMLEQsSSl9cmV0dXJuIGIuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtyZXR1cm4gRVtvXT1iW29dLEV9KEMpOnYmJnR5cGVvZiBDPT0iZnVuY3Rpb24iP2EoRnVuY3Rpb24uY2FsbCxDKTpDLHYmJigoaC52aXJ0dWFsfHwoaC52aXJ0dWFsPXt9KSlbTV09QyxtJmMuUiYmZiYmIWZbTV0mJnMoZixNLEMpKSl9O2MuRj0xLGMuRz0yLGMuUz00LGMuUD04LGMuQj0xNixjLlc9MzIsYy5VPTY0LGMuUj0xMjgsZC5leHBvcnRzPWN9LGZ1bmN0aW9uKGQscil7dmFyIHQ9ZC5leHBvcnRzPXR5cGVvZiB3aW5kb3c8InUiJiZ3aW5kb3cuTWF0aD09TWF0aD93aW5kb3c6dHlwZW9mIHNlbGY8InUiJiZzZWxmLk1hdGg9PU1hdGg/c2VsZjpGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpO3R5cGVvZiBfX2c9PSJudW1iZXIiJiYoX19nPXQpfSxmdW5jdGlvbihkLHIpe3ZhciB0PWQuZXhwb3J0cz17dmVyc2lvbjoiMi42LjExIn07dHlwZW9mIF9fZT09Im51bWJlciImJihfX2U9dCl9LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDk0KTtkLmV4cG9ydHM9ZnVuY3Rpb24obixhLHMpe2lmKGUobiksYT09PXZvaWQgMClyZXR1cm4gbjtzd2l0Y2gocyl7Y2FzZSAxOnJldHVybiBmdW5jdGlvbihpKXtyZXR1cm4gbi5jYWxsKGEsaSl9O2Nhc2UgMjpyZXR1cm4gZnVuY3Rpb24oaSxvKXtyZXR1cm4gbi5jYWxsKGEsaSxvKX07Y2FzZSAzOnJldHVybiBmdW5jdGlvbihpLG8sYyl7cmV0dXJuIG4uY2FsbChhLGksbyxjKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG4uYXBwbHkoYSxhcmd1bWVudHMpfX19LGZ1bmN0aW9uKGQscil7ZC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0iZnVuY3Rpb24iKXRocm93IFR5cGVFcnJvcih0KyIgaXMgbm90IGEgZnVuY3Rpb24hIik7cmV0dXJuIHR9fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5Niksbj10KDEwNCk7ZC5leHBvcnRzPXQoMTAwKT9mdW5jdGlvbihhLHMsaSl7cmV0dXJuIGUuZihhLHMsbigxLGkpKX06ZnVuY3Rpb24oYSxzLGkpe3JldHVybiBhW3NdPWksYX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDk3KSxuPXQoOTkpLGE9dCgxMDMpLHM9T2JqZWN0LmRlZmluZVByb3BlcnR5O3IuZj10KDEwMCk/T2JqZWN0LmRlZmluZVByb3BlcnR5OmZ1bmN0aW9uKG8sYyxtKXtpZihlKG8pLGM9YShjLCEwKSxlKG0pLG4pdHJ5e3JldHVybiBzKG8sYyxtKX1jYXRjaHt9aWYoImdldCJpbiBtfHwic2V0ImluIG0pdGhyb3cgVHlwZUVycm9yKCJBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCEiKTtyZXR1cm4idmFsdWUiaW4gbSYmKG9bY109bS52YWx1ZSksb319LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDk4KTtkLmV4cG9ydHM9ZnVuY3Rpb24obil7aWYoIWUobikpdGhyb3cgVHlwZUVycm9yKG4rIiBpcyBub3QgYW4gb2JqZWN0ISIpO3JldHVybiBufX0sZnVuY3Rpb24oZCxyKXtkLmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0PT0ib2JqZWN0Ij90IT09bnVsbDp0eXBlb2YgdD09ImZ1bmN0aW9uIn19LGZ1bmN0aW9uKGQscix0KXtkLmV4cG9ydHM9IXQoMTAwKSYmIXQoMTAxKShmdW5jdGlvbigpe3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodCgxMDIpKCJkaXYiKSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmEhPTd9KX0sZnVuY3Rpb24oZCxyLHQpe2QuZXhwb3J0cz0hdCgxMDEpKGZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmEhPTd9KX0sZnVuY3Rpb24oZCxyKXtkLmV4cG9ydHM9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiEhdCgpfWNhdGNoe3JldHVybiEwfX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDk4KSxuPXQoOTEpLmRvY3VtZW50LGE9ZShuKSYmZShuLmNyZWF0ZUVsZW1lbnQpO2QuZXhwb3J0cz1mdW5jdGlvbihzKXtyZXR1cm4gYT9uLmNyZWF0ZUVsZW1lbnQocyk6e319fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5OCk7ZC5leHBvcnRzPWZ1bmN0aW9uKG4sYSl7aWYoIWUobikpcmV0dXJuIG47dmFyIHMsaTtpZihhJiZ0eXBlb2Yocz1uLnRvU3RyaW5nKT09ImZ1bmN0aW9uIiYmIWUoaT1zLmNhbGwobikpfHx0eXBlb2Yocz1uLnZhbHVlT2YpPT0iZnVuY3Rpb24iJiYhZShpPXMuY2FsbChuKSl8fCFhJiZ0eXBlb2Yocz1uLnRvU3RyaW5nKT09ImZ1bmN0aW9uIiYmIWUoaT1zLmNhbGwobikpKXJldHVybiBpO3Rocm93IFR5cGVFcnJvcigiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlIil9fSxmdW5jdGlvbihkLHIpe2QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybntlbnVtZXJhYmxlOiEodCYxKSxjb25maWd1cmFibGU6ISh0JjIpLHdyaXRhYmxlOiEodCY0KSx2YWx1ZTplfX19LGZ1bmN0aW9uKGQscil7dmFyIHQ9e30uaGFzT3duUHJvcGVydHk7ZC5leHBvcnRzPWZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuY2FsbChlLG4pfX0sZnVuY3Rpb24oZCxyLHQpe2QuZXhwb3J0cz10KDk1KX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoMTA4KSxuPXQoMTA0KSxhPXQoMTIxKSxzPXt9O3QoOTUpKHMsdCgxMjIpKCJpdGVyYXRvciIpLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxkLmV4cG9ydHM9ZnVuY3Rpb24oaSxvLGMpe2kucHJvdG90eXBlPWUocyx7bmV4dDpuKDEsYyl9KSxhKGksbysiIEl0ZXJhdG9yIil9fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5Nyksbj10KDEwOSksYT10KDExOSkscz10KDExNikoIklFX1BST1RPIiksaT1mdW5jdGlvbigpe30sbz0icHJvdG90eXBlIixjPWZ1bmN0aW9uKCl7dmFyIG09dCgxMDIpKCJpZnJhbWUiKSx1PWEubGVuZ3RoLHA9IjwiLHk9Ij4iLE87Zm9yKG0uc3R5bGUuZGlzcGxheT0ibm9uZSIsdCgxMjApLmFwcGVuZENoaWxkKG0pLG0uc3JjPSJqYXZhc2NyaXB0OiIsTz1tLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQsTy5vcGVuKCksTy53cml0ZShwKyJzY3JpcHQiK3krImRvY3VtZW50LkY9T2JqZWN0IitwKyIvc2NyaXB0Iit5KSxPLmNsb3NlKCksYz1PLkY7dS0tOylkZWxldGUgY1tvXVthW3VdXTtyZXR1cm4gYygpfTtkLmV4cG9ydHM9T2JqZWN0LmNyZWF0ZXx8ZnVuY3Rpb24odSxwKXt2YXIgeTtyZXR1cm4gdSE9PW51bGw/KGlbb109ZSh1KSx5PW5ldyBpLGlbb109bnVsbCx5W3NdPXUpOnk9YygpLHA9PT12b2lkIDA/eTpuKHkscCl9fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5Niksbj10KDk3KSxhPXQoMTEwKTtkLmV4cG9ydHM9dCgxMDApP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzOmZ1bmN0aW9uKGksbyl7bihpKTtmb3IodmFyIGM9YShvKSxtPWMubGVuZ3RoLHU9MCxwO20+dTspZS5mKGkscD1jW3UrK10sb1twXSk7cmV0dXJuIGl9fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCgxMTEpLG49dCgxMTkpO2QuZXhwb3J0cz1PYmplY3Qua2V5c3x8ZnVuY3Rpb24ocyl7cmV0dXJuIGUocyxuKX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDEwNSksbj10KDg0KSxhPXQoMTEyKSghMSkscz10KDExNikoIklFX1BST1RPIik7ZC5leHBvcnRzPWZ1bmN0aW9uKGksbyl7dmFyIGM9bihpKSxtPTAsdT1bXSxwO2ZvcihwIGluIGMpcCE9cyYmZShjLHApJiZ1LnB1c2gocCk7Zm9yKDtvLmxlbmd0aD5tOyllKGMscD1vW20rK10pJiYofmEodSxwKXx8dS5wdXNoKHApKTtyZXR1cm4gdX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDg0KSxuPXQoMTEzKSxhPXQoMTE1KTtkLmV4cG9ydHM9ZnVuY3Rpb24ocyl7cmV0dXJuIGZ1bmN0aW9uKGksbyxjKXt2YXIgbT1lKGkpLHU9bihtLmxlbmd0aCkscD1hKGMsdSkseTtpZihzJiZvIT1vKXtmb3IoO3U+cDspaWYoeT1tW3ArK10seSE9eSlyZXR1cm4hMH1lbHNlIGZvcig7dT5wO3ArKylpZigoc3x8cCBpbiBtKSYmbVtwXT09PW8pcmV0dXJuIHN8fHB8fDA7cmV0dXJuIXMmJi0xfX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDExNCksbj1NYXRoLm1pbjtkLmV4cG9ydHM9ZnVuY3Rpb24oYSl7cmV0dXJuIGE+MD9uKGUoYSksOTAwNzE5OTI1NDc0MDk5MSk6MH19LGZ1bmN0aW9uKGQscil7dmFyIHQ9TWF0aC5jZWlsLGU9TWF0aC5mbG9vcjtkLmV4cG9ydHM9ZnVuY3Rpb24obil7cmV0dXJuIGlzTmFOKG49K24pPzA6KG4+MD9lOnQpKG4pfX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoMTE0KSxuPU1hdGgubWF4LGE9TWF0aC5taW47ZC5leHBvcnRzPWZ1bmN0aW9uKHMsaSl7cmV0dXJuIHM9ZShzKSxzPDA/bihzK2ksMCk6YShzLGkpfX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoMTE3KSgia2V5cyIpLG49dCgxMTgpO2QuZXhwb3J0cz1mdW5jdGlvbihhKXtyZXR1cm4gZVthXXx8KGVbYV09bihhKSl9fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5Miksbj10KDkxKSxhPSJfX2NvcmUtanNfc2hhcmVkX18iLHM9blthXXx8KG5bYV09e30pOyhkLmV4cG9ydHM9ZnVuY3Rpb24oaSxvKXtyZXR1cm4gc1tpXXx8KHNbaV09byE9PXZvaWQgMD9vOnt9KX0pKCJ2ZXJzaW9ucyIsW10pLnB1c2goe3ZlcnNpb246ZS52ZXJzaW9uLG1vZGU6dCg4OSk/InB1cmUiOiJnbG9iYWwiLGNvcHlyaWdodDoiwqkgMjAxOSBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KSJ9KX0sZnVuY3Rpb24oZCxyKXt2YXIgdD0wLGU9TWF0aC5yYW5kb20oKTtkLmV4cG9ydHM9ZnVuY3Rpb24obil7cmV0dXJuIlN5bWJvbCgiLmNvbmNhdChuPT09dm9pZCAwPyIiOm4sIilfIiwoKyt0K2UpLnRvU3RyaW5nKDM2KSl9fSxmdW5jdGlvbihkLHIpe2QuZXhwb3J0cz0iY29uc3RydWN0b3IsaGFzT3duUHJvcGVydHksaXNQcm90b3R5cGVPZixwcm9wZXJ0eUlzRW51bWVyYWJsZSx0b0xvY2FsZVN0cmluZyx0b1N0cmluZyx2YWx1ZU9mIi5zcGxpdCgiLCIpfSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5MSkuZG9jdW1lbnQ7ZC5leHBvcnRzPWUmJmUuZG9jdW1lbnRFbGVtZW50fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5NikuZixuPXQoMTA1KSxhPXQoMTIyKSgidG9TdHJpbmdUYWciKTtkLmV4cG9ydHM9ZnVuY3Rpb24ocyxpLG8pe3MmJiFuKHM9bz9zOnMucHJvdG90eXBlLGEpJiZlKHMsYSx7Y29uZmlndXJhYmxlOiEwLHZhbHVlOml9KX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDExNykoIndrcyIpLG49dCgxMTgpLGE9dCg5MSkuU3ltYm9sLHM9dHlwZW9mIGE9PSJmdW5jdGlvbiIsaT1kLmV4cG9ydHM9ZnVuY3Rpb24obyl7cmV0dXJuIGVbb118fChlW29dPXMmJmFbb118fChzP2E6bikoIlN5bWJvbC4iK28pKX07aS5zdG9yZT1lfSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCgxMDUpLG49dCgxMjQpLGE9dCgxMTYpKCJJRV9QUk9UTyIpLHM9T2JqZWN0LnByb3RvdHlwZTtkLmV4cG9ydHM9T2JqZWN0LmdldFByb3RvdHlwZU9mfHxmdW5jdGlvbihpKXtyZXR1cm4gaT1uKGkpLGUoaSxhKT9pW2FdOnR5cGVvZiBpLmNvbnN0cnVjdG9yPT0iZnVuY3Rpb24iJiZpIGluc3RhbmNlb2YgaS5jb25zdHJ1Y3Rvcj9pLmNvbnN0cnVjdG9yLnByb3RvdHlwZTppIGluc3RhbmNlb2YgT2JqZWN0P3M6bnVsbH19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDg3KTtkLmV4cG9ydHM9ZnVuY3Rpb24obil7cmV0dXJuIE9iamVjdChlKG4pKX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDEyNikoITApO3QoODgpKFN0cmluZywiU3RyaW5nIixmdW5jdGlvbihuKXt0aGlzLl90PVN0cmluZyhuKSx0aGlzLl9pPTB9LGZ1bmN0aW9uKCl7dmFyIG49dGhpcy5fdCxhPXRoaXMuX2kscztyZXR1cm4gYT49bi5sZW5ndGg/e3ZhbHVlOnZvaWQgMCxkb25lOiEwfToocz1lKG4sYSksdGhpcy5faSs9cy5sZW5ndGgse3ZhbHVlOnMsZG9uZTohMX0pfSl9LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDExNCksbj10KDg3KTtkLmV4cG9ydHM9ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKHMsaSl7dmFyIG89U3RyaW5nKG4ocykpLGM9ZShpKSxtPW8ubGVuZ3RoLHUscDtyZXR1cm4gYzwwfHxjPj1tP2E/IiI6dm9pZCAwOih1PW8uY2hhckNvZGVBdChjKSx1PDU1Mjk2fHx1PjU2MzE5fHxjKzE9PT1tfHwocD1vLmNoYXJDb2RlQXQoYysxKSk8NTYzMjB8fHA+NTczNDM/YT9vLmNoYXJBdChjKTp1OmE/by5zbGljZShjLGMrMik6KHUtNTUyOTY8PDEwKSsocC01NjMyMCkrNjU1MzYpfX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDEyOCksbj10KDEyMikoIml0ZXJhdG9yIiksYT10KDgzKTtkLmV4cG9ydHM9dCg5MikuaXNJdGVyYWJsZT1mdW5jdGlvbihzKXt2YXIgaT1PYmplY3Qocyk7cmV0dXJuIGlbbl0hPT12b2lkIDB8fCJAQGl0ZXJhdG9yImluIGl8fGEuaGFzT3duUHJvcGVydHkoZShpKSl9fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg4Niksbj10KDEyMikoInRvU3RyaW5nVGFnIiksYT1lKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk9PSJBcmd1bWVudHMiLHM9ZnVuY3Rpb24oaSxvKXt0cnl7cmV0dXJuIGlbb119Y2F0Y2h7fX07ZC5leHBvcnRzPWZ1bmN0aW9uKGkpe3ZhciBvLGMsbTtyZXR1cm4gaT09PXZvaWQgMD8iVW5kZWZpbmVkIjppPT09bnVsbD8iTnVsbCI6dHlwZW9mKGM9cyhvPU9iamVjdChpKSxuKSk9PSJzdHJpbmciP2M6YT9lKG8pOihtPWUobykpPT0iT2JqZWN0IiYmdHlwZW9mIG8uY2FsbGVlPT0iZnVuY3Rpb24iPyJBcmd1bWVudHMiOm19fSxmdW5jdGlvbihkLHIsdCl7ZC5leHBvcnRzPXtkZWZhdWx0OnQoMTMwKSxfX2VzTW9kdWxlOiEwfX0sZnVuY3Rpb24oZCxyLHQpe3QoNzkpLHQoMTI1KSxkLmV4cG9ydHM9dCgxMzEpfSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5Nyksbj10KDEzMik7ZC5leHBvcnRzPXQoOTIpLmdldEl0ZXJhdG9yPWZ1bmN0aW9uKGEpe3ZhciBzPW4oYSk7aWYodHlwZW9mIHMhPSJmdW5jdGlvbiIpdGhyb3cgVHlwZUVycm9yKGErIiBpcyBub3QgaXRlcmFibGUhIik7cmV0dXJuIGUocy5jYWxsKGEpKX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDEyOCksbj10KDEyMikoIml0ZXJhdG9yIiksYT10KDgzKTtkLmV4cG9ydHM9dCg5MikuZ2V0SXRlcmF0b3JNZXRob2Q9ZnVuY3Rpb24ocyl7aWYocyE9bnVsbClyZXR1cm4gc1tuXXx8c1siQEBpdGVyYXRvciJdfHxhW2UocyldfX0sZnVuY3Rpb24oZCxyLHQpe3IuX19lc01vZHVsZT0hMDt2YXIgZT10KDEzNCksbj1hKGUpO2Z1bmN0aW9uIGEocyl7cmV0dXJuIHMmJnMuX19lc01vZHVsZT9zOntkZWZhdWx0OnN9fXIuZGVmYXVsdD1mdW5jdGlvbihzKXtpZihBcnJheS5pc0FycmF5KHMpKXtmb3IodmFyIGk9MCxvPUFycmF5KHMubGVuZ3RoKTtpPHMubGVuZ3RoO2krKylvW2ldPXNbaV07cmV0dXJuIG99ZWxzZSByZXR1cm4oMCxuLmRlZmF1bHQpKHMpfX0sZnVuY3Rpb24oZCxyLHQpe2QuZXhwb3J0cz17ZGVmYXVsdDp0KDEzNSksX19lc01vZHVsZTohMH19LGZ1bmN0aW9uKGQscix0KXt0KDEyNSksdCgxMzYpLGQuZXhwb3J0cz10KDkyKS5BcnJheS5mcm9tfSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5Myksbj10KDkwKSxhPXQoMTI0KSxzPXQoMTM3KSxpPXQoMTM4KSxvPXQoMTEzKSxjPXQoMTM5KSxtPXQoMTMyKTtuKG4uUytuLkYqIXQoMTQwKShmdW5jdGlvbih1KXtBcnJheS5mcm9tKHUpfSksIkFycmF5Iix7ZnJvbTpmdW5jdGlvbihwKXt2YXIgeT1hKHApLE89dHlwZW9mIHRoaXM9PSJmdW5jdGlvbiI/dGhpczpBcnJheSx4PWFyZ3VtZW50cy5sZW5ndGgsdj14PjE/YXJndW1lbnRzWzFdOnZvaWQgMCxUPXYhPT12b2lkIDAsbD0wLGg9bSh5KSxmLGcsTSxBO2lmKFQmJih2PWUodix4PjI/YXJndW1lbnRzWzJdOnZvaWQgMCwyKSksaCE9bnVsbCYmIShPPT1BcnJheSYmaShoKSkpZm9yKEE9aC5jYWxsKHkpLGc9bmV3IE87IShNPUEubmV4dCgpKS5kb25lO2wrKyljKGcsbCxUP3MoQSx2LFtNLnZhbHVlLGxdLCEwKTpNLnZhbHVlKTtlbHNlIGZvcihmPW8oeS5sZW5ndGgpLGc9bmV3IE8oZik7Zj5sO2wrKyljKGcsbCxUP3YoeVtsXSxsKTp5W2xdKTtyZXR1cm4gZy5sZW5ndGg9bCxnfX0pfSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5Nyk7ZC5leHBvcnRzPWZ1bmN0aW9uKG4sYSxzLGkpe3RyeXtyZXR1cm4gaT9hKGUocylbMF0sc1sxXSk6YShzKX1jYXRjaChjKXt2YXIgbz1uLnJldHVybjt0aHJvdyBvIT09dm9pZCAwJiZlKG8uY2FsbChuKSksY319fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg4Myksbj10KDEyMikoIml0ZXJhdG9yIiksYT1BcnJheS5wcm90b3R5cGU7ZC5leHBvcnRzPWZ1bmN0aW9uKHMpe3JldHVybiBzIT09dm9pZCAwJiYoZS5BcnJheT09PXN8fGFbbl09PT1zKX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDk2KSxuPXQoMTA0KTtkLmV4cG9ydHM9ZnVuY3Rpb24oYSxzLGkpe3MgaW4gYT9lLmYoYSxzLG4oMCxpKSk6YVtzXT1pfX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoMTIyKSgiaXRlcmF0b3IiKSxuPSExO3RyeXt2YXIgYT1bN11bZV0oKTthLnJldHVybj1mdW5jdGlvbigpe249ITB9LEFycmF5LmZyb20oYSxmdW5jdGlvbigpe3Rocm93IDJ9KX1jYXRjaHt9ZC5leHBvcnRzPWZ1bmN0aW9uKHMsaSl7aWYoIWkmJiFuKXJldHVybiExO3ZhciBvPSExO3RyeXt2YXIgYz1bN10sbT1jW2VdKCk7bS5uZXh0PWZ1bmN0aW9uKCl7cmV0dXJue2RvbmU6bz0hMH19LGNbZV09ZnVuY3Rpb24oKXtyZXR1cm4gbX0scyhjKX1jYXRjaHt9cmV0dXJuIG99fSxmdW5jdGlvbihkLHIsdCl7ZC5leHBvcnRzPXtkZWZhdWx0OnQoMTQyKSxfX2VzTW9kdWxlOiEwfX0sZnVuY3Rpb24oZCxyLHQpe3QoMTQzKSx0KDEyNSksdCg3OSksdCgxNDQpLHQoMTU3KSx0KDE2MCksdCgxNjIpLGQuZXhwb3J0cz10KDkyKS5NYXB9LGZ1bmN0aW9uKGQscil7fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCgxNDUpLG49dCgxNTEpLGE9Ik1hcCI7ZC5leHBvcnRzPXQoMTUyKShhLGZ1bmN0aW9uKHMpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBzKHRoaXMsYXJndW1lbnRzLmxlbmd0aD4wP2FyZ3VtZW50c1swXTp2b2lkIDApfX0se2dldDpmdW5jdGlvbihpKXt2YXIgbz1lLmdldEVudHJ5KG4odGhpcyxhKSxpKTtyZXR1cm4gbyYmby52fSxzZXQ6ZnVuY3Rpb24oaSxvKXtyZXR1cm4gZS5kZWYobih0aGlzLGEpLGk9PT0wPzA6aSxvKX19LGUsITApfSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5NikuZixuPXQoMTA4KSxhPXQoMTQ2KSxzPXQoOTMpLGk9dCgxNDcpLG89dCgxNDgpLGM9dCg4OCksbT10KDgyKSx1PXQoMTQ5KSxwPXQoMTAwKSx5PXQoMTUwKS5mYXN0S2V5LE89dCgxNTEpLHg9cD8iX3MiOiJzaXplIix2PWZ1bmN0aW9uKFQsbCl7dmFyIGg9eShsKSxmO2lmKGghPT0iRiIpcmV0dXJuIFQuX2lbaF07Zm9yKGY9VC5fZjtmO2Y9Zi5uKWlmKGYuaz09bClyZXR1cm4gZn07ZC5leHBvcnRzPXtnZXRDb25zdHJ1Y3RvcjpmdW5jdGlvbihULGwsaCxmKXt2YXIgZz1UKGZ1bmN0aW9uKE0sQSl7aShNLGcsbCwiX2kiKSxNLl90PWwsTS5faT1uKG51bGwpLE0uX2Y9dm9pZCAwLE0uX2w9dm9pZCAwLE1beF09MCxBIT1udWxsJiZvKEEsaCxNW2ZdLE0pfSk7cmV0dXJuIGEoZy5wcm90b3R5cGUse2NsZWFyOmZ1bmN0aW9uKCl7Zm9yKHZhciBBPU8odGhpcyxsKSxDPUEuX2ksYj1BLl9mO2I7Yj1iLm4pYi5yPSEwLGIucCYmKGIucD1iLnAubj12b2lkIDApLGRlbGV0ZSBDW2IuaV07QS5fZj1BLl9sPXZvaWQgMCxBW3hdPTB9LGRlbGV0ZTpmdW5jdGlvbihNKXt2YXIgQT1PKHRoaXMsbCksQz12KEEsTSk7aWYoQyl7dmFyIGI9Qy5uLEU9Qy5wO2RlbGV0ZSBBLl9pW0MuaV0sQy5yPSEwLEUmJihFLm49YiksYiYmKGIucD1FKSxBLl9mPT1DJiYoQS5fZj1iKSxBLl9sPT1DJiYoQS5fbD1FKSxBW3hdLS19cmV0dXJuISFDfSxmb3JFYWNoOmZ1bmN0aW9uKEEpe08odGhpcyxsKTtmb3IodmFyIEM9cyhBLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLDMpLGI7Yj1iP2Iubjp0aGlzLl9mOylmb3IoQyhiLnYsYi5rLHRoaXMpO2ImJmIucjspYj1iLnB9LGhhczpmdW5jdGlvbihBKXtyZXR1cm4hIXYoTyh0aGlzLGwpLEEpfX0pLHAmJmUoZy5wcm90b3R5cGUsInNpemUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gTyh0aGlzLGwpW3hdfX0pLGd9LGRlZjpmdW5jdGlvbihULGwsaCl7dmFyIGY9dihULGwpLGcsTTtyZXR1cm4gZj9mLnY9aDooVC5fbD1mPXtpOk09eShsLCEwKSxrOmwsdjpoLHA6Zz1ULl9sLG46dm9pZCAwLHI6ITF9LFQuX2Z8fChULl9mPWYpLGcmJihnLm49ZiksVFt4XSsrLE0hPT0iRiImJihULl9pW01dPWYpKSxUfSxnZXRFbnRyeTp2LHNldFN0cm9uZzpmdW5jdGlvbihULGwsaCl7YyhULGwsZnVuY3Rpb24oZixnKXt0aGlzLl90PU8oZixsKSx0aGlzLl9rPWcsdGhpcy5fbD12b2lkIDB9LGZ1bmN0aW9uKCl7Zm9yKHZhciBmPXRoaXMsZz1mLl9rLE09Zi5fbDtNJiZNLnI7KU09TS5wO3JldHVybiFmLl90fHwhKGYuX2w9TT1NP00ubjpmLl90Ll9mKT8oZi5fdD12b2lkIDAsbSgxKSk6Zz09ImtleXMiP20oMCxNLmspOmc9PSJ2YWx1ZXMiP20oMCxNLnYpOm0oMCxbTS5rLE0udl0pfSxoPyJlbnRyaWVzIjoidmFsdWVzIiwhaCwhMCksdShsKX19fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5NSk7ZC5leHBvcnRzPWZ1bmN0aW9uKG4sYSxzKXtmb3IodmFyIGkgaW4gYSlzJiZuW2ldP25baV09YVtpXTplKG4saSxhW2ldKTtyZXR1cm4gbn19LGZ1bmN0aW9uKGQscil7ZC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLGEpe2lmKCEodCBpbnN0YW5jZW9mIGUpfHxhIT09dm9pZCAwJiZhIGluIHQpdGhyb3cgVHlwZUVycm9yKG4rIjogaW5jb3JyZWN0IGludm9jYXRpb24hIik7cmV0dXJuIHR9fSxmdW5jdGlvbihkLHUsdCl7dmFyIGU9dCg5Myksbj10KDEzNyksYT10KDEzOCkscz10KDk3KSxpPXQoMTEzKSxvPXQoMTMyKSxjPXt9LG09e30sdT1kLmV4cG9ydHM9ZnVuY3Rpb24ocCx5LE8seCx2KXt2YXIgVD12P2Z1bmN0aW9uKCl7cmV0dXJuIHB9Om8ocCksbD1lKE8seCx5PzI6MSksaD0wLGYsZyxNLEE7aWYodHlwZW9mIFQhPSJmdW5jdGlvbiIpdGhyb3cgVHlwZUVycm9yKHArIiBpcyBub3QgaXRlcmFibGUhIik7aWYoYShUKSl7Zm9yKGY9aShwLmxlbmd0aCk7Zj5oO2grKylpZihBPXk/bChzKGc9cFtoXSlbMF0sZ1sxXSk6bChwW2hdKSxBPT09Y3x8QT09PW0pcmV0dXJuIEF9ZWxzZSBmb3IoTT1ULmNhbGwocCk7IShnPU0ubmV4dCgpKS5kb25lOylpZihBPW4oTSxsLGcudmFsdWUseSksQT09PWN8fEE9PT1tKXJldHVybiBBfTt1LkJSRUFLPWMsdS5SRVRVUk49bX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoOTEpLG49dCg5MiksYT10KDk2KSxzPXQoMTAwKSxpPXQoMTIyKSgic3BlY2llcyIpO2QuZXhwb3J0cz1mdW5jdGlvbihvKXt2YXIgYz10eXBlb2YgbltvXT09ImZ1bmN0aW9uIj9uW29dOmVbb107cyYmYyYmIWNbaV0mJmEuZihjLGkse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc319KX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDExOCkoIm1ldGEiKSxuPXQoOTgpLGE9dCgxMDUpLHM9dCg5NikuZixpPTAsbz1PYmplY3QuaXNFeHRlbnNpYmxlfHxmdW5jdGlvbigpe3JldHVybiEwfSxjPSF0KDEwMSkoZnVuY3Rpb24oKXtyZXR1cm4gbyhPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKX0pLG09ZnVuY3Rpb24oeCl7cyh4LGUse3ZhbHVlOntpOiJPIisgKytpLHc6e319fSl9LHU9ZnVuY3Rpb24oeCx2KXtpZighbih4KSlyZXR1cm4gdHlwZW9mIHg9PSJzeW1ib2wiP3g6KHR5cGVvZiB4PT0ic3RyaW5nIj8iUyI6IlAiKSt4O2lmKCFhKHgsZSkpe2lmKCFvKHgpKXJldHVybiJGIjtpZighdilyZXR1cm4iRSI7bSh4KX1yZXR1cm4geFtlXS5pfSxwPWZ1bmN0aW9uKHgsdil7aWYoIWEoeCxlKSl7aWYoIW8oeCkpcmV0dXJuITA7aWYoIXYpcmV0dXJuITE7bSh4KX1yZXR1cm4geFtlXS53fSx5PWZ1bmN0aW9uKHgpe3JldHVybiBjJiZPLk5FRUQmJm8oeCkmJiFhKHgsZSkmJm0oeCkseH0sTz1kLmV4cG9ydHM9e0tFWTplLE5FRUQ6ITEsZmFzdEtleTp1LGdldFdlYWs6cCxvbkZyZWV6ZTp5fX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoOTgpO2QuZXhwb3J0cz1mdW5jdGlvbihuLGEpe2lmKCFlKG4pfHxuLl90IT09YSl0aHJvdyBUeXBlRXJyb3IoIkluY29tcGF0aWJsZSByZWNlaXZlciwgIithKyIgcmVxdWlyZWQhIik7cmV0dXJuIG59fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5MSksbj10KDkwKSxhPXQoMTUwKSxzPXQoMTAxKSxpPXQoOTUpLG89dCgxNDYpLGM9dCgxNDgpLG09dCgxNDcpLHU9dCg5OCkscD10KDEyMSkseT10KDk2KS5mLE89dCgxNTMpKDApLHg9dCgxMDApO2QuZXhwb3J0cz1mdW5jdGlvbih2LFQsbCxoLGYsZyl7dmFyIE09ZVt2XSxBPU0sQz1mPyJzZXQiOiJhZGQiLGI9QSYmQS5wcm90b3R5cGUsRT17fTtyZXR1cm4heHx8dHlwZW9mIEEhPSJmdW5jdGlvbiJ8fCEoZ3x8Yi5mb3JFYWNoJiYhcyhmdW5jdGlvbigpe25ldyBBKCkuZW50cmllcygpLm5leHQoKX0pKT8oQT1oLmdldENvbnN0cnVjdG9yKFQsdixmLEMpLG8oQS5wcm90b3R5cGUsbCksYS5ORUVEPSEwKTooQT1UKGZ1bmN0aW9uKEwsRCl7bShMLEEsdiwiX2MiKSxMLl9jPW5ldyBNLEQhPW51bGwmJmMoRCxmLExbQ10sTCl9KSxPKCJhZGQsY2xlYXIsZGVsZXRlLGZvckVhY2gsZ2V0LGhhcyxzZXQsa2V5cyx2YWx1ZXMsZW50cmllcyx0b0pTT04iLnNwbGl0KCIsIiksZnVuY3Rpb24oTCl7dmFyIEQ9TD09ImFkZCJ8fEw9PSJzZXQiO0wgaW4gYiYmIShnJiZMPT0iY2xlYXIiKSYmaShBLnByb3RvdHlwZSxMLGZ1bmN0aW9uKEksUil7aWYobSh0aGlzLEEsTCksIUQmJmcmJiF1KEkpKXJldHVybiBMPT0iZ2V0Ij92b2lkIDA6ITE7dmFyIEI9dGhpcy5fY1tMXShJPT09MD8wOkksUik7cmV0dXJuIEQ/dGhpczpCfSl9KSxnfHx5KEEucHJvdG90eXBlLCJzaXplIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Muc2l6ZX19KSkscChBLHYpLEVbdl09QSxuKG4uRytuLlcrbi5GLEUpLGd8fGguc2V0U3Ryb25nKEEsdixmKSxBfX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoOTMpLG49dCg4NSksYT10KDEyNCkscz10KDExMyksaT10KDE1NCk7ZC5leHBvcnRzPWZ1bmN0aW9uKG8sYyl7dmFyIG09bz09MSx1PW89PTIscD1vPT0zLHk9bz09NCxPPW89PTYseD1vPT01fHxPLHY9Y3x8aTtyZXR1cm4gZnVuY3Rpb24oVCxsLGgpe2Zvcih2YXIgZj1hKFQpLGc9bihmKSxNPWUobCxoLDMpLEE9cyhnLmxlbmd0aCksQz0wLGI9bT92KFQsQSk6dT92KFQsMCk6dm9pZCAwLEUsTDtBPkM7QysrKWlmKCh4fHxDIGluIGcpJiYoRT1nW0NdLEw9TShFLEMsZiksbykpe2lmKG0pYltDXT1MO2Vsc2UgaWYoTClzd2l0Y2gobyl7Y2FzZSAzOnJldHVybiEwO2Nhc2UgNTpyZXR1cm4gRTtjYXNlIDY6cmV0dXJuIEM7Y2FzZSAyOmIucHVzaChFKX1lbHNlIGlmKHkpcmV0dXJuITF9cmV0dXJuIE8/LTE6cHx8eT95OmJ9fX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoMTU1KTtkLmV4cG9ydHM9ZnVuY3Rpb24obixhKXtyZXR1cm4gbmV3KGUobikpKGEpfX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoOTgpLG49dCgxNTYpLGE9dCgxMjIpKCJzcGVjaWVzIik7ZC5leHBvcnRzPWZ1bmN0aW9uKHMpe3ZhciBpO3JldHVybiBuKHMpJiYoaT1zLmNvbnN0cnVjdG9yLHR5cGVvZiBpPT0iZnVuY3Rpb24iJiYoaT09PUFycmF5fHxuKGkucHJvdG90eXBlKSkmJihpPXZvaWQgMCksZShpKSYmKGk9aVthXSxpPT09bnVsbCYmKGk9dm9pZCAwKSkpLGk9PT12b2lkIDA/QXJyYXk6aX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDg2KTtkLmV4cG9ydHM9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGUoYSk9PSJBcnJheSJ9fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5MCk7ZShlLlArZS5SLCJNYXAiLHt0b0pTT046dCgxNTgpKCJNYXAiKX0pfSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCgxMjgpLG49dCgxNTkpO2QuZXhwb3J0cz1mdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oKXtpZihlKHRoaXMpIT1hKXRocm93IFR5cGVFcnJvcihhKyIjdG9KU09OIGlzbid0IGdlbmVyaWMiKTtyZXR1cm4gbih0aGlzKX19fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCgxNDgpO2QuZXhwb3J0cz1mdW5jdGlvbihuLGEpe3ZhciBzPVtdO3JldHVybiBlKG4sITEscy5wdXNoLHMsYSksc319LGZ1bmN0aW9uKGQscix0KXt0KDE2MSkoIk1hcCIpfSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5MCk7ZC5leHBvcnRzPWZ1bmN0aW9uKG4pe2UoZS5TLG4se29mOmZ1bmN0aW9uKCl7Zm9yKHZhciBzPWFyZ3VtZW50cy5sZW5ndGgsaT1uZXcgQXJyYXkocyk7cy0tOylpW3NdPWFyZ3VtZW50c1tzXTtyZXR1cm4gbmV3IHRoaXMoaSl9fSl9fSxmdW5jdGlvbihkLHIsdCl7dCgxNjMpKCJNYXAiKX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoOTApLG49dCg5NCksYT10KDkzKSxzPXQoMTQ4KTtkLmV4cG9ydHM9ZnVuY3Rpb24oaSl7ZShlLlMsaSx7ZnJvbTpmdW5jdGlvbihjKXt2YXIgbT1hcmd1bWVudHNbMV0sdSxwLHksTztyZXR1cm4gbih0aGlzKSx1PW0hPT12b2lkIDAsdSYmbihtKSxjPT1udWxsP25ldyB0aGlzOihwPVtdLHU/KHk9MCxPPWEobSxhcmd1bWVudHNbMl0sMikscyhjLCExLGZ1bmN0aW9uKHgpe3AucHVzaChPKHgseSsrKSl9KSk6cyhjLCExLHAucHVzaCxwKSxuZXcgdGhpcyhwKSl9fSl9fSxmdW5jdGlvbihkLHIsdCl7ZC5leHBvcnRzPXtkZWZhdWx0OnQoMTY1KSxfX2VzTW9kdWxlOiEwfX0sZnVuY3Rpb24oZCxyLHQpe3QoMTY2KSxkLmV4cG9ydHM9dCg5MikuT2JqZWN0LmFzc2lnbn0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoOTApO2UoZS5TK2UuRiwiT2JqZWN0Iix7YXNzaWduOnQoMTY3KX0pfSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCgxMDApLG49dCgxMTApLGE9dCgxNjgpLHM9dCgxNjkpLGk9dCgxMjQpLG89dCg4NSksYz1PYmplY3QuYXNzaWduO2QuZXhwb3J0cz0hY3x8dCgxMDEpKGZ1bmN0aW9uKCl7dmFyIG09e30sdT17fSxwPVN5bWJvbCgpLHk9ImFiY2RlZmdoaWprbG1ub3BxcnN0IjtyZXR1cm4gbVtwXT03LHkuc3BsaXQoIiIpLmZvckVhY2goZnVuY3Rpb24oTyl7dVtPXT1PfSksYyh7fSxtKVtwXSE9N3x8T2JqZWN0LmtleXMoYyh7fSx1KSkuam9pbigiIikhPXl9KT9mdW5jdGlvbih1LHApe2Zvcih2YXIgeT1pKHUpLE89YXJndW1lbnRzLmxlbmd0aCx4PTEsdj1hLmYsVD1zLmY7Tz54Oylmb3IodmFyIGw9byhhcmd1bWVudHNbeCsrXSksaD12P24obCkuY29uY2F0KHYobCkpOm4obCksZj1oLmxlbmd0aCxnPTAsTTtmPmc7KU09aFtnKytdLCghZXx8VC5jYWxsKGwsTSkpJiYoeVtNXT1sW01dKTtyZXR1cm4geX06Y30sZnVuY3Rpb24oZCxyKXtyLmY9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sc30sZnVuY3Rpb24oZCxyKXtyLmY9e30ucHJvcGVydHlJc0VudW1lcmFibGV9LGZ1bmN0aW9uKGQscix0KXtyLl9fZXNNb2R1bGU9ITAsci5kZWZhdWx0PWZ1bmN0aW9uKGUsbil7aWYoIShlIGluc3RhbmNlb2YgbikpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9fSxmdW5jdGlvbihkLHIsdCl7ci5fX2VzTW9kdWxlPSEwO3ZhciBlPXQoMTcyKSxuPWEoZSk7ZnVuY3Rpb24gYShzKXtyZXR1cm4gcyYmcy5fX2VzTW9kdWxlP3M6e2RlZmF1bHQ6c319ci5kZWZhdWx0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcyhpLG8pe2Zvcih2YXIgYz0wO2M8by5sZW5ndGg7YysrKXt2YXIgbT1vW2NdO20uZW51bWVyYWJsZT1tLmVudW1lcmFibGV8fCExLG0uY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBtJiYobS53cml0YWJsZT0hMCksKDAsbi5kZWZhdWx0KShpLG0ua2V5LG0pfX1yZXR1cm4gZnVuY3Rpb24oaSxvLGMpe3JldHVybiBvJiZzKGkucHJvdG90eXBlLG8pLGMmJnMoaSxjKSxpfX0oKX0sZnVuY3Rpb24oZCxyLHQpe2QuZXhwb3J0cz17ZGVmYXVsdDp0KDE3MyksX19lc01vZHVsZTohMH19LGZ1bmN0aW9uKGQscix0KXt0KDE3NCk7dmFyIGU9dCg5MikuT2JqZWN0O2QuZXhwb3J0cz1mdW5jdGlvbihhLHMsaSl7cmV0dXJuIGUuZGVmaW5lUHJvcGVydHkoYSxzLGkpfX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoOTApO2UoZS5TK2UuRiohdCgxMDApLCJPYmplY3QiLHtkZWZpbmVQcm9wZXJ0eTp0KDk2KS5mfSl9LGZ1bmN0aW9uKGQscix0KXtkLmV4cG9ydHM9e2RlZmF1bHQ6dCgxNzYpLF9fZXNNb2R1bGU6ITB9fSxmdW5jdGlvbihkLHIsdCl7dCgxNzcpLHQoMTQzKSx0KDE4NCksdCgxODUpLGQuZXhwb3J0cz10KDkyKS5TeW1ib2x9LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDkxKSxuPXQoMTA1KSxhPXQoMTAwKSxzPXQoOTApLGk9dCgxMDYpLG89dCgxNTApLktFWSxjPXQoMTAxKSxtPXQoMTE3KSx1PXQoMTIxKSxwPXQoMTE4KSx5PXQoMTIyKSxPPXQoMTc4KSx4PXQoMTc5KSx2PXQoMTgwKSxUPXQoMTU2KSxsPXQoOTcpLGg9dCg5OCksZj10KDEyNCksZz10KDg0KSxNPXQoMTAzKSxBPXQoMTA0KSxDPXQoMTA4KSxiPXQoMTgxKSxFPXQoMTgzKSxMPXQoMTY4KSxEPXQoOTYpLEk9dCgxMTApLFI9RS5mLEI9RC5mLHo9Yi5mLEs9ZS5TeW1ib2wsUT1lLkpTT04sXz1RJiZRLnN0cmluZ2lmeSxqPSJwcm90b3R5cGUiLEc9eSgiX2hpZGRlbiIpLFg9eSgidG9QcmltaXRpdmUiKSxaPXt9LnByb3BlcnR5SXNFbnVtZXJhYmxlLHR0PW0oInN5bWJvbC1yZWdpc3RyeSIpLG50PW0oInN5bWJvbHMiKSxxPW0oIm9wLXN5bWJvbHMiKSxkdD1PYmplY3Rbal0sdXQ9dHlwZW9mIEs9PSJmdW5jdGlvbiImJiEhTC5mLFc9ZS5RT2JqZWN0LEY9IVd8fCFXW2pdfHwhV1tqXS5maW5kQ2hpbGQsVj1hJiZjKGZ1bmN0aW9uKCl7cmV0dXJuIEMoQih7fSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiBCKHRoaXMsImEiLHt2YWx1ZTo3fSkuYX19KSkuYSE9N30pP2Z1bmN0aW9uKGF0LG90LGZ0KXt2YXIgbXQ9UihkdCxvdCk7bXQmJmRlbGV0ZSBkdFtvdF0sQihhdCxvdCxmdCksbXQmJmF0IT09ZHQmJkIoZHQsb3QsbXQpfTpCLEo9ZnVuY3Rpb24oYXQpe3ZhciBvdD1udFthdF09QyhLW2pdKTtyZXR1cm4gb3QuX2s9YXQsb3R9LE49dXQmJnR5cGVvZiBLLml0ZXJhdG9yPT0ic3ltYm9sIj9mdW5jdGlvbihhdCl7cmV0dXJuIHR5cGVvZiBhdD09InN5bWJvbCJ9OmZ1bmN0aW9uKGF0KXtyZXR1cm4gYXQgaW5zdGFuY2VvZiBLfSwkPWZ1bmN0aW9uKG90LGZ0LG10KXtyZXR1cm4gb3Q9PT1kdCYmJChxLGZ0LG10KSxsKG90KSxmdD1NKGZ0LCEwKSxsKG10KSxuKG50LGZ0KT8obXQuZW51bWVyYWJsZT8obihvdCxHKSYmb3RbR11bZnRdJiYob3RbR11bZnRdPSExKSxtdD1DKG10LHtlbnVtZXJhYmxlOkEoMCwhMSl9KSk6KG4ob3QsRyl8fEIob3QsRyxBKDEse30pKSxvdFtHXVtmdF09ITApLFYob3QsZnQsbXQpKTpCKG90LGZ0LG10KX0sUz1mdW5jdGlvbihvdCxmdCl7bChvdCk7Zm9yKHZhciBtdD12KGZ0PWcoZnQpKSx2dD0wLHB0PW10Lmxlbmd0aCx4dDtwdD52dDspJChvdCx4dD1tdFt2dCsrXSxmdFt4dF0pO3JldHVybiBvdH0sUD1mdW5jdGlvbihvdCxmdCl7cmV0dXJuIGZ0PT09dm9pZCAwP0Mob3QpOlMoQyhvdCksZnQpfSx3PWZ1bmN0aW9uKG90KXt2YXIgZnQ9Wi5jYWxsKHRoaXMsb3Q9TShvdCwhMCkpO3JldHVybiB0aGlzPT09ZHQmJm4obnQsb3QpJiYhbihxLG90KT8hMTpmdHx8IW4odGhpcyxvdCl8fCFuKG50LG90KXx8bih0aGlzLEcpJiZ0aGlzW0ddW290XT9mdDohMH0sVT1mdW5jdGlvbihvdCxmdCl7aWYob3Q9ZyhvdCksZnQ9TShmdCwhMCksIShvdD09PWR0JiZuKG50LGZ0KSYmIW4ocSxmdCkpKXt2YXIgbXQ9UihvdCxmdCk7cmV0dXJuIG10JiZuKG50LGZ0KSYmIShuKG90LEcpJiZvdFtHXVtmdF0pJiYobXQuZW51bWVyYWJsZT0hMCksbXR9fSxIPWZ1bmN0aW9uKG90KXtmb3IodmFyIGZ0PXooZyhvdCkpLG10PVtdLHZ0PTAscHQ7ZnQubGVuZ3RoPnZ0OykhbihudCxwdD1mdFt2dCsrXSkmJnB0IT1HJiZwdCE9byYmbXQucHVzaChwdCk7cmV0dXJuIG10fSxZPWZ1bmN0aW9uKG90KXtmb3IodmFyIGZ0PW90PT09ZHQsbXQ9eihmdD9xOmcob3QpKSx2dD1bXSxwdD0wLHh0O210Lmxlbmd0aD5wdDspbihudCx4dD1tdFtwdCsrXSkmJighZnR8fG4oZHQseHQpKSYmdnQucHVzaChudFt4dF0pO3JldHVybiB2dH07dXR8fChLPWZ1bmN0aW9uKCl7aWYodGhpcyBpbnN0YW5jZW9mIEspdGhyb3cgVHlwZUVycm9yKCJTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3IhIik7dmFyIG90PXAoYXJndW1lbnRzLmxlbmd0aD4wP2FyZ3VtZW50c1swXTp2b2lkIDApLGZ0PWZ1bmN0aW9uKG10KXt0aGlzPT09ZHQmJmZ0LmNhbGwocSxtdCksbih0aGlzLEcpJiZuKHRoaXNbR10sb3QpJiYodGhpc1tHXVtvdF09ITEpLFYodGhpcyxvdCxBKDEsbXQpKX07cmV0dXJuIGEmJkYmJlYoZHQsb3Qse2NvbmZpZ3VyYWJsZTohMCxzZXQ6ZnR9KSxKKG90KX0saShLW2pdLCJ0b1N0cmluZyIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fa30pLEUuZj1VLEQuZj0kLHQoMTgyKS5mPWIuZj1ILHQoMTY5KS5mPXcsTC5mPVksYSYmIXQoODkpJiZpKGR0LCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsdywhMCksTy5mPWZ1bmN0aW9uKGF0KXtyZXR1cm4gSih5KGF0KSl9KSxzKHMuRytzLlcrcy5GKiF1dCx7U3ltYm9sOkt9KTtmb3IodmFyIGs9Imhhc0luc3RhbmNlLGlzQ29uY2F0U3ByZWFkYWJsZSxpdGVyYXRvcixtYXRjaCxyZXBsYWNlLHNlYXJjaCxzcGVjaWVzLHNwbGl0LHRvUHJpbWl0aXZlLHRvU3RyaW5nVGFnLHVuc2NvcGFibGVzIi5zcGxpdCgiLCIpLHJ0PTA7ay5sZW5ndGg+cnQ7KXkoa1tydCsrXSk7Zm9yKHZhciBpdD1JKHkuc3RvcmUpLGN0PTA7aXQubGVuZ3RoPmN0Oyl4KGl0W2N0KytdKTtzKHMuUytzLkYqIXV0LCJTeW1ib2wiLHtmb3I6ZnVuY3Rpb24oYXQpe3JldHVybiBuKHR0LGF0Kz0iIik/dHRbYXRdOnR0W2F0XT1LKGF0KX0sa2V5Rm9yOmZ1bmN0aW9uKG90KXtpZighTihvdCkpdGhyb3cgVHlwZUVycm9yKG90KyIgaXMgbm90IGEgc3ltYm9sISIpO2Zvcih2YXIgZnQgaW4gdHQpaWYodHRbZnRdPT09b3QpcmV0dXJuIGZ0fSx1c2VTZXR0ZXI6ZnVuY3Rpb24oKXtGPSEwfSx1c2VTaW1wbGU6ZnVuY3Rpb24oKXtGPSExfX0pLHMocy5TK3MuRiohdXQsIk9iamVjdCIse2NyZWF0ZTpQLGRlZmluZVByb3BlcnR5OiQsZGVmaW5lUHJvcGVydGllczpTLGdldE93blByb3BlcnR5RGVzY3JpcHRvcjpVLGdldE93blByb3BlcnR5TmFtZXM6SCxnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6WX0pO3ZhciBodD1jKGZ1bmN0aW9uKCl7TC5mKDEpfSk7cyhzLlMrcy5GKmh0LCJPYmplY3QiLHtnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ZnVuY3Rpb24ob3Qpe3JldHVybiBMLmYoZihvdCkpfX0pLFEmJnMocy5TK3MuRiooIXV0fHxjKGZ1bmN0aW9uKCl7dmFyIGF0PUsoKTtyZXR1cm4gXyhbYXRdKSE9IltudWxsXSJ8fF8oe2E6YXR9KSE9Int9Inx8XyhPYmplY3QoYXQpKSE9Int9In0pKSwiSlNPTiIse3N0cmluZ2lmeTpmdW5jdGlvbihvdCl7Zm9yKHZhciBmdD1bb3RdLG10PTEsdnQscHQ7YXJndW1lbnRzLmxlbmd0aD5tdDspZnQucHVzaChhcmd1bWVudHNbbXQrK10pO2lmKHB0PXZ0PWZ0WzFdLCEoIWgodnQpJiZvdD09PXZvaWQgMHx8TihvdCkpKXJldHVybiBUKHZ0KXx8KHZ0PWZ1bmN0aW9uKHh0LFJ0KXtpZih0eXBlb2YgcHQ9PSJmdW5jdGlvbiImJihSdD1wdC5jYWxsKHRoaXMseHQsUnQpKSwhTihSdCkpcmV0dXJuIFJ0fSksZnRbMV09dnQsXy5hcHBseShRLGZ0KX19KSxLW2pdW1hdfHx0KDk1KShLW2pdLFgsS1tqXS52YWx1ZU9mKSx1KEssIlN5bWJvbCIpLHUoTWF0aCwiTWF0aCIsITApLHUoZS5KU09OLCJKU09OIiwhMCl9LGZ1bmN0aW9uKGQscix0KXtyLmY9dCgxMjIpfSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5MSksbj10KDkyKSxhPXQoODkpLHM9dCgxNzgpLGk9dCg5NikuZjtkLmV4cG9ydHM9ZnVuY3Rpb24obyl7dmFyIGM9bi5TeW1ib2x8fChuLlN5bWJvbD1hP3t9OmUuU3ltYm9sfHx7fSk7by5jaGFyQXQoMCkhPSJfIiYmIShvIGluIGMpJiZpKGMsbyx7dmFsdWU6cy5mKG8pfSl9fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCgxMTApLG49dCgxNjgpLGE9dCgxNjkpO2QuZXhwb3J0cz1mdW5jdGlvbihzKXt2YXIgaT1lKHMpLG89bi5mO2lmKG8pZm9yKHZhciBjPW8ocyksbT1hLmYsdT0wLHA7Yy5sZW5ndGg+dTspbS5jYWxsKHMscD1jW3UrK10pJiZpLnB1c2gocCk7cmV0dXJuIGl9fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg4NCksbj10KDE4MikuZixhPXt9LnRvU3RyaW5nLHM9dHlwZW9mIHdpbmRvdz09Im9iamVjdCImJndpbmRvdyYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM/T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KTpbXSxpPWZ1bmN0aW9uKG8pe3RyeXtyZXR1cm4gbihvKX1jYXRjaHtyZXR1cm4gcy5zbGljZSgpfX07ZC5leHBvcnRzLmY9ZnVuY3Rpb24oYyl7cmV0dXJuIHMmJmEuY2FsbChjKT09IltvYmplY3QgV2luZG93XSI/aShjKTpuKGUoYykpfX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoMTExKSxuPXQoMTE5KS5jb25jYXQoImxlbmd0aCIsInByb3RvdHlwZSIpO3IuZj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc3x8ZnVuY3Rpb24ocyl7cmV0dXJuIGUocyxuKX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDE2OSksbj10KDEwNCksYT10KDg0KSxzPXQoMTAzKSxpPXQoMTA1KSxvPXQoOTkpLGM9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtyLmY9dCgxMDApP2M6ZnVuY3Rpb24odSxwKXtpZih1PWEodSkscD1zKHAsITApLG8pdHJ5e3JldHVybiBjKHUscCl9Y2F0Y2h7fWlmKGkodSxwKSlyZXR1cm4gbighZS5mLmNhbGwodSxwKSx1W3BdKX19LGZ1bmN0aW9uKGQscix0KXt0KDE3OSkoImFzeW5jSXRlcmF0b3IiKX0sZnVuY3Rpb24oZCxyLHQpe3QoMTc5KSgib2JzZXJ2YWJsZSIpfSxmdW5jdGlvbihkLHIsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHIuY3JlYXRlTm93VGltZT1lLHIuZm9ybWF0RGVsYXk9bjtmdW5jdGlvbiBlKCl7dmFyIGE9bnVsbDtyZXR1cm4gRGF0ZS5ub3c/YT1EYXRlLm5vdzphPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpfSxhfWZ1bmN0aW9uIG4oYSl7cmV0dXJuIHR5cGVvZiBhPT0ibnVtYmVyIj9hPXtkZWxheTphfToiZW50cm9weSJpbiBhJiYoYT17ZGVsYXk6YS5lbnRyb3B5LGlzRW50cm9weTohMH0pLGF9fSxmdW5jdGlvbihkLHIsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHIuZGVmYXVsdD17ZGVmYXVsdDpmdW5jdGlvbihuLGEscyxpLG8pe3JldHVybiB0eXBlb2Ygbj09Im51bWJlciImJnR5cGVvZiBhPT0ibnVtYmVyIj9uKyhzLWkpLyhvLWkpKihhLW4pOnMtaT5vLXM/YTpufX19LGZ1bmN0aW9uKGQscix0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksci5wYXJzZUVhc2luZz1yLkVhc2luZ3M9dm9pZCAwO3ZhciBlPXQoNzYpLG49YyhlKSxhPXQoMTMzKSxzPWMoYSksaT10KDE0MSksbz1jKGkpO2Z1bmN0aW9uIGMoVCl7cmV0dXJuIFQmJlQuX19lc01vZHVsZT9UOntkZWZhdWx0OlR9fXZhciBtPXQoMTg5KSx1PW5ldyBvLmRlZmF1bHQ7ZnVuY3Rpb24gcCgpe2Zvcih2YXIgVD1hcmd1bWVudHMubGVuZ3RoLGw9QXJyYXkoVCksaD0wO2g8VDtoKyspbFtoXT1hcmd1bWVudHNbaF07dmFyIGY9dS5nZXQobCk7cmV0dXJuIGZ8fChmPW0uYXBwbHkodm9pZCAwLGwpLHUuc2V0KGwsZiksZil9ZnVuY3Rpb24geShUKXt2YXIgbD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ImVuZCI7cmV0dXJuIGZ1bmN0aW9uKGgsZil7Zm9yKHZhciBnPTE7ZzxmLmxlbmd0aDtnKyspe3ZhciBNPWZbZ10ub2Zmc2V0O2lmKGg8PU0pe3ZhciBBPWZbZy0xXS5vZmZzZXQsQz1NLGI9KGgtQSkvKEMtQSksRT0xL1QsTD1iL0U7cmV0dXJuIGw9PT0iZW5kIj9MPU1hdGguZmxvb3IoTCk6TD1NYXRoLmNlaWwoTCksRSpMKihDLUEpK0F9fXJldHVybiAwfX1mdW5jdGlvbiBPKFQpe3ZhciBsPS9eY3ViaWMtYmV6aWVyXCgoLiopXCkvLGg9VC5tYXRjaChsKTtpZihoKXt2YXIgZj1oWzFdLnRyaW0oKTtyZXR1cm4gZj1mLnNwbGl0KCIsIikubWFwKGZ1bmN0aW9uKEUpe3JldHVybiBwYXJzZUZsb2F0KEUudHJpbSgpKX0pLHAuYXBwbHkodm9pZCAwLCgwLHMuZGVmYXVsdCkoZikpfWlmKGw9L15zdGVwc1woKC4qKVwpLyxoPVQubWF0Y2gobCksaCl7dmFyIGc9aFsxXS50cmltKCk7Zz1nLnNwbGl0KCIsIikubWFwKGZ1bmN0aW9uKEUpe3JldHVybiBFLnRyaW0oKX0pO3ZhciBNPWcsQT0oMCxuLmRlZmF1bHQpKE0sMiksQz1BWzBdLGI9QVsxXTtyZXR1cm4geShwYXJzZUludChDLDEwKSxiKX1yZXR1cm4gVH12YXIgeD17bGluZWFyOmZ1bmN0aW9uKGwpe3JldHVybiBsfSxlYXNlOnAoLjI1LC4xLC4yNSwxKSwiZWFzZS1pbiI6cCguNDIsMCwxLDEpLCJlYXNlLW91dCI6cCgwLDAsLjU4LDEpLCJlYXNlLWluLW91dCI6cCguNDIsMCwuNTgsMSksInN0ZXAtc3RhcnQiOnkoMSwic3RhcnQiKSwic3RlcC1lbmQiOnkoMSwiZW5kIil9O2Z1bmN0aW9uIHYoVCl7cmV0dXJuIHR5cGVvZiBUPT0ic3RyaW5nIj94W1RdP1Q9eFtUXTpUPU8oVCk6VC50eXBlPT09ImN1YmljLWJlemllciI/VD1wLmFwcGx5KHZvaWQgMCwoMCxzLmRlZmF1bHQpKFQudmFsdWUpKTpULnR5cGU9PT0ic3RlcHMiJiYoVD15KFQuc3RlcCxULnBvcykpLFR9ci5FYXNpbmdzPXgsci5wYXJzZUVhc2luZz12fSxmdW5jdGlvbihkLHIpe3ZhciB0PTQsZT0uMDAxLG49MWUtNyxhPTEwLHM9MTEsaT0xLyhzLTEpLG89dHlwZW9mIEZsb2F0MzJBcnJheT09ImZ1bmN0aW9uIjtmdW5jdGlvbiBjKFQsbCl7cmV0dXJuIDEtMypsKzMqVH1mdW5jdGlvbiBtKFQsbCl7cmV0dXJuIDMqbC02KlR9ZnVuY3Rpb24gdShUKXtyZXR1cm4gMypUfWZ1bmN0aW9uIHAoVCxsLGgpe3JldHVybigoYyhsLGgpKlQrbShsLGgpKSpUK3UobCkpKlR9ZnVuY3Rpb24geShULGwsaCl7cmV0dXJuIDMqYyhsLGgpKlQqVCsyKm0obCxoKSpUK3UobCl9ZnVuY3Rpb24gTyhULGwsaCxmLGcpe3ZhciBNLEEsQz0wO2RvIEE9bCsoaC1sKS8yLE09cChBLGYsZyktVCxNPjA/aD1BOmw9QTt3aGlsZShNYXRoLmFicyhNKT5uJiYrK0M8YSk7cmV0dXJuIEF9ZnVuY3Rpb24geChULGwsaCxmKXtmb3IodmFyIGc9MDtnPHQ7KytnKXt2YXIgTT15KGwsaCxmKTtpZihNPT09MClyZXR1cm4gbDt2YXIgQT1wKGwsaCxmKS1UO2wtPUEvTX1yZXR1cm4gbH1mdW5jdGlvbiB2KFQpe3JldHVybiBUfWQuZXhwb3J0cz1mdW5jdGlvbihsLGgsZixnKXtpZighKDA8PWwmJmw8PTEmJjA8PWYmJmY8PTEpKXRocm93IG5ldyBFcnJvcigiYmV6aWVyIHggdmFsdWVzIG11c3QgYmUgaW4gWzAsIDFdIHJhbmdlIik7aWYobD09PWgmJmY9PT1nKXJldHVybiB2O2Zvcih2YXIgTT1vP25ldyBGbG9hdDMyQXJyYXkocyk6bmV3IEFycmF5KHMpLEE9MDtBPHM7KytBKU1bQV09cChBKmksbCxmKTtmdW5jdGlvbiBDKGIpe2Zvcih2YXIgRT0wLEw9MSxEPXMtMTtMIT09RCYmTVtMXTw9YjsrK0wpRSs9aTstLUw7dmFyIEk9KGItTVtMXSkvKE1bTCsxXS1NW0xdKSxSPUUrSSppLEI9eShSLGwsZik7cmV0dXJuIEI+PWU/eChiLFIsbCxmKTpCPT09MD9SOk8oYixFLEUraSxsLGYpfXJldHVybiBmdW5jdGlvbihFKXtyZXR1cm4gRT09PTA/MDpFPT09MT8xOnAoQyhFKSxoLGcpfX19LGZ1bmN0aW9uKGQscix0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGU9dCgxOTEpLG49aChlKSxhPXQoMjA0KSxzPWgoYSksaT10KDE2NCksbz1oKGkpLGM9dCgxNzApLG09aChjKSx1PXQoMTcxKSxwPWgodSkseT10KDE3NSksTz1oKHkpLHg9dCg3NSksdj1oKHgpLFQ9dCgyMDgpLGw9dCgxODgpO2Z1bmN0aW9uIGgoQil7cmV0dXJuIEImJkIuX19lc01vZHVsZT9COntkZWZhdWx0OkJ9fXZhciBmPSgwLE8uZGVmYXVsdCkoInRpbWluZyIpLGc9KDAsTy5kZWZhdWx0KSgia2V5ZnJhbWVzIiksTT0oMCxPLmRlZmF1bHQpKCJpbml0U3RhdGUiKSxBPSgwLE8uZGVmYXVsdCkoInJlYWR5RGVmZXIiKSxDPSgwLE8uZGVmYXVsdCkoImZpbmlzaGVkRGVmZXIiKSxiPSgwLE8uZGVmYXVsdCkoImVmZmVjdHMiKSxFPSgwLE8uZGVmYXVsdCkoImFjdGl2ZVJlYWR5VGltZXIiKSxMPSgwLE8uZGVmYXVsdCkoImFjdGl2ZUZpbmlzaFRpbWVyIiksRD0oMCxPLmRlZmF1bHQpKCJyZW1vdmVEZWZlciIpLEk9e2RlbGF5OjAsZW5kRGVsYXk6MCxmaWxsOiJhdXRvIixpdGVyYXRpb25zOjEscGxheWJhY2tSYXRlOjEsZGlyZWN0aW9uOiJub3JtYWwiLGVhc2luZzoibGluZWFyIixlZmZlY3Q6bnVsbH0sUj1mdW5jdGlvbigpe2Z1bmN0aW9uIEIoeixLLFEpe3ZhciBfPXRoaXM7aWYoKDAsbS5kZWZhdWx0KSh0aGlzLEIpLEFycmF5LmlzQXJyYXkoeikpe3ZhciBqPVt6WzBdLHosS107ej1qWzBdLEs9alsxXSxRPWpbMl19dHlwZW9mIFE9PSJudW1iZXIiJiYoUT17ZHVyYXRpb246UX0pLHRoaXNbZl09KDAsby5kZWZhdWx0KSh7fSxJLFEpLHRoaXNbZl0uZWFzaW5nPSgwLGwucGFyc2VFYXNpbmcpKHRoaXNbZl0uZWFzaW5nKSx0aGlzW2ddPSgwLFQuY2FsY3VsYXRlRnJhbWVzT2Zmc2V0KShLKTt2YXIgRz10aGlzW2ddW3RoaXNbZ10ubGVuZ3RoLTFdO3RoaXNbTV09e30sKDAscy5kZWZhdWx0KShHKS5mb3JFYWNoKGZ1bmN0aW9uKFgpe09iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh6LFgpJiZYIT09ImVhc2luZyImJlghPT0ib2Zmc2V0IiYmKF9bTV1bWF09eltYXSl9KSx0aGlzW2ddPXRoaXNbZ10ubWFwKGZ1bmN0aW9uKFgpe3JldHVybigwLG8uZGVmYXVsdCkoe30sX1tNXSxYKX0pLHRoaXNbZ11bMF0ub2Zmc2V0IT09MCYmdGhpc1tnXS51bnNoaWZ0KCgwLG8uZGVmYXVsdCkoe30sdGhpc1tNXSx7b2Zmc2V0OjB9KSksRy5vZmZzZXQ8MSYmdGhpc1tnXS5wdXNoKCgwLG8uZGVmYXVsdCkoe30sRyx7b2Zmc2V0OjF9KSksdGhpc1tiXT17fSx0aGlzLnRpbWVsaW5lPW51bGx9cmV0dXJuKDAscC5kZWZhdWx0KShCLFt7a2V5OiJwYXVzZSIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnRpbWVsaW5lLnBsYXliYWNrUmF0ZT0wfX0se2tleTpFLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIEs9dGhpczt0aGlzW0FdJiYhdGhpc1tBXS50aW1lcklEJiYodGhpcy50aW1lbGluZS5jdXJyZW50VGltZTwwP3RoaXNbQV0udGltZXJJRD10aGlzLnRpbWVsaW5lLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtLW0FdLnJlc29sdmUoKSxkZWxldGUgS1tBXX0se2RlbGF5Oi10aGlzLnRpbWVsaW5lLmN1cnJlbnRUaW1lLGhlYWRpbmc6ITF9KTp0aGlzW0FdLnRpbWVySUQ9dGhpcy50aW1lbGluZS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7S1tBXS5yZXNvbHZlKCksZGVsZXRlIEtbQV19LHtkZWxheTowLGlzRW50cm9weTohMH0pKX19LHtrZXk6TCx2YWx1ZTpmdW5jdGlvbigpe3ZhciBLPXRoaXMsUT10aGlzW2ZdLF89US5kdXJhdGlvbixqPVEuaXRlcmF0aW9ucyxHPVEuZW5kRGVsYXksWD1NYXRoLmNlaWwoXypqK0ctdGhpcy50aW1lbGluZS5jdXJyZW50VGltZSkrMTt0aGlzW0NdJiYhdGhpc1tDXS50aW1lcklEJiYodGhpc1tDXS50aW1lcklEPXRoaXMudGltZWxpbmUuc2V0VGltZW91dChmdW5jdGlvbigpe0tbQ10ucmVzb2x2ZSgpLEtbRF0oQSksS1tEXShDKX0se2RlbGF5OlgsaGVhZGluZzohMX0pLHRoaXNbQ10ucmV2ZXJzZVRpbWVySUQ9dGhpcy50aW1lbGluZS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7S1tDXS5yZXNvbHZlKCksS1tEXShBKSxLW0RdKEMpLEsudGltZWxpbmU9bnVsbH0se2RlbGF5Oi10aGlzW2ZdLmRlbGF5LTEsaGVhZGluZzohMX0pKX19LHtrZXk6InBsYXkiLHZhbHVlOmZ1bmN0aW9uKCl7aWYodGhpcy5wbGF5U3RhdGU9PT0iZmluaXNoZWQiJiZ0aGlzLmNhbmNlbCgpLHRoaXMucGxheVN0YXRlPT09ImlkbGUiKXtpZih0aGlzLnBsYXliYWNrUmF0ZTw9MClyZXR1cm47dmFyIEs9dGhpc1tmXSxRPUsuZGVsYXksXz1LLnBsYXliYWNrUmF0ZSxqPUsudGltZWxpbmU7dGhpcy50aW1lbGluZT1uZXcgdi5kZWZhdWx0KHtvcmlnaW5UaW1lOlEscGxheWJhY2tSYXRlOl99LGopLHRoaXNbRV0oKSx0aGlzW0xdKCl9ZWxzZSB0aGlzLnBsYXlTdGF0ZT09PSJwYXVzZWQiJiYodGhpcy50aW1lbGluZS5wbGF5YmFja1JhdGU9dGhpcy5wbGF5YmFja1JhdGUsdGhpc1tFXSgpKX19LHtrZXk6RCx2YWx1ZTpmdW5jdGlvbihLKXt2YXIgUT10aGlzW0tdLF89dGhpcy50aW1lbGluZTtRJiZfJiYoXy5jbGVhclRpbWVvdXQoUS50aW1lcklEKSxRLnJldmVyc2VUaW1lcklEJiZfLmNsZWFyVGltZW91dChRLnJldmVyc2VUaW1lcklEKSksZGVsZXRlIHRoaXNbS119fSx7a2V5OiJjYW5jZWwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpc1tEXShBKSx0aGlzW0RdKEMpLHRoaXMudGltZWxpbmU9bnVsbH19LHtrZXk6ImZpbmlzaCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnRpbWVsaW5lJiYodGhpcy50aW1lbGluZS5jdXJyZW50VGltZT0xLzAvdGhpcy5wbGF5YmFja1JhdGUpLHRoaXNbRF0oQSksdGhpc1tEXShDKX19LHtrZXk6ImFwcGx5RWZmZWN0cyIsdmFsdWU6ZnVuY3Rpb24oSyl7cmV0dXJuKDAsby5kZWZhdWx0KSh0aGlzW2JdLEspfX0se2tleToicGxheWJhY2tSYXRlIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tmXS5wbGF5YmFja1JhdGV9LHNldDpmdW5jdGlvbihLKXt0aGlzLnRpbWVsaW5lJiYodGhpcy50aW1lbGluZS5wbGF5YmFja1JhdGU9SyksdGhpc1tmXS5wbGF5YmFja1JhdGU9S319LHtrZXk6InBsYXlTdGF0ZSIsZ2V0OmZ1bmN0aW9uKCl7dmFyIEs9dGhpcy50aW1lbGluZSxRPXRoaXNbZl0sXz1RLml0ZXJhdGlvbnMsaj1RLmR1cmF0aW9uLEc9US5lbmREZWxheSxYPSJydW5uaW5nIjtpZihLPT1udWxsKVg9ImlkbGUiO2Vsc2UgaWYoSy5wYXVzZWQpWD0icGF1c2VkIjtlbHNlIGlmKEsuY3VycmVudFRpbWU8MClYPSJwZW5kaW5nIjtlbHNle3ZhciBaPUsuY3VycmVudFRpbWUtXypqO1o+MCYmWjxHP1g9InBlbmRpbmciOlo+PUcmJihYPSJmaW5pc2hlZCIpfXJldHVybiBYfX0se2tleToicHJvZ3Jlc3MiLGdldDpmdW5jdGlvbigpe2lmKCF0aGlzLnRpbWVsaW5lKXJldHVybiAwO3ZhciBLPXRoaXNbZl0sUT1LLmR1cmF0aW9uLF89Sy5pdGVyYXRpb25zLGo9dGhpcy50aW1lbGluZSxHPXRoaXMucGxheVN0YXRlLFg9dm9pZCAwO2lmKEc9PT0iaWRsZSIpWD0wO2Vsc2UgaWYoRz09PSJwYXVzZWQiJiZqLmN1cnJlbnRUaW1lPDApWD0wO2Vsc2UgaWYoRz09PSJwZW5kaW5nIilpZihqLmN1cnJlbnRUaW1lPDApWD0wO2Vsc2V7dmFyIFo9ai5zZWVrTG9jYWxUaW1lKF8qUSk7WD0oMCxULnBlcmlvZGljaXR5KShaLFEpWzFdL1F9ZWxzZShHPT09InJ1bm5pbmcifHxHPT09InBhdXNlZCIpJiYoWD0oMCxULnBlcmlvZGljaXR5KShqLmN1cnJlbnRUaW1lLFEpWzFdL1EpO3JldHVybiBHPT09ImZpbmlzaGVkIiYmKFg9KDAsVC5wZXJpb2RpY2l0eSkoXywxKVsxXSksWH19LHtrZXk6ImZyYW1lIixnZXQ6ZnVuY3Rpb24oKXt2YXIgSz10aGlzLnBsYXlTdGF0ZSxRPXRoaXNbTV0sXz10aGlzW2ZdLmZpbGw7aWYoSz09PSJpZGxlIilyZXR1cm4gUTt2YXIgaj10aGlzLnRpbWVsaW5lLmN1cnJlbnRUaW1lLEc9dGhpc1tnXS5zbGljZSgwKSxYPSgwLFQuZ2V0UHJvZ3Jlc3MpKHRoaXMudGltZWxpbmUsdGhpc1tmXSx0aGlzLnByb2dyZXNzKSxaPVgucCx0dD1YLmludmVydGVkLG50PVE7cmV0dXJuIGo8MCYmSz09PSJwZW5kaW5nIj8oXz09PSJiYWNrd2FyZHMifHxfPT09ImJvdGgiKSYmKG50PXR0P0dbRy5sZW5ndGgtMV06R1swXSk6KEshPT0icGVuZGluZyImJkshPT0iZmluaXNoZWQifHxfPT09ImZvcndhcmRzInx8Xz09PSJib3RoIikmJihudD0oMCxULmdldEN1cnJlbnRGcmFtZSkodGhpc1tmXSxHLHRoaXNbYl0sWikpLG50fX0se2tleToidGltaW5nIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tmXX19LHtrZXk6ImVmZmVjdHMiLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzW2JdfX0se2tleToiYmFzZVRpbWVsaW5lIixzZXQ6ZnVuY3Rpb24oSyl7dGhpc1tmXS50aW1lbGluZT1LfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tmXS50aW1lbGluZX19LHtrZXk6InJlYWR5IixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tBXT90aGlzW0FdLnByb21pc2U6dGhpcy50aW1lbGluZSYmdGhpcy50aW1lbGluZS5jdXJyZW50VGltZT49MCYmdGhpcy5wbGF5U3RhdGUhPT0icGF1c2VkIj9uLmRlZmF1bHQucmVzb2x2ZSgpOih0aGlzW0FdPSgwLFQuZGVmZXIpKCksdGhpcy50aW1lbGluZSYmdGhpc1tFXSgpLHRoaXNbQV0/dGhpc1tBXS5wcm9taXNlOm4uZGVmYXVsdC5yZXNvbHZlKCkpfX0se2tleToiZmluaXNoZWQiLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXlTdGF0ZT09PSJmaW5pc2hlZCI/bi5kZWZhdWx0LnJlc29sdmUoKToodGhpc1tDXXx8KHRoaXNbQ109KDAsVC5kZWZlcikoKSx0aGlzLnRpbWVsaW5lJiZ0aGlzW0xdKCkpLHRoaXNbQ10ucHJvbWlzZSl9fV0pLEJ9KCk7ci5kZWZhdWx0PVJ9LGZ1bmN0aW9uKGQscix0KXtkLmV4cG9ydHM9e2RlZmF1bHQ6dCgxOTIpLF9fZXNNb2R1bGU6ITB9fSxmdW5jdGlvbihkLHIsdCl7dCgxNDMpLHQoMTI1KSx0KDc5KSx0KDE5MyksdCgyMDIpLHQoMjAzKSxkLmV4cG9ydHM9dCg5MikuUHJvbWlzZX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoODkpLG49dCg5MSksYT10KDkzKSxzPXQoMTI4KSxpPXQoOTApLG89dCg5OCksYz10KDk0KSxtPXQoMTQ3KSx1PXQoMTQ4KSxwPXQoMTk0KSx5PXQoMTk1KS5zZXQsTz10KDE5NykoKSx4PXQoMTk4KSx2PXQoMTk5KSxUPXQoMjAwKSxsPXQoMjAxKSxoPSJQcm9taXNlIixmPW4uVHlwZUVycm9yLGc9bi5wcm9jZXNzLE09ZyYmZy52ZXJzaW9ucyxBPU0mJk0udjh8fCIiLEM9bltoXSxiPXMoZyk9PSJwcm9jZXNzIixFPWZ1bmN0aW9uKCl7fSxMLEQsSSxSLEI9RD14LmYsej0hIWZ1bmN0aW9uKCl7dHJ5e3ZhciB0dD1DLnJlc29sdmUoMSksbnQ9KHR0LmNvbnN0cnVjdG9yPXt9KVt0KDEyMikoInNwZWNpZXMiKV09ZnVuY3Rpb24ocSl7cShFLEUpfTtyZXR1cm4oYnx8dHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudD09ImZ1bmN0aW9uIikmJnR0LnRoZW4oRSlpbnN0YW5jZW9mIG50JiZBLmluZGV4T2YoIjYuNiIpIT09MCYmVC5pbmRleE9mKCJDaHJvbWUvNjYiKT09PS0xfWNhdGNoe319KCksSz1mdW5jdGlvbih0dCl7dmFyIG50O3JldHVybiBvKHR0KSYmdHlwZW9mKG50PXR0LnRoZW4pPT0iZnVuY3Rpb24iP250OiExfSxRPWZ1bmN0aW9uKHR0LG50KXtpZighdHQuX24pe3R0Ll9uPSEwO3ZhciBxPXR0Ll9jO08oZnVuY3Rpb24oKXtmb3IodmFyIGR0PXR0Ll92LHV0PXR0Ll9zPT0xLFc9MCxGPWZ1bmN0aW9uKFYpe3ZhciBKPXV0P1Yub2s6Vi5mYWlsLE49Vi5yZXNvbHZlLCQ9Vi5yZWplY3QsUz1WLmRvbWFpbixQLHcsVTt0cnl7Sj8odXR8fCh0dC5faD09MiYmRyh0dCksdHQuX2g9MSksSj09PSEwP1A9ZHQ6KFMmJlMuZW50ZXIoKSxQPUooZHQpLFMmJihTLmV4aXQoKSxVPSEwKSksUD09PVYucHJvbWlzZT8kKGYoIlByb21pc2UtY2hhaW4gY3ljbGUiKSk6KHc9SyhQKSk/dy5jYWxsKFAsTiwkKTpOKFApKTokKGR0KX1jYXRjaChIKXtTJiYhVSYmUy5leGl0KCksJChIKX19O3EubGVuZ3RoPlc7KUYocVtXKytdKTt0dC5fYz1bXSx0dC5fbj0hMSxudCYmIXR0Ll9oJiZfKHR0KX0pfX0sXz1mdW5jdGlvbih0dCl7eS5jYWxsKG4sZnVuY3Rpb24oKXt2YXIgbnQ9dHQuX3YscT1qKHR0KSxkdCx1dCxXO2lmKHEmJihkdD12KGZ1bmN0aW9uKCl7Yj9nLmVtaXQoInVuaGFuZGxlZFJlamVjdGlvbiIsbnQsdHQpOih1dD1uLm9udW5oYW5kbGVkcmVqZWN0aW9uKT91dCh7cHJvbWlzZTp0dCxyZWFzb246bnR9KTooVz1uLmNvbnNvbGUpJiZXLmVycm9yJiZXLmVycm9yKCJVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24iLG50KX0pLHR0Ll9oPWJ8fGoodHQpPzI6MSksdHQuX2E9dm9pZCAwLHEmJmR0LmUpdGhyb3cgZHQudn0pfSxqPWZ1bmN0aW9uKHR0KXtyZXR1cm4gdHQuX2ghPT0xJiYodHQuX2F8fHR0Ll9jKS5sZW5ndGg9PT0wfSxHPWZ1bmN0aW9uKHR0KXt5LmNhbGwobixmdW5jdGlvbigpe3ZhciBudDtiP2cuZW1pdCgicmVqZWN0aW9uSGFuZGxlZCIsdHQpOihudD1uLm9ucmVqZWN0aW9uaGFuZGxlZCkmJm50KHtwcm9taXNlOnR0LHJlYXNvbjp0dC5fdn0pfSl9LFg9ZnVuY3Rpb24odHQpe3ZhciBudD10aGlzO250Ll9kfHwobnQuX2Q9ITAsbnQ9bnQuX3d8fG50LG50Ll92PXR0LG50Ll9zPTIsbnQuX2F8fChudC5fYT1udC5fYy5zbGljZSgpKSxRKG50LCEwKSl9LFo9ZnVuY3Rpb24odHQpe3ZhciBudD10aGlzLHE7aWYoIW50Ll9kKXtudC5fZD0hMCxudD1udC5fd3x8bnQ7dHJ5e2lmKG50PT09dHQpdGhyb3cgZigiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGYiKTsocT1LKHR0KSk/TyhmdW5jdGlvbigpe3ZhciBkdD17X3c6bnQsX2Q6ITF9O3RyeXtxLmNhbGwodHQsYShaLGR0LDEpLGEoWCxkdCwxKSl9Y2F0Y2godXQpe1guY2FsbChkdCx1dCl9fSk6KG50Ll92PXR0LG50Ll9zPTEsUShudCwhMSkpfWNhdGNoKGR0KXtYLmNhbGwoe193Om50LF9kOiExfSxkdCl9fX07enx8KEM9ZnVuY3Rpb24obnQpe20odGhpcyxDLGgsIl9oIiksYyhudCksTC5jYWxsKHRoaXMpO3RyeXtudChhKFosdGhpcywxKSxhKFgsdGhpcywxKSl9Y2F0Y2gocSl7WC5jYWxsKHRoaXMscSl9fSxMPWZ1bmN0aW9uKG50KXt0aGlzLl9jPVtdLHRoaXMuX2E9dm9pZCAwLHRoaXMuX3M9MCx0aGlzLl9kPSExLHRoaXMuX3Y9dm9pZCAwLHRoaXMuX2g9MCx0aGlzLl9uPSExfSxMLnByb3RvdHlwZT10KDE0NikoQy5wcm90b3R5cGUse3RoZW46ZnVuY3Rpb24obnQscSl7dmFyIGR0PUIocCh0aGlzLEMpKTtyZXR1cm4gZHQub2s9dHlwZW9mIG50PT0iZnVuY3Rpb24iP250OiEwLGR0LmZhaWw9dHlwZW9mIHE9PSJmdW5jdGlvbiImJnEsZHQuZG9tYWluPWI/Zy5kb21haW46dm9pZCAwLHRoaXMuX2MucHVzaChkdCksdGhpcy5fYSYmdGhpcy5fYS5wdXNoKGR0KSx0aGlzLl9zJiZRKHRoaXMsITEpLGR0LnByb21pc2V9LGNhdGNoOmZ1bmN0aW9uKHR0KXtyZXR1cm4gdGhpcy50aGVuKHZvaWQgMCx0dCl9fSksST1mdW5jdGlvbigpe3ZhciB0dD1uZXcgTDt0aGlzLnByb21pc2U9dHQsdGhpcy5yZXNvbHZlPWEoWix0dCwxKSx0aGlzLnJlamVjdD1hKFgsdHQsMSl9LHguZj1CPWZ1bmN0aW9uKHR0KXtyZXR1cm4gdHQ9PT1DfHx0dD09PVI/bmV3IEkodHQpOkQodHQpfSksaShpLkcraS5XK2kuRioheix7UHJvbWlzZTpDfSksdCgxMjEpKEMsaCksdCgxNDkpKGgpLFI9dCg5MilbaF0saShpLlMraS5GKiF6LGgse3JlamVjdDpmdW5jdGlvbihudCl7dmFyIHE9Qih0aGlzKSxkdD1xLnJlamVjdDtyZXR1cm4gZHQobnQpLHEucHJvbWlzZX19KSxpKGkuUytpLkYqKGV8fCF6KSxoLHtyZXNvbHZlOmZ1bmN0aW9uKG50KXtyZXR1cm4gbChlJiZ0aGlzPT09Uj9DOnRoaXMsbnQpfX0pLGkoaS5TK2kuRiohKHomJnQoMTQwKShmdW5jdGlvbih0dCl7Qy5hbGwodHQpLmNhdGNoKEUpfSkpLGgse2FsbDpmdW5jdGlvbihudCl7dmFyIHE9dGhpcyxkdD1CKHEpLHV0PWR0LnJlc29sdmUsVz1kdC5yZWplY3QsRj12KGZ1bmN0aW9uKCl7dmFyIFY9W10sSj0wLE49MTt1KG50LCExLGZ1bmN0aW9uKCQpe3ZhciBTPUorKyxQPSExO1YucHVzaCh2b2lkIDApLE4rKyxxLnJlc29sdmUoJCkudGhlbihmdW5jdGlvbih3KXtQfHwoUD0hMCxWW1NdPXcsLS1OfHx1dChWKSl9LFcpfSksLS1OfHx1dChWKX0pO3JldHVybiBGLmUmJlcoRi52KSxkdC5wcm9taXNlfSxyYWNlOmZ1bmN0aW9uKG50KXt2YXIgcT10aGlzLGR0PUIocSksdXQ9ZHQucmVqZWN0LFc9dihmdW5jdGlvbigpe3UobnQsITEsZnVuY3Rpb24oRil7cS5yZXNvbHZlKEYpLnRoZW4oZHQucmVzb2x2ZSx1dCl9KX0pO3JldHVybiBXLmUmJnV0KFcudiksZHQucHJvbWlzZX19KX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoOTcpLG49dCg5NCksYT10KDEyMikoInNwZWNpZXMiKTtkLmV4cG9ydHM9ZnVuY3Rpb24ocyxpKXt2YXIgbz1lKHMpLmNvbnN0cnVjdG9yLGM7cmV0dXJuIG89PT12b2lkIDB8fChjPWUobylbYV0pPT1udWxsP2k6bihjKX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDkzKSxuPXQoMTk2KSxhPXQoMTIwKSxzPXQoMTAyKSxpPXQoOTEpLG89aS5wcm9jZXNzLGM9aS5zZXRJbW1lZGlhdGUsbT1pLmNsZWFySW1tZWRpYXRlLHU9aS5NZXNzYWdlQ2hhbm5lbCxwPWkuRGlzcGF0Y2gseT0wLE89e30seD0ib25yZWFkeXN0YXRlY2hhbmdlIix2LFQsbCxoPWZ1bmN0aW9uKCl7dmFyIGc9K3RoaXM7aWYoTy5oYXNPd25Qcm9wZXJ0eShnKSl7dmFyIE09T1tnXTtkZWxldGUgT1tnXSxNKCl9fSxmPWZ1bmN0aW9uKGcpe2guY2FsbChnLmRhdGEpfTsoIWN8fCFtKSYmKGM9ZnVuY3Rpb24oTSl7Zm9yKHZhciBBPVtdLEM9MTthcmd1bWVudHMubGVuZ3RoPkM7KUEucHVzaChhcmd1bWVudHNbQysrXSk7cmV0dXJuIE9bKyt5XT1mdW5jdGlvbigpe24odHlwZW9mIE09PSJmdW5jdGlvbiI/TTpGdW5jdGlvbihNKSxBKX0sdih5KSx5fSxtPWZ1bmN0aW9uKE0pe2RlbGV0ZSBPW01dfSx0KDg2KShvKT09InByb2Nlc3MiP3Y9ZnVuY3Rpb24oZyl7by5uZXh0VGljayhlKGgsZywxKSl9OnAmJnAubm93P3Y9ZnVuY3Rpb24oZyl7cC5ub3coZShoLGcsMSkpfTp1PyhUPW5ldyB1LGw9VC5wb3J0MixULnBvcnQxLm9ubWVzc2FnZT1mLHY9ZShsLnBvc3RNZXNzYWdlLGwsMSkpOmkuYWRkRXZlbnRMaXN0ZW5lciYmdHlwZW9mIHBvc3RNZXNzYWdlPT0iZnVuY3Rpb24iJiYhaS5pbXBvcnRTY3JpcHRzPyh2PWZ1bmN0aW9uKGcpe2kucG9zdE1lc3NhZ2UoZysiIiwiKiIpfSxpLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGYsITEpKTp4IGluIHMoInNjcmlwdCIpP3Y9ZnVuY3Rpb24oZyl7YS5hcHBlbmRDaGlsZChzKCJzY3JpcHQiKSlbeF09ZnVuY3Rpb24oKXthLnJlbW92ZUNoaWxkKHRoaXMpLGguY2FsbChnKX19OnY9ZnVuY3Rpb24oZyl7c2V0VGltZW91dChlKGgsZywxKSwwKX0pLGQuZXhwb3J0cz17c2V0OmMsY2xlYXI6bX19LGZ1bmN0aW9uKGQscil7ZC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgYT1uPT09dm9pZCAwO3N3aXRjaChlLmxlbmd0aCl7Y2FzZSAwOnJldHVybiBhP3QoKTp0LmNhbGwobik7Y2FzZSAxOnJldHVybiBhP3QoZVswXSk6dC5jYWxsKG4sZVswXSk7Y2FzZSAyOnJldHVybiBhP3QoZVswXSxlWzFdKTp0LmNhbGwobixlWzBdLGVbMV0pO2Nhc2UgMzpyZXR1cm4gYT90KGVbMF0sZVsxXSxlWzJdKTp0LmNhbGwobixlWzBdLGVbMV0sZVsyXSk7Y2FzZSA0OnJldHVybiBhP3QoZVswXSxlWzFdLGVbMl0sZVszXSk6dC5jYWxsKG4sZVswXSxlWzFdLGVbMl0sZVszXSl9cmV0dXJuIHQuYXBwbHkobixlKX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDkxKSxuPXQoMTk1KS5zZXQsYT1lLk11dGF0aW9uT2JzZXJ2ZXJ8fGUuV2ViS2l0TXV0YXRpb25PYnNlcnZlcixzPWUucHJvY2VzcyxpPWUuUHJvbWlzZSxvPXQoODYpKHMpPT0icHJvY2VzcyI7ZC5leHBvcnRzPWZ1bmN0aW9uKCl7dmFyIGMsbSx1LHA9ZnVuY3Rpb24oKXt2YXIgdixUO2ZvcihvJiYodj1zLmRvbWFpbikmJnYuZXhpdCgpO2M7KXtUPWMuZm4sYz1jLm5leHQ7dHJ5e1QoKX1jYXRjaChsKXt0aHJvdyBjP3UoKTptPXZvaWQgMCxsfX1tPXZvaWQgMCx2JiZ2LmVudGVyKCl9O2lmKG8pdT1mdW5jdGlvbigpe3MubmV4dFRpY2socCl9O2Vsc2UgaWYoYSYmIShlLm5hdmlnYXRvciYmZS5uYXZpZ2F0b3Iuc3RhbmRhbG9uZSkpe3ZhciB5PSEwLE89ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiIpO25ldyBhKHApLm9ic2VydmUoTyx7Y2hhcmFjdGVyRGF0YTohMH0pLHU9ZnVuY3Rpb24oKXtPLmRhdGE9eT0heX19ZWxzZSBpZihpJiZpLnJlc29sdmUpe3ZhciB4PWkucmVzb2x2ZSh2b2lkIDApO3U9ZnVuY3Rpb24oKXt4LnRoZW4ocCl9fWVsc2UgdT1mdW5jdGlvbigpe24uY2FsbChlLHApfTtyZXR1cm4gZnVuY3Rpb24odil7dmFyIFQ9e2ZuOnYsbmV4dDp2b2lkIDB9O20mJihtLm5leHQ9VCksY3x8KGM9VCx1KCkpLG09VH19fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5NCk7ZnVuY3Rpb24gbihhKXt2YXIgcyxpO3RoaXMucHJvbWlzZT1uZXcgYShmdW5jdGlvbihvLGMpe2lmKHMhPT12b2lkIDB8fGkhPT12b2lkIDApdGhyb3cgVHlwZUVycm9yKCJCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvciIpO3M9byxpPWN9KSx0aGlzLnJlc29sdmU9ZShzKSx0aGlzLnJlamVjdD1lKGkpfWQuZXhwb3J0cy5mPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgbihhKX19LGZ1bmN0aW9uKGQscil7ZC5leHBvcnRzPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm57ZTohMSx2OnQoKX19Y2F0Y2goZSl7cmV0dXJue2U6ITAsdjplfX19fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5MSksbj1lLm5hdmlnYXRvcjtkLmV4cG9ydHM9biYmbi51c2VyQWdlbnR8fCIifSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5Nyksbj10KDk4KSxhPXQoMTk4KTtkLmV4cG9ydHM9ZnVuY3Rpb24ocyxpKXtpZihlKHMpLG4oaSkmJmkuY29uc3RydWN0b3I9PT1zKXJldHVybiBpO3ZhciBvPWEuZihzKSxjPW8ucmVzb2x2ZTtyZXR1cm4gYyhpKSxvLnByb21pc2V9fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5MCksbj10KDkyKSxhPXQoOTEpLHM9dCgxOTQpLGk9dCgyMDEpO2UoZS5QK2UuUiwiUHJvbWlzZSIse2ZpbmFsbHk6ZnVuY3Rpb24obyl7dmFyIGM9cyh0aGlzLG4uUHJvbWlzZXx8YS5Qcm9taXNlKSxtPXR5cGVvZiBvPT0iZnVuY3Rpb24iO3JldHVybiB0aGlzLnRoZW4obT9mdW5jdGlvbih1KXtyZXR1cm4gaShjLG8oKSkudGhlbihmdW5jdGlvbigpe3JldHVybiB1fSl9Om8sbT9mdW5jdGlvbih1KXtyZXR1cm4gaShjLG8oKSkudGhlbihmdW5jdGlvbigpe3Rocm93IHV9KX06byl9fSl9LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDkwKSxuPXQoMTk4KSxhPXQoMTk5KTtlKGUuUywiUHJvbWlzZSIse3RyeTpmdW5jdGlvbihzKXt2YXIgaT1uLmYodGhpcyksbz1hKHMpO3JldHVybihvLmU/aS5yZWplY3Q6aS5yZXNvbHZlKShvLnYpLGkucHJvbWlzZX19KX0sZnVuY3Rpb24oZCxyLHQpe2QuZXhwb3J0cz17ZGVmYXVsdDp0KDIwNSksX19lc01vZHVsZTohMH19LGZ1bmN0aW9uKGQscix0KXt0KDIwNiksZC5leHBvcnRzPXQoOTIpLk9iamVjdC5rZXlzfSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCgxMjQpLG49dCgxMTApO3QoMjA3KSgia2V5cyIsZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24ocyl7cmV0dXJuIG4oZShzKSl9fSl9LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDkwKSxuPXQoOTIpLGE9dCgxMDEpO2QuZXhwb3J0cz1mdW5jdGlvbihzLGkpe3ZhciBvPShuLk9iamVjdHx8e30pW3NdfHxPYmplY3Rbc10sYz17fTtjW3NdPWkobyksZShlLlMrZS5GKmEoZnVuY3Rpb24oKXtvKDEpfSksIk9iamVjdCIsYyl9fSxmdW5jdGlvbihkLHIsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBlPXQoNzYpLG49TyhlKSxhPXQoMjA5KSxzPU8oYSksaT10KDE2NCksbz1PKGkpLGM9dCgxOTEpLG09TyhjKTtyLmRlZmVyPXgsci5wZXJpb2RpY2l0eT12LHIuY2FsY3VsYXRlRnJhbWVzT2Zmc2V0PVQsci5nZXRQcm9ncmVzcz1sLHIuZ2V0Q3VycmVudEZyYW1lPWY7dmFyIHU9dCgxODgpLHA9dCgxODcpLHk9TyhwKTtmdW5jdGlvbiBPKGcpe3JldHVybiBnJiZnLl9fZXNNb2R1bGU/Zzp7ZGVmYXVsdDpnfX1mdW5jdGlvbiB4KCl7dmFyIGc9e307cmV0dXJuIGcucHJvbWlzZT1uZXcgbS5kZWZhdWx0KGZ1bmN0aW9uKE0sQSl7Zy5yZXNvbHZlPU0sZy5yZWplY3Q9QX0pLGd9ZnVuY3Rpb24gdihnLE0pe3ZhciBBPU1hdGguZmxvb3IoZy9NKSxDPWctQSpNO3JldHVybiBDPT09MCYmQT4wJiYoQz1NLEEtLSksW0EsQ119ZnVuY3Rpb24gVChnKXtnPWcuc2xpY2UoMCk7dmFyIE09Z1swXSxBPWdbZy5sZW5ndGgtMV07QS5vZmZzZXQ9QS5vZmZzZXR8fDEsTS5vZmZzZXQ9TS5vZmZzZXR8fDA7Zm9yKHZhciBDPTAsYj0tMSxFPTA7RTxnLmxlbmd0aDtFKyspe3ZhciBMPWdbRV07aWYoTC5vZmZzZXQhPW51bGwpe3ZhciBEPUUtYjtpZihEPjEpZm9yKHZhciBJPShMLm9mZnNldC1DKS9ELFI9MDtSPEQtMTtSKyspZ1tiK1IrMV0ub2Zmc2V0PUMrSSooUisxKTtDPUwub2Zmc2V0LGI9RX1pZihMLmVhc2luZyE9bnVsbCYmKEwuZWFzaW5nPSgwLHUucGFyc2VFYXNpbmcpKEwuZWFzaW5nKSksRT4wKXt2YXIgQj1nW0VdLmVhc2luZyE9bnVsbDtnW0VdPSgwLG8uZGVmYXVsdCkoe30sZ1tFLTFdLGdbRV0pLEJ8fGRlbGV0ZSBnW0VdLmVhc2luZ319cmV0dXJuIGd9ZnVuY3Rpb24gbChnLE0sQSl7dmFyIEM9Zy5jdXJyZW50VGltZSxiPU0uZGlyZWN0aW9uLEU9TS5kdXJhdGlvbixMPSExO2lmKGI9PT0icmV2ZXJzZSIpQT0xLUEsTD0hMDtlbHNlIGlmKGI9PT0iYWx0ZXJuYXRlInx8Yj09PSJhbHRlcm5hdGUtcmV2ZXJzZSIpe3ZhciBEPU1hdGguZmxvb3IoQy9FKTtBPT09MSYmRC0tLEQlMl5iPT09ImFsdGVybmF0ZS1yZXZlcnNlIiYmKEE9MS1BLEw9ITApfXJldHVybntwOkEsaW52ZXJ0ZWQ6TH19ZnVuY3Rpb24gaChnLE0sQSxDKXt2YXIgYj17fTtyZXR1cm4oMCxzLmRlZmF1bHQpKE0pLmZvckVhY2goZnVuY3Rpb24oRSl7dmFyIEw9KDAsbi5kZWZhdWx0KShFLDIpLEQ9TFswXSxJPUxbMV07aWYoRCE9PSJvZmZzZXQiJiZEIT09ImVhc2luZyIpe3ZhciBSPUFbRF18fEEuZGVmYXVsdCxCPVIoZ1tEXSxJLEMsZy5vZmZzZXQsTS5vZmZzZXQpO0IhPW51bGwmJihiW0RdPUIpfX0pLGJ9ZnVuY3Rpb24gZihnLE0sQSxDKXt2YXIgYj1nLmVhc2luZyxFPWcuZWZmZWN0O0V8fChBPSgwLG8uZGVmYXVsdCkoe30seS5kZWZhdWx0LEEpKTt2YXIgTD17fTtDPWIoQyxNKTtmb3IodmFyIEQ9MTtEPE0ubGVuZ3RoO0QrKyl7dmFyIEk9TVtEXSxSPUkub2Zmc2V0O2lmKFI+PUN8fEQ9PT1NLmxlbmd0aC0xKXt2YXIgQj1NW0QtMV0sej1CLm9mZnNldCxLPUIuZWFzaW5nLFE9QztpZihLKXt2YXIgXz1SLXo7UT1LKChDLXopL18pKl8ren1FP0w9RShCLEksUSx6LFIpOkw9aChCLEksQSxRKTticmVha319cmV0dXJuIEx9fSxmdW5jdGlvbihkLHIsdCl7ZC5leHBvcnRzPXtkZWZhdWx0OnQoMjEwKSxfX2VzTW9kdWxlOiEwfX0sZnVuY3Rpb24oZCxyLHQpe3QoMjExKSxkLmV4cG9ydHM9dCg5MikuT2JqZWN0LmVudHJpZXN9LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDkwKSxuPXQoMjEyKSghMCk7ZShlLlMsIk9iamVjdCIse2VudHJpZXM6ZnVuY3Rpb24ocyl7cmV0dXJuIG4ocyl9fSl9LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDEwMCksbj10KDExMCksYT10KDg0KSxzPXQoMTY5KS5mO2QuZXhwb3J0cz1mdW5jdGlvbihpKXtyZXR1cm4gZnVuY3Rpb24obyl7Zm9yKHZhciBjPWEobyksbT1uKGMpLHU9bS5sZW5ndGgscD0wLHk9W10sTzt1PnA7KU89bVtwKytdLCghZXx8cy5jYWxsKGMsTykpJiZ5LnB1c2goaT9bTyxjW09dXTpjW09dKTtyZXR1cm4geX19fSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtjb25zdCBlPW5ldyBNYXA7ZnVuY3Rpb24gbihzLGk9e30sbz1bXSl7cz1zLnRvTG93ZXJDYXNlKCk7Y29uc3QgYz1lLmdldChzKTtpZighYyl0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIG5vZGU6ICR7c31gKTtjb25zdCBtPW5ldyBjKGkpO3JldHVybiBvLmZvckVhY2godT0+e20uYXBwZW5kQ2hpbGQodSl9KSxtfWNvbnN0IGE9e3JlZ2lzdGVyTm9kZShzLGksbz0xMDApe2lmKGk9aS50b0xvd2VyQ2FzZSgpLGUuaGFzKGkpKXRocm93IG5ldyBUeXBlRXJyb3IoYENhbm5vdCByZWdpc3Rlck5vZGUsICR7aX0gaGFzIGJlZW4gdGFrZW4uYCk7ZS5zZXQoaSxzKSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhzLnByb3RvdHlwZSx7bm9kZVR5cGU6e3ZhbHVlOm99LHRhZ05hbWU6e3ZhbHVlOmkudG9VcHBlckNhc2UoKX0sbm9kZU5hbWU6e3ZhbHVlOml9LG93bmVyRG9jdW1lbnQ6e3ZhbHVlOmF9LG5hbWVzcGFjZVVSSTp7dmFsdWU6YGh0dHA6Ly9zcHJpdGVqcy5jb20vJHtpfWB9fSl9LGNyZWF0ZUVsZW1lbnQ6bixjcmVhdGVFbGVtZW50TlMocyxpKXtyZXR1cm4gbihpKX0saXNTcHJpdGVOb2RlKHMpe3JldHVybiBlLmhhcyhzLnRvTG93ZXJDYXNlKCkpfX07ci5kZWZhdWx0PWF9LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImRlZmF1bHQiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KSx0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7Y29uc3QgZT1TeW1ib2woInR5cGUiKSxuPVN5bWJvbCgiYnViYmxlcyIpLGE9U3ltYm9sKCJvcmlnaW5hbEV2ZW50Iikscz1TeW1ib2woImRldGFpbCIpO2NsYXNzIGl7Y29uc3RydWN0b3IoYyx7YnViYmxlczptPW51bGx9PXt9KXtpZih0eXBlb2YgYz09InN0cmluZyI/KHRoaXNbZV09Yyx0aGlzW25dPSEhbSk6KHRoaXNbZV09Yy50eXBlLHRoaXNbYV09Yyx0aGlzW25dPW0hPW51bGw/ISFtOiEhYy5idWJibGVzLGMuZGV0YWlsJiYodGhpc1tzXT1jLmRldGFpbCkpLCF0aGlzW2VdKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgZXZlbnQgdHlwZS4iKTt0aGlzLmNhbmNlbEJ1YmJsZT0hMX1zZXRPcmlnaW5hbEV2ZW50KGMpe3RoaXNbYV09Y31nZXQgb3JpZ2luYWxFdmVudCgpe3JldHVybiB0aGlzW2FdfWdldCB0eXBlKCl7cmV0dXJuIHRoaXNbZV19Z2V0IGJ1YmJsZXMoKXtyZXR1cm4gdGhpc1tuXX1nZXQgZGV0YWlsKCl7cmV0dXJuIHRoaXNbc119c3RvcFByb3BhZ2F0aW9uKCl7dGhpcy5jYW5jZWxCdWJibGU9ITB9fX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwicGFyc2VGaWx0ZXJTdHJpbmciLGZ1bmN0aW9uKCl7cmV0dXJuIG59KSx0LmQociwiYXBwbHlGaWx0ZXJzIixmdW5jdGlvbigpe3JldHVybiBhfSk7dmFyIGU9dCg3Mik7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2Z1bmN0aW9uIG4ocyl7aWYocz1zLnRyaW0oKSwhc3x8cz09PSJub25lIilyZXR1cm4gbnVsbDtjb25zdCBpPS9eKD86KHVybHxibHVyfGJyaWdodG5lc3N8Y29udHJhc3R8ZHJvcC1zaGFkb3d8Z3JheXNjYWxlfGh1ZS1yb3RhdGV8aW52ZXJ0fG9wYWNpdHl8c2F0dXJhdGV8c2VwaWEpXCgoW14oKV0qKD86XCguKlwpKSpbXigpXSopXCkpKyQvaSxvPXMubWF0Y2goLyg/Oih1cmx8Ymx1cnxicmlnaHRuZXNzfGNvbnRyYXN0fGRyb3Atc2hhZG93fGdyYXlzY2FsZXxodWUtcm90YXRlfGludmVydHxvcGFjaXR5fHNhdHVyYXRlfHNlcGlhKVwoKFteKCldKig/OlwoLipcKSkqW14oKV0qKVwpKSs/L2lnKSxjPVtdO3JldHVybiBvJiZvLmZvckVhY2gobT0+e2NvbnN0IHU9bS5tYXRjaChpKTtpZighdSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGZpdGxlciBzdHJpbmcuIik7bGV0WyxwLHldPXU7cD1wLnRvTG93ZXJDYXNlKCkseT15LnRyaW0oKS5tYXRjaCgvKFteKCApXSt8KFteKCApXStcKC4qXCkpKSg/PVxzfCQpL2cpLm1hcCgoTyx4KT0+e2xldCB2O3JldHVybiBwPT09InVybCJ8fHA9PT0iZHJvcC1zaGFkb3ciJiZ4PT09Mz92PU86dj1PYmplY3QoZS50b051bWJlcikoTyksLyUkLy50ZXN0KE8pJiYodi89MTAwKSx2fSksYy5wdXNoKHt0eXBlOnAsYXJnczp5fSl9KSxjfWZ1bmN0aW9uIGEocyxpKXtzLmNsZWFyRmlsdGVyKCksaSYmaS5mb3JFYWNoKCh7dHlwZTpvLGFyZ3M6Y30pPT57bGV0IG09bzttPT09ImRyb3Atc2hhZG93Ij9tPSJkcm9wU2hhZG93IjptPT09Imh1ZS1yb3RhdGUiJiYobT0iaHVlUm90YXRlIiksc1ttXSguLi5jKX0pfX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gZX0pLHQoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtmdW5jdGlvbiBlKG4sYSl7aWYoIWEpcmV0dXJuO2NvbnN0IHM9bi5nZXRMaXN0ZW5lcnMoImJlZm9yZXJlbmRlciIpLGk9bi5nZXRMaXN0ZW5lcnMoImFmdGVycmVuZGVyIik7cy5sZW5ndGgmJiFhLmJlZm9yZVJlbmRlcj9hLmJlZm9yZVJlbmRlcj1vPT57bi5kaXNwYXRjaEV2ZW50KHt0eXBlOiJiZWZvcmVyZW5kZXIiLGRldGFpbDp7Y29udGV4dDpvfX0pfTpzLmxlbmd0aHx8KGEuYmVmb3JlUmVuZGVyPW51bGwpLGkubGVuZ3RoJiYhYS5hZnRlclJlbmRlcj9hLmFmdGVyUmVuZGVyPW89PntuLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImFmdGVycmVuZGVyIixkZXRhaWw6e2NvbnRleHQ6b319KX06aS5sZW5ndGh8fChhLmFmdGVyUmVuZGVyPW51bGwpfX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gY30pO3ZhciBlPXQoMTIpLG49dCgyMTgpLGE9dCg3MCkscz10KDIxMyk7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2NvbnN0IGk9U3ltYm9sKCJhbW91bnQiKSxvPVN5bWJvbCgibWVzaENsb3VkIik7Y2xhc3MgYyBleHRlbmRzIGEuZGVmYXVsdHtjb25zdHJ1Y3Rvcih1LHA9MSl7c3VwZXIoKSx0aGlzLm1lc2hOb2RlPXUsdS5jb25uZWN0KHRoaXMpLHRoaXNbaV09cCx0aGlzW29dPW51bGx9Z2V0IG1lc2hDbG91ZCgpe2NvbnN0IHU9dGhpcy5tZXNoTm9kZSxwPXRoaXNbaV07cmV0dXJuIXRoaXNbb10mJnUubWVzaCYmKHRoaXNbb109bmV3IGUuTWVzaENsb3VkKHUubWVzaCxwKSksdGhpc1tvXX1nZXQgaXNWaXNpYmxlKCl7cmV0dXJuISF0aGlzLm1lc2hOb2RlJiZ0aGlzLm1lc2hOb2RlLmlzVmlzaWJsZX1nZXQgYW1vdW50KCl7cmV0dXJuIHRoaXNbaV19c2V0IGFtb3VudCh1KXt0aGlzW2ldPXUsdGhpc1tvXSYmKHRoaXNbb10uYW1vdW50PXUpfWJyaWdodG5lc3ModSxwKXt0aGlzLm1lc2hDbG91ZCYmKHRoaXMubWVzaENsb3VkLmJyaWdodG5lc3ModSxwKSx0aGlzLmZvcmNlVXBkYXRlKCkpfWNvbnRyYXN0KHUscCl7dGhpcy5tZXNoQ2xvdWQmJih0aGlzLm1lc2hDbG91ZC5jb250cmFzdCh1LHApLHRoaXMuZm9yY2VVcGRhdGUoKSl9ZGVsZXRlKHUpe3RoaXMubWVzaENsb3VkJiYodGhpcy5tZXNoQ2xvdWQuZGVsZXRlKHUpLHRoaXNbaV0tLSx0aGlzLmZvcmNlVXBkYXRlKCkpfWRyYXcodT1bXSl7aWYoc3VwZXIuZHJhdyh1KSx0aGlzLm1lc2hDbG91ZCl7aWYodGhpcy5wcm9ncmFtKXt0aGlzLm1lc2hDbG91ZC5zZXRQcm9ncmFtKHRoaXMucHJvZ3JhbSk7Y29uc3QgcD10aGlzLnNoYWRlckF0dHJzO3AmJk9iamVjdC5lbnRyaWVzKHApLmZvckVhY2goKFtPLHhdKT0+e3RoaXMubWVzaENsb3VkLm1lc2guc2V0QXR0cmlidXRlKE8seCl9KTtjb25zdCB5PXRoaXMudW5pZm9ybXM7aWYodGhpcy51bmlmb3Jtcyl7Y29uc3QgTz17fTtPYmplY3QuZW50cmllcyh5KS5mb3JFYWNoKChbeCx2XSk9Pnt0eXBlb2Ygdj09ImZ1bmN0aW9uIiYmKHY9dih0aGlzLHgpKSxPW3hdPXZ9KSx0aGlzLm1lc2hDbG91ZC5tZXNoLnNldFVuaWZvcm1zKE8pfX10aGlzLm1lc2hOb2RlLnRleHR1cmVJbWFnZSYmT2JqZWN0KG4uZHJhd1RleHR1cmUpKHRoaXMubWVzaE5vZGUsdGhpcy5tZXNoTm9kZS5tZXNoKSx1LnB1c2godGhpcy5tZXNoQ2xvdWQpfXJldHVybiB1fWdldFRyYW5zZm9ybSh1KXtpZih0aGlzLm1lc2hDbG91ZClyZXR1cm4gdGhpcy5tZXNoQ2xvdWQuZ2V0VHJhbnNmb3JtKHUpfWdyYXlzY2FsZSh1LHApe3RoaXMubWVzaENsb3VkJiYodGhpcy5tZXNoQ2xvdWQuZ3JheXNjYWxlKHUscCksdGhpcy5mb3JjZVVwZGF0ZSgpKX1odWVSb3RhdGUodSxwKXt0aGlzLm1lc2hDbG91ZCYmKHRoaXMubWVzaENsb3VkLmh1ZVJvdGF0ZSh1LHApLHRoaXMuZm9yY2VVcGRhdGUoKSl9aW52ZXJ0KHUscCl7dGhpcy5tZXNoQ2xvdWQmJih0aGlzLm1lc2hDbG91ZC5pbnZlcnQodSxwKSx0aGlzLmZvcmNlVXBkYXRlKCkpfWlzUG9pbnRDb2xsaXNpb24odSxwKXtpZighdGhpcy5tZXNoQ2xvdWQpcmV0dXJuITE7Y29uc3QgeT10aGlzLmF0dHJpYnV0ZXMucG9pbnRlckV2ZW50cztpZih5PT09Im5vbmUifHx5IT09ImFsbCImJiF0aGlzLmlzVmlzaWJsZSlyZXR1cm4hMTtsZXQgTz0iYm90aCI7eT09PSJ2aXNpYmxlRmlsbCImJihPPSJmaWxsIikseT09PSJ2aXNpYmxlU3Ryb2tlIiYmKE89InN0cm9rZSIpO2ZvcihsZXQgeD0wO3g8dGhpc1tpXTt4KyspaWYoIXRoaXMubWVzaENsb3VkLmlzUG9pbnRDb2xsaXNpb24oeCxbdSxwXSxPKSlyZXR1cm4hMTtyZXR1cm4hMH1zZXRPcGFjaXR5KHUscCl7dGhpcy5tZXNoQ2xvdWQmJih0aGlzLm1lc2hDbG91ZC5vcGFjaXR5KHUscCksdGhpcy5mb3JjZVVwZGF0ZSgpKX1yb3RhdGUodSxwLFt5LE9dPVswLDBdKXtjb25zdCB4PU1hdGguUEkqcC8xODA7aWYodGhpcy5tZXNoQ2xvdWQpe2NvbnN0e3g6dix5OlR9PXRoaXMubWVzaE5vZGUuYXR0cmlidXRlczt0aGlzLm1lc2hDbG91ZC5yb3RhdGUodSx4LFt5K3YsTytUXSksdGhpcy5mb3JjZVVwZGF0ZSgpfX1zYXR1cmF0ZSh1LHApe3RoaXMubWVzaENsb3VkJiYodGhpcy5tZXNoQ2xvdWQuc2F0dXJhdGUodSxwKSx0aGlzLmZvcmNlVXBkYXRlKCkpfXNjYWxlKHUsW3AseT1wXSxbTyx4XT1bMCwwXSl7aWYodGhpcy5tZXNoQ2xvdWQpe2NvbnN0e3g6dix5OlR9PXRoaXMubWVzaE5vZGUuYXR0cmlidXRlcyxsPTFlLTU7TWF0aC5hYnMocCk8bCYmKHA9MS9wPjA/bDotbCksTWF0aC5hYnMoeSk8bCYmKHk9MS95PjA/bDotbCksdGhpcy5tZXNoQ2xvdWQuc2NhbGUodSxbcCx5XSxbTyt2LHgrVF0pLHRoaXMuZm9yY2VVcGRhdGUoKX19c2V0Q29sb3JUcmFuc2Zvcm0odSxwKXt0aGlzLm1lc2hDbG91ZCYmKHRoaXMubWVzaENsb3VkLnNldENvbG9yVHJhbnNmb3JtKHUscCksdGhpcy5mb3JjZVVwZGF0ZSgpKX1zZXRGaWxsQ29sb3IodSxwKXt0aGlzLm1lc2hDbG91ZCYmKEFycmF5LmlzQXJyYXkocCkmJihwPVsuLi5wXSxwWzBdLz0yNTUscFsxXS89MjU1LHBbMl0vPTI1NSksdGhpcy5tZXNoQ2xvdWQuc2V0RmlsbENvbG9yKHUscCksdGhpcy5mb3JjZVVwZGF0ZSgpKX1zZXBpYSh1LHApe3RoaXMubWVzaENsb3VkJiYodGhpcy5tZXNoQ2xvdWQuc2VwaWEodSxwKSx0aGlzLmZvcmNlVXBkYXRlKCkpfXNldFJlc29sdXRpb24oe3dpZHRoOnUsaGVpZ2h0OnB9KXtzdXBlci5zZXRSZXNvbHV0aW9uKHt3aWR0aDp1LGhlaWdodDpwfSksdGhpcy5tZXNoTm9kZS5zZXRSZXNvbHV0aW9uKHt3aWR0aDp1LGhlaWdodDpwfSl9c2V0U3Ryb2tlQ29sb3IodSxwKXt0aGlzLm1lc2hDbG91ZCYmKEFycmF5LmlzQXJyYXkocCkmJihwPVsuLi5wXSxwWzBdLz0yNTUscFsxXS89MjU1LHBbMl0vPTI1NSksdGhpcy5tZXNoQ2xvdWQuc2V0U3Ryb2tlQ29sb3IodSxwKSx0aGlzLmZvcmNlVXBkYXRlKCkpfXNldFRyYW5zZm9ybSh1LHApe3RoaXMubWVzaENsb3VkJiYodGhpcy5tZXNoQ2xvdWQuc2V0VHJhbnNmb3JtKHUscCksdGhpcy5mb3JjZVVwZGF0ZSgpKX1za2V3KHUsW3AseT1wXSxbTyx4XT1bMCwwXSl7aWYodGhpcy5tZXNoQ2xvdWQpe2NvbnN0e3g6dix5OlR9PXRoaXMubWVzaE5vZGUuYXR0cmlidXRlczt0aGlzLm1lc2hDbG91ZC5za2V3KHUsW3AseV0sW08rdix4K1RdKSx0aGlzLmZvcmNlVXBkYXRlKCl9fXRyYW5zZm9ybSh1LHApe3RoaXMubWVzaENsb3VkJiYodGhpcy5tZXNoQ2xvdWQudHJhbnNmb3JtKHUscCksdGhpcy5mb3JjZVVwZGF0ZSgpKX10cmFuc2Zvcm1Db2xvcih1LHApe3RoaXMubWVzaENsb3VkJiYodGhpcy5tZXNoQ2xvdWQudHJhbnNmb3JtQ29sb3IodSxwKSx0aGlzLmZvcmNlVXBkYXRlKCkpfXRyYW5zbGF0ZSh1LFtwLHldKXt0aGlzLm1lc2hDbG91ZCYmKHRoaXMubWVzaENsb3VkLnRyYW5zbGF0ZSh1LFtwLHldKSx0aGlzLmZvcmNlVXBkYXRlKCkpfXVwZGF0ZU1lc2goKXt0aGlzW29dJiYodGhpc1tvXS5tZXNoPXRoaXMubWVzaE5vZGUubWVzaCx0aGlzLmZvcmNlVXBkYXRlKCkpfX1zLmRlZmF1bHQucmVnaXN0ZXJOb2RlKGMsImNsb3VkIil9LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImxvYWRUZXh0dXJlIixmdW5jdGlvbigpe3JldHVybiBzfSksdC5kKHIsImFwcGx5VGV4dHVyZSIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pLHQuZChyLCJjcmVhdGVUZXh0dXJlIixmdW5jdGlvbigpe3JldHVybiBjfSksdC5kKHIsImRlbGV0ZVRleHR1cmUiLGZ1bmN0aW9uKCl7cmV0dXJuIG19KSx0LmQociwiZHJhd1RleHR1cmUiLGZ1bmN0aW9uKCl7cmV0dXJuIHB9KSx0LmQociwibG9hZEZyYW1lcyIsZnVuY3Rpb24oKXtyZXR1cm4geX0pO3ZhciBlPXQoMTIpLG49dCg3Mik7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2NvbnN0IGE9e307ZnVuY3Rpb24gcyhPLHgpe2lmKGFbT10pcmV0dXJuIGFbT107Y29uc3Qgdj1lLkVOVi5sb2FkSW1hZ2UoTyx7YWxpYXM6eCx1c2VJbWFnZUJpdG1hcDohMX0pO3JldHVybiB2Pz9PfWFzeW5jIGZ1bmN0aW9uIGkoTyx4LHYpe2xldCBUPXg7aWYodHlwZW9mIHg9PSJzdHJpbmciJiYoVD1zKHgpKSxUJiZ0eXBlb2YgVC50aGVuPT0iZnVuY3Rpb24iJiYoVD1hd2FpdCBUKSx4PT09Ty5hdHRyaWJ1dGVzLnRleHR1cmUpe1QmJlQuaW1hZ2UmJihULnNvdXJjZVJlY3QmJihPLmF0dHJpYnV0ZXMuc291cmNlUmVjdD1ULnNvdXJjZVJlY3QpLE8udGV4dHVyZUltYWdlUm90YXRlZD0hIVQucm90YXRlZCxUPVQuaW1hZ2UpO2NvbnN0e3dpZHRoOmwsaGVpZ2h0OmgsdGV4dHVyZVJlY3Q6Zn09Ty5hdHRyaWJ1dGVzLGc9Ty50ZXh0dXJlSW1hZ2U7Ty50ZXh0dXJlSW1hZ2U9VCx2JiZnIT09VCYmIWYmJihsPT1udWxsfHxoPT1udWxsKSYmTy51cGRhdGVDb250b3VycygpLE8uZm9yY2VVcGRhdGUoKX1yZXR1cm4gVH1jb25zdCBvPVN5bWJvbCgidGV4dHVyZU1hcCIpO2Z1bmN0aW9uIGMoTyx4KXtpZih4W29dPXhbb118fG5ldyBNYXAseFtvXS5oYXMoTykpcmV0dXJuIHhbb10uZ2V0KE8pO2NvbnN0IHY9eC5jcmVhdGVUZXh0dXJlKE8pO3JldHVybiEvXmJsb2I6Ly50ZXN0KE8uc3JjKSYmdHlwZW9mIE8uZ2V0Q29udGV4dCE9ImZ1bmN0aW9uIiYmeFtvXS5zZXQoTyx2KSx2fWZ1bmN0aW9uIG0oTyx4KXtpZih4W29dJiZ4W29dLmhhcyhPKSl7Y29uc3Qgdj14W29dLmdldChPKTtyZXR1cm4geC5kZWxldGVUZXh0dXJlKHYpLHhbb10uZGVsZXRlKE8pLCEwfXJldHVybiExfWNvbnN0IHU9U3ltYm9sKCJ0ZXh0dXJlQ29udGV4dCIpO2Z1bmN0aW9uIHAoTyx4KXtjb25zdCB2PU8udGV4dHVyZUltYWdlIGluc3RhbmNlb2YgU3RyaW5nP1N0cmluZyhPLnRleHR1cmVJbWFnZSk6Ty50ZXh0dXJlSW1hZ2UsVD1PLnRleHR1cmVJbWFnZVJvdGF0ZWQsbD14LnRleHR1cmUsaD1PLnJlbmRlcmVyO2lmKHYpe2NvbnN0IGY9Ty5vcmlnaW5hbENvbnRlbnRSZWN0O2xldCBnPU8uYXR0cmlidXRlcy50ZXh0dXJlUmVjdDtjb25zdCBNPU8uYXR0cmlidXRlcy50ZXh0dXJlUmVwZWF0LEE9Ty5hdHRyaWJ1dGVzLnNvdXJjZVJlY3Q7aWYoIWx8fE9bdV0mJk9bdV0hPT1ofHxsLmltYWdlIT09dnx8bC5vcHRpb25zLnJlcGVhdCE9PU18fCFPYmplY3Qobi5jb21wYXJlVmFsdWUpKGwub3B0aW9ucy5yZWN0LGcpfHwhT2JqZWN0KG4uY29tcGFyZVZhbHVlKShsLm9wdGlvbnMuc3JjUmVjdCxBKSl7Y29uc3QgQz1jKHYsaCk7Zz8oZ1swXSs9ZlswXSxnWzFdKz1mWzFdKTpnPWY7bGV0IGI9bnVsbDtsJiYhaFtvXS5oYXMobC5pbWFnZSkmJighbC5vcHRpb25zfHwhbC5vcHRpb25zLmhpZGRlbikmJihiPXgudW5pZm9ybXMudV90ZXhTYW1wbGVyKSx4LnNldFRleHR1cmUoQyx7cmVjdDpnLHJlcGVhdDpNLHNyY1JlY3Q6QSxyb3RhdGVkOlR9KSxiJiZiLmRlbGV0ZSYmYi5kZWxldGUoKSxPW3VdPWh9fWVsc2UgaWYobCl7bGV0IGY9bnVsbDshaFtvXS5oYXMobC5pbWFnZSkmJighbC5vcHRpb25zfHwhbC5vcHRpb25zLmhpZGRlbikmJihmPXgudW5pZm9ybXMudV90ZXhTYW1wbGVyKSx4LnNldFRleHR1cmUobnVsbCksZiYmZi5kZWxldGUmJmYuZGVsZXRlKCl9fWFzeW5jIGZ1bmN0aW9uIHkoTyx4KXt0eXBlb2YgeD09InN0cmluZyImJih4PWF3YWl0KGF3YWl0IGZldGNoKHgse21ldGhvZDoiR0VUIixtb2RlOiJjb3JzIixjYWNoZToiZGVmYXVsdCJ9KSkuanNvbigpKTtjb25zdCB2PWF3YWl0IHMoTyksVD14LmZyYW1lcztyZXR1cm4gT2JqZWN0LmVudHJpZXMoVCkuZm9yRWFjaCgoW2wsaF0pPT57Y29uc3R7eDpmLHk6Zyx3Ok0saDpBfT1oLmZyYW1lO2xldCBDPVtmLGcsTSxBXTtjb25zdCBiPWgucm90YXRlZDtiJiYoQz1bQ1swXSxDWzFdLENbM10sQ1syXV0pLGFbbF09e2ltYWdlOnYsc291cmNlUmVjdDpDLHJvdGF0ZWQ6Yn19KSx2fX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4geX0pO3ZhciBlPXQoMSksbj10KDEyKSxhPXQoNzApLHM9dCgyMjApLGk9dCgyMjEpLG89dCgyMjIpLGM9dCgyMTMpLG09dCgyMjMpO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtmdW5jdGlvbiB1KE8seCx2KXtyZXR1cm4geCBpbiBPP09iamVjdC5kZWZpbmVQcm9wZXJ0eShPLHgse3ZhbHVlOnYsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTpPW3hdPXYsT31jb25zdCBwPVN5bWJvbCgibWVzaCIpO2NsYXNzIHkgZXh0ZW5kcyBhLmRlZmF1bHR7Y29uc3RydWN0b3IoeD17fSl7c3VwZXIoeCl9Z2V0IGJvcmRlclNpemUoKXtjb25zdHtwYWRkaW5nVG9wOngscGFkZGluZ1JpZ2h0OnYscGFkZGluZ0JvdHRvbTpULHBhZGRpbmdMZWZ0OmwsYm9yZGVyV2lkdGg6aH09dGhpcy5hdHRyaWJ1dGVzLFtmLGddPXRoaXMuY29udGVudFNpemU7cmV0dXJuW2wrZit2K2gseCtnK1QraF19Z2V0IGNsaWVudFNpemUoKXtjb25zdHtwYWRkaW5nVG9wOngscGFkZGluZ1JpZ2h0OnYscGFkZGluZ0JvdHRvbTpULHBhZGRpbmdMZWZ0Omx9PXRoaXMuYXR0cmlidXRlcyxbaCxmXT10aGlzLmNvbnRlbnRTaXplO3JldHVybltsK2grdix4K2YrVF19Z2V0IGNvbnRlbnRTaXplKCl7bGV0e3dpZHRoOngsaGVpZ2h0OnYsYm94U2l6aW5nOlQscGFkZGluZ1RvcDpsLHBhZGRpbmdSaWdodDpoLHBhZGRpbmdCb3R0b206ZixwYWRkaW5nTGVmdDpnfT10aGlzLmF0dHJpYnV0ZXM7aWYoeD14fHwwLHY9dnx8MCxUPT09ImJvcmRlci1ib3giKXtjb25zdCBNPTIqdGhpcy5hdHRyaWJ1dGVzLmJvcmRlcldpZHRoO3gtPU0raCtnLHYtPU0rbCtmLHg9TWF0aC5tYXgoMCx4KSx2PU1hdGgubWF4KDAsdil9cmV0dXJuW3gsdl19Z2V0IGhhc0JvcmRlcigpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXMuYm9yZGVyV2lkdGg+MH1nZXQgaXNWaXNpYmxlKCl7Y29uc3RbeCx2XT10aGlzLmJvcmRlclNpemU7cmV0dXJuIHg+MCYmdj4wfWdldCBtZXNoKCl7aWYodGhpcy5hdHRyaWJ1dGVzLmRpc3BsYXk9PT0ibm9uZSIpcmV0dXJuIG51bGw7Y29uc3QgeD10aGlzLmNsaWVudEJveDtpZih4KXtsZXQgdj10aGlzW3BdO2lmKHYpdi5ib3ghPT14JiYodi5jb250b3Vycz14LmNvbnRvdXJzLHYuYm94PXgpO2Vsc2V7dj1uZXcgbi5NZXNoMkQoeCksdi5ib3g9eDtjb25zdCBsPXRoaXMuYXR0cmlidXRlcy5iZ2NvbG9yO2lmKE9iamVjdChpLnNldEZpbGxDb2xvcikodix7Y29sb3I6bH0pLHRoaXMuaGFzQm9yZGVyKXtjb25zdHtib3JkZXJDb2xvcjpmLGJvcmRlcldpZHRoOmcsYm9yZGVyRGFzaDpNLGJvcmRlckRhc2hPZmZzZXQ6QX09dGhpcy5hdHRyaWJ1dGVzO09iamVjdChpLnNldFN0cm9rZUNvbG9yKSh2LHtjb2xvcjpmLGxpbmVXaWR0aDpnLGxpbmVEYXNoOk0sbGluZURhc2hPZmZzZXQ6QX0pfXRoaXNbcF09djtjb25zdCBoPXRoaXMuYXR0cmlidXRlcy5jbGlwUGF0aDtoJiZ0aGlzW3BdLnNldENsaXBQYXRoKGgpfWNvbnN0IFQ9dGhpcy5vcGFjaXR5O3JldHVybiB2LmdldE9wYWNpdHkoKSE9PVQmJnYuc2V0T3BhY2l0eShUKSx2LnNldFRyYW5zZm9ybSguLi50aGlzLnJlbmRlck1hdHJpeCksdn1yZXR1cm4gbnVsbH1nZXQgb2Zmc2V0U2l6ZSgpe2NvbnN0e3BhZGRpbmdUb3A6eCxwYWRkaW5nUmlnaHQ6dixwYWRkaW5nQm90dG9tOlQscGFkZGluZ0xlZnQ6bCxib3JkZXJXaWR0aDpofT10aGlzLmF0dHJpYnV0ZXMsW2YsZ109dGhpcy5jb250ZW50U2l6ZSxNPTIqaDtyZXR1cm5bbCtmK3YrTSx4K2crVCtNXX1nZXQgb3JpZ2luYWxDbGllbnRSZWN0KCl7aWYodGhpcy5tZXNoKXtjb25zdCB4PXRoaXMubWVzaC5ib3VuZGluZ0JveDtyZXR1cm5beFswXVswXSx4WzBdWzFdLHhbMV1bMF0teFswXVswXSx4WzFdWzFdLXhbMF1bMV1dfXJldHVyblswLDAsMCwwXX1nZXQgb3JpZ2luYWxDb250ZW50UmVjdCgpe2NvbnN0W3gsdixULGxdPXRoaXMub3JpZ2luYWxDbGllbnRSZWN0LGg9dGhpcy5hdHRyaWJ1dGVzLnBhZGRpbmc7cmV0dXJuW3graFswXSx2K2hbMV0sVC1oWzBdLWhbMl0sbC1oWzFdLWhbM11dfWdldEJvdW5kaW5nQ2xpZW50UmVjdCgpe2xldCB4PXRoaXMucmVuZGVyTWF0cml4O3RoaXMubGF5ZXImJnRoaXMubGF5ZXIubGF5ZXJUcmFuc2Zvcm1JbnZlcnQmJih4PWUubWF0MmQubXVsdGlwbHkoQXJyYXkub2YoMCwwLDAsMCwwLDApLHRoaXMubGF5ZXIudHJhbnNmb3JtTWF0cml4LHgpKTtsZXQgdj1udWxsO2lmKHRoaXMubWVzaCl7dj1bLi4udGhpcy5tZXNoLmJvdW5kaW5nQm94XTtjb25zdCBUPXRoaXMuYXR0cmlidXRlcy5ib3JkZXJXaWR0aDtUJiYodlswXT1bdlswXVswXS1ULHZbMF1bMV0tVF0sdlsxXT1bdlsxXVswXStULHZbMV1bMV0rVF0pfXJldHVybiBPYmplY3QobS5kZWZhdWx0KSh2LHgpfW9uUHJvcGVydHlDaGFuZ2UoeCx2LFQpe2lmKHN1cGVyLm9uUHJvcGVydHlDaGFuZ2UoeCx2LFQpLCh4PT09ImFuY2hvclgifHx4PT09ImFuY2hvclkifHx4PT09ImJveFNpemluZyJ8fHg9PT0id2lkdGgifHx4PT09ImhlaWdodCJ8fHg9PT0iYm9yZGVyV2lkdGgifHx4PT09InBhZGRpbmdMZWZ0Inx8eD09PSJwYWRkaW5nUmlnaHQifHx4PT09InBhZGRpbmdUb3AifHx4PT09InBhZGRpbmdCb3R0b20ifHwvXmJvcmRlcihUb3BMZWZ0fFRvcFJpZ2h0fEJvdHRvbVJpZ2h0fEJvdHRvbUxlZnQpUmFkaXVzJC8udGVzdCh4KSkmJnRoaXMudXBkYXRlQ29udG91cnMoKSx0aGlzW3BdJiZ4PT09ImNsaXBQYXRoIiYmdGhpc1twXS5zZXRDbGlwUGF0aCh2KSx0aGlzW3BdJiZ4PT09ImJnY29sb3IiJiZPYmplY3QoaS5zZXRGaWxsQ29sb3IpKHRoaXNbcF0se2NvbG9yOnZ9KSx0aGlzW3BdJiYoeD09PSJib3JkZXJDb2xvciJ8fHg9PT0iYm9yZGVyV2lkdGgifHx4PT09ImJvcmRlckRhc2gifHx4PT09ImJvcmRlckRhc2hPZmZzZXQiKSl7Y29uc3R7Ym9yZGVyQ29sb3I6bCxib3JkZXJXaWR0aDpoLGJvcmRlckRhc2g6Zixib3JkZXJEYXNoT2Zmc2V0Omd9PXRoaXMuYXR0cmlidXRlcztPYmplY3QoaS5zZXRTdHJva2VDb2xvcikodGhpc1twXSx7Y29sb3I6bCxsaW5lV2lkdGg6aCxsaW5lRGFzaDpoP2Y6MCxsaW5lRGFzaE9mZnNldDpnfSl9fXVwZGF0ZUNvbnRvdXJzKCl7Y29uc3R7YW5jaG9yWDp4LGFuY2hvclk6dixib3JkZXJXaWR0aDpULGJvcmRlclJhZGl1czpsfT10aGlzLmF0dHJpYnV0ZXMsW2gsZl09dGhpcy5ib3JkZXJTaXplLGc9dGhpcy5vZmZzZXRTaXplLE09LjUqVCxBPS14KmdbMF0rTSxDPS12KmdbMV0rTTt0aGlzLmNsaWVudEJveD1uZXcgbi5GaWd1cmUyRCxPYmplY3Qoby5jcmVhdGVSYWRpdXNCb3gpKHRoaXMuY2xpZW50Qm94LFtBLEMsaCxmXSxsKX19dSh5LCJBdHRyIixzLmRlZmF1bHQpLGMuZGVmYXVsdC5yZWdpc3Rlck5vZGUoeSwiYmxvY2siKX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gbX0pO3ZhciBlPXQoNzEpLG49dCg3MiksYT10KDIyMSk7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2NvbnN0IHM9U3ltYm9sLmZvcigic3ByaXRlanNfc2V0QXR0cmlidXRlIiksaT1TeW1ib2wuZm9yKCJzcHJpdGVqc19nZXRBdHRyaWJ1dGUiKSxvPVN5bWJvbC5mb3IoInNwcml0ZWpzX3NldEF0dHJpYnV0ZURlZmF1bHQiKSxjPVN5bWJvbC5mb3IoInNwcml0ZWpzX2RlY2xhcmVBbGlhcyIpO2NsYXNzIG0gZXh0ZW5kcyBlLmRlZmF1bHR7Y29uc3RydWN0b3IocCl7c3VwZXIocCksdGhpc1tvXSh7YW5jaG9yWDowLGFuY2hvclk6MCx3aWR0aDp2b2lkIDAsaGVpZ2h0OnZvaWQgMCxib3JkZXJXaWR0aDowLGJvcmRlckNvbG9yOiJyZ2JhKDAsMCwwLDEpIixib3JkZXJEYXNoOnZvaWQgMCxib3JkZXJEYXNoT2Zmc2V0OjAsYm9yZGVyVG9wTGVmdFJhZGl1czpbMCwwXSxib3JkZXJUb3BSaWdodFJhZGl1czpbMCwwXSxib3JkZXJCb3R0b21SaWdodFJhZGl1czpbMCwwXSxib3JkZXJCb3R0b21MZWZ0UmFkaXVzOlswLDBdLGJnY29sb3I6InJnYmEoMCwwLDAsMCkiLHBhZGRpbmdUb3A6MCxwYWRkaW5nUmlnaHQ6MCxwYWRkaW5nQm90dG9tOjAscGFkZGluZ0xlZnQ6MCxib3hTaXppbmc6ImNvbnRlbnQtYm94IixjbGlwUGF0aDp2b2lkIDB9KSx0aGlzW2NdKCJhbmNob3IiLCJzaXplIiwiYm9yZGVyIiwiYm9yZGVyUmFkaXVzIiwicGFkZGluZyIpfWdldCBhbmNob3JYKCl7cmV0dXJuIHRoaXNbaV0oImFuY2hvclgiKX1zZXQgYW5jaG9yWChwKXt0aGlzW3NdKCJhbmNob3JYIixPYmplY3Qobi50b051bWJlcikocCkpfWdldCBhbmNob3JZKCl7cmV0dXJuIHRoaXNbaV0oImFuY2hvclkiKX1zZXQgYW5jaG9yWShwKXt0aGlzW3NdKCJhbmNob3JZIixPYmplY3Qobi50b051bWJlcikocCkpfWdldCBhbmNob3IoKXtyZXR1cm5bdGhpcy5hbmNob3JYLHRoaXMuYW5jaG9yWV19c2V0IGFuY2hvcihwKXtwPU9iamVjdChuLnRvQXJyYXkpKHApLEFycmF5LmlzQXJyYXkocCl8fChwPVtwLHBdKSx0aGlzLmFuY2hvclg9cFswXSx0aGlzLmFuY2hvclk9cFsxXX1nZXQgd2lkdGgoKXtyZXR1cm4gdGhpc1tpXSgid2lkdGgiKX1zZXQgd2lkdGgocCl7dGhpc1tzXSgid2lkdGgiLE9iamVjdChuLnRvTnVtYmVyKShwKSl9Z2V0IGhlaWdodCgpe3JldHVybiB0aGlzW2ldKCJoZWlnaHQiKX1zZXQgaGVpZ2h0KHApe3RoaXNbc10oImhlaWdodCIsT2JqZWN0KG4udG9OdW1iZXIpKHApKX1nZXQgc2l6ZSgpe3JldHVyblt0aGlzLndpZHRoLHRoaXMuaGVpZ2h0XX1zZXQgc2l6ZShwKXtwPU9iamVjdChuLnRvQXJyYXkpKHApLEFycmF5LmlzQXJyYXkocCl8fChwPVtwLHBdKSx0aGlzLndpZHRoPXBbMF0sdGhpcy5oZWlnaHQ9cFsxXX1nZXQgYm9yZGVyV2lkdGgoKXtyZXR1cm4gdGhpc1tpXSgiYm9yZGVyV2lkdGgiKX1zZXQgYm9yZGVyV2lkdGgocCl7dGhpc1tzXSgiYm9yZGVyV2lkdGgiLE9iamVjdChuLnRvTnVtYmVyKShwKSl9Z2V0IGJvcmRlckNvbG9yKCl7cmV0dXJuIHRoaXNbaV0oImJvcmRlckNvbG9yIil9c2V0IGJvcmRlckNvbG9yKHApe3RoaXNbc10oImJvcmRlckNvbG9yIixPYmplY3QoYS5wYXJzZUNvbG9yKShwKSl9Z2V0IGJvcmRlcigpe3JldHVyblt0aGlzLmJvcmRlcldpZHRoLHRoaXMuYm9yZGVyQ29sb3JdfXNldCBib3JkZXIocCl7cD1PYmplY3Qobi50b0FycmF5KShwKSxBcnJheS5pc0FycmF5KHApfHwocD1bcF0pLHRoaXMuYm9yZGVyV2lkdGg9cFswXSxwWzFdIT1udWxsJiYodGhpcy5ib3JkZXJDb2xvcj1wWzFdKX1nZXQgYm9yZGVyRGFzaCgpe3JldHVybiB0aGlzW2ldKCJib3JkZXJEYXNoIil9c2V0IGJvcmRlckRhc2gocCl7cD1PYmplY3Qobi50b0FycmF5KShwLCEwKSxwIT1udWxsJiYhQXJyYXkuaXNBcnJheShwKSYmKHA9W3BdKSx0aGlzW3NdKCJib3JkZXJEYXNoIixwP3AubWFwKG4udG9OdW1iZXIpOm51bGwpfWdldCBib3JkZXJEYXNoT2Zmc2V0KCl7cmV0dXJuIHRoaXNbaV0oImJvcmRlckRhc2hPZmZzZXQiKX1zZXQgYm9yZGVyRGFzaE9mZnNldChwKXt0aGlzW3NdKCJib3JkZXJEYXNoT2Zmc2V0IixPYmplY3Qobi50b051bWJlcikocCkpfWdldCBib3JkZXJUb3BMZWZ0UmFkaXVzKCl7cmV0dXJuIHRoaXNbaV0oImJvcmRlclRvcExlZnRSYWRpdXMiKX1zZXQgYm9yZGVyVG9wTGVmdFJhZGl1cyhwKXtwPU9iamVjdChuLnRvQXJyYXkpKHAsITApLEFycmF5LmlzQXJyYXkocCl8fChwPVtwLHBdKSx0aGlzW3NdKCJib3JkZXJUb3BMZWZ0UmFkaXVzIixwLm1hcChuLnRvTnVtYmVyKSl9Z2V0IGJvcmRlclRvcFJpZ2h0UmFkaXVzKCl7cmV0dXJuIHRoaXNbaV0oImJvcmRlclRvcFJpZ2h0UmFkaXVzIil9c2V0IGJvcmRlclRvcFJpZ2h0UmFkaXVzKHApe3A9T2JqZWN0KG4udG9BcnJheSkocCwhMCksQXJyYXkuaXNBcnJheShwKXx8KHA9W3AscF0pLHRoaXNbc10oImJvcmRlclRvcFJpZ2h0UmFkaXVzIixwLm1hcChuLnRvTnVtYmVyKSl9Z2V0IGJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzKCl7cmV0dXJuIHRoaXNbaV0oImJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzIil9c2V0IGJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzKHApe3A9T2JqZWN0KG4udG9BcnJheSkocCwhMCksQXJyYXkuaXNBcnJheShwKXx8KHA9W3AscF0pLHRoaXNbc10oImJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzIixwLm1hcChuLnRvTnVtYmVyKSl9Z2V0IGJvcmRlckJvdHRvbUxlZnRSYWRpdXMoKXtyZXR1cm4gdGhpc1tpXSgiYm9yZGVyQm90dG9tTGVmdFJhZGl1cyIpfXNldCBib3JkZXJCb3R0b21MZWZ0UmFkaXVzKHApe3A9T2JqZWN0KG4udG9BcnJheSkocCwhMCksQXJyYXkuaXNBcnJheShwKXx8KHA9W3AscF0pLHRoaXNbc10oImJvcmRlckJvdHRvbUxlZnRSYWRpdXMiLHAubWFwKG4udG9OdW1iZXIpKX1nZXQgYm9yZGVyUmFkaXVzKCl7cmV0dXJuWy4uLnRoaXMuYm9yZGVyVG9wTGVmdFJhZGl1cywuLi50aGlzLmJvcmRlclRvcFJpZ2h0UmFkaXVzLC4uLnRoaXMuYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMsLi4udGhpcy5ib3JkZXJCb3R0b21MZWZ0UmFkaXVzXX1zZXQgYm9yZGVyUmFkaXVzKHApe2lmKHA9T2JqZWN0KG4udG9BcnJheSkocCksIUFycmF5LmlzQXJyYXkocCkpcD1BcnJheSg4KS5maWxsKHApO2Vsc2UgaWYocC5sZW5ndGg9PT0yKXA9W3BbMF0scFsxXSxwWzBdLHBbMV0scFswXSxwWzFdLHBbMF0scFsxXV07ZWxzZSBpZihwLmxlbmd0aD09PTQpcD1bcFswXSxwWzFdLHBbMl0scFszXSxwWzBdLHBbMV0scFsyXSxwWzNdXTtlbHNlIGlmKHAubGVuZ3RoPT09NilwPVtwWzBdLHBbMV0scFsyXSxwWzNdLHBbNF0scFs1XSxwWzJdLHBbM11dO2Vsc2UgaWYocC5sZW5ndGghPT04KXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYm9yZGVyUmFkaXVzIHZhbHVlLiIpO3RoaXMuYm9yZGVyVG9wTGVmdFJhZGl1cz1bcFswXSxwWzFdXSx0aGlzLmJvcmRlclRvcFJpZ2h0UmFkaXVzPVtwWzJdLHBbM11dLHRoaXMuYm9yZGVyQm90dG9tUmlnaHRSYWRpdXM9W3BbNF0scFs1XV0sdGhpcy5ib3JkZXJCb3R0b21MZWZ0UmFkaXVzPVtwWzZdLHBbN11dfWdldCBiZ2NvbG9yKCl7cmV0dXJuIHRoaXNbaV0oImJnY29sb3IiKX1zZXQgYmdjb2xvcihwKXt0aGlzW3NdKCJiZ2NvbG9yIixPYmplY3QoYS5wYXJzZUNvbG9yKShwKSl9Z2V0IHBhZGRpbmdUb3AoKXtyZXR1cm4gdGhpc1tpXSgicGFkZGluZ1RvcCIpfXNldCBwYWRkaW5nVG9wKHApe3RoaXNbc10oInBhZGRpbmdUb3AiLE9iamVjdChuLnRvTnVtYmVyKShwKSl9Z2V0IHBhZGRpbmdSaWdodCgpe3JldHVybiB0aGlzW2ldKCJwYWRkaW5nUmlnaHQiKX1zZXQgcGFkZGluZ1JpZ2h0KHApe3RoaXNbc10oInBhZGRpbmdSaWdodCIsT2JqZWN0KG4udG9OdW1iZXIpKHApKX1nZXQgcGFkZGluZ0JvdHRvbSgpe3JldHVybiB0aGlzW2ldKCJwYWRkaW5nQm90dG9tIil9c2V0IHBhZGRpbmdCb3R0b20ocCl7dGhpc1tzXSgicGFkZGluZ0JvdHRvbSIsT2JqZWN0KG4udG9OdW1iZXIpKHApKX1nZXQgcGFkZGluZ0xlZnQoKXtyZXR1cm4gdGhpc1tpXSgicGFkZGluZ0xlZnQiKX1zZXQgcGFkZGluZ0xlZnQocCl7dGhpc1tzXSgicGFkZGluZ0xlZnQiLE9iamVjdChuLnRvTnVtYmVyKShwKSl9Z2V0IHBhZGRpbmcoKXtyZXR1cm5bdGhpcy5wYWRkaW5nVG9wLHRoaXMucGFkZGluZ1JpZ2h0LHRoaXMucGFkZGluZ0JvdHRvbSx0aGlzLnBhZGRpbmdMZWZ0XX1zZXQgcGFkZGluZyhwKXtwPU9iamVjdChuLnRvQXJyYXkpKHApLEFycmF5LmlzQXJyYXkocCk/cC5sZW5ndGg9PT0yP3A9W3BbMF0scFsxXSxwWzBdLHBbMV1dOnAubGVuZ3RoPT09MyYmKHA9W3BbMF0scFsxXSxwWzJdLHBbMV1dKTpwPVtwLHAscCxwXSx0aGlzLnBhZGRpbmdUb3A9cFswXSx0aGlzLnBhZGRpbmdSaWdodD1wWzFdLHRoaXMucGFkZGluZ0JvdHRvbT1wWzJdLHRoaXMucGFkZGluZ0xlZnQ9cFszXX1nZXQgY2xpcFBhdGgoKXtyZXR1cm4gdGhpc1tpXSgiY2xpcFBhdGgiKX1zZXQgY2xpcFBhdGgocCl7dGhpc1tzXSgiY2xpcFBhdGgiLHApfWdldCBib3hTaXppbmcoKXtyZXR1cm4gdGhpc1tpXSgiYm94U2l6aW5nIil9c2V0IGJveFNpemluZyhwKXtpZihwIT1udWxsJiZwIT09ImJvcmRlci1ib3giJiZwIT09ImNvbnRlbnQtYm94Iil0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGJveFNpemluZyB0eXBlLiIpO3RoaXNbc10oImJveFNpemluZyIscCl9fX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiR3JhZGllbnQiLGZ1bmN0aW9uKCl7cmV0dXJuIGF9KSx0LmQociwiaXNUcmFuc3BhcmVudCIsZnVuY3Rpb24oKXtyZXR1cm4gc30pLHQuZChyLCJwYXJzZUNvbG9yIixmdW5jdGlvbigpe3JldHVybiBpfSksdC5kKHIsInNldEZpbGxDb2xvciIsZnVuY3Rpb24oKXtyZXR1cm4gY30pLHQuZChyLCJzZXRTdHJva2VDb2xvciIsZnVuY3Rpb24oKXtyZXR1cm4gbX0pLHQuZChyLCJDb2xvciIsZnVuY3Rpb24oKXtyZXR1cm4gdX0pO3ZhciBlPXQoMzIpLG49dC5uKGUpO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtjbGFzcyBhe2NvbnN0cnVjdG9yKHt2ZWN0b3I6eSxjb2xvcnM6T30pe2lmKCFBcnJheS5pc0FycmF5KHkpfHx5Lmxlbmd0aCE9PTQmJnkubGVuZ3RoIT09NiYmeS5sZW5ndGghPT0zKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgZ3JhZGllbnQiKTt0aGlzLnZlY3Rvcj15LHRoaXMuY29sb3JzPU8ubWFwKCh7b2Zmc2V0OngsY29sb3I6dn0pPT4oe29mZnNldDp4LGNvbG9yOmkodil9KSl9dG9TdHJpbmcoKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoe3ZlY3Rvcjp0aGlzLnZlY3Rvcixjb2xvcnM6dGhpcy5jb2xvcnN9KX19ZnVuY3Rpb24gcyhwKXtyZXR1cm4gcCBpbnN0YW5jZW9mIGE/ITE6cD09bnVsbD8hMDpuKCkocClbM109PT0wfWZ1bmN0aW9uIGkocCl7aWYocD09bnVsbHx8KHB8fChwPSJ0cmFuc3BhcmVudCIpLHAgaW5zdGFuY2VvZiBhKSlyZXR1cm4gcDtjb25zdCB5PW4oKShwKTtpZigheXx8IXkubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgY29sb3IgdmFsdWUuIik7cmV0dXJuYHJnYmEoJHt5LmpvaW4oKX0pYH1mdW5jdGlvbiBvKHAseSxPKXtjb25zdCB4PXAuYm91bmRpbmdCb3hbMF07aWYoTy52ZWN0b3Ipe2xldHt2ZWN0b3I6dixjb2xvcnM6VH09Tzt2Lmxlbmd0aD09PTQ/KHY9W3ZbMF0reFswXSx2WzFdK3hbMV0sdlsyXSt4WzBdLHZbM10reFsxXV0scC5zZXRMaW5lYXJHcmFkaWVudCh7dmVjdG9yOnYsY29sb3JzOlQsdHlwZTp5fSkpOnYubGVuZ3RoPT09Mz8odj1bdlswXSt4WzBdLHZbMV0reFsxXSx2WzJdXSxwLnNldENpcmN1bGFyR3JhZGllbnQoe3ZlY3Rvcjp2LGNvbG9yczpULHR5cGU6eX0pKToodj1bdlswXSt4WzBdLHZbMV0reFsxXSx2WzJdLHZbM10reFswXSx2WzRdK3hbMV0sdls1XV0scC5zZXRSYWRpYWxHcmFkaWVudCh7dmVjdG9yOnYsY29sb3JzOlQsdHlwZTp5fSkpfWVsc2UgcC5ncmFkaWVudCYmcC5ncmFkaWVudFt5XSYmKGRlbGV0ZSBwLmdyYWRpZW50W3ldLGRlbGV0ZSBwLnVuaWZvcm1zLnVfcmFkaWFsR3JhZGllbnRWZWN0b3IpfWZ1bmN0aW9uIGMocCx7Y29sb3I6eSxydWxlOk89Im5vbnplcm8ifSl7cmV0dXJuIG8ocCwiZmlsbCIseSkseS52ZWN0b3J8fHAuc2V0RmlsbCh7Y29sb3I6eSxydWxlOk99KSxwfWZ1bmN0aW9uIG0ocCx7Y29sb3I6eSxsaW5lV2lkdGg6TyxsaW5lQ2FwOngsbGluZUpvaW46dixsaW5lRGFzaDpULGxpbmVEYXNoT2Zmc2V0OmwsbWl0ZXJMaW1pdDpoLHJvdW5kU2VnbWVudHM6Zn0pe28ocCwic3Ryb2tlIix5KSx5LnZlY3RvciYmKHk9WzAsMCwwLDFdKSxwLnNldFN0cm9rZSh7Y29sb3I6eSx0aGlja25lc3M6TyxjYXA6eCxqb2luOnYsbWl0ZXJMaW1pdDpoLGxpbmVEYXNoOlQsbGluZURhc2hPZmZzZXQ6bCxyb3VuZFNlZ21lbnRzOmZ9KX1jbGFzcyB1IGV4dGVuZHMgQXJyYXl7Y29uc3RydWN0b3IoeT0wLE89MCx4PTAsdj0wKXtyZXR1cm4gQXJyYXkuaXNBcnJheSh5KSYmKFt5LE8seCx2XT15KSx0eXBlb2YgeT09InN0cmluZyImJihbeSxPLHgsdl09bigpKHkpLHkvPTI1NSxPLz0yNTUseC89MjU1KSxzdXBlcih5LE8seCx2KSx0aGlzfWdldCByKCl7cmV0dXJuIE1hdGgucm91bmQodGhpc1swXSoyNTUpfXNldCByKHkpe3RoaXNbMF09eS8yNTV9Z2V0IGcoKXtyZXR1cm4gTWF0aC5yb3VuZCh0aGlzWzFdKjI1NSl9c2V0IGcoeSl7dGhpc1sxXT15LzI1NX1nZXQgYigpe3JldHVybiBNYXRoLnJvdW5kKHRoaXNbMl0qMjU1KX1zZXQgYih5KXt0aGlzWzJdPXkvMjU1fWdldCBhKCl7cmV0dXJuIHRoaXNbM119c2V0IGEoeSl7dGhpc1szXT15fWdldCBoZXgoKXtjb25zdCB5PWAwJHt0aGlzLnIudG9TdHJpbmcoMTYpfWAuc2xpY2UoLTIpLE89YDAke3RoaXMuZy50b1N0cmluZygxNil9YC5zbGljZSgtMikseD1gMCR7dGhpcy5iLnRvU3RyaW5nKDE2KX1gLnNsaWNlKC0yKTtsZXQgdjtyZXR1cm4gdGhpcy5hPDEmJih2PU1hdGgucm91bmQodGhpc1szXSoyNTUpLHY9YDAke3YudG9TdHJpbmcoMTYpfWAuc2xpY2UoLTIpKSxgIyR7eX0ke099JHt4fSR7dnx8IiJ9YH1nZXQgcmdiYSgpe3JldHVybmByZ2JhKCR7dGhpcy5yfSwke3RoaXMuZ30sJHt0aGlzLmJ9LCR7dGhpcy5hfSlgfWZyb21Db2xvcih5KXtyZXR1cm4gdHlwZW9mIHk9PSJzdHJpbmciJiYoeT1uKCkoeSkseVswXS89MjU1LHlbMV0vPTI1NSx5WzJdLz0yNTUpLHRoaXNbMF09eVswXSx0aGlzWzFdPXlbMV0sdGhpc1syXT15WzJdLHRoaXNbM109eVszXSx0aGlzfX19LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImNyZWF0ZVJhZGl1c0JveCIsZnVuY3Rpb24oKXtyZXR1cm4gbn0pLHQoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtmdW5jdGlvbiBlKGEscyxpLG8sYyxtPSJsZWZ0VG9wIil7Y29uc3QgdT0uNTUyMjg0OCxwPW8vMip1LHk9Yy8yKnUsTz1zK28seD1pK2Msdj1zK28vMixUPWkrYy8yO209PT0ibGVmdFRvcCI/KGEubW92ZVRvKHMsVCksYS5iZXppZXJDdXJ2ZVRvKHMsVC15LHYtcCxpLHYsaSkpOm09PT0icmlnaHRUb3AiP2EuYmV6aWVyQ3VydmVUbyh2K3AsaSxPLFQteSxPLFQpOm09PT0icmlnaHRCb3R0b20iP2EuYmV6aWVyQ3VydmVUbyhPLFQreSx2K3AseCx2LHgpOm09PT0ibGVmdEJvdHRvbSImJmEuYmV6aWVyQ3VydmVUbyh2LXAseCxzLFQreSxzLFQpfWZ1bmN0aW9uIG4oYSxbcyxpLG8sY10sbSl7aWYoIW18fEFycmF5LmlzQXJyYXkobSkmJm0uZXZlcnkodT0+dT09PTApKWEuYmVnaW5QYXRoKCksYS5yZWN0KHMsaSxvLGMpO2Vsc2V7dHlwZW9mIG09PSJudW1iZXIiJiYobT1BcnJheSg4KS5maWxsKG0pKTtjb25zdFt1LHAseSxPLHgsdixULGxdPW0ubWFwKChoLGYpPT5mJTI/TWF0aC5taW4oaCxjLzIpOk1hdGgubWluKGgsby8yKSk7YS5iZWdpblBhdGgoKSxhLm1vdmVUbyhzLGkrcCksZShhLHMsaSx1KjIscCoyLCJsZWZ0VG9wIiksYS5saW5lVG8ocytvLXksaSksZShhLHMrby15KjIsaSx5KjIsTyoyLCJyaWdodFRvcCIpLGEubGluZVRvKHMrbyxpK2MtdiksZShhLHMrby14KjIsaStjLXYqMix4KjIsdioyLCJyaWdodEJvdHRvbSIpLGEubGluZVRvKHMrVCxpK2MpLGUoYSxzLGkrYy1sKjIsVCoyLGwqMiwibGVmdEJvdHRvbSIpLGEuY2xvc2VQYXRoKCl9cmV0dXJuIGF9fSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KSxyLmRlZmF1bHQ9ZnVuY3Rpb24oZSxuKXtpZighZSlyZXR1cm57eDowLHk6MCx3aWR0aDowLGhlaWdodDowLGxlZnQ6MCx0b3A6MCxyaWdodDowLGJvdHRvbTowfTtjb25zdFtbYSxzXSxbaSxvXV09ZSxjPWEqblswXStzKm5bMl0rbls0XSxtPWEqblsxXStzKm5bM10rbls1XSx1PWkqblswXStzKm5bMl0rbls0XSxwPWkqblsxXStzKm5bM10rbls1XSx5PWkqblswXStvKm5bMl0rbls0XSxPPWkqblsxXStvKm5bM10rbls1XSx4PWEqblswXStvKm5bMl0rbls0XSx2PWEqblsxXStvKm5bM10rbls1XSxUPU1hdGgubWluKGMsdSx5LHgpLGw9TWF0aC5taW4obSxwLE8sdiksaD1NYXRoLm1heChjLHUseSx4KSxmPU1hdGgubWF4KG0scCxPLHYpO3JldHVybnt4OlQseTpsLHdpZHRoOmgtVCxoZWlnaHQ6Zi1sLGxlZnQ6VCx0b3A6bCxyaWdodDpoLGJvdHRvbTpmfX19LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImRlZmF1bHQiLGZ1bmN0aW9uKCl7cmV0dXJuIGN9KTt2YXIgZT10KDIxOCksbj10KDIxOSksYT10KDIyNSkscz10KDIxMyk7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2Z1bmN0aW9uIGkobSx1LHApe3JldHVybiB1IGluIG0/T2JqZWN0LmRlZmluZVByb3BlcnR5KG0sdSx7dmFsdWU6cCxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOm1bdV09cCxtfWNvbnN0IG89U3ltYm9sKCJ0ZXh0dXJlVGFzayIpO2NsYXNzIGMgZXh0ZW5kcyBuLmRlZmF1bHR7Y29uc3RydWN0b3IodT17fSl7dHlwZW9mIHU9PSJzdHJpbmciJiYodT17dGV4dHVyZTp1fSksc3VwZXIodSl9Z2V0IGNvbnRlbnRTaXplKCl7bGV0W3UscF09c3VwZXIuY29udGVudFNpemU7Y29uc3R7d2lkdGg6eSxoZWlnaHQ6T309dGhpcy5hdHRyaWJ1dGVzO2lmKHk9PW51bGx8fE89PW51bGwpe2NvbnN0IHg9dGhpcy50ZXh0dXJlSW1hZ2Usdj10aGlzLmF0dHJpYnV0ZXMudGV4dHVyZVJlY3QsVD10aGlzLmF0dHJpYnV0ZXMuc291cmNlUmVjdDtpZih2KXk9PW51bGwmJih1PXZbMF0rdlsyXSksTz09bnVsbCYmKHA9dlsxXSt2WzNdKTtlbHNlIGlmKFQpe2NvbnN0IGw9dGhpcy5sYXllcj90aGlzLmxheWVyLmRpc3BsYXlSYXRpbzoxO3k9PW51bGwmJih1PVRbMl0vbCksTz09bnVsbCYmKHA9VFszXS9sKX1lbHNlIGlmKHgpe2NvbnN0IGw9dGhpcy5sYXllcj90aGlzLmxheWVyLmRpc3BsYXlSYXRpbzoxO3k9PW51bGwmJih1PXgud2lkdGgvbCksTz09bnVsbCYmKHA9eC5oZWlnaHQvbCl9fXJldHVyblt1LHBdfWdldCB0ZXh0dXJlSW1hZ2VSZWFkeSgpe3JldHVybiB0aGlzW29dfHxQcm9taXNlLnJlc29sdmUoKX1kcmF3KHU9W10pe3N1cGVyLmRyYXcodSk7Y29uc3QgcD10aGlzLm1lc2g7cmV0dXJuIHAmJk9iamVjdChlLmRyYXdUZXh0dXJlKSh0aGlzLHApLHV9b25Qcm9wZXJ0eUNoYW5nZSh1LHAseSl7aWYoc3VwZXIub25Qcm9wZXJ0eUNoYW5nZSh1LHAseSksdT09PSJ0ZXh0dXJlIiYmKHRoaXNbb109T2JqZWN0KGUuYXBwbHlUZXh0dXJlKSh0aGlzLHAsITApKSx1PT09InRleHR1cmVSZWN0Iil7Y29uc3R7d2lkdGg6TyxoZWlnaHQ6eH09dGhpcy5hdHRyaWJ1dGVzOyhPPT1udWxsfHx4PT1udWxsKSYmdGhpcy51cGRhdGVDb250b3VycygpfX19aShjLCJBdHRyIixhLmRlZmF1bHQpLHMuZGVmYXVsdC5yZWdpc3Rlck5vZGUoYywic3ByaXRlIil9LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImRlZmF1bHQiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KTt2YXIgZT10KDIyMCk7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2NvbnN0IG49U3ltYm9sLmZvcigic3ByaXRlanNfc2V0QXR0cmlidXRlRGVmYXVsdCIpLGE9U3ltYm9sLmZvcigic3ByaXRlanNfc2V0QXR0cmlidXRlIikscz1TeW1ib2wuZm9yKCJzcHJpdGVqc19nZXRBdHRyaWJ1dGUiKTtjbGFzcyBpIGV4dGVuZHMgZS5kZWZhdWx0e2NvbnN0cnVjdG9yKGMpe3N1cGVyKGMpLHRoaXNbbl0oe3RleHR1cmU6dm9pZCAwLHRleHR1cmVSZWN0OnZvaWQgMCx0ZXh0dXJlUmVwZWF0OiExLHNvdXJjZVJlY3Q6dm9pZCAwfSl9Z2V0IHRleHR1cmUoKXtyZXR1cm4gdGhpc1tzXSgidGV4dHVyZSIpfXNldCB0ZXh0dXJlKGMpe3RoaXNbYV0oInRleHR1cmUiLGMpfWdldCB0ZXh0dXJlUmVjdCgpe3JldHVybiB0aGlzW3NdKCJ0ZXh0dXJlUmVjdCIpfXNldCB0ZXh0dXJlUmVjdChjKXt0aGlzW2FdKCJ0ZXh0dXJlUmVjdCIsYyl9Z2V0IHNvdXJjZVJlY3QoKXtyZXR1cm4gdGhpc1tzXSgic291cmNlUmVjdCIpfXNldCBzb3VyY2VSZWN0KGMpe3RoaXNbYV0oInNvdXJjZVJlY3QiLGMpfWdldCB0ZXh0dXJlUmVwZWF0KCl7cmV0dXJuIHRoaXNbc10oInRleHR1cmVSZXBlYXQiKX1zZXQgdGV4dHVyZVJlcGVhdChjKXt0aGlzW2FdKCJ0ZXh0dXJlUmVwZWF0IiwhIWMpfX19LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImRlZmF1bHQiLGZ1bmN0aW9uKCl7cmV0dXJuIE99KTt2YXIgZT10KDEyKSxuPXQoMjI3KSxhPXQubihuKSxzPXQoNzApLGk9dCgyMjgpLG89dCgyMjEpLGM9dCgyMTgpLG09dCgyMTMpLHU9dCgyMjMpO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtmdW5jdGlvbiBwKHgsdixUKXtyZXR1cm4gdiBpbiB4P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh4LHYse3ZhbHVlOlQsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp4W3ZdPVQseH1jb25zdCB5PVN5bWJvbCgibWVzaCIpO2NsYXNzIE8gZXh0ZW5kcyBzLmRlZmF1bHR7Y29uc3RydWN0b3Iodj17fSl7dHlwZW9mIHY9PSJzdHJpbmciJiYodj17ZDp2fSksc3VwZXIodiksdGhpcy5lZmZlY3RzPXtkKFQsbCxoLGYsZyl7Y29uc3QgTT0oaC1mKS8oZy1mKTtpZihNPD0wKXJldHVybiBUO2lmKE0+PTEpcmV0dXJuIGw7Y29uc3QgQT1hLmEuX3ByZXByb2Nlc3NpbmcoYS5hLnBhdGgyc2hhcGVzKFQpLGEuYS5wYXRoMnNoYXBlcyhsKSksQz1hLmEuX2xlcnAoLi4uQSxNKVswXTtyZXR1cm4gQy5yZWR1Y2UoKEUsTCk9PmAke0V9JHtMLnNsaWNlKDIpLmpvaW4oIiAiKX0gYCxgTSR7Q1swXVswXX0gJHtDWzBdWzFdfUNgKS50cmltKCl9fX1nZXQgaXNWaXNpYmxlKCl7cmV0dXJuISF0aGlzLmR9Z2V0IG1lc2goKXtpZih0aGlzLmF0dHJpYnV0ZXMuZGlzcGxheT09PSJub25lIilyZXR1cm4gbnVsbDtjb25zdCB2PXRoaXMucGF0aDtpZih2KXtsZXQgVD10aGlzW3ldO2lmKFQpVC5wYXRoIT09diYmKFQuY29udG91cnM9di5jb250b3VycyxULnBhdGg9dik7ZWxzZXtUPW5ldyBlLk1lc2gyRCh0aGlzLnBhdGgpLFQucGF0aD12O2NvbnN0IGg9dGhpcy5hdHRyaWJ1dGVzLmZpbGxDb2xvcixmPXRoaXMuYXR0cmlidXRlcy5maWxsUnVsZTtoJiZPYmplY3Qoby5zZXRGaWxsQ29sb3IpKFQse2NvbG9yOmgscnVsZTpmfSk7Y29uc3QgZz10aGlzLmF0dHJpYnV0ZXMubGluZVdpZHRoLE09dGhpcy5hdHRyaWJ1dGVzLnN0cm9rZUNvbG9yO2lmKE0mJmc+MCl7Y29uc3R7bGluZUNhcDpDLGxpbmVKb2luOmIsbWl0ZXJMaW1pdDpFLGxpbmVEYXNoOkwsbGluZURhc2hPZmZzZXQ6RCxyb3VuZFNlZ21lbnRzOkl9PXRoaXMuYXR0cmlidXRlcztPYmplY3Qoby5zZXRTdHJva2VDb2xvcikoVCx7Y29sb3I6TSxsaW5lV2lkdGg6ZyxsaW5lQ2FwOkMsbGluZUpvaW46YixtaXRlckxpbWl0OkUsbGluZURhc2g6TCxsaW5lRGFzaE9mZnNldDpELHJvdW5kU2VnbWVudHM6SX0pfXRoaXNbeV09VDtjb25zdCBBPXRoaXMuYXR0cmlidXRlcy5jbGlwUGF0aDtBJiZ0aGlzW3ldLnNldENsaXBQYXRoKEEpfWNvbnN0IGw9dGhpcy5vcGFjaXR5O3JldHVybiBULmdldE9wYWNpdHkoKSE9PWwmJlQuc2V0T3BhY2l0eShsKSxULnNldFRyYW5zZm9ybSguLi50aGlzLnJlbmRlck1hdHJpeCksVH1yZXR1cm4gbnVsbH1nZXQgb3JpZ2luYWxDb250ZW50UmVjdCgpe2lmKHRoaXMucGF0aCl7Y29uc3Qgdj10aGlzLnBhdGguYm91bmRpbmdCb3g7cmV0dXJuW3ZbMF1bMF0sdlswXVsxXSx2WzFdWzBdLXZbMF1bMF0sdlsxXVsxXS12WzBdWzFdXX1yZXR1cm5bMCwwLDAsMF19Z2V0IG9yaWdpbmFsQ2xpZW50UmVjdCgpe2lmKHRoaXMubWVzaCl7Y29uc3Qgdj10aGlzLm1lc2guYm91bmRpbmdCb3g7cmV0dXJuW3ZbMF1bMF0sdlswXVsxXSx2WzFdWzBdLXZbMF1bMF0sdlsxXVsxXS12WzBdWzFdXX1yZXR1cm5bMCwwLDAsMF19Z2V0IG9yaWdpbmFsQ2xpZW50Q2VudGVyKCl7cmV0dXJuIHRoaXMubWVzaD90aGlzLm1lc2guYm91bmRpbmdDZW50ZXI6WzAsMF19c2V0IGQodil7dGhpcy5hdHRyaWJ1dGVzLmQ9dn1nZXQgZCgpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXMuZH1kcmF3KHY9W10pe3N1cGVyLmRyYXcodik7Y29uc3QgVD10aGlzLm1lc2g7cmV0dXJuIFQmJk9iamVjdChjLmRyYXdUZXh0dXJlKSh0aGlzLFQpLHZ9Z2V0Qm91bmRpbmdDbGllbnRSZWN0KCl7bGV0IHY9bnVsbDtyZXR1cm4gdGhpcy5tZXNoJiYodj10aGlzLm1lc2guYm91bmRpbmdCb3gpLE9iamVjdCh1LmRlZmF1bHQpKHYsdGhpcy5yZW5kZXJNYXRyaXgpfWdldFBhdGhMZW5ndGgoKXtyZXR1cm4gdGhpcy5tZXNoP3RoaXMubWVzaC5nZXRUb3RhbExlbmd0aCgpOjB9Z2V0UG9pbnRBdExlbmd0aCh2KXtpZih0aGlzLm1lc2gpe2NvbnN0IFQ9dGhpcy5tZXNoLmdldFBvaW50QXRMZW5ndGgodik7aWYoVClyZXR1cm5bVC54LFQueV19cmV0dXJuWzAsMF19b25Qcm9wZXJ0eUNoYW5nZSh2LFQsbCl7aWYoc3VwZXIub25Qcm9wZXJ0eUNoYW5nZSh2LFQsbCksKHY9PT0iZCJ8fHY9PT0ibm9ybWFsaXplIikmJnRoaXMudXBkYXRlQ29udG91cnMoKSx0aGlzW3ldJiYodj09PSJmaWxsQ29sb3IifHx2PT09ImZpbGxSdWxlIikpe2NvbnN0e2ZpbGxDb2xvcjpoLGZpbGxSdWxlOmZ9PXRoaXMuYXR0cmlidXRlcztPYmplY3Qoby5zZXRGaWxsQ29sb3IpKHRoaXNbeV0se2NvbG9yOmgscnVsZTpmfSl9aWYodGhpc1t5XSYmKHY9PT0ic3Ryb2tlQ29sb3IifHx2PT09ImxpbmVXaWR0aCJ8fHY9PT0ibGluZUNhcCJ8fHY9PT0ibGluZUpvaW4ifHx2PT09ImxpbmVEYXNoInx8dj09PSJsaW5lRGFzaE9mZnNldCJ8fHY9PT0icm91bmRTZWdtZW50cyIpKXtjb25zdHtzdHJva2VDb2xvcjpoLGxpbmVXaWR0aDpmfT10aGlzLmF0dHJpYnV0ZXM7aWYoaCYmZj4wKXtjb25zdHtsaW5lQ2FwOmcsbGluZUpvaW46TSxsaW5lRGFzaDpBLGxpbmVEYXNoT2Zmc2V0OkMsbWl0ZXJMaW1pdDpiLHJvdW5kU2VnbWVudHM6RX09dGhpcy5hdHRyaWJ1dGVzO09iamVjdChvLnNldFN0cm9rZUNvbG9yKSh0aGlzW3ldLHtjb2xvcjpoLGxpbmVDYXA6ZyxsaW5lSm9pbjpNLGxpbmVXaWR0aDpmLGxpbmVEYXNoOkEsbGluZURhc2hPZmZzZXQ6QyxtaXRlckxpbWl0OmIscm91bmRTZWdtZW50czpFfSl9fXRoaXNbeV0mJnY9PT0iY2xpcFBhdGgiJiZ0aGlzW3ldLnNldENsaXBQYXRoKFQpLHY9PT0idGV4dHVyZSImJk9iamVjdChjLmFwcGx5VGV4dHVyZSkodGhpcyxUKX11cGRhdGVDb250b3Vycygpe3RoaXMucGF0aD1uZXcgZS5GaWd1cmUyRCx0aGlzLnBhdGguYWRkUGF0aCh0aGlzLmF0dHJpYnV0ZXMuZCksdGhpcy5hdHRyaWJ1dGVzLm5vcm1hbGl6ZSYmdGhpcy5wYXRoLm5vcm1hbGl6ZSguLi50aGlzLnBhdGguYm91bmRpbmdDZW50ZXIpfX1wKE8sIkF0dHIiLGkuZGVmYXVsdCksbS5kZWZhdWx0LnJlZ2lzdGVyTm9kZShPLCJwYXRoIil9LGZ1bmN0aW9uKGQscix0KXsoZnVuY3Rpb24oZSxuKXtkLmV4cG9ydHM9bigpfSkodGhpcyxmdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gTChELEkpe3ZhciBSPVtdLEI9ITAsej0hMSxLPXZvaWQgMDt0cnl7Zm9yKHZhciBRPURbU3ltYm9sLml0ZXJhdG9yXSgpLF87IShCPShfPVEubmV4dCgpKS5kb25lKSYmKFIucHVzaChfLnZhbHVlKSwhKEkmJlIubGVuZ3RoPT09SSkpO0I9ITApO31jYXRjaChqKXt6PSEwLEs9an1maW5hbGx5e3RyeXshQiYmUS5yZXR1cm4mJlEucmV0dXJuKCl9ZmluYWxseXtpZih6KXRocm93IEt9fXJldHVybiBSfXJldHVybiBmdW5jdGlvbihELEkpe2lmKEFycmF5LmlzQXJyYXkoRCkpcmV0dXJuIEQ7aWYoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChEKSlyZXR1cm4gTChELEkpO3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UiKX19KCksbj1NYXRoLlBJKjIsYT1mdW5jdGlvbihELEksUixCLHosSyxRKXt2YXIgXz1ELngsaj1ELnk7Xyo9SSxqKj1SO3ZhciBHPUIqXy16KmosWD16Kl8rQipqO3JldHVybnt4OkcrSyx5OlgrUX19LHM9ZnVuY3Rpb24oRCxJKXt2YXIgUj0xLjMzMzMzMzMzMzMzMzMzMzMqTWF0aC50YW4oSS80KSxCPU1hdGguY29zKEQpLHo9TWF0aC5zaW4oRCksSz1NYXRoLmNvcyhEK0kpLFE9TWF0aC5zaW4oRCtJKTtyZXR1cm5be3g6Qi16KlIseTp6K0IqUn0se3g6SytRKlIseTpRLUsqUn0se3g6Syx5OlF9XX0saT1mdW5jdGlvbihELEksUixCKXt2YXIgej1EKkItSSpSPDA/LTE6MSxLPU1hdGguc3FydChEKkQrSSpJKSxRPU1hdGguc3FydChEKkQrSSpJKSxfPUQqUitJKkIsaj1fLyhLKlEpO3JldHVybiBqPjEmJihqPTEpLGo8LTEmJihqPS0xKSx6Kk1hdGguYWNvcyhqKX0sbz1mdW5jdGlvbihELEksUixCLHosSyxRLF8saixHLFgsWil7dmFyIHR0PU1hdGgucG93KHosMiksbnQ9TWF0aC5wb3coSywyKSxxPU1hdGgucG93KFgsMiksZHQ9TWF0aC5wb3coWiwyKSx1dD10dCpudC10dCpkdC1udCpxO3V0PDAmJih1dD0wKSx1dC89dHQqZHQrbnQqcSx1dD1NYXRoLnNxcnQodXQpKihRPT09Xz8tMToxKTt2YXIgVz11dCp6L0sqWixGPXV0Ki1LL3oqWCxWPUcqVy1qKkYrKEQrUikvMixKPWoqVytHKkYrKEkrQikvMixOPShYLVcpL3osJD0oWi1GKS9LLFM9KC1YLVcpL3osUD0oLVotRikvSyx3PWkoMSwwLE4sJCksVT1pKE4sJCxTLFApO3JldHVybiBfPT09MCYmVT4wJiYoVS09biksXz09PTEmJlU8MCYmKFUrPW4pLFtWLEosdyxVXX0sYz1mdW5jdGlvbihEKXt2YXIgST1ELnB4LFI9RC5weSxCPUQuY3gsej1ELmN5LEs9RC5yeCxRPUQucnksXz1ELnhBeGlzUm90YXRpb24saj1fPT09dm9pZCAwPzA6XyxHPUQubGFyZ2VBcmNGbGFnLFg9Rz09PXZvaWQgMD8wOkcsWj1ELnN3ZWVwRmxhZyx0dD1aPT09dm9pZCAwPzA6WixudD1bXTtpZihLPT09MHx8UT09PTApcmV0dXJuW107dmFyIHE9TWF0aC5zaW4oaipuLzM2MCksZHQ9TWF0aC5jb3MoaipuLzM2MCksdXQ9ZHQqKEktQikvMitxKihSLXopLzIsVz0tcSooSS1CKS8yK2R0KihSLXopLzI7aWYodXQ9PT0wJiZXPT09MClyZXR1cm5bXTtLPU1hdGguYWJzKEspLFE9TWF0aC5hYnMoUSk7dmFyIEY9TWF0aC5wb3codXQsMikvTWF0aC5wb3coSywyKStNYXRoLnBvdyhXLDIpL01hdGgucG93KFEsMik7Rj4xJiYoSyo9TWF0aC5zcXJ0KEYpLFEqPU1hdGguc3FydChGKSk7dmFyIFY9byhJLFIsQix6LEssUSxYLHR0LHEsZHQsdXQsVyksSj1lKFYsNCksTj1KWzBdLCQ9SlsxXSxTPUpbMl0sUD1KWzNdLHc9TWF0aC5tYXgoTWF0aC5jZWlsKE1hdGguYWJzKFApLyhuLzQpKSwxKTtQLz13O2Zvcih2YXIgVT0wO1U8dztVKyspbnQucHVzaChzKFMsUCkpLFMrPVA7cmV0dXJuIG50Lm1hcChmdW5jdGlvbihIKXt2YXIgWT1hKEhbMF0sSyxRLGR0LHEsTiwkKSxrPVkueCxydD1ZLnksaXQ9YShIWzFdLEssUSxkdCxxLE4sJCksY3Q9aXQueCxodD1pdC55LGF0PWEoSFsyXSxLLFEsZHQscSxOLCQpLG90PWF0LngsZnQ9YXQueTtyZXR1cm57eDE6ayx5MTpydCx4MjpjdCx5MjpodCx4Om90LHk6ZnR9fSl9LG09e2E6NyxjOjYsaDoxLGw6MixtOjIscTo0LHM6NCx0OjIsdjoxLHo6MH0sdT0vKFthc3R2enFtaGxjXSkoW15hc3R2enFtaGxjXSopL2lnO2Z1bmN0aW9uIHAoTCl7dmFyIEQ9W107cmV0dXJuIEwucmVwbGFjZSh1LGZ1bmN0aW9uKEksUixCKXt2YXIgej1SLnRvTG93ZXJDYXNlKCk7Zm9yKEI9TyhCKSx6PT0ibSImJkIubGVuZ3RoPjImJihELnB1c2goW1JdLmNvbmNhdChCLnNwbGljZSgwLDIpKSksej0ibCIsUj1SPT0ibSI/ImwiOiJMIik7Oyl7aWYoQi5sZW5ndGg9PW1bel0pcmV0dXJuIEIudW5zaGlmdChSKSxELnB1c2goQik7aWYoQi5sZW5ndGg8bVt6XSl0aHJvdyBuZXcgRXJyb3IoIm1hbGZvcm1lZCBwYXRoIGRhdGEiKTtELnB1c2goW1JdLmNvbmNhdChCLnNwbGljZSgwLG1bel0pKSl9fSksRH12YXIgeT0vLT9bMC05XSpcLj9bMC05XSsoPzplWy0rXT9cZCspPy9pZztmdW5jdGlvbiBPKEwpe3ZhciBEPUwubWF0Y2goeSk7cmV0dXJuIEQ/RC5tYXAoTnVtYmVyKTpbXX1mdW5jdGlvbiB4KEwpe3ZhciBEPUxbMF1bMF0sST1MWzBdWzFdLFI9RCxCPUk7cmV0dXJuIEwuZm9yRWFjaChmdW5jdGlvbih6KXt2YXIgSz16WzBdLFE9elsyXSxfPXpbNF0saj16WzZdLEc9elsxXSxYPXpbM10sWj16WzVdLHR0PXpbN107RD1NYXRoLm1pbihELEssUSxfLGopLEk9TWF0aC5taW4oSSxHLFgsWix0dCksUj1NYXRoLm1heChSLEssUSxfLGopLEI9TWF0aC5tYXgoQixHLFgsWix0dCl9KSxbRCxJLFIsQl19ZnVuY3Rpb24gdihMLEQpe3JldHVybiBNYXRoLnNxcnQoTWF0aC5wb3coTFswXS1EWzBdLDIpK01hdGgucG93KExbMV0tRFsxXSwyKSkrTWF0aC5zcXJ0KE1hdGgucG93KExbMl0tRFsyXSwyKStNYXRoLnBvdyhMWzNdLURbM10sMikpfWZ1bmN0aW9uIFQoTCxEKXt2YXIgST1MWzBdLFI9TFsyXSxCPUxbNF0sej1MWzZdLEs9TFsxXSxRPUxbM10sXz1MWzVdLGo9TFs3XSxHPURbMF0sWD1EWzJdLFo9RFs0XSx0dD1EWzZdLG50PURbMV0scT1EWzNdLGR0PURbNV0sdXQ9RFs3XTtyZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KEctSSwyKStNYXRoLnBvdyhudC1LLDIpKStNYXRoLnNxcnQoTWF0aC5wb3coWC1SLDIpK01hdGgucG93KHEtUSwyKSkrTWF0aC5zcXJ0KE1hdGgucG93KFotQiwyKStNYXRoLnBvdyhkdC1fLDIpKStNYXRoLnNxcnQoTWF0aC5wb3codHQteiwyKStNYXRoLnBvdyh1dC1qLDIpKX1mdW5jdGlvbiBsKEwsRCl7dmFyIEk9ZihMLmxlbmd0aCksUj1bXTtJLmZvckVhY2goZnVuY3Rpb24oeil7dmFyIEs9MCxRPTA7ei5mb3JFYWNoKGZ1bmN0aW9uKF8pe0srPVQoTFtfXSxEW1ErK10pfSksUi5wdXNoKHtpbmRleDp6LGRpc3RhbmNlOkt9KX0pLFIuc29ydChmdW5jdGlvbih6LEspe3JldHVybiB6LmRpc3RhbmNlLUsuZGlzdGFuY2V9KTt2YXIgQj1bXTtyZXR1cm4gUlswXS5pbmRleC5mb3JFYWNoKGZ1bmN0aW9uKHope0IucHVzaChMW3pdKX0pLEJ9ZnVuY3Rpb24gaChMLEQpe3ZhciBJPWcoTC5sZW5ndGgpLFI9W107SS5mb3JFYWNoKGZ1bmN0aW9uKHope3ZhciBLPTA7ei5mb3JFYWNoKGZ1bmN0aW9uKFEpe0srPXYoeChMW1FdKSx4KERbUV0pKX0pLFIucHVzaCh7aW5kZXg6eixkaXN0YW5jZTpLfSl9KSxSLnNvcnQoZnVuY3Rpb24oeixLKXtyZXR1cm4gei5kaXN0YW5jZS1LLmRpc3RhbmNlfSk7dmFyIEI9W107cmV0dXJuIFJbMF0uaW5kZXguZm9yRWFjaChmdW5jdGlvbih6KXtCLnB1c2goTFt6XSl9KSxCfWZ1bmN0aW9uIGYoTCl7Zm9yKHZhciBEPVtdLEk9MDtJPEw7SSsrKXtmb3IodmFyIFI9W10sQj0wO0I8TDtCKyspe3ZhciB6PUIrSTt6PkwtMSYmKHotPUwpLFJbel09Qn1ELnB1c2goUil9cmV0dXJuIER9ZnVuY3Rpb24gZyhMKXtmb3IodmFyIEQ9W10sST0wO0k8TDtJKyspRC5wdXNoKEkpO3JldHVybiBNKEQpfWZ1bmN0aW9uIE0oTCl7dmFyIEQ9W10sST1bXTtmdW5jdGlvbiBSKEIpe3ZhciB6LEs7Zm9yKHo9MDt6PEIubGVuZ3RoO3orKylLPUIuc3BsaWNlKHosMSlbMF0sSS5wdXNoKEspLEIubGVuZ3RoPT0wJiZELnB1c2goSS5zbGljZSgpKSxSKEIpLEIuc3BsaWNlKHosMCxLKSxJLnBvcCgpO3JldHVybiBEfXJldHVybiBSKEwpfXZhciBBPXt9O0EucGFyc2VyPXAsQS5sZXJwQ3VydmU9ZnVuY3Rpb24oTCxELEkpe3JldHVybiBBLmxlcnBQb2ludHMoTFswXSxMWzFdLERbMF0sRFsxXSxJKS5jb25jYXQoQS5sZXJwUG9pbnRzKExbMl0sTFszXSxEWzJdLERbM10sSSkpLmNvbmNhdChBLmxlcnBQb2ludHMoTFs0XSxMWzVdLERbNF0sRFs1XSxJKSkuY29uY2F0KEEubGVycFBvaW50cyhMWzZdLExbN10sRFs2XSxEWzddLEkpKX0sQS5sZXJwUG9pbnRzPWZ1bmN0aW9uKEwsRCxJLFIsQil7cmV0dXJuW0wrKEktTCkqQixEKyhSLUQpKkJdfSxBLnEyYj1mdW5jdGlvbihMLEQsSSxSLEIseil7cmV0dXJuW0wsRCwoTCsyKkkpLzMsKEQrMipSKS8zLChCKzIqSSkvMywoeisyKlIpLzMsQix6XX0sQS5wYXRoMnNoYXBlcz1mdW5jdGlvbihMKXtmb3IodmFyIEQ9QS5wYXJzZXIoTCksST0wLFI9MCxCPTAsej1ELmxlbmd0aCxLPVtdLFE9bnVsbCxfPXZvaWQgMCxqPXZvaWQgMCxHPXZvaWQgMCxYPXZvaWQgMCxaPXZvaWQgMCx0dD12b2lkIDAsbnQ9dm9pZCAwO0I8ejtCKyspe3ZhciBxPURbQl0sZHQ9cVswXSx1dD1EW0ItMV07c3dpdGNoKGR0KXtjYXNlIm0iOlo9Sy5sZW5ndGgsS1taXT1bXSxRPUtbWl0sST1JK3FbMV0sUj1SK3FbMl07YnJlYWs7Y2FzZSJNIjpaPUsubGVuZ3RoLEtbWl09W10sUT1LW1pdLEk9cVsxXSxSPXFbMl07YnJlYWs7Y2FzZSJsIjpRLnB1c2goW0ksUixJLFIsSSxSLEkrcVsxXSxSK3FbMl1dKSxJKz1xWzFdLFIrPXFbMl07YnJlYWs7Y2FzZSJMIjpRLnB1c2goW0ksUixxWzFdLHFbMl0scVsxXSxxWzJdLHFbMV0scVsyXV0pLEk9cVsxXSxSPXFbMl07YnJlYWs7Y2FzZSJoIjpRLnB1c2goW0ksUixJLFIsSSxSLEkrcVsxXSxSXSksSSs9cVsxXTticmVhaztjYXNlIkgiOlEucHVzaChbSSxSLHFbMV0sUixxWzFdLFIscVsxXSxSXSksST1xWzFdO2JyZWFrO2Nhc2UidiI6US5wdXNoKFtJLFIsSSxSLEksUixJLFIrcVsxXV0pLFIrPXFbMV07YnJlYWs7Y2FzZSJWIjpRLnB1c2goW0ksUixJLHFbMV0sSSxxWzFdLEkscVsxXV0pLFI9cVsxXTticmVhaztjYXNlIkMiOlEucHVzaChbSSxSLHFbMV0scVsyXSxxWzNdLHFbNF0scVs1XSxxWzZdXSksST1xWzVdLFI9cVs2XTticmVhaztjYXNlIlMiOnV0WzBdPT09IkMifHx1dFswXT09PSJjIj9RLnB1c2goW0ksUixJK3V0WzVdLXV0WzNdLFIrdXRbNl0tdXRbNF0scVsxXSxxWzJdLHFbM10scVs0XV0pOih1dFswXT09PSJTInx8dXRbMF09PT0icyIpJiZRLnB1c2goW0ksUixJK3V0WzNdLXV0WzFdLFIrdXRbNF0tdXRbMl0scVsxXSxxWzJdLHFbM10scVs0XV0pLEk9cVszXSxSPXFbNF07YnJlYWs7Y2FzZSJjIjpRLnB1c2goW0ksUixJK3FbMV0sUitxWzJdLEkrcVszXSxSK3FbNF0sSStxWzVdLFIrcVs2XV0pLEk9SStxWzVdLFI9UitxWzZdO2JyZWFrO2Nhc2UicyI6dXRbMF09PT0iQyJ8fHV0WzBdPT09ImMiP1EucHVzaChbSSxSLEkrdXRbNV0tdXRbM10sUit1dFs2XS11dFs0XSxJK3FbMV0sUitxWzJdLEkrcVszXSxSK3FbNF1dKToodXRbMF09PT0iUyJ8fHV0WzBdPT09InMiKSYmUS5wdXNoKFtJLFIsSSt1dFszXS11dFsxXSxSK3V0WzRdLXV0WzJdLEkrcVsxXSxSK3FbMl0sSStxWzNdLFIrcVs0XV0pLEk9SStxWzNdLFI9UitxWzRdO2JyZWFrO2Nhc2UiYSI6dHQ9Yyh7cng6cVsxXSxyeTpxWzJdLHB4OkkscHk6Uix4QXhpc1JvdGF0aW9uOnFbM10sbGFyZ2VBcmNGbGFnOnFbNF0sc3dlZXBGbGFnOnFbNV0sY3g6SStxWzZdLGN5OlIrcVs3XX0pLG50PXR0W3R0Lmxlbmd0aC0xXSx0dC5mb3JFYWNoKGZ1bmN0aW9uKFcsRil7Rj09PTA/US5wdXNoKFtJLFIsVy54MSxXLnkxLFcueDIsVy55MixXLngsVy55XSk6US5wdXNoKFt0dFtGLTFdLngsdHRbRi0xXS55LFcueDEsVy55MSxXLngyLFcueTIsVy54LFcueV0pfSksST1udC54LFI9bnQueTticmVhaztjYXNlIkEiOnR0PWMoe3J4OnFbMV0scnk6cVsyXSxweDpJLHB5OlIseEF4aXNSb3RhdGlvbjpxWzNdLGxhcmdlQXJjRmxhZzpxWzRdLHN3ZWVwRmxhZzpxWzVdLGN4OnFbNl0sY3k6cVs3XX0pLG50PXR0W3R0Lmxlbmd0aC0xXSx0dC5mb3JFYWNoKGZ1bmN0aW9uKFcsRil7Rj09PTA/US5wdXNoKFtJLFIsVy54MSxXLnkxLFcueDIsVy55MixXLngsVy55XSk6US5wdXNoKFt0dFtGLTFdLngsdHRbRi0xXS55LFcueDEsVy55MSxXLngyLFcueTIsVy54LFcueV0pfSksST1udC54LFI9bnQueTticmVhaztjYXNlIlEiOlEucHVzaChBLnEyYihJLFIscVsxXSxxWzJdLHFbM10scVs0XSkpLEk9cVszXSxSPXFbNF07YnJlYWs7Y2FzZSJxIjpRLnB1c2goQS5xMmIoSSxSLEkrcVsxXSxSK3FbMl0scVszXStJLHFbNF0rUikpLEkrPXFbM10sUis9cVs0XTticmVhaztjYXNlIlQiOnV0WzBdPT09IlEifHx1dFswXT09PSJxIj8oRz1JK3V0WzNdLXV0WzFdLFg9Uit1dFs0XS11dFsyXSxRLnB1c2goQS5xMmIoSSxSLEcsWCxxWzFdLHFbMl0pKSk6KHV0WzBdPT09IlQifHx1dFswXT09PSJ0IikmJihRLnB1c2goQS5xMmIoSSxSLEkrSS1HLFIrUi1YLHFbMV0scVsyXSkpLEc9SStJLUcsWD1SK1ItWCksST1xWzFdLFI9cVsyXTticmVhaztjYXNlInQiOnV0WzBdPT09IlEifHx1dFswXT09PSJxIj8oRz1JK3V0WzNdLXV0WzFdLFg9Uit1dFs0XS11dFsyXSxRLnB1c2goQS5xMmIoSSxSLEcsWCxJK3FbMV0sUitxWzJdKSkpOih1dFswXT09PSJUInx8dXRbMF09PT0idCIpJiYoUS5wdXNoKEEucTJiKEksUixJK0ktRyxSK1ItWCxJK3FbMV0sUitxWzJdKSksRz1JK0ktRyxYPVIrUi1YKSxJKz1xWzFdLFIrPXFbMl07YnJlYWs7Y2FzZSJaIjpfPVFbMF1bMF0saj1RWzBdWzFdLFEucHVzaChbSSxSLF8saixfLGosXyxqXSk7YnJlYWs7Y2FzZSJ6IjpfPVFbMF1bMF0saj1RWzBdWzFdLFEucHVzaChbSSxSLF8saixfLGosXyxqXSk7YnJlYWt9fXJldHVybiBLfSxBLl91cEN1cnZlcz1mdW5jdGlvbihMLEQpe2Zvcih2YXIgST0wLFI9MCxCPUwubGVuZ3RoO0k8RDtJKyspTC5wdXNoKExbUl0uc2xpY2UoMCkpLFIrKyxSPkItMSYmKFItPUIpfTtmdW5jdGlvbiBDKEwsRCxJLFIsQix6LEssUSxfKXtyZXR1cm57bGVmdDpiKEwsRCxJLFIsQix6LEssUSxfKSxyaWdodDpiKEssUSxCLHosSSxSLEwsRCwxLV8sITApfX1mdW5jdGlvbiBiKEwsRCxJLFIsQix6LEssUSxfLGope3ZhciBHPShJLUwpKl8rTCxYPShSLUQpKl8rRCxaPShCLUkpKl8rSSx0dD0oei1SKSpfK1IsbnQ9KEstQikqXytCLHE9KFEteikqXyt6LGR0PShaLUcpKl8rRyx1dD0odHQtWCkqXytYLFc9KG50LVopKl8rWixGPShxLXR0KSpfK3R0LFY9KFctZHQpKl8rZHQsSj0oRi11dCkqXyt1dDtyZXR1cm4gaj9bVixKLGR0LHV0LEcsWCxMLERdOltMLEQsRyxYLGR0LHV0LFYsSl19QS5fc3BsaXRDdXJ2ZXM9ZnVuY3Rpb24oTCxEKXtmb3IodmFyIEk9MCxSPTA7STxEO0krKyl7dmFyIEI9TFtSXSx6PUMoQlswXSxCWzFdLEJbMl0sQlszXSxCWzRdLEJbNV0sQls2XSxCWzddLC41KTtMLnNwbGljZShSLDEpLEwuc3BsaWNlKFIsMCx6LmxlZnQsei5yaWdodCksUis9MixSPj1MLmxlbmd0aC0xJiYoUj0wKX19O2Z1bmN0aW9uIEUoTCxEKXtmb3IodmFyIEk9ZnVuY3Rpb24oeil7dmFyIEs9TFtMLmxlbmd0aC0xXSxRPVtdO0suZm9yRWFjaChmdW5jdGlvbihfKXtRLnB1c2goXy5zbGljZSgwKSl9KSxMLnB1c2goUSl9LFI9MDtSPEQ7UisrKUkoKX1yZXR1cm4gQS5sZXJwPWZ1bmN0aW9uKEwsRCxJKXtyZXR1cm4gQS5fbGVycChBLnBhdGgyc2hhcGVzKEwpLEEucGF0aDJzaGFwZXMoRCksSSl9LEEuTUlNX0NVUlZFU19DT1VOVD0xMDAsQS5fcHJlcHJvY2Vzc2luZz1mdW5jdGlvbihMLEQpe3ZhciBJPUwubGVuZ3RoLFI9RC5sZW5ndGgsQj1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEwpKSx6PUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoRCkpO3JldHVybiBJPlI/RSh6LEktUik6STxSJiZFKEIsUi1JKSxCPWgoQix6KSxCLmZvckVhY2goZnVuY3Rpb24oSyxRKXt2YXIgXz1LLmxlbmd0aCxqPXpbUV0ubGVuZ3RoO18+aj9fPEEuTUlNX0NVUlZFU19DT1VOVD8oQS5fc3BsaXRDdXJ2ZXMoSyxBLk1JTV9DVVJWRVNfQ09VTlQtXyksQS5fc3BsaXRDdXJ2ZXMoeltRXSxBLk1JTV9DVVJWRVNfQ09VTlQtaikpOkEuX3NwbGl0Q3VydmVzKHpbUV0sXy1qKTpfPGomJihqPEEuTUlNX0NVUlZFU19DT1VOVD8oQS5fc3BsaXRDdXJ2ZXMoSyxBLk1JTV9DVVJWRVNfQ09VTlQtXyksQS5fc3BsaXRDdXJ2ZXMoeltRXSxBLk1JTV9DVVJWRVNfQ09VTlQtaikpOkEuX3NwbGl0Q3VydmVzKEssai1fKSl9KSxCLmZvckVhY2goZnVuY3Rpb24oSyxRKXtCW1FdPWwoSyx6W1FdKX0pLFtCLHpdfSxBLl9sZXJwPWZ1bmN0aW9uKEwsRCxJKXt2YXIgUj1bXTtyZXR1cm4gTC5mb3JFYWNoKGZ1bmN0aW9uKEIseil7dmFyIEs9W107Qi5mb3JFYWNoKGZ1bmN0aW9uKFEsXyl7Sy5wdXNoKEEubGVycEN1cnZlKFEsRFt6XVtfXSxJKSl9KSxSLnB1c2goSyl9KSxSfSxBLmFuaW1hdGU9ZnVuY3Rpb24oTCl7dmFyIEQ9QS5wYXRoMnNoYXBlcyhMLmZyb20pLEk9QS5wYXRoMnNoYXBlcyhMLnRvKSxSPUEuX3ByZXByb2Nlc3NpbmcoRCxJKSxCPW5ldyBEYXRlLHo9TC5lbmR8fGZ1bmN0aW9uKCl7fSxLPUwucHJvZ3Jlc3N8fGZ1bmN0aW9uKCl7fSxRPUwuYmVnaW58fGZ1bmN0aW9uKCl7fSxfPUwuZWFzaW5nfHxmdW5jdGlvbih0dCl7cmV0dXJuIHR0fSxqPW51bGwsRz1udWxsLFg9TC50aW1lO1EoRCk7dmFyIFo9ZnVuY3Rpb24gdHQoKXt2YXIgbnQ9bmV3IERhdGUtQjtpZihudD49WCl7Rz1JLEsoRywxKSx6KEcpLGNhbmNlbEFuaW1hdGlvbkZyYW1lKGopO3JldHVybn12YXIgcT1fKG50L1gpO0c9QS5fbGVycChSWzBdLFJbMV0scSksSyhHLHEpLGo9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHR0KX07WigpfSxBfSl9LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImRlZmF1bHQiLGZ1bmN0aW9uKCl7cmV0dXJuIGN9KTt2YXIgZT10KDcxKSxuPXQoMjIxKSxhPXQoNzIpO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtjb25zdCBzPVN5bWJvbC5mb3IoInNwcml0ZWpzX3NldEF0dHJpYnV0ZURlZmF1bHQiKSxpPVN5bWJvbC5mb3IoInNwcml0ZWpzX3NldEF0dHJpYnV0ZSIpLG89U3ltYm9sLmZvcigic3ByaXRlanNfZ2V0QXR0cmlidXRlIik7Y2xhc3MgYyBleHRlbmRzIGUuZGVmYXVsdHtjb25zdHJ1Y3Rvcih1KXtzdXBlcih1KSx0aGlzW3NdKHtkOiIiLG5vcm1hbGl6ZTohMSxmaWxsQ29sb3I6dm9pZCAwLGZpbGxSdWxlOiJub256ZXJvIixzdHJva2VDb2xvcjp2b2lkIDAsbGluZVdpZHRoOjEsbGluZUpvaW46Im1pdGVyIixsaW5lQ2FwOiJidXR0Iixyb3VuZFNlZ21lbnRzOjIwLGxpbmVEYXNoOnZvaWQgMCxsaW5lRGFzaE9mZnNldDowLG1pdGVyTGltaXQ6MTAsdGV4dHVyZTp2b2lkIDAsdGV4dHVyZVJlY3Q6dm9pZCAwLHRleHR1cmVSZXBlYXQ6ITEsc291cmNlUmVjdDp2b2lkIDAsY2xpcFBhdGg6dm9pZCAwfSl9Z2V0IGQoKXtyZXR1cm4gdGhpc1tvXSgiZCIpfXNldCBkKHUpe3RoaXNbaV0oImQiLHUpfWdldCBub3JtYWxpemUoKXtyZXR1cm4gdGhpc1tvXSgibm9ybWFsaXplIil9c2V0IG5vcm1hbGl6ZSh1KXt0aGlzW2ldKCJub3JtYWxpemUiLCEhdSl9Z2V0IGZpbGxDb2xvcigpe3JldHVybiB0aGlzW29dKCJmaWxsQ29sb3IiKX1zZXQgZmlsbENvbG9yKHUpe3RoaXNbaV0oImZpbGxDb2xvciIsT2JqZWN0KG4ucGFyc2VDb2xvcikodSkpfWdldCBmaWxsUnVsZSgpe3JldHVybiB0aGlzW29dKCJmaWxsUnVsZSIpfXNldCBmaWxsUnVsZSh1KXtpZih1IT1udWxsJiZ1IT09Im5vbnplcm8iJiZ1IT09ImV2ZW5vZGQiKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgZmlsbCBydWxlLiIpO3RoaXNbaV0oImZpbGxSdWxlIix1KX1nZXQgc3Ryb2tlQ29sb3IoKXtyZXR1cm4gdGhpc1tvXSgic3Ryb2tlQ29sb3IiKX1zZXQgc3Ryb2tlQ29sb3IodSl7dGhpc1tpXSgic3Ryb2tlQ29sb3IiLE9iamVjdChuLnBhcnNlQ29sb3IpKHUpKX1nZXQgbGluZVdpZHRoKCl7cmV0dXJuIHRoaXNbb10oImxpbmVXaWR0aCIpfXNldCBsaW5lV2lkdGgodSl7dGhpc1tpXSgibGluZVdpZHRoIixPYmplY3QoYS50b051bWJlcikodSkpfWdldCBsaW5lSm9pbigpe3JldHVybiB0aGlzW29dKCJsaW5lSm9pbiIpfXNldCBsaW5lSm9pbih1KXtpZih1IT1udWxsJiZ1IT09Im1pdGVyIiYmdSE9PSJiZXZlbCImJnUhPT0icm91bmQiKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgbGluZUpvaW4gdHlwZS4iKTt0aGlzW2ldKCJsaW5lSm9pbiIsdSl9Z2V0IGxpbmVDYXAoKXtyZXR1cm4gdGhpc1tvXSgibGluZUNhcCIpfXNldCBsaW5lQ2FwKHUpe2lmKHUhPW51bGwmJnUhPT0iYnV0dCImJnUhPT0ic3F1YXJlIiYmdSE9PSJyb3VuZCIpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBsaW5lQ2FwIHR5cGUuIik7dGhpc1tpXSgibGluZUNhcCIsdSl9Z2V0IGxpbmVEYXNoKCl7cmV0dXJuIHRoaXNbb10oImxpbmVEYXNoIil9c2V0IGxpbmVEYXNoKHUpe3U9T2JqZWN0KGEudG9BcnJheSkodSwhMCksdSE9bnVsbCYmIUFycmF5LmlzQXJyYXkodSkmJih1PVt1XSksdGhpc1tpXSgibGluZURhc2giLHU/dS5tYXAoYS50b051bWJlcik6bnVsbCl9Z2V0IGxpbmVEYXNoT2Zmc2V0KCl7cmV0dXJuIHRoaXNbb10oImxpbmVEYXNoT2Zmc2V0Iil9c2V0IGxpbmVEYXNoT2Zmc2V0KHUpe3RoaXNbaV0oImxpbmVEYXNoT2Zmc2V0IixPYmplY3QoYS50b051bWJlcikodSkpfWdldCBtaXRlckxpbWl0KCl7cmV0dXJuIHRoaXNbb10oIm1pdGVyTGltaXQiKX1zZXQgbWl0ZXJMaW1pdCh1KXt0aGlzW2ldKCJtaXRlckxpbWl0IixPYmplY3QoYS50b051bWJlcikodSkpfWdldCByb3VuZFNlZ21lbnRzKCl7cmV0dXJuIHRoaXNbb10oInJvdW5kU2VnbWVudHMiKX1zZXQgcm91bmRTZWdtZW50cyh1KXt0aGlzW2ldKCJyb3VuZFNlZ21lbnRzIix1KX1nZXQgdGV4dHVyZSgpe3JldHVybiB0aGlzW29dKCJ0ZXh0dXJlIil9c2V0IHRleHR1cmUodSl7dGhpc1tpXSgidGV4dHVyZSIsdSl9Z2V0IHRleHR1cmVSZWN0KCl7cmV0dXJuIHRoaXNbb10oInRleHR1cmVSZWN0Iil9c2V0IHRleHR1cmVSZWN0KHUpe3RoaXNbaV0oInRleHR1cmVSZWN0Iix1KX1nZXQgc291cmNlUmVjdCgpe3JldHVybiB0aGlzW29dKCJzb3VyY2VSZWN0Iil9c2V0IHNvdXJjZVJlY3QodSl7dGhpc1tpXSgic291cmNlUmVjdCIsdSl9Z2V0IHRleHR1cmVSZXBlYXQoKXtyZXR1cm4gdGhpc1tvXSgidGV4dHVyZVJlcGVhdCIpfXNldCB0ZXh0dXJlUmVwZWF0KHUpe3RoaXNbaV0oInRleHR1cmVSZXBlYXQiLCEhdSl9Z2V0IGNsaXBQYXRoKCl7cmV0dXJuIHRoaXNbb10oImNsaXBQYXRoIil9c2V0IGNsaXBQYXRoKHUpe3RoaXNbaV0oImNsaXBQYXRoIix1KX19fSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJkZWZhdWx0IixmdW5jdGlvbigpe3JldHVybiBpfSk7dmFyIGU9dCgyMjYpLG49dCgyMTMpLGE9dCgyMzApO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtmdW5jdGlvbiBzKG8sYyxtKXtyZXR1cm4gYyBpbiBvP09iamVjdC5kZWZpbmVQcm9wZXJ0eShvLGMse3ZhbHVlOm0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTpvW2NdPW0sb31jbGFzcyBpIGV4dGVuZHMgZS5kZWZhdWx0e2dldCBpc1Zpc2libGUoKXtjb25zdHt3aWR0aDpjLGhlaWdodDptfT10aGlzLmF0dHJpYnV0ZXM7cmV0dXJuIGM+MCYmbT4wJiZzdXBlci5pc1Zpc2libGV9fXMoaSwiQXR0ciIsYS5kZWZhdWx0KSxuLmRlZmF1bHQucmVnaXN0ZXJOb2RlKGksInJlY3QiKX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gbX0pO3ZhciBlPXQoMjI4KSxuPXQoNzIpO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtjb25zdCBhPVN5bWJvbC5mb3IoInNwcml0ZWpzX3NldEF0dHJpYnV0ZURlZmF1bHQiKSxzPVN5bWJvbC5mb3IoInNwcml0ZWpzX3NldEF0dHJpYnV0ZSIpLGk9U3ltYm9sLmZvcigic3ByaXRlanNfZ2V0QXR0cmlidXRlIiksbz1TeW1ib2wuZm9yKCJzcHJpdGVqc19kZWNsYXJlQWxpYXMiKTtmdW5jdGlvbiBjKHUpe2NvbnN0e3dpZHRoOnAsaGVpZ2h0Onl9PXU7cmV0dXJuYE0wIDBMJHtwfSAwTCR7cH0gJHt5fUwwICR7eX1aYH1jbGFzcyBtIGV4dGVuZHMgZS5kZWZhdWx0e2NvbnN0cnVjdG9yKHApe3N1cGVyKHApLHRoaXNbYV0oe3dpZHRoOjAsaGVpZ2h0OjB9KSx0aGlzW29dKCJzaXplIil9Z2V0IGQoKXtyZXR1cm4gdGhpc1tpXSgiZCIpfXNldCBkKHApe31nZXQgd2lkdGgoKXtyZXR1cm4gdGhpc1tpXSgid2lkdGgiKX1zZXQgd2lkdGgocCl7aWYocD1PYmplY3Qobi50b051bWJlcikocCksdGhpc1tzXSgid2lkdGgiLHApKXtjb25zdCB5PWModGhpcyk7dGhpc1tzXSgiZCIseSl9fWdldCBoZWlnaHQoKXtyZXR1cm4gdGhpc1tpXSgiaGVpZ2h0Iil9c2V0IGhlaWdodChwKXtpZihwPU9iamVjdChuLnRvTnVtYmVyKShwKSx0aGlzW3NdKCJoZWlnaHQiLHApKXtjb25zdCB5PWModGhpcyk7dGhpc1tzXSgiZCIseSl9fWdldCBzaXplKCl7cmV0dXJuW3RoaXMud2lkdGgsdGhpcy5oZWlnaHRdfXNldCBzaXplKHApe3A9T2JqZWN0KG4udG9BcnJheSkocCksQXJyYXkuaXNBcnJheShwKXx8KHA9W3AscF0pLHRoaXMud2lkdGg9cFswXSx0aGlzLmhlaWdodD1wWzFdfX19LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImRlZmF1bHQiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KTt2YXIgZT10KDIzMiksbj10KDIxMyksYT10KDIzNSk7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2Z1bmN0aW9uIHMobyxjLG0pe3JldHVybiBjIGluIG8/T2JqZWN0LmRlZmluZVByb3BlcnR5KG8sYyx7dmFsdWU6bSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOm9bY109bSxvfWNsYXNzIGkgZXh0ZW5kcyBlLmRlZmF1bHR7Z2V0IGlzVmlzaWJsZSgpe2NvbnN0e3NpZGVzOmN9PXRoaXMuYXR0cmlidXRlcztyZXR1cm4gY1swXT4wJiZjWzFdPjAmJnN1cGVyLmlzVmlzaWJsZX19cyhpLCJBdHRyIixhLmRlZmF1bHQpLG4uZGVmYXVsdC5yZWdpc3Rlck5vZGUoaSwidHJpYW5nbGUiKX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pO3ZhciBlPXQoMjI2KSxuPXQoMjEzKSxhPXQoMjMzKTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7ZnVuY3Rpb24gcyhvLGMsbSl7cmV0dXJuIGMgaW4gbz9PYmplY3QuZGVmaW5lUHJvcGVydHkobyxjLHt2YWx1ZTptLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6b1tjXT1tLG99Y2xhc3MgaSBleHRlbmRzIGUuZGVmYXVsdHtnZXQgaXNWaXNpYmxlKCl7Y29uc3R7cG9pbnRzOmN9PXRoaXMuYXR0cmlidXRlcztyZXR1cm4gYy5sZW5ndGg+MCYmc3VwZXIuaXNWaXNpYmxlfX1zKGksIkF0dHIiLGEuZGVmYXVsdCksbi5kZWZhdWx0LnJlZ2lzdGVyTm9kZShpLCJwb2x5bGluZSIpfSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJkZWZhdWx0IixmdW5jdGlvbigpe3JldHVybiB1fSk7dmFyIGU9dCgyMjgpLG49dCg3MiksYT10KDIzNCk7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2NvbnN0IHM9U3ltYm9sLmZvcigic3ByaXRlanNfc2V0QXR0cmlidXRlRGVmYXVsdCIpLGk9U3ltYm9sLmZvcigic3ByaXRlanNfc2V0QXR0cmlidXRlIiksbz1TeW1ib2wuZm9yKCJzcHJpdGVqc19nZXRBdHRyaWJ1dGUiKSxjPVN5bWJvbC5mb3IoInNwcml0ZWpzX2RlY2xhcmVBbGlhcyIpO2Z1bmN0aW9uIG0ocCl7Y29uc3R7cG9pbnRzOnksc21vb3RoOk8sc21vb3RoUmFuZ2U6eCxjbG9zZTp2fT1wLFQ9W107Zm9yKGxldCBoPTA7aDx5Lmxlbmd0aDtoKz0yKVQucHVzaChbeVtoXSx5W2grMV1dKTtsZXQgbD0iIjtyZXR1cm4gTz9sPU9iamVjdChhLm1ha2VTbW9vdGhDdXJ2ZUxpbmUpKFQseCk6VC5sZW5ndGgmJihsPWBNJHtULm1hcChoPT5oLmpvaW4oIiAiKSkuam9pbigiTCIpfWApLGwmJnYmJihsKz0iWiIpLGx9Y2xhc3MgdSBleHRlbmRzIGUuZGVmYXVsdHtjb25zdHJ1Y3Rvcih5KXtzdXBlcih5KSx0aGlzW3NdKHtwb2ludHM6W10sc21vb3RoOiExLHNtb290aFJhbmdlOlswXSxjbG9zZVR5cGU6Im5vbmUifSksdGhpc1tjXSgiY2xvc2UiKX1nZXQgZCgpe3JldHVybiB0aGlzW29dKCJkIil9c2V0IGQoeSl7fWdldCBjbG9zZSgpe3JldHVybiB0aGlzLmNsb3NlVHlwZSE9PSJub25lIn1zZXQgY2xvc2UoeSl7eT15PyJub3JtYWwiOiJub25lIix0aGlzLmNsb3NlVHlwZT15fWdldCBjbG9zZVR5cGUoKXtyZXR1cm4gdGhpc1tvXSgiY2xvc2VUeXBlIil9c2V0IGNsb3NlVHlwZSh5KXtpZih5IT1udWxsJiZ5IT09Im5vbmUiJiZ5IT09Im5vcm1hbCIpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBjbG9zZVR5cGUgdHlwZS4iKTtpZih0aGlzW2ldKCJjbG9zZVR5cGUiLHkpKXtjb25zdCBPPW0odGhpcyk7dGhpc1tpXSgiZCIsTyl9fWdldCBzbW9vdGgoKXtyZXR1cm4gdGhpc1tvXSgic21vb3RoIil9c2V0IHNtb290aCh5KXtpZih0aGlzW2ldKCJzbW9vdGgiLHkpKXtjb25zdCBPPW0odGhpcyk7dGhpc1tpXSgiZCIsTyl9fWdldCBzbW9vdGhSYW5nZSgpe3JldHVybiB0aGlzW29dKCJzbW9vdGhSYW5nZSIpfXNldCBzbW9vdGhSYW5nZSh5KXtpZih5JiYhQXJyYXkuaXNBcnJheSh5KSYmKHk9W3ldKSx0aGlzW2ldKCJzbW9vdGhSYW5nZSIseSkmJnRoaXMuc21vb3RoKXtjb25zdCBPPW0odGhpcyk7dGhpc1tpXSgiZCIsTyl9fWdldCBwb2ludHMoKXtyZXR1cm4gdGhpc1tvXSgicG9pbnRzIil9c2V0IHBvaW50cyh5KXtpZih5PU9iamVjdChuLnRvQXJyYXkpKHkpLEFycmF5LmlzQXJyYXkoeSkmJih5PXkucmVkdWNlKChPLHgpPT5BcnJheS5pc0FycmF5KHgpP1suLi5PLC4uLngubWFwKHY9Pk9iamVjdChuLnRvTnVtYmVyKSh2KSldOlsuLi5PLE9iamVjdChuLnRvTnVtYmVyKSh4KV0sW10pKSx0aGlzW2ldKCJwb2ludHMiLHkpKXtjb25zdCBPPW0odGhpcyk7dGhpc1tpXSgiZCIsTyl9fX19LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsIm1ha2VTbW9vdGhDdXJ2ZUxpbmUiLGZ1bmN0aW9uKCl7cmV0dXJuIGV9KSx0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7ZnVuY3Rpb24gZShuLGE9WzBdKXtmdW5jdGlvbiBzKGMsbT0uMTY4LHU9LjE2OCl7bGV0IHAseSxPLHg7aWYoKG5bY10ueD09PW5bYysxXS54fHxuW2NdLnk9PT1uW2MrMV0ueSkmJihtPTAsdT0wKSxjPDE/KHA9blswXS54KyhuWzFdLngtblswXS54KSptLHk9blswXS55KyhuWzFdLnktblswXS55KSptKToocD1uW2NdLngrKG5bYysxXS54LW5bYy0xXS54KSptLHk9bltjXS55KyhuW2MrMV0ueS1uW2MtMV0ueSkqbSksYz5uLmxlbmd0aC0zKXtjb25zdCB2PW4ubGVuZ3RoLTE7Tz1uW3ZdLngtKG5bdl0ueC1uW3YtMV0ueCkqdSx4PW5bdl0ueS0oblt2XS55LW5bdi0xXS55KSp1fWVsc2UgTz1uW2MrMV0ueC0obltjKzJdLngtbltjXS54KSp1LHg9bltjKzFdLnktKG5bYysyXS55LW5bY10ueSkqdTtyZXR1cm5be3g6cCx5fSx7eDpPLHk6eH1dfW49bi5tYXAoKFtjLG1dKT0+KHt4OmMseTptfSkpO2xldCBpPSIiLG89MDtyZXR1cm4gbi5mb3JFYWNoKChjLG0pPT57aWYobT09PTApaSs9YE0ke2MueH0gJHtjLnl9YDtlbHNle2Zvcig7bT5hW29dOylvKys7aWYobyUyKXtjb25zdFt1LHBdPXMobS0xKTtpKz1gQyR7W3UueCx1LnkscC54LHAueSxjLngsYy55XS5qb2luKCIgIil9YH1lbHNlIGkrPWBMJHtjLnh9ICR7Yy55fWB9fSksaX19LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImRlZmF1bHQiLGZ1bmN0aW9uKCl7cmV0dXJuIGN9KTt2YXIgZT10KDIzMyksbj10KDcyKTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7Y29uc3QgYT1TeW1ib2wuZm9yKCJzcHJpdGVqc19zZXRBdHRyaWJ1dGVEZWZhdWx0Iikscz1TeW1ib2wuZm9yKCJzcHJpdGVqc19zZXRBdHRyaWJ1dGUiKSxpPVN5bWJvbC5mb3IoInNwcml0ZWpzX2dldEF0dHJpYnV0ZSIpO2Z1bmN0aW9uIG8obSl7Y29uc3RbdSxwXT1tLnNpZGVzO2xldCB5PW0uYW5nbGUlMzYwO3JldHVybiB5PDAmJih5Kz0zNjApLHk9TWF0aC5QSSp5LzE4MCxbMCwwLHUsMCxwKk1hdGguY29zKHkpLHAqTWF0aC5zaW4oeSldfWNsYXNzIGMgZXh0ZW5kcyBlLmRlZmF1bHR7Y29uc3RydWN0b3IodSl7c3VwZXIodSksdGhpc1thXSh7c2lkZXM6WzAsMF0sYW5nbGU6NjAsY2xvc2VUeXBlOiJub3JtYWwifSl9Z2V0IHBvaW50cygpe3JldHVybiBzdXBlci5wb2ludHN9c2V0IHBvaW50cyh1KXt9Z2V0IHNpZGVzKCl7cmV0dXJuIHRoaXNbaV0oInNpZGVzIil9c2V0IHNpZGVzKHUpe2lmKHU9T2JqZWN0KG4udG9BcnJheSkodSwhMCksdSE9bnVsbCYmIUFycmF5LmlzQXJyYXkodSkmJih1PVt1LHVdKSx0aGlzW3NdKCJzaWRlcyIsdSkpe2NvbnN0IHA9byh0aGlzKTtzdXBlci5wb2ludHM9cH19Z2V0IGFuZ2xlKCl7cmV0dXJuIHRoaXNbaV0oImFuZ2xlIil9c2V0IGFuZ2xlKHUpe2lmKHU9T2JqZWN0KG4udG9OdW1iZXIpKHUpLHRoaXNbc10oImFuZ2xlIix1KSl7Y29uc3QgcD1vKHRoaXMpO3N1cGVyLnBvaW50cz1wfX19fSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJkZWZhdWx0IixmdW5jdGlvbigpe3JldHVybiBpfSk7dmFyIGU9dCgyMzIpLG49dCgyMTMpLGE9dCgyMzcpO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtmdW5jdGlvbiBzKG8sYyxtKXtyZXR1cm4gYyBpbiBvP09iamVjdC5kZWZpbmVQcm9wZXJ0eShvLGMse3ZhbHVlOm0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTpvW2NdPW0sb31jbGFzcyBpIGV4dGVuZHMgZS5kZWZhdWx0e2dldCBpc1Zpc2libGUoKXtjb25zdHtzaWRlczpjfT10aGlzLmF0dHJpYnV0ZXM7cmV0dXJuIGNbMF0+MCYmY1sxXT4wJiZzdXBlci5pc1Zpc2libGV9fXMoaSwiQXR0ciIsYS5kZWZhdWx0KSxuLmRlZmF1bHQucmVnaXN0ZXJOb2RlKGksInBhcmFsbGVsIil9LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImRlZmF1bHQiLGZ1bmN0aW9uKCl7cmV0dXJuIGN9KTt2YXIgZT10KDIzMyksbj10KDcyKTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7Y29uc3QgYT1TeW1ib2wuZm9yKCJzcHJpdGVqc19zZXRBdHRyaWJ1dGVEZWZhdWx0Iikscz1TeW1ib2wuZm9yKCJzcHJpdGVqc19zZXRBdHRyaWJ1dGUiKSxpPVN5bWJvbC5mb3IoInNwcml0ZWpzX2dldEF0dHJpYnV0ZSIpO2Z1bmN0aW9uIG8obSl7Y29uc3RbdSxwXT1tLnNpZGVzO2xldCB5PW0uYW5nbGUlMzYwO3k8MCYmKHkrPTM2MCkseT1NYXRoLlBJKnkvMTgwO2NvbnN0IE89cCpNYXRoLmNvcyh5KSx4PXAqTWF0aC5zaW4oeSk7cmV0dXJuWzAsMCx1LDAsTyt1LHgsTyx4XX1jbGFzcyBjIGV4dGVuZHMgZS5kZWZhdWx0e2NvbnN0cnVjdG9yKHUpe3N1cGVyKHUpLHRoaXNbYV0oe3NpZGVzOlswLDBdLGFuZ2xlOjkwLGNsb3NlVHlwZToibm9ybWFsIn0pfWdldCBwb2ludHMoKXtyZXR1cm4gc3VwZXIucG9pbnRzfXNldCBwb2ludHModSl7fWdldCBzaWRlcygpe3JldHVybiB0aGlzW2ldKCJzaWRlcyIpfXNldCBzaWRlcyh1KXtpZih1PU9iamVjdChuLnRvQXJyYXkpKHUsITApLHUhPW51bGwmJiFBcnJheS5pc0FycmF5KHUpJiYodT1bdSx1XSksdGhpc1tzXSgic2lkZXMiLHUpKXtjb25zdCBwPW8odGhpcyk7c3VwZXIucG9pbnRzPXB9fWdldCBhbmdsZSgpe3JldHVybiB0aGlzW2ldKCJhbmdsZSIpfXNldCBhbmdsZSh1KXtpZih1PU9iamVjdChuLnRvTnVtYmVyKSh1KSx0aGlzW3NdKCJhbmdsZSIsdSkpe2NvbnN0IHA9byh0aGlzKTtzdXBlci5wb2ludHM9cH19fX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pO3ZhciBlPXQoMjMyKSxuPXQoMjEzKSxhPXQoMjM5KTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7ZnVuY3Rpb24gcyhvLGMsbSl7cmV0dXJuIGMgaW4gbz9PYmplY3QuZGVmaW5lUHJvcGVydHkobyxjLHt2YWx1ZTptLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6b1tjXT1tLG99Y2xhc3MgaSBleHRlbmRzIGUuZGVmYXVsdHt9cyhpLCJBdHRyIixhLmRlZmF1bHQpLG4uZGVmYXVsdC5yZWdpc3Rlck5vZGUoaSwicmVndWxhciIpfSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJkZWZhdWx0IixmdW5jdGlvbigpe3JldHVybiBjfSk7dmFyIGU9dCgyMzMpLG49dCg3Mik7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2NvbnN0IGE9U3ltYm9sLmZvcigic3ByaXRlanNfc2V0QXR0cmlidXRlRGVmYXVsdCIpLHM9U3ltYm9sLmZvcigic3ByaXRlanNfc2V0QXR0cmlidXRlIiksaT1TeW1ib2wuZm9yKCJzcHJpdGVqc19nZXRBdHRyaWJ1dGUiKTtmdW5jdGlvbiBvKG0pe2NvbnN0e2VkZ2VzOnUscmFkaXVzOnAsb2Zmc2V0QW5nbGU6eX09bSxPPU1hdGguUEkqeS8xODAtLjUqTWF0aC5QSTtpZih1PDN8fHA8PTApcmV0dXJuW107Y29uc3QgeD1bXTtmb3IobGV0IHY9MDt2PHU7disrKXtjb25zdCBUPXYqMipNYXRoLlBJL3UrTyxsPXAqTWF0aC5jb3MoVCksaD1wKk1hdGguc2luKFQpO3gucHVzaChsLGgpfXJldHVybiB4fWNsYXNzIGMgZXh0ZW5kcyBlLmRlZmF1bHR7Y29uc3RydWN0b3IodSl7c3VwZXIodSksdGhpc1thXSh7ZWRnZXM6MyxyYWRpdXM6MCxvZmZzZXRBbmdsZTowLGNsb3NlVHlwZToibm9ybWFsIn0pfWdldCBwb2ludHMoKXtyZXR1cm4gc3VwZXIucG9pbnRzfXNldCBwb2ludHModSl7fWdldCBlZGdlcygpe3JldHVybiB0aGlzW2ldKCJlZGdlcyIpfXNldCBlZGdlcyh1KXtpZih1PU9iamVjdChuLnRvTnVtYmVyKSh1KSx0aGlzW3NdKCJlZGdlcyIsdSkpe2NvbnN0IHA9byh0aGlzKTtzdXBlci5wb2ludHM9cH19Z2V0IHJhZGl1cygpe3JldHVybiB0aGlzW2ldKCJyYWRpdXMiKX1zZXQgcmFkaXVzKHUpe2lmKHU9T2JqZWN0KG4udG9OdW1iZXIpKHUpLHRoaXNbc10oInJhZGl1cyIsdSkpe2NvbnN0IHA9byh0aGlzKTtzdXBlci5wb2ludHM9cH19Z2V0IG9mZnNldEFuZ2xlKCl7cmV0dXJuIHRoaXNbaV0oIm9mZnNldEFuZ2xlIil9c2V0IG9mZnNldEFuZ2xlKHUpe2lmKHU9T2JqZWN0KG4udG9OdW1iZXIpKHUpLHRoaXNbc10oIm9mZnNldEFuZ2xlIix1KSl7Y29uc3QgcD1vKHRoaXMpO3N1cGVyLnBvaW50cz1wfX19fSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJkZWZhdWx0IixmdW5jdGlvbigpe3JldHVybiBpfSk7dmFyIGU9dCgyMzIpLG49dCgyMTMpLGE9dCgyNDEpO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtmdW5jdGlvbiBzKG8sYyxtKXtyZXR1cm4gYyBpbiBvP09iamVjdC5kZWZpbmVQcm9wZXJ0eShvLGMse3ZhbHVlOm0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTpvW2NdPW0sb31jbGFzcyBpIGV4dGVuZHMgZS5kZWZhdWx0e31zKGksIkF0dHIiLGEuZGVmYXVsdCksbi5kZWZhdWx0LnJlZ2lzdGVyTm9kZShpLCJzdGFyIil9LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImRlZmF1bHQiLGZ1bmN0aW9uKCl7cmV0dXJuIGN9KTt2YXIgZT10KDIzMyksbj10KDcyKTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7Y29uc3QgYT1TeW1ib2wuZm9yKCJzcHJpdGVqc19zZXRBdHRyaWJ1dGVEZWZhdWx0Iikscz1TeW1ib2wuZm9yKCJzcHJpdGVqc19zZXRBdHRyaWJ1dGUiKSxpPVN5bWJvbC5mb3IoInNwcml0ZWpzX2dldEF0dHJpYnV0ZSIpO2Z1bmN0aW9uIG8obSl7Y29uc3R7YW5nbGVzOnUsaW5uZXJSYWRpdXM6cCxvdXRlclJhZGl1czp5LG9mZnNldEFuZ2xlOk99PW0seD1NYXRoLlBJKk8vMTgwLS41Kk1hdGguUEk7aWYodTwzfHxwPD0wfHx5PD0wKXJldHVybltdO2NvbnN0IHY9W107Zm9yKGxldCBUPTA7VDx1KjI7VCsrKXtjb25zdCBsPVQqTWF0aC5QSS91K3gsaD1UJTI/cDp5LGY9aCpNYXRoLmNvcyhsKSxnPWgqTWF0aC5zaW4obCk7di5wdXNoKGYsZyl9cmV0dXJuIHZ9Y2xhc3MgYyBleHRlbmRzIGUuZGVmYXVsdHtjb25zdHJ1Y3Rvcih1KXtzdXBlcih1KSx0aGlzW2FdKHthbmdsZXM6NSxpbm5lclJhZGl1czowLG91dGVyUmFkaXVzOjAsb2Zmc2V0QW5nbGU6MCxjbG9zZVR5cGU6Im5vcm1hbCJ9KX1nZXQgcG9pbnRzKCl7cmV0dXJuIHN1cGVyLnBvaW50c31zZXQgcG9pbnRzKHUpe31nZXQgYW5nbGVzKCl7cmV0dXJuIHRoaXNbaV0oImFuZ2xlcyIpfXNldCBhbmdsZXModSl7aWYodT1PYmplY3Qobi50b051bWJlcikodSksdGhpc1tzXSgiYW5nbGVzIix1KSl7Y29uc3QgcD1vKHRoaXMpO3N1cGVyLnBvaW50cz1wfX1nZXQgaW5uZXJSYWRpdXMoKXtyZXR1cm4gdGhpc1tpXSgiaW5uZXJSYWRpdXMiKX1zZXQgaW5uZXJSYWRpdXModSl7aWYodT1PYmplY3Qobi50b051bWJlcikodSksdGhpc1tzXSgiaW5uZXJSYWRpdXMiLHUpKXtjb25zdCBwPW8odGhpcyk7c3VwZXIucG9pbnRzPXB9fWdldCBvdXRlclJhZGl1cygpe3JldHVybiB0aGlzW2ldKCJvdXRlclJhZGl1cyIpfXNldCBvdXRlclJhZGl1cyh1KXtpZih1PU9iamVjdChuLnRvTnVtYmVyKSh1KSx0aGlzW3NdKCJvdXRlclJhZGl1cyIsdSkpe2NvbnN0IHA9byh0aGlzKTtzdXBlci5wb2ludHM9cH19Z2V0IHJhZGl1cygpe3JldHVyblt0aGlzLmlubmVyUmFkaXVzLHRoaXMub3V0ZXJSYWRpdXNdfXNldCByYWRpdXModSl7dT1PYmplY3Qobi50b0FycmF5KSh1LCEwKSxBcnJheS5pc0FycmF5KHUpfHwodT1bdSx1XSksdGhpcy5pbm5lclJhZGl1cz11WzBdLHRoaXMub3V0ZXJSYWRpdXM9dVsxXX1nZXQgb2Zmc2V0QW5nbGUoKXtyZXR1cm4gdGhpc1tpXSgib2Zmc2V0QW5nbGUiKX1zZXQgb2Zmc2V0QW5nbGUodSl7aWYodT1PYmplY3Qobi50b051bWJlcikodSksdGhpc1tzXSgib2Zmc2V0QW5nbGUiLHUpKXtjb25zdCBwPW8odGhpcyk7c3VwZXIucG9pbnRzPXB9fX19LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImRlZmF1bHQiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KTt2YXIgZT10KDIyNiksbj10KDIxMyksYT10KDI0Myk7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2Z1bmN0aW9uIHMobyxjLG0pe3JldHVybiBjIGluIG8/T2JqZWN0LmRlZmluZVByb3BlcnR5KG8sYyx7dmFsdWU6bSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOm9bY109bSxvfWNsYXNzIGkgZXh0ZW5kcyBlLmRlZmF1bHR7Z2V0IGlzVmlzaWJsZSgpe2NvbnN0e3JhZGl1c1g6YyxyYWRpdXNZOm0sc3RhcnRBbmdsZTp1LGVuZEFuZ2xlOnB9PXRoaXMuYXR0cmlidXRlcztyZXR1cm4gYz4wJiZtPjAmJnUhPT1wJiZzdXBlci5pc1Zpc2libGV9fXMoaSwiQXR0ciIsYS5kZWZhdWx0KSxuLmRlZmF1bHQucmVnaXN0ZXJOb2RlKGksImVsbGlwc2UiKX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gdX0pO3ZhciBlPXQoMTIpLG49dCgyMjgpLGE9dCg3Mik7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2NvbnN0IHM9U3ltYm9sLmZvcigic3ByaXRlanNfc2V0QXR0cmlidXRlRGVmYXVsdCIpLGk9U3ltYm9sLmZvcigic3ByaXRlanNfc2V0QXR0cmlidXRlIiksbz1TeW1ib2wuZm9yKCJzcHJpdGVqc19nZXRBdHRyaWJ1dGUiKSxjPVN5bWJvbC5mb3IoInNwcml0ZWpzX2RlY2xhcmVBbGlhcyIpO2Z1bmN0aW9uIG0ocCl7Y29uc3R7cmFkaXVzWDp5LHJhZGl1c1k6TyxzdGFydEFuZ2xlOngsZW5kQW5nbGU6dixkaXJlY3Rpb246VCxjbG9zZVR5cGU6bH09cCxoPVQ9PT0iYW5pdGNsb2Nrd2lzZSIsZj1uZXcgZS5GaWd1cmUyRDtyZXR1cm4gbD09PSJzZWN0b3IiJiZmLm1vdmVUbygwLDApLGYuZWxsaXBzZSgwLDAseSxPLDAsTWF0aC5QSSp4LzE4MCxNYXRoLlBJKnYvMTgwLGgpLGwhPT0ibm9uZSImJmYuY2xvc2VQYXRoKCksZi5wYXRoLnJlZHVjZSgoQSxDKT0+QStDLmpvaW4oIiAiKSwiIil9Y2xhc3MgdSBleHRlbmRzIG4uZGVmYXVsdHtjb25zdHJ1Y3Rvcih5KXtzdXBlcih5KSx0aGlzW3NdKHtyYWRpdXNYOjAscmFkaXVzWTowLHN0YXJ0QW5nbGU6MCxlbmRBbmdsZTozNjAsZGlyZWN0aW9uOiJjbG9ja3dpc2UiLGNsb3NlVHlwZToibm9uZSJ9KSx0aGlzW2NdKCJyYWRpdXMiLCJhbmdsZSIpfWdldCBkKCl7cmV0dXJuIHRoaXNbb10oImQiKX1zZXQgZCh5KXt9Z2V0IHJhZGl1c1goKXtyZXR1cm4gdGhpc1tvXSgicmFkaXVzWCIpfXNldCByYWRpdXNYKHkpe2lmKHk9T2JqZWN0KGEudG9OdW1iZXIpKHkpLHRoaXNbaV0oInJhZGl1c1giLHkpKXtjb25zdCBPPW0odGhpcyk7dGhpc1tpXSgiZCIsTyl9fWdldCByYWRpdXNZKCl7cmV0dXJuIHRoaXNbb10oInJhZGl1c1kiKX1zZXQgcmFkaXVzWSh5KXtpZih5PU9iamVjdChhLnRvTnVtYmVyKSh5KSx0aGlzW2ldKCJyYWRpdXNZIix5KSl7Y29uc3QgTz1tKHRoaXMpO3RoaXNbaV0oImQiLE8pfX1nZXQgcmFkaXVzKCl7cmV0dXJuW3RoaXMucmFkaXVzWCx0aGlzLnJhZGl1c1ldfXNldCByYWRpdXMoeSl7eT1PYmplY3QoYS50b0FycmF5KSh5LCEwKSxBcnJheS5pc0FycmF5KHkpfHwoeT1beSx5XSksdGhpcy5yYWRpdXNYPXlbMF0sdGhpcy5yYWRpdXNZPXlbMV19Z2V0IGFuZ2xlKCl7cmV0dXJuW3RoaXMuc3RhcnRBbmdsZSx0aGlzLmVuZEFuZ2xlXX1zZXQgYW5nbGUoeSl7eT1PYmplY3QoYS50b0FycmF5KSh5KSxBcnJheS5pc0FycmF5KHkpfHwoeT1beSx5XSksdGhpcy5zdGFydEFuZ2xlPXlbMF0sdGhpcy5lbmRBbmdsZT15WzFdfWdldCBkaXJlY3Rpb24oKXtyZXR1cm4gdGhpc1tvXSgiZGlyZWN0aW9uIil9c2V0IGRpcmVjdGlvbih5KXtpZih5IT1udWxsJiZ5IT09ImNsb2Nrd2lzZSImJnkhPT0iYW50aWNsb2Nrd2lzZSIpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBkaXJlY3Rpb24gdHlwZS4iKTt0aGlzW2ldKCJkaXJlY3Rpb24iLHkpfWdldCBzdGFydEFuZ2xlKCl7cmV0dXJuIHRoaXNbb10oInN0YXJ0QW5nbGUiKX1zZXQgc3RhcnRBbmdsZSh5KXtpZih5PU9iamVjdChhLnRvTnVtYmVyKSh5KSx0aGlzW2ldKCJzdGFydEFuZ2xlIix5KSl7Y29uc3QgTz1tKHRoaXMpO3RoaXNbaV0oImQiLE8pfX1nZXQgZW5kQW5nbGUoKXtyZXR1cm4gdGhpc1tvXSgiZW5kQW5nbGUiKX1zZXQgZW5kQW5nbGUoeSl7aWYoeT1PYmplY3QoYS50b051bWJlcikoeSksdGhpc1tpXSgiZW5kQW5nbGUiLHkpKXtjb25zdCBPPW0odGhpcyk7dGhpc1tpXSgiZCIsTyl9fWdldCBjbG9zZVR5cGUoKXtyZXR1cm4gdGhpc1tvXSgiY2xvc2VUeXBlIil9c2V0IGNsb3NlVHlwZSh5KXtpZih5IT1udWxsJiZ5IT09Im5vbmUiJiZ5IT09InNlY3RvciImJnkhPT0ibm9ybWFsIil0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGNsb3NlVHlwZSB0eXBlLiIpO2lmKHRoaXNbaV0oImNsb3NlVHlwZSIseSkpe2NvbnN0IE89bSh0aGlzKTt0aGlzW2ldKCJkIixPKX19fX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pO3ZhciBlPXQoMjQyKSxuPXQoMjEzKSxhPXQoMjQ1KTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7ZnVuY3Rpb24gcyhvLGMsbSl7cmV0dXJuIGMgaW4gbz9PYmplY3QuZGVmaW5lUHJvcGVydHkobyxjLHt2YWx1ZTptLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6b1tjXT1tLG99Y2xhc3MgaSBleHRlbmRzIGUuZGVmYXVsdHt9cyhpLCJBdHRyIixhLmRlZmF1bHQpLG4uZGVmYXVsdC5yZWdpc3Rlck5vZGUoaSwiYXJjIil9LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImRlZmF1bHQiLGZ1bmN0aW9uKCl7cmV0dXJuIGF9KTt2YXIgZT10KDI0Myksbj10KDcyKTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7Y2xhc3MgYSBleHRlbmRzIGUuZGVmYXVsdHtnZXQgcmFkaXVzKCl7cmV0dXJuIHN1cGVyLnJhZGl1c1h9c2V0IHJhZGl1cyhpKXtpPU9iamVjdChuLnRvTnVtYmVyKShpKSxzdXBlci5yYWRpdXNYPWksc3VwZXIucmFkaXVzWT1pfX19LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImRlZmF1bHQiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KTt2YXIgZT10KDIyNiksbj10KDIxMyksYT10KDI0Nyk7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2Z1bmN0aW9uIHMobyxjLG0pe3JldHVybiBjIGluIG8/T2JqZWN0LmRlZmluZVByb3BlcnR5KG8sYyx7dmFsdWU6bSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOm9bY109bSxvfWNsYXNzIGkgZXh0ZW5kcyBlLmRlZmF1bHR7Z2V0IGlzVmlzaWJsZSgpe2NvbnN0e2lubmVyUmFkaXVzOmMsb3V0ZXJSYWRpdXM6bSxzdGFydEFuZ2xlOnUsZW5kQW5nbGU6cH09dGhpcy5hdHRyaWJ1dGVzO3JldHVybihjPjB8fG0+MCkmJnUhPT1wJiZzdXBlci5pc1Zpc2libGV9fXMoaSwiQXR0ciIsYS5kZWZhdWx0KSxuLmRlZmF1bHQucmVnaXN0ZXJOb2RlKGksInJpbmciKX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gdX0pO3ZhciBlPXQoMTIpLG49dCgyMjgpLGE9dCg3Mik7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2NvbnN0IHM9U3ltYm9sLmZvcigic3ByaXRlanNfc2V0QXR0cmlidXRlRGVmYXVsdCIpLGk9U3ltYm9sLmZvcigic3ByaXRlanNfc2V0QXR0cmlidXRlIiksbz1TeW1ib2wuZm9yKCJzcHJpdGVqc19nZXRBdHRyaWJ1dGUiKSxjPVN5bWJvbC5mb3IoInNwcml0ZWpzX2RlY2xhcmVBbGlhcyIpO2Z1bmN0aW9uIG0ocCl7bGV0e2lubmVyUmFkaXVzOnksb3V0ZXJSYWRpdXM6TyxzdGFydEFuZ2xlOngsZW5kQW5nbGU6dn09cDtjb25zdCBUPW5ldyBlLkZpZ3VyZTJEO2lmKHg9TWF0aC5QSSp4LzE4MCx2PU1hdGguUEkqdi8xODAseT5PJiYoW3ksT109W08seV0pLHk8PTAmJlQubW92ZVRvKDAsMCksVC5hcmMoMCwwLE8seCx2LCExKSx5PjApe2NvbnN0IGY9TWF0aC5QSSoyO3Y8eCYmKHY9eCtmKyh2LXgpJWYpLHYteD49ZiYmKHY9eCtmLTFlLTYpLFQuYXJjKDAsMCx5LHYseCwhMCl9cmV0dXJuIFQuY2xvc2VQYXRoKCksVC5wYXRoLnJlZHVjZSgoZixnKT0+ZitnLmpvaW4oIiAiKSwiIil9Y2xhc3MgdSBleHRlbmRzIG4uZGVmYXVsdHtjb25zdHJ1Y3Rvcih5KXtzdXBlcih5KSx0aGlzW3NdKHtpbm5lclJhZGl1czowLG91dGVyUmFkaXVzOjAsc3RhcnRBbmdsZTowLGVuZEFuZ2xlOjM2MH0pLHRoaXNbY10oInJhZGl1cyIsImFuZ2xlIil9Z2V0IGQoKXtyZXR1cm4gdGhpc1tvXSgiZCIpfXNldCBkKHkpe31nZXQgaW5uZXJSYWRpdXMoKXtyZXR1cm4gdGhpc1tvXSgiaW5uZXJSYWRpdXMiKX1zZXQgaW5uZXJSYWRpdXMoeSl7aWYoeT1PYmplY3QoYS50b051bWJlcikoeSksdGhpc1tpXSgiaW5uZXJSYWRpdXMiLHkpKXtjb25zdCBPPW0odGhpcyk7dGhpc1tpXSgiZCIsTyl9fWdldCBvdXRlclJhZGl1cygpe3JldHVybiB0aGlzW29dKCJvdXRlclJhZGl1cyIpfXNldCBvdXRlclJhZGl1cyh5KXtpZih5PU9iamVjdChhLnRvTnVtYmVyKSh5KSx0aGlzW2ldKCJvdXRlclJhZGl1cyIseSkpe2NvbnN0IE89bSh0aGlzKTt0aGlzW2ldKCJkIixPKX19Z2V0IHJhZGl1cygpe3JldHVyblt0aGlzLmlubmVyUmFkaXVzLHRoaXMub3V0ZXJSYWRpdXNdfXNldCByYWRpdXMoeSl7eT1PYmplY3QoYS50b0FycmF5KSh5LCEwKSxBcnJheS5pc0FycmF5KHkpfHwoeT1beSx5XSksdGhpcy5pbm5lclJhZGl1cz15WzBdLHRoaXMub3V0ZXJSYWRpdXM9eVsxXX1nZXQgc3RhcnRBbmdsZSgpe3JldHVybiB0aGlzW29dKCJzdGFydEFuZ2xlIil9c2V0IHN0YXJ0QW5nbGUoeSl7aWYoeT1PYmplY3QoYS50b051bWJlcikoeSksdGhpc1tpXSgic3RhcnRBbmdsZSIseSkpe2NvbnN0IE89bSh0aGlzKTt0aGlzW2ldKCJkIixPKX19Z2V0IGVuZEFuZ2xlKCl7cmV0dXJuIHRoaXNbb10oImVuZEFuZ2xlIil9c2V0IGVuZEFuZ2xlKHkpe2lmKHk9T2JqZWN0KGEudG9OdW1iZXIpKHkpLHRoaXNbaV0oImVuZEFuZ2xlIix5KSl7Y29uc3QgTz1tKHRoaXMpO3RoaXNbaV0oImQiLE8pfX1nZXQgYW5nbGUoKXtyZXR1cm5bdGhpcy5zdGFydEFuZ2xlLHRoaXMuZW5kQW5nbGVdfXNldCBhbmdsZSh5KXt5PU9iamVjdChhLnRvQXJyYXkpKHkpLEFycmF5LmlzQXJyYXkoeSl8fCh5PVt5LHldKSx0aGlzLnN0YXJ0QW5nbGU9eVswXSx0aGlzLmVuZEFuZ2xlPXlbMV19fX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gT30pO3ZhciBlPXQoMTIpLG49dCgyMTgpLGE9dCgyMTkpLHM9dCgyNDkpLGk9dCgyMTMpO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtmdW5jdGlvbiBvKHgsdixUKXtyZXR1cm4gdiBpbiB4P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh4LHYse3ZhbHVlOlQsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp4W3ZdPVQseH1jb25zdCBjPVN5bWJvbCgidGV4dEltYWdlIiksbT1TeW1ib2woInRleHRJbWFnZVRhc2siKSx1PVN5bWJvbCgidGV4dHVyZUNvbnRleHQiKSxwPVN5bWJvbCgidXBkYXRlVGV4dHVyZVJlY3QiKSx5PVN5bWJvbCgidGV4dENhbnZhcyIpO2NsYXNzIE8gZXh0ZW5kcyBhLmRlZmF1bHR7Y29uc3RydWN0b3Iodj17fSl7dHlwZW9mIHY9PSJzdHJpbmciJiYodj17dGV4dDp2fSksc3VwZXIodil9Z2V0IGNvbnRlbnRTaXplKCl7bGV0W3YsVF09c3VwZXIuY29udGVudFNpemU7Y29uc3R7d2lkdGg6bCxoZWlnaHQ6aH09dGhpcy5hdHRyaWJ1dGVzO2lmKGw9PW51bGx8fGg9PW51bGwpe2NvbnN0IGY9dGhpc1tjXTtmJiYobD09bnVsbCYmKHY9Zi5yZWN0WzJdKSxoPT1udWxsJiYoVD1mLnJlY3RbM10pKX1yZXR1cm5bdixUXX1nZXQgdGV4dCgpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXMudGV4dH1zZXQgdGV4dCh2KXt0aGlzLmF0dHJpYnV0ZXMudGV4dD12fWdldCB0ZXh0Q29udGVudCgpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXMudGV4dH1zZXQgdGV4dENvbnRlbnQodil7dGhpcy5hdHRyaWJ1dGVzLnRleHQ9dn1nZXQgdGV4dEltYWdlKCl7cmV0dXJuIHRoaXNbY118fHt9fWdldCB0ZXh0SW1hZ2VSZWFkeSgpe3JldHVybiB0aGlzW21dfHxQcm9taXNlLnJlc29sdmUoKX1kcmF3KHYpe3N1cGVyLmRyYXcodik7Y29uc3QgVD10aGlzLm1lc2g7aWYoVCl7Y29uc3QgbD10aGlzW2NdO2lmKGwpe2xldCBoPVQudGV4dHVyZTtpZighaHx8dGhpc1t1XSYmdGhpc1t1XSE9PXRoaXMucmVuZGVyZXJ8fGwubmVlZHNVcGRhdGU/KGwubmVlZHNVcGRhdGU9ITEsT2JqZWN0KG4uZGVsZXRlVGV4dHVyZSkobC5pbWFnZSx0aGlzLnJlbmRlcmVyKSxoPU9iamVjdChuLmNyZWF0ZVRleHR1cmUpKGwuaW1hZ2UsdGhpcy5yZW5kZXJlciksdGhpc1twXT0hMCk6aD1ULnVuaWZvcm1zLnVfdGV4U2FtcGxlcix0aGlzW3BdKXtjb25zdFtmLGddPWwucmVjdC5zbGljZSgyKSxbTSxBXT10aGlzLmNvbnRlbnRTaXplLEM9dGhpcy5hdHRyaWJ1dGVzLnRleHRBbGlnbixiPXRoaXMuYXR0cmlidXRlcy52ZXJ0aWNhbEFsaWduO2xldCBFPTA7Qz09PSJjZW50ZXIiP0U9KE0tZikvMjooQz09PSJyaWdodCJ8fEM9PT0iZW5kIikmJihFPU0tZik7Y29uc3QgTD10aGlzLmF0dHJpYnV0ZXMuZm9udFNpemUsRD10aGlzLmF0dHJpYnV0ZXMubGluZUhlaWdodDtsZXQgST0wO2I9PT0idG9wIj9JPShMLUQpLzI6Yj09PSJib3R0b20iJiYoST0oRC1MKS8yKTtjb25zdHtwYWRkaW5nTGVmdDpSLHBhZGRpbmdUb3A6Qn09dGhpcy5hdHRyaWJ1dGVzLHtib3JkZXJXaWR0aDp6fT10aGlzLmF0dHJpYnV0ZXM7RSs9Uit6LEkrPUIrejtjb25zdHthbmNob3JYOkssYW5jaG9yWTpRfT10aGlzLmF0dHJpYnV0ZXM7RS09dGhpcy5vZmZzZXRTaXplWzBdKkssSS09dGhpcy5vZmZzZXRTaXplWzFdKlEsVC5zZXRUZXh0dXJlKGgse3JlY3Q6W0UsSSxmLGddfSksdGhpc1twXT0hMSx0aGlzW3VdPXRoaXMucmVuZGVyZXJ9fX1yZXR1cm4gdn1vblByb3BlcnR5Q2hhbmdlKHYsVCxsKXt2PT09InRleHQifHx2PT09ImZvbnRTaXplInx8dj09PSJmb250RmFtaWx5Inx8dj09PSJmb250U3R5bGUifHx2PT09ImZvbnRWYXJpYW50Inx8dj09PSJmb250V2VpZ2h0Inx8dj09PSJmb250U3RyZXRjaCJ8fHY9PT0ibGluZUhlaWdodCJ8fHY9PT0ic3Ryb2tlQ29sb3IifHx2PT09ImZpbGxDb2xvciJ8fHY9PT0ic3Ryb2tlV2lkdGgiP3RoaXMudXBkYXRlVGV4dCgpOigodj09PSJ0ZXh0QWxpZ24ifHx2PT09InZlcnRpY2FsQWxpZ24iKSYmKHRoaXNbcF09ITApLHN1cGVyLm9uUHJvcGVydHlDaGFuZ2UodixULGwpKX11cGRhdGVDb250b3Vycygpe3N1cGVyLnVwZGF0ZUNvbnRvdXJzKCksdGhpc1twXT0hMH11cGRhdGVUZXh0KCl7dGhpc1ttXXx8KHRoaXNbbV09UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+e3RoaXNbbV09bnVsbDtjb25zdHt0ZXh0OnYsZm9udDpULGZpbGxDb2xvcjpsLHN0cm9rZUNvbG9yOmgsc3Ryb2tlV2lkdGg6Zn09dGhpcy5hdHRyaWJ1dGVzLGc9dGhpcy5sYXllcj90aGlzLmxheWVyLmRpc3BsYXlSYXRpbzoxO3JldHVybiB0aGlzW3ldPXRoaXNbeV18fGUuRU5WLmNyZWF0ZUNhbnZhcygxLDEpLHRoaXNbY109ZS5FTlYuY3JlYXRlVGV4dCh2LHtmb250OlQsZmlsbENvbG9yOmwsc3Ryb2tlQ29sb3I6aCxzdHJva2VXaWR0aDpmLHBhcnNlRm9udDplLnBhcnNlRm9udCxyYXRpbzpnLHRleHRDYW52YXM6dGhpc1t5XX0pLHRoaXNbY10ubmVlZHNVcGRhdGU9ITAsdGhpcy51cGRhdGVDb250b3VycygpLHRoaXMuZm9yY2VVcGRhdGUoKSx0aGlzW2NdfSkpfX1vKE8sIkF0dHIiLHMuZGVmYXVsdCksaS5kZWZhdWx0LnJlZ2lzdGVyTm9kZShPLCJsYWJlbCIpfSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJkZWZhdWx0IixmdW5jdGlvbigpe3JldHVybiB1fSk7dmFyIGU9dCgxMiksbj10KDcyKSxhPXQoMjIxKSxzPXQoMjIwKTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7Y29uc3QgaT1TeW1ib2wuZm9yKCJzcHJpdGVqc19zZXRBdHRyaWJ1dGVEZWZhdWx0Iiksbz1TeW1ib2wuZm9yKCJzcHJpdGVqc19zZXRBdHRyaWJ1dGUiKSxjPVN5bWJvbC5mb3IoInNwcml0ZWpzX2dldEF0dHJpYnV0ZSIpLG09U3ltYm9sLmZvcigic3ByaXRlanNfZGVjbGFyZUFsaWFzIik7Y2xhc3MgdSBleHRlbmRzIHMuZGVmYXVsdHtjb25zdHJ1Y3Rvcih5KXtzdXBlcih5KSx0aGlzW2ldKHt0ZXh0OiIiLGZvbnRTaXplOjE2LGZvbnRGYW1pbHk6IkhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmIixmb250U3R5bGU6Im5vcm1hbCIsZm9udFZhcmlhbnQ6Im5vcm1hbCIsZm9udFdlaWdodDoibm9ybWFsIixmb250U3RyZXRjaDoibm9ybWFsIixsaW5lSGVpZ2h0OiIiLHRleHRBbGlnbjoibGVmdCIsc3Ryb2tlQ29sb3I6dm9pZCAwLHN0cm9rZVdpZHRoOjEsZmlsbENvbG9yOnZvaWQgMCx2ZXJ0aWNhbEFsaWduOiJtaWRkbGUifSksdGhpc1ttXSgiZm9udCIpfWdldCB0ZXh0KCl7cmV0dXJuIHRoaXNbY10oInRleHQiKXx8IiAifXNldCB0ZXh0KHkpe3RoaXNbb10oInRleHQiLHkpfWdldCBmb250U2l6ZSgpe3JldHVybiB0aGlzW2NdKCJmb250U2l6ZSIpfXNldCBmb250U2l6ZSh5KXt0aGlzW29dKCJmb250U2l6ZSIsT2JqZWN0KG4udG9OdW1iZXIpKHkpKX1nZXQgZm9udEZhbWlseSgpe3JldHVybiB0aGlzW2NdKCJmb250RmFtaWx5Iil9c2V0IGZvbnRGYW1pbHkoeSl7dGhpc1tvXSgiZm9udEZhbWlseSIseSl9Z2V0IGZvbnRTdHlsZSgpe3JldHVybiB0aGlzW2NdKCJmb250U3R5bGUiKX1zZXQgZm9udFN0eWxlKHkpe3RoaXNbb10oImZvbnRTdHlsZSIseSl9Z2V0IGZvbnRWYXJpYW50KCl7cmV0dXJuIHRoaXNbY10oImZvbnRWYXJpYW50Iil9c2V0IGZvbnRWYXJpYW50KHkpe3RoaXNbb10oImZvbnRWYXJpYW50Iix5KX1nZXQgZm9udFdlaWdodCgpe3JldHVybiB0aGlzW2NdKCJmb250V2VpZ2h0Iil9c2V0IGZvbnRXZWlnaHQoeSl7dGhpc1tvXSgiZm9udFdlaWdodCIseSl9Z2V0IGZvbnRTdHJldGNoKCl7cmV0dXJuIHRoaXNbY10oImZvbnRTdHJldGNoIil9c2V0IGZvbnRTdHJldGNoKHkpe3RoaXNbb10oImZvbnRTdHJldGNoIix5KX1nZXQgbGluZUhlaWdodCgpe3JldHVybiB0aGlzW2NdKCJsaW5lSGVpZ2h0Iil8fHRoaXMuZm9udFNpemV9c2V0IGxpbmVIZWlnaHQoeSl7dGhpc1tvXSgibGluZUhlaWdodCIsT2JqZWN0KG4udG9OdW1iZXIpKHkpKX1nZXQgdGV4dEFsaWduKCl7cmV0dXJuIHRoaXNbY10oInRleHRBbGlnbiIpfXNldCB0ZXh0QWxpZ24oeSl7dGhpc1tvXSgidGV4dEFsaWduIix5KX1nZXQgc3Ryb2tlQ29sb3IoKXtyZXR1cm4gdGhpc1tjXSgic3Ryb2tlQ29sb3IiKX1zZXQgc3Ryb2tlQ29sb3IoeSl7dGhpc1tvXSgic3Ryb2tlQ29sb3IiLE9iamVjdChhLnBhcnNlQ29sb3IpKHkpKX1nZXQgc3Ryb2tlV2lkdGgoKXtyZXR1cm4gdGhpc1tjXSgic3Ryb2tlV2lkdGgiKX1zZXQgc3Ryb2tlV2lkdGgoeSl7dGhpc1tvXSgic3Ryb2tlV2lkdGgiLE9iamVjdChuLnRvTnVtYmVyKSh5KSl9Z2V0IHZlcnRpY2FsQWxpZ24oKXtyZXR1cm4gdGhpc1tjXSgidmVydGljYWxBbGlnbiIpfXNldCB2ZXJ0aWNhbEFsaWduKHkpe3RoaXNbb10oInZlcnRpY2FsQWxpZ24iLHkpfWdldCBmaWxsQ29sb3IoKXtyZXR1cm4gdGhpc1tjXSgiZmlsbENvbG9yIil9c2V0IGZpbGxDb2xvcih5KXt0aGlzW29dKCJmaWxsQ29sb3IiLE9iamVjdChhLnBhcnNlQ29sb3IpKHkpKX1nZXQgZm9udCgpe2NvbnN0e2ZvbnRTdHlsZTp5LGZvbnRWYXJpYW50Ok8sZm9udFdlaWdodDp4LGZvbnRTdHJldGNoOnYsZm9udFNpemU6VCxsaW5lSGVpZ2h0OmwsZm9udEZhbWlseTpofT10aGlzO3JldHVybmAke3l9ICR7T30gJHt4fSAke3Z9ICR7VH1weC8ke2x9cHggJHtofWB9c2V0IGZvbnQoeSl7aWYoeT09bnVsbCl0aGlzLmZvbnRTdHlsZT1udWxsLHRoaXMuZm9udFZhcmlhbnQ9bnVsbCx0aGlzLmZvbnRXZWlnaHQ9bnVsbCx0aGlzLmZvbnRTdHJldGNoPW51bGwsdGhpcy5mb250U2l6ZT1udWxsLHRoaXMubGluZUhlaWdodD1udWxsLHRoaXMuZm9udEZhbWlseT1udWxsO2Vsc2V7Y29uc3QgTz1PYmplY3QoZS5wYXJzZUZvbnQpKHkpO3RoaXMuZm9udFN0eWxlPU8uc3R5bGUsdGhpcy5mb250VmFyaWFudD1PLnZhcmlhbnQsdGhpcy5mb250V2VpZ2h0PU8ud2VpZ2h0LHRoaXMuZm9udFN0cmV0Y2g9Ty5zdHJldGNoLHRoaXMuZm9udFNpemU9T2JqZWN0KG4udG9OdW1iZXIpKGAke08uc2l6ZX0ke08udW5pdH1gKSxPLmxpbmVIZWlnaHQmJih0aGlzLmxpbmVIZWlnaHQ9Ty5weExpbmVIZWlnaHQpLHRoaXMuZm9udEZhbWlseT1PLmZhbWlseX19fX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4geX0pO3ZhciBlPXQoMTIpLG49dCgyMTkpLGE9dCgyNTEpLHM9dCgyMTMpLGk9dCgyNTIpO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtmdW5jdGlvbiBvKE8seCx2KXtyZXR1cm4geCBpbiBPP09iamVjdC5kZWZpbmVQcm9wZXJ0eShPLHgse3ZhbHVlOnYsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTpPW3hdPXYsT31jb25zdCBjPVN5bWJvbCgiek9yZGVyIiksbT1TeW1ib2woIm9yZGVyZWQiKSx1PVN5bWJvbCgiY2hpbGRyZW4iKSxwPVN5bWJvbCgic2VhbGVkIik7Y2xhc3MgeSBleHRlbmRzIG4uZGVmYXVsdHtjb25zdHJ1Y3Rvcih4PXt9KXtzdXBlcih4KSx0aGlzW3VdPVtdLHRoaXNbbV09bnVsbCx0aGlzW2NdPTB9Z2V0IGNoaWxkTm9kZXMoKXtyZXR1cm4gdGhpc1t1XX1nZXQgY2hpbGRyZW4oKXtyZXR1cm4gdGhpc1t1XX1nZXQgb3JkZXJlZENoaWxkcmVuKCl7cmV0dXJuIHRoaXNbbV18fCh0aGlzW21dPVsuLi50aGlzW3VdXSx0aGlzW21dLnNvcnQoKHgsdik9PnguekluZGV4LXYuekluZGV4fHx4LnpPcmRlci12LnpPcmRlcikpLHRoaXNbbV19YXBwZW5kKC4uLngpe3JldHVybiB4Lm1hcCh2PT50aGlzLmFwcGVuZENoaWxkKHYpKX1hcHBlbmRDaGlsZCh4KXtyZXR1cm4geC5yZW1vdmUoKSx0aGlzW3VdLnB1c2goeCkseC5jb25uZWN0KHRoaXMsdGhpc1tjXSsrKSx0aGlzW21dJiYodGhpc1ttXS5sZW5ndGgmJnguekluZGV4PHRoaXNbbV1bdGhpc1ttXS5sZW5ndGgtMV0uekluZGV4P3RoaXMucmVvcmRlcigpOnRoaXNbbV0ucHVzaCh4KSkseH1jbG9uZU5vZGUoeD0hMSl7Y29uc3Qgdj1zdXBlci5jbG9uZU5vZGUoKTtyZXR1cm4geCYmdGhpc1t1XS5mb3JFYWNoKFQ9Pntjb25zdCBsPVQuY2xvbmVOb2RlKHgpO3YuYXBwZW5kQ2hpbGQobCl9KSx2fWRpc3BhdGNoUG9pbnRlckV2ZW50KHgpe2NvbnN0IHY9dGhpcy5vcmRlcmVkQ2hpbGRyZW47Zm9yKGxldCBUPXYubGVuZ3RoLTE7VD49MDtULS0paWYodltUXS5kaXNwYXRjaFBvaW50ZXJFdmVudCh4KSlyZXR1cm4hMDtyZXR1cm4gc3VwZXIuZGlzcGF0Y2hQb2ludGVyRXZlbnQoeCl9ZHJhdyh4PVtdKXtpZih0aGlzLl9fY2FjaGVSZW5kZXJNYXRyaXg9dGhpcy5yZW5kZXJNYXRyaXgsc3VwZXIuZHJhdyh4KSwhdGhpc1twXSYmdGhpcy5hdHRyaWJ1dGVzLmRpc3BsYXkhPT0ibm9uZSIpe2NvbnN0IHY9dGhpcy5vcmRlcmVkQ2hpbGRyZW47Zm9yKGxldCBUPTA7VDx2Lmxlbmd0aDtUKyspdltUXS5kcmF3KHgpfXJldHVybiB0aGlzLl9fY2FjaGVSZW5kZXJNYXRyaXg9bnVsbCx4fWdldEVsZW1lbnRCeUlkKHgpe3JldHVybiBPYmplY3QoaS5xdWVyeVNlbGVjdG9yKShgIyR7eH1gLHRoaXMpfWdldEVsZW1lbnRzQnlDbGFzc05hbWUoeCl7cmV0dXJuIE9iamVjdChpLnF1ZXJ5U2VsZWN0b3JBbGwpKGAuJHt4fWAsdGhpcyl9Z2V0RWxlbWVudHNCeU5hbWUoeCl7cmV0dXJuIE9iamVjdChpLnF1ZXJ5U2VsZWN0b3JBbGwpKGBbbmFtZT0iJHt4fSJdYCx0aGlzKX1nZXRFbGVtZW50c0J5VGFnTmFtZSh4KXtyZXR1cm4gT2JqZWN0KGkucXVlcnlTZWxlY3RvckFsbCkoeCx0aGlzKX1pbnNlcnRCZWZvcmUoeCx2KXtpZih2PT1udWxsKXJldHVybiB0aGlzLmFwcGVuZENoaWxkKHgpO3gucmVtb3ZlKCk7Y29uc3QgVD10aGlzW3VdLmluZGV4T2Yodik7aWYoVDwwKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCByZWZlcmVuY2Ugbm9kZS4iKTtjb25zdCBsPXYuek9yZGVyO2ZvcihsZXQgaD1UO2g8dGhpc1t1XS5sZW5ndGg7aCsrKXtjb25zdCBmPXRoaXNbdV1baF0uek9yZGVyLGc9dGhpc1t1XVtoXTtkZWxldGUgZy56T3JkZXIsT2JqZWN0LmRlZmluZVByb3BlcnR5KGcsInpPcmRlciIse3ZhbHVlOmYrMSx3cml0YWJsZTohMSxjb25maWd1cmFibGU6ITB9KX1pZih0aGlzW3VdLnNwbGljZShULDAseCkseC5jb25uZWN0KHRoaXMsbCksdGhpc1ttXSlpZih4LnpJbmRleCE9PXYuekluZGV4KXRoaXMucmVvcmRlcigpO2Vsc2V7Y29uc3QgaD10aGlzW21dLmluZGV4T2Yodik7dGhpc1ttXS5zcGxpY2UoaCwwLHgpfXJldHVybiB4fXF1ZXJ5U2VsZWN0b3IoeCl7cmV0dXJuIE9iamVjdChpLnF1ZXJ5U2VsZWN0b3IpKHgsdGhpcyl9cXVlcnlTZWxlY3RvckFsbCh4KXtyZXR1cm4gT2JqZWN0KGkucXVlcnlTZWxlY3RvckFsbCkoeCx0aGlzKX1yZXBsYWNlQ2hpbGQoeCx2KXt4LnJlbW92ZSgpO2NvbnN0IFQ9dGhpc1t1XS5pbmRleE9mKHYpO2lmKFQ8MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgcmVmZXJlbmNlIG5vZGUuIik7aWYodGhpc1t1XVtUXT14LHguY29ubmVjdCh0aGlzLHYuek9yZGVyKSx0aGlzW21dKWlmKHguekluZGV4IT09di56SW5kZXgpdGhpcy5yZW9yZGVyKCk7ZWxzZXtjb25zdCBsPXRoaXNbbV0uaW5kZXhPZih2KTt0aGlzW21dW2xdPXh9cmV0dXJuIHYuZGlzY29ubmVjdCh0aGlzKSx4fXJlbW92ZUFsbENoaWxkcmVuKCl7Y29uc3QgeD10aGlzW3VdO2ZvcihsZXQgdj14Lmxlbmd0aC0xO3Y+PTA7di0tKXhbdl0ucmVtb3ZlKCl9cmVtb3ZlQ2hpbGQoeCl7Y29uc3Qgdj10aGlzW3VdLmluZGV4T2YoeCk7aWYodj49MCl7aWYodGhpc1t1XS5zcGxpY2UodiwxKSx0aGlzW21dKXtjb25zdCBUPXRoaXNbbV0uaW5kZXhPZih4KTt0aGlzW21dLnNwbGljZShULDEpfXJldHVybiB4LmRpc2Nvbm5lY3QodGhpcykseH1yZXR1cm4gbnVsbH1yZW9yZGVyKCl7dGhpc1ttXT1udWxsfXNlYWwoKXtmdW5jdGlvbiB4KGgsZil7Y29uc3QgZz1bXTtmb3IobGV0IE09MDtNPGgubGVuZ3RoO00rKyl7Y29uc3QgQT1bLi4uaFtNXV07Zm9yKGxldCBDPTE7QzxBLmxlbmd0aDtDKz0yKXtjb25zdCBiPUFbQ10sRT1BW0MrMV07QVtDXT1iKmZbMF0rRSpmWzJdK2ZbNF0sQVtDKzFdPWIqZlsxXStFKmZbM10rZls1XX1nLnB1c2goQSl9cmV0dXJuIGd9Y29uc3Qgdj10aGlzLm9yZGVyZWRDaGlsZHJlbixUPW5ldyBlLkZpZ3VyZTJELGw9dGhpcy5sb2NhbE1hdHJpeDtmb3IobGV0IGg9MDtoPHYubGVuZ3RoO2grKyl7bGV0IGY9dltoXTtpZihmIGluc3RhbmNlb2YgeSYmKGY9Zi5zZWFsKCkpLGYuY2xpZW50Qm94KXtsZXQgZz1mLmNsaWVudEJveC5jb250b3Vycy5wYXRoO2c9eChnLGYubG9jYWxNYXRyaXgpLFQuYWRkUGF0aChnKX1pZihmLnBhdGgpe2xldCBnPWYucGF0aC5jb250b3Vycy5wYXRoO2c9eChnLGYubG9jYWxNYXRyaXgpLFQuYWRkUGF0aChnKX19cmV0dXJuIHRoaXNbcF09ITAsdGhpcy5jbGllbnRCb3g9VCx7Y2xpZW50Qm94OlQsbG9jYWxNYXRyaXg6bH19c2V0UmVzb2x1dGlvbih7d2lkdGg6eCxoZWlnaHQ6dn0pe3N1cGVyLnNldFJlc29sdXRpb24oe3dpZHRoOngsaGVpZ2h0OnZ9KSx0aGlzW3VdLmZvckVhY2goVD0+e1Quc2V0UmVzb2x1dGlvbih7d2lkdGg6eCxoZWlnaHQ6dn0pfSl9dXBkYXRlQ29udG91cnMoKXt0aGlzW3BdfHxzdXBlci51cGRhdGVDb250b3VycygpfX1vKHksIkF0dHIiLGEuZGVmYXVsdCkscy5kZWZhdWx0LnJlZ2lzdGVyTm9kZSh5LCJncm91cCIpfSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJkZWZhdWx0IixmdW5jdGlvbigpe3JldHVybiBufSk7dmFyIGU9dCgyMjApO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtjbGFzcyBuIGV4dGVuZHMgZS5kZWZhdWx0e319LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsInF1ZXJ5U2VsZWN0b3JBbGwiLGZ1bmN0aW9uKCl7cmV0dXJuIHB9KSx0LmQociwicXVlcnlTZWxlY3RvciIsZnVuY3Rpb24oKXtyZXR1cm4geX0pLHQuZChyLCJpc01hdGNoZWQiLGZ1bmN0aW9uKCl7cmV0dXJuIE99KSx0LmQociwiY29tcGlsZSIsZnVuY3Rpb24oKXtyZXR1cm4geH0pO3ZhciBlPXQoMjIxKSxuPXQoMjEzKTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7Y29uc3QgYT10KDI1Myk7ZnVuY3Rpb24gcyh2KXtyZXR1cm4gdi5ub2RlVHlwZT09PTF8fG4uZGVmYXVsdC5pc1Nwcml0ZU5vZGUodi5ub2RlTmFtZSl9ZnVuY3Rpb24gaSh2KXtyZXR1cm4gQXJyYXkuZnJvbSh2LmNoaWxkTm9kZXN8fFtdKX1mdW5jdGlvbiBvKHYpe3JldHVybiBuLmRlZmF1bHQuaXNTcHJpdGVOb2RlKHYubm9kZU5hbWUpP3YucGFyZW50fHx2LmNhbnZhc3x8di5jb250YWluZXI6di5wYXJlbnRFbGVtZW50fWZ1bmN0aW9uIGModil7bGV0IFQ9di5sZW5ndGgsbCxoLGY7Zm9yKDstLVQ+LTE7KXtmb3IobD1oPXZbVF0sdltUXT1udWxsLGY9ITA7aDspe2lmKHYuaW5kZXhPZihoKT4tMSl7Zj0hMSx2LnNwbGljZShULDEpO2JyZWFrfWg9byhoKX1mJiYodltUXT1sKX1yZXR1cm4gdn1jb25zdCBtPXtpc1RhZzpzLGV4aXN0c09uZSh2LFQpe3JldHVybiBULnNvbWUobD0+cyhsKT92KGwpfHxtLmV4aXN0c09uZSh2LGkobCkpOiExKX0sZ2V0U2libGluZ3Modil7Y29uc3QgVD1vKHYpO3JldHVybiBUJiZpKFQpfSxnZXRDaGlsZHJlbjppLGdldFBhcmVudDpvLGdldEF0dHJpYnV0ZVZhbHVlKHYsVCl7aWYodi5ub2RlVHlwZT09PTEmJlQ9PT0iY2xhc3MifHxUPT09ImlkIilyZXR1cm4gdltUXTtpZih0aGlzLmhhc0F0dHJpYih2LFQpKXtsZXQgbD12LmF0dHJpYnV0ZXNbVF07cmV0dXJuIEFycmF5LmlzQXJyYXkobCkmJihsPWBbJHtsLmpvaW4oKX1dYCksU3RyaW5nKGwpfX0saGFzQXR0cmliKHYsVCl7cmV0dXJuIHYuYXR0cmlidXRlc1tUXSE9bnVsbH0scmVtb3ZlU3Vic2V0czpjLGdldE5hbWUodil7cmV0dXJuIHYudGFnTmFtZT92LnRhZ05hbWUudG9Mb3dlckNhc2UoKTpudWxsfSxmaW5kT25lOmZ1bmN0aW9uIHYoVCxsKXtsZXQgaD1udWxsO2ZvcihsZXQgZj0wLGc9bC5sZW5ndGg7ZjxnJiYhaDtmKyspaWYoVChsW2ZdKSloPWxbZl07ZWxzZXtjb25zdCBNPWkobFtmXSk7TSYmTS5sZW5ndGg+MCYmKGg9dihULE0pKX1yZXR1cm4gaH0sZmluZEFsbDpmdW5jdGlvbiB2KFQsbCl7bGV0IGg9W107Zm9yKGxldCBmPTAsZz1sLmxlbmd0aDtmPGc7ZisrKXtpZighcyhsW2ZdKSljb250aW51ZTtUKGxbZl0pJiZoLnB1c2gobFtmXSk7Y29uc3QgTT1pKGxbZl0pO00mJihoPWguY29uY2F0KHYoVCxNKSkpfXJldHVybiBofSxnZXRUZXh0OmZ1bmN0aW9uIHYoVCl7cmV0dXJuIEFycmF5LmlzQXJyYXkoVCk/VC5tYXAodikuam9pbigiIik6cyhUKT92KGkoVCkpOlQubm9kZVR5cGU9PT0zP1Qubm9kZVZhbHVlOm4uZGVmYXVsdC5pc1Nwcml0ZU5vZGUoVC5ub2RlTmFtZSk/VC50ZXh0OiIifX07ZnVuY3Rpb24gdSh2KXtpZih0eXBlb2YgdiE9InN0cmluZyIpcmV0dXJuIHY7bGV0IFQ9di5tYXRjaCgvXFsoYmdjb2xvcnxmaWxsQ29sb3J8c3Ryb2tlQ29sb3J8Y29sb3IpXHMqPVxzKlsnIl0/XHcrWyciXT9cXS9nKTtyZXR1cm4gVCYmKFQ9VC5tYXAobD0+e2NvbnN0IGg9bC5zbGljZSgxLC0xKS5zcGxpdCgiPSIpLGY9T2JqZWN0KGUucGFyc2VDb2xvcikoaFsxXS5yZXBsYWNlKC9bJyJdL2csIiIpKTtyZXR1cm5bbCxgWyR7aFswXX09IiR7Zn0iXWBdfSksVC5mb3JFYWNoKChbbCxoXSk9Pnt2PXYucmVwbGFjZShsLGgpfSkpLFQ9di5tYXRjaCgvXFtcdytccyo9XHMqWyciXVxbLis/XF1bJyJdXF0vZyksVCYmKFQ9VC5tYXAobD0+e2NvbnN0IGg9bC5zbGljZSgxLC0xKS5zcGxpdCgiPSIpLGY9aFsxXS5zbGljZSgyLC0yKS5zcGxpdCgvLC9nKS5tYXAoZz0+Zy50cmltKCkpO3JldHVybltsLGBbJHtoWzBdfT0iWyR7Zn1dIl1gXX0pLFQuZm9yRWFjaCgoW2wsaF0pPT57dj12LnJlcGxhY2UobCxoKX0pKSx2fWZ1bmN0aW9uIHAodixUKXtyZXR1cm4gYS5zZWxlY3RBbGwodSh2KSxULHthZGFwdGVyOm19KX1mdW5jdGlvbiB5KHYsVCl7cmV0dXJuIGEuc2VsZWN0T25lKHUodiksVCx7YWRhcHRlcjptfSl9ZnVuY3Rpb24gTyh2LFQpe3JldHVybiBhLmlzKHYsdShUKSx7YWRhcHRlcjptfSl9ZnVuY3Rpb24geCh2KXtyZXR1cm4gYS5jb21waWxlKHUodikse2FkYXB0ZXI6bX0pfX0sZnVuY3Rpb24oZCxyLHQpe2QuZXhwb3J0cz14O3ZhciBlPXQoMjU0KSxuPXQoMjczKS5mYWxzZUZ1bmMsYT10KDI3NCk7ZnVuY3Rpb24gcyh2KXtyZXR1cm4gZnVuY3Rpb24obCxoLGYpe3JldHVybiBoPWh8fHt9LGguYWRhcHRlcj1oLmFkYXB0ZXJ8fGUsdihsLGgsZil9fXZhciBpPXMoYSksbz1zKGEuY29tcGlsZVVuc2FmZSk7ZnVuY3Rpb24gYyh2KXtyZXR1cm4gZnVuY3Rpb24obCxoLGYpe3JldHVybiBmPWZ8fHt9LGYuYWRhcHRlcj1mLmFkYXB0ZXJ8fGUsdHlwZW9mIGwhPSJmdW5jdGlvbiImJihsPW8obCxmLGgpKSxsLnNob3VsZFRlc3ROZXh0U2libGluZ3MmJihoPXUoZiYmZi5jb250ZXh0fHxoLGYuYWRhcHRlcikpLEFycmF5LmlzQXJyYXkoaCk/aD1mLmFkYXB0ZXIucmVtb3ZlU3Vic2V0cyhoKTpoPWYuYWRhcHRlci5nZXRDaGlsZHJlbihoKSx2KGwsaCxmKX19ZnVuY3Rpb24gbSh2LFQpe3ZhciBsPVQuZ2V0U2libGluZ3Modik7aWYoIUFycmF5LmlzQXJyYXkobCkpcmV0dXJuW107Zm9yKGw9bC5zbGljZSgwKTtsLnNoaWZ0KCkhPT12Oyk7cmV0dXJuIGx9ZnVuY3Rpb24gdSh2LFQpe0FycmF5LmlzQXJyYXkodil8fCh2PVt2XSk7Zm9yKHZhciBsPXYuc2xpY2UoMCksaD0wLGY9di5sZW5ndGg7aDxmO2grKyl7dmFyIGc9bShsW2hdLFQpO2wucHVzaC5hcHBseShsLGcpfXJldHVybiBsfXZhciBwPWMoZnVuY3Rpb24oVCxsLGgpe3JldHVybiBUPT09bnx8IWx8fGwubGVuZ3RoPT09MD9bXTpoLmFkYXB0ZXIuZmluZEFsbChULGwpfSkseT1jKGZ1bmN0aW9uKFQsbCxoKXtyZXR1cm4gVD09PW58fCFsfHxsLmxlbmd0aD09PTA/bnVsbDpoLmFkYXB0ZXIuZmluZE9uZShULGwpfSk7ZnVuY3Rpb24gTyh2LFQsbCl7cmV0dXJuIGw9bHx8e30sbC5hZGFwdGVyPWwuYWRhcHRlcnx8ZSwodHlwZW9mIFQ9PSJmdW5jdGlvbiI/VDppKFQsbCkpKHYpfWZ1bmN0aW9uIHgodixULGwpe3JldHVybiBwKHYsVCxsKX14LmNvbXBpbGU9aSx4LmZpbHRlcnM9YS5Qc2V1ZG9zLmZpbHRlcnMseC5wc2V1ZG9zPWEuUHNldWRvcy5wc2V1ZG9zLHguc2VsZWN0QWxsPXAseC5zZWxlY3RPbmU9eSx4LmlzPU8seC5wYXJzZT1pLHguaXRlcmF0ZT1wLHguX2NvbXBpbGVVbnNhZmU9byx4Ll9jb21waWxlVG9rZW49YS5jb21waWxlVG9rZW59LGZ1bmN0aW9uKGQscix0KXt2YXIgZT1kLmV4cG9ydHM7W3QoMjU1KSx0KDI2OCksdCgyNjkpLHQoMjcwKSx0KDI3MSksdCgyNzIpXS5mb3JFYWNoKGZ1bmN0aW9uKG4pe09iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24oYSl7ZVthXT1uW2FdLmJpbmQoZSl9KX0pfSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCgyNTYpLG49dCgyNTcpLGE9ZS5pc1RhZztkLmV4cG9ydHM9e2dldElubmVySFRNTDpzLGdldE91dGVySFRNTDpuLGdldFRleHQ6aX07ZnVuY3Rpb24gcyhvLGMpe3JldHVybiBvLmNoaWxkcmVuP28uY2hpbGRyZW4ubWFwKGZ1bmN0aW9uKG0pe3JldHVybiBuKG0sYyl9KS5qb2luKCIiKToiIn1mdW5jdGlvbiBpKG8pe3JldHVybiBBcnJheS5pc0FycmF5KG8pP28ubWFwKGkpLmpvaW4oIiIpOmEobyk/by5uYW1lPT09ImJyIj9gCmA6aShvLmNoaWxkcmVuKTpvLnR5cGU9PT1lLkNEQVRBP2koby5jaGlsZHJlbik6by50eXBlPT09ZS5UZXh0P28uZGF0YToiIn19LGZ1bmN0aW9uKGQscil7ZC5leHBvcnRzPXtUZXh0OiJ0ZXh0IixEaXJlY3RpdmU6ImRpcmVjdGl2ZSIsQ29tbWVudDoiY29tbWVudCIsU2NyaXB0OiJzY3JpcHQiLFN0eWxlOiJzdHlsZSIsVGFnOiJ0YWciLENEQVRBOiJjZGF0YSIsRG9jdHlwZToiZG9jdHlwZSIsaXNUYWc6ZnVuY3Rpb24odCl7cmV0dXJuIHQudHlwZT09PSJ0YWcifHx0LnR5cGU9PT0ic2NyaXB0Inx8dC50eXBlPT09InN0eWxlIn19fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCgyNTgpLG49dCgyNTkpLGE9dCgyNjcpO2EuZWxlbWVudE5hbWVzLl9fcHJvdG9fXz1udWxsLGEuYXR0cmlidXRlTmFtZXMuX19wcm90b19fPW51bGw7dmFyIHM9e19fcHJvdG9fXzpudWxsLHN0eWxlOiEwLHNjcmlwdDohMCx4bXA6ITAsaWZyYW1lOiEwLG5vZW1iZWQ6ITAsbm9mcmFtZXM6ITAscGxhaW50ZXh0OiEwLG5vc2NyaXB0OiEwfTtmdW5jdGlvbiBpKHYsVCl7aWYodil7dmFyIGw9IiIsaDtmb3IodmFyIGYgaW4gdiloPXZbZl0sbCYmKGwrPSIgIiksVC54bWxNb2RlPT09ImZvcmVpZ24iJiYoZj1hLmF0dHJpYnV0ZU5hbWVzW2ZdfHxmKSxsKz1mLChoIT09bnVsbCYmaCE9PSIifHxULnhtbE1vZGUpJiYobCs9Jz0iJysoVC5kZWNvZGVFbnRpdGllcz9uLmVuY29kZVhNTChoKTpoLnJlcGxhY2UoL1wiL2csIiZxdW90OyIpKSsnIicpO3JldHVybiBsfX12YXIgbz17X19wcm90b19fOm51bGwsYXJlYTohMCxiYXNlOiEwLGJhc2Vmb250OiEwLGJyOiEwLGNvbDohMCxjb21tYW5kOiEwLGVtYmVkOiEwLGZyYW1lOiEwLGhyOiEwLGltZzohMCxpbnB1dDohMCxpc2luZGV4OiEwLGtleWdlbjohMCxsaW5rOiEwLG1ldGE6ITAscGFyYW06ITAsc291cmNlOiEwLHRyYWNrOiEwLHdicjohMH0sYz1kLmV4cG9ydHM9ZnVuY3Rpb24odixUKXshQXJyYXkuaXNBcnJheSh2KSYmIXYuY2hlZXJpbyYmKHY9W3ZdKSxUPVR8fHt9O2Zvcih2YXIgbD0iIixoPTA7aDx2Lmxlbmd0aDtoKyspe3ZhciBmPXZbaF07Zi50eXBlPT09InJvb3QiP2wrPWMoZi5jaGlsZHJlbixUKTplLmlzVGFnKGYpP2wrPXUoZixUKTpmLnR5cGU9PT1lLkRpcmVjdGl2ZT9sKz1wKGYpOmYudHlwZT09PWUuQ29tbWVudD9sKz14KGYpOmYudHlwZT09PWUuQ0RBVEE/bCs9TyhmKTpsKz15KGYsVCl9cmV0dXJuIGx9LG09WyJtaSIsIm1vIiwibW4iLCJtcyIsIm10ZXh0IiwiYW5ub3RhdGlvbi14bWwiLCJmb3JlaWduT2JqZWN0IiwiZGVzYyIsInRpdGxlIl07ZnVuY3Rpb24gdSh2LFQpe1QueG1sTW9kZT09PSJmb3JlaWduIiYmKHYubmFtZT1hLmVsZW1lbnROYW1lc1t2Lm5hbWVdfHx2Lm5hbWUsdi5wYXJlbnQmJm0uaW5kZXhPZih2LnBhcmVudC5uYW1lKT49MCYmKFQ9T2JqZWN0LmFzc2lnbih7fSxULHt4bWxNb2RlOiExfSkpKSwhVC54bWxNb2RlJiZbInN2ZyIsIm1hdGgiXS5pbmRleE9mKHYubmFtZSk+PTAmJihUPU9iamVjdC5hc3NpZ24oe30sVCx7eG1sTW9kZToiZm9yZWlnbiJ9KSk7dmFyIGw9IjwiK3YubmFtZSxoPWkodi5hdHRyaWJzLFQpO3JldHVybiBoJiYobCs9IiAiK2gpLFQueG1sTW9kZSYmKCF2LmNoaWxkcmVufHx2LmNoaWxkcmVuLmxlbmd0aD09PTApP2wrPSIvPiI6KGwrPSI+Iix2LmNoaWxkcmVuJiYobCs9Yyh2LmNoaWxkcmVuLFQpKSwoIW9bdi5uYW1lXXx8VC54bWxNb2RlKSYmKGwrPSI8LyIrdi5uYW1lKyI+IikpLGx9ZnVuY3Rpb24gcCh2KXtyZXR1cm4iPCIrdi5kYXRhKyI+In1mdW5jdGlvbiB5KHYsVCl7dmFyIGw9di5kYXRhfHwiIjtyZXR1cm4gVC5kZWNvZGVFbnRpdGllcyYmISh2LnBhcmVudCYmdi5wYXJlbnQubmFtZSBpbiBzKSYmKGw9bi5lbmNvZGVYTUwobCkpLGx9ZnVuY3Rpb24gTyh2KXtyZXR1cm4iPCFbQ0RBVEFbIit2LmNoaWxkcmVuWzBdLmRhdGErIl1dPiJ9ZnVuY3Rpb24geCh2KXtyZXR1cm4iPCEtLSIrdi5kYXRhKyItLT4ifX0sZnVuY3Rpb24oZCxyLHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtmdW5jdGlvbiBlKG4pe3JldHVybiBuLnR5cGU9PT0idGFnInx8bi50eXBlPT09InNjcmlwdCJ8fG4udHlwZT09PSJzdHlsZSJ9ci5pc1RhZz1lLHIuVGV4dD0idGV4dCIsci5EaXJlY3RpdmU9ImRpcmVjdGl2ZSIsci5Db21tZW50PSJjb21tZW50IixyLlNjcmlwdD0ic2NyaXB0IixyLlN0eWxlPSJzdHlsZSIsci5UYWc9InRhZyIsci5DREFUQT0iY2RhdGEiLHIuRG9jdHlwZT0iZG9jdHlwZSJ9LGZ1bmN0aW9uKGQscix0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksci5lbmNvZGU9ci5kZWNvZGVTdHJpY3Q9ci5kZWNvZGU9dm9pZCAwO3ZhciBlPXQoMjYwKSxuPXQoMjY2KTtmdW5jdGlvbiBhKG0sdSl7cmV0dXJuKCF1fHx1PD0wP2UuZGVjb2RlWE1MOmUuZGVjb2RlSFRNTCkobSl9ci5kZWNvZGU9YTtmdW5jdGlvbiBzKG0sdSl7cmV0dXJuKCF1fHx1PD0wP2UuZGVjb2RlWE1MOmUuZGVjb2RlSFRNTFN0cmljdCkobSl9ci5kZWNvZGVTdHJpY3Q9cztmdW5jdGlvbiBpKG0sdSl7cmV0dXJuKCF1fHx1PD0wP24uZW5jb2RlWE1MOm4uZW5jb2RlSFRNTCkobSl9ci5lbmNvZGU9aTt2YXIgbz10KDI2Nik7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsImVuY29kZVhNTCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG8uZW5jb2RlWE1MfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJlbmNvZGVIVE1MIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gby5lbmNvZGVIVE1MfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJlc2NhcGUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBvLmVzY2FwZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkociwiZW5jb2RlSFRNTDQiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBvLmVuY29kZUhUTUx9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsImVuY29kZUhUTUw1Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gby5lbmNvZGVIVE1MfX0pO3ZhciBjPXQoMjYwKTtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiZGVjb2RlWE1MIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYy5kZWNvZGVYTUx9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsImRlY29kZUhUTUwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBjLmRlY29kZUhUTUx9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsImRlY29kZUhUTUxTdHJpY3QiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBjLmRlY29kZUhUTUxTdHJpY3R9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsImRlY29kZUhUTUw0Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYy5kZWNvZGVIVE1MfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJkZWNvZGVIVE1MNSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGMuZGVjb2RlSFRNTH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkociwiZGVjb2RlSFRNTDRTdHJpY3QiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBjLmRlY29kZUhUTUxTdHJpY3R9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsImRlY29kZUhUTUw1U3RyaWN0Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYy5kZWNvZGVIVE1MU3RyaWN0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJkZWNvZGVYTUxTdHJpY3QiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBjLmRlY29kZVhNTH19KX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbih1KXtyZXR1cm4gdSYmdS5fX2VzTW9kdWxlP3U6e2RlZmF1bHQ6dX19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxyLmRlY29kZUhUTUw9ci5kZWNvZGVIVE1MU3RyaWN0PXIuZGVjb2RlWE1MPXZvaWQgMDt2YXIgbj1lKHQoMjYxKSksYT1lKHQoMjYyKSkscz1lKHQoMjYzKSksaT1lKHQoMjY0KSk7ci5kZWNvZGVYTUw9byhzLmRlZmF1bHQpLHIuZGVjb2RlSFRNTFN0cmljdD1vKG4uZGVmYXVsdCk7ZnVuY3Rpb24gbyh1KXt2YXIgcD1PYmplY3Qua2V5cyh1KS5qb2luKCJ8IikseT1tKHUpO3ArPSJ8I1t4WF1bXFxkYS1mQS1GXSt8I1xcZCsiO3ZhciBPPW5ldyBSZWdFeHAoIiYoPzoiK3ArIik7IiwiZyIpO3JldHVybiBmdW5jdGlvbih4KXtyZXR1cm4gU3RyaW5nKHgpLnJlcGxhY2UoTyx5KX19dmFyIGM9ZnVuY3Rpb24odSxwKXtyZXR1cm4gdTxwPzE6LTF9O3IuZGVjb2RlSFRNTD1mdW5jdGlvbigpe2Zvcih2YXIgdT1PYmplY3Qua2V5cyhhLmRlZmF1bHQpLnNvcnQoYykscD1PYmplY3Qua2V5cyhuLmRlZmF1bHQpLnNvcnQoYykseT0wLE89MDt5PHAubGVuZ3RoO3krKyl1W09dPT09cFt5XT8ocFt5XSs9Ijs/IixPKyspOnBbeV0rPSI7Ijt2YXIgeD1uZXcgUmVnRXhwKCImKD86IitwLmpvaW4oInwiKSsifCNbeFhdW1xcZGEtZkEtRl0rOz98I1xcZCs7PykiLCJnIiksdj1tKG4uZGVmYXVsdCk7ZnVuY3Rpb24gVChsKXtyZXR1cm4gbC5zdWJzdHIoLTEpIT09IjsiJiYobCs9IjsiKSx2KGwpfXJldHVybiBmdW5jdGlvbihsKXtyZXR1cm4gU3RyaW5nKGwpLnJlcGxhY2UoeCxUKX19KCk7ZnVuY3Rpb24gbSh1KXtyZXR1cm4gZnVuY3Rpb24oeSl7aWYoeS5jaGFyQXQoMSk9PT0iIyIpe3ZhciBPPXkuY2hhckF0KDIpO3JldHVybiBPPT09IlgifHxPPT09IngiP2kuZGVmYXVsdChwYXJzZUludCh5LnN1YnN0cigzKSwxNikpOmkuZGVmYXVsdChwYXJzZUludCh5LnN1YnN0cigyKSwxMCkpfXJldHVybiB1W3kuc2xpY2UoMSwtMSldfX19LGZ1bmN0aW9uKGQpe2QuZXhwb3J0cz1KU09OLnBhcnNlKCd7IkFhY3V0ZSI6IsOBIiwiYWFjdXRlIjoiw6EiLCJBYnJldmUiOiLEgiIsImFicmV2ZSI6IsSDIiwiYWMiOiLiiL4iLCJhY2QiOiLiiL8iLCJhY0UiOiLiiL7MsyIsIkFjaXJjIjoiw4IiLCJhY2lyYyI6IsOiIiwiYWN1dGUiOiLCtCIsIkFjeSI6ItCQIiwiYWN5Ijoi0LAiLCJBRWxpZyI6IsOGIiwiYWVsaWciOiLDpiIsImFmIjoi4oGhIiwiQWZyIjoi8J2UhCIsImFmciI6IvCdlJ4iLCJBZ3JhdmUiOiLDgCIsImFncmF2ZSI6IsOgIiwiYWxlZnN5bSI6IuKEtSIsImFsZXBoIjoi4oS1IiwiQWxwaGEiOiLOkSIsImFscGhhIjoizrEiLCJBbWFjciI6IsSAIiwiYW1hY3IiOiLEgSIsImFtYWxnIjoi4qi/IiwiYW1wIjoiJiIsIkFNUCI6IiYiLCJhbmRhbmQiOiLiqZUiLCJBbmQiOiLiqZMiLCJhbmQiOiLiiKciLCJhbmRkIjoi4qmcIiwiYW5kc2xvcGUiOiLiqZgiLCJhbmR2Ijoi4qmaIiwiYW5nIjoi4oigIiwiYW5nZSI6IuKmpCIsImFuZ2xlIjoi4oigIiwiYW5nbXNkYWEiOiLipqgiLCJhbmdtc2RhYiI6IuKmqSIsImFuZ21zZGFjIjoi4qaqIiwiYW5nbXNkYWQiOiLipqsiLCJhbmdtc2RhZSI6IuKmrCIsImFuZ21zZGFmIjoi4qatIiwiYW5nbXNkYWciOiLipq4iLCJhbmdtc2RhaCI6IuKmryIsImFuZ21zZCI6IuKIoSIsImFuZ3J0Ijoi4oifIiwiYW5ncnR2YiI6IuKKviIsImFuZ3J0dmJkIjoi4qadIiwiYW5nc3BoIjoi4oiiIiwiYW5nc3QiOiLDhSIsImFuZ3phcnIiOiLijbwiLCJBb2dvbiI6IsSEIiwiYW9nb24iOiLEhSIsIkFvcGYiOiLwnZS4IiwiYW9wZiI6IvCdlZIiLCJhcGFjaXIiOiLiqa8iLCJhcCI6IuKJiCIsImFwRSI6IuKpsCIsImFwZSI6IuKJiiIsImFwaWQiOiLiiYsiLCJhcG9zIjoiXCciLCJBcHBseUZ1bmN0aW9uIjoi4oGhIiwiYXBwcm94Ijoi4omIIiwiYXBwcm94ZXEiOiLiiYoiLCJBcmluZyI6IsOFIiwiYXJpbmciOiLDpSIsIkFzY3IiOiLwnZKcIiwiYXNjciI6IvCdkrYiLCJBc3NpZ24iOiLiiZQiLCJhc3QiOiIqIiwiYXN5bXAiOiLiiYgiLCJhc3ltcGVxIjoi4omNIiwiQXRpbGRlIjoiw4MiLCJhdGlsZGUiOiLDoyIsIkF1bWwiOiLDhCIsImF1bWwiOiLDpCIsImF3Y29uaW50Ijoi4oizIiwiYXdpbnQiOiLiqJEiLCJiYWNrY29uZyI6IuKJjCIsImJhY2tlcHNpbG9uIjoiz7YiLCJiYWNrcHJpbWUiOiLigLUiLCJiYWNrc2ltIjoi4oi9IiwiYmFja3NpbWVxIjoi4ouNIiwiQmFja3NsYXNoIjoi4oiWIiwiQmFydiI6IuKrpyIsImJhcnZlZSI6IuKKvSIsImJhcndlZCI6IuKMhSIsIkJhcndlZCI6IuKMhiIsImJhcndlZGdlIjoi4oyFIiwiYmJyayI6IuKOtSIsImJicmt0YnJrIjoi4o62IiwiYmNvbmciOiLiiYwiLCJCY3kiOiLQkSIsImJjeSI6ItCxIiwiYmRxdW8iOiLigJ4iLCJiZWNhdXMiOiLiiLUiLCJiZWNhdXNlIjoi4oi1IiwiQmVjYXVzZSI6IuKItSIsImJlbXB0eXYiOiLiprAiLCJiZXBzaSI6Is+2IiwiYmVybm91Ijoi4oSsIiwiQmVybm91bGxpcyI6IuKErCIsIkJldGEiOiLOkiIsImJldGEiOiLOsiIsImJldGgiOiLihLYiLCJiZXR3ZWVuIjoi4omsIiwiQmZyIjoi8J2UhSIsImJmciI6IvCdlJ8iLCJiaWdjYXAiOiLii4IiLCJiaWdjaXJjIjoi4pevIiwiYmlnY3VwIjoi4ouDIiwiYmlnb2RvdCI6IuKogCIsImJpZ29wbHVzIjoi4qiBIiwiYmlnb3RpbWVzIjoi4qiCIiwiYmlnc3FjdXAiOiLiqIYiLCJiaWdzdGFyIjoi4piFIiwiYmlndHJpYW5nbGVkb3duIjoi4pa9IiwiYmlndHJpYW5nbGV1cCI6IuKWsyIsImJpZ3VwbHVzIjoi4qiEIiwiYmlndmVlIjoi4ouBIiwiYmlnd2VkZ2UiOiLii4AiLCJia2Fyb3ciOiLipI0iLCJibGFja2xvemVuZ2UiOiLip6siLCJibGFja3NxdWFyZSI6IuKWqiIsImJsYWNrdHJpYW5nbGUiOiLilrQiLCJibGFja3RyaWFuZ2xlZG93biI6IuKWviIsImJsYWNrdHJpYW5nbGVsZWZ0Ijoi4peCIiwiYmxhY2t0cmlhbmdsZXJpZ2h0Ijoi4pa4IiwiYmxhbmsiOiLikKMiLCJibGsxMiI6IuKWkiIsImJsazE0Ijoi4paRIiwiYmxrMzQiOiLilpMiLCJibG9jayI6IuKWiCIsImJuZSI6Ij3ig6UiLCJibmVxdWl2Ijoi4omh4oOlIiwiYk5vdCI6IuKrrSIsImJub3QiOiLijJAiLCJCb3BmIjoi8J2UuSIsImJvcGYiOiLwnZWTIiwiYm90Ijoi4oqlIiwiYm90dG9tIjoi4oqlIiwiYm93dGllIjoi4ouIIiwiYm94Ym94Ijoi4qeJIiwiYm94ZGwiOiLilJAiLCJib3hkTCI6IuKVlSIsImJveERsIjoi4pWWIiwiYm94REwiOiLilZciLCJib3hkciI6IuKUjCIsImJveGRSIjoi4pWSIiwiYm94RHIiOiLilZMiLCJib3hEUiI6IuKVlCIsImJveGgiOiLilIAiLCJib3hIIjoi4pWQIiwiYm94aGQiOiLilKwiLCJib3hIZCI6IuKVpCIsImJveGhEIjoi4pWlIiwiYm94SEQiOiLilaYiLCJib3hodSI6IuKUtCIsImJveEh1Ijoi4pWnIiwiYm94aFUiOiLilagiLCJib3hIVSI6IuKVqSIsImJveG1pbnVzIjoi4oqfIiwiYm94cGx1cyI6IuKKniIsImJveHRpbWVzIjoi4oqgIiwiYm94dWwiOiLilJgiLCJib3h1TCI6IuKVmyIsImJveFVsIjoi4pWcIiwiYm94VUwiOiLilZ0iLCJib3h1ciI6IuKUlCIsImJveHVSIjoi4pWYIiwiYm94VXIiOiLilZkiLCJib3hVUiI6IuKVmiIsImJveHYiOiLilIIiLCJib3hWIjoi4pWRIiwiYm94dmgiOiLilLwiLCJib3h2SCI6IuKVqiIsImJveFZoIjoi4pWrIiwiYm94VkgiOiLilawiLCJib3h2bCI6IuKUpCIsImJveHZMIjoi4pWhIiwiYm94VmwiOiLilaIiLCJib3hWTCI6IuKVoyIsImJveHZyIjoi4pScIiwiYm94dlIiOiLilZ4iLCJib3hWciI6IuKVnyIsImJveFZSIjoi4pWgIiwiYnByaW1lIjoi4oC1IiwiYnJldmUiOiLLmCIsIkJyZXZlIjoiy5giLCJicnZiYXIiOiLCpiIsImJzY3IiOiLwnZK3IiwiQnNjciI6IuKErCIsImJzZW1pIjoi4oGPIiwiYnNpbSI6IuKIvSIsImJzaW1lIjoi4ouNIiwiYnNvbGIiOiLip4UiLCJic29sIjoiXFxcXCIsImJzb2xoc3ViIjoi4p+IIiwiYnVsbCI6IuKAoiIsImJ1bGxldCI6IuKAoiIsImJ1bXAiOiLiiY4iLCJidW1wRSI6IuKqriIsImJ1bXBlIjoi4omPIiwiQnVtcGVxIjoi4omOIiwiYnVtcGVxIjoi4omPIiwiQ2FjdXRlIjoixIYiLCJjYWN1dGUiOiLEhyIsImNhcGFuZCI6IuKphCIsImNhcGJyY3VwIjoi4qmJIiwiY2FwY2FwIjoi4qmLIiwiY2FwIjoi4oipIiwiQ2FwIjoi4ouSIiwiY2FwY3VwIjoi4qmHIiwiY2FwZG90Ijoi4qmAIiwiQ2FwaXRhbERpZmZlcmVudGlhbEQiOiLihYUiLCJjYXBzIjoi4oip77iAIiwiY2FyZXQiOiLigYEiLCJjYXJvbiI6IsuHIiwiQ2F5bGV5cyI6IuKErSIsImNjYXBzIjoi4qmNIiwiQ2Nhcm9uIjoixIwiLCJjY2Fyb24iOiLEjSIsIkNjZWRpbCI6IsOHIiwiY2NlZGlsIjoiw6ciLCJDY2lyYyI6IsSIIiwiY2NpcmMiOiLEiSIsIkNjb25pbnQiOiLiiLAiLCJjY3VwcyI6IuKpjCIsImNjdXBzc20iOiLiqZAiLCJDZG90IjoixIoiLCJjZG90IjoixIsiLCJjZWRpbCI6IsK4IiwiQ2VkaWxsYSI6IsK4IiwiY2VtcHR5diI6IuKmsiIsImNlbnQiOiLCoiIsImNlbnRlcmRvdCI6IsK3IiwiQ2VudGVyRG90IjoiwrciLCJjZnIiOiLwnZSgIiwiQ2ZyIjoi4oStIiwiQ0hjeSI6ItCnIiwiY2hjeSI6ItGHIiwiY2hlY2siOiLinJMiLCJjaGVja21hcmsiOiLinJMiLCJDaGkiOiLOpyIsImNoaSI6Is+HIiwiY2lyYyI6IsuGIiwiY2lyY2VxIjoi4omXIiwiY2lyY2xlYXJyb3dsZWZ0Ijoi4oa6IiwiY2lyY2xlYXJyb3dyaWdodCI6IuKGuyIsImNpcmNsZWRhc3QiOiLiipsiLCJjaXJjbGVkY2lyYyI6IuKKmiIsImNpcmNsZWRkYXNoIjoi4oqdIiwiQ2lyY2xlRG90Ijoi4oqZIiwiY2lyY2xlZFIiOiLCriIsImNpcmNsZWRTIjoi4pOIIiwiQ2lyY2xlTWludXMiOiLiipYiLCJDaXJjbGVQbHVzIjoi4oqVIiwiQ2lyY2xlVGltZXMiOiLiipciLCJjaXIiOiLil4siLCJjaXJFIjoi4qeDIiwiY2lyZSI6IuKJlyIsImNpcmZuaW50Ijoi4qiQIiwiY2lybWlkIjoi4quvIiwiY2lyc2NpciI6IuKngiIsIkNsb2Nrd2lzZUNvbnRvdXJJbnRlZ3JhbCI6IuKIsiIsIkNsb3NlQ3VybHlEb3VibGVRdW90ZSI6IuKAnSIsIkNsb3NlQ3VybHlRdW90ZSI6IuKAmSIsImNsdWJzIjoi4pmjIiwiY2x1YnN1aXQiOiLimaMiLCJjb2xvbiI6IjoiLCJDb2xvbiI6IuKItyIsIkNvbG9uZSI6IuKptCIsImNvbG9uZSI6IuKJlCIsImNvbG9uZXEiOiLiiZQiLCJjb21tYSI6IiwiLCJjb21tYXQiOiJAIiwiY29tcCI6IuKIgSIsImNvbXBmbiI6IuKImCIsImNvbXBsZW1lbnQiOiLiiIEiLCJjb21wbGV4ZXMiOiLihIIiLCJjb25nIjoi4omFIiwiY29uZ2RvdCI6IuKprSIsIkNvbmdydWVudCI6IuKJoSIsImNvbmludCI6IuKIriIsIkNvbmludCI6IuKIryIsIkNvbnRvdXJJbnRlZ3JhbCI6IuKIriIsImNvcGYiOiLwnZWUIiwiQ29wZiI6IuKEgiIsImNvcHJvZCI6IuKIkCIsIkNvcHJvZHVjdCI6IuKIkCIsImNvcHkiOiLCqSIsIkNPUFkiOiLCqSIsImNvcHlzciI6IuKElyIsIkNvdW50ZXJDbG9ja3dpc2VDb250b3VySW50ZWdyYWwiOiLiiLMiLCJjcmFyciI6IuKGtSIsImNyb3NzIjoi4pyXIiwiQ3Jvc3MiOiLiqK8iLCJDc2NyIjoi8J2SniIsImNzY3IiOiLwnZK4IiwiY3N1YiI6IuKrjyIsImNzdWJlIjoi4quRIiwiY3N1cCI6IuKrkCIsImNzdXBlIjoi4quSIiwiY3Rkb3QiOiLii68iLCJjdWRhcnJsIjoi4qS4IiwiY3VkYXJyciI6IuKktSIsImN1ZXByIjoi4oueIiwiY3Vlc2MiOiLii58iLCJjdWxhcnIiOiLihrYiLCJjdWxhcnJwIjoi4qS9IiwiY3VwYnJjYXAiOiLiqYgiLCJjdXBjYXAiOiLiqYYiLCJDdXBDYXAiOiLiiY0iLCJjdXAiOiLiiKoiLCJDdXAiOiLii5MiLCJjdXBjdXAiOiLiqYoiLCJjdXBkb3QiOiLiio0iLCJjdXBvciI6IuKphSIsImN1cHMiOiLiiKrvuIAiLCJjdXJhcnIiOiLihrciLCJjdXJhcnJtIjoi4qS8IiwiY3VybHllcXByZWMiOiLii54iLCJjdXJseWVxc3VjYyI6IuKLnyIsImN1cmx5dmVlIjoi4ouOIiwiY3VybHl3ZWRnZSI6IuKLjyIsImN1cnJlbiI6IsKkIiwiY3VydmVhcnJvd2xlZnQiOiLihrYiLCJjdXJ2ZWFycm93cmlnaHQiOiLihrciLCJjdXZlZSI6IuKLjiIsImN1d2VkIjoi4ouPIiwiY3djb25pbnQiOiLiiLIiLCJjd2ludCI6IuKIsSIsImN5bGN0eSI6IuKMrSIsImRhZ2dlciI6IuKAoCIsIkRhZ2dlciI6IuKAoSIsImRhbGV0aCI6IuKEuCIsImRhcnIiOiLihpMiLCJEYXJyIjoi4oahIiwiZEFyciI6IuKHkyIsImRhc2giOiLigJAiLCJEYXNodiI6IuKrpCIsImRhc2h2Ijoi4oqjIiwiZGJrYXJvdyI6IuKkjyIsImRibGFjIjoiy50iLCJEY2Fyb24iOiLEjiIsImRjYXJvbiI6IsSPIiwiRGN5Ijoi0JQiLCJkY3kiOiLQtCIsImRkYWdnZXIiOiLigKEiLCJkZGFyciI6IuKHiiIsIkREIjoi4oWFIiwiZGQiOiLihYYiLCJERG90cmFoZCI6IuKkkSIsImRkb3RzZXEiOiLiqbciLCJkZWciOiLCsCIsIkRlbCI6IuKIhyIsIkRlbHRhIjoizpQiLCJkZWx0YSI6Is60IiwiZGVtcHR5diI6IuKmsSIsImRmaXNodCI6IuKlvyIsIkRmciI6IvCdlIciLCJkZnIiOiLwnZShIiwiZEhhciI6IuKlpSIsImRoYXJsIjoi4oeDIiwiZGhhcnIiOiLih4IiLCJEaWFjcml0aWNhbEFjdXRlIjoiwrQiLCJEaWFjcml0aWNhbERvdCI6IsuZIiwiRGlhY3JpdGljYWxEb3VibGVBY3V0ZSI6IsudIiwiRGlhY3JpdGljYWxHcmF2ZSI6ImAiLCJEaWFjcml0aWNhbFRpbGRlIjoiy5wiLCJkaWFtIjoi4ouEIiwiZGlhbW9uZCI6IuKLhCIsIkRpYW1vbmQiOiLii4QiLCJkaWFtb25kc3VpdCI6IuKZpiIsImRpYW1zIjoi4pmmIiwiZGllIjoiwqgiLCJEaWZmZXJlbnRpYWxEIjoi4oWGIiwiZGlnYW1tYSI6Is+dIiwiZGlzaW4iOiLii7IiLCJkaXYiOiLDtyIsImRpdmlkZSI6IsO3IiwiZGl2aWRlb250aW1lcyI6IuKLhyIsImRpdm9ueCI6IuKLhyIsIkRKY3kiOiLQgiIsImRqY3kiOiLRkiIsImRsY29ybiI6IuKMniIsImRsY3JvcCI6IuKMjSIsImRvbGxhciI6IiQiLCJEb3BmIjoi8J2UuyIsImRvcGYiOiLwnZWVIiwiRG90IjoiwqgiLCJkb3QiOiLLmSIsIkRvdERvdCI6IuKDnCIsImRvdGVxIjoi4omQIiwiZG90ZXFkb3QiOiLiiZEiLCJEb3RFcXVhbCI6IuKJkCIsImRvdG1pbnVzIjoi4oi4IiwiZG90cGx1cyI6IuKIlCIsImRvdHNxdWFyZSI6IuKKoSIsImRvdWJsZWJhcndlZGdlIjoi4oyGIiwiRG91YmxlQ29udG91ckludGVncmFsIjoi4oivIiwiRG91YmxlRG90IjoiwqgiLCJEb3VibGVEb3duQXJyb3ciOiLih5MiLCJEb3VibGVMZWZ0QXJyb3ciOiLih5AiLCJEb3VibGVMZWZ0UmlnaHRBcnJvdyI6IuKHlCIsIkRvdWJsZUxlZnRUZWUiOiLiq6QiLCJEb3VibGVMb25nTGVmdEFycm93Ijoi4p+4IiwiRG91YmxlTG9uZ0xlZnRSaWdodEFycm93Ijoi4p+6IiwiRG91YmxlTG9uZ1JpZ2h0QXJyb3ciOiLin7kiLCJEb3VibGVSaWdodEFycm93Ijoi4oeSIiwiRG91YmxlUmlnaHRUZWUiOiLiiqgiLCJEb3VibGVVcEFycm93Ijoi4oeRIiwiRG91YmxlVXBEb3duQXJyb3ciOiLih5UiLCJEb3VibGVWZXJ0aWNhbEJhciI6IuKIpSIsIkRvd25BcnJvd0JhciI6IuKkkyIsImRvd25hcnJvdyI6IuKGkyIsIkRvd25BcnJvdyI6IuKGkyIsIkRvd25hcnJvdyI6IuKHkyIsIkRvd25BcnJvd1VwQXJyb3ciOiLih7UiLCJEb3duQnJldmUiOiLMkSIsImRvd25kb3duYXJyb3dzIjoi4oeKIiwiZG93bmhhcnBvb25sZWZ0Ijoi4oeDIiwiZG93bmhhcnBvb25yaWdodCI6IuKHgiIsIkRvd25MZWZ0UmlnaHRWZWN0b3IiOiLipZAiLCJEb3duTGVmdFRlZVZlY3RvciI6IuKlniIsIkRvd25MZWZ0VmVjdG9yQmFyIjoi4qWWIiwiRG93bkxlZnRWZWN0b3IiOiLihr0iLCJEb3duUmlnaHRUZWVWZWN0b3IiOiLipZ8iLCJEb3duUmlnaHRWZWN0b3JCYXIiOiLipZciLCJEb3duUmlnaHRWZWN0b3IiOiLih4EiLCJEb3duVGVlQXJyb3ciOiLihqciLCJEb3duVGVlIjoi4oqkIiwiZHJia2Fyb3ciOiLipJAiLCJkcmNvcm4iOiLijJ8iLCJkcmNyb3AiOiLijIwiLCJEc2NyIjoi8J2SnyIsImRzY3IiOiLwnZK5IiwiRFNjeSI6ItCFIiwiZHNjeSI6ItGVIiwiZHNvbCI6IuKntiIsIkRzdHJvayI6IsSQIiwiZHN0cm9rIjoixJEiLCJkdGRvdCI6IuKLsSIsImR0cmkiOiLilr8iLCJkdHJpZiI6IuKWviIsImR1YXJyIjoi4oe1IiwiZHVoYXIiOiLipa8iLCJkd2FuZ2xlIjoi4qamIiwiRFpjeSI6ItCPIiwiZHpjeSI6ItGfIiwiZHppZ3JhcnIiOiLin78iLCJFYWN1dGUiOiLDiSIsImVhY3V0ZSI6IsOpIiwiZWFzdGVyIjoi4qmuIiwiRWNhcm9uIjoixJoiLCJlY2Fyb24iOiLEmyIsIkVjaXJjIjoiw4oiLCJlY2lyYyI6IsOqIiwiZWNpciI6IuKJliIsImVjb2xvbiI6IuKJlSIsIkVjeSI6ItCtIiwiZWN5Ijoi0Y0iLCJlRERvdCI6IuKptyIsIkVkb3QiOiLEliIsImVkb3QiOiLElyIsImVEb3QiOiLiiZEiLCJlZSI6IuKFhyIsImVmRG90Ijoi4omSIiwiRWZyIjoi8J2UiCIsImVmciI6IvCdlKIiLCJlZyI6IuKqmiIsIkVncmF2ZSI6IsOIIiwiZWdyYXZlIjoiw6giLCJlZ3MiOiLiqpYiLCJlZ3Nkb3QiOiLiqpgiLCJlbCI6IuKqmSIsIkVsZW1lbnQiOiLiiIgiLCJlbGludGVycyI6IuKPpyIsImVsbCI6IuKEkyIsImVscyI6IuKqlSIsImVsc2RvdCI6IuKqlyIsIkVtYWNyIjoixJIiLCJlbWFjciI6IsSTIiwiZW1wdHkiOiLiiIUiLCJlbXB0eXNldCI6IuKIhSIsIkVtcHR5U21hbGxTcXVhcmUiOiLil7siLCJlbXB0eXYiOiLiiIUiLCJFbXB0eVZlcnlTbWFsbFNxdWFyZSI6IuKWqyIsImVtc3AxMyI6IuKAhCIsImVtc3AxNCI6IuKAhSIsImVtc3AiOiLigIMiLCJFTkciOiLFiiIsImVuZyI6IsWLIiwiZW5zcCI6IuKAgiIsIkVvZ29uIjoixJgiLCJlb2dvbiI6IsSZIiwiRW9wZiI6IvCdlLwiLCJlb3BmIjoi8J2VliIsImVwYXIiOiLii5UiLCJlcGFyc2wiOiLip6MiLCJlcGx1cyI6IuKpsSIsImVwc2kiOiLOtSIsIkVwc2lsb24iOiLOlSIsImVwc2lsb24iOiLOtSIsImVwc2l2Ijoiz7UiLCJlcWNpcmMiOiLiiZYiLCJlcWNvbG9uIjoi4omVIiwiZXFzaW0iOiLiiYIiLCJlcXNsYW50Z3RyIjoi4qqWIiwiZXFzbGFudGxlc3MiOiLiqpUiLCJFcXVhbCI6IuKptSIsImVxdWFscyI6Ij0iLCJFcXVhbFRpbGRlIjoi4omCIiwiZXF1ZXN0Ijoi4omfIiwiRXF1aWxpYnJpdW0iOiLih4wiLCJlcXVpdiI6IuKJoSIsImVxdWl2REQiOiLiqbgiLCJlcXZwYXJzbCI6IuKnpSIsImVyYXJyIjoi4qWxIiwiZXJEb3QiOiLiiZMiLCJlc2NyIjoi4oSvIiwiRXNjciI6IuKEsCIsImVzZG90Ijoi4omQIiwiRXNpbSI6IuKpsyIsImVzaW0iOiLiiYIiLCJFdGEiOiLOlyIsImV0YSI6Is63IiwiRVRIIjoiw5AiLCJldGgiOiLDsCIsIkV1bWwiOiLDiyIsImV1bWwiOiLDqyIsImV1cm8iOiLigqwiLCJleGNsIjoiISIsImV4aXN0Ijoi4oiDIiwiRXhpc3RzIjoi4oiDIiwiZXhwZWN0YXRpb24iOiLihLAiLCJleHBvbmVudGlhbGUiOiLihYciLCJFeHBvbmVudGlhbEUiOiLihYciLCJmYWxsaW5nZG90c2VxIjoi4omSIiwiRmN5Ijoi0KQiLCJmY3kiOiLRhCIsImZlbWFsZSI6IuKZgCIsImZmaWxpZyI6Iu+sgyIsImZmbGlnIjoi76yAIiwiZmZsbGlnIjoi76yEIiwiRmZyIjoi8J2UiSIsImZmciI6IvCdlKMiLCJmaWxpZyI6Iu+sgSIsIkZpbGxlZFNtYWxsU3F1YXJlIjoi4pe8IiwiRmlsbGVkVmVyeVNtYWxsU3F1YXJlIjoi4paqIiwiZmpsaWciOiJmaiIsImZsYXQiOiLima0iLCJmbGxpZyI6Iu+sgiIsImZsdG5zIjoi4paxIiwiZm5vZiI6IsaSIiwiRm9wZiI6IvCdlL0iLCJmb3BmIjoi8J2VlyIsImZvcmFsbCI6IuKIgCIsIkZvckFsbCI6IuKIgCIsImZvcmsiOiLii5QiLCJmb3JrdiI6IuKrmSIsIkZvdXJpZXJ0cmYiOiLihLEiLCJmcGFydGludCI6IuKojSIsImZyYWMxMiI6IsK9IiwiZnJhYzEzIjoi4oWTIiwiZnJhYzE0IjoiwrwiLCJmcmFjMTUiOiLihZUiLCJmcmFjMTYiOiLihZkiLCJmcmFjMTgiOiLihZsiLCJmcmFjMjMiOiLihZQiLCJmcmFjMjUiOiLihZYiLCJmcmFjMzQiOiLCviIsImZyYWMzNSI6IuKFlyIsImZyYWMzOCI6IuKFnCIsImZyYWM0NSI6IuKFmCIsImZyYWM1NiI6IuKFmiIsImZyYWM1OCI6IuKFnSIsImZyYWM3OCI6IuKFniIsImZyYXNsIjoi4oGEIiwiZnJvd24iOiLijKIiLCJmc2NyIjoi8J2SuyIsIkZzY3IiOiLihLEiLCJnYWN1dGUiOiLHtSIsIkdhbW1hIjoizpMiLCJnYW1tYSI6Is6zIiwiR2FtbWFkIjoiz5wiLCJnYW1tYWQiOiLPnSIsImdhcCI6IuKqhiIsIkdicmV2ZSI6IsSeIiwiZ2JyZXZlIjoixJ8iLCJHY2VkaWwiOiLEoiIsIkdjaXJjIjoixJwiLCJnY2lyYyI6IsSdIiwiR2N5Ijoi0JMiLCJnY3kiOiLQsyIsIkdkb3QiOiLEoCIsImdkb3QiOiLEoSIsImdlIjoi4omlIiwiZ0UiOiLiiaciLCJnRWwiOiLiqowiLCJnZWwiOiLii5siLCJnZXEiOiLiiaUiLCJnZXFxIjoi4omnIiwiZ2Vxc2xhbnQiOiLiqb4iLCJnZXNjYyI6IuKqqSIsImdlcyI6IuKpviIsImdlc2RvdCI6IuKqgCIsImdlc2RvdG8iOiLiqoIiLCJnZXNkb3RvbCI6IuKqhCIsImdlc2wiOiLii5vvuIAiLCJnZXNsZXMiOiLiqpQiLCJHZnIiOiLwnZSKIiwiZ2ZyIjoi8J2UpCIsImdnIjoi4omrIiwiR2ciOiLii5kiLCJnZ2ciOiLii5kiLCJnaW1lbCI6IuKEtyIsIkdKY3kiOiLQgyIsImdqY3kiOiLRkyIsImdsYSI6IuKqpSIsImdsIjoi4om3IiwiZ2xFIjoi4qqSIiwiZ2xqIjoi4qqkIiwiZ25hcCI6IuKqiiIsImduYXBwcm94Ijoi4qqKIiwiZ25lIjoi4qqIIiwiZ25FIjoi4ompIiwiZ25lcSI6IuKqiCIsImduZXFxIjoi4ompIiwiZ25zaW0iOiLii6ciLCJHb3BmIjoi8J2UviIsImdvcGYiOiLwnZWYIiwiZ3JhdmUiOiJgIiwiR3JlYXRlckVxdWFsIjoi4omlIiwiR3JlYXRlckVxdWFsTGVzcyI6IuKLmyIsIkdyZWF0ZXJGdWxsRXF1YWwiOiLiiaciLCJHcmVhdGVyR3JlYXRlciI6IuKqoiIsIkdyZWF0ZXJMZXNzIjoi4om3IiwiR3JlYXRlclNsYW50RXF1YWwiOiLiqb4iLCJHcmVhdGVyVGlsZGUiOiLiibMiLCJHc2NyIjoi8J2SoiIsImdzY3IiOiLihIoiLCJnc2ltIjoi4omzIiwiZ3NpbWUiOiLiqo4iLCJnc2ltbCI6IuKqkCIsImd0Y2MiOiLiqqciLCJndGNpciI6IuKpuiIsImd0IjoiPiIsIkdUIjoiPiIsIkd0Ijoi4omrIiwiZ3Rkb3QiOiLii5ciLCJndGxQYXIiOiLippUiLCJndHF1ZXN0Ijoi4qm8IiwiZ3RyYXBwcm94Ijoi4qqGIiwiZ3RyYXJyIjoi4qW4IiwiZ3RyZG90Ijoi4ouXIiwiZ3RyZXFsZXNzIjoi4oubIiwiZ3RyZXFxbGVzcyI6IuKqjCIsImd0cmxlc3MiOiLiibciLCJndHJzaW0iOiLiibMiLCJndmVydG5lcXEiOiLiianvuIAiLCJndm5FIjoi4omp77iAIiwiSGFjZWsiOiLLhyIsImhhaXJzcCI6IuKAiiIsImhhbGYiOiLCvSIsImhhbWlsdCI6IuKEiyIsIkhBUkRjeSI6ItCqIiwiaGFyZGN5Ijoi0YoiLCJoYXJyY2lyIjoi4qWIIiwiaGFyciI6IuKGlCIsImhBcnIiOiLih5QiLCJoYXJydyI6IuKGrSIsIkhhdCI6Il4iLCJoYmFyIjoi4oSPIiwiSGNpcmMiOiLEpCIsImhjaXJjIjoixKUiLCJoZWFydHMiOiLimaUiLCJoZWFydHN1aXQiOiLimaUiLCJoZWxsaXAiOiLigKYiLCJoZXJjb24iOiLiirkiLCJoZnIiOiLwnZSlIiwiSGZyIjoi4oSMIiwiSGlsYmVydFNwYWNlIjoi4oSLIiwiaGtzZWFyb3ciOiLipKUiLCJoa3N3YXJvdyI6IuKkpiIsImhvYXJyIjoi4oe/IiwiaG9tdGh0Ijoi4oi7IiwiaG9va2xlZnRhcnJvdyI6IuKGqSIsImhvb2tyaWdodGFycm93Ijoi4oaqIiwiaG9wZiI6IvCdlZkiLCJIb3BmIjoi4oSNIiwiaG9yYmFyIjoi4oCVIiwiSG9yaXpvbnRhbExpbmUiOiLilIAiLCJoc2NyIjoi8J2SvSIsIkhzY3IiOiLihIsiLCJoc2xhc2giOiLihI8iLCJIc3Ryb2siOiLEpiIsImhzdHJvayI6IsSnIiwiSHVtcERvd25IdW1wIjoi4omOIiwiSHVtcEVxdWFsIjoi4omPIiwiaHlidWxsIjoi4oGDIiwiaHlwaGVuIjoi4oCQIiwiSWFjdXRlIjoiw40iLCJpYWN1dGUiOiLDrSIsImljIjoi4oGjIiwiSWNpcmMiOiLDjiIsImljaXJjIjoiw64iLCJJY3kiOiLQmCIsImljeSI6ItC4IiwiSWRvdCI6IsSwIiwiSUVjeSI6ItCVIiwiaWVjeSI6ItC1IiwiaWV4Y2wiOiLCoSIsImlmZiI6IuKHlCIsImlmciI6IvCdlKYiLCJJZnIiOiLihJEiLCJJZ3JhdmUiOiLDjCIsImlncmF2ZSI6IsOsIiwiaWkiOiLihYgiLCJpaWlpbnQiOiLiqIwiLCJpaWludCI6IuKIrSIsImlpbmZpbiI6IuKnnCIsImlpb3RhIjoi4oSpIiwiSUpsaWciOiLEsiIsImlqbGlnIjoixLMiLCJJbWFjciI6IsSqIiwiaW1hY3IiOiLEqyIsImltYWdlIjoi4oSRIiwiSW1hZ2luYXJ5SSI6IuKFiCIsImltYWdsaW5lIjoi4oSQIiwiaW1hZ3BhcnQiOiLihJEiLCJpbWF0aCI6IsSxIiwiSW0iOiLihJEiLCJpbW9mIjoi4oq3IiwiaW1wZWQiOiLGtSIsIkltcGxpZXMiOiLih5IiLCJpbmNhcmUiOiLihIUiLCJpbiI6IuKIiCIsImluZmluIjoi4oieIiwiaW5maW50aWUiOiLip50iLCJpbm9kb3QiOiLEsSIsImludGNhbCI6IuKKuiIsImludCI6IuKIqyIsIkludCI6IuKIrCIsImludGVnZXJzIjoi4oSkIiwiSW50ZWdyYWwiOiLiiKsiLCJpbnRlcmNhbCI6IuKKuiIsIkludGVyc2VjdGlvbiI6IuKLgiIsImludGxhcmhrIjoi4qiXIiwiaW50cHJvZCI6IuKovCIsIkludmlzaWJsZUNvbW1hIjoi4oGjIiwiSW52aXNpYmxlVGltZXMiOiLigaIiLCJJT2N5Ijoi0IEiLCJpb2N5Ijoi0ZEiLCJJb2dvbiI6IsSuIiwiaW9nb24iOiLEryIsIklvcGYiOiLwnZWAIiwiaW9wZiI6IvCdlZoiLCJJb3RhIjoizpkiLCJpb3RhIjoizrkiLCJpcHJvZCI6IuKovCIsImlxdWVzdCI6IsK/IiwiaXNjciI6IvCdkr4iLCJJc2NyIjoi4oSQIiwiaXNpbiI6IuKIiCIsImlzaW5kb3QiOiLii7UiLCJpc2luRSI6IuKLuSIsImlzaW5zIjoi4ou0IiwiaXNpbnN2Ijoi4ouzIiwiaXNpbnYiOiLiiIgiLCJpdCI6IuKBoiIsIkl0aWxkZSI6IsSoIiwiaXRpbGRlIjoixKkiLCJJdWtjeSI6ItCGIiwiaXVrY3kiOiLRliIsIkl1bWwiOiLDjyIsIml1bWwiOiLDryIsIkpjaXJjIjoixLQiLCJqY2lyYyI6IsS1IiwiSmN5Ijoi0JkiLCJqY3kiOiLQuSIsIkpmciI6IvCdlI0iLCJqZnIiOiLwnZSnIiwiam1hdGgiOiLItyIsIkpvcGYiOiLwnZWBIiwiam9wZiI6IvCdlZsiLCJKc2NyIjoi8J2SpSIsImpzY3IiOiLwnZK/IiwiSnNlcmN5Ijoi0IgiLCJqc2VyY3kiOiLRmCIsIkp1a2N5Ijoi0IQiLCJqdWtjeSI6ItGUIiwiS2FwcGEiOiLOmiIsImthcHBhIjoizroiLCJrYXBwYXYiOiLPsCIsIktjZWRpbCI6IsS2Iiwia2NlZGlsIjoixLciLCJLY3kiOiLQmiIsImtjeSI6ItC6IiwiS2ZyIjoi8J2UjiIsImtmciI6IvCdlKgiLCJrZ3JlZW4iOiLEuCIsIktIY3kiOiLQpSIsImtoY3kiOiLRhSIsIktKY3kiOiLQjCIsImtqY3kiOiLRnCIsIktvcGYiOiLwnZWCIiwia29wZiI6IvCdlZwiLCJLc2NyIjoi8J2SpiIsImtzY3IiOiLwnZOAIiwibEFhcnIiOiLih5oiLCJMYWN1dGUiOiLEuSIsImxhY3V0ZSI6IsS6IiwibGFlbXB0eXYiOiLiprQiLCJsYWdyYW4iOiLihJIiLCJMYW1iZGEiOiLOmyIsImxhbWJkYSI6Is67IiwibGFuZyI6IuKfqCIsIkxhbmciOiLin6oiLCJsYW5nZCI6IuKmkSIsImxhbmdsZSI6IuKfqCIsImxhcCI6IuKqhSIsIkxhcGxhY2V0cmYiOiLihJIiLCJsYXF1byI6IsKrIiwibGFycmIiOiLih6QiLCJsYXJyYmZzIjoi4qSfIiwibGFyciI6IuKGkCIsIkxhcnIiOiLihp4iLCJsQXJyIjoi4oeQIiwibGFycmZzIjoi4qSdIiwibGFycmhrIjoi4oapIiwibGFycmxwIjoi4oarIiwibGFycnBsIjoi4qS5IiwibGFycnNpbSI6IuKlsyIsImxhcnJ0bCI6IuKGoiIsImxhdGFpbCI6IuKkmSIsImxBdGFpbCI6IuKkmyIsImxhdCI6IuKqqyIsImxhdGUiOiLiqq0iLCJsYXRlcyI6IuKqre+4gCIsImxiYXJyIjoi4qSMIiwibEJhcnIiOiLipI4iLCJsYmJyayI6IuKdsiIsImxicmFjZSI6InsiLCJsYnJhY2siOiJbIiwibGJya2UiOiLiposiLCJsYnJrc2xkIjoi4qaPIiwibGJya3NsdSI6IuKmjSIsIkxjYXJvbiI6IsS9IiwibGNhcm9uIjoixL4iLCJMY2VkaWwiOiLEuyIsImxjZWRpbCI6IsS8IiwibGNlaWwiOiLijIgiLCJsY3ViIjoieyIsIkxjeSI6ItCbIiwibGN5Ijoi0LsiLCJsZGNhIjoi4qS2IiwibGRxdW8iOiLigJwiLCJsZHF1b3IiOiLigJ4iLCJsZHJkaGFyIjoi4qWnIiwibGRydXNoYXIiOiLipYsiLCJsZHNoIjoi4oayIiwibGUiOiLiiaQiLCJsRSI6IuKJpiIsIkxlZnRBbmdsZUJyYWNrZXQiOiLin6giLCJMZWZ0QXJyb3dCYXIiOiLih6QiLCJsZWZ0YXJyb3ciOiLihpAiLCJMZWZ0QXJyb3ciOiLihpAiLCJMZWZ0YXJyb3ciOiLih5AiLCJMZWZ0QXJyb3dSaWdodEFycm93Ijoi4oeGIiwibGVmdGFycm93dGFpbCI6IuKGoiIsIkxlZnRDZWlsaW5nIjoi4oyIIiwiTGVmdERvdWJsZUJyYWNrZXQiOiLin6YiLCJMZWZ0RG93blRlZVZlY3RvciI6IuKloSIsIkxlZnREb3duVmVjdG9yQmFyIjoi4qWZIiwiTGVmdERvd25WZWN0b3IiOiLih4MiLCJMZWZ0Rmxvb3IiOiLijIoiLCJsZWZ0aGFycG9vbmRvd24iOiLihr0iLCJsZWZ0aGFycG9vbnVwIjoi4oa8IiwibGVmdGxlZnRhcnJvd3MiOiLih4ciLCJsZWZ0cmlnaHRhcnJvdyI6IuKGlCIsIkxlZnRSaWdodEFycm93Ijoi4oaUIiwiTGVmdHJpZ2h0YXJyb3ciOiLih5QiLCJsZWZ0cmlnaHRhcnJvd3MiOiLih4YiLCJsZWZ0cmlnaHRoYXJwb29ucyI6IuKHiyIsImxlZnRyaWdodHNxdWlnYXJyb3ciOiLihq0iLCJMZWZ0UmlnaHRWZWN0b3IiOiLipY4iLCJMZWZ0VGVlQXJyb3ciOiLihqQiLCJMZWZ0VGVlIjoi4oqjIiwiTGVmdFRlZVZlY3RvciI6IuKlmiIsImxlZnR0aHJlZXRpbWVzIjoi4ouLIiwiTGVmdFRyaWFuZ2xlQmFyIjoi4qePIiwiTGVmdFRyaWFuZ2xlIjoi4oqyIiwiTGVmdFRyaWFuZ2xlRXF1YWwiOiLiirQiLCJMZWZ0VXBEb3duVmVjdG9yIjoi4qWRIiwiTGVmdFVwVGVlVmVjdG9yIjoi4qWgIiwiTGVmdFVwVmVjdG9yQmFyIjoi4qWYIiwiTGVmdFVwVmVjdG9yIjoi4oa/IiwiTGVmdFZlY3RvckJhciI6IuKlkiIsIkxlZnRWZWN0b3IiOiLihrwiLCJsRWciOiLiqosiLCJsZWciOiLii5oiLCJsZXEiOiLiiaQiLCJsZXFxIjoi4ommIiwibGVxc2xhbnQiOiLiqb0iLCJsZXNjYyI6IuKqqCIsImxlcyI6IuKpvSIsImxlc2RvdCI6IuKpvyIsImxlc2RvdG8iOiLiqoEiLCJsZXNkb3RvciI6IuKqgyIsImxlc2ciOiLii5rvuIAiLCJsZXNnZXMiOiLiqpMiLCJsZXNzYXBwcm94Ijoi4qqFIiwibGVzc2RvdCI6IuKLliIsImxlc3NlcWd0ciI6IuKLmiIsImxlc3NlcXFndHIiOiLiqosiLCJMZXNzRXF1YWxHcmVhdGVyIjoi4ouaIiwiTGVzc0Z1bGxFcXVhbCI6IuKJpiIsIkxlc3NHcmVhdGVyIjoi4om2IiwibGVzc2d0ciI6IuKJtiIsIkxlc3NMZXNzIjoi4qqhIiwibGVzc3NpbSI6IuKJsiIsIkxlc3NTbGFudEVxdWFsIjoi4qm9IiwiTGVzc1RpbGRlIjoi4omyIiwibGZpc2h0Ijoi4qW8IiwibGZsb29yIjoi4oyKIiwiTGZyIjoi8J2UjyIsImxmciI6IvCdlKkiLCJsZyI6IuKJtiIsImxnRSI6IuKqkSIsImxIYXIiOiLipaIiLCJsaGFyZCI6IuKGvSIsImxoYXJ1Ijoi4oa8IiwibGhhcnVsIjoi4qWqIiwibGhibGsiOiLiloQiLCJMSmN5Ijoi0IkiLCJsamN5Ijoi0ZkiLCJsbGFyciI6IuKHhyIsImxsIjoi4omqIiwiTGwiOiLii5giLCJsbGNvcm5lciI6IuKMniIsIkxsZWZ0YXJyb3ciOiLih5oiLCJsbGhhcmQiOiLipasiLCJsbHRyaSI6IuKXuiIsIkxtaWRvdCI6IsS/IiwibG1pZG90IjoixYAiLCJsbW91c3RhY2hlIjoi4o6wIiwibG1vdXN0Ijoi4o6wIiwibG5hcCI6IuKqiSIsImxuYXBwcm94Ijoi4qqJIiwibG5lIjoi4qqHIiwibG5FIjoi4omoIiwibG5lcSI6IuKqhyIsImxuZXFxIjoi4omoIiwibG5zaW0iOiLii6YiLCJsb2FuZyI6IuKfrCIsImxvYXJyIjoi4oe9IiwibG9icmsiOiLin6YiLCJsb25nbGVmdGFycm93Ijoi4p+1IiwiTG9uZ0xlZnRBcnJvdyI6IuKftSIsIkxvbmdsZWZ0YXJyb3ciOiLin7giLCJsb25nbGVmdHJpZ2h0YXJyb3ciOiLin7ciLCJMb25nTGVmdFJpZ2h0QXJyb3ciOiLin7ciLCJMb25nbGVmdHJpZ2h0YXJyb3ciOiLin7oiLCJsb25nbWFwc3RvIjoi4p+8IiwibG9uZ3JpZ2h0YXJyb3ciOiLin7YiLCJMb25nUmlnaHRBcnJvdyI6IuKftiIsIkxvbmdyaWdodGFycm93Ijoi4p+5IiwibG9vcGFycm93bGVmdCI6IuKGqyIsImxvb3BhcnJvd3JpZ2h0Ijoi4oasIiwibG9wYXIiOiLipoUiLCJMb3BmIjoi8J2VgyIsImxvcGYiOiLwnZWdIiwibG9wbHVzIjoi4qitIiwibG90aW1lcyI6IuKotCIsImxvd2FzdCI6IuKIlyIsImxvd2JhciI6Il8iLCJMb3dlckxlZnRBcnJvdyI6IuKGmSIsIkxvd2VyUmlnaHRBcnJvdyI6IuKGmCIsImxveiI6IuKXiiIsImxvemVuZ2UiOiLil4oiLCJsb3pmIjoi4qerIiwibHBhciI6IigiLCJscGFybHQiOiLippMiLCJscmFyciI6IuKHhiIsImxyY29ybmVyIjoi4oyfIiwibHJoYXIiOiLih4siLCJscmhhcmQiOiLipa0iLCJscm0iOiLigI4iLCJscnRyaSI6IuKKvyIsImxzYXF1byI6IuKAuSIsImxzY3IiOiLwnZOBIiwiTHNjciI6IuKEkiIsImxzaCI6IuKGsCIsIkxzaCI6IuKGsCIsImxzaW0iOiLiibIiLCJsc2ltZSI6IuKqjSIsImxzaW1nIjoi4qqPIiwibHNxYiI6IlsiLCJsc3F1byI6IuKAmCIsImxzcXVvciI6IuKAmiIsIkxzdHJvayI6IsWBIiwibHN0cm9rIjoixYIiLCJsdGNjIjoi4qqmIiwibHRjaXIiOiLiqbkiLCJsdCI6IjwiLCJMVCI6IjwiLCJMdCI6IuKJqiIsImx0ZG90Ijoi4ouWIiwibHRocmVlIjoi4ouLIiwibHRpbWVzIjoi4ouJIiwibHRsYXJyIjoi4qW2IiwibHRxdWVzdCI6IuKpuyIsImx0cmkiOiLil4MiLCJsdHJpZSI6IuKKtCIsImx0cmlmIjoi4peCIiwibHRyUGFyIjoi4qaWIiwibHVyZHNoYXIiOiLipYoiLCJsdXJ1aGFyIjoi4qWmIiwibHZlcnRuZXFxIjoi4omo77iAIiwibHZuRSI6IuKJqO+4gCIsIm1hY3IiOiLCryIsIm1hbGUiOiLimYIiLCJtYWx0Ijoi4pygIiwibWFsdGVzZSI6IuKcoCIsIk1hcCI6IuKkhSIsIm1hcCI6IuKGpiIsIm1hcHN0byI6IuKGpiIsIm1hcHN0b2Rvd24iOiLihqciLCJtYXBzdG9sZWZ0Ijoi4oakIiwibWFwc3RvdXAiOiLihqUiLCJtYXJrZXIiOiLilq4iLCJtY29tbWEiOiLiqKkiLCJNY3kiOiLQnCIsIm1jeSI6ItC8IiwibWRhc2giOiLigJQiLCJtRERvdCI6IuKIuiIsIm1lYXN1cmVkYW5nbGUiOiLiiKEiLCJNZWRpdW1TcGFjZSI6IuKBnyIsIk1lbGxpbnRyZiI6IuKEsyIsIk1mciI6IvCdlJAiLCJtZnIiOiLwnZSqIiwibWhvIjoi4oSnIiwibWljcm8iOiLCtSIsIm1pZGFzdCI6IioiLCJtaWRjaXIiOiLiq7AiLCJtaWQiOiLiiKMiLCJtaWRkb3QiOiLCtyIsIm1pbnVzYiI6IuKKnyIsIm1pbnVzIjoi4oiSIiwibWludXNkIjoi4oi4IiwibWludXNkdSI6IuKoqiIsIk1pbnVzUGx1cyI6IuKIkyIsIm1sY3AiOiLiq5siLCJtbGRyIjoi4oCmIiwibW5wbHVzIjoi4oiTIiwibW9kZWxzIjoi4oqnIiwiTW9wZiI6IvCdlYQiLCJtb3BmIjoi8J2VniIsIm1wIjoi4oiTIiwibXNjciI6IvCdk4IiLCJNc2NyIjoi4oSzIiwibXN0cG9zIjoi4oi+IiwiTXUiOiLOnCIsIm11IjoizrwiLCJtdWx0aW1hcCI6IuKKuCIsIm11bWFwIjoi4oq4IiwibmFibGEiOiLiiIciLCJOYWN1dGUiOiLFgyIsIm5hY3V0ZSI6IsWEIiwibmFuZyI6IuKIoOKDkiIsIm5hcCI6IuKJiSIsIm5hcEUiOiLiqbDMuCIsIm5hcGlkIjoi4omLzLgiLCJuYXBvcyI6IsWJIiwibmFwcHJveCI6IuKJiSIsIm5hdHVyYWwiOiLima4iLCJuYXR1cmFscyI6IuKElSIsIm5hdHVyIjoi4pmuIiwibmJzcCI6IsKgIiwibmJ1bXAiOiLiiY7MuCIsIm5idW1wZSI6IuKJj8y4IiwibmNhcCI6IuKpgyIsIk5jYXJvbiI6IsWHIiwibmNhcm9uIjoixYgiLCJOY2VkaWwiOiLFhSIsIm5jZWRpbCI6IsWGIiwibmNvbmciOiLiiYciLCJuY29uZ2RvdCI6IuKprcy4IiwibmN1cCI6IuKpgiIsIk5jeSI6ItCdIiwibmN5Ijoi0L0iLCJuZGFzaCI6IuKAkyIsIm5lYXJoayI6IuKkpCIsIm5lYXJyIjoi4oaXIiwibmVBcnIiOiLih5ciLCJuZWFycm93Ijoi4oaXIiwibmUiOiLiiaAiLCJuZWRvdCI6IuKJkMy4IiwiTmVnYXRpdmVNZWRpdW1TcGFjZSI6IuKAiyIsIk5lZ2F0aXZlVGhpY2tTcGFjZSI6IuKAiyIsIk5lZ2F0aXZlVGhpblNwYWNlIjoi4oCLIiwiTmVnYXRpdmVWZXJ5VGhpblNwYWNlIjoi4oCLIiwibmVxdWl2Ijoi4omiIiwibmVzZWFyIjoi4qSoIiwibmVzaW0iOiLiiYLMuCIsIk5lc3RlZEdyZWF0ZXJHcmVhdGVyIjoi4omrIiwiTmVzdGVkTGVzc0xlc3MiOiLiiaoiLCJOZXdMaW5lIjoiXFxuIiwibmV4aXN0Ijoi4oiEIiwibmV4aXN0cyI6IuKIhCIsIk5mciI6IvCdlJEiLCJuZnIiOiLwnZSrIiwibmdFIjoi4omnzLgiLCJuZ2UiOiLiibEiLCJuZ2VxIjoi4omxIiwibmdlcXEiOiLiiafMuCIsIm5nZXFzbGFudCI6IuKpvsy4IiwibmdlcyI6IuKpvsy4IiwibkdnIjoi4ouZzLgiLCJuZ3NpbSI6IuKJtSIsIm5HdCI6IuKJq+KDkiIsIm5ndCI6IuKJryIsIm5ndHIiOiLiia8iLCJuR3R2Ijoi4omrzLgiLCJuaGFyciI6IuKGriIsIm5oQXJyIjoi4oeOIiwibmhwYXIiOiLiq7IiLCJuaSI6IuKIiyIsIm5pcyI6IuKLvCIsIm5pc2QiOiLii7oiLCJuaXYiOiLiiIsiLCJOSmN5Ijoi0IoiLCJuamN5Ijoi0ZoiLCJubGFyciI6IuKGmiIsIm5sQXJyIjoi4oeNIiwibmxkciI6IuKApSIsIm5sRSI6IuKJpsy4IiwibmxlIjoi4omwIiwibmxlZnRhcnJvdyI6IuKGmiIsIm5MZWZ0YXJyb3ciOiLih40iLCJubGVmdHJpZ2h0YXJyb3ciOiLihq4iLCJuTGVmdHJpZ2h0YXJyb3ciOiLih44iLCJubGVxIjoi4omwIiwibmxlcXEiOiLiiabMuCIsIm5sZXFzbGFudCI6IuKpvcy4IiwibmxlcyI6IuKpvcy4Iiwibmxlc3MiOiLiia4iLCJuTGwiOiLii5jMuCIsIm5sc2ltIjoi4om0Iiwibkx0Ijoi4omq4oOSIiwibmx0Ijoi4omuIiwibmx0cmkiOiLii6oiLCJubHRyaWUiOiLii6wiLCJuTHR2Ijoi4omqzLgiLCJubWlkIjoi4oikIiwiTm9CcmVhayI6IuKBoCIsIk5vbkJyZWFraW5nU3BhY2UiOiLCoCIsIm5vcGYiOiLwnZWfIiwiTm9wZiI6IuKElSIsIk5vdCI6IuKrrCIsIm5vdCI6IsKsIiwiTm90Q29uZ3J1ZW50Ijoi4omiIiwiTm90Q3VwQ2FwIjoi4omtIiwiTm90RG91YmxlVmVydGljYWxCYXIiOiLiiKYiLCJOb3RFbGVtZW50Ijoi4oiJIiwiTm90RXF1YWwiOiLiiaAiLCJOb3RFcXVhbFRpbGRlIjoi4omCzLgiLCJOb3RFeGlzdHMiOiLiiIQiLCJOb3RHcmVhdGVyIjoi4omvIiwiTm90R3JlYXRlckVxdWFsIjoi4omxIiwiTm90R3JlYXRlckZ1bGxFcXVhbCI6IuKJp8y4IiwiTm90R3JlYXRlckdyZWF0ZXIiOiLiiavMuCIsIk5vdEdyZWF0ZXJMZXNzIjoi4om5IiwiTm90R3JlYXRlclNsYW50RXF1YWwiOiLiqb7MuCIsIk5vdEdyZWF0ZXJUaWxkZSI6IuKJtSIsIk5vdEh1bXBEb3duSHVtcCI6IuKJjsy4IiwiTm90SHVtcEVxdWFsIjoi4omPzLgiLCJub3RpbiI6IuKIiSIsIm5vdGluZG90Ijoi4ou1zLgiLCJub3RpbkUiOiLii7nMuCIsIm5vdGludmEiOiLiiIkiLCJub3RpbnZiIjoi4ou3Iiwibm90aW52YyI6IuKLtiIsIk5vdExlZnRUcmlhbmdsZUJhciI6IuKnj8y4IiwiTm90TGVmdFRyaWFuZ2xlIjoi4ouqIiwiTm90TGVmdFRyaWFuZ2xlRXF1YWwiOiLii6wiLCJOb3RMZXNzIjoi4omuIiwiTm90TGVzc0VxdWFsIjoi4omwIiwiTm90TGVzc0dyZWF0ZXIiOiLiibgiLCJOb3RMZXNzTGVzcyI6IuKJqsy4IiwiTm90TGVzc1NsYW50RXF1YWwiOiLiqb3MuCIsIk5vdExlc3NUaWxkZSI6IuKJtCIsIk5vdE5lc3RlZEdyZWF0ZXJHcmVhdGVyIjoi4qqizLgiLCJOb3ROZXN0ZWRMZXNzTGVzcyI6IuKqocy4Iiwibm90bmkiOiLiiIwiLCJub3RuaXZhIjoi4oiMIiwibm90bml2YiI6IuKLviIsIm5vdG5pdmMiOiLii70iLCJOb3RQcmVjZWRlcyI6IuKKgCIsIk5vdFByZWNlZGVzRXF1YWwiOiLiqq/MuCIsIk5vdFByZWNlZGVzU2xhbnRFcXVhbCI6IuKLoCIsIk5vdFJldmVyc2VFbGVtZW50Ijoi4oiMIiwiTm90UmlnaHRUcmlhbmdsZUJhciI6IuKnkMy4IiwiTm90UmlnaHRUcmlhbmdsZSI6IuKLqyIsIk5vdFJpZ2h0VHJpYW5nbGVFcXVhbCI6IuKLrSIsIk5vdFNxdWFyZVN1YnNldCI6IuKKj8y4IiwiTm90U3F1YXJlU3Vic2V0RXF1YWwiOiLii6IiLCJOb3RTcXVhcmVTdXBlcnNldCI6IuKKkMy4IiwiTm90U3F1YXJlU3VwZXJzZXRFcXVhbCI6IuKLoyIsIk5vdFN1YnNldCI6IuKKguKDkiIsIk5vdFN1YnNldEVxdWFsIjoi4oqIIiwiTm90U3VjY2VlZHMiOiLiioEiLCJOb3RTdWNjZWVkc0VxdWFsIjoi4qqwzLgiLCJOb3RTdWNjZWVkc1NsYW50RXF1YWwiOiLii6EiLCJOb3RTdWNjZWVkc1RpbGRlIjoi4om/zLgiLCJOb3RTdXBlcnNldCI6IuKKg+KDkiIsIk5vdFN1cGVyc2V0RXF1YWwiOiLiiokiLCJOb3RUaWxkZSI6IuKJgSIsIk5vdFRpbGRlRXF1YWwiOiLiiYQiLCJOb3RUaWxkZUZ1bGxFcXVhbCI6IuKJhyIsIk5vdFRpbGRlVGlsZGUiOiLiiYkiLCJOb3RWZXJ0aWNhbEJhciI6IuKIpCIsIm5wYXJhbGxlbCI6IuKIpiIsIm5wYXIiOiLiiKYiLCJucGFyc2wiOiLiq73ig6UiLCJucGFydCI6IuKIgsy4IiwibnBvbGludCI6IuKolCIsIm5wciI6IuKKgCIsIm5wcmN1ZSI6IuKLoCIsIm5wcmVjIjoi4oqAIiwibnByZWNlcSI6IuKqr8y4IiwibnByZSI6IuKqr8y4IiwibnJhcnJjIjoi4qSzzLgiLCJucmFyciI6IuKGmyIsIm5yQXJyIjoi4oePIiwibnJhcnJ3Ijoi4oadzLgiLCJucmlnaHRhcnJvdyI6IuKGmyIsIm5SaWdodGFycm93Ijoi4oePIiwibnJ0cmkiOiLii6siLCJucnRyaWUiOiLii60iLCJuc2MiOiLiioEiLCJuc2NjdWUiOiLii6EiLCJuc2NlIjoi4qqwzLgiLCJOc2NyIjoi8J2SqSIsIm5zY3IiOiLwnZODIiwibnNob3J0bWlkIjoi4oikIiwibnNob3J0cGFyYWxsZWwiOiLiiKYiLCJuc2ltIjoi4omBIiwibnNpbWUiOiLiiYQiLCJuc2ltZXEiOiLiiYQiLCJuc21pZCI6IuKIpCIsIm5zcGFyIjoi4oimIiwibnNxc3ViZSI6IuKLoiIsIm5zcXN1cGUiOiLii6MiLCJuc3ViIjoi4oqEIiwibnN1YkUiOiLiq4XMuCIsIm5zdWJlIjoi4oqIIiwibnN1YnNldCI6IuKKguKDkiIsIm5zdWJzZXRlcSI6IuKKiCIsIm5zdWJzZXRlcXEiOiLiq4XMuCIsIm5zdWNjIjoi4oqBIiwibnN1Y2NlcSI6IuKqsMy4IiwibnN1cCI6IuKKhSIsIm5zdXBFIjoi4quGzLgiLCJuc3VwZSI6IuKKiSIsIm5zdXBzZXQiOiLiioPig5IiLCJuc3Vwc2V0ZXEiOiLiiokiLCJuc3Vwc2V0ZXFxIjoi4quGzLgiLCJudGdsIjoi4om5IiwiTnRpbGRlIjoiw5EiLCJudGlsZGUiOiLDsSIsIm50bGciOiLiibgiLCJudHJpYW5nbGVsZWZ0Ijoi4ouqIiwibnRyaWFuZ2xlbGVmdGVxIjoi4ousIiwibnRyaWFuZ2xlcmlnaHQiOiLii6siLCJudHJpYW5nbGVyaWdodGVxIjoi4outIiwiTnUiOiLOnSIsIm51Ijoizr0iLCJudW0iOiIjIiwibnVtZXJvIjoi4oSWIiwibnVtc3AiOiLigIciLCJudmFwIjoi4omN4oOSIiwibnZkYXNoIjoi4oqsIiwibnZEYXNoIjoi4oqtIiwiblZkYXNoIjoi4oquIiwiblZEYXNoIjoi4oqvIiwibnZnZSI6IuKJpeKDkiIsIm52Z3QiOiI+4oOSIiwibnZIYXJyIjoi4qSEIiwibnZpbmZpbiI6IuKnniIsIm52bEFyciI6IuKkgiIsIm52bGUiOiLiiaTig5IiLCJudmx0IjoiPOKDkiIsIm52bHRyaWUiOiLiirTig5IiLCJudnJBcnIiOiLipIMiLCJudnJ0cmllIjoi4oq14oOSIiwibnZzaW0iOiLiiLzig5IiLCJud2FyaGsiOiLipKMiLCJud2FyciI6IuKGliIsIm53QXJyIjoi4oeWIiwibndhcnJvdyI6IuKGliIsIm53bmVhciI6IuKkpyIsIk9hY3V0ZSI6IsOTIiwib2FjdXRlIjoiw7MiLCJvYXN0Ijoi4oqbIiwiT2NpcmMiOiLDlCIsIm9jaXJjIjoiw7QiLCJvY2lyIjoi4oqaIiwiT2N5Ijoi0J4iLCJvY3kiOiLQviIsIm9kYXNoIjoi4oqdIiwiT2RibGFjIjoixZAiLCJvZGJsYWMiOiLFkSIsIm9kaXYiOiLiqLgiLCJvZG90Ijoi4oqZIiwib2Rzb2xkIjoi4qa8IiwiT0VsaWciOiLFkiIsIm9lbGlnIjoixZMiLCJvZmNpciI6IuKmvyIsIk9mciI6IvCdlJIiLCJvZnIiOiLwnZSsIiwib2dvbiI6IsubIiwiT2dyYXZlIjoiw5IiLCJvZ3JhdmUiOiLDsiIsIm9ndCI6IuKngSIsIm9oYmFyIjoi4qa1Iiwib2htIjoizqkiLCJvaW50Ijoi4oiuIiwib2xhcnIiOiLihroiLCJvbGNpciI6IuKmviIsIm9sY3Jvc3MiOiLiprsiLCJvbGluZSI6IuKAviIsIm9sdCI6IuKngCIsIk9tYWNyIjoixYwiLCJvbWFjciI6IsWNIiwiT21lZ2EiOiLOqSIsIm9tZWdhIjoiz4kiLCJPbWljcm9uIjoizp8iLCJvbWljcm9uIjoizr8iLCJvbWlkIjoi4qa2Iiwib21pbnVzIjoi4oqWIiwiT29wZiI6IvCdlYYiLCJvb3BmIjoi8J2VoCIsIm9wYXIiOiLiprciLCJPcGVuQ3VybHlEb3VibGVRdW90ZSI6IuKAnCIsIk9wZW5DdXJseVF1b3RlIjoi4oCYIiwib3BlcnAiOiLiprkiLCJvcGx1cyI6IuKKlSIsIm9yYXJyIjoi4oa7IiwiT3IiOiLiqZQiLCJvciI6IuKIqCIsIm9yZCI6IuKpnSIsIm9yZGVyIjoi4oS0Iiwib3JkZXJvZiI6IuKEtCIsIm9yZGYiOiLCqiIsIm9yZG0iOiLCuiIsIm9yaWdvZiI6IuKKtiIsIm9yb3IiOiLiqZYiLCJvcnNsb3BlIjoi4qmXIiwib3J2Ijoi4qmbIiwib1MiOiLik4giLCJPc2NyIjoi8J2SqiIsIm9zY3IiOiLihLQiLCJPc2xhc2giOiLDmCIsIm9zbGFzaCI6IsO4Iiwib3NvbCI6IuKKmCIsIk90aWxkZSI6IsOVIiwib3RpbGRlIjoiw7UiLCJvdGltZXNhcyI6IuKotiIsIk90aW1lcyI6IuKotyIsIm90aW1lcyI6IuKKlyIsIk91bWwiOiLDliIsIm91bWwiOiLDtiIsIm92YmFyIjoi4oy9IiwiT3ZlckJhciI6IuKAviIsIk92ZXJCcmFjZSI6IuKPniIsIk92ZXJCcmFja2V0Ijoi4o60IiwiT3ZlclBhcmVudGhlc2lzIjoi4o+cIiwicGFyYSI6IsK2IiwicGFyYWxsZWwiOiLiiKUiLCJwYXIiOiLiiKUiLCJwYXJzaW0iOiLiq7MiLCJwYXJzbCI6IuKrvSIsInBhcnQiOiLiiIIiLCJQYXJ0aWFsRCI6IuKIgiIsIlBjeSI6ItCfIiwicGN5Ijoi0L8iLCJwZXJjbnQiOiIlIiwicGVyaW9kIjoiLiIsInBlcm1pbCI6IuKAsCIsInBlcnAiOiLiiqUiLCJwZXJ0ZW5rIjoi4oCxIiwiUGZyIjoi8J2UkyIsInBmciI6IvCdlK0iLCJQaGkiOiLOpiIsInBoaSI6Is+GIiwicGhpdiI6Is+VIiwicGhtbWF0Ijoi4oSzIiwicGhvbmUiOiLimI4iLCJQaSI6Is6gIiwicGkiOiLPgCIsInBpdGNoZm9yayI6IuKLlCIsInBpdiI6Is+WIiwicGxhbmNrIjoi4oSPIiwicGxhbmNraCI6IuKEjiIsInBsYW5rdiI6IuKEjyIsInBsdXNhY2lyIjoi4qijIiwicGx1c2IiOiLiip4iLCJwbHVzY2lyIjoi4qiiIiwicGx1cyI6IisiLCJwbHVzZG8iOiLiiJQiLCJwbHVzZHUiOiLiqKUiLCJwbHVzZSI6IuKpsiIsIlBsdXNNaW51cyI6IsKxIiwicGx1c21uIjoiwrEiLCJwbHVzc2ltIjoi4qimIiwicGx1c3R3byI6IuKopyIsInBtIjoiwrEiLCJQb2luY2FyZXBsYW5lIjoi4oSMIiwicG9pbnRpbnQiOiLiqJUiLCJwb3BmIjoi8J2VoSIsIlBvcGYiOiLihJkiLCJwb3VuZCI6IsKjIiwicHJhcCI6IuKqtyIsIlByIjoi4qq7IiwicHIiOiLiiboiLCJwcmN1ZSI6IuKJvCIsInByZWNhcHByb3giOiLiqrciLCJwcmVjIjoi4om6IiwicHJlY2N1cmx5ZXEiOiLiibwiLCJQcmVjZWRlcyI6IuKJuiIsIlByZWNlZGVzRXF1YWwiOiLiqq8iLCJQcmVjZWRlc1NsYW50RXF1YWwiOiLiibwiLCJQcmVjZWRlc1RpbGRlIjoi4om+IiwicHJlY2VxIjoi4qqvIiwicHJlY25hcHByb3giOiLiqrkiLCJwcmVjbmVxcSI6IuKqtSIsInByZWNuc2ltIjoi4ouoIiwicHJlIjoi4qqvIiwicHJFIjoi4qqzIiwicHJlY3NpbSI6IuKJviIsInByaW1lIjoi4oCyIiwiUHJpbWUiOiLigLMiLCJwcmltZXMiOiLihJkiLCJwcm5hcCI6IuKquSIsInBybkUiOiLiqrUiLCJwcm5zaW0iOiLii6giLCJwcm9kIjoi4oiPIiwiUHJvZHVjdCI6IuKIjyIsInByb2ZhbGFyIjoi4oyuIiwicHJvZmxpbmUiOiLijJIiLCJwcm9mc3VyZiI6IuKMkyIsInByb3AiOiLiiJ0iLCJQcm9wb3J0aW9uYWwiOiLiiJ0iLCJQcm9wb3J0aW9uIjoi4oi3IiwicHJvcHRvIjoi4oidIiwicHJzaW0iOiLiib4iLCJwcnVyZWwiOiLiirAiLCJQc2NyIjoi8J2SqyIsInBzY3IiOiLwnZOFIiwiUHNpIjoizqgiLCJwc2kiOiLPiCIsInB1bmNzcCI6IuKAiCIsIlFmciI6IvCdlJQiLCJxZnIiOiLwnZSuIiwicWludCI6IuKojCIsInFvcGYiOiLwnZWiIiwiUW9wZiI6IuKEmiIsInFwcmltZSI6IuKBlyIsIlFzY3IiOiLwnZKsIiwicXNjciI6IvCdk4YiLCJxdWF0ZXJuaW9ucyI6IuKEjSIsInF1YXRpbnQiOiLiqJYiLCJxdWVzdCI6Ij8iLCJxdWVzdGVxIjoi4omfIiwicXVvdCI6IlxcIiIsIlFVT1QiOiJcXCIiLCJyQWFyciI6IuKHmyIsInJhY2UiOiLiiL3MsSIsIlJhY3V0ZSI6IsWUIiwicmFjdXRlIjoixZUiLCJyYWRpYyI6IuKImiIsInJhZW1wdHl2Ijoi4qazIiwicmFuZyI6IuKfqSIsIlJhbmciOiLin6siLCJyYW5nZCI6IuKmkiIsInJhbmdlIjoi4qalIiwicmFuZ2xlIjoi4p+pIiwicmFxdW8iOiLCuyIsInJhcnJhcCI6IuKltSIsInJhcnJiIjoi4oelIiwicmFycmJmcyI6IuKkoCIsInJhcnJjIjoi4qSzIiwicmFyciI6IuKGkiIsIlJhcnIiOiLihqAiLCJyQXJyIjoi4oeSIiwicmFycmZzIjoi4qSeIiwicmFycmhrIjoi4oaqIiwicmFycmxwIjoi4oasIiwicmFycnBsIjoi4qWFIiwicmFycnNpbSI6IuKltCIsIlJhcnJ0bCI6IuKkliIsInJhcnJ0bCI6IuKGoyIsInJhcnJ3Ijoi4oadIiwicmF0YWlsIjoi4qSaIiwickF0YWlsIjoi4qScIiwicmF0aW8iOiLiiLYiLCJyYXRpb25hbHMiOiLihJoiLCJyYmFyciI6IuKkjSIsInJCYXJyIjoi4qSPIiwiUkJhcnIiOiLipJAiLCJyYmJyayI6IuKdsyIsInJicmFjZSI6In0iLCJyYnJhY2siOiJdIiwicmJya2UiOiLipowiLCJyYnJrc2xkIjoi4qaOIiwicmJya3NsdSI6IuKmkCIsIlJjYXJvbiI6IsWYIiwicmNhcm9uIjoixZkiLCJSY2VkaWwiOiLFliIsInJjZWRpbCI6IsWXIiwicmNlaWwiOiLijIkiLCJyY3ViIjoifSIsIlJjeSI6ItCgIiwicmN5Ijoi0YAiLCJyZGNhIjoi4qS3IiwicmRsZGhhciI6IuKlqSIsInJkcXVvIjoi4oCdIiwicmRxdW9yIjoi4oCdIiwicmRzaCI6IuKGsyIsInJlYWwiOiLihJwiLCJyZWFsaW5lIjoi4oSbIiwicmVhbHBhcnQiOiLihJwiLCJyZWFscyI6IuKEnSIsIlJlIjoi4oScIiwicmVjdCI6IuKWrSIsInJlZyI6IsKuIiwiUkVHIjoiwq4iLCJSZXZlcnNlRWxlbWVudCI6IuKIiyIsIlJldmVyc2VFcXVpbGlicml1bSI6IuKHiyIsIlJldmVyc2VVcEVxdWlsaWJyaXVtIjoi4qWvIiwicmZpc2h0Ijoi4qW9IiwicmZsb29yIjoi4oyLIiwicmZyIjoi8J2UryIsIlJmciI6IuKEnCIsInJIYXIiOiLipaQiLCJyaGFyZCI6IuKHgSIsInJoYXJ1Ijoi4oeAIiwicmhhcnVsIjoi4qWsIiwiUmhvIjoizqEiLCJyaG8iOiLPgSIsInJob3YiOiLPsSIsIlJpZ2h0QW5nbGVCcmFja2V0Ijoi4p+pIiwiUmlnaHRBcnJvd0JhciI6IuKHpSIsInJpZ2h0YXJyb3ciOiLihpIiLCJSaWdodEFycm93Ijoi4oaSIiwiUmlnaHRhcnJvdyI6IuKHkiIsIlJpZ2h0QXJyb3dMZWZ0QXJyb3ciOiLih4QiLCJyaWdodGFycm93dGFpbCI6IuKGoyIsIlJpZ2h0Q2VpbGluZyI6IuKMiSIsIlJpZ2h0RG91YmxlQnJhY2tldCI6IuKfpyIsIlJpZ2h0RG93blRlZVZlY3RvciI6IuKlnSIsIlJpZ2h0RG93blZlY3RvckJhciI6IuKllSIsIlJpZ2h0RG93blZlY3RvciI6IuKHgiIsIlJpZ2h0Rmxvb3IiOiLijIsiLCJyaWdodGhhcnBvb25kb3duIjoi4oeBIiwicmlnaHRoYXJwb29udXAiOiLih4AiLCJyaWdodGxlZnRhcnJvd3MiOiLih4QiLCJyaWdodGxlZnRoYXJwb29ucyI6IuKHjCIsInJpZ2h0cmlnaHRhcnJvd3MiOiLih4kiLCJyaWdodHNxdWlnYXJyb3ciOiLihp0iLCJSaWdodFRlZUFycm93Ijoi4oamIiwiUmlnaHRUZWUiOiLiiqIiLCJSaWdodFRlZVZlY3RvciI6IuKlmyIsInJpZ2h0dGhyZWV0aW1lcyI6IuKLjCIsIlJpZ2h0VHJpYW5nbGVCYXIiOiLip5AiLCJSaWdodFRyaWFuZ2xlIjoi4oqzIiwiUmlnaHRUcmlhbmdsZUVxdWFsIjoi4oq1IiwiUmlnaHRVcERvd25WZWN0b3IiOiLipY8iLCJSaWdodFVwVGVlVmVjdG9yIjoi4qWcIiwiUmlnaHRVcFZlY3RvckJhciI6IuKllCIsIlJpZ2h0VXBWZWN0b3IiOiLihr4iLCJSaWdodFZlY3RvckJhciI6IuKlkyIsIlJpZ2h0VmVjdG9yIjoi4oeAIiwicmluZyI6IsuaIiwicmlzaW5nZG90c2VxIjoi4omTIiwicmxhcnIiOiLih4QiLCJybGhhciI6IuKHjCIsInJsbSI6IuKAjyIsInJtb3VzdGFjaGUiOiLijrEiLCJybW91c3QiOiLijrEiLCJybm1pZCI6IuKrriIsInJvYW5nIjoi4p+tIiwicm9hcnIiOiLih74iLCJyb2JyayI6IuKfpyIsInJvcGFyIjoi4qaGIiwicm9wZiI6IvCdlaMiLCJSb3BmIjoi4oSdIiwicm9wbHVzIjoi4qiuIiwicm90aW1lcyI6IuKotSIsIlJvdW5kSW1wbGllcyI6IuKlsCIsInJwYXIiOiIpIiwicnBhcmd0Ijoi4qaUIiwicnBwb2xpbnQiOiLiqJIiLCJycmFyciI6IuKHiSIsIlJyaWdodGFycm93Ijoi4oebIiwicnNhcXVvIjoi4oC6IiwicnNjciI6IvCdk4ciLCJSc2NyIjoi4oSbIiwicnNoIjoi4oaxIiwiUnNoIjoi4oaxIiwicnNxYiI6Il0iLCJyc3F1byI6IuKAmSIsInJzcXVvciI6IuKAmSIsInJ0aHJlZSI6IuKLjCIsInJ0aW1lcyI6IuKLiiIsInJ0cmkiOiLilrkiLCJydHJpZSI6IuKKtSIsInJ0cmlmIjoi4pa4IiwicnRyaWx0cmkiOiLip44iLCJSdWxlRGVsYXllZCI6IuKntCIsInJ1bHVoYXIiOiLipagiLCJyeCI6IuKEniIsIlNhY3V0ZSI6IsWaIiwic2FjdXRlIjoixZsiLCJzYnF1byI6IuKAmiIsInNjYXAiOiLiqrgiLCJTY2Fyb24iOiLFoCIsInNjYXJvbiI6IsWhIiwiU2MiOiLiqrwiLCJzYyI6IuKJuyIsInNjY3VlIjoi4om9Iiwic2NlIjoi4qqwIiwic2NFIjoi4qq0IiwiU2NlZGlsIjoixZ4iLCJzY2VkaWwiOiLFnyIsIlNjaXJjIjoixZwiLCJzY2lyYyI6IsWdIiwic2NuYXAiOiLiqroiLCJzY25FIjoi4qq2Iiwic2Nuc2ltIjoi4oupIiwic2Nwb2xpbnQiOiLiqJMiLCJzY3NpbSI6IuKJvyIsIlNjeSI6ItChIiwic2N5Ijoi0YEiLCJzZG90YiI6IuKKoSIsInNkb3QiOiLii4UiLCJzZG90ZSI6IuKppiIsInNlYXJoayI6IuKkpSIsInNlYXJyIjoi4oaYIiwic2VBcnIiOiLih5giLCJzZWFycm93Ijoi4oaYIiwic2VjdCI6IsKnIiwic2VtaSI6IjsiLCJzZXN3YXIiOiLipKkiLCJzZXRtaW51cyI6IuKIliIsInNldG1uIjoi4oiWIiwic2V4dCI6IuKctiIsIlNmciI6IvCdlJYiLCJzZnIiOiLwnZSwIiwic2Zyb3duIjoi4oyiIiwic2hhcnAiOiLima8iLCJTSENIY3kiOiLQqSIsInNoY2hjeSI6ItGJIiwiU0hjeSI6ItCoIiwic2hjeSI6ItGIIiwiU2hvcnREb3duQXJyb3ciOiLihpMiLCJTaG9ydExlZnRBcnJvdyI6IuKGkCIsInNob3J0bWlkIjoi4oijIiwic2hvcnRwYXJhbGxlbCI6IuKIpSIsIlNob3J0UmlnaHRBcnJvdyI6IuKGkiIsIlNob3J0VXBBcnJvdyI6IuKGkSIsInNoeSI6IsKtIiwiU2lnbWEiOiLOoyIsInNpZ21hIjoiz4MiLCJzaWdtYWYiOiLPgiIsInNpZ21hdiI6Is+CIiwic2ltIjoi4oi8Iiwic2ltZG90Ijoi4qmqIiwic2ltZSI6IuKJgyIsInNpbWVxIjoi4omDIiwic2ltZyI6IuKqniIsInNpbWdFIjoi4qqgIiwic2ltbCI6IuKqnSIsInNpbWxFIjoi4qqfIiwic2ltbmUiOiLiiYYiLCJzaW1wbHVzIjoi4qikIiwic2ltcmFyciI6IuKlsiIsInNsYXJyIjoi4oaQIiwiU21hbGxDaXJjbGUiOiLiiJgiLCJzbWFsbHNldG1pbnVzIjoi4oiWIiwic21hc2hwIjoi4qizIiwic21lcGFyc2wiOiLip6QiLCJzbWlkIjoi4oijIiwic21pbGUiOiLijKMiLCJzbXQiOiLiqqoiLCJzbXRlIjoi4qqsIiwic210ZXMiOiLiqqzvuIAiLCJTT0ZUY3kiOiLQrCIsInNvZnRjeSI6ItGMIiwic29sYmFyIjoi4oy/Iiwic29sYiI6IuKnhCIsInNvbCI6Ii8iLCJTb3BmIjoi8J2ViiIsInNvcGYiOiLwnZWkIiwic3BhZGVzIjoi4pmgIiwic3BhZGVzdWl0Ijoi4pmgIiwic3BhciI6IuKIpSIsInNxY2FwIjoi4oqTIiwic3FjYXBzIjoi4oqT77iAIiwic3FjdXAiOiLiipQiLCJzcWN1cHMiOiLiipTvuIAiLCJTcXJ0Ijoi4oiaIiwic3FzdWIiOiLiio8iLCJzcXN1YmUiOiLiipEiLCJzcXN1YnNldCI6IuKKjyIsInNxc3Vic2V0ZXEiOiLiipEiLCJzcXN1cCI6IuKKkCIsInNxc3VwZSI6IuKKkiIsInNxc3Vwc2V0Ijoi4oqQIiwic3FzdXBzZXRlcSI6IuKKkiIsInNxdWFyZSI6IuKWoSIsIlNxdWFyZSI6IuKWoSIsIlNxdWFyZUludGVyc2VjdGlvbiI6IuKKkyIsIlNxdWFyZVN1YnNldCI6IuKKjyIsIlNxdWFyZVN1YnNldEVxdWFsIjoi4oqRIiwiU3F1YXJlU3VwZXJzZXQiOiLiipAiLCJTcXVhcmVTdXBlcnNldEVxdWFsIjoi4oqSIiwiU3F1YXJlVW5pb24iOiLiipQiLCJzcXVhcmYiOiLilqoiLCJzcXUiOiLilqEiLCJzcXVmIjoi4paqIiwic3JhcnIiOiLihpIiLCJTc2NyIjoi8J2SriIsInNzY3IiOiLwnZOIIiwic3NldG1uIjoi4oiWIiwic3NtaWxlIjoi4oyjIiwic3N0YXJmIjoi4ouGIiwiU3RhciI6IuKLhiIsInN0YXIiOiLimIYiLCJzdGFyZiI6IuKYhSIsInN0cmFpZ2h0ZXBzaWxvbiI6Is+1Iiwic3RyYWlnaHRwaGkiOiLPlSIsInN0cm5zIjoiwq8iLCJzdWIiOiLiioIiLCJTdWIiOiLii5AiLCJzdWJkb3QiOiLiqr0iLCJzdWJFIjoi4quFIiwic3ViZSI6IuKKhiIsInN1YmVkb3QiOiLiq4MiLCJzdWJtdWx0Ijoi4quBIiwic3VibkUiOiLiq4siLCJzdWJuZSI6IuKKiiIsInN1YnBsdXMiOiLiqr8iLCJzdWJyYXJyIjoi4qW5Iiwic3Vic2V0Ijoi4oqCIiwiU3Vic2V0Ijoi4ouQIiwic3Vic2V0ZXEiOiLiioYiLCJzdWJzZXRlcXEiOiLiq4UiLCJTdWJzZXRFcXVhbCI6IuKKhiIsInN1YnNldG5lcSI6IuKKiiIsInN1YnNldG5lcXEiOiLiq4siLCJzdWJzaW0iOiLiq4ciLCJzdWJzdWIiOiLiq5UiLCJzdWJzdXAiOiLiq5MiLCJzdWNjYXBwcm94Ijoi4qq4Iiwic3VjYyI6IuKJuyIsInN1Y2NjdXJseWVxIjoi4om9IiwiU3VjY2VlZHMiOiLiibsiLCJTdWNjZWVkc0VxdWFsIjoi4qqwIiwiU3VjY2VlZHNTbGFudEVxdWFsIjoi4om9IiwiU3VjY2VlZHNUaWxkZSI6IuKJvyIsInN1Y2NlcSI6IuKqsCIsInN1Y2NuYXBwcm94Ijoi4qq6Iiwic3VjY25lcXEiOiLiqrYiLCJzdWNjbnNpbSI6IuKLqSIsInN1Y2NzaW0iOiLiib8iLCJTdWNoVGhhdCI6IuKIiyIsInN1bSI6IuKIkSIsIlN1bSI6IuKIkSIsInN1bmciOiLimaoiLCJzdXAxIjoiwrkiLCJzdXAyIjoiwrIiLCJzdXAzIjoiwrMiLCJzdXAiOiLiioMiLCJTdXAiOiLii5EiLCJzdXBkb3QiOiLiqr4iLCJzdXBkc3ViIjoi4quYIiwic3VwRSI6IuKrhiIsInN1cGUiOiLiiociLCJzdXBlZG90Ijoi4quEIiwiU3VwZXJzZXQiOiLiioMiLCJTdXBlcnNldEVxdWFsIjoi4oqHIiwic3VwaHNvbCI6IuKfiSIsInN1cGhzdWIiOiLiq5ciLCJzdXBsYXJyIjoi4qW7Iiwic3VwbXVsdCI6IuKrgiIsInN1cG5FIjoi4quMIiwic3VwbmUiOiLiiosiLCJzdXBwbHVzIjoi4quAIiwic3Vwc2V0Ijoi4oqDIiwiU3Vwc2V0Ijoi4ouRIiwic3Vwc2V0ZXEiOiLiiociLCJzdXBzZXRlcXEiOiLiq4YiLCJzdXBzZXRuZXEiOiLiiosiLCJzdXBzZXRuZXFxIjoi4quMIiwic3Vwc2ltIjoi4quIIiwic3Vwc3ViIjoi4quUIiwic3Vwc3VwIjoi4quWIiwic3dhcmhrIjoi4qSmIiwic3dhcnIiOiLihpkiLCJzd0FyciI6IuKHmSIsInN3YXJyb3ciOiLihpkiLCJzd253YXIiOiLipKoiLCJzemxpZyI6IsOfIiwiVGFiIjoiXFx0IiwidGFyZ2V0Ijoi4oyWIiwiVGF1IjoizqQiLCJ0YXUiOiLPhCIsInRicmsiOiLijrQiLCJUY2Fyb24iOiLFpCIsInRjYXJvbiI6IsWlIiwiVGNlZGlsIjoixaIiLCJ0Y2VkaWwiOiLFoyIsIlRjeSI6ItCiIiwidGN5Ijoi0YIiLCJ0ZG90Ijoi4oObIiwidGVscmVjIjoi4oyVIiwiVGZyIjoi8J2UlyIsInRmciI6IvCdlLEiLCJ0aGVyZTQiOiLiiLQiLCJ0aGVyZWZvcmUiOiLiiLQiLCJUaGVyZWZvcmUiOiLiiLQiLCJUaGV0YSI6Is6YIiwidGhldGEiOiLOuCIsInRoZXRhc3ltIjoiz5EiLCJ0aGV0YXYiOiLPkSIsInRoaWNrYXBwcm94Ijoi4omIIiwidGhpY2tzaW0iOiLiiLwiLCJUaGlja1NwYWNlIjoi4oGf4oCKIiwiVGhpblNwYWNlIjoi4oCJIiwidGhpbnNwIjoi4oCJIiwidGhrYXAiOiLiiYgiLCJ0aGtzaW0iOiLiiLwiLCJUSE9STiI6IsOeIiwidGhvcm4iOiLDviIsInRpbGRlIjoiy5wiLCJUaWxkZSI6IuKIvCIsIlRpbGRlRXF1YWwiOiLiiYMiLCJUaWxkZUZ1bGxFcXVhbCI6IuKJhSIsIlRpbGRlVGlsZGUiOiLiiYgiLCJ0aW1lc2JhciI6IuKosSIsInRpbWVzYiI6IuKKoCIsInRpbWVzIjoiw5ciLCJ0aW1lc2QiOiLiqLAiLCJ0aW50Ijoi4oitIiwidG9lYSI6IuKkqCIsInRvcGJvdCI6IuKMtiIsInRvcGNpciI6IuKrsSIsInRvcCI6IuKKpCIsIlRvcGYiOiLwnZWLIiwidG9wZiI6IvCdlaUiLCJ0b3Bmb3JrIjoi4quaIiwidG9zYSI6IuKkqSIsInRwcmltZSI6IuKAtCIsInRyYWRlIjoi4oSiIiwiVFJBREUiOiLihKIiLCJ0cmlhbmdsZSI6IuKWtSIsInRyaWFuZ2xlZG93biI6IuKWvyIsInRyaWFuZ2xlbGVmdCI6IuKXgyIsInRyaWFuZ2xlbGVmdGVxIjoi4oq0IiwidHJpYW5nbGVxIjoi4omcIiwidHJpYW5nbGVyaWdodCI6IuKWuSIsInRyaWFuZ2xlcmlnaHRlcSI6IuKKtSIsInRyaWRvdCI6IuKXrCIsInRyaWUiOiLiiZwiLCJ0cmltaW51cyI6IuKouiIsIlRyaXBsZURvdCI6IuKDmyIsInRyaXBsdXMiOiLiqLkiLCJ0cmlzYiI6IuKnjSIsInRyaXRpbWUiOiLiqLsiLCJ0cnBleml1bSI6IuKPoiIsIlRzY3IiOiLwnZKvIiwidHNjciI6IvCdk4kiLCJUU2N5Ijoi0KYiLCJ0c2N5Ijoi0YYiLCJUU0hjeSI6ItCLIiwidHNoY3kiOiLRmyIsIlRzdHJvayI6IsWmIiwidHN0cm9rIjoixaciLCJ0d2l4dCI6IuKJrCIsInR3b2hlYWRsZWZ0YXJyb3ciOiLihp4iLCJ0d29oZWFkcmlnaHRhcnJvdyI6IuKGoCIsIlVhY3V0ZSI6IsOaIiwidWFjdXRlIjoiw7oiLCJ1YXJyIjoi4oaRIiwiVWFyciI6IuKGnyIsInVBcnIiOiLih5EiLCJVYXJyb2NpciI6IuKliSIsIlVicmN5Ijoi0I4iLCJ1YnJjeSI6ItGeIiwiVWJyZXZlIjoixawiLCJ1YnJldmUiOiLFrSIsIlVjaXJjIjoiw5siLCJ1Y2lyYyI6IsO7IiwiVWN5Ijoi0KMiLCJ1Y3kiOiLRgyIsInVkYXJyIjoi4oeFIiwiVWRibGFjIjoixbAiLCJ1ZGJsYWMiOiLFsSIsInVkaGFyIjoi4qWuIiwidWZpc2h0Ijoi4qW+IiwiVWZyIjoi8J2UmCIsInVmciI6IvCdlLIiLCJVZ3JhdmUiOiLDmSIsInVncmF2ZSI6IsO5IiwidUhhciI6IuKloyIsInVoYXJsIjoi4oa/IiwidWhhcnIiOiLihr4iLCJ1aGJsayI6IuKWgCIsInVsY29ybiI6IuKMnCIsInVsY29ybmVyIjoi4oycIiwidWxjcm9wIjoi4oyPIiwidWx0cmkiOiLil7giLCJVbWFjciI6IsWqIiwidW1hY3IiOiLFqyIsInVtbCI6IsKoIiwiVW5kZXJCYXIiOiJfIiwiVW5kZXJCcmFjZSI6IuKPnyIsIlVuZGVyQnJhY2tldCI6IuKOtSIsIlVuZGVyUGFyZW50aGVzaXMiOiLij50iLCJVbmlvbiI6IuKLgyIsIlVuaW9uUGx1cyI6IuKKjiIsIlVvZ29uIjoixbIiLCJ1b2dvbiI6IsWzIiwiVW9wZiI6IvCdlYwiLCJ1b3BmIjoi8J2VpiIsIlVwQXJyb3dCYXIiOiLipJIiLCJ1cGFycm93Ijoi4oaRIiwiVXBBcnJvdyI6IuKGkSIsIlVwYXJyb3ciOiLih5EiLCJVcEFycm93RG93bkFycm93Ijoi4oeFIiwidXBkb3duYXJyb3ciOiLihpUiLCJVcERvd25BcnJvdyI6IuKGlSIsIlVwZG93bmFycm93Ijoi4oeVIiwiVXBFcXVpbGlicml1bSI6IuKlriIsInVwaGFycG9vbmxlZnQiOiLihr8iLCJ1cGhhcnBvb25yaWdodCI6IuKGviIsInVwbHVzIjoi4oqOIiwiVXBwZXJMZWZ0QXJyb3ciOiLihpYiLCJVcHBlclJpZ2h0QXJyb3ciOiLihpciLCJ1cHNpIjoiz4UiLCJVcHNpIjoiz5IiLCJ1cHNpaCI6Is+SIiwiVXBzaWxvbiI6Is6lIiwidXBzaWxvbiI6Is+FIiwiVXBUZWVBcnJvdyI6IuKGpSIsIlVwVGVlIjoi4oqlIiwidXB1cGFycm93cyI6IuKHiCIsInVyY29ybiI6IuKMnSIsInVyY29ybmVyIjoi4oydIiwidXJjcm9wIjoi4oyOIiwiVXJpbmciOiLFriIsInVyaW5nIjoixa8iLCJ1cnRyaSI6IuKXuSIsIlVzY3IiOiLwnZKwIiwidXNjciI6IvCdk4oiLCJ1dGRvdCI6IuKLsCIsIlV0aWxkZSI6IsWoIiwidXRpbGRlIjoixakiLCJ1dHJpIjoi4pa1IiwidXRyaWYiOiLilrQiLCJ1dWFyciI6IuKHiCIsIlV1bWwiOiLDnCIsInV1bWwiOiLDvCIsInV3YW5nbGUiOiLipqciLCJ2YW5ncnQiOiLippwiLCJ2YXJlcHNpbG9uIjoiz7UiLCJ2YXJrYXBwYSI6Is+wIiwidmFybm90aGluZyI6IuKIhSIsInZhcnBoaSI6Is+VIiwidmFycGkiOiLPliIsInZhcnByb3B0byI6IuKInSIsInZhcnIiOiLihpUiLCJ2QXJyIjoi4oeVIiwidmFycmhvIjoiz7EiLCJ2YXJzaWdtYSI6Is+CIiwidmFyc3Vic2V0bmVxIjoi4oqK77iAIiwidmFyc3Vic2V0bmVxcSI6IuKri++4gCIsInZhcnN1cHNldG5lcSI6IuKKi++4gCIsInZhcnN1cHNldG5lcXEiOiLiq4zvuIAiLCJ2YXJ0aGV0YSI6Is+RIiwidmFydHJpYW5nbGVsZWZ0Ijoi4oqyIiwidmFydHJpYW5nbGVyaWdodCI6IuKKsyIsInZCYXIiOiLiq6giLCJWYmFyIjoi4qurIiwidkJhcnYiOiLiq6kiLCJWY3kiOiLQkiIsInZjeSI6ItCyIiwidmRhc2giOiLiiqIiLCJ2RGFzaCI6IuKKqCIsIlZkYXNoIjoi4oqpIiwiVkRhc2giOiLiiqsiLCJWZGFzaGwiOiLiq6YiLCJ2ZWViYXIiOiLiirsiLCJ2ZWUiOiLiiKgiLCJWZWUiOiLii4EiLCJ2ZWVlcSI6IuKJmiIsInZlbGxpcCI6IuKLriIsInZlcmJhciI6InwiLCJWZXJiYXIiOiLigJYiLCJ2ZXJ0IjoifCIsIlZlcnQiOiLigJYiLCJWZXJ0aWNhbEJhciI6IuKIoyIsIlZlcnRpY2FsTGluZSI6InwiLCJWZXJ0aWNhbFNlcGFyYXRvciI6IuKdmCIsIlZlcnRpY2FsVGlsZGUiOiLiiYAiLCJWZXJ5VGhpblNwYWNlIjoi4oCKIiwiVmZyIjoi8J2UmSIsInZmciI6IvCdlLMiLCJ2bHRyaSI6IuKKsiIsInZuc3ViIjoi4oqC4oOSIiwidm5zdXAiOiLiioPig5IiLCJWb3BmIjoi8J2VjSIsInZvcGYiOiLwnZWnIiwidnByb3AiOiLiiJ0iLCJ2cnRyaSI6IuKKsyIsIlZzY3IiOiLwnZKxIiwidnNjciI6IvCdk4siLCJ2c3VibkUiOiLiq4vvuIAiLCJ2c3VibmUiOiLiiorvuIAiLCJ2c3VwbkUiOiLiq4zvuIAiLCJ2c3VwbmUiOiLiiovvuIAiLCJWdmRhc2giOiLiiqoiLCJ2emlnemFnIjoi4qaaIiwiV2NpcmMiOiLFtCIsIndjaXJjIjoixbUiLCJ3ZWRiYXIiOiLiqZ8iLCJ3ZWRnZSI6IuKIpyIsIldlZGdlIjoi4ouAIiwid2VkZ2VxIjoi4omZIiwid2VpZXJwIjoi4oSYIiwiV2ZyIjoi8J2UmiIsIndmciI6IvCdlLQiLCJXb3BmIjoi8J2VjiIsIndvcGYiOiLwnZWoIiwid3AiOiLihJgiLCJ3ciI6IuKJgCIsIndyZWF0aCI6IuKJgCIsIldzY3IiOiLwnZKyIiwid3NjciI6IvCdk4wiLCJ4Y2FwIjoi4ouCIiwieGNpcmMiOiLil68iLCJ4Y3VwIjoi4ouDIiwieGR0cmkiOiLilr0iLCJYZnIiOiLwnZSbIiwieGZyIjoi8J2UtSIsInhoYXJyIjoi4p+3IiwieGhBcnIiOiLin7oiLCJYaSI6Is6eIiwieGkiOiLOviIsInhsYXJyIjoi4p+1IiwieGxBcnIiOiLin7giLCJ4bWFwIjoi4p+8IiwieG5pcyI6IuKLuyIsInhvZG90Ijoi4qiAIiwiWG9wZiI6IvCdlY8iLCJ4b3BmIjoi8J2VqSIsInhvcGx1cyI6IuKogSIsInhvdGltZSI6IuKogiIsInhyYXJyIjoi4p+2IiwieHJBcnIiOiLin7kiLCJYc2NyIjoi8J2SsyIsInhzY3IiOiLwnZONIiwieHNxY3VwIjoi4qiGIiwieHVwbHVzIjoi4qiEIiwieHV0cmkiOiLilrMiLCJ4dmVlIjoi4ouBIiwieHdlZGdlIjoi4ouAIiwiWWFjdXRlIjoiw50iLCJ5YWN1dGUiOiLDvSIsIllBY3kiOiLQryIsInlhY3kiOiLRjyIsIlljaXJjIjoixbYiLCJ5Y2lyYyI6IsW3IiwiWWN5Ijoi0KsiLCJ5Y3kiOiLRiyIsInllbiI6IsKlIiwiWWZyIjoi8J2UnCIsInlmciI6IvCdlLYiLCJZSWN5Ijoi0IciLCJ5aWN5Ijoi0ZciLCJZb3BmIjoi8J2VkCIsInlvcGYiOiLwnZWqIiwiWXNjciI6IvCdkrQiLCJ5c2NyIjoi8J2TjiIsIllVY3kiOiLQriIsInl1Y3kiOiLRjiIsInl1bWwiOiLDvyIsIll1bWwiOiLFuCIsIlphY3V0ZSI6IsW5IiwiemFjdXRlIjoixboiLCJaY2Fyb24iOiLFvSIsInpjYXJvbiI6IsW+IiwiWmN5Ijoi0JciLCJ6Y3kiOiLQtyIsIlpkb3QiOiLFuyIsInpkb3QiOiLFvCIsInplZXRyZiI6IuKEqCIsIlplcm9XaWR0aFNwYWNlIjoi4oCLIiwiWmV0YSI6Is6WIiwiemV0YSI6Is62IiwiemZyIjoi8J2UtyIsIlpmciI6IuKEqCIsIlpIY3kiOiLQliIsInpoY3kiOiLQtiIsInppZ3JhcnIiOiLih50iLCJ6b3BmIjoi8J2VqyIsIlpvcGYiOiLihKQiLCJac2NyIjoi8J2StSIsInpzY3IiOiLwnZOPIiwiendqIjoi4oCNIiwienduaiI6IuKAjCJ9Jyl9LGZ1bmN0aW9uKGQpe2QuZXhwb3J0cz1KU09OLnBhcnNlKCd7IkFhY3V0ZSI6IsOBIiwiYWFjdXRlIjoiw6EiLCJBY2lyYyI6IsOCIiwiYWNpcmMiOiLDoiIsImFjdXRlIjoiwrQiLCJBRWxpZyI6IsOGIiwiYWVsaWciOiLDpiIsIkFncmF2ZSI6IsOAIiwiYWdyYXZlIjoiw6AiLCJhbXAiOiImIiwiQU1QIjoiJiIsIkFyaW5nIjoiw4UiLCJhcmluZyI6IsOlIiwiQXRpbGRlIjoiw4MiLCJhdGlsZGUiOiLDoyIsIkF1bWwiOiLDhCIsImF1bWwiOiLDpCIsImJydmJhciI6IsKmIiwiQ2NlZGlsIjoiw4ciLCJjY2VkaWwiOiLDpyIsImNlZGlsIjoiwrgiLCJjZW50IjoiwqIiLCJjb3B5IjoiwqkiLCJDT1BZIjoiwqkiLCJjdXJyZW4iOiLCpCIsImRlZyI6IsKwIiwiZGl2aWRlIjoiw7ciLCJFYWN1dGUiOiLDiSIsImVhY3V0ZSI6IsOpIiwiRWNpcmMiOiLDiiIsImVjaXJjIjoiw6oiLCJFZ3JhdmUiOiLDiCIsImVncmF2ZSI6IsOoIiwiRVRIIjoiw5AiLCJldGgiOiLDsCIsIkV1bWwiOiLDiyIsImV1bWwiOiLDqyIsImZyYWMxMiI6IsK9IiwiZnJhYzE0IjoiwrwiLCJmcmFjMzQiOiLCviIsImd0IjoiPiIsIkdUIjoiPiIsIklhY3V0ZSI6IsONIiwiaWFjdXRlIjoiw60iLCJJY2lyYyI6IsOOIiwiaWNpcmMiOiLDriIsImlleGNsIjoiwqEiLCJJZ3JhdmUiOiLDjCIsImlncmF2ZSI6IsOsIiwiaXF1ZXN0Ijoiwr8iLCJJdW1sIjoiw48iLCJpdW1sIjoiw68iLCJsYXF1byI6IsKrIiwibHQiOiI8IiwiTFQiOiI8IiwibWFjciI6IsKvIiwibWljcm8iOiLCtSIsIm1pZGRvdCI6IsK3IiwibmJzcCI6IsKgIiwibm90IjoiwqwiLCJOdGlsZGUiOiLDkSIsIm50aWxkZSI6IsOxIiwiT2FjdXRlIjoiw5MiLCJvYWN1dGUiOiLDsyIsIk9jaXJjIjoiw5QiLCJvY2lyYyI6IsO0IiwiT2dyYXZlIjoiw5IiLCJvZ3JhdmUiOiLDsiIsIm9yZGYiOiLCqiIsIm9yZG0iOiLCuiIsIk9zbGFzaCI6IsOYIiwib3NsYXNoIjoiw7giLCJPdGlsZGUiOiLDlSIsIm90aWxkZSI6IsO1IiwiT3VtbCI6IsOWIiwib3VtbCI6IsO2IiwicGFyYSI6IsK2IiwicGx1c21uIjoiwrEiLCJwb3VuZCI6IsKjIiwicXVvdCI6IlxcIiIsIlFVT1QiOiJcXCIiLCJyYXF1byI6IsK7IiwicmVnIjoiwq4iLCJSRUciOiLCriIsInNlY3QiOiLCpyIsInNoeSI6IsKtIiwic3VwMSI6IsK5Iiwic3VwMiI6IsKyIiwic3VwMyI6IsKzIiwic3psaWciOiLDnyIsIlRIT1JOIjoiw54iLCJ0aG9ybiI6IsO+IiwidGltZXMiOiLDlyIsIlVhY3V0ZSI6IsOaIiwidWFjdXRlIjoiw7oiLCJVY2lyYyI6IsObIiwidWNpcmMiOiLDuyIsIlVncmF2ZSI6IsOZIiwidWdyYXZlIjoiw7kiLCJ1bWwiOiLCqCIsIlV1bWwiOiLDnCIsInV1bWwiOiLDvCIsIllhY3V0ZSI6IsOdIiwieWFjdXRlIjoiw70iLCJ5ZW4iOiLCpSIsInl1bWwiOiLDvyJ9Jyl9LGZ1bmN0aW9uKGQpe2QuZXhwb3J0cz1KU09OLnBhcnNlKGB7ImFtcCI6IiYiLCJhcG9zIjoiJyIsImd0IjoiPiIsImx0IjoiPCIsInF1b3QiOiJcXCIifWApfSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dGhpcyYmdGhpcy5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKHMpe3JldHVybiBzJiZzLl9fZXNNb2R1bGU/czp7ZGVmYXVsdDpzfX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPWUodCgyNjUpKTtmdW5jdGlvbiBhKHMpe2lmKHM+PTU1Mjk2JiZzPD01NzM0M3x8cz4xMTE0MTExKXJldHVybiLvv70iO3MgaW4gbi5kZWZhdWx0JiYocz1uLmRlZmF1bHRbc10pO3ZhciBpPSIiO3JldHVybiBzPjY1NTM1JiYocy09NjU1MzYsaSs9U3RyaW5nLmZyb21DaGFyQ29kZShzPj4+MTAmMTAyM3w1NTI5Nikscz01NjMyMHxzJjEwMjMpLGkrPVN0cmluZy5mcm9tQ2hhckNvZGUocyksaX1yLmRlZmF1bHQ9YX0sZnVuY3Rpb24oZCl7ZC5leHBvcnRzPUpTT04ucGFyc2UoJ3siMCI6NjU1MzMsIjEyOCI6ODM2NCwiMTMwIjo4MjE4LCIxMzEiOjQwMiwiMTMyIjo4MjIyLCIxMzMiOjgyMzAsIjEzNCI6ODIyNCwiMTM1Ijo4MjI1LCIxMzYiOjcxMCwiMTM3Ijo4MjQwLCIxMzgiOjM1MiwiMTM5Ijo4MjQ5LCIxNDAiOjMzOCwiMTQyIjozODEsIjE0NSI6ODIxNiwiMTQ2Ijo4MjE3LCIxNDciOjgyMjAsIjE0OCI6ODIyMSwiMTQ5Ijo4MjI2LCIxNTAiOjgyMTEsIjE1MSI6ODIxMiwiMTUyIjo3MzIsIjE1MyI6ODQ4MiwiMTU0IjozNTMsIjE1NSI6ODI1MCwiMTU2IjozMzksIjE1OCI6MzgyLCIxNTkiOjM3Nn0nKX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbihUKXtyZXR1cm4gVCYmVC5fX2VzTW9kdWxlP1Q6e2RlZmF1bHQ6VH19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxyLmVzY2FwZT1yLmVuY29kZUhUTUw9ci5lbmNvZGVYTUw9dm9pZCAwO3ZhciBuPWUodCgyNjMpKSxhPW0obi5kZWZhdWx0KSxzPXUoYSk7ci5lbmNvZGVYTUw9TyhhLHMpO3ZhciBpPWUodCgyNjEpKSxvPW0oaS5kZWZhdWx0KSxjPXUobyk7ci5lbmNvZGVIVE1MPU8obyxjKTtmdW5jdGlvbiBtKFQpe3JldHVybiBPYmplY3Qua2V5cyhUKS5zb3J0KCkucmVkdWNlKGZ1bmN0aW9uKGwsaCl7cmV0dXJuIGxbVFtoXV09IiYiK2grIjsiLGx9LHt9KX1mdW5jdGlvbiB1KFQpe2Zvcih2YXIgbD1bXSxoPVtdLGY9MCxnPU9iamVjdC5rZXlzKFQpO2Y8Zy5sZW5ndGg7ZisrKXt2YXIgTT1nW2ZdO00ubGVuZ3RoPT09MT9sLnB1c2goIlxcIitNKTpoLnB1c2goTSl9bC5zb3J0KCk7Zm9yKHZhciBBPTA7QTxsLmxlbmd0aC0xO0ErKyl7Zm9yKHZhciBDPUE7QzxsLmxlbmd0aC0xJiZsW0NdLmNoYXJDb2RlQXQoMSkrMT09PWxbQysxXS5jaGFyQ29kZUF0KDEpOylDKz0xO3ZhciBiPTErQy1BO2I8M3x8bC5zcGxpY2UoQSxiLGxbQV0rIi0iK2xbQ10pfXJldHVybiBoLnVuc2hpZnQoIlsiK2wuam9pbigiIikrIl0iKSxuZXcgUmVnRXhwKGguam9pbigifCIpLCJnIil9dmFyIHA9Lyg/OltceDgwLVx1RDdGRlx1RTAwMC1cdUZGRkZdfFtcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGXXxbXHVEODAwLVx1REJGRl0oPyFbXHVEQzAwLVx1REZGRl0pfCg/OlteXHVEODAwLVx1REJGRl18XilbXHVEQzAwLVx1REZGRl0pL2c7ZnVuY3Rpb24geShUKXtyZXR1cm4iJiN4IitULmNvZGVQb2ludEF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpKyI7In1mdW5jdGlvbiBPKFQsbCl7cmV0dXJuIGZ1bmN0aW9uKGgpe3JldHVybiBoLnJlcGxhY2UobCxmdW5jdGlvbihmKXtyZXR1cm4gVFtmXX0pLnJlcGxhY2UocCx5KX19dmFyIHg9dShhKTtmdW5jdGlvbiB2KFQpe3JldHVybiBULnJlcGxhY2UoeCx5KS5yZXBsYWNlKHAseSl9ci5lc2NhcGU9dn0sZnVuY3Rpb24oZCl7ZC5leHBvcnRzPUpTT04ucGFyc2UoJ3siZWxlbWVudE5hbWVzIjp7ImFsdGdseXBoIjoiYWx0R2x5cGgiLCJhbHRnbHlwaGRlZiI6ImFsdEdseXBoRGVmIiwiYWx0Z2x5cGhpdGVtIjoiYWx0R2x5cGhJdGVtIiwiYW5pbWF0ZWNvbG9yIjoiYW5pbWF0ZUNvbG9yIiwiYW5pbWF0ZW1vdGlvbiI6ImFuaW1hdGVNb3Rpb24iLCJhbmltYXRldHJhbnNmb3JtIjoiYW5pbWF0ZVRyYW5zZm9ybSIsImNsaXBwYXRoIjoiY2xpcFBhdGgiLCJmZWJsZW5kIjoiZmVCbGVuZCIsImZlY29sb3JtYXRyaXgiOiJmZUNvbG9yTWF0cml4IiwiZmVjb21wb25lbnR0cmFuc2ZlciI6ImZlQ29tcG9uZW50VHJhbnNmZXIiLCJmZWNvbXBvc2l0ZSI6ImZlQ29tcG9zaXRlIiwiZmVjb252b2x2ZW1hdHJpeCI6ImZlQ29udm9sdmVNYXRyaXgiLCJmZWRpZmZ1c2VsaWdodGluZyI6ImZlRGlmZnVzZUxpZ2h0aW5nIiwiZmVkaXNwbGFjZW1lbnRtYXAiOiJmZURpc3BsYWNlbWVudE1hcCIsImZlZGlzdGFudGxpZ2h0IjoiZmVEaXN0YW50TGlnaHQiLCJmZWRyb3BzaGFkb3ciOiJmZURyb3BTaGFkb3ciLCJmZWZsb29kIjoiZmVGbG9vZCIsImZlZnVuY2EiOiJmZUZ1bmNBIiwiZmVmdW5jYiI6ImZlRnVuY0IiLCJmZWZ1bmNnIjoiZmVGdW5jRyIsImZlZnVuY3IiOiJmZUZ1bmNSIiwiZmVnYXVzc2lhbmJsdXIiOiJmZUdhdXNzaWFuQmx1ciIsImZlaW1hZ2UiOiJmZUltYWdlIiwiZmVtZXJnZSI6ImZlTWVyZ2UiLCJmZW1lcmdlbm9kZSI6ImZlTWVyZ2VOb2RlIiwiZmVtb3JwaG9sb2d5IjoiZmVNb3JwaG9sb2d5IiwiZmVvZmZzZXQiOiJmZU9mZnNldCIsImZlcG9pbnRsaWdodCI6ImZlUG9pbnRMaWdodCIsImZlc3BlY3VsYXJsaWdodGluZyI6ImZlU3BlY3VsYXJMaWdodGluZyIsImZlc3BvdGxpZ2h0IjoiZmVTcG90TGlnaHQiLCJmZXRpbGUiOiJmZVRpbGUiLCJmZXR1cmJ1bGVuY2UiOiJmZVR1cmJ1bGVuY2UiLCJmb3JlaWdub2JqZWN0IjoiZm9yZWlnbk9iamVjdCIsImdseXBocmVmIjoiZ2x5cGhSZWYiLCJsaW5lYXJncmFkaWVudCI6ImxpbmVhckdyYWRpZW50IiwicmFkaWFsZ3JhZGllbnQiOiJyYWRpYWxHcmFkaWVudCIsInRleHRwYXRoIjoidGV4dFBhdGgifSwiYXR0cmlidXRlTmFtZXMiOnsiZGVmaW5pdGlvbnVybCI6ImRlZmluaXRpb25VUkwiLCJhdHRyaWJ1dGVuYW1lIjoiYXR0cmlidXRlTmFtZSIsImF0dHJpYnV0ZXR5cGUiOiJhdHRyaWJ1dGVUeXBlIiwiYmFzZWZyZXF1ZW5jeSI6ImJhc2VGcmVxdWVuY3kiLCJiYXNlcHJvZmlsZSI6ImJhc2VQcm9maWxlIiwiY2FsY21vZGUiOiJjYWxjTW9kZSIsImNsaXBwYXRodW5pdHMiOiJjbGlwUGF0aFVuaXRzIiwiZGlmZnVzZWNvbnN0YW50IjoiZGlmZnVzZUNvbnN0YW50IiwiZWRnZW1vZGUiOiJlZGdlTW9kZSIsImZpbHRlcnVuaXRzIjoiZmlsdGVyVW5pdHMiLCJnbHlwaHJlZiI6ImdseXBoUmVmIiwiZ3JhZGllbnR0cmFuc2Zvcm0iOiJncmFkaWVudFRyYW5zZm9ybSIsImdyYWRpZW50dW5pdHMiOiJncmFkaWVudFVuaXRzIiwia2VybmVsbWF0cml4Ijoia2VybmVsTWF0cml4Iiwia2VybmVsdW5pdGxlbmd0aCI6Imtlcm5lbFVuaXRMZW5ndGgiLCJrZXlwb2ludHMiOiJrZXlQb2ludHMiLCJrZXlzcGxpbmVzIjoia2V5U3BsaW5lcyIsImtleXRpbWVzIjoia2V5VGltZXMiLCJsZW5ndGhhZGp1c3QiOiJsZW5ndGhBZGp1c3QiLCJsaW1pdGluZ2NvbmVhbmdsZSI6ImxpbWl0aW5nQ29uZUFuZ2xlIiwibWFya2VyaGVpZ2h0IjoibWFya2VySGVpZ2h0IiwibWFya2VydW5pdHMiOiJtYXJrZXJVbml0cyIsIm1hcmtlcndpZHRoIjoibWFya2VyV2lkdGgiLCJtYXNrY29udGVudHVuaXRzIjoibWFza0NvbnRlbnRVbml0cyIsIm1hc2t1bml0cyI6Im1hc2tVbml0cyIsIm51bW9jdGF2ZXMiOiJudW1PY3RhdmVzIiwicGF0aGxlbmd0aCI6InBhdGhMZW5ndGgiLCJwYXR0ZXJuY29udGVudHVuaXRzIjoicGF0dGVybkNvbnRlbnRVbml0cyIsInBhdHRlcm50cmFuc2Zvcm0iOiJwYXR0ZXJuVHJhbnNmb3JtIiwicGF0dGVybnVuaXRzIjoicGF0dGVyblVuaXRzIiwicG9pbnRzYXR4IjoicG9pbnRzQXRYIiwicG9pbnRzYXR5IjoicG9pbnRzQXRZIiwicG9pbnRzYXR6IjoicG9pbnRzQXRaIiwicHJlc2VydmVhbHBoYSI6InByZXNlcnZlQWxwaGEiLCJwcmVzZXJ2ZWFzcGVjdHJhdGlvIjoicHJlc2VydmVBc3BlY3RSYXRpbyIsInByaW1pdGl2ZXVuaXRzIjoicHJpbWl0aXZlVW5pdHMiLCJyZWZ4IjoicmVmWCIsInJlZnkiOiJyZWZZIiwicmVwZWF0Y291bnQiOiJyZXBlYXRDb3VudCIsInJlcGVhdGR1ciI6InJlcGVhdER1ciIsInJlcXVpcmVkZXh0ZW5zaW9ucyI6InJlcXVpcmVkRXh0ZW5zaW9ucyIsInJlcXVpcmVkZmVhdHVyZXMiOiJyZXF1aXJlZEZlYXR1cmVzIiwic3BlY3VsYXJjb25zdGFudCI6InNwZWN1bGFyQ29uc3RhbnQiLCJzcGVjdWxhcmV4cG9uZW50Ijoic3BlY3VsYXJFeHBvbmVudCIsInNwcmVhZG1ldGhvZCI6InNwcmVhZE1ldGhvZCIsInN0YXJ0b2Zmc2V0Ijoic3RhcnRPZmZzZXQiLCJzdGRkZXZpYXRpb24iOiJzdGREZXZpYXRpb24iLCJzdGl0Y2h0aWxlcyI6InN0aXRjaFRpbGVzIiwic3VyZmFjZXNjYWxlIjoic3VyZmFjZVNjYWxlIiwic3lzdGVtbGFuZ3VhZ2UiOiJzeXN0ZW1MYW5ndWFnZSIsInRhYmxldmFsdWVzIjoidGFibGVWYWx1ZXMiLCJ0YXJnZXR4IjoidGFyZ2V0WCIsInRhcmdldHkiOiJ0YXJnZXRZIiwidGV4dGxlbmd0aCI6InRleHRMZW5ndGgiLCJ2aWV3Ym94Ijoidmlld0JveCIsInZpZXd0YXJnZXQiOiJ2aWV3VGFyZ2V0IiwieGNoYW5uZWxzZWxlY3RvciI6InhDaGFubmVsU2VsZWN0b3IiLCJ5Y2hhbm5lbHNlbGVjdG9yIjoieUNoYW5uZWxTZWxlY3RvciIsInpvb21hbmRwYW4iOiJ6b29tQW5kUGFuIn19Jyl9LGZ1bmN0aW9uKGQscil7dmFyIHQ9ci5nZXRDaGlsZHJlbj1mdW5jdGlvbihuKXtyZXR1cm4gbi5jaGlsZHJlbn0sZT1yLmdldFBhcmVudD1mdW5jdGlvbihuKXtyZXR1cm4gbi5wYXJlbnR9O3IuZ2V0U2libGluZ3M9ZnVuY3Rpb24obil7dmFyIGE9ZShuKTtyZXR1cm4gYT90KGEpOltuXX0sci5nZXRBdHRyaWJ1dGVWYWx1ZT1mdW5jdGlvbihuLGEpe3JldHVybiBuLmF0dHJpYnMmJm4uYXR0cmlic1thXX0sci5oYXNBdHRyaWI9ZnVuY3Rpb24obixhKXtyZXR1cm4hIW4uYXR0cmlicyYmaGFzT3duUHJvcGVydHkuY2FsbChuLmF0dHJpYnMsYSl9LHIuZ2V0TmFtZT1mdW5jdGlvbihuKXtyZXR1cm4gbi5uYW1lfX0sZnVuY3Rpb24oZCxyKXtyLnJlbW92ZUVsZW1lbnQ9ZnVuY3Rpb24odCl7aWYodC5wcmV2JiYodC5wcmV2Lm5leHQ9dC5uZXh0KSx0Lm5leHQmJih0Lm5leHQucHJldj10LnByZXYpLHQucGFyZW50KXt2YXIgZT10LnBhcmVudC5jaGlsZHJlbjtlLnNwbGljZShlLmxhc3RJbmRleE9mKHQpLDEpfX0sci5yZXBsYWNlRWxlbWVudD1mdW5jdGlvbih0LGUpe3ZhciBuPWUucHJldj10LnByZXY7biYmKG4ubmV4dD1lKTt2YXIgYT1lLm5leHQ9dC5uZXh0O2EmJihhLnByZXY9ZSk7dmFyIHM9ZS5wYXJlbnQ9dC5wYXJlbnQ7aWYocyl7dmFyIGk9cy5jaGlsZHJlbjtpW2kubGFzdEluZGV4T2YodCldPWV9fSxyLmFwcGVuZENoaWxkPWZ1bmN0aW9uKHQsZSl7aWYoZS5wYXJlbnQ9dCx0LmNoaWxkcmVuLnB1c2goZSkhPT0xKXt2YXIgbj10LmNoaWxkcmVuW3QuY2hpbGRyZW4ubGVuZ3RoLTJdO24ubmV4dD1lLGUucHJldj1uLGUubmV4dD1udWxsfX0sci5hcHBlbmQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10LnBhcmVudCxhPXQubmV4dDtpZihlLm5leHQ9YSxlLnByZXY9dCx0Lm5leHQ9ZSxlLnBhcmVudD1uLGEpe2lmKGEucHJldj1lLG4pe3ZhciBzPW4uY2hpbGRyZW47cy5zcGxpY2Uocy5sYXN0SW5kZXhPZihhKSwwLGUpfX1lbHNlIG4mJm4uY2hpbGRyZW4ucHVzaChlKX0sci5wcmVwZW5kPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5wYXJlbnQ7aWYobil7dmFyIGE9bi5jaGlsZHJlbjthLnNwbGljZShhLmxhc3RJbmRleE9mKHQpLDAsZSl9dC5wcmV2JiYodC5wcmV2Lm5leHQ9ZSksZS5wYXJlbnQ9bixlLnByZXY9dC5wcmV2LGUubmV4dD10LHQucHJldj1lfX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoMjU2KS5pc1RhZztkLmV4cG9ydHM9e2ZpbHRlcjpuLGZpbmQ6YSxmaW5kT25lQ2hpbGQ6cyxmaW5kT25lOmksZXhpc3RzT25lOm8sZmluZEFsbDpjfTtmdW5jdGlvbiBuKG0sdSxwLHkpe3JldHVybiBBcnJheS5pc0FycmF5KHUpfHwodT1bdV0pLCh0eXBlb2YgeSE9Im51bWJlciJ8fCFpc0Zpbml0ZSh5KSkmJih5PTEvMCksYShtLHUscCE9PSExLHkpfWZ1bmN0aW9uIGEobSx1LHAseSl7Zm9yKHZhciBPPVtdLHgsdj0wLFQ9dS5sZW5ndGg7djxUJiYhKG0odVt2XSkmJihPLnB1c2godVt2XSksLS15PD0wKXx8KHg9dVt2XS5jaGlsZHJlbixwJiZ4JiZ4Lmxlbmd0aD4wJiYoeD1hKG0seCxwLHkpLE89Ty5jb25jYXQoeCkseS09eC5sZW5ndGgseTw9MCkpKTt2KyspO3JldHVybiBPfWZ1bmN0aW9uIHMobSx1KXtmb3IodmFyIHA9MCx5PXUubGVuZ3RoO3A8eTtwKyspaWYobSh1W3BdKSlyZXR1cm4gdVtwXTtyZXR1cm4gbnVsbH1mdW5jdGlvbiBpKG0sdSl7Zm9yKHZhciBwPW51bGwseT0wLE89dS5sZW5ndGg7eTxPJiYhcDt5KyspaWYoZSh1W3ldKSltKHVbeV0pP3A9dVt5XTp1W3ldLmNoaWxkcmVuLmxlbmd0aD4wJiYocD1pKG0sdVt5XS5jaGlsZHJlbikpO2Vsc2UgY29udGludWU7cmV0dXJuIHB9ZnVuY3Rpb24gbyhtLHUpe2Zvcih2YXIgcD0wLHk9dS5sZW5ndGg7cDx5O3ArKylpZihlKHVbcF0pJiYobSh1W3BdKXx8dVtwXS5jaGlsZHJlbi5sZW5ndGg+MCYmbyhtLHVbcF0uY2hpbGRyZW4pKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBjKG0sdSl7Zm9yKHZhciBwPVtdLHk9dS5zbGljZSgpO3kubGVuZ3RoOyl7dmFyIE89eS5zaGlmdCgpO2UoTykmJihPLmNoaWxkcmVuJiZPLmNoaWxkcmVuLmxlbmd0aD4wJiZ5LnVuc2hpZnQuYXBwbHkoeSxPLmNoaWxkcmVuKSxtKE8pJiZwLnB1c2goTykpfXJldHVybiBwfX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoMjU2KSxuPXIuaXNUYWc9ZS5pc1RhZztyLnRlc3RFbGVtZW50PWZ1bmN0aW9uKG8sYyl7Zm9yKHZhciBtIGluIG8paWYoby5oYXNPd25Qcm9wZXJ0eShtKSl7aWYobT09PSJ0YWdfbmFtZSIpe2lmKCFuKGMpfHwhby50YWdfbmFtZShjLm5hbWUpKXJldHVybiExfWVsc2UgaWYobT09PSJ0YWdfdHlwZSIpe2lmKCFvLnRhZ190eXBlKGMudHlwZSkpcmV0dXJuITF9ZWxzZSBpZihtPT09InRhZ19jb250YWlucyIpe2lmKG4oYyl8fCFvLnRhZ19jb250YWlucyhjLmRhdGEpKXJldHVybiExfWVsc2UgaWYoIWMuYXR0cmlic3x8IW9bbV0oYy5hdHRyaWJzW21dKSlyZXR1cm4hMX1yZXR1cm4hMH07dmFyIGE9e3RhZ19uYW1lOmZ1bmN0aW9uKG8pe3JldHVybiB0eXBlb2Ygbz09ImZ1bmN0aW9uIj9mdW5jdGlvbihjKXtyZXR1cm4gbihjKSYmbyhjLm5hbWUpfTpvPT09IioiP246ZnVuY3Rpb24oYyl7cmV0dXJuIG4oYykmJmMubmFtZT09PW99fSx0YWdfdHlwZTpmdW5jdGlvbihvKXtyZXR1cm4gdHlwZW9mIG89PSJmdW5jdGlvbiI/ZnVuY3Rpb24oYyl7cmV0dXJuIG8oYy50eXBlKX06ZnVuY3Rpb24oYyl7cmV0dXJuIGMudHlwZT09PW99fSx0YWdfY29udGFpbnM6ZnVuY3Rpb24obyl7cmV0dXJuIHR5cGVvZiBvPT0iZnVuY3Rpb24iP2Z1bmN0aW9uKGMpe3JldHVybiFuKGMpJiZvKGMuZGF0YSl9OmZ1bmN0aW9uKGMpe3JldHVybiFuKGMpJiZjLmRhdGE9PT1vfX19O2Z1bmN0aW9uIHMobyxjKXtyZXR1cm4gdHlwZW9mIGM9PSJmdW5jdGlvbiI/ZnVuY3Rpb24obSl7cmV0dXJuIG0uYXR0cmlicyYmYyhtLmF0dHJpYnNbb10pfTpmdW5jdGlvbihtKXtyZXR1cm4gbS5hdHRyaWJzJiZtLmF0dHJpYnNbb109PT1jfX1mdW5jdGlvbiBpKG8sYyl7cmV0dXJuIGZ1bmN0aW9uKG0pe3JldHVybiBvKG0pfHxjKG0pfX1yLmdldEVsZW1lbnRzPWZ1bmN0aW9uKG8sYyxtLHUpe3ZhciBwPU9iamVjdC5rZXlzKG8pLm1hcChmdW5jdGlvbih5KXt2YXIgTz1vW3ldO3JldHVybiB5IGluIGE/YVt5XShPKTpzKHksTyl9KTtyZXR1cm4gcC5sZW5ndGg9PT0wP1tdOnRoaXMuZmlsdGVyKHAucmVkdWNlKGkpLGMsbSx1KX0sci5nZXRFbGVtZW50QnlJZD1mdW5jdGlvbihvLGMsbSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoYyl8fChjPVtjXSksdGhpcy5maW5kT25lKHMoImlkIixvKSxjLG0hPT0hMSl9LHIuZ2V0RWxlbWVudHNCeVRhZ05hbWU9ZnVuY3Rpb24obyxjLG0sdSl7cmV0dXJuIHRoaXMuZmlsdGVyKGEudGFnX25hbWUobyksYyxtLHUpfSxyLmdldEVsZW1lbnRzQnlUYWdUeXBlPWZ1bmN0aW9uKG8sYyxtLHUpe3JldHVybiB0aGlzLmZpbHRlcihhLnRhZ190eXBlKG8pLGMsbSx1KX19LGZ1bmN0aW9uKGQscil7ci5yZW1vdmVTdWJzZXRzPWZ1bmN0aW9uKG4pe2Zvcih2YXIgYT1uLmxlbmd0aCxzLGksbzstLWE+LTE7KXtmb3Iocz1pPW5bYV0sblthXT1udWxsLG89ITA7aTspe2lmKG4uaW5kZXhPZihpKT4tMSl7bz0hMSxuLnNwbGljZShhLDEpO2JyZWFrfWk9aS5wYXJlbnR9byYmKG5bYV09cyl9cmV0dXJuIG59O3ZhciB0PXtESVNDT05ORUNURUQ6MSxQUkVDRURJTkc6MixGT0xMT1dJTkc6NCxDT05UQUlOUzo4LENPTlRBSU5FRF9CWToxNn0sZT1yLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uPWZ1bmN0aW9uKG4sYSl7dmFyIHM9W10saT1bXSxvLGMsbSx1LHAseTtpZihuPT09YSlyZXR1cm4gMDtmb3Iobz1uO287KXMudW5zaGlmdChvKSxvPW8ucGFyZW50O2ZvcihvPWE7bzspaS51bnNoaWZ0KG8pLG89by5wYXJlbnQ7Zm9yKHk9MDtzW3ldPT09aVt5XTspeSsrO3JldHVybiB5PT09MD90LkRJU0NPTk5FQ1RFRDooYz1zW3ktMV0sbT1jLmNoaWxkcmVuLHU9c1t5XSxwPWlbeV0sbS5pbmRleE9mKHUpPm0uaW5kZXhPZihwKT9jPT09YT90LkZPTExPV0lOR3x0LkNPTlRBSU5FRF9CWTp0LkZPTExPV0lORzpjPT09bj90LlBSRUNFRElOR3x0LkNPTlRBSU5TOnQuUFJFQ0VESU5HKX07ci51bmlxdWVTb3J0PWZ1bmN0aW9uKG4pe3ZhciBhPW4ubGVuZ3RoLHMsaTtmb3Iobj1uLnNsaWNlKCk7LS1hPi0xOylzPW5bYV0saT1uLmluZGV4T2YocyksaT4tMSYmaTxhJiZuLnNwbGljZShhLDEpO3JldHVybiBuLnNvcnQoZnVuY3Rpb24obyxjKXt2YXIgbT1lKG8sYyk7cmV0dXJuIG0mdC5QUkVDRURJTkc/LTE6bSZ0LkZPTExPV0lORz8xOjB9KSxufX0sZnVuY3Rpb24oZCxyKXtkLmV4cG9ydHM9e3RydWVGdW5jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGZhbHNlRnVuYzpmdW5jdGlvbigpe3JldHVybiExfX19LGZ1bmN0aW9uKGQscix0KXtkLmV4cG9ydHM9cDt2YXIgZT10KDI3NSkucGFyc2Usbj10KDI3MyksYT10KDI3OCkscz10KDI3OSksaT10KDI4MCksbz10KDI4MiksYz1uLnRydWVGdW5jLG09bi5mYWxzZUZ1bmMsdT1vLmZpbHRlcnM7ZnVuY3Rpb24gcChFLEwsRCl7dmFyIEk9TyhFLEwsRCk7cmV0dXJuIHkoSSxMKX1mdW5jdGlvbiB5KEUsTCl7dmFyIEQ9TC5hZGFwdGVyO3JldHVybiBmdW5jdGlvbihSKXtyZXR1cm4gRC5pc1RhZyhSKSYmRShSKX19ZnVuY3Rpb24gTyhFLEwsRCl7dmFyIEk9ZShFLEwpO3JldHVybiBnKEksTCxEKX1mdW5jdGlvbiB4KEUpe3JldHVybiBFLnR5cGU9PT0icHNldWRvIiYmKEUubmFtZT09PSJzY29wZSJ8fEFycmF5LmlzQXJyYXkoRS5kYXRhKSYmRS5kYXRhLnNvbWUoZnVuY3Rpb24oTCl7cmV0dXJuIEwuc29tZSh4KX0pKX12YXIgdj17dHlwZToiZGVzY2VuZGFudCJ9LFQ9e3R5cGU6Il9mbGV4aWJsZURlc2NlbmRhbnQifSxsPXt0eXBlOiJwc2V1ZG8iLG5hbWU6InNjb3BlIn0saD17fTtmdW5jdGlvbiBmKEUsTCxEKXt2YXIgST1MLmFkYXB0ZXIsUj0hIUQmJiEhRC5sZW5ndGgmJkQuZXZlcnkoZnVuY3Rpb24oQil7cmV0dXJuIEI9PT1ofHwhIUkuZ2V0UGFyZW50KEIpfSk7RS5mb3JFYWNoKGZ1bmN0aW9uKEIpe2lmKCEoQi5sZW5ndGg+MCYmTShCWzBdKSYmQlswXS50eXBlIT09ImRlc2NlbmRhbnQiKSlpZihSJiYhKEFycmF5LmlzQXJyYXkoQik/Qi5zb21lKHgpOngoQikpKUIudW5zaGlmdCh2KTtlbHNlIHJldHVybjtCLnVuc2hpZnQobCl9KX1mdW5jdGlvbiBnKEUsTCxEKXtFPUUuZmlsdGVyKGZ1bmN0aW9uKHope3JldHVybiB6Lmxlbmd0aD4wfSksRS5mb3JFYWNoKGEpO3ZhciBJPUFycmF5LmlzQXJyYXkoRCk7RD1MJiZMLmNvbnRleHR8fEQsRCYmIUkmJihEPVtEXSksZihFLEwsRCk7dmFyIFI9ITEsQj1FLm1hcChmdW5jdGlvbih6KXtpZih6WzBdJiZ6WzFdJiZ6WzBdLm5hbWU9PT0ic2NvcGUiKXt2YXIgSz16WzFdLnR5cGU7SSYmSz09PSJkZXNjZW5kYW50Ij96WzFdPVQ6KEs9PT0iYWRqYWNlbnQifHxLPT09InNpYmxpbmciKSYmKFI9ITApfXJldHVybiBBKHosTCxEKX0pLnJlZHVjZShDLG0pO3JldHVybiBCLnNob3VsZFRlc3ROZXh0U2libGluZ3M9UixCfWZ1bmN0aW9uIE0oRSl7cmV0dXJuIHNbRS50eXBlXTwwfWZ1bmN0aW9uIEEoRSxMLEQpe3JldHVybiBFLnJlZHVjZShmdW5jdGlvbihJLFIpe2lmKEk9PT1tKXJldHVybiBJO2lmKCEoUi50eXBlIGluIGkpKXRocm93IG5ldyBFcnJvcigiUnVsZSB0eXBlICIrUi50eXBlKyIgaXMgbm90IHN1cHBvcnRlZCBieSBjc3Mtc2VsZWN0Iik7cmV0dXJuIGlbUi50eXBlXShJLFIsTCxEKX0sTCYmTC5yb290RnVuY3x8Yyl9ZnVuY3Rpb24gQyhFLEwpe3JldHVybiBMPT09bXx8RT09PWM/RTpFPT09bXx8TD09PWM/TDpmdW5jdGlvbihJKXtyZXR1cm4gRShJKXx8TChJKX19ZnVuY3Rpb24gYihFKXtyZXR1cm4gRS5zb21lKE0pfXUubm90PWZ1bmN0aW9uKEUsTCxELEkpe3ZhciBSPXt4bWxNb2RlOiEhKEQmJkQueG1sTW9kZSksc3RyaWN0OiEhKEQmJkQuc3RyaWN0KSxhZGFwdGVyOkQuYWRhcHRlcn07aWYoUi5zdHJpY3QmJihMLmxlbmd0aD4xfHxMLnNvbWUoYikpKXRocm93IG5ldyBFcnJvcigiY29tcGxleCBzZWxlY3RvcnMgaW4gOm5vdCBhcmVuJ3QgYWxsb3dlZCBpbiBzdHJpY3QgbW9kZSIpO3ZhciBCPWcoTCxSLEkpO3JldHVybiBCPT09bT9FOkI9PT1jP206ZnVuY3Rpb24oSyl7cmV0dXJuIUIoSykmJkUoSyl9fSx1Lmhhcz1mdW5jdGlvbihFLEwsRCl7dmFyIEk9RC5hZGFwdGVyLFI9e3htbE1vZGU6ISEoRCYmRC54bWxNb2RlKSxzdHJpY3Q6ISEoRCYmRC5zdHJpY3QpLGFkYXB0ZXI6SX0sQj1MLnNvbWUoYik/W2hdOm51bGwsej1nKEwsUixCKTtyZXR1cm4gej09PW0/bTp6PT09Yz9mdW5jdGlvbihRKXtyZXR1cm4gSS5nZXRDaGlsZHJlbihRKS5zb21lKEkuaXNUYWcpJiZFKFEpfTooej15KHosRCksQj9mdW5jdGlvbihRKXtyZXR1cm4gRShRKSYmKEJbMF09USxJLmV4aXN0c09uZSh6LEkuZ2V0Q2hpbGRyZW4oUSkpKX06ZnVuY3Rpb24oUSl7cmV0dXJuIEUoUSkmJkkuZXhpc3RzT25lKHosSS5nZXRDaGlsZHJlbihRKSl9KX0sdS5tYXRjaGVzPWZ1bmN0aW9uKEUsTCxELEkpe3ZhciBSPXt4bWxNb2RlOiEhKEQmJkQueG1sTW9kZSksc3RyaWN0OiEhKEQmJkQuc3RyaWN0KSxyb290RnVuYzpFLGFkYXB0ZXI6RC5hZGFwdGVyfTtyZXR1cm4gZyhMLFIsSSl9LHAuY29tcGlsZVRva2VuPWcscC5jb21waWxlVW5zYWZlPU8scC5Qc2V1ZG9zPW99LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10aGlzJiZ0aGlzLl9fY3JlYXRlQmluZGluZ3x8KE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24oaSxvLGMsbSl7bT09PXZvaWQgMCYmKG09YyksT2JqZWN0LmRlZmluZVByb3BlcnR5KGksbSx7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb1tjXX19KX06ZnVuY3Rpb24oaSxvLGMsbSl7bT09PXZvaWQgMCYmKG09YyksaVttXT1vW2NdfSksbj10aGlzJiZ0aGlzLl9fZXhwb3J0U3Rhcnx8ZnVuY3Rpb24oaSxvKXtmb3IodmFyIGMgaW4gaSljIT09ImRlZmF1bHQiJiYhby5oYXNPd25Qcm9wZXJ0eShjKSYmZShvLGksYyl9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxuKHQoMjc2KSxyKTt2YXIgYT10KDI3Nik7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsInBhcnNlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYS5kZWZhdWx0fX0pO3ZhciBzPXQoMjc3KTtPYmplY3QuZGVmaW5lUHJvcGVydHkociwic3RyaW5naWZ5Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcy5kZWZhdWx0fX0pfSxmdW5jdGlvbihkLHIsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHIuZGVmYXVsdD14O3ZhciBlPS9eW15cXF0/KD86XFwoPzpbXGRhLWZdezEsNn1ccz98Lil8W1x3XC1cdTAwYjAtXHVGRkZGXSkrLyxuPS9cXChbXGRhLWZdezEsNn1ccz98KFxzKXwuKS9naSxhPS9eXHMqKCg/OlxcLnxbXHdcdTAwYjAtXHVGRkZGLV0pKylccyooPzooXFM/KT1ccyooPzooWyciXSkoW15dKj8pXDN8KCM/KD86XFwufFtcd1x1MDBiMC1cdUZGRkYtXSkqKXwpfClccyooaSk/XF0vLHM9e3VuZGVmaW5lZDoiZXhpc3RzIiwiIjoiZXF1YWxzIiwifiI6ImVsZW1lbnQiLCJeIjoic3RhcnQiLCQ6ImVuZCIsIioiOiJhbnkiLCIhIjoibm90IiwifCI6Imh5cGhlbiJ9LGk9eyI+IjoiY2hpbGQiLCI8IjoicGFyZW50IiwifiI6InNpYmxpbmciLCIrIjoiYWRqYWNlbnQifSxvPXsiIyI6WyJpZCIsImVxdWFscyJdLCIuIjpbImNsYXNzIiwiZWxlbWVudCJdfSxjPW5ldyBTZXQoWyJoYXMiLCJub3QiLCJtYXRjaGVzIl0pLG09bmV3IFNldChbImNvbnRhaW5zIiwiaWNvbnRhaW5zIl0pLHU9bmV3IFNldChbJyInLCInIl0pO2Z1bmN0aW9uIHAobCxoLGYpe3ZhciBnPXBhcnNlSW50KGgsMTYpLTY1NTM2O3JldHVybiBnIT09Z3x8Zj9oOmc8MD9TdHJpbmcuZnJvbUNoYXJDb2RlKGcrNjU1MzYpOlN0cmluZy5mcm9tQ2hhckNvZGUoZz4+MTB8NTUyOTYsZyYxMDIzfDU2MzIwKX1mdW5jdGlvbiB5KGwpe3JldHVybiBsLnJlcGxhY2UobixwKX1mdW5jdGlvbiBPKGwpe3JldHVybiBsPT09IiAifHxsPT09YApgfHxsPT09IgkifHxsPT09IlxmInx8bD09PSJcciJ9ZnVuY3Rpb24geChsLGgpe3ZhciBmPVtdO2lmKGw9dihmLCIiK2wsaCksbCE9PSIiKXRocm93IG5ldyBFcnJvcigiVW5tYXRjaGVkIHNlbGVjdG9yOiAiK2wpO3JldHVybiBmfWZ1bmN0aW9uIHYobCxoLGYpe3ZhciBnPVtdLE09ITE7ZnVuY3Rpb24gQSgpe3ZhciBYPWgubWF0Y2goZSk7aWYoIVgpdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCBuYW1lLCBmb3VuZCAiK2gpO3ZhciBaPVhbMF07cmV0dXJuIGg9aC5zdWJzdHIoWi5sZW5ndGgpLHkoWil9ZnVuY3Rpb24gQyhYKXtmb3IoO08oaC5jaGFyQXQoWCkpOylYKys7aD1oLnN1YnN0cihYKX1mdW5jdGlvbiBiKFgpe2Zvcih2YXIgWj0wO2guY2hhckF0KC0tWCk9PT0iXFwiOylaKys7cmV0dXJuKFomMSk9PT0xfWZvcihDKDApO2ghPT0iIjspe3ZhciBFPWguY2hhckF0KDApO2lmKE8oRSkpTT0hMCxDKDEpO2Vsc2UgaWYoRSBpbiBpKWcucHVzaCh7dHlwZTppW0VdfSksTT0hMSxDKDEpO2Vsc2UgaWYoRT09PSIsIil7aWYoZy5sZW5ndGg9PT0wKXRocm93IG5ldyBFcnJvcigiRW1wdHkgc3ViLXNlbGVjdG9yIik7bC5wdXNoKGcpLGc9W10sTT0hMSxDKDEpfWVsc2UgaWYoTSYmKGcubGVuZ3RoPjAmJmcucHVzaCh7dHlwZToiZGVzY2VuZGFudCJ9KSxNPSExKSxFPT09IioiKWg9aC5zdWJzdHIoMSksZy5wdXNoKHt0eXBlOiJ1bml2ZXJzYWwifSk7ZWxzZSBpZihFIGluIG8pe3ZhciBMPW9bRV0sRD1MWzBdLEk9TFsxXTtoPWguc3Vic3RyKDEpLGcucHVzaCh7dHlwZToiYXR0cmlidXRlIixuYW1lOkQsYWN0aW9uOkksdmFsdWU6QSgpLGlnbm9yZUNhc2U6ITF9KX1lbHNlIGlmKEU9PT0iWyIpe2g9aC5zdWJzdHIoMSk7dmFyIFI9aC5tYXRjaChhKTtpZighUil0aHJvdyBuZXcgRXJyb3IoIk1hbGZvcm1lZCBhdHRyaWJ1dGUgc2VsZWN0b3I6ICIraCk7aD1oLnN1YnN0cihSWzBdLmxlbmd0aCk7dmFyIEI9eShSWzFdKTsoIWZ8fCgibG93ZXJDYXNlQXR0cmlidXRlTmFtZXMiaW4gZj9mLmxvd2VyQ2FzZUF0dHJpYnV0ZU5hbWVzOiFmLnhtbE1vZGUpKSYmKEI9Qi50b0xvd2VyQ2FzZSgpKSxnLnB1c2goe3R5cGU6ImF0dHJpYnV0ZSIsbmFtZTpCLGFjdGlvbjpzW1JbMl1dLHZhbHVlOnkoUls0XXx8Uls1XXx8IiIpLGlnbm9yZUNhc2U6ISFSWzZdfSl9ZWxzZSBpZihFPT09IjoiKXtpZihoLmNoYXJBdCgxKT09PSI6Iil7aD1oLnN1YnN0cigyKSxnLnB1c2goe3R5cGU6InBzZXVkby1lbGVtZW50IixuYW1lOkEoKS50b0xvd2VyQ2FzZSgpfSk7Y29udGludWV9aD1oLnN1YnN0cigxKTt2YXIgej1BKCkudG9Mb3dlckNhc2UoKSxSPW51bGw7aWYoaC5jaGFyQXQoMCk9PT0iKCIpaWYoYy5oYXMoeikpe3ZhciBLPWguY2hhckF0KDEpLFE9dS5oYXMoSyk7aWYoaD1oLnN1YnN0cihRPzI6MSksUj1bXSxoPXYoUixoLGYpLFEpe2lmKGguY2hhckF0KDApIT09Syl0aHJvdyBuZXcgRXJyb3IoIlVubWF0Y2hlZCBxdW90ZXMgaW4gOiIreik7aD1oLnN1YnN0cigxKX1pZihoLmNoYXJBdCgwKSE9PSIpIil0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgY2xvc2luZyBwYXJlbnRoZXNpcyBpbiA6Iit6KyIgKCIraCsiKSIpO2g9aC5zdWJzdHIoMSl9ZWxzZXtmb3IodmFyIF89MSxqPTE7aj4wJiZfPGgubGVuZ3RoO18rKyloLmNoYXJBdChfKT09PSIoIiYmIWIoXyk/aisrOmguY2hhckF0KF8pPT09IikiJiYhYihfKSYmai0tO2lmKGopdGhyb3cgbmV3IEVycm9yKCJQYXJlbnRoZXNpcyBub3QgbWF0Y2hlZCIpO2lmKFI9aC5zdWJzdHIoMSxfLTIpLGg9aC5zdWJzdHIoXyksbS5oYXMoeikpe3ZhciBLPVIuY2hhckF0KDApO0s9PT1SLnNsaWNlKC0xKSYmdS5oYXMoSykmJihSPVIuc2xpY2UoMSwtMSkpLFI9eShSKX19Zy5wdXNoKHt0eXBlOiJwc2V1ZG8iLG5hbWU6eixkYXRhOlJ9KX1lbHNlIGlmKGUudGVzdChoKSl7dmFyIEc9QSgpOyghZnx8KCJsb3dlckNhc2VUYWdzImluIGY/Zi5sb3dlckNhc2VUYWdzOiFmLnhtbE1vZGUpKSYmKEc9Ry50b0xvd2VyQ2FzZSgpKSxnLnB1c2goe3R5cGU6InRhZyIsbmFtZTpHfSl9ZWxzZSByZXR1cm4gZy5sZW5ndGgmJmdbZy5sZW5ndGgtMV0udHlwZT09PSJkZXNjZW5kYW50IiYmZy5wb3AoKSxUKGwsZyksaH1yZXR1cm4gVChsLGcpLGh9ZnVuY3Rpb24gVChsLGgpe2lmKGwubGVuZ3RoPjAmJmgubGVuZ3RoPT09MCl0aHJvdyBuZXcgRXJyb3IoIkVtcHR5IHN1Yi1zZWxlY3RvciIpO2wucHVzaChoKX19LGZ1bmN0aW9uKGQscix0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGU9e2VxdWFsczoiIixlbGVtZW50OiJ+IixzdGFydDoiXiIsZW5kOiIkIixhbnk6IioiLG5vdDoiISIsaHlwaGVuOiJ8In07ZnVuY3Rpb24gbihvKXtyZXR1cm4gby5tYXAoYSkuam9pbigiLCAiKX1yLmRlZmF1bHQ9bjtmdW5jdGlvbiBhKG8pe3JldHVybiBvLm1hcChzKS5qb2luKCIiKX1mdW5jdGlvbiBzKG8pe3N3aXRjaChvLnR5cGUpe2Nhc2UiY2hpbGQiOnJldHVybiIgPiAiO2Nhc2UicGFyZW50IjpyZXR1cm4iIDwgIjtjYXNlInNpYmxpbmciOnJldHVybiIgfiAiO2Nhc2UiYWRqYWNlbnQiOnJldHVybiIgKyAiO2Nhc2UiZGVzY2VuZGFudCI6cmV0dXJuIiAiO2Nhc2UidW5pdmVyc2FsIjpyZXR1cm4iKiI7Y2FzZSJ0YWciOnJldHVybiBvLm5hbWU7Y2FzZSJwc2V1ZG8tZWxlbWVudCI6cmV0dXJuIjo6IitvLm5hbWU7Y2FzZSJwc2V1ZG8iOnJldHVybiBvLmRhdGE9PT1udWxsPyI6IitvLm5hbWU6dHlwZW9mIG8uZGF0YT09InN0cmluZyI/IjoiK28ubmFtZSsiKCIrby5kYXRhKyIpIjoiOiIrby5uYW1lKyIoIituKG8uZGF0YSkrIikiO2Nhc2UiYXR0cmlidXRlIjpyZXR1cm4gby5hY3Rpb249PT0iZXhpc3RzIj8iWyIrby5uYW1lKyJdIjpvLm5hbWU9PT0iaWQiJiZvLmFjdGlvbj09PSJlcXVhbHMiJiYhby5pZ25vcmVDYXNlPyIjIitvLnZhbHVlOm8ubmFtZT09PSJjbGFzcyImJm8uYWN0aW9uPT09ImVsZW1lbnQiJiYhby5pZ25vcmVDYXNlPyIuIitvLnZhbHVlOiJbIitvLm5hbWUrZVtvLmFjdGlvbl0rIj0nIitvLnZhbHVlKyInIisoby5pZ25vcmVDYXNlPyJpIjoiIikrIl0iO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIHR5cGUiKX19ZnVuY3Rpb24gaShvKXtyZXR1cm4gb319LGZ1bmN0aW9uKGQscix0KXtkLmV4cG9ydHM9YTt2YXIgZT10KDI3OSksbj17X19wcm90b19fOm51bGwsZXhpc3RzOjEwLGVxdWFsczo4LG5vdDo3LHN0YXJ0OjYsZW5kOjYsYW55OjUsaHlwaGVuOjQsZWxlbWVudDo0fTtmdW5jdGlvbiBhKGkpe2Zvcih2YXIgbz1pLm1hcChzKSxjPTE7YzxpLmxlbmd0aDtjKyspe3ZhciBtPW9bY107aWYoIShtPDApKWZvcih2YXIgdT1jLTE7dT49MCYmbTxvW3VdO3UtLSl7dmFyIHA9aVt1KzFdO2lbdSsxXT1pW3VdLGlbdV09cCxvW3UrMV09b1t1XSxvW3VdPW19fX1mdW5jdGlvbiBzKGkpe3ZhciBvPWVbaS50eXBlXTtpZihvPT09ZS5hdHRyaWJ1dGUpbz1uW2kuYWN0aW9uXSxvPT09bi5lcXVhbHMmJmkubmFtZT09PSJpZCImJihvPTkpLGkuaWdub3JlQ2FzZSYmKG8+Pj0xKTtlbHNlIGlmKG89PT1lLnBzZXVkbylpZighaS5kYXRhKW89MztlbHNlIGlmKGkubmFtZT09PSJoYXMifHxpLm5hbWU9PT0iY29udGFpbnMiKW89MDtlbHNlIGlmKGkubmFtZT09PSJtYXRjaGVzInx8aS5uYW1lPT09Im5vdCIpe289MDtmb3IodmFyIGM9MDtjPGkuZGF0YS5sZW5ndGg7YysrKWlmKGkuZGF0YVtjXS5sZW5ndGg9PT0xKXt2YXIgbT1zKGkuZGF0YVtjXVswXSk7aWYobT09PTApe289MDticmVha31tPm8mJihvPW0pfWkuZGF0YS5sZW5ndGg+MSYmbz4wJiYoby09MSl9ZWxzZSBvPTE7cmV0dXJuIG99fSxmdW5jdGlvbihkKXtkLmV4cG9ydHM9SlNPTi5wYXJzZSgneyJ1bml2ZXJzYWwiOjUwLCJ0YWciOjMwLCJhdHRyaWJ1dGUiOjEsInBzZXVkbyI6MCwiZGVzY2VuZGFudCI6LTEsImNoaWxkIjotMSwicGFyZW50IjotMSwic2libGluZyI6LTEsImFkamFjZW50IjotMX0nKX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoMjgxKSxuPXQoMjgyKTtkLmV4cG9ydHM9e19fcHJvdG9fXzpudWxsLGF0dHJpYnV0ZTplLmNvbXBpbGUscHNldWRvOm4uY29tcGlsZSx0YWc6ZnVuY3Rpb24oYSxzLGkpe3ZhciBvPXMubmFtZSxjPWkuYWRhcHRlcjtyZXR1cm4gZnVuY3Rpb24odSl7cmV0dXJuIGMuZ2V0TmFtZSh1KT09PW8mJmEodSl9fSxkZXNjZW5kYW50OmZ1bmN0aW9uKGEscyxpKXt2YXIgbz10eXBlb2YgV2Vha1NldDwidSI/bmV3IFdlYWtTZXQ6bnVsbCxjPWkuYWRhcHRlcjtyZXR1cm4gZnVuY3Rpb24odSl7Zm9yKHZhciBwPSExOyFwJiYodT1jLmdldFBhcmVudCh1KSk7KSghb3x8IW8uaGFzKHUpKSYmKHA9YSh1KSwhcCYmbyYmby5hZGQodSkpO3JldHVybiBwfX0sX2ZsZXhpYmxlRGVzY2VuZGFudDpmdW5jdGlvbihhLHMsaSl7dmFyIG89aS5hZGFwdGVyO3JldHVybiBmdW5jdGlvbihtKXtmb3IodmFyIHU9YShtKTshdSYmKG09by5nZXRQYXJlbnQobSkpOyl1PWEobSk7cmV0dXJuIHV9fSxwYXJlbnQ6ZnVuY3Rpb24oYSxzLGkpe2lmKGkmJmkuc3RyaWN0KXRocm93IG5ldyBFcnJvcigiUGFyZW50IHNlbGVjdG9yIGlzbid0IHBhcnQgb2YgQ1NTMyIpO3ZhciBvPWkuYWRhcHRlcjtyZXR1cm4gZnVuY3Rpb24odSl7cmV0dXJuIG8uZ2V0Q2hpbGRyZW4odSkuc29tZShjKX07ZnVuY3Rpb24gYyhtKXtyZXR1cm4gby5pc1RhZyhtKSYmYShtKX19LGNoaWxkOmZ1bmN0aW9uKGEscyxpKXt2YXIgbz1pLmFkYXB0ZXI7cmV0dXJuIGZ1bmN0aW9uKG0pe3ZhciB1PW8uZ2V0UGFyZW50KG0pO3JldHVybiEhdSYmYSh1KX19LHNpYmxpbmc6ZnVuY3Rpb24oYSxzLGkpe3ZhciBvPWkuYWRhcHRlcjtyZXR1cm4gZnVuY3Rpb24obSl7Zm9yKHZhciB1PW8uZ2V0U2libGluZ3MobSkscD0wO3A8dS5sZW5ndGg7cCsrKWlmKG8uaXNUYWcodVtwXSkpe2lmKHVbcF09PT1tKWJyZWFrO2lmKGEodVtwXSkpcmV0dXJuITB9cmV0dXJuITF9fSxhZGphY2VudDpmdW5jdGlvbihhLHMsaSl7dmFyIG89aS5hZGFwdGVyO3JldHVybiBmdW5jdGlvbihtKXtmb3IodmFyIHU9by5nZXRTaWJsaW5ncyhtKSxwLHk9MDt5PHUubGVuZ3RoO3krKylpZihvLmlzVGFnKHVbeV0pKXtpZih1W3ldPT09bSlicmVhaztwPXVbeV19cmV0dXJuISFwJiZhKHApfX0sdW5pdmVyc2FsOmZ1bmN0aW9uKGEpe3JldHVybiBhfX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDI3MykuZmFsc2VGdW5jLG49L1stW1xde30oKSorPy4sXFxeJHwjXHNdL2csYT17X19wcm90b19fOm51bGwsZXF1YWxzOmZ1bmN0aW9uKHMsaSxvKXt2YXIgYz1pLm5hbWUsbT1pLnZhbHVlLHU9by5hZGFwdGVyO3JldHVybiBpLmlnbm9yZUNhc2U/KG09bS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKHkpe3ZhciBPPXUuZ2V0QXR0cmlidXRlVmFsdWUoeSxjKTtyZXR1cm4gTyE9bnVsbCYmTy50b0xvd2VyQ2FzZSgpPT09bSYmcyh5KX0pOmZ1bmN0aW9uKHkpe3JldHVybiB1LmdldEF0dHJpYnV0ZVZhbHVlKHksYyk9PT1tJiZzKHkpfX0saHlwaGVuOmZ1bmN0aW9uKHMsaSxvKXt2YXIgYz1pLm5hbWUsbT1pLnZhbHVlLHU9bS5sZW5ndGgscD1vLmFkYXB0ZXI7cmV0dXJuIGkuaWdub3JlQ2FzZT8obT1tLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24oTyl7dmFyIHg9cC5nZXRBdHRyaWJ1dGVWYWx1ZShPLGMpO3JldHVybiB4IT1udWxsJiYoeC5sZW5ndGg9PT11fHx4LmNoYXJBdCh1KT09PSItIikmJnguc3Vic3RyKDAsdSkudG9Mb3dlckNhc2UoKT09PW0mJnMoTyl9KTpmdW5jdGlvbihPKXt2YXIgeD1wLmdldEF0dHJpYnV0ZVZhbHVlKE8sYyk7cmV0dXJuIHghPW51bGwmJnguc3Vic3RyKDAsdSk9PT1tJiYoeC5sZW5ndGg9PT11fHx4LmNoYXJBdCh1KT09PSItIikmJnMoTyl9fSxlbGVtZW50OmZ1bmN0aW9uKHMsaSxvKXt2YXIgYz1pLm5hbWUsbT1pLnZhbHVlLHU9by5hZGFwdGVyO2lmKC9ccy8udGVzdChtKSlyZXR1cm4gZTttPW0ucmVwbGFjZShuLCJcXCQmIik7dmFyIHA9Iig/Ol58XFxzKSIrbSsiKD86JHxcXHMpIix5PWkuaWdub3JlQ2FzZT8iaSI6IiIsTz1uZXcgUmVnRXhwKHAseSk7cmV0dXJuIGZ1bmN0aW9uKHYpe3ZhciBUPXUuZ2V0QXR0cmlidXRlVmFsdWUodixjKTtyZXR1cm4gVCE9bnVsbCYmTy50ZXN0KFQpJiZzKHYpfX0sZXhpc3RzOmZ1bmN0aW9uKHMsaSxvKXt2YXIgYz1pLm5hbWUsbT1vLmFkYXB0ZXI7cmV0dXJuIGZ1bmN0aW9uKHApe3JldHVybiBtLmhhc0F0dHJpYihwLGMpJiZzKHApfX0sc3RhcnQ6ZnVuY3Rpb24ocyxpLG8pe3ZhciBjPWkubmFtZSxtPWkudmFsdWUsdT1tLmxlbmd0aCxwPW8uYWRhcHRlcjtyZXR1cm4gdT09PTA/ZTppLmlnbm9yZUNhc2U/KG09bS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKE8pe3ZhciB4PXAuZ2V0QXR0cmlidXRlVmFsdWUoTyxjKTtyZXR1cm4geCE9bnVsbCYmeC5zdWJzdHIoMCx1KS50b0xvd2VyQ2FzZSgpPT09bSYmcyhPKX0pOmZ1bmN0aW9uKE8pe3ZhciB4PXAuZ2V0QXR0cmlidXRlVmFsdWUoTyxjKTtyZXR1cm4geCE9bnVsbCYmeC5zdWJzdHIoMCx1KT09PW0mJnMoTyl9fSxlbmQ6ZnVuY3Rpb24ocyxpLG8pe3ZhciBjPWkubmFtZSxtPWkudmFsdWUsdT0tbS5sZW5ndGgscD1vLmFkYXB0ZXI7cmV0dXJuIHU9PT0wP2U6aS5pZ25vcmVDYXNlPyhtPW0udG9Mb3dlckNhc2UoKSxmdW5jdGlvbihPKXt2YXIgeD1wLmdldEF0dHJpYnV0ZVZhbHVlKE8sYyk7cmV0dXJuIHghPW51bGwmJnguc3Vic3RyKHUpLnRvTG93ZXJDYXNlKCk9PT1tJiZzKE8pfSk6ZnVuY3Rpb24oTyl7dmFyIHg9cC5nZXRBdHRyaWJ1dGVWYWx1ZShPLGMpO3JldHVybiB4IT1udWxsJiZ4LnN1YnN0cih1KT09PW0mJnMoTyl9fSxhbnk6ZnVuY3Rpb24ocyxpLG8pe3ZhciBjPWkubmFtZSxtPWkudmFsdWUsdT1vLmFkYXB0ZXI7aWYobT09PSIiKXJldHVybiBlO2lmKGkuaWdub3JlQ2FzZSl7dmFyIHA9bmV3IFJlZ0V4cChtLnJlcGxhY2UobiwiXFwkJiIpLCJpIik7cmV0dXJuIGZ1bmN0aW9uKE8pe3ZhciB4PXUuZ2V0QXR0cmlidXRlVmFsdWUoTyxjKTtyZXR1cm4geCE9bnVsbCYmcC50ZXN0KHgpJiZzKE8pfX1yZXR1cm4gZnVuY3Rpb24oTyl7dmFyIHg9dS5nZXRBdHRyaWJ1dGVWYWx1ZShPLGMpO3JldHVybiB4IT1udWxsJiZ4LmluZGV4T2YobSk+PTAmJnMoTyl9fSxub3Q6ZnVuY3Rpb24ocyxpLG8pe3ZhciBjPWkubmFtZSxtPWkudmFsdWUsdT1vLmFkYXB0ZXI7cmV0dXJuIG09PT0iIj9mdW5jdGlvbih5KXtyZXR1cm4hIXUuZ2V0QXR0cmlidXRlVmFsdWUoeSxjKSYmcyh5KX06aS5pZ25vcmVDYXNlPyhtPW0udG9Mb3dlckNhc2UoKSxmdW5jdGlvbih5KXt2YXIgTz11LmdldEF0dHJpYnV0ZVZhbHVlKHksYyk7cmV0dXJuIE8hPW51bGwmJk8udG9Mb3dlckNhc2UoKSE9PW0mJnMoeSl9KTpmdW5jdGlvbih5KXtyZXR1cm4gdS5nZXRBdHRyaWJ1dGVWYWx1ZSh5LGMpIT09bSYmcyh5KX19fTtkLmV4cG9ydHM9e2NvbXBpbGU6ZnVuY3Rpb24ocyxpLG8pe2lmKG8mJm8uc3RyaWN0JiYoaS5pZ25vcmVDYXNlfHxpLmFjdGlvbj09PSJub3QiKSl0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIGF0dHJpYnV0ZSBzZWxlY3RvciIpO3JldHVybiBhW2kuYWN0aW9uXShzLGksbyl9LHJ1bGVzOmF9fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCgyODMpLG49dCgyNzMpLGE9dCgyODEpLHM9bi50cnVlRnVuYyxpPW4uZmFsc2VGdW5jLG89YS5ydWxlcy5lcXVhbHM7ZnVuY3Rpb24gYyhULGwpe3ZhciBoPXtuYW1lOlQsdmFsdWU6bH07cmV0dXJuIGZ1bmN0aW9uKGcsTSxBKXtyZXR1cm4gbyhnLGgsQSl9fWZ1bmN0aW9uIG0oVCxsKXtyZXR1cm4gZnVuY3Rpb24oaCl7cmV0dXJuISFsLmdldFBhcmVudChoKSYmVChoKX19dmFyIHU9e2NvbnRhaW5zOmZ1bmN0aW9uKFQsbCxoKXt2YXIgZj1oLmFkYXB0ZXI7cmV0dXJuIGZ1bmN0aW9uKE0pe3JldHVybiBUKE0pJiZmLmdldFRleHQoTSkuaW5kZXhPZihsKT49MH19LGljb250YWluczpmdW5jdGlvbihULGwsaCl7dmFyIGY9bC50b0xvd2VyQ2FzZSgpLGc9aC5hZGFwdGVyO3JldHVybiBmdW5jdGlvbihBKXtyZXR1cm4gVChBKSYmZy5nZXRUZXh0KEEpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihmKT49MH19LCJudGgtY2hpbGQiOmZ1bmN0aW9uKFQsbCxoKXt2YXIgZj1lKGwpLGc9aC5hZGFwdGVyO3JldHVybiBmPT09aT9mOmY9PT1zP20oVCxnKTpmdW5jdGlvbihBKXtmb3IodmFyIEM9Zy5nZXRTaWJsaW5ncyhBKSxiPTAsRT0wO2I8Qy5sZW5ndGg7YisrKWlmKGcuaXNUYWcoQ1tiXSkpe2lmKENbYl09PT1BKWJyZWFrO0UrK31yZXR1cm4gZihFKSYmVChBKX19LCJudGgtbGFzdC1jaGlsZCI6ZnVuY3Rpb24oVCxsLGgpe3ZhciBmPWUobCksZz1oLmFkYXB0ZXI7cmV0dXJuIGY9PT1pP2Y6Zj09PXM/bShULGcpOmZ1bmN0aW9uKEEpe2Zvcih2YXIgQz1nLmdldFNpYmxpbmdzKEEpLGI9MCxFPUMubGVuZ3RoLTE7RT49MDtFLS0paWYoZy5pc1RhZyhDW0VdKSl7aWYoQ1tFXT09PUEpYnJlYWs7YisrfXJldHVybiBmKGIpJiZUKEEpfX0sIm50aC1vZi10eXBlIjpmdW5jdGlvbihULGwsaCl7dmFyIGY9ZShsKSxnPWguYWRhcHRlcjtyZXR1cm4gZj09PWk/ZjpmPT09cz9tKFQsZyk6ZnVuY3Rpb24oQSl7Zm9yKHZhciBDPWcuZ2V0U2libGluZ3MoQSksYj0wLEU9MDtFPEMubGVuZ3RoO0UrKylpZihnLmlzVGFnKENbRV0pKXtpZihDW0VdPT09QSlicmVhaztnLmdldE5hbWUoQ1tFXSk9PT1nLmdldE5hbWUoQSkmJmIrK31yZXR1cm4gZihiKSYmVChBKX19LCJudGgtbGFzdC1vZi10eXBlIjpmdW5jdGlvbihULGwsaCl7dmFyIGY9ZShsKSxnPWguYWRhcHRlcjtyZXR1cm4gZj09PWk/ZjpmPT09cz9tKFQsZyk6ZnVuY3Rpb24oQSl7Zm9yKHZhciBDPWcuZ2V0U2libGluZ3MoQSksYj0wLEU9Qy5sZW5ndGgtMTtFPj0wO0UtLSlpZihnLmlzVGFnKENbRV0pKXtpZihDW0VdPT09QSlicmVhaztnLmdldE5hbWUoQ1tFXSk9PT1nLmdldE5hbWUoQSkmJmIrK31yZXR1cm4gZihiKSYmVChBKX19LHJvb3Q6ZnVuY3Rpb24oVCxsLGgpe3ZhciBmPWguYWRhcHRlcjtyZXR1cm4gZnVuY3Rpb24oZyl7cmV0dXJuIWYuZ2V0UGFyZW50KGcpJiZUKGcpfX0sc2NvcGU6ZnVuY3Rpb24oVCxsLGgsZil7dmFyIGc9aC5hZGFwdGVyO2lmKCFmfHxmLmxlbmd0aD09PTApcmV0dXJuIHUucm9vdChULGwsaCk7ZnVuY3Rpb24gTShBLEMpe3JldHVybiB0eXBlb2YgZy5lcXVhbHM9PSJmdW5jdGlvbiI/Zy5lcXVhbHMoQSxDKTpBPT09Q31yZXR1cm4gZi5sZW5ndGg9PT0xP2Z1bmN0aW9uKEEpe3JldHVybiBNKGZbMF0sQSkmJlQoQSl9OmZ1bmN0aW9uKEEpe3JldHVybiBmLmluZGV4T2YoQSk+PTAmJlQoQSl9fSxjaGVja2JveDpjKCJ0eXBlIiwiY2hlY2tib3giKSxmaWxlOmMoInR5cGUiLCJmaWxlIikscGFzc3dvcmQ6YygidHlwZSIsInBhc3N3b3JkIikscmFkaW86YygidHlwZSIsInJhZGlvIikscmVzZXQ6YygidHlwZSIsInJlc2V0IiksaW1hZ2U6YygidHlwZSIsImltYWdlIiksc3VibWl0OmMoInR5cGUiLCJzdWJtaXQiKSxob3ZlcjpmdW5jdGlvbihULGwsaCl7dmFyIGY9aC5hZGFwdGVyO3JldHVybiB0eXBlb2YgZi5pc0hvdmVyZWQ9PSJmdW5jdGlvbiI/ZnVuY3Rpb24oTSl7cmV0dXJuIFQoTSkmJmYuaXNIb3ZlcmVkKE0pfTppfSx2aXNpdGVkOmZ1bmN0aW9uKFQsbCxoKXt2YXIgZj1oLmFkYXB0ZXI7cmV0dXJuIHR5cGVvZiBmLmlzVmlzaXRlZD09ImZ1bmN0aW9uIj9mdW5jdGlvbihNKXtyZXR1cm4gVChNKSYmZi5pc1Zpc2l0ZWQoTSl9Oml9LGFjdGl2ZTpmdW5jdGlvbihULGwsaCl7dmFyIGY9aC5hZGFwdGVyO3JldHVybiB0eXBlb2YgZi5pc0FjdGl2ZT09ImZ1bmN0aW9uIj9mdW5jdGlvbihNKXtyZXR1cm4gVChNKSYmZi5pc0FjdGl2ZShNKX06aX19O2Z1bmN0aW9uIHAoVCxsKXtmb3IodmFyIGg9MDtUJiZoPFQubGVuZ3RoO2grKylpZihsLmlzVGFnKFRbaF0pKXJldHVybiBUW2hdfXZhciB5PXtlbXB0eTpmdW5jdGlvbihULGwpe3JldHVybiFsLmdldENoaWxkcmVuKFQpLnNvbWUoZnVuY3Rpb24oaCl7cmV0dXJuIGwuaXNUYWcoaCl8fGgudHlwZT09PSJ0ZXh0In0pfSwiZmlyc3QtY2hpbGQiOmZ1bmN0aW9uKFQsbCl7cmV0dXJuIHAobC5nZXRTaWJsaW5ncyhUKSxsKT09PVR9LCJsYXN0LWNoaWxkIjpmdW5jdGlvbihULGwpe2Zvcih2YXIgaD1sLmdldFNpYmxpbmdzKFQpLGY9aC5sZW5ndGgtMTtmPj0wO2YtLSl7aWYoaFtmXT09PVQpcmV0dXJuITA7aWYobC5pc1RhZyhoW2ZdKSlicmVha31yZXR1cm4hMX0sImZpcnN0LW9mLXR5cGUiOmZ1bmN0aW9uKFQsbCl7Zm9yKHZhciBoPWwuZ2V0U2libGluZ3MoVCksZj0wO2Y8aC5sZW5ndGg7ZisrKWlmKGwuaXNUYWcoaFtmXSkpe2lmKGhbZl09PT1UKXJldHVybiEwO2lmKGwuZ2V0TmFtZShoW2ZdKT09PWwuZ2V0TmFtZShUKSlicmVha31yZXR1cm4hMX0sImxhc3Qtb2YtdHlwZSI6ZnVuY3Rpb24oVCxsKXtmb3IodmFyIGg9bC5nZXRTaWJsaW5ncyhUKSxmPWgubGVuZ3RoLTE7Zj49MDtmLS0paWYobC5pc1RhZyhoW2ZdKSl7aWYoaFtmXT09PVQpcmV0dXJuITA7aWYobC5nZXROYW1lKGhbZl0pPT09bC5nZXROYW1lKFQpKWJyZWFrfXJldHVybiExfSwib25seS1vZi10eXBlIjpmdW5jdGlvbihULGwpe2Zvcih2YXIgaD1sLmdldFNpYmxpbmdzKFQpLGY9MCxnPWgubGVuZ3RoO2Y8ZztmKyspaWYobC5pc1RhZyhoW2ZdKSl7aWYoaFtmXT09PVQpY29udGludWU7aWYobC5nZXROYW1lKGhbZl0pPT09bC5nZXROYW1lKFQpKXJldHVybiExfXJldHVybiEwfSwib25seS1jaGlsZCI6ZnVuY3Rpb24oVCxsKXtmb3IodmFyIGg9bC5nZXRTaWJsaW5ncyhUKSxmPTA7ZjxoLmxlbmd0aDtmKyspaWYobC5pc1RhZyhoW2ZdKSYmaFtmXSE9PVQpcmV0dXJuITE7cmV0dXJuITB9LGxpbms6ZnVuY3Rpb24oVCxsKXtyZXR1cm4gbC5oYXNBdHRyaWIoVCwiaHJlZiIpfSxzZWxlY3RlZDpmdW5jdGlvbihULGwpe2lmKGwuaGFzQXR0cmliKFQsInNlbGVjdGVkIikpcmV0dXJuITA7aWYobC5nZXROYW1lKFQpIT09Im9wdGlvbiIpcmV0dXJuITE7dmFyIGg9bC5nZXRQYXJlbnQoVCk7aWYoIWh8fGwuZ2V0TmFtZShoKSE9PSJzZWxlY3QifHxsLmhhc0F0dHJpYihoLCJtdWx0aXBsZSIpKXJldHVybiExO2Zvcih2YXIgZj1sLmdldENoaWxkcmVuKGgpLGc9ITEsTT0wO008Zi5sZW5ndGg7TSsrKWlmKGwuaXNUYWcoZltNXSkpaWYoZltNXT09PVQpZz0hMDtlbHNlIGlmKGcpe2lmKGwuaGFzQXR0cmliKGZbTV0sInNlbGVjdGVkIikpcmV0dXJuITF9ZWxzZSByZXR1cm4hMTtyZXR1cm4gZ30sZGlzYWJsZWQ6ZnVuY3Rpb24oVCxsKXtyZXR1cm4gbC5oYXNBdHRyaWIoVCwiZGlzYWJsZWQiKX0sZW5hYmxlZDpmdW5jdGlvbihULGwpe3JldHVybiFsLmhhc0F0dHJpYihULCJkaXNhYmxlZCIpfSxjaGVja2VkOmZ1bmN0aW9uKFQsbCl7cmV0dXJuIGwuaGFzQXR0cmliKFQsImNoZWNrZWQiKXx8eS5zZWxlY3RlZChULGwpfSxyZXF1aXJlZDpmdW5jdGlvbihULGwpe3JldHVybiBsLmhhc0F0dHJpYihULCJyZXF1aXJlZCIpfSxvcHRpb25hbDpmdW5jdGlvbihULGwpe3JldHVybiFsLmhhc0F0dHJpYihULCJyZXF1aXJlZCIpfSxwYXJlbnQ6ZnVuY3Rpb24oVCxsKXtyZXR1cm4heS5lbXB0eShULGwpfSxoZWFkZXI6TyhbImgxIiwiaDIiLCJoMyIsImg0IiwiaDUiLCJoNiJdKSxidXR0b246ZnVuY3Rpb24oVCxsKXt2YXIgaD1sLmdldE5hbWUoVCk7cmV0dXJuIGg9PT0iYnV0dG9uInx8aD09PSJpbnB1dCImJmwuZ2V0QXR0cmlidXRlVmFsdWUoVCwidHlwZSIpPT09ImJ1dHRvbiJ9LGlucHV0Ok8oWyJpbnB1dCIsInRleHRhcmVhIiwic2VsZWN0IiwiYnV0dG9uIl0pLHRleHQ6ZnVuY3Rpb24oVCxsKXt2YXIgaDtyZXR1cm4gbC5nZXROYW1lKFQpPT09ImlucHV0IiYmKCEoaD1sLmdldEF0dHJpYnV0ZVZhbHVlKFQsInR5cGUiKSl8fGgudG9Mb3dlckNhc2UoKT09PSJ0ZXh0Iil9fTtmdW5jdGlvbiBPKFQpe2lmKHR5cGVvZiBTZXQ8InUiKXt2YXIgbD1uZXcgU2V0KFQpO3JldHVybiBmdW5jdGlvbihoLGYpe3JldHVybiBsLmhhcyhmLmdldE5hbWUoaCkpfX1yZXR1cm4gZnVuY3Rpb24oaCxmKXtyZXR1cm4gVC5pbmRleE9mKGYuZ2V0TmFtZShoKSk+PTB9fWZ1bmN0aW9uIHgoVCxsLGgpe2lmKGg9PT1udWxsKXtpZihULmxlbmd0aD4yJiZsIT09InNjb3BlIil0aHJvdyBuZXcgRXJyb3IoInBzZXVkby1zZWxlY3RvciA6IitsKyIgcmVxdWlyZXMgYW4gYXJndW1lbnQiKX1lbHNlIGlmKFQubGVuZ3RoPT09Mil0aHJvdyBuZXcgRXJyb3IoInBzZXVkby1zZWxlY3RvciA6IitsKyIgZG9lc24ndCBoYXZlIGFueSBhcmd1bWVudHMiKX12YXIgdj0vXig/Oig/Om50aHxsYXN0fGZpcnN0fG9ubHkpLSg/OmNoaWxkfG9mLXR5cGUpfHJvb3R8ZW1wdHl8KD86ZW58ZGlzKWFibGVkfGNoZWNrZWR8bm90KSQvO2QuZXhwb3J0cz17Y29tcGlsZTpmdW5jdGlvbihULGwsaCxmKXt2YXIgZz1sLm5hbWUsTT1sLmRhdGEsQT1oLmFkYXB0ZXI7aWYoaCYmaC5zdHJpY3QmJiF2LnRlc3QoZykpdGhyb3cgbmV3IEVycm9yKCI6IitnKyIgaXNuJ3QgcGFydCBvZiBDU1MzIik7aWYodHlwZW9mIHVbZ109PSJmdW5jdGlvbiIpcmV0dXJuIHVbZ10oVCxNLGgsZik7aWYodHlwZW9mIHlbZ109PSJmdW5jdGlvbiIpe3ZhciBDPXlbZ107cmV0dXJuIHgoQyxnLE0pLEM9PT1pP0M6VD09PXM/ZnVuY3Rpb24oRSl7cmV0dXJuIEMoRSxBLE0pfTpmdW5jdGlvbihFKXtyZXR1cm4gQyhFLEEsTSkmJlQoRSl9fWVsc2UgdGhyb3cgbmV3IEVycm9yKCJ1bm1hdGNoZWQgcHNldWRvLWNsYXNzIDoiK2cpfSxmaWx0ZXJzOnUscHNldWRvczp5fX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoMjg0KSxuPXQoMjg1KTtkLmV4cG9ydHM9ZnVuY3Rpb24ocyl7cmV0dXJuIG4oZShzKSl9LGQuZXhwb3J0cy5wYXJzZT1lLGQuZXhwb3J0cy5jb21waWxlPW59LGZ1bmN0aW9uKGQscil7ZC5leHBvcnRzPWU7dmFyIHQ9L14oWytcLV0/XGQqbik/XHMqKD86KFsrXC1dPylccyooXGQrKSk/JC87ZnVuY3Rpb24gZShuKXtpZihuPW4udHJpbSgpLnRvTG93ZXJDYXNlKCksbj09PSJldmVuIilyZXR1cm5bMiwwXTtpZihuPT09Im9kZCIpcmV0dXJuWzIsMV07dmFyIGE9bi5tYXRjaCh0KTtpZighYSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIm4tdGggcnVsZSBjb3VsZG4ndCBiZSBwYXJzZWQgKCciK24rIicpIik7dmFyIHM7cmV0dXJuIGFbMV0/KHM9cGFyc2VJbnQoYVsxXSwxMCksaXNOYU4ocykmJihhWzFdLmNoYXJBdCgwKT09PSItIj9zPS0xOnM9MSkpOnM9MCxbcyxhWzNdP3BhcnNlSW50KChhWzJdfHwiIikrYVszXSwxMCk6MF19fSxmdW5jdGlvbihkLHIsdCl7ZC5leHBvcnRzPXM7dmFyIGU9dCgyNzMpLG49ZS50cnVlRnVuYyxhPWUuZmFsc2VGdW5jO2Z1bmN0aW9uIHMoaSl7dmFyIG89aVswXSxjPWlbMV0tMTtpZihjPDAmJm88PTApcmV0dXJuIGE7aWYobz09PS0xKXJldHVybiBmdW5jdGlvbih1KXtyZXR1cm4gdTw9Y307aWYobz09PTApcmV0dXJuIGZ1bmN0aW9uKHUpe3JldHVybiB1PT09Y307aWYobz09PTEpcmV0dXJuIGM8MD9uOmZ1bmN0aW9uKHUpe3JldHVybiB1Pj1jfTt2YXIgbT1jJW87cmV0dXJuIG08MCYmKG0rPW8pLG8+MT9mdW5jdGlvbih1KXtyZXR1cm4gdT49YyYmdSVvPT09bX06KG8qPS0xLGZ1bmN0aW9uKHUpe3JldHVybiB1PD1jJiZ1JW89PT1tfSl9fSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJkZWZhdWx0IixmdW5jdGlvbigpe3JldHVybiBNfSk7dmFyIGU9dCgxMiksbj10KDc0KSxhPXQoMSkscz10KDY4KSxpPXQoMjUwKSxvPXQoMjEzKSxjPXQoMjE4KTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7ZnVuY3Rpb24gbShBLEMpe2lmKEE9PW51bGwpcmV0dXJue307dmFyIGI9dShBLEMpLEUsTDtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgRD1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKEEpO2ZvcihMPTA7TDxELmxlbmd0aDtMKyspRT1EW0xdLCEoQy5pbmRleE9mKEUpPj0wKSYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKEEsRSkmJihiW0VdPUFbRV0pfXJldHVybiBifWZ1bmN0aW9uIHUoQSxDKXtpZihBPT1udWxsKXJldHVybnt9O3ZhciBiPXt9LEU9T2JqZWN0LmtleXMoQSksTCxEO2ZvcihEPTA7RDxFLmxlbmd0aDtEKyspTD1FW0RdLCEoQy5pbmRleE9mKEwpPj0wKSYmKGJbTF09QVtMXSk7cmV0dXJuIGJ9Y29uc3QgcD17YW50aWFsaWFzOiEwLGF1dG9SZW5kZXI6ITAsYWxwaGE6ITB9LHk9U3ltYm9sKCJhdXRvUmVuZGVyIiksTz1TeW1ib2woInJlbmRlcmVyIikseD1TeW1ib2woInRpbWVsaW5lIiksdj1TeW1ib2woInByZXBhcmVSZW5kZXIiKSxUPVN5bWJvbCgidGlja1JlbmRlciIpLGw9U3ltYm9sKCJwYXNzIiksaD1TeW1ib2woImZibyIpLGY9U3ltYm9sKCJ0aWNrZXJzIiksZz1TeW1ib2woImxheWVyVHJhbnNmb3JtSW52ZXJ0Iik7Y2xhc3MgTSBleHRlbmRzIGkuZGVmYXVsdHtjb25zdHJ1Y3RvcihDPXt9KXtpZihzdXBlcigpLCFDLmNhbnZhcyl7Y29uc3R7d2lkdGg6RCxoZWlnaHQ6SX09dGhpcy5nZXRSZXNvbHV0aW9uKCksUj1lLkVOVi5jcmVhdGVDYW52YXMoRCxJLHtvZmZzY3JlZW46ISFDLm9mZnNjcmVlbixpZDpDLmlkLGV4dHJhOkMuZXh0cmF9KTtSLnN0eWxlJiYoUi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiKSxSLmRhdGFzZXQmJihSLmRhdGFzZXQubGF5ZXJJZD1DLmlkKSxSLmNvbnRleHRUeXBlJiYoQy5jb250ZXh0VHlwZT1SLmNvbnRleHRUeXBlKSxDLmNhbnZhcz1SfWNvbnN0IGI9Qy5jYW52YXMsRT1PYmplY3QuYXNzaWduKHt9LHAsQyk7dGhpc1t5XT1FLmF1dG9SZW5kZXIsZGVsZXRlIEMuYXV0b1JlbmRlcjtjb25zdCBMPUUuUmVuZGVyZXJ8fGUuUmVuZGVyZXI7dGhpc1tPXT1uZXcgTChiLEUpLHRoaXMub3B0aW9ucz1DLHRoaXMuaWQ9Qy5pZCx0aGlzW2xdPVtdLHRoaXMuc2V0UmVzb2x1dGlvbihiKSx0aGlzLmNhbnZhcz1iLHRoaXNbeF09bmV3IG4uVGltZWxpbmUsdGhpcy5fX21vdXNlQ2FwdHVyZWRUYXJnZXQ9bnVsbCx0aGlzW2ddPW51bGx9Z2V0IGF1dG9SZW5kZXIoKXtyZXR1cm4gdGhpc1t5XX1nZXQgZGlzcGxheVJhdGlvKCl7cmV0dXJuIHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5vcHRpb25zP3RoaXMucGFyZW50Lm9wdGlvbnMuZGlzcGxheVJhdGlvOjF9Z2V0IGhlaWdodCgpe2NvbnN0e2hlaWdodDpDfT10aGlzLmdldFJlc29sdXRpb24oKTtyZXR1cm4gQy90aGlzLmRpc3BsYXlSYXRpb31nZXQgZ2woKXtyZXR1cm4gdGhpcy5yZW5kZXJlci5nbFJlbmRlcmVyP3RoaXMucmVuZGVyZXIuZ2xSZW5kZXJlci5nbDpudWxsfWdldCBsYXllcigpe3JldHVybiB0aGlzfWdldCBvZmZzY3JlZW4oKXtyZXR1cm4hIXRoaXMub3B0aW9ucy5vZmZzY3JlZW58fHRoaXMuY2FudmFzLl9vZmZzY3JlZW59Z2V0IHBhc3MoKXtyZXR1cm4gdGhpc1tsXX1nZXQgcHJlcGFyZVJlbmRlcigpe3JldHVybiB0aGlzW3ZdP3RoaXNbdl06UHJvbWlzZS5yZXNvbHZlKCl9Z2V0IHJlbmRlcmVyKCl7cmV0dXJuIHRoaXNbT119Z2V0IHJlbmRlck9mZnNldCgpe2lmKHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5vcHRpb25zKXtjb25zdHtsZWZ0OkMsdG9wOmJ9PXRoaXMucGFyZW50Lm9wdGlvbnM7cmV0dXJuW0MsYl19cmV0dXJuW3RoaXMub3B0aW9ucy5sZWZ0fDAsdGhpcy5vcHRpb25zLnRvcHwwXX1nZXQgdGltZWxpbmUoKXtyZXR1cm4gdGhpc1t4XX1nZXQgd2lkdGgoKXtjb25zdHt3aWR0aDpDfT10aGlzLmdldFJlc29sdXRpb24oKTtyZXR1cm4gQy90aGlzLmRpc3BsYXlSYXRpb31nZXQgbG9jYWxNYXRyaXgoKXtjb25zdHt4OkMseTpifT10aGlzLmF0dHJpYnV0ZXM7cmV0dXJuWzEsMCwwLDEsQyxiXX1nZXQgbGF5ZXJUcmFuc2Zvcm1JbnZlcnQoKXtpZih0aGlzW2ddKXJldHVybiB0aGlzW2ddO2NvbnN0IEM9dGhpcy50cmFuc2Zvcm1NYXRyaXg7cmV0dXJuIENbMF09PT0xJiZDWzFdPT09MCYmQ1syXT09PTAmJkNbM109PT0xJiZDWzRdPT09MCYmQ1s1XT09PTA/bnVsbDoodGhpc1tnXT1hLm1hdDJkLmludmVydChBcnJheS5vZigwLDAsMCwwLDAsMCksQyksdGhpc1tnXSl9Zm9yY2VDb250ZXh0TG9zcygpe2NvbnN0IEM9dGhpcy5yZW5kZXJlci5nbFJlbmRlcmVyO2lmKEMpe2NvbnN0IGI9Qy5nZXRFeHRlbnNpb24oIldFQkdMX2xvc2VfY29udGV4dCIpO2lmKGIpcmV0dXJuIGIubG9zZUNvbnRleHQoKSwhMH1yZXR1cm4hMX1hZGRQYXNzKHt2ZXJ0ZXg6QyxmcmFnbWVudDpiLG9wdGlvbnM6RSx1bmlmb3JtczpMfT17fSl7aWYodGhpcy5yZW5kZXJlci5nbFJlbmRlcmVyKXtjb25zdHt3aWR0aDpELGhlaWdodDpJfT10aGlzLmdldFJlc29sdXRpb24oKSxSPXRoaXMucmVuZGVyZXIuY3JlYXRlUGFzc1Byb2dyYW0oe3ZlcnRleDpDLGZyYWdtZW50OmIsb3B0aW9uczpFfSksQj1uZXcgZS5GaWd1cmUyRDtCLnJlY3QoMCwwLEQvdGhpcy5kaXNwbGF5UmF0aW8sSS90aGlzLmRpc3BsYXlSYXRpbyk7Y29uc3Qgej1uZXcgZS5NZXNoMkQoQik7cmV0dXJuIHouc2V0VW5pZm9ybXMoTCksei5zZXRQcm9ncmFtKFIpLHRoaXNbbF0ucHVzaCh6KSx0aGlzLmZvcmNlVXBkYXRlKCksen1yZXR1cm4gbnVsbH1kZWxldGVUZXh0dXJlKEMpe3JldHVybiBPYmplY3QoYy5kZWxldGVUZXh0dXJlKShDLHRoaXMucmVuZGVyZXIpfWRpc3BhdGNoUG9pbnRlckV2ZW50KEMpe2NvbnN0IGI9Qy50eXBlO2lmKGI9PT0ibW91c2Vkb3duInx8Yj09PSJtb3VzZXVwInx8Yj09PSJtb3VzZW1vdmUiKXtjb25zdCBSPXRoaXMuX19tb3VzZUNhcHR1cmVkVGFyZ2V0O2lmKFIpe2lmKFIubGF5ZXI9PT10aGlzKXJldHVybiBSLmRpc3BhdGNoRXZlbnQoQyksITA7dGhpcy5fX21vdXNlQ2FwdHVyZWRUYXJnZXQ9bnVsbH19bGV0IEUsTDtjb25zdCBEPXRoaXMubGF5ZXJUcmFuc2Zvcm1JbnZlcnQ7aWYoRCl7RT1DLngsTD1DLnk7Y29uc3QgUj1ELEI9UlswXSpFK1JbMl0qTCtSWzRdLHo9UlsxXSpFK1JbM10qTCtSWzVdO2RlbGV0ZSBDLngsZGVsZXRlIEMueSxkZWxldGUgQy5sYXllclgsZGVsZXRlIEMubGF5ZXJZLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEMse2xheWVyWDp7dmFsdWU6Qixjb25maWd1cmFibGU6ITB9LGxheWVyWTp7dmFsdWU6eixjb25maWd1cmFibGU6ITB9LHg6e3ZhbHVlOkIsY29uZmlndXJhYmxlOiEwfSx5Ont2YWx1ZTp6LGNvbmZpZ3VyYWJsZTohMH19KX1jb25zdCBJPXN1cGVyLmRpc3BhdGNoUG9pbnRlckV2ZW50KEMpO3JldHVybiBEJiZPYmplY3QuZGVmaW5lUHJvcGVydGllcyhDLHtsYXllclg6e3ZhbHVlOkUsY29uZmlndXJhYmxlOiEwfSxsYXllclk6e3ZhbHVlOkwsY29uZmlndXJhYmxlOiEwfSx4Ont2YWx1ZTpFLGNvbmZpZ3VyYWJsZTohMH0seTp7dmFsdWU6TCxjb25maWd1cmFibGU6ITB9fSksSX1mb3JjZVVwZGF0ZSgpe2lmKCF0aGlzW3ZdKWlmKHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5oYXNPZmZzY3JlZW5DYW52YXMpe3RoaXMucGFyZW50LmZvcmNlVXBkYXRlKCk7bGV0IEM9bnVsbDtjb25zdCBiPW5ldyBQcm9taXNlKEU9PntDPUV9KTtiLl9yZXNvbHZlPUMsdGhpc1t2XT1ifWVsc2V7bGV0IEM9bnVsbCxiPW51bGw7Y29uc3QgRT1uZXcgUHJvbWlzZShMPT57Qz1MLHRoaXNbeV0mJihiPU9iamVjdChzLnJlcXVlc3RBbmltYXRpb25GcmFtZSkoKCk9PntkZWxldGUgRS5fcmVxdWVzdElELHRoaXMucmVuZGVyKCl9KSl9KTtFLl9yZXNvbHZlPUMsRS5fcmVxdWVzdElEPWIsdGhpc1t2XT1FfX1nZXRGQk8oKXtjb25zdCBDPXRoaXMucmVuZGVyZXIuZ2xSZW5kZXJlcix7d2lkdGg6YixoZWlnaHQ6RX09dGhpcy5nZXRSZXNvbHV0aW9uKCk7cmV0dXJuIEMmJighdGhpc1toXXx8dGhpc1toXS53aWR0aCE9PWJ8fHRoaXNbaF0uaGVpZ2h0IT09RSk/KHRoaXNbaF09e3dpZHRoOmIsaGVpZ2h0OkUsdGFyZ2V0OkMuY3JlYXRlRkJPKCksYnVmZmVyOkMuY3JlYXRlRkJPKCksc3dhcCgpe1t0aGlzLnRhcmdldCx0aGlzLmJ1ZmZlcl09W3RoaXMuYnVmZmVyLHRoaXMudGFyZ2V0XX19LHRoaXNbaF0pOnRoaXNbaF0/dGhpc1toXTpudWxsfXVwZGF0ZUdsb2JhbFRyYW5zZm9ybSgpe2lmKHRoaXMubGF5ZXJUcmFuc2Zvcm1JbnZlcnQpe2NvbnN0IEM9dGhpcy5yZW5kZXJlcixiPUMuX19nbG9iYWxUcmFuc2Zvcm1NYXRyaXh8fEMuZ2xvYmFsVHJhbnNmb3JtTWF0cml4O0MuX19nbG9iYWxUcmFuc2Zvcm1NYXRyaXg9Yjtjb25zdCBFPWEubWF0MmQuZnJvbVZhbHVlcygxLDAsMCwxLDAsMCk7Qy5zZXRHbG9iYWxUcmFuc2Zvcm0oLi4uYS5tYXQyZC5tdWx0aXBseShFLGIsdGhpcy50cmFuc2Zvcm1NYXRyaXgpKX19b25Qcm9wZXJ0eUNoYW5nZShDLGIsRSl7aWYoc3VwZXIub25Qcm9wZXJ0eUNoYW5nZShDLGIsRSksQz09PSJ6SW5kZXgiJiYodGhpcy5jYW52YXMuc3R5bGUuekluZGV4PWIpLEM9PT0idHJhbnNmb3JtInx8Qz09PSJ0cmFuc2xhdGUifHxDPT09InJvdGF0ZSJ8fEM9PT0ic2NhbGUifHxDPT09InNrZXciKXtjb25zdCBMPXRoaXNbZ107aWYodGhpc1tnXT1udWxsLHRoaXMudXBkYXRlR2xvYmFsVHJhbnNmb3JtKCksTCYmIXRoaXMubGF5ZXJUcmFuc2Zvcm1JbnZlcnQpe2NvbnN0IEQ9dGhpcy5yZW5kZXJlcixJPUQuX19nbG9iYWxUcmFuc2Zvcm1NYXRyaXh8fEQuZ2xvYmFsVHJhbnNmb3JtTWF0cml4O0Quc2V0R2xvYmFsVHJhbnNmb3JtKC4uLkkpfX19X3ByZXBhcmVSZW5kZXJGaW5pc2hlZCgpe3RoaXNbdl0mJih0aGlzW3ZdLl9yZXF1ZXN0SUQmJk9iamVjdChzLmNhbmNlbEFuaW1hdGlvbkZyYW1lKSh0aGlzW3ZdLl9yZXF1ZXN0SUQpLHRoaXNbdl0uX3Jlc29sdmUoKSxkZWxldGUgdGhpc1t2XSl9cmVuZGVyKHtjbGVhcjpDPSEwfT17fSl7Y29uc3QgYj10aGlzW2xdLmxlbmd0aD90aGlzLmdldEZCTygpOm51bGw7YiYmdGhpcy5yZW5kZXJlci5nbFJlbmRlcmVyLmJpbmRGQk8oYi50YXJnZXQpLEMmJnRoaXNbT10uY2xlYXIoKTtjb25zdCBFPXRoaXMuZHJhdygpO2lmKEUmJkUubGVuZ3RoJiYodGhpcy5yZW5kZXJlci5kcmF3TWVzaGVzKEUpLHRoaXMuY2FudmFzLmRyYXcmJnRoaXMuY2FudmFzLmRyYXcoKSksYil7Y29uc3QgTD10aGlzLnJlbmRlcmVyLmdsUmVuZGVyZXIsRD10aGlzW2xdLmxlbmd0aCx7d2lkdGg6SSxoZWlnaHQ6Un09dGhpcy5nZXRSZXNvbHV0aW9uKCksQj1bMCwwLEkvdGhpcy5kaXNwbGF5UmF0aW8sUi90aGlzLmRpc3BsYXlSYXRpb107dGhpc1tsXS5mb3JFYWNoKCh6LEspPT57ei5ibGVuZD0hMCx6LnNldFRleHR1cmUoYi50YXJnZXQudGV4dHVyZSx7cmVjdDpCfSksSz09PUQtMT9MLmJpbmRGQk8obnVsbCk6KGIuc3dhcCgpLEwuYmluZEZCTyhiLnRhcmdldCkpLHRoaXNbT10uY2xlYXIoKSx0aGlzLnJlbmRlcmVyLmRyYXdNZXNoZXMoW3pdKX0pfXRoaXMuX3ByZXBhcmVSZW5kZXJGaW5pc2hlZCgpfXNldFJlc29sdXRpb24oe3dpZHRoOkMsaGVpZ2h0OmJ9KXtjb25zdCBFPXRoaXMucmVuZGVyZXIsTD1FLl9fZ2xvYmFsVHJhbnNmb3JtTWF0cml4fHxFLmdsb2JhbFRyYW5zZm9ybU1hdHJpeCxEPUxbNF0sST1MWzVdLFI9TFswXSx7d2lkdGg6QixoZWlnaHQ6en09dGhpcy5nZXRSZXNvbHV0aW9uKCk7KEIhPT1DfHx6IT09YikmJihzdXBlci5zZXRSZXNvbHV0aW9uKHt3aWR0aDpDLGhlaWdodDpifSksdGhpcy5jYW52YXMmJih0aGlzLmNhbnZhcy53aWR0aD1DLHRoaXMuY2FudmFzLmhlaWdodD1iLEUudXBkYXRlUmVzb2x1dGlvbiYmRS51cGRhdGVSZXNvbHV0aW9uKCkpLHRoaXMuYXR0cmlidXRlcy5zaXplPVtDLGJdLHRoaXNbbF0ubGVuZ3RoJiZ0aGlzW2xdLmZvckVhY2goaj0+e2NvbnN0IEc9bmV3IGUuRmlndXJlMkQ7Ry5yZWN0KDAsMCxDL3RoaXMuZGlzcGxheVJhdGlvLGIvdGhpcy5kaXNwbGF5UmF0aW8pLGouY29udG91cnM9Ry5jb250b3Vyc30pKTtjb25zdFtLLFFdPXRoaXMucmVuZGVyT2Zmc2V0LF89dGhpcy5kaXNwbGF5UmF0aW87KEQhPT1LfHxJIT09UXx8UiE9PV8pJiYoRS5zZXRHbG9iYWxUcmFuc2Zvcm0oXywwLDAsXyxLLFEpLEUuX19nbG9iYWxUcmFuc2Zvcm1NYXRyaXg9bnVsbCx0aGlzW2ddPW51bGwsdGhpcy51cGRhdGVHbG9iYWxUcmFuc2Zvcm0oKSx0aGlzLmZvcmNlVXBkYXRlKCkpfXRpY2soQz1udWxsLGI9e30pe2xldHtkdXJhdGlvbjpFPTEvMH09YixMPW0oYixbImR1cmF0aW9uIl0pO2NvbnN0IEQ9dGhpcy50aW1lbGluZS5mb3JrKEwpLEk9dGhpczt0aGlzW2ZdPXRoaXNbZl18fFtdLHRoaXNbZl0ucHVzaCh7aGFuZGxlcjpDLGR1cmF0aW9uOkV9KTtjb25zdCBSPSgpPT57bGV0IEI9bnVsbCx6PW51bGw7Y29uc3QgSz0oKT0+e2NvbnN0IFE9dGhpc1tmXS5tYXAoKHtoYW5kbGVyOl8sZHVyYXRpb246an0pPT57Y29uc3QgRz1NYXRoLm1pbigxLEQuY3VycmVudFRpbWUvaik7cmV0dXJue3ZhbHVlOl8/XyhELmN1cnJlbnRUaW1lLEcpOm51bGwscDpHfX0pO0lbVF18fChJW1RdPVByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PntJW3ldJiZJLnJlbmRlcigpLGRlbGV0ZSBJW1RdO2ZvcihsZXQgXz1RLmxlbmd0aC0xO18+PTA7Xy0tKXtjb25zdHt2YWx1ZTpqLHA6R309UVtfXTsoaj09PSExfHxHPj0xKSYmdGhpc1tmXS5zcGxpY2UoXywxKX10aGlzW2ZdLmxlbmd0aD4wJiZSKCl9KSl9O2lmKHRoaXNbdl0mJnRoaXNbdl0uX3R5cGUhPT0idGlja2VyIiYmKE9iamVjdChzLmNhbmNlbEFuaW1hdGlvbkZyYW1lKSh0aGlzW3ZdLl9yZXF1ZXN0SUQpLGRlbGV0ZSB0aGlzW3ZdKSwhdGhpc1t2XSl7Y29uc3QgUT1uZXcgUHJvbWlzZShfPT57Qj1fLHo9T2JqZWN0KHMucmVxdWVzdEFuaW1hdGlvbkZyYW1lKShLKX0pO1EuX3Jlc29sdmU9QixRLl9yZXF1ZXN0SUQ9eixRLl90eXBlPSJ0aWNrZXIiLHRoaXNbdl09UX19O1IoKX10b0dsb2JhbFBvcyhDLGIpe2lmKHRoaXMubGF5ZXJUcmFuc2Zvcm1JbnZlcnQpe2NvbnN0IEI9dGhpcy50cmFuc2Zvcm1NYXRyaXg7Qz1CWzBdKkMrQlsyXSpiK0JbNF0sYj1CWzFdKkMrQlszXSpiK0JbNV19Y29uc3R7d2lkdGg6RSxoZWlnaHQ6TH09dGhpcy5nZXRSZXNvbHV0aW9uKCksRD10aGlzLnJlbmRlck9mZnNldCxJPVt0aGlzLmNhbnZhcy5jbGllbnRXaWR0aCx0aGlzLmNhbnZhcy5jbGllbnRIZWlnaHRdO0M9QypJWzBdL0UrRFswXSxiPWIqSVsxXS9MK0RbMV07Y29uc3QgUj10aGlzLmRpc3BsYXlSYXRpbztyZXR1cm4gQyo9UixiKj1SLFtDLGJdfXRvTG9jYWxQb3MoQyxiKXtjb25zdHt3aWR0aDpFLGhlaWdodDpMfT10aGlzLmdldFJlc29sdXRpb24oKSxEPXRoaXMucmVuZGVyT2Zmc2V0LEk9W3RoaXMuY2FudmFzLmNsaWVudFdpZHRoLHRoaXMuY2FudmFzLmNsaWVudEhlaWdodF07Qz1DKkUvSVswXS1EWzBdLGI9YipML0lbMV0tRFsxXTtjb25zdCBSPXRoaXMuZGlzcGxheVJhdGlvO0MvPVIsYi89Ujtjb25zdCBCPXRoaXMubGF5ZXJUcmFuc2Zvcm1JbnZlcnQ7cmV0dXJuIEImJihDPUJbMF0qQytCWzJdKmIrQls0XSxiPUJbMV0qQytCWzNdKmIrQls1XSksW0MsYl19fW8uZGVmYXVsdC5yZWdpc3Rlck5vZGUoTSwibGF5ZXIiKX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gdn0pO3ZhciBlPXQoMjI0KSxuPXQoMjg4KSxhPXQoMjEzKSxzPXQoMjUyKSxpPXQoNzIpO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtmdW5jdGlvbiBvKFQsbCl7aWYoVD09bnVsbClyZXR1cm57fTt2YXIgaD1jKFQsbCksZixnO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBNPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoVCk7Zm9yKGc9MDtnPE0ubGVuZ3RoO2crKylmPU1bZ10sIShsLmluZGV4T2YoZik+PTApJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoVCxmKSYmKGhbZl09VFtmXSl9cmV0dXJuIGh9ZnVuY3Rpb24gYyhULGwpe2lmKFQ9PW51bGwpcmV0dXJue307dmFyIGg9e30sZj1PYmplY3Qua2V5cyhUKSxnLE07Zm9yKE09MDtNPGYubGVuZ3RoO00rKylnPWZbTV0sIShsLmluZGV4T2YoZyk+PTApJiYoaFtnXT1UW2ddKTtyZXR1cm4gaH1mdW5jdGlvbiBtKFQsbCxoKXtyZXR1cm4gbCBpbiBUP09iamVjdC5kZWZpbmVQcm9wZXJ0eShULGwse3ZhbHVlOmgsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTpUW2xdPWgsVH1jb25zdCB1PSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIscD1TeW1ib2wuZm9yKCJzcHJpdGVqc19zZXRBdHRyaWJ1dGUiKSx5PVN5bWJvbCgicm9vdCIpLE89U3ltYm9sKCJ0YXNrIik7ZnVuY3Rpb24geChULGw9ITApe2NvbnN0IGg9VFt5XTtpZihoJiZoLmNoaWxkcmVuWzBdKXtjb25zdCBmPVQuc3ZnLGc9VC5sYXllcj9ULmxheWVyLmRpc3BsYXlSYXRpbzoxO2lmKCFmLmhhc0F0dHJpYnV0ZSgiZGF0YS1vcmlnaW5hbC13aWR0aCIpKXtsZXQgQz1mLmdldEF0dHJpYnV0ZSgid2lkdGgiKTtDPUM/T2JqZWN0KGkuc2l6ZVRvUGl4ZWwpKEMpOjMwMDtsZXQgYj1mLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iik7Yj1iP09iamVjdChpLnNpemVUb1BpeGVsKShiKToxNTAsZi5oYXNBdHRyaWJ1dGUoInZpZXdCb3giKXx8Zi5zZXRBdHRyaWJ1dGUoInZpZXdCb3giLGAwIDAgJHtNYXRoLnJvdW5kKEMpfSAke01hdGgucm91bmQoYil9YCksZi5zZXRBdHRyaWJ1dGUoImRhdGEtb3JpZ2luYWwtd2lkdGgiLEMpLGYuc2V0QXR0cmlidXRlKCJkYXRhLW9yaWdpbmFsLWhlaWdodCIsYil9bGV0IE09VC5hdHRyaWJ1dGVzLndpZHRofHxOdW1iZXIoZi5nZXRBdHRyaWJ1dGUoImRhdGEtb3JpZ2luYWwtd2lkdGgiKSksQT1ULmF0dHJpYnV0ZXMuaGVpZ2h0fHxOdW1iZXIoZi5nZXRBdHRyaWJ1dGUoImRhdGEtb3JpZ2luYWwtaGVpZ2h0IikpO2lmKE0qPWcsQSo9ZyxsJiZULmF0dHJpYnV0ZXMuZmxleGlibGUpe2NvbnN0IEM9VC5hdHRyaWJ1dGVzLnNjYWxlWzBdO2lmKE0qPUMsQSo9QyxmLnNldEF0dHJpYnV0ZSgid2lkdGgiLE0pLGYuc2V0QXR0cmlidXRlKCJoZWlnaHQiLEEpLE0mJkEmJlQudGV4dHVyZUltYWdlKXtjb25zdCBiPVQudGV4dHVyZUltYWdlLndpZHRoLEU9VC50ZXh0dXJlSW1hZ2UuaGVpZ2h0LEw9VC5jbGllbnRTaXplO1QuYXR0cmlidXRlcy50ZXh0dXJlUmVjdD1bMCwwLE1hdGgucm91bmQoTFswXSpiL00pLE1hdGgucm91bmQoTFsxXSpFL0EpXX19ZWxzZSBUW09dfHwoZi5zZXRBdHRyaWJ1dGUoIndpZHRoIixNKSxmLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixBKSxUW09dPVByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PntkZWxldGUgVFtPXTtjb25zdCBDPWguaW5uZXJIVE1MLGI9bmV3IEJsb2IoW0NdLHt0eXBlOiJpbWFnZS9zdmcreG1sIn0pLEU9VVJMLmNyZWF0ZU9iamVjdFVSTChiKSxMPW5ldyBJbWFnZTtMLm9ubG9hZD1mdW5jdGlvbigpe0wud2lkdGgmJkwuaGVpZ2h0PyhULmF0dHJpYnV0ZXNbcF0oInRleHR1cmUiLEwpLFQuYXR0cmlidXRlcy5mbGV4aWJsZSYmKFQuYXR0cmlidXRlcy50ZXh0dXJlUmVjdD1udWxsKSk6VC5hdHRyaWJ1dGVzW3BdKCJ0ZXh0dXJlIixudWxsKX0sTC5zcmM9RX0pKX19Y2xhc3MgdiBleHRlbmRzIGUuZGVmYXVsdHtjb25zdHJ1Y3RvcihsPXt9KXt0eXBlb2YgbD09InN0cmluZyImJihsPXtzdmdUZXh0Omx9KTtsZXR7c3ZnVGV4dDpofT1sLGY9byhsLFsic3ZnVGV4dCJdKTtpZihzdXBlcihmKSx0aGlzW3ldPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGgpe3RoaXNbeV0uaW5uZXJIVE1MPWg7Y29uc3QgZz10aGlzW3ldLmNoaWxkcmVuWzBdO2c/Zy5zZXRBdHRyaWJ1dGUoInhtbG5zIix1KTooZmV0Y2goaCkudGhlbihNPT5NLnRleHQoKSkudGhlbihNPT57dGhpc1t5XS5pbm5lckhUTUw9TSwoIXRoaXMub2JzZXJ2ZXJ8fHRoaXMuYXR0cmlidXRlcy5mbGV4aWJsZSkmJngodGhpcyl9KSxoPW51bGwpfWlmKCFoKXtjb25zdCBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh1LCJzdmciKTtnLnNldEF0dHJpYnV0ZSgieG1sbnMiLHUpLHRoaXNbeV0uYXBwZW5kQ2hpbGQoZyl9aWYodHlwZW9mIE11dGF0aW9uT2JzZXJ2ZXI9PSJmdW5jdGlvbiIpe2NvbnN0IGc9bmV3IE11dGF0aW9uT2JzZXJ2ZXIoTT0+e3godGhpcywhMSl9KTtnLm9ic2VydmUodGhpc1t5XSx7YXR0cmlidXRlczohMCxzdWJ0cmVlOiEwLGNoYXJhY3RlckRhdGE6ITAsY2hpbGRMaXN0OiEwfSksdGhpcy5vYnNlcnZlcj1nfX1nZXQgY2hpbGRyZW4oKXtyZXR1cm5bdGhpcy5zdmddfWdldCBjaGlsZE5vZGVzKCl7cmV0dXJuW3RoaXMuc3ZnXX1nZXQgc3ZnKCl7cmV0dXJuIHRoaXNbeV0/dGhpc1t5XS5jaGlsZHJlblswXTpudWxsfXNldFJlc29sdXRpb24oe3dpZHRoOmwsaGVpZ2h0Omh9KXtzdXBlci5zZXRSZXNvbHV0aW9uKHt3aWR0aDpsLGhlaWdodDpofSkseCh0aGlzKX1kaXNwYXRjaFBvaW50ZXJFdmVudChsKXtjb25zdCBoPXN1cGVyLmRpc3BhdGNoUG9pbnRlckV2ZW50KGwpO2lmKGgmJnRoaXMuYXR0cmlidXRlcy5wYXNzRXZlbnRzJiZ0eXBlb2YgTW91c2VFdmVudD09ImZ1bmN0aW9uIil7Y29uc3R7eDpmLHk6Z309bDtsZXRbTSxBXT10aGlzLmdldE9mZnNldFBvc2l0aW9uKGYsZyk7Y29uc3QgQz1sLm9yaWdpbmFsRXZlbnQsYj10aGlzLmF0dHJpYnV0ZXMuYW5jaG9yLEU9dGhpcy5jbGllbnRTaXplO009KE0rYlswXSpFWzBdKS8yLEE9KEErYlsxXSpFWzFdKS8yO2NvbnN0IEw9bC50eXBlO2lmKEw9PT1DLnR5cGUpe2xldCBEPW51bGw7aWYoQyBpbnN0YW5jZW9mIE1vdXNlRXZlbnQpRD1uZXcgTW91c2VFdmVudChMLHtzY3JlZW5YOk0sc2NyZWVuWTpBLGNsaWVudFg6TSxjbGllbnRZOkEsYnViYmxlczpDLmJ1YmJsZXMsYnV0dG9uOkMuYnV0dG9uLGJ1dHRvbnM6Qy5idXR0b25zLGNhbmNlbEJ1YmJsZTpDLmNhbmNlbEJ1YmJsZSxjYW5jZWxhYmxlOkMuY2FuY2VsYWJsZSxjdXJyZW50VGFyZ2V0OkMuY3VycmVudFRhcmdldCxmcm9tRWxlbWVudDpDLmZyb21FbGVtZW50LHJlbGF0ZWRUYXJnZXQ6Qy5yZWxhdGVkVGFyZ2V0LHJldHVyblZhbHVlOkMucmV0dXJuVmFsdWUsc3JjRWxlbWVudDpDLnNyY0VsZW1lbnQsdGFyZ2V0OkMudGFyZ2V0LHRvRWxlbWVudDpDLnRvRWxlbWVudCx3aGljaDpDLndpdGNofSk7ZWxzZSBpZihDIGluc3RhbmNlb2YgVG91Y2hFdmVudCl7bGV0IEk9bnVsbDtjb25zdCBSPUMuY2hhbmdlZFRvdWNoZXN8fFtDXTtmb3IobGV0IEI9MDtCPFIubGVuZ3RoO0IrKyl7Y29uc3Qgej1SW0JdO2lmKGwuaWRlbnRpZmllcj09PXouaWRlbnRpZmllcil7ST16O2JyZWFrfX1pZihJKXtjb25zdCBCPW5ldyBUb3VjaCh7aWRlbnRpZmllcjpJLmlkZW50aWZpZXIsdGFyZ2V0OkkudGFyZ2V0LGNsaWVudFg6TSxjbGllbnRZOkEsc2NyZWVuWDpNLHNjcmVlblk6QSxwYWdlWDpNLHBhZ2VZOkEscmFkaXVzWDpJLnJhZGl1c1gscmFkaXVzWTpJLnJhZGl1c1kscm90YXRpb25BbmdsZTpJLnJvdGF0aW9uQW5nbGUsZm9yY2U6SS5mb3JjZX0pO0Q9bmV3IFRvdWNoRXZlbnQoTCx7Y2FuY2VsYWJsZTpDLmNhbmNlbGFibGUsYnViYmxlczpDLmJ1YmJsZXMsY29tcG9zZWQ6Qy5jb21wb3NlZCx0b3VjaGVzOltCXSx0YXJnZXRUb3VjaGVzOltCXSxjaGFuZ2VkVG91Y2hlczpbQl19KX19ZWxzZSBEPUM7RCYmdGhpcy5zdmcuZGlzcGF0Y2hFdmVudChEKX19cmV0dXJuIGh9Z2V0RWxlbWVudEJ5SWQobCl7cmV0dXJuIE9iamVjdChzLnF1ZXJ5U2VsZWN0b3IpKGAjJHtsfWAsdGhpcyl9Z2V0RWxlbWVudHNCeUNsYXNzTmFtZShsKXtyZXR1cm4gT2JqZWN0KHMucXVlcnlTZWxlY3RvckFsbCkoYC4ke2x9YCx0aGlzKX1nZXRFbGVtZW50c0J5TmFtZShsKXtyZXR1cm4gT2JqZWN0KHMucXVlcnlTZWxlY3RvckFsbCkoYFtuYW1lPSIke2x9Il1gLHRoaXMpfWdldEVsZW1lbnRzQnlUYWdOYW1lKGwpe3JldHVybiBPYmplY3Qocy5xdWVyeVNlbGVjdG9yQWxsKShsLHRoaXMpfXF1ZXJ5U2VsZWN0b3IobCl7cmV0dXJuIE9iamVjdChzLnF1ZXJ5U2VsZWN0b3IpKGwsdGhpcyl9cXVlcnlTZWxlY3RvckFsbChsKXtyZXR1cm4gT2JqZWN0KHMucXVlcnlTZWxlY3RvckFsbCkobCx0aGlzKX1vblByb3BlcnR5Q2hhbmdlKGwsaCxmKXtzdXBlci5vblByb3BlcnR5Q2hhbmdlKGwsaCxmKSxsPT09ImZsZXhpYmxlIiYmeCh0aGlzKSx0aGlzLmF0dHJpYnV0ZXMuZmxleGlibGUmJihsPT09IndpZHRoInx8bD09PSJoZWlnaHQifHxsPT09InNjYWxlInx8bD09PSJ0cmFuc2Zvcm0iKSYmeCh0aGlzKX19bSh2LCJBdHRyIixuLmRlZmF1bHQpLGEuZGVmYXVsdC5yZWdpc3Rlck5vZGUodiwic3ByaXRlc3ZnIil9LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImRlZmF1bHQiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KTt2YXIgZT10KDIyNSk7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2NvbnN0IG49U3ltYm9sLmZvcigic3ByaXRlanNfZ2V0QXR0cmlidXRlIiksYT1TeW1ib2wuZm9yKCJzcHJpdGVqc19zZXRBdHRyaWJ1dGUiKSxzPVN5bWJvbC5mb3IoInNwcml0ZWpzX3NldEF0dHJpYnV0ZURlZmF1bHQiKTtjbGFzcyBpIGV4dGVuZHMgZS5kZWZhdWx0e2NvbnN0cnVjdG9yKGMpe3N1cGVyKGMpLHRoaXNbc10oe3Bhc3NFdmVudHM6ITEsZmxleGlibGU6ITF9KX1nZXQgdGV4dHVyZSgpe3JldHVybiB0aGlzW25dKCJ0ZXh0dXJlIil9c2V0IHRleHR1cmUoYyl7fWdldCBwYXNzRXZlbnRzKCl7cmV0dXJuIHRoaXNbbl0oInBhc3NFdmVudHMiKX1zZXQgcGFzc0V2ZW50cyhjKXtyZXR1cm4gdGhpc1thXSgicGFzc0V2ZW50cyIsYyl9Z2V0IGZsZXhpYmxlKCl7cmV0dXJuIHRoaXNbbl0oImZsZXhpYmxlIil9c2V0IGZsZXhpYmxlKGMpe3JldHVybiB0aGlzW2FdKCJmbGV4aWJsZSIsYyl9fX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKTt2YXIgZT10KDEyKTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7ZnVuY3Rpb24gbihjLG0pe3ZhciB1PU9iamVjdC5rZXlzKGMpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBwPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoYyk7bSYmKHA9cC5maWx0ZXIoZnVuY3Rpb24oeSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYyx5KS5lbnVtZXJhYmxlfSkpLHUucHVzaC5hcHBseSh1LHApfXJldHVybiB1fWZ1bmN0aW9uIGEoYyl7Zm9yKHZhciBtPTE7bTxhcmd1bWVudHMubGVuZ3RoO20rKyl7dmFyIHU9YXJndW1lbnRzW21dIT1udWxsP2FyZ3VtZW50c1ttXTp7fTttJTI/bihPYmplY3QodSksITApLmZvckVhY2goZnVuY3Rpb24ocCl7cyhjLHAsdVtwXSl9KTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyhjLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHUpKTpuKE9iamVjdCh1KSkuZm9yRWFjaChmdW5jdGlvbihwKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYyxwLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodSxwKSl9KX1yZXR1cm4gY31mdW5jdGlvbiBzKGMsbSx1KXtyZXR1cm4gbSBpbiBjP09iamVjdC5kZWZpbmVQcm9wZXJ0eShjLG0se3ZhbHVlOnUsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTpjW21dPXUsY31jb25zdCBpPVN5bWJvbCgiaW5pdGVkIik7bGV0IG89bnVsbDt0eXBlb2YgV29ya2VyPT0iZnVuY3Rpb24iJiYobz1jbGFzcyBleHRlbmRzIFdvcmtlcntjb25zdHJ1Y3RvcihjKXtpZihjLndvcmtlcj09PSEwJiYoYy53b3JrZXI9YC4vJHtjLmlkfS53b3JrZXIuanNgKSxzdXBlcihjLndvcmtlciksdGhpcy5vcHRpb25zPWMsIWMuY2FudmFzKXtjb25zdHt3aWR0aDptLGhlaWdodDp1fT10aGlzLmdldFJlc29sdXRpb24oKSxwPWUuRU5WLmNyZWF0ZUNhbnZhcyhtLHUse29mZnNjcmVlbjohMX0pO3Auc3R5bGUmJihwLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIpLHAuZGF0YXNldCYmKHAuZGF0YXNldC5sYXllcklkPWMuaWQpLGMuY2FudmFzPXB9dGhpcy5jYW52YXM9Yy5jYW52YXN9Z2V0IGlkKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5pZH1zZXRSZXNvbHV0aW9uKHt3aWR0aDpjLGhlaWdodDptfSl7aWYodGhpc1tpXSl0aGlzLnBvc3RNZXNzYWdlKHt0eXBlOiJyZXNvbHV0aW9uX2NoYW5nZSIsd2lkdGg6YyxoZWlnaHQ6bX0pO2Vsc2V7dGhpcy5jYW52YXMud2lkdGg9Yyx0aGlzLmNhbnZhcy5oZWlnaHQ9bTtjb25zdCB1PXRoaXMub3B0aW9ucyxwPXUuY2FudmFzLnRyYW5zZmVyQ29udHJvbFRvT2Zmc2NyZWVuKCkseT1hKHt9LHUpO2RlbGV0ZSB5LmNvbnRhaW5lcix5LmNhbnZhcz1wLHRoaXMucG9zdE1lc3NhZ2Uoe3R5cGU6ImNyZWF0ZSIsb3B0aW9uczp5fSxbcF0pLHRoaXNbaV09ITB9fWdldFJlc29sdXRpb24oKXtpZih0aGlzLmNhbnZhcyl7Y29uc3R7d2lkdGg6YyxoZWlnaHQ6bX09dGhpcy5jYW52YXM7cmV0dXJue3dpZHRoOmMsaGVpZ2h0Om19fXJldHVybnt3aWR0aDozMDAsaGVpZ2h0OjE1MH19cmVtb3ZlKCl7cmV0dXJuIHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5yZW1vdmVDaGlsZD8odGhpcy5wYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyksITApOiExfWNvbm5lY3QoYyxtKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywicGFyZW50Iix7dmFsdWU6Yyx3cml0YWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiek9yZGVyIix7dmFsdWU6bSx3cml0YWJsZTohMSxjb25maWd1cmFibGU6ITB9KX1kaXNjb25uZWN0KCl7ZGVsZXRlIHRoaXMucGFyZW50LGRlbGV0ZSB0aGlzLnpPcmRlcn1kaXNwYXRjaFBvaW50ZXJFdmVudChjKXt0aGlzLnBvc3RNZXNzYWdlKHt0eXBlOiJldmVudCIsZXZlbnQ6e2NhbmNlbEJ1YmJsZTpjLmNhbmNlbEJ1YmJsZSxidWJibGVzOmMuYnViYmxlcyxkZXRhaWw6Yy5kZXRhaWwsaWRlbnRpZmllcjpjLmlkZW50aWZpZXIsbGF5ZXJYOmMubGF5ZXJYLGxheWVyWTpjLmxheWVyWSxvcmlnaW5hbFg6Yy5vcmlnaW5hbFgsb3JpZ2luYWxZOmMub3JpZ2luYWxZLHR5cGU6Yy50eXBlLHg6Yy54LHk6Yy55fX0pfX0pLHIuZGVmYXVsdD1vfSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLChmdW5jdGlvbihlKXt0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gTX0pO3ZhciBuPXQoMTIpLGE9dCg2OCkscz10KDcwKSxpPXQoMjg2KSxvPXQoMjg5KSxjPXQoMjUwKSxtPXQoMjkxKSx1PXQoMjE0KSxwPXQoMjE4KSx5PXQoMjEzKTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7Y29uc3QgTz1TeW1ib2woImVudGVyZWRUYXJnZXRzIik7ZnVuY3Rpb24geChBKXtyZXR1cm4gQS5pZD1BLmlkfHxgX2xheWVyJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLDEyKX1gLEEuZGF0YXNldHx8KEEuZGF0YXNldD17fSksQS5kYXRhc2V0LmxheWVySWQ9QS5pZCxBLmNvbm5lY3Q9KEMsYik9PntBLnBhcmVudD1DLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBLCJ6T3JkZXIiLHt2YWx1ZTpiLHdyaXRhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pfSxBLmRpc2Nvbm5lY3Q9Qz0+e2RlbGV0ZSBBLnpPcmRlcn0sQS5jYW52YXM9QSxBLmdldFJlc29sdXRpb249KCk9Pih7d2lkdGg6MCxoZWlnaHQ6MH0pLEEuc2V0UmVzb2x1dGlvbj0oKT0+ITEsQS5vcHRpb25zPXtoYW5kbGVFdmVudDohMX0sQX1mdW5jdGlvbiB2KEEsQyl7Y29uc3QgYj1BLmNoaWxkcmVuO2xldCBFPW51bGw7Zm9yKGxldCBMPTA7TDxiLmxlbmd0aDtMKyspe2NvbnN0IEQ9YltMXTtpZigoQz09PUR8fEUhPW51bGwpJiYoRT1EKSxFJiZFIT09QyYmIUUub2Zmc2NyZWVuKXJldHVybiBFLmNhbnZhc31yZXR1cm4gbnVsbH1mdW5jdGlvbiBUKEEsQyl7Y29uc3RbYixFXT1BLnJlbmRlck9mZnNldCx7d2lkdGg6TCxoZWlnaHQ6RH09QS5nZXRSZXNvbHV0aW9uKCksST1BLmRpc3BsYXlSYXRpbztBLnJlbmRlcmVyLmRyYXdJbWFnZShDLmNhbnZhcywtYi9JLC1FL0ksTC9JLEQvSSl9Y29uc3QgbD17fTtmdW5jdGlvbiBoKEEpe2NvbnN0IEM9WyJtb3VzZWRvd24iLCJtb3VzZXVwIiwibW91c2Vtb3ZlIiwibW91c2V3aGVlbCIsIndoZWVsIiwidG91Y2hzdGFydCIsInRvdWNoZW5kIiwidG91Y2htb3ZlIiwidG91Y2hjYW5jZWwiLCJjbGljayIsImRibGNsaWNrIiwibG9uZ3ByZXNzIiwidGFwIiwiY29udGV4dG1lbnUiXSxiPUEuY29udGFpbmVyO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsRT0+e2NvbnN0IEw9QVtPXTtpZihMLnNpemUpe2NvbnN0IEQ9bmV3IHUuZGVmYXVsdCgibW91c2VsZWF2ZSIpO0Quc2V0T3JpZ2luYWxFdmVudChFKSxbLi4uTF0uZm9yRWFjaChJPT57SS5kaXNwYXRjaEV2ZW50KEQpfSksQVtPXS5jbGVhcigpfX0se3Bhc3NpdmU6ITB9KSxDLmZvckVhY2goRT0+e2IuYWRkRXZlbnRMaXN0ZW5lcihFLEw9Pntjb25zdHtsZWZ0OkQsdG9wOkksZGlzcGxheVJhdGlvOlJ9PUEub3B0aW9ucyxCPUEub3JkZXJlZENoaWxkcmVuO09iamVjdChtLmRlZmF1bHQpKEwse29mZnNldExlZnQ6RCxvZmZzZXRUb3A6SSxkaXNwbGF5UmF0aW86Un0pLmZvckVhY2goSz0+e2NvbnN0IFE9Sy5pZGVudGlmaWVyO2lmKEsudHlwZT09PSJ0b3VjaG1vdmUifHxLLnR5cGU9PT0idG91Y2hlbmQiKXtjb25zdCBqPWxbUV07aiYmai5kaXNwYXRjaEV2ZW50KEspLEsudHlwZT09PSJ0b3VjaGVuZCImJmRlbGV0ZSBsW1FdfWVsc2V7Zm9yKGxldCBqPUIubGVuZ3RoLTE7aj49MDtqLS0pe2NvbnN0IEc9QltqXTtpZihHLm9wdGlvbnMuaGFuZGxlRXZlbnQhPT0hMSl7aWYoRy5kaXNwYXRjaFBvaW50ZXJFdmVudChLKSYmSy50YXJnZXQhPT1HKWJyZWFrO0suY2FuY2VsQnViYmxlPSExfX1pZihLLnRhcmdldD09PUJbMF0pZm9yKGxldCBqPUIubGVuZ3RoLTE7aj49MDtqLS0pe2NvbnN0IEc9QltqXTtpZihHLm9wdGlvbnMuaGFuZGxlRXZlbnQhPT0hMSl7Sy50YXJnZXQ9RzticmVha319fWNvbnN0IF89Sy50YXJnZXQ7aWYoSy50eXBlPT09InRvdWNoc3RhcnQiJiYobFtRXT1LLnRhcmdldCksSy50eXBlPT09Im1vdXNlbW92ZSIpe2NvbnN0IGo9QVtPXTtsZXQgRztpZihfKXtjb25zdCB0dD1fLmFuY2VzdG9yc3x8W107Rz1uZXcgU2V0KFtfLC4uLnR0XSl9ZWxzZSBHPW5ldyBTZXQ7Y29uc3QgWD1PYmplY3QuZW50cmllcyhMKTtpZighai5oYXMoXykmJl8pe2NvbnN0IHR0PW5ldyB1LmRlZmF1bHQoIm1vdXNlZW50ZXIiKTt0dC5zZXRPcmlnaW5hbEV2ZW50KEwpLFguZm9yRWFjaCgoW3EsZHRdKT0+e3R0W3FdPWR0fSksai5hZGQoXyksXy5kaXNwYXRjaEV2ZW50KHR0KTtjb25zdCBudD1fLmFuY2VzdG9ycztudCYmbnQuZm9yRWFjaChxPT57cSBpbnN0YW5jZW9mIHMuZGVmYXVsdCYmIWouaGFzKHEpJiYoai5hZGQocSkscS5kaXNwYXRjaEV2ZW50KHR0KSl9KX1jb25zdCBaPW5ldyB1LmRlZmF1bHQoIm1vdXNlbGVhdmUiKTtaLnNldE9yaWdpbmFsRXZlbnQoTCksWC5mb3JFYWNoKChbdHQsbnRdKT0+e1pbdHRdPW50fSksWy4uLmpdLmZvckVhY2godHQ9PntHLmhhcyh0dCl8fChqLmRlbGV0ZSh0dCksdHQuZGlzcGF0Y2hFdmVudChaKSl9KX19KX0se3Bhc3NpdmU6RSE9PSJjb250ZXh0bWVudSJ9KX0pfWZ1bmN0aW9uIGYoQSxDKXtpZihDJiZDLnN0eWxlKXtsZXR7d2lkdGg6YixoZWlnaHQ6RSxtb2RlOkwsY29udGFpbmVyOkR9PUE7Y29uc3R7Y2xpZW50V2lkdGg6SSxjbGllbnRIZWlnaHQ6Un09RDtiPWJ8fEksRT1FfHxSLEw9PT0ic3RhdGljIj8oQy5zdHlsZS53aWR0aD1gJHtifXB4YCxDLnN0eWxlLmhlaWdodD1gJHtFfXB4YCk6KEMuc3R5bGUudG9wPSIwIixDLnN0eWxlLmxlZnQ9IjAiLEMuc3R5bGUud2lkdGg9YCR7SX1weGAsQy5zdHlsZS5oZWlnaHQ9YCR7Un1weGAsQy5zdHlsZS50cmFuc2Zvcm09IiIsQy5zdHlsZS53ZWJraXRUcmFuc2Zvcm09IiIpfX1jb25zdCBnPVN5bWJvbCgib2Zmc2NyZWVuTGF5ZXJDb3VudCIpO2NsYXNzIE0gZXh0ZW5kcyBjLmRlZmF1bHR7Y29uc3RydWN0b3IoQz17fSl7aWYoc3VwZXIoKSwhQy5jb250YWluZXIpaWYodHlwZW9mIG4uRU5WLkNvbnRhaW5lcj09ImZ1bmN0aW9uIilDLmNvbnRhaW5lcj1uZXcgbi5FTlYuQ29udGFpbmVyKEMud2lkdGh8fDMwMCxDLmhlaWdodHx8MTUwKTtlbHNlIHRocm93IG5ldyBFcnJvcigiTm8gY29udGFpbmVyIHNwZWNpZmllZC4iKTtpZih0aGlzLmNvbnRhaW5lcj1DLmNvbnRhaW5lcix0aGlzLmNvbnRhaW5lci5zdHlsZSYmKHRoaXMuY29udGFpbmVyLnN0eWxlLm92ZXJmbG93fHwodGhpcy5jb250YWluZXIuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIpLHRoaXMuY29udGFpbmVyLnN0eWxlLnBvc2l0aW9ufHwodGhpcy5jb250YWluZXIuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIikpLHRoaXMub3B0aW9ucz1DLEMuZGlzcGxheVJhdGlvPUMuZGlzcGxheVJhdGlvfHwxLEMubW9kZT1DLm1vZGV8fCJzY2FsZSIsQy5sZWZ0PTAsQy50b3A9MCxDLmF1dG9SZXNpemU9Qy5hdXRvUmVzaXplIT09ITEsQy5hdXRvUmVzaXplKXtsZXQgYjtpZih0eXBlb2YgZ2xvYmFsVGhpczwidSI/Yj1nbG9iYWxUaGlzOmI9dHlwZW9mIHdpbmRvdzwidSI/d2luZG93OmUsYi5hZGRFdmVudExpc3RlbmVyKXtjb25zdCBFPXRoaXM7Yi5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLGZ1bmN0aW9uIEwoKXt0eXBlb2YgZG9jdW1lbnQ8InUiJiZkb2N1bWVudC5jb250YWlucyhFLmNvbnRhaW5lcik/RS5yZXNpemUoKTpiLnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsTCl9KX19dGhpc1tPXT1uZXcgU2V0LHRoaXMuc2V0UmVzb2x1dGlvbihDKSxoKHRoaXMpLHRoaXNbZ109MH1nZXQgaGFzT2Zmc2NyZWVuQ2FudmFzKCl7cmV0dXJuIHRoaXNbZ10+MH1zZXQgZGlzcGxheVJhdGlvKEMpe3RoaXMub3B0aW9ucy5kaXNwbGF5UmF0aW8hPT1DJiYodGhpcy5vcHRpb25zLmRpc3BsYXlSYXRpbz1DLHRoaXMucmVzaXplKCkpfWdldCBkaXNwbGF5UmF0aW8oKXtyZXR1cm4gdGhpcy5vcHRpb25zLmRpc3BsYXlSYXRpb31zZXQgaGVpZ2h0KEMpe3RoaXMub3B0aW9ucy5oZWlnaHQhPT1DJiYodGhpcy5vcHRpb25zLmhlaWdodD1DLHRoaXMucmVzaXplKCkpfWdldCBoZWlnaHQoKXtyZXR1cm4gdGhpcy5vcHRpb25zLmhlaWdodH1zZXQgbW9kZShDKXt0aGlzLm9wdGlvbnMubW9kZSE9PUMmJih0aGlzLm9wdGlvbnMubW9kZT1DLHRoaXMucmVzaXplKCkpfWdldCBtb2RlKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5tb2RlfXNldCB3aWR0aChDKXt0aGlzLm9wdGlvbnMud2lkdGghPT1DJiYodGhpcy5vcHRpb25zLndpZHRoPUMsdGhpcy5yZXNpemUoKSl9Z2V0IHdpZHRoKCl7cmV0dXJuIHRoaXMub3B0aW9ucy53aWR0aH1hcHBlbmRDaGlsZChDKXshKEMgaW5zdGFuY2VvZiBpLmRlZmF1bHQpJiYhKEMgaW5zdGFuY2VvZiBvLmRlZmF1bHQpJiZ4KEMpO2NvbnN0IGI9c3VwZXIuYXBwZW5kQ2hpbGQoQyksRT1DLmNhbnZhcztyZXR1cm4gQy5vZmZzY3JlZW4/dGhpc1tnXSsrOnRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKEUpLGYodGhpcy5vcHRpb25zLEUpLEMuc2V0UmVzb2x1dGlvbih0aGlzLmdldFJlc29sdXRpb24oKSksYn1mb3JjZVVwZGF0ZSgpe3RoaXMuaGFzT2Zmc2NyZWVuQ2FudmFzJiYhdGhpcy5fcmVxdWVzdElEJiYodGhpcy5fcmVxdWVzdElEPU9iamVjdChhLnJlcXVlc3RBbmltYXRpb25GcmFtZSkoKCk9PntkZWxldGUgdGhpcy5fcmVxdWVzdElELHRoaXMucmVuZGVyKCl9KSl9aW5zZXJ0QmVmb3JlKEMsYil7IShDIGluc3RhbmNlb2YgaS5kZWZhdWx0KSYmIShDIGluc3RhbmNlb2Ygby5kZWZhdWx0KSYmeChDKTtjb25zdCBFPXN1cGVyLmluc2VydEJlZm9yZShDLGIpLEw9Qy5jYW52YXM7aWYoIUMub2Zmc2NyZWVuKXtjb25zdCBEPXYodGhpcyxDKTt0aGlzLmNvbnRhaW5lci5pbnNlcnRCZWZvcmUoTCxEKX1yZXR1cm4gZih0aGlzLm9wdGlvbnMsTCksQy5zZXRSZXNvbHV0aW9uKHRoaXMuZ2V0UmVzb2x1dGlvbigpKSxFfWxheWVyKEM9ImRlZmF1bHQiLGI9e30pe2I9T2JqZWN0LmFzc2lnbih7fSx0aGlzLm9wdGlvbnMsYiksYi5pZD1DO2NvbnN0IEU9dGhpcy5vcmRlcmVkQ2hpbGRyZW47Zm9yKGxldCBJPTA7STxFLmxlbmd0aDtJKyspaWYoRVtJXS5pZD09PUMpcmV0dXJuIEVbSV07Y29uc3QgTD1iLndvcmtlcjtsZXQgRDtyZXR1cm4gTD9EPW5ldyBvLmRlZmF1bHQoYik6RD1uZXcgaS5kZWZhdWx0KGIpLHRoaXMuYXBwZW5kQ2hpbGQoRCksRH1hc3luYyBwcmVsb2FkKC4uLkMpe2NvbnN0IGI9W10sRT1bXSxMPVtdO2ZvcihsZXQgRD0wO0Q8Qy5sZW5ndGg7RCsrKXtjb25zdCBJPUNbRF07bGV0IFI7aWYodHlwZW9mIEk9PSJzdHJpbmciKVI9T2JqZWN0KHAubG9hZFRleHR1cmUpKEkpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShJKSlSPU9iamVjdChwLmxvYWRGcmFtZXMpKC4uLkkpO2Vsc2V7Y29uc3R7aWQ6QixzcmM6en09STtSPU9iamVjdChwLmxvYWRUZXh0dXJlKSh6LEIpfVIgaW5zdGFuY2VvZiBQcm9taXNlfHwoUj1Qcm9taXNlLnJlc29sdmUoUikpLEUucHVzaChSLnRoZW4oQj0+e2IucHVzaChCKSxMW0RdPUI7Y29uc3Qgej1uZXcgdS5kZWZhdWx0KHt0eXBlOiJwcmVsb2FkIixkZXRhaWw6e2N1cnJlbnQ6Qixsb2FkZWQ6YixyZXNvdXJjZXM6Q319KTt0aGlzLmRpc3BhdGNoRXZlbnQoeil9KSl9cmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKEUpLEx9cmVtb3ZlQ2hpbGQoQyl7Y29uc3QgYj1zdXBlci5yZW1vdmVDaGlsZChDKTtpZihiKXtDLl9wcmVwYXJlUmVuZGVyRmluaXNoZWQmJkMuX3ByZXBhcmVSZW5kZXJGaW5pc2hlZCgpO2NvbnN0IEU9Qy5jYW52YXM7RSYmRS5yZW1vdmUmJkUucmVtb3ZlKCksQy5vZmZzY3JlZW4mJnRoaXNbZ10tLX1yZXR1cm4gYn1yZW5kZXIoKXtjb25zdCBDPXRoaXMub3JkZXJlZENoaWxkcmVuO2xldCBiPW51bGw7Y29uc3QgRT1bXTtmb3IobGV0IEw9MDtMPEMubGVuZ3RoO0wrKyl7Y29uc3QgRD1DW0xdLEk9RS5sZW5ndGg+MDtpZihEIGluc3RhbmNlb2YgaS5kZWZhdWx0JiYhRC5vZmZzY3JlZW4paWYoIUQuYXV0b1JlbmRlcilJJiYoY29uc29sZS53YXJuKCJTb21lIG9mZnNjcmVlbiBjYW52YXMgd2lsbCBub3QgYmUgcmVuZGVyZWQuIiksRS5sZW5ndGg9MCk7ZWxzZSBpZihiPUQsSSl7RC5yZW5kZXJlci5jbGVhcigpO2ZvcihsZXQgUj0wO1I8RS5sZW5ndGg7UisrKXtjb25zdCBCPUVbUl07Qi5yZW5kZXIoKSxUKEQsQil9RS5sZW5ndGg9MCxELnJlbmRlcih7Y2xlYXI6ITF9KX1lbHNlIEQucHJlcGFyZVJlbmRlciYmRC5yZW5kZXIoKTtlbHNlIEQub2Zmc2NyZWVuP2I/KEQucHJlcGFyZVJlbmRlciYmRC5yZW5kZXIoKSxUKGIsRCkpOkUucHVzaChEKTpEIGluc3RhbmNlb2Ygby5kZWZhdWx0JiZJJiYoY29uc29sZS53YXJuKCJTb21lIG9mZnNjcmVlbiBjYW52YXMgd2lsbCBub3QgYmUgcmVuZGVyZWQuIiksRS5sZW5ndGg9MCl9fXJlcGxhY2VDaGlsZChDLGIpe2NvbnN0IEU9c3VwZXIucmVwbGFjZUNoaWxkKEMsYik7Yi5jYW52YXMucmVtb3ZlJiZiLmNhbnZhcy5yZW1vdmUoKSxiLm9mZnNjcmVlbiYmdGhpc1tnXS0tO2NvbnN0IEw9Qy5jYW52YXM7aWYoIUMub2Zmc2NyZWVuKXtjb25zdCBEPXYodGhpcyxDKTt0aGlzLmNvbnRhaW5lci5pbnNlcnRCZWZvcmUoTCxEKX1yZXR1cm4gZih0aGlzLm9wdGlvbnMsTCksQy5zZXRSZXNvbHV0aW9uKHRoaXMuZ2V0UmVzb2x1dGlvbigpKSxFfXJlc2l6ZSgpe2NvbnN0IEM9dGhpcy5vcHRpb25zO3RoaXMuY2hpbGRyZW4uZm9yRWFjaChiPT57ZihDLGIuY2FudmFzKX0pLHRoaXMuc2V0UmVzb2x1dGlvbihDKSx0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6InJlc2l6ZSJ9KX1zZXRSZXNvbHV0aW9uKHt3aWR0aDpDLGhlaWdodDpifT17fSl7Y29uc3QgRT10aGlzLmNvbnRhaW5lcix7Y2xpZW50V2lkdGg6TCxjbGllbnRIZWlnaHQ6RH09RTsoQz09bnVsbHx8Yj09bnVsbCkmJihDPUM/P0wsYj1iPz9EKTtjb25zdHttb2RlOkksZGlzcGxheVJhdGlvOlJ9PXRoaXMub3B0aW9ucztpZihDKj1SLGIqPVIsdGhpcy5vcHRpb25zLmxlZnQ9MCx0aGlzLm9wdGlvbnMudG9wPTAsST09PSJzdGlja3lIZWlnaHQifHxJPT09InN0aWNreUxlZnQifHxJPT09InN0aWNreVJpZ2h0Iil7Y29uc3QgQj1DO0M9TCpiL0QsST09PSJzdGlja3lIZWlnaHQiJiYodGhpcy5vcHRpb25zLmxlZnQ9LjUqKEMtQikpLEk9PT0ic3RpY2t5UmlnaHQiJiYodGhpcy5vcHRpb25zLmxlZnQ9Qy1CKX1lbHNlIGlmKEk9PT0ic3RpY2t5V2lkdGgifHxJPT09InN0aWNreVRvcCJ8fEk9PT0ic3RpY2t5Qm90dG9tIil7Y29uc3QgQj1iO2I9RCpDL0wsST09PSJzdGlja3lXaWR0aCImJih0aGlzLm9wdGlvbnMudG9wPS41KihiLUIpKSxJPT09InN0aWNreUJvdHRvbSImJih0aGlzLm9wdGlvbnMudG9wPWItQil9c3VwZXIuc2V0UmVzb2x1dGlvbih7d2lkdGg6QyxoZWlnaHQ6Yn0pfXNuYXBzaG90KHtvZmZzY3JlZW46Qz0hMSxsYXllcnM6Yn09e30pe2NvbnN0IEU9Qz8ic25hcHNob3RPZmZTY3JlZW5DYW52YXMiOiJzbmFwc2hvdENhbnZhcyIse3dpZHRoOkwsaGVpZ2h0OkR9PXRoaXMuZ2V0UmVzb2x1dGlvbigpO3RoaXNbRV09dGhpc1tFXXx8bi5FTlYuY3JlYXRlQ2FudmFzKEwsRCx7b2Zmc2NyZWVuOkN9KTtjb25zdCBJPXRoaXNbRV0uZ2V0Q29udGV4dCgiMmQiKTtiPWJ8fHRoaXMub3JkZXJlZENoaWxkcmVuLHRoaXNbRV0ud2lkdGg9TCx0aGlzW0VdLmhlaWdodD1EO2ZvcihsZXQgUj0wO1I8Yi5sZW5ndGg7UisrKXtjb25zdCBCPWJbUl07aWYoIUIub3B0aW9ucy5pZ25vcmVTbmFwc2hvdCl7Qi5yZW5kZXImJkIucmVuZGVyKCk7Y29uc3Qgej1CLmNhbnZhczt6JiZ6IT09QiYmSS5kcmF3SW1hZ2UoeiwwLDAsTCxEKX19cmV0dXJuIHRoaXNbRV19fXR5cGVvZiBkb2N1bWVudDwidSImJihNLnByb3RvdHlwZS5sYXllcjNkPWZ1bmN0aW9uKEEsQz17fSl7Y29uc3QgYj1DLnVybHx8Imh0dHBzOi8vdW5wa2cuY29tL3Nwcml0ZS1leHRlbmQtM2QvZGlzdC9zcHJpdGUtZXh0ZW5kLTNkLm1pbi5qcyI7cmV0dXJuIG5ldyBQcm9taXNlKChFLEwpPT57Y29uc3QgRD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtELmFzeW5jPSExLEQuc3JjPWIsRC5vbmxvYWQ9KCk9Pnt0cnl7RSh0aGlzLmxheWVyM2QoQSxDKSl9Y2F0Y2goSSl7TChJKX19LGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZChEKX0pfSkseS5kZWZhdWx0LnJlZ2lzdGVyTm9kZShNLCJzY2VuZSIpfSkuY2FsbCh0aGlzLHQoMjIpKX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gbn0pO3ZhciBlPXQoMjE0KTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7ZnVuY3Rpb24gbihhLHtvZmZzZXRUb3A6cz0wLG9mZnNldExlZnQ6aT0wLGRpc3BsYXlSYXRpbzpvPTF9PXt9KXtsZXQgYyxtO2NvbnN0IHU9W10se2xlZnQ6cCx0b3A6eSx3aWR0aDpPLGhlaWdodDp4fT1hLnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx2PWEudGFyZ2V0LndpZHRoLFQ9YS50YXJnZXQuaGVpZ2h0LGw9YS5jaGFuZ2VkVG91Y2hlc3x8W2FdO2ZvcihsZXQgZj0wO2Y8bC5sZW5ndGg7ZisrKXtjb25zdCBnPWxbZl0sTT1nLmlkZW50aWZpZXIse2NsaWVudFg6QSxjbGllbnRZOkN9PWc7QSE9bnVsbCYmQyE9bnVsbCYmdS5wdXNoKHt4Ok1hdGgucm91bmQoKEF8MCktcCkseTpNYXRoLnJvdW5kKChDfDApLXkpLGlkZW50aWZpZXI6TX0pfXUubGVuZ3RoPD0wJiZ1LnB1c2goe3g6Yyx5Om19KTtjb25zdCBoPVtdO3JldHVybiB1LmZvckVhY2goZj0+e2YueCE9bnVsbCYmZi55IT1udWxsJiYoYz0oZi54KnYvTy1pKS9vLG09KGYueSpUL3gtcykvbyk7Y29uc3QgZz1uZXcgZS5kZWZhdWx0KGEpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGcse2xheWVyWDp7dmFsdWU6Yyxjb25maWd1cmFibGU6ITB9LGxheWVyWTp7dmFsdWU6bSxjb25maWd1cmFibGU6ITB9LG9yaWdpbmFsWDp7dmFsdWU6Zi54fSxvcmlnaW5hbFk6e3ZhbHVlOmYueX0seDp7dmFsdWU6Yyxjb25maWd1cmFibGU6ITB9LHk6e3ZhbHVlOm0sY29uZmlndXJhYmxlOiEwfSxpZGVudGlmaWVyOnt2YWx1ZTpmLmlkZW50aWZpZXJ9fSksaC5wdXNoKGcpfSksaH19XSk7RHQudmVyc2lvbixEdC5BcmMsRHQuQmxvY2ssRHQuQ2xvdWQsRHQuQ29sb3I7Y29uc3QgeG49RHQuRWxsaXBzZTtEdC5HcmFkaWVudDtjb25zdCByZT1EdC5Hcm91cCxVaD1EdC5MYWJlbDtEdC5MYXllcixEdC5MYXllcldvcmtlcixEdC5Ob2RlLER0LlBhcmFsbGVsO2NvbnN0IGhlPUR0LlBhdGgsZGU9RHQuUG9seWxpbmUsaHI9RHQuUmVjdDtEdC5SZWd1bGFyLER0LlJpbmc7Y29uc3QgJGg9RHQuU2NlbmUsemg9RHQuU3ByaXRlO0R0LlNwcml0ZVN2ZyxEdC5TdGFyLER0LlRyaWFuZ2xlLER0LmhlbHBlcnMsRHQuY3JlYXRlRWxlbWVudCxEdC5pc1Nwcml0ZU5vZGUsRHQucmVnaXN0ZXJOb2RlLER0LnJlcXVlc3RBbmltYXRpb25GcmFtZSxEdC5jYW5jZWxBbmltYXRpb25GcmFtZSxEdC5FTlY7ZnVuY3Rpb24gT2UoZCxyPSEwKXtjb25zdCB0PWQubGVuZ3RoO2lmKHQ8MilyZXR1cm4iIjtsZXQgZT1kWzBdLG49ZFsxXTtpZih0PT09MilyZXR1cm5gTSR7VGUoZSl9TCR7VGUobil9YDtsZXQgYT0iIjtmb3IobGV0IHM9MixpPXQtMTtzPGk7cysrKWU9ZFtzXSxuPWRbcysxXSxhKz1NZShlLG4pO3JldHVybiByP2BNJHtNZShkWzBdLGRbMV0pfVEke1RlKGRbMV0pfSR7TWUoZFsxXSxkWzJdKX1UJHthfSR7TWUoZFt0LTFdLGRbMF0pfSR7TWUoZFswXSxkWzFdKX1aYDpgTSR7VGUoZFswXSl9USR7VGUoZFsxXSl9JHtNZShkWzFdLGRbMl0pfSR7ZC5sZW5ndGg+Mz8iVCI6IiJ9JHthfUwke1RlKGRbdC0xXSl9YH12YXIgZHI9e2V4cG9ydHM6e319O2RyLmV4cG9ydHMsZnVuY3Rpb24oZCl7dmFyIHI9ZnVuY3Rpb24oKXt2YXIgdD1TdHJpbmcuZnJvbUNoYXJDb2RlLGU9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89IixuPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSstJCIsYT17fTtmdW5jdGlvbiBzKG8sYyl7aWYoIWFbb10pe2Fbb109e307Zm9yKHZhciBtPTA7bTxvLmxlbmd0aDttKyspYVtvXVtvLmNoYXJBdChtKV09bX1yZXR1cm4gYVtvXVtjXX12YXIgaT17Y29tcHJlc3NUb0Jhc2U2NDpmdW5jdGlvbihvKXtpZihvPT1udWxsKXJldHVybiIiO3ZhciBjPWkuX2NvbXByZXNzKG8sNixmdW5jdGlvbihtKXtyZXR1cm4gZS5jaGFyQXQobSl9KTtzd2l0Y2goYy5sZW5ndGglNCl7ZGVmYXVsdDpjYXNlIDA6cmV0dXJuIGM7Y2FzZSAxOnJldHVybiBjKyI9PT0iO2Nhc2UgMjpyZXR1cm4gYysiPT0iO2Nhc2UgMzpyZXR1cm4gYysiPSJ9fSxkZWNvbXByZXNzRnJvbUJhc2U2NDpmdW5jdGlvbihvKXtyZXR1cm4gbz09bnVsbD8iIjpvPT0iIj9udWxsOmkuX2RlY29tcHJlc3Moby5sZW5ndGgsMzIsZnVuY3Rpb24oYyl7cmV0dXJuIHMoZSxvLmNoYXJBdChjKSl9KX0sY29tcHJlc3NUb1VURjE2OmZ1bmN0aW9uKG8pe3JldHVybiBvPT1udWxsPyIiOmkuX2NvbXByZXNzKG8sMTUsZnVuY3Rpb24oYyl7cmV0dXJuIHQoYyszMil9KSsiICJ9LGRlY29tcHJlc3NGcm9tVVRGMTY6ZnVuY3Rpb24obyl7cmV0dXJuIG89PW51bGw/IiI6bz09IiI/bnVsbDppLl9kZWNvbXByZXNzKG8ubGVuZ3RoLDE2Mzg0LGZ1bmN0aW9uKGMpe3JldHVybiBvLmNoYXJDb2RlQXQoYyktMzJ9KX0sY29tcHJlc3NUb1VpbnQ4QXJyYXk6ZnVuY3Rpb24obyl7Zm9yKHZhciBjPWkuY29tcHJlc3MobyksbT1uZXcgVWludDhBcnJheShjLmxlbmd0aCoyKSx1PTAscD1jLmxlbmd0aDt1PHA7dSsrKXt2YXIgeT1jLmNoYXJDb2RlQXQodSk7bVt1KjJdPXk+Pj44LG1bdSoyKzFdPXklMjU2fXJldHVybiBtfSxkZWNvbXByZXNzRnJvbVVpbnQ4QXJyYXk6ZnVuY3Rpb24obyl7aWYobz09bnVsbClyZXR1cm4gaS5kZWNvbXByZXNzKG8pO2Zvcih2YXIgYz1uZXcgQXJyYXkoby5sZW5ndGgvMiksbT0wLHU9Yy5sZW5ndGg7bTx1O20rKyljW21dPW9bbSoyXSoyNTYrb1ttKjIrMV07dmFyIHA9W107cmV0dXJuIGMuZm9yRWFjaChmdW5jdGlvbih5KXtwLnB1c2godCh5KSl9KSxpLmRlY29tcHJlc3MocC5qb2luKCIiKSl9LGNvbXByZXNzVG9FbmNvZGVkVVJJQ29tcG9uZW50OmZ1bmN0aW9uKG8pe3JldHVybiBvPT1udWxsPyIiOmkuX2NvbXByZXNzKG8sNixmdW5jdGlvbihjKXtyZXR1cm4gbi5jaGFyQXQoYyl9KX0sZGVjb21wcmVzc0Zyb21FbmNvZGVkVVJJQ29tcG9uZW50OmZ1bmN0aW9uKG8pe3JldHVybiBvPT1udWxsPyIiOm89PSIiP251bGw6KG89by5yZXBsYWNlKC8gL2csIisiKSxpLl9kZWNvbXByZXNzKG8ubGVuZ3RoLDMyLGZ1bmN0aW9uKGMpe3JldHVybiBzKG4sby5jaGFyQXQoYykpfSkpfSxjb21wcmVzczpmdW5jdGlvbihvKXtyZXR1cm4gaS5fY29tcHJlc3MobywxNixmdW5jdGlvbihjKXtyZXR1cm4gdChjKX0pfSxfY29tcHJlc3M6ZnVuY3Rpb24obyxjLG0pe2lmKG89PW51bGwpcmV0dXJuIiI7dmFyIHUscCx5PXt9LE89e30seD0iIix2PSIiLFQ9IiIsbD0yLGg9MyxmPTIsZz1bXSxNPTAsQT0wLEM7Zm9yKEM9MDtDPG8ubGVuZ3RoO0MrPTEpaWYoeD1vLmNoYXJBdChDKSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeSx4KXx8KHlbeF09aCsrLE9beF09ITApLHY9VCt4LE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh5LHYpKVQ9djtlbHNle2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChPLFQpKXtpZihULmNoYXJDb2RlQXQoMCk8MjU2KXtmb3IodT0wO3U8Zjt1KyspTT1NPDwxLEE9PWMtMT8oQT0wLGcucHVzaChtKE0pKSxNPTApOkErKztmb3IocD1ULmNoYXJDb2RlQXQoMCksdT0wO3U8ODt1KyspTT1NPDwxfHAmMSxBPT1jLTE/KEE9MCxnLnB1c2gobShNKSksTT0wKTpBKysscD1wPj4xfWVsc2V7Zm9yKHA9MSx1PTA7dTxmO3UrKylNPU08PDF8cCxBPT1jLTE/KEE9MCxnLnB1c2gobShNKSksTT0wKTpBKysscD0wO2ZvcihwPVQuY2hhckNvZGVBdCgwKSx1PTA7dTwxNjt1KyspTT1NPDwxfHAmMSxBPT1jLTE/KEE9MCxnLnB1c2gobShNKSksTT0wKTpBKysscD1wPj4xfWwtLSxsPT0wJiYobD1NYXRoLnBvdygyLGYpLGYrKyksZGVsZXRlIE9bVF19ZWxzZSBmb3IocD15W1RdLHU9MDt1PGY7dSsrKU09TTw8MXxwJjEsQT09Yy0xPyhBPTAsZy5wdXNoKG0oTSkpLE09MCk6QSsrLHA9cD4+MTtsLS0sbD09MCYmKGw9TWF0aC5wb3coMixmKSxmKyspLHlbdl09aCsrLFQ9U3RyaW5nKHgpfWlmKFQhPT0iIil7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKE8sVCkpe2lmKFQuY2hhckNvZGVBdCgwKTwyNTYpe2Zvcih1PTA7dTxmO3UrKylNPU08PDEsQT09Yy0xPyhBPTAsZy5wdXNoKG0oTSkpLE09MCk6QSsrO2ZvcihwPVQuY2hhckNvZGVBdCgwKSx1PTA7dTw4O3UrKylNPU08PDF8cCYxLEE9PWMtMT8oQT0wLGcucHVzaChtKE0pKSxNPTApOkErKyxwPXA+PjF9ZWxzZXtmb3IocD0xLHU9MDt1PGY7dSsrKU09TTw8MXxwLEE9PWMtMT8oQT0wLGcucHVzaChtKE0pKSxNPTApOkErKyxwPTA7Zm9yKHA9VC5jaGFyQ29kZUF0KDApLHU9MDt1PDE2O3UrKylNPU08PDF8cCYxLEE9PWMtMT8oQT0wLGcucHVzaChtKE0pKSxNPTApOkErKyxwPXA+PjF9bC0tLGw9PTAmJihsPU1hdGgucG93KDIsZiksZisrKSxkZWxldGUgT1tUXX1lbHNlIGZvcihwPXlbVF0sdT0wO3U8Zjt1KyspTT1NPDwxfHAmMSxBPT1jLTE/KEE9MCxnLnB1c2gobShNKSksTT0wKTpBKysscD1wPj4xO2wtLSxsPT0wJiYobD1NYXRoLnBvdygyLGYpLGYrKyl9Zm9yKHA9Mix1PTA7dTxmO3UrKylNPU08PDF8cCYxLEE9PWMtMT8oQT0wLGcucHVzaChtKE0pKSxNPTApOkErKyxwPXA+PjE7Zm9yKDs7KWlmKE09TTw8MSxBPT1jLTEpe2cucHVzaChtKE0pKTticmVha31lbHNlIEErKztyZXR1cm4gZy5qb2luKCIiKX0sZGVjb21wcmVzczpmdW5jdGlvbihvKXtyZXR1cm4gbz09bnVsbD8iIjpvPT0iIj9udWxsOmkuX2RlY29tcHJlc3Moby5sZW5ndGgsMzI3NjgsZnVuY3Rpb24oYyl7cmV0dXJuIG8uY2hhckNvZGVBdChjKX0pfSxfZGVjb21wcmVzczpmdW5jdGlvbihvLGMsbSl7dmFyIHU9W10scD00LHk9NCxPPTMseD0iIix2PVtdLFQsbCxoLGYsZyxNLEEsQz17dmFsOm0oMCkscG9zaXRpb246YyxpbmRleDoxfTtmb3IoVD0wO1Q8MztUKz0xKXVbVF09VDtmb3IoaD0wLGc9TWF0aC5wb3coMiwyKSxNPTE7TSE9ZzspZj1DLnZhbCZDLnBvc2l0aW9uLEMucG9zaXRpb24+Pj0xLEMucG9zaXRpb249PTAmJihDLnBvc2l0aW9uPWMsQy52YWw9bShDLmluZGV4KyspKSxofD0oZj4wPzE6MCkqTSxNPDw9MTtzd2l0Y2goaCl7Y2FzZSAwOmZvcihoPTAsZz1NYXRoLnBvdygyLDgpLE09MTtNIT1nOylmPUMudmFsJkMucG9zaXRpb24sQy5wb3NpdGlvbj4+PTEsQy5wb3NpdGlvbj09MCYmKEMucG9zaXRpb249YyxDLnZhbD1tKEMuaW5kZXgrKykpLGh8PShmPjA/MTowKSpNLE08PD0xO0E9dChoKTticmVhaztjYXNlIDE6Zm9yKGg9MCxnPU1hdGgucG93KDIsMTYpLE09MTtNIT1nOylmPUMudmFsJkMucG9zaXRpb24sQy5wb3NpdGlvbj4+PTEsQy5wb3NpdGlvbj09MCYmKEMucG9zaXRpb249YyxDLnZhbD1tKEMuaW5kZXgrKykpLGh8PShmPjA/MTowKSpNLE08PD0xO0E9dChoKTticmVhaztjYXNlIDI6cmV0dXJuIiJ9Zm9yKHVbM109QSxsPUEsdi5wdXNoKEEpOzspe2lmKEMuaW5kZXg+bylyZXR1cm4iIjtmb3IoaD0wLGc9TWF0aC5wb3coMixPKSxNPTE7TSE9ZzspZj1DLnZhbCZDLnBvc2l0aW9uLEMucG9zaXRpb24+Pj0xLEMucG9zaXRpb249PTAmJihDLnBvc2l0aW9uPWMsQy52YWw9bShDLmluZGV4KyspKSxofD0oZj4wPzE6MCkqTSxNPDw9MTtzd2l0Y2goQT1oKXtjYXNlIDA6Zm9yKGg9MCxnPU1hdGgucG93KDIsOCksTT0xO00hPWc7KWY9Qy52YWwmQy5wb3NpdGlvbixDLnBvc2l0aW9uPj49MSxDLnBvc2l0aW9uPT0wJiYoQy5wb3NpdGlvbj1jLEMudmFsPW0oQy5pbmRleCsrKSksaHw9KGY+MD8xOjApKk0sTTw8PTE7dVt5KytdPXQoaCksQT15LTEscC0tO2JyZWFrO2Nhc2UgMTpmb3IoaD0wLGc9TWF0aC5wb3coMiwxNiksTT0xO00hPWc7KWY9Qy52YWwmQy5wb3NpdGlvbixDLnBvc2l0aW9uPj49MSxDLnBvc2l0aW9uPT0wJiYoQy5wb3NpdGlvbj1jLEMudmFsPW0oQy5pbmRleCsrKSksaHw9KGY+MD8xOjApKk0sTTw8PTE7dVt5KytdPXQoaCksQT15LTEscC0tO2JyZWFrO2Nhc2UgMjpyZXR1cm4gdi5qb2luKCIiKX1pZihwPT0wJiYocD1NYXRoLnBvdygyLE8pLE8rKyksdVtBXSl4PXVbQV07ZWxzZSBpZihBPT09eSl4PWwrbC5jaGFyQXQoMCk7ZWxzZSByZXR1cm4gbnVsbDt2LnB1c2goeCksdVt5KytdPWwreC5jaGFyQXQoMCkscC0tLGw9eCxwPT0wJiYocD1NYXRoLnBvdygyLE8pLE8rKyl9fX07cmV0dXJuIGl9KCk7ZCE9bnVsbD9kLmV4cG9ydHM9cjp0eXBlb2YgYW5ndWxhcjwidSImJmFuZ3VsYXIhPW51bGwmJmFuZ3VsYXIubW9kdWxlKCJMWlN0cmluZyIsW10pLmZhY3RvcnkoIkxaU3RyaW5nIixmdW5jdGlvbigpe3JldHVybiByfSl9KGRyKTt2YXIgVG49ZHIuZXhwb3J0cztmdW5jdGlvbiBWZShkKXtyZXR1cm4gSlNPTi5wYXJzZShUbi5kZWNvbXByZXNzKGQpKX1mdW5jdGlvbiBuZShkKXtyZXR1cm4gVG4uY29tcHJlc3MoSlNPTi5zdHJpbmdpZnkoZCkpfWNsYXNzIE1uIGV4dGVuZHMgeXR7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7c3QodGhpcywiY2FuUm90YXRlIiwhMCk7c3QodGhpcywic2NhbGVUeXBlIixGdC5hbGwpO3N0KHRoaXMsInRvb2xzVHlwZSIsZ3QuUGVuY2lsKTtzdCh0aGlzLCJzeW5jVGltZXN0YW1wIik7c3QodGhpcywic3luY0luZGV4IiwwKTtzdCh0aGlzLCJ0bXBQb2ludHMiLFtdKTtzdCh0aGlzLCJNQVhfUkVQRUFSIiwxMCk7c3QodGhpcywidW5pVGhpY2tuZXNzIik7c3QodGhpcywid29ya09wdGlvbnMiKTtzdCh0aGlzLCJjZW50ZXJQb3MiLFswLDBdKTt0aGlzLndvcmtPcHRpb25zPXQudG9vbHNPcHQsdGhpcy51bmlUaGlja25lc3M9dGhpcy5NQVhfUkVQRUFSL3RoaXMud29ya09wdGlvbnMudGhpY2tuZXNzLzEwLHRoaXMuc3luY1RpbWVzdGFtcD0wfWNvbWJpbmVDb25zdW1lKCl7dmFyIGk7Y29uc3QgdD0oaT10aGlzLndvcmtJZCk9PW51bGw/dm9pZCAwOmkudG9TdHJpbmcoKSxlPXRoaXMudHJhbnNmb3JtRGF0YUFsbCghMCksbj17bmFtZTp0fTtsZXQgYTtjb25zdCBzPXRoaXMuZHJhd0xheWVyfHx0aGlzLmZ1bGxMYXllcjtyZXR1cm4gZS5sZW5ndGgmJihhPXRoaXMuZHJhdyh7YXR0cnM6bix0YXNrczplLHJlcGxhY2VJZDp0LGxheWVyOnMsaXNDbGVhckFsbDohMH0pKSx7cmVjdDphLHR5cGU6bHQuRHJhd1dvcmssZGF0YVR5cGU6VHQuTG9jYWx9fXNldFdvcmtPcHRpb25zKHQpe3N1cGVyLnNldFdvcmtPcHRpb25zKHQpLHRoaXMuc3luY1RpbWVzdGFtcD1EYXRlLm5vdygpfWNvbnN1bWUodCl7dmFyIHY7Y29uc3R7ZGF0YTplLGlzRnVsbFdvcms6bixpc0NsZWFyQWxsOmEsaXNTdWJXb3JrZXI6c309dDtpZigoKHY9ZS5vcCk9PW51bGw/dm9pZCAwOnYubGVuZ3RoKT09PTApcmV0dXJue3R5cGU6bHQuTm9uZX07Y29uc3R7d29ya0lkOml9PWUse3Rhc2tzOm8sZWZmZWN0czpjLGNvbnN1bWVJbmRleDptfT10aGlzLnRyYW5zZm9ybURhdGEoZSwhMSk7dGhpcy5zeW5jSW5kZXg9TWF0aC5taW4odGhpcy5zeW5jSW5kZXgsbSxNYXRoLm1heCgwLHRoaXMudG1wUG9pbnRzLmxlbmd0aC0yKSk7Y29uc3QgdT17bmFtZTppPT1udWxsP3ZvaWQgMDppLnRvU3RyaW5nKCl9O2xldCBwLHk9ITE7Y29uc3QgTz10aGlzLnN5bmNJbmRleDtpZih0aGlzLnN5bmNUaW1lc3RhbXA9PT0wJiYodGhpcy5zeW5jVGltZXN0YW1wPURhdGUubm93KCkpLG8ubGVuZ3RoJiYob1swXS50YXNrSWQtdGhpcy5zeW5jVGltZXN0YW1wPnRoaXMuc3luY1VuaXRUaW1lJiYoeT0hMCx0aGlzLnN5bmNUaW1lc3RhbXA9b1swXS50YXNrSWQsdGhpcy5zeW5jSW5kZXg9dGhpcy50bXBQb2ludHMubGVuZ3RoKSxzKSl7Y29uc3QgVD1uP3RoaXMuZnVsbExheWVyOnRoaXMuZHJhd0xheWVyfHx0aGlzLmZ1bGxMYXllcjtwPXRoaXMuZHJhdyh7YXR0cnM6dSx0YXNrczpvLGVmZmVjdHM6YyxsYXllcjpULGlzQ2xlYXJBbGw6YX0pfWlmKHMpcmV0dXJuIG0+MTAmJnRoaXMudG1wUG9pbnRzLnNwbGljZSgwLG0tMTApLHtyZWN0OnAsdHlwZTpsdC5EcmF3V29yayxkYXRhVHlwZTpUdC5Mb2NhbH07Y29uc3QgeD1bXTtyZXR1cm4gdGhpcy50bXBQb2ludHMuc2xpY2UoTykuZm9yRWFjaChUPT57eC5wdXNoKFQueCxULnksdGhpcy5jb21wdXRSYWRpdXMoVC56LHRoaXMud29ya09wdGlvbnMudGhpY2tuZXNzKSl9KSx7cmVjdDpwLHR5cGU6bHQuRHJhd1dvcmssZGF0YVR5cGU6VHQuTG9jYWwsd29ya0lkOnk/aTp2b2lkIDAsb3A6eT94OnZvaWQgMCxpbmRleDp5P08qMzp2b2lkIDB9fWNvbnN1bWVBbGwodCl7dmFyIG0sdTtpZih0LmRhdGEpe2NvbnN0e29wOnAsd29ya1N0YXRlOnl9PXQuZGF0YTtwIT1udWxsJiZwLmxlbmd0aCYmeT09PUl0LkRvbmUmJnRoaXMud29ya09wdGlvbnMuc3Ryb2tlVHlwZT09PUt0LlN0cm9rZSYmdGhpcy51cGRhdGVUZW1wUG9pbnRzV2l0aFByZXNzdXJlV2hlbkRvbmUocCl9Y29uc3QgZT0obT10aGlzLndvcmtJZCk9PW51bGw/dm9pZCAwOm0udG9TdHJpbmcoKTtpZighZSlyZXR1cm57dHlwZTpsdC5Ob25lfTtjb25zdCBuPXRoaXMudHJhbnNmb3JtRGF0YUFsbCghMCksYT17bmFtZTplfTtsZXQgcztjb25zdCBpPXRoaXMuZnVsbExheWVyO24ubGVuZ3RoJiYocz10aGlzLmRyYXcoe2F0dHJzOmEsdGFza3M6bixyZXBsYWNlSWQ6ZSxsYXllcjppLGlzQ2xlYXJBbGw6ITF9KSk7Y29uc3Qgbz1bXTt0aGlzLnRtcFBvaW50cy5tYXAocD0+e28ucHVzaChwLngscC55LHRoaXMuY29tcHV0UmFkaXVzKHAueix0aGlzLndvcmtPcHRpb25zLnRoaWNrbmVzcykpfSksdGhpcy5zeW5jVGltZXN0YW1wPTAsZGVsZXRlIHRoaXMud29ya09wdGlvbnMuc3luY1VuaXRUaW1lO2NvbnN0IGM9bmUobyk7cmV0dXJuIHRoaXMudk5vZGVzLnNldEluZm8oZSx7cmVjdDpzLG9wOm8sb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLHNjYWxlVHlwZTp0aGlzLnNjYWxlVHlwZSxjYW5Sb3RhdGU6dGhpcy5jYW5Sb3RhdGUsY2VudGVyUG9zOnMmJnl0LmdldENlbnRlclBvcyhzLGkpfSkse3JlY3Q6cyx0eXBlOmx0LkZ1bGxXb3JrLGRhdGFUeXBlOlR0LkxvY2FsLHdvcmtJZDplLG9wczpjLHVwZGF0ZU5vZGVPcHQ6e3Bvczp0aGlzLmNlbnRlclBvcyx1c2VBbmltYXRpb246ITB9LG9wdDp0aGlzLndvcmtPcHRpb25zLHVuZG9UaWNrZXJJZDoodT10LmRhdGEpPT1udWxsP3ZvaWQgMDp1LnVuZG9UaWNrZXJJZH19Y2xlYXJUbXBQb2ludHMoKXt0aGlzLnRtcFBvaW50cy5sZW5ndGg9MCx0aGlzLnN5bmNUaW1lc3RhbXA9MCx0aGlzLnN5bmNJbmRleD0wfWNvbnN1bWVTZXJ2aWNlKHQpe3ZhciB1O2NvbnN0e29wOmUsaXNGdWxsV29yazpuLHJlcGxhY2VJZDphLGlzQ2xlYXJBbGw6c309dDt0aGlzLnRtcFBvaW50cy5sZW5ndGg9MDtmb3IobGV0IHA9MDtwPGUubGVuZ3RoO3ArPTMpe2NvbnN0IHk9bmV3IE10KGVbcF0sZVtwKzFdLGVbcCsyXSk7aWYodGhpcy50bXBQb2ludHMubGVuZ3RoPjApe2NvbnN0IE89dGhpcy50bXBQb2ludHNbdGhpcy50bXBQb2ludHMubGVuZ3RoLTFdLHg9ZXQuU3ViKHksTykudW5pKCk7eS5zZXR2KHgpfXRoaXMudG1wUG9pbnRzLnB1c2goeSl9Y29uc3QgaT10aGlzLnRyYW5zZm9ybURhdGFBbGwoITEpLG89KHU9dGhpcy53b3JrSWQpPT1udWxsP3ZvaWQgMDp1LnRvU3RyaW5nKCksYz17bmFtZTpvfTtsZXQgbTtpZihvJiZpLmxlbmd0aCl7Y29uc3QgcD1uP3RoaXMuZnVsbExheWVyOnRoaXMuZHJhd0xheWVyfHx0aGlzLmZ1bGxMYXllcjttPXRoaXMuZHJhdyh7YXR0cnM6Yyx0YXNrczppLHJlcGxhY2VJZDphLGxheWVyOnAsaXNDbGVhckFsbDpzfSksdGhpcy52Tm9kZXMuc2V0SW5mbyhvLHtyZWN0Om0sb3A6ZSxvcHQ6dGhpcy53b3JrT3B0aW9ucyx0b29sc1R5cGU6dGhpcy50b29sc1R5cGUsc2NhbGVUeXBlOnRoaXMuc2NhbGVUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxjZW50ZXJQb3M6bSYmeXQuZ2V0Q2VudGVyUG9zKG0scCl9KX1yZXR1cm4gbX10cmFuc2Zvcm1EYXRhQWxsKHQ9ITApe3JldHVybiB0aGlzLmdldFRhc2tQb2ludHModGhpcy50bXBQb2ludHMsdCYmdGhpcy53b3JrT3B0aW9ucy50aGlja25lc3N8fHZvaWQgMCl9ZHJhdyh0KXt2YXIgZztjb25zdHthdHRyczplLHRhc2tzOm4scmVwbGFjZUlkOmEsZWZmZWN0czpzLGxheWVyOmksaXNDbGVhckFsbDpvfT10LHtzdHJva2VDb2xvcjpjLHN0cm9rZVR5cGU6bSx0aGlja25lc3M6dSx6SW5kZXg6cCxzY2FsZTp5LHJvdGF0ZTpPLHRyYW5zbGF0ZTp4fT10aGlzLndvcmtPcHRpb25zO28mJmkucmVtb3ZlQWxsQ2hpbGRyZW4oKSxhJiYodGhpcy5mdWxsTGF5ZXIuZ2V0RWxlbWVudHNCeU5hbWUoYSsiIikubWFwKE09Pk0ucmVtb3ZlKCkpLChnPXRoaXMuZHJhd0xheWVyKT09bnVsbHx8Zy5nZXRFbGVtZW50c0J5TmFtZShhKyIiKS5tYXAoTT0+TS5yZW1vdmUoKSkpLHMhPW51bGwmJnMuc2l6ZSYmKHMuZm9yRWFjaChNPT57dmFyIEE7KEE9aS5nZXRFbGVtZW50QnlJZChNKyIiKSk9PW51bGx8fEEucmVtb3ZlKCl9KSxzLmNsZWFyKCkpO2xldCB2O2NvbnN0IFQ9W10sbD1pLndvcmxkUG9zaXRpb24saD1pLndvcmxkU2NhbGluZztmb3IobGV0IE09MDtNPG4ubGVuZ3RoO00rKyl7Y29uc3R7cG9zOkEscG9pbnRzOkMsdGFza0lkOmJ9PW5bTV07ZS5pZD1iLnRvU3RyaW5nKCk7Y29uc3R7cHM6RSxyZWN0Okx9PXRoaXMuY29tcHV0RHJhd1BvaW50cyhDKTtsZXQgRDtjb25zdCBJPUMubGVuZ3RoPT09MTttPT09S3QuU3Ryb2tlfHxJP0Q9T2UoRSwhMCk6RD1PZShFLCExKTtjb25zdCBSPXtwb3M6QSxkOkQsZmlsbENvbG9yOm09PT1LdC5TdHJva2V8fEk/Yzp2b2lkIDAsbGluZURhc2g6bT09PUt0LkRvdHRlZCYmIUk/WzEsdSoyXTptPT09S3QuTG9uZ0RvdHRlZCYmIUk/W3UsdSoyXTp2b2lkIDAsc3Ryb2tlQ29sb3I6YyxsaW5lQ2FwOm09PT1LdC5TdHJva2V8fEk/dm9pZCAwOiJyb3VuZCIsbGluZVdpZHRoOm09PT1LdC5TdHJva2V8fEk/MDp1fTt2PU90KHYse3g6TWF0aC5mbG9vcigoTC54K0FbMF0pKmhbMF0rbFswXS15dC5TYWZlQm9yZGVyUGFkZGluZykseTpNYXRoLmZsb29yKChMLnkrQVsxXSkqaFsxXStsWzFdLXl0LlNhZmVCb3JkZXJQYWRkaW5nKSx3Ok1hdGguZmxvb3IoTC53KmhbMF0rMip5dC5TYWZlQm9yZGVyUGFkZGluZyksaDpNYXRoLmZsb29yKEwuaCpoWzFdKzIqeXQuU2FmZUJvcmRlclBhZGRpbmcpfSksVC5wdXNoKFIpfXkmJihlLnNjYWxlPXkpLE8mJihlLnJvdGF0ZT1PKSx4JiYoZS50cmFuc2xhdGU9eCk7Y29uc3QgZj1uZXcgcmU7aWYodil7dGhpcy5jZW50ZXJQb3M9eXQuZ2V0Q2VudGVyUG9zKHYsaSksZi5hdHRyKHsuLi5lLG5vcm1hbGl6ZTohMCxpZDplLm5hbWUsYW5jaG9yOlsuNSwuNV0sYmdjb2xvcjptPT09S3QuU3Ryb2tlP2M6dm9pZCAwLHBvczp0aGlzLmNlbnRlclBvcyxzaXplOlsodi53LTIqeXQuU2FmZUJvcmRlclBhZGRpbmcpL2hbMF0sKHYuaC0yKnl0LlNhZmVCb3JkZXJQYWRkaW5nKS9oWzFdXSx6SW5kZXg6cH0pO2NvbnN0IE09VC5tYXAoQT0+KEEucG9zPVtBLnBvc1swXS10aGlzLmNlbnRlclBvc1swXSxBLnBvc1sxXS10aGlzLmNlbnRlclBvc1sxXV0sbmV3IGhlKEEpKSk7Zi5hcHBlbmQoLi4uTSksbT09PUt0LlN0cm9rZSYmZi5zZWFsKCksaS5hcHBlbmQoZil9aWYoeXx8T3x8eCl7Y29uc3QgTT1mPT1udWxsP3ZvaWQgMDpmLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKE0pcmV0dXJue3g6TWF0aC5mbG9vcihNLngteXQuU2FmZUJvcmRlclBhZGRpbmcpLHk6TWF0aC5mbG9vcihNLnkteXQuU2FmZUJvcmRlclBhZGRpbmcpLHc6TWF0aC5mbG9vcihNLndpZHRoK3l0LlNhZmVCb3JkZXJQYWRkaW5nKjIpLGg6TWF0aC5mbG9vcihNLmhlaWdodCt5dC5TYWZlQm9yZGVyUGFkZGluZyoyKX19cmV0dXJuIHZ9Y29tcHV0RHJhd1BvaW50cyh0KXtyZXR1cm4gdGhpcy53b3JrT3B0aW9ucy5zdHJva2VUeXBlPT09S3QuU3Ryb2tlfHx0Lmxlbmd0aD09PTE/dGhpcy5jb21wdXRTdHJva2UodCk6dGhpcy5jb21wdXROb21hbCh0KX1jb21wdXROb21hbCh0KXtsZXQgZT10aGlzLndvcmtPcHRpb25zLnRoaWNrbmVzcztjb25zdCBuPXQubWFwKGE9PihlPU1hdGgubWF4KGUsYS5yYWRpdXMpLGEucG9pbnQpKTtyZXR1cm57cHM6bixyZWN0OkJ0KG4sZSl9fWNvbXB1dFN0cm9rZSh0KXtyZXR1cm4gdC5sZW5ndGg9PT0xP3RoaXMuY29tcHV0RG90U3Ryb2tlKHRbMF0pOnRoaXMuY29tcHV0TGluZVN0cm9rZSh0KX1jb21wdXRMaW5lU3Ryb2tlKHQpe2NvbnN0IGU9W10sbj1bXTtmb3IobGV0IGM9MDtjPHQubGVuZ3RoO2MrKyl7Y29uc3R7cG9pbnQ6bSxyYWRpdXM6dX09dFtjXTtsZXQgcD1tLnY7Yz09PTAmJnQubGVuZ3RoPjEmJihwPXRbYysxXS5wb2ludC52KTtjb25zdCB5PWV0LlBlcihwKS5tdWwodSk7ZS5wdXNoKE10LlN1YihtLHkpKSxuLnB1c2goTXQuQWRkKG0seSkpfWNvbnN0IGE9dFt0Lmxlbmd0aC0xXSxzPU10LkdldFNlbWljaXJjbGVTdHJva2UoYS5wb2ludCxlW2UubGVuZ3RoLTFdLC0xLDgpLGk9TXQuR2V0U2VtaWNpcmNsZVN0cm9rZSh0WzBdLnBvaW50LG5bMF0sLTEsOCksbz1lLmNvbmNhdChzLG4ucmV2ZXJzZSgpLGkpO3JldHVybntwczpvLHJlY3Q6QnQobyl9fWNvbXB1dERvdFN0cm9rZSh0KXtjb25zdHtwb2ludDplLHJhZGl1czpufT10LGE9e3g6ZS54LW4seTplLnktbix3Om4qMixoOm4qMn07cmV0dXJue3BzOk10LkdldERvdFN0cm9rZShlLG4sOCkscmVjdDphfX10cmFuc2Zvcm1EYXRhKHQsZSl7Y29uc3R7b3A6bix3b3JrU3RhdGU6YX09dDtsZXQgcz10aGlzLnRtcFBvaW50cy5sZW5ndGgtMSxpPVtdO2lmKG4hPW51bGwmJm4ubGVuZ3RoJiZhKXtjb25zdHtzdHJva2VUeXBlOm8sdGhpY2tuZXNzOmN9PXRoaXMud29ya09wdGlvbnMsbT1uZXcgU2V0O3M9bz09PUt0LlN0cm9rZT90aGlzLnVwZGF0ZVRlbXBQb2ludHNXaXRoUHJlc3N1cmUobixjLG0pOnRoaXMudXBkYXRlVGVtcFBvaW50cyhuLGMsbSk7Y29uc3QgdT1lP3RoaXMudG1wUG9pbnRzOnRoaXMudG1wUG9pbnRzLnNsaWNlKHMpO3JldHVybiBpPXRoaXMuZ2V0VGFza1BvaW50cyh1LGMpLHt0YXNrczppLGVmZmVjdHM6bSxjb25zdW1lSW5kZXg6c319cmV0dXJue3Rhc2tzOmksY29uc3VtZUluZGV4OnN9fWNvbXB1dFJhZGl1cyh0LGUpe3JldHVybiB0Ki4wMyplK2UqLjV9Z2V0TWluWih0LGUpe3JldHVybigoZXx8TWF0aC5tYXgoMSxNYXRoLmZsb29yKHQqLjMpKSktdCouNSkqMTAwL3QvM31nZXRUYXNrUG9pbnRzKHQsZSl7dmFyIHU7Y29uc3Qgbj1bXTtpZih0Lmxlbmd0aD09PTApcmV0dXJuW107bGV0IGE9MCxzPXRbMF0ueCxpPXRbMF0ueSxvPVtzLGldLGM9W10sbT10WzBdLnQ7Zm9yKDthPHQubGVuZ3RoOyl7Y29uc3QgcD10W2FdLHk9cC54LXMsTz1wLnktaSx4PXAueix2PWU/dGhpcy5jb21wdXRSYWRpdXMoeCxlKTp4O2lmKGMucHVzaCh7cG9pbnQ6bmV3IE10KHksTyx4LHRbYV0udikscmFkaXVzOnZ9KSxhPjAmJmE8dC5sZW5ndGgtMSl7Y29uc3QgVD10W2FdLmdldEFuZ2xlQnlQb2ludHModFthLTFdLHRbYSsxXSk7aWYoVDw5MHx8VD4yNzApe2NvbnN0IGw9KHU9Yy5wb3AoKSk9PW51bGw/dm9pZCAwOnUucG9pbnQuY2xvbmUoKTtsJiZuLnB1c2goe3Rhc2tJZDptLHBvczpvLHBvaW50czpbLi4uYyx7cG9pbnQ6bCxyYWRpdXM6dn1dfSkscz10W2FdLngsaT10W2FdLnksbz1bcyxpXTtjb25zdCBoPXAueC1zLGY9cC55LWk7Yz1be3BvaW50Om5ldyBNdChoLGYseCkscmFkaXVzOnZ9XSxtPURhdGUubm93KCl9fWErK31yZXR1cm4gbi5wdXNoKHt0YXNrSWQ6bSxwb3M6byxwb2ludHM6Y30pLG59dXBkYXRlVGVtcFBvaW50c1dpdGhQcmVzc3VyZSh0LGUsbil7Y29uc3QgYT1EYXRlLm5vdygpLHM9dGhpcy50bXBQb2ludHMubGVuZ3RoO2xldCBpPXM7Zm9yKGxldCBjPTA7Yzx0Lmxlbmd0aDtjKz0yKXtpPU1hdGgubWluKGkscyk7Y29uc3QgbT10aGlzLnRtcFBvaW50cy5sZW5ndGgsdT1uZXcgTXQodFtjXSx0W2MrMV0pO2lmKG09PT0wKXt0aGlzLnRtcFBvaW50cy5wdXNoKHUpO2NvbnRpbnVlfWNvbnN0IHA9bS0xLHk9dGhpcy50bXBQb2ludHNbcF0sTz1ldC5TdWIodSx5KS51bmkoKTtpZih1LmlzTmVhcih5LGUpKXtpZih5Lno8dGhpcy5NQVhfUkVQRUFSKXtpZih5LnNldHooTWF0aC5taW4oeS56KzEsdGhpcy5NQVhfUkVQRUFSKSksaT1NYXRoLm1pbihpLHApLG0+MSl7bGV0IFQ9bS0xO2Zvcig7VD4wOyl7Y29uc3QgbD10aGlzLnRtcFBvaW50c1tUXS5kaXN0YW5jZSh0aGlzLnRtcFBvaW50c1tULTFdKSxoPU1hdGgubWF4KHRoaXMudG1wUG9pbnRzW1RdLnotdGhpcy51bmlUaGlja25lc3MqbCwwKTtpZih0aGlzLnRtcFBvaW50c1tULTFdLno+PWgpYnJlYWs7dGhpcy50bXBQb2ludHNbVC0xXS5zZXR6KGgpLGk9TWF0aC5taW4oaSxULTEpLFQtLX19fWVsc2UgaT0xLzA7Y29udGludWV9dS5zZXR2KE8pO2NvbnN0IHg9dS5kaXN0YW5jZSh5KSx2PU1hdGgubWF4KHkuei10aGlzLnVuaVRoaWNrbmVzcyp4LDApO20+MSYmZXQuRXF1YWxzKE8seS52LC4wMikmJih2PjB8fHkuejw9MCkmJihuJiZ5LnQmJm4uYWRkKHkudCksdGhpcy50bXBQb2ludHMucG9wKCksaT1NYXRoLm1pbihwLGkpKSx1LnNldHoodiksdGhpcy50bXBQb2ludHMucHVzaCh1KX1pZihpPT09MS8wKXJldHVybiB0aGlzLnRtcFBvaW50cy5sZW5ndGg7bGV0IG89cztpZihpPT09cyl7bz1NYXRoLm1heChvLTEsMCk7Y29uc3QgYz10aGlzLnRtcFBvaW50c1tvXS50O2MmJihuPT1udWxsfHxuLmFkZChjKSl9ZWxzZXtsZXQgYz1zLTE7Zm9yKG89aTtjPj0wOyl7Y29uc3QgbT10aGlzLnRtcFBvaW50c1tjXS50O2lmKG0mJihuPT1udWxsfHxuLmFkZChtKSxjPD1pKSl7bz1jLGM9LTE7YnJlYWt9Yy0tfX1yZXR1cm4gdGhpcy50bXBQb2ludHNbb10uc2V0VChhKSxvfXVwZGF0ZVRlbXBQb2ludHModCxlLG4pe3ZhciBjO2NvbnN0IGE9RGF0ZS5ub3coKSxzPXRoaXMudG1wUG9pbnRzLmxlbmd0aDtsZXQgaT1zO2ZvcihsZXQgbT0wO208dC5sZW5ndGg7bSs9Mil7Y29uc3QgdT10aGlzLnRtcFBvaW50cy5sZW5ndGgscD1uZXcgTXQodFttXSx0W20rMV0pO2lmKHU9PT0wKXt0aGlzLnRtcFBvaW50cy5wdXNoKHApO2NvbnRpbnVlfWNvbnN0IHk9dS0xLE89dGhpcy50bXBQb2ludHNbeV0seD1ldC5TdWIocCxPKS51bmkoKTtpZihwLmlzTmVhcihPLGUvMikpe2k9TWF0aC5taW4oeSxpKTtjb250aW51ZX1ldC5FcXVhbHMoeCxPLnYsLjAyKSYmKG4mJk8udCYmbi5hZGQoTy50KSx0aGlzLnRtcFBvaW50cy5wb3AoKSxpPU1hdGgubWluKHksaSkpLHAuc2V0dih4KSx0aGlzLnRtcFBvaW50cy5wdXNoKHApfWxldCBvPXM7aWYoaT09PXMpe289TWF0aC5tYXgoby0xLDApO2NvbnN0IG09dGhpcy50bXBQb2ludHNbb10udDttJiYobj09bnVsbHx8bi5hZGQobSkpfWVsc2V7bGV0IG09TWF0aC5taW4ocy0xLGkpO2ZvcihvPWk7bT49MDspe2NvbnN0IHU9KGM9dGhpcy50bXBQb2ludHNbbV0pPT1udWxsP3ZvaWQgMDpjLnQ7aWYodSYmKG49PW51bGx8fG4uYWRkKHUpLG08PWkpKXtvPW0sbT0tMTticmVha31tLS19fXJldHVybiB0aGlzLnRtcFBvaW50c1tvXS5zZXRUKGEpLG99dXBkYXRlVGVtcFBvaW50c1dpdGhQcmVzc3VyZVdoZW5Eb25lKHQpe2NvbnN0e3RoaWNrbmVzczplfT10aGlzLndvcmtPcHRpb25zLG49dC5sZW5ndGgsYT10aGlzLmdldE1pblooZSk7Zm9yKGxldCBzPTA7czxuO3MrPTIpe2NvbnN0IGk9dGhpcy50bXBQb2ludHMubGVuZ3RoLG89bmV3IE10KHRbc10sdFtzKzFdKTtpZihpPT09MCl7dGhpcy50bXBQb2ludHMucHVzaChvKTtjb250aW51ZX1jb25zdCBjPWktMSxtPXRoaXMudG1wUG9pbnRzW2NdLHU9ZXQuU3ViKG8sbSkudW5pKCkscD1vLmRpc3RhbmNlKG0pO2lmKGk+MSYmbS56PT09YSlicmVhaztpZihvLmlzTmVhcihtLGUvMikpe2lmKG48MyYmbS56PHRoaXMuTUFYX1JFUEVBUiYmKG0uc2V0eihNYXRoLm1pbihtLnorMSx0aGlzLk1BWF9SRVBFQVIpKSxpPjEpKXtsZXQgTz1pLTE7Zm9yKDtPPjA7KXtjb25zdCB4PXRoaXMudG1wUG9pbnRzW09dLmRpc3RhbmNlKHRoaXMudG1wUG9pbnRzW08tMV0pLHY9TWF0aC5tYXgodGhpcy50bXBQb2ludHNbT10uei10aGlzLnVuaVRoaWNrbmVzcyp4LC1lLzQpO2lmKHRoaXMudG1wUG9pbnRzW08tMV0uej49dilicmVhazt0aGlzLnRtcFBvaW50c1tPLTFdLnNldHoodiksTy0tfX1jb250aW51ZX1vLnNldHYodSk7Y29uc3QgeT1NYXRoLm1heChtLnotdGhpcy51bmlUaGlja25lc3MqcCxhKTtpPjEmJmV0LkVxdWFscyh1LG0udiwuMDIpJiZtLno8PTAmJnRoaXMudG1wUG9pbnRzLnBvcCgpLG8uc2V0eih5KSx0aGlzLnRtcFBvaW50cy5wdXNoKG8pfX1zdGF0aWMgdXBkYXRlTm9kZU9wdCh0KXt2YXIgbztjb25zdHtub2RlOmUsb3B0Om4sdk5vZGVzOmF9PXQse3N0cm9rZUNvbG9yOnN9PW4saT1hLmdldChlLm5hbWUpO3JldHVybiBzJiYoZS50YWdOYW1lPT09IkdST1VQIj9IZShlKT9lLnNldEF0dHJpYnV0ZSgiYmdjb2xvciIscyk6ZS5jaGlsZHJlbi5mb3JFYWNoKGM9PntjLnNldEF0dHJpYnV0ZSgic3Ryb2tlQ29sb3IiLHMpLGMuZ2V0QXR0cmlidXRlKCJmaWxsQ29sb3IiKSYmYy5zZXRBdHRyaWJ1dGUoImZpbGxDb2xvciIscyl9KTooZS5zZXRBdHRyaWJ1dGUoInN0cm9rZUNvbG9yIixzKSxlLnNldEF0dHJpYnV0ZSgiZmlsbENvbG9yIixzKSksKG89aT09bnVsbD92b2lkIDA6aS5vcHQpIT1udWxsJiZvLnN0cm9rZUNvbG9yJiYoaS5vcHQuc3Ryb2tlQ29sb3I9cykpLGkmJmEuc2V0SW5mbyhlLm5hbWUsaSkseXQudXBkYXRlTm9kZU9wdCh0KX19Y2xhc3MgT24gZXh0ZW5kcyB5dHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KTtzdCh0aGlzLCJ0b29sc1R5cGUiLGd0Lkxhc2VyUGVuKTtzdCh0aGlzLCJjYW5Sb3RhdGUiLCExKTtzdCh0aGlzLCJzY2FsZVR5cGUiLEZ0Lm5vbmUpO3N0KHRoaXMsInN5bmNUaW1lc3RhbXAiKTtzdCh0aGlzLCJzeW5jSW5kZXgiLDApO3N0KHRoaXMsInRtcFBvaW50cyIsW10pO3N0KHRoaXMsIndvcmtPcHRpb25zIik7c3QodGhpcywiY29uc3VtZUluZGV4IiwwKTt0aGlzLndvcmtPcHRpb25zPXQudG9vbHNPcHQsdGhpcy5zeW5jVGltZXN0YW1wPTB9Y29tYmluZUNvbnN1bWUoKXt9c2V0V29ya09wdGlvbnModCl7c3VwZXIuc2V0V29ya09wdGlvbnModCksdGhpcy5zeW5jVGltZXN0YW1wPURhdGUubm93KCl9Y29uc3VtZSh0KXtjb25zdHtkYXRhOmUsaXNTdWJXb3JrZXI6bn09dCx7d29ya0lkOmEsb3A6c309ZTtpZigocz09bnVsbD92b2lkIDA6cy5sZW5ndGgpPT09MClyZXR1cm57dHlwZTpsdC5Ob25lfTtpZih0aGlzLnVwZGF0ZVRlbXBQb2ludHMoc3x8W10pLHRoaXMuY29uc3VtZUluZGV4PnRoaXMudG1wUG9pbnRzLmxlbmd0aC00KXJldHVybnt0eXBlOmx0Lk5vbmV9O2NvbnN0e3N0cm9rZUNvbG9yOmksdGhpY2tuZXNzOm8sc3Ryb2tlVHlwZTpjfT10aGlzLndvcmtPcHRpb25zLG09QnQodGhpcy50bXBQb2ludHMsbyk7bGV0IHU9ITE7Y29uc3QgcD10aGlzLnN5bmNJbmRleCx5PXRoaXMudG1wUG9pbnRzLnNsaWNlKHRoaXMuY29uc3VtZUluZGV4KTt0aGlzLmNvbnN1bWVJbmRleD10aGlzLnRtcFBvaW50cy5sZW5ndGgtMSx0aGlzLnN5bmNUaW1lc3RhbXA9PT0wJiYodGhpcy5zeW5jVGltZXN0YW1wPURhdGUubm93KCkpO2NvbnN0IE89e25hbWU6YT09bnVsbD92b2lkIDA6YS50b1N0cmluZygpLG9wYWNpdHk6MSxsaW5lRGFzaDpjPT09S3QuRG90dGVkP1sxLG8qMl06Yz09PUt0LkxvbmdEb3R0ZWQ/W28sbyoyXTp2b2lkIDAsc3Ryb2tlQ29sb3I6aSxsaW5lQ2FwOiJyb3VuZCIsbGluZVdpZHRoOm8sYW5jaG9yOlsuNSwuNV19LHg9dGhpcy5nZXRUYXNrUG9pbnRzKHkpO2lmKHgubGVuZ3RoKXtjb25zdCBUPURhdGUubm93KCk7VC10aGlzLnN5bmNUaW1lc3RhbXA+dGhpcy5zeW5jVW5pdFRpbWUmJih1PSEwLHRoaXMuc3luY1RpbWVzdGFtcD1ULHRoaXMuc3luY0luZGV4PXRoaXMudG1wUG9pbnRzLmxlbmd0aCksbiYmdGhpcy5kcmF3KHthdHRyczpPLHRhc2tzOngsaXNEb3Q6ITEsbGF5ZXI6dGhpcy5kcmF3TGF5ZXJ8fHRoaXMuZnVsbExheWVyfSl9Y29uc3Qgdj1bXTtyZXR1cm4gdGhpcy50bXBQb2ludHMuc2xpY2UocCkuZm9yRWFjaChUPT57di5wdXNoKFQueCxULnkpfSkse3JlY3Q6e3g6bS54KnRoaXMuZnVsbExheWVyLndvcmxkU2NhbGluZ1swXSt0aGlzLmZ1bGxMYXllci53b3JsZFBvc2l0aW9uWzBdLHk6bS55KnRoaXMuZnVsbExheWVyLndvcmxkU2NhbGluZ1sxXSt0aGlzLmZ1bGxMYXllci53b3JsZFBvc2l0aW9uWzFdLHc6bS53KnRoaXMuZnVsbExheWVyLndvcmxkU2NhbGluZ1swXSxoOm0uaCp0aGlzLmZ1bGxMYXllci53b3JsZFNjYWxpbmdbMV19LHR5cGU6bHQuRHJhd1dvcmssZGF0YVR5cGU6VHQuTG9jYWwsd29ya0lkOnU/YTp2b2lkIDAsb3A6dT92OnZvaWQgMCxpbmRleDp1P3AqMjp2b2lkIDB9fWNvbnN1bWVBbGwoKXt2YXIgYTtjb25zdCB0PShhPXRoaXMud29ya0lkKT09bnVsbD92b2lkIDA6YS50b1N0cmluZygpO2xldCBlO2lmKHRoaXMudG1wUG9pbnRzLmxlbmd0aC0xPnRoaXMuY29uc3VtZUluZGV4KXtsZXQgcz10aGlzLnRtcFBvaW50cy5zbGljZSh0aGlzLmNvbnN1bWVJbmRleCk7Y29uc3QgaT1zLmxlbmd0aD09PTEse3N0cm9rZUNvbG9yOm8sdGhpY2tuZXNzOmMsc3Ryb2tlVHlwZTptfT10aGlzLndvcmtPcHRpb25zO2lmKGkpe2NvbnN0IHk9dGhpcy5jb21wdXREb3RTdHJva2Uoe3BvaW50OnNbMF0scmFkaXVzOmMvMn0pO3M9eS5wcyxlPXkucmVjdH1lbHNlIGU9QnQodGhpcy50bXBQb2ludHMsYyk7Y29uc3QgdT17bmFtZTp0PT1udWxsP3ZvaWQgMDp0LnRvU3RyaW5nKCksZmlsbENvbG9yOmk/bzp2b2lkIDAsb3BhY2l0eToxLGxpbmVEYXNoOm09PT1LdC5Eb3R0ZWQmJiFpP1sxLGMqMl06bT09PUt0LkxvbmdEb3R0ZWQmJiFpP1tjLGMqMl06dm9pZCAwLHN0cm9rZUNvbG9yOm8sbGluZUNhcDppP3ZvaWQgMDoicm91bmQiLGxpbmVXaWR0aDppPzA6YyxhbmNob3I6Wy41LC41XX0scD10aGlzLmdldFRhc2tQb2ludHMocyk7cC5sZW5ndGgmJnRoaXMuZHJhdyh7YXR0cnM6dSx0YXNrczpwLGlzRG90OmksbGF5ZXI6dGhpcy5kcmF3TGF5ZXJ8fHRoaXMuZnVsbExheWVyfSl9Y29uc3Qgbj1bXTtyZXR1cm4gdGhpcy50bXBQb2ludHMuc2xpY2UodGhpcy5zeW5jSW5kZXgpLmZvckVhY2gocz0+e24ucHVzaChzLngscy55KX0pLHtyZWN0OmUmJnt4OmUueCp0aGlzLmZ1bGxMYXllci53b3JsZFNjYWxpbmdbMF0rdGhpcy5mdWxsTGF5ZXIud29ybGRQb3NpdGlvblswXSx5OmUueSp0aGlzLmZ1bGxMYXllci53b3JsZFNjYWxpbmdbMV0rdGhpcy5mdWxsTGF5ZXIud29ybGRQb3NpdGlvblsxXSx3OmUudyp0aGlzLmZ1bGxMYXllci53b3JsZFNjYWxpbmdbMF0saDplLmgqdGhpcy5mdWxsTGF5ZXIud29ybGRTY2FsaW5nWzFdfSx0eXBlOmx0LkRyYXdXb3JrLGRhdGFUeXBlOlR0LkxvY2FsLHdvcmtJZDp0LG9wOm4saW5kZXg6dGhpcy5zeW5jSW5kZXgqMn19Y2xlYXJUbXBQb2ludHMoKXt0aGlzLnRtcFBvaW50cy5sZW5ndGg9MCx0aGlzLnN5bmNUaW1lc3RhbXA9MCx0aGlzLnN5bmNJbmRleD0wfWNvbnN1bWVTZXJ2aWNlKHQpe3ZhciB4O2NvbnN0e29wOmUscmVwbGFjZUlkOm4saXNGdWxsV29yazphfT10LHtzdHJva2VDb2xvcjpzLHRoaWNrbmVzczppLHN0cm9rZVR5cGU6b309dGhpcy53b3JrT3B0aW9ucztpZighZS5sZW5ndGgpe2NvbnN0IHY9QnQodGhpcy50bXBQb2ludHMsaSk7cmV0dXJue3g6di54KnRoaXMuZnVsbExheWVyLndvcmxkU2NhbGluZ1swXSt0aGlzLmZ1bGxMYXllci53b3JsZFBvc2l0aW9uWzBdLHk6di55KnRoaXMuZnVsbExheWVyLndvcmxkU2NhbGluZ1sxXSt0aGlzLmZ1bGxMYXllci53b3JsZFBvc2l0aW9uWzFdLHc6di53KnRoaXMuZnVsbExheWVyLndvcmxkU2NhbGluZ1swXSxoOnYuaCp0aGlzLmZ1bGxMYXllci53b3JsZFNjYWxpbmdbMV19fWNvbnN0IGM9TWF0aC5tYXgoMCx0aGlzLnRtcFBvaW50cy5sZW5ndGgtMSk7dGhpcy51cGRhdGVUZW1wUG9pbnRzKGV8fFtdKTtsZXQgbSx1PXRoaXMudG1wUG9pbnRzLnNsaWNlKGMpO2NvbnN0IHA9dS5sZW5ndGg9PT0xO2lmKHApe2NvbnN0IHY9dGhpcy5jb21wdXREb3RTdHJva2Uoe3BvaW50OnVbMF0scmFkaXVzOmkvMn0pO3U9di5wcyxtPXYucmVjdH1lbHNlIG09QnQodGhpcy50bXBQb2ludHMsaSk7Y29uc3QgeT17bmFtZTooeD10aGlzLndvcmtJZCk9PW51bGw/dm9pZCAwOngudG9TdHJpbmcoKSxmaWxsQ29sb3I6cD9zOnZvaWQgMCxvcGFjaXR5OjEsbGluZURhc2g6bz09PUt0LkRvdHRlZCYmIXA/WzEsaSoyXTpvPT09S3QuTG9uZ0RvdHRlZCYmIXA/W2ksaSoyXTp2b2lkIDAsc3Ryb2tlQ29sb3I6cyxsaW5lQ2FwOnA/dm9pZCAwOiJyb3VuZCIsbGluZVdpZHRoOnA/MDppLGFuY2hvcjpbLjUsLjVdfSxPPXRoaXMuZ2V0VGFza1BvaW50cyh1KTtpZihPLmxlbmd0aCl7Y29uc3Qgdj1hP3RoaXMuZnVsbExheWVyOnRoaXMuZHJhd0xheWVyfHx0aGlzLmZ1bGxMYXllcjt0aGlzLmRyYXcoe2F0dHJzOnksdGFza3M6Tyxpc0RvdDpwLHJlcGxhY2VJZDpuLGxheWVyOnZ9KX1yZXR1cm57eDptLngqdGhpcy5mdWxsTGF5ZXIud29ybGRTY2FsaW5nWzBdK3RoaXMuZnVsbExheWVyLndvcmxkUG9zaXRpb25bMF0seTptLnkqdGhpcy5mdWxsTGF5ZXIud29ybGRTY2FsaW5nWzFdK3RoaXMuZnVsbExheWVyLndvcmxkUG9zaXRpb25bMV0sdzptLncqdGhpcy5mdWxsTGF5ZXIud29ybGRTY2FsaW5nWzBdLGg6bS5oKnRoaXMuZnVsbExheWVyLndvcmxkU2NhbGluZ1sxXX19Y29tcHV0RG90U3Ryb2tlKHQpe2NvbnN0e3BvaW50OmUscmFkaXVzOm59PXQsYT17eDplLngtbix5OmUueS1uLHc6bioyLGg6bioyfTtyZXR1cm57cHM6TXQuR2V0RG90U3Ryb2tlKGUsbiw4KSxyZWN0OmF9fXVwZGF0ZVRlbXBQb2ludHModCl7Y29uc3QgZT10aGlzLnRtcFBvaW50cy5sZW5ndGg7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKz0yKXtpZihlKXtjb25zdCBhPXRoaXMudG1wUG9pbnRzLnNsaWNlKC0xKVswXTthJiZhLng9PT10W25dJiZhLnk9PT10W24rMV0mJnRoaXMudG1wUG9pbnRzLnBvcCgpfXRoaXMudG1wUG9pbnRzLnB1c2gobmV3IE10KHRbbl0sdFtuKzFdKSl9fWFzeW5jIGRyYXcodCl7Y29uc3R7YXR0cnM6ZSx0YXNrczpuLGlzRG90OmEsbGF5ZXI6c309dCx7ZHVyYXRpb246aX09dGhpcy53b3JrT3B0aW9ucztmb3IoY29uc3QgbyBvZiBuKXtjb25zdCBjPW5ldyBoZSx7cG9zOm0scG9pbnRzOnV9PW87bGV0IHA7YT9wPU9lKHUsITApOnA9T2UodSwhMSksYy5hdHRyKHsuLi5lLHBvczptLGQ6cH0pO2NvbnN0e3ZlcnRleDp5LGZyYWdtZW50Ok99PXRoaXMud29ya09wdGlvbnM7aWYoeSYmTyl7Y29uc3QgeD1zLnJlbmRlcmVyLmNyZWF0ZVByb2dyYW0oe3ZlcnRleDp5LGZyYWdtZW50Ok99KSx7d2lkdGg6dixoZWlnaHQ6VH09cy5nZXRSZXNvbHV0aW9uKCk7Yy5zZXRVbmlmb3Jtcyh7dV90aW1lOjAsdV9yZXNvbHV0aW9uOlt2LFRdfSksYy5zZXRQcm9ncmFtKHgpfXMuYXBwZW5kQ2hpbGQoYyksYy50cmFuc2l0aW9uKGkpLmF0dHIoe3NjYWxlOmE/Wy4xLC4xXTpbMSwxXSxsaW5lV2lkdGg6YT8wOjF9KS50aGVuKCgpPT57Yy5yZW1vdmUoKX0pfX1nZXRUYXNrUG9pbnRzKHQpe3ZhciBjO2NvbnN0IGU9W107aWYodC5sZW5ndGg9PT0wKXJldHVybltdO2xldCBuPTAsYT10WzBdLngscz10WzBdLnksaT1bYSxzXSxvPVtdO2Zvcig7bjx0Lmxlbmd0aDspe2NvbnN0IG09dFtuXSx1PW0ueC1hLHA9bS55LXM7aWYoby5wdXNoKG5ldyBNdCh1LHApKSxuPjAmJm48dC5sZW5ndGgtMSl7Y29uc3QgeT10W25dLmdldEFuZ2xlQnlQb2ludHModFtuLTFdLHRbbisxXSk7aWYoeTw5MHx8eT4yNzApe2NvbnN0IE89KGM9by5wb3AoKSk9PW51bGw/dm9pZCAwOmMuY2xvbmUoKTtPJiZlLnB1c2goe3BvczppLHBvaW50czpbLi4ubyxPXX0pLGE9dFtuXS54LHM9dFtuXS55LGk9W2Esc107Y29uc3QgeD1tLngtYSx2PW0ueS1zO289W25ldyBNdCh4LHYpXX19bisrfXJldHVybiBlLnB1c2goe3BvczppLHBvaW50czpvfSksZX1yZW1vdmVMb2NhbCgpe31yZW1vdmVTZXJ2aWNlKHQpe2xldCBlO2NvbnN0IG49W107cmV0dXJuIHRoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKHQpLmZvckVhY2goYT0+e2lmKGEubmFtZT09PXQpe2NvbnN0IHM9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtlPU90KGUse3g6cy54LHk6cy55LHc6cy53aWR0aCxoOnMuaGVpZ2h0fSksbi5wdXNoKGEpfX0pLG4ubGVuZ3RoJiZuLmZvckVhY2goYT0+YS5yZW1vdmUoKSksZX19dmFyIEdoPVllO1llLnBvbHlsaW5lPVllLFllLnBvbHlnb249SGg7ZnVuY3Rpb24gWWUoZCxyLHQpe3ZhciBlPWQubGVuZ3RoLG49RWUoZFswXSxyKSxhPVtdLHMsaSxvLGMsbTtmb3IodHx8KHQ9W10pLHM9MTtzPGU7cysrKXtmb3IoaT1kW3MtMV0sbz1kW3NdLGM9bT1FZShvLHIpOzspaWYobnxjKXtpZihuJmMpYnJlYWs7bj8oaT1ncihpLG8sbixyKSxuPUVlKGkscikpOihvPWdyKGksbyxjLHIpLGM9RWUobyxyKSl9ZWxzZXthLnB1c2goaSksYyE9PW0/KGEucHVzaChvKSxzPGUtMSYmKHQucHVzaChhKSxhPVtdKSk6cz09PWUtMSYmYS5wdXNoKG8pO2JyZWFrfW49bX1yZXR1cm4gYS5sZW5ndGgmJnQucHVzaChhKSx0fWZ1bmN0aW9uIEhoKGQscil7dmFyIHQsZSxuLGEscyxpLG87Zm9yKGU9MTtlPD04O2UqPTIpe2Zvcih0PVtdLG49ZFtkLmxlbmd0aC0xXSxhPSEoRWUobixyKSZlKSxzPTA7czxkLmxlbmd0aDtzKyspaT1kW3NdLG89IShFZShpLHIpJmUpLG8hPT1hJiZ0LnB1c2goZ3IobixpLGUscikpLG8mJnQucHVzaChpKSxuPWksYT1vO2lmKGQ9dCwhZC5sZW5ndGgpYnJlYWt9cmV0dXJuIHR9ZnVuY3Rpb24gZ3IoZCxyLHQsZSl7cmV0dXJuIHQmOD9bZFswXSsoclswXS1kWzBdKSooZVszXS1kWzFdKS8oclsxXS1kWzFdKSxlWzNdXTp0JjQ/W2RbMF0rKHJbMF0tZFswXSkqKGVbMV0tZFsxXSkvKHJbMV0tZFsxXSksZVsxXV06dCYyP1tlWzJdLGRbMV0rKHJbMV0tZFsxXSkqKGVbMl0tZFswXSkvKHJbMF0tZFswXSldOnQmMT9bZVswXSxkWzFdKyhyWzFdLWRbMV0pKihlWzBdLWRbMF0pLyhyWzBdLWRbMF0pXTpudWxsfWZ1bmN0aW9uIEVlKGQscil7dmFyIHQ9MDtyZXR1cm4gZFswXTxyWzBdP3R8PTE6ZFswXT5yWzJdJiYodHw9MiksZFsxXTxyWzFdP3R8PTQ6ZFsxXT5yWzNdJiYodHw9OCksdH12YXIgS2g9WHQoR2gpO2NvbnN0IFBlPWNsYXNzIFBlIGV4dGVuZHMgeXR7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0KTtzdCh0aGlzLCJjYW5Sb3RhdGUiLCExKTtzdCh0aGlzLCJzY2FsZVR5cGUiLEZ0Lm5vbmUpO3N0KHRoaXMsInRvb2xzVHlwZSIsZ3QuRXJhc2VyKTtzdCh0aGlzLCJzZXJ2aWNlV29yayIpO3N0KHRoaXMsInRtcFBvaW50cyIsW10pO3N0KHRoaXMsIndvcmtPcHRpb25zIik7c3QodGhpcywid29ybGRQb3NpdGlvbiIpO3N0KHRoaXMsIndvcmxkU2NhbGluZyIpO3N0KHRoaXMsImVyYXNlclJlY3QiKTtzdCh0aGlzLCJlcmFzZXJQb2x5bGluZSIpO3RoaXMuc2VydmljZVdvcms9ZSx0aGlzLndvcmtPcHRpb25zPXQudG9vbHNPcHQsdGhpcy53b3JsZFBvc2l0aW9uPXRoaXMuZnVsbExheWVyLndvcmxkUG9zaXRpb24sdGhpcy53b3JsZFNjYWxpbmc9dGhpcy5mdWxsTGF5ZXIud29ybGRTY2FsaW5nfWNvbWJpbmVDb25zdW1lKCl7fWNvbnN1bWVTZXJ2aWNlKCl7fXNldFdvcmtPcHRpb25zKHQpe3N1cGVyLnNldFdvcmtPcHRpb25zKHQpfWNyZWF0ZUVyYXNlclJlY3QodCl7Y29uc3QgZT10WzBdKnRoaXMud29ybGRTY2FsaW5nWzBdK3RoaXMud29ybGRQb3NpdGlvblswXSxuPXRbMV0qdGhpcy53b3JsZFNjYWxpbmdbMV0rdGhpcy53b3JsZFBvc2l0aW9uWzFdLHt3aWR0aDphLGhlaWdodDpzfT1QZS5lcmFzZXJTaXplc1t0aGlzLndvcmtPcHRpb25zLnRoaWNrbmVzc107dGhpcy5lcmFzZXJSZWN0PXt4OmUtYSouNSx5Om4tcyouNSx3OmEsaDpzfSx0aGlzLmVyYXNlclBvbHlsaW5lPVt0aGlzLmVyYXNlclJlY3QueCx0aGlzLmVyYXNlclJlY3QueSx0aGlzLmVyYXNlclJlY3QueCt0aGlzLmVyYXNlclJlY3Qudyx0aGlzLmVyYXNlclJlY3QueSt0aGlzLmVyYXNlclJlY3QuaF19Y29tcHV0UmVjdENlbnRlclBvaW50cygpe2NvbnN0IHQ9dGhpcy50bXBQb2ludHMuc2xpY2UoLTIpO2lmKHRoaXMudG1wUG9pbnRzLmxlbmd0aD09PTQpe2NvbnN0IGU9bmV3IGV0KHRoaXMudG1wUG9pbnRzWzBdLHRoaXMudG1wUG9pbnRzWzFdKSxuPW5ldyBldCh0aGlzLnRtcFBvaW50c1syXSx0aGlzLnRtcFBvaW50c1szXSksYT1ldC5TdWIobixlKS51bmkoKSxzPWV0LkRpc3QoZSxuKSx7d2lkdGg6aSxoZWlnaHQ6b309UGUuZXJhc2VyU2l6ZXNbdGhpcy53b3JrT3B0aW9ucy50aGlja25lc3NdLGM9TWF0aC5taW4oaSxvKSxtPU1hdGgucm91bmQocy9jKTtpZihtPjEpe2NvbnN0IHU9W107Zm9yKGxldCBwPTA7cDxtO3ArKyl7Y29uc3QgeT1ldC5NdWwoYSxwKmMpO3UucHVzaCh0aGlzLnRtcFBvaW50c1swXSt5LngsdGhpcy50bXBQb2ludHNbMV0reS55KX1yZXR1cm4gdS5jb25jYXQodCl9fXJldHVybiB0fWlzTmVhcih0LGUpe2NvbnN0IG49bmV3IGV0KHRbMF0sdFsxXSksYT1uZXcgZXQoZVswXSxlWzFdKSx7d2lkdGg6cyxoZWlnaHQ6aX09UGUuZXJhc2VyU2l6ZXNbdGhpcy53b3JrT3B0aW9ucy50aGlja25lc3NdO3JldHVybiBldC5EaXN0KG4sYSk8TWF0aC5oeXBvdChzLGkpKi41fWN1dFBvbHlsaW5lKHQsZSl7bGV0IG49W2VdLGE9MDtmb3IoO2E8dC5sZW5ndGg7KXtjb25zdCBvPXRbYV07aWYoby5sZW5ndGg8MilicmVhaztuPXMobixvKSxhKyt9cmV0dXJuIG47ZnVuY3Rpb24gcyhvLGMpe2NvbnN0IG09bztmb3IobGV0IHU9MDt1PG8ubGVuZ3RoO3UrKyl7Y29uc3QgcD1vW3VdLHk9cC5maW5kSW5kZXgoKE8seCk9Png8cC5sZW5ndGgtMT9pKFtPLHBbeCsxXV0sW2NbMF0sY1sxXV0pOiExKTtpZih5IT09LTEmJnk+LTEpe2NvbnN0IE89W10seD1wLnNsaWNlKDAseSsxKTtpZihldC5FcXVhbHMocFt5XSxjWzBdKXx8eC5wdXNoKGNbMF0uY2xvbmUoKS5zZXR6KHBbeV0ueikpLHgubGVuZ3RoPjEmJk8ucHVzaCh4KSx5K2MubGVuZ3RoLTE8cC5sZW5ndGgtMSl7Y29uc3Qgdj15K2MubGVuZ3RoLTEsVD1wLnNsaWNlKHYpLGw9Y1tjLmxlbmd0aC0xXTtldC5FcXVhbHMocFt2XSxsKXx8VC51bnNoaWZ0KGwuY2xvbmUoKS5zZXR6KHBbdl0ueikpLFQubGVuZ3RoPjEmJk8ucHVzaChUKX1yZXR1cm4gbS5zcGxpY2UodSwxLC4uLk8pLG19fXJldHVybiBtfWZ1bmN0aW9uIGkobyxjKXtjb25zdCBtPWV0LlN1YihvWzFdLG9bMF0pLHU9ZXQuU3ViKGNbMV0sY1swXSkscD1ldC5TdWIoY1swXSxvWzBdKTtyZXR1cm4gTWF0aC5hYnMoZXQuQ3ByKG0sdSkpPC4xJiZNYXRoLmFicyhldC5DcHIobSxwKSk8LjF9fWlzU2FtZVBvaW50KHQsZSl7cmV0dXJuIHRbMF09PT1lWzBdJiZ0WzFdPT09ZVsxXX10cmFuc2xhdGVJbnRlcnNlY3QodCl7Y29uc3QgZT1bXTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7Y29uc3QgYT10W25dLmZpbHRlcigobyxjLG0pPT4hKGM+MCYmdGhpcy5pc1NhbWVQb2ludChvLG1bYy0xXSkpKSxzPVtdO2xldCBpPTA7Zm9yKDtpPGEubGVuZ3RoOyl7Y29uc3Qgbz1hW2ldLGM9bmV3IGV0KG9bMF0sb1sxXSk7cy5wdXNoKGMpLGkrK31lLnB1c2gocyl9cmV0dXJuIGV9aXNMaW5lRXJhc2VyKHQsZSl7cmV0dXJuISh0PT09Z3QuUGVuY2lsJiYhZSl9cmVtb3ZlKHQpe2NvbnN0e2N1ck5vZGVNYXA6ZSxyZW1vdmVJZHM6bixuZXdXb3JrRGF0YXM6YX09dCx7aXNMaW5lOnN9PXRoaXMud29ya09wdGlvbnM7bGV0IGk7Zm9yKGNvbnN0W28sY11vZiBlLmVudHJpZXMoKSlpZihjLnJlY3QmJnRoaXMuZXJhc2VyUmVjdCYmdGhpcy5lcmFzZXJQb2x5bGluZSYmeGUodGhpcy5lcmFzZXJSZWN0LGMucmVjdCkpe2NvbnN0e29wOm0sdG9vbHNUeXBlOnV9PWMscD10aGlzLmlzTGluZUVyYXNlcih1LHMpLHk9W10sTz1bXTtmb3IobGV0IHY9MDt2PG0ubGVuZ3RoO3YrPTMpe2NvbnN0IFQ9bmV3IGV0KG1bdl0qdGhpcy53b3JsZFNjYWxpbmdbMF0rdGhpcy53b3JsZFBvc2l0aW9uWzBdLG1bdisxXSp0aGlzLndvcmxkU2NhbGluZ1sxXSt0aGlzLndvcmxkUG9zaXRpb25bMV0sbVt2KzJdKTtPLnB1c2goVCkseS5wdXNoKG5ldyBNdChULngsVC55KSl9Y29uc3QgeD15Lmxlbmd0aCYmQnQoeSl8fGMucmVjdDtpZih4ZSh4LHRoaXMuZXJhc2VyUmVjdCkpe2lmKE8ubGVuZ3RoPjEpe2NvbnN0IHY9S2gucG9seWxpbmUoTy5tYXAoVD0+VC5YWSksdGhpcy5lcmFzZXJQb2x5bGluZSk7aWYodi5sZW5ndGgmJihuLmFkZChjLm5hbWUpLCFwKSl7Y29uc3QgVD10aGlzLnRyYW5zbGF0ZUludGVyc2VjdCh2KSxsPXRoaXMuY3V0UG9seWxpbmUoVCxPKTtmb3IobGV0IGg9MDtoPGwubGVuZ3RoO2grKyl7Y29uc3QgZj1gJHtvfV9zXyR7aH1gLGc9W107bFtoXS5mb3JFYWNoKE09PntnLnB1c2goKE0ueC10aGlzLndvcmxkUG9zaXRpb25bMF0pL3RoaXMud29ybGRTY2FsaW5nWzBdLChNLnktdGhpcy53b3JsZFBvc2l0aW9uWzFdKS90aGlzLndvcmxkU2NhbGluZ1sxXSxNLnopfSksYy5vcHQmJmMudG9vbHNUeXBlJiZ0aGlzLnZOb2RlcyYmKHRoaXMudk5vZGVzLnNldEluZm8oZix7cmVjdDp4LG9wOmcsb3B0OmMub3B0LGNhblJvdGF0ZTpjLmNhblJvdGF0ZSxzY2FsZVR5cGU6Yy5zY2FsZVR5cGUsdG9vbHNUeXBlOmMudG9vbHNUeXBlfSksYS5zZXQoZix7d29ya0lkOmYsb3A6ZyxvcHQ6Yy5vcHQsdG9vbHNUeXBlOmMudG9vbHNUeXBlfSkpfX19ZWxzZSBuLmFkZChjLm5hbWUpO2k9T3QoaSx4KX19cmV0dXJuIG4uZm9yRWFjaChvPT57dmFyIGM7cmV0dXJuKGM9dGhpcy52Tm9kZXMpPT1udWxsP3ZvaWQgMDpjLmRlbGV0ZShvKX0pLGkmJihpLngtPXl0LlNhZmVCb3JkZXJQYWRkaW5nLGkueS09eXQuU2FmZUJvcmRlclBhZGRpbmcsaS53Kz15dC5TYWZlQm9yZGVyUGFkZGluZyoyLGkuaCs9eXQuU2FmZUJvcmRlclBhZGRpbmcqMiksaX1jb25zdW1lKHQpe2NvbnN0e29wOmV9PXQuZGF0YTtpZighZXx8ZS5sZW5ndGg9PT0wKXJldHVybnt0eXBlOmx0Lk5vbmV9O2NvbnN0IG49dGhpcy50bXBQb2ludHMubGVuZ3RoO2lmKG4+MSYmdGhpcy5pc05lYXIoW2VbMF0sZVsxXV0sW3RoaXMudG1wUG9pbnRzW24tMl0sdGhpcy50bXBQb2ludHNbbi0xXV0pKXJldHVybnt0eXBlOmx0Lk5vbmV9O249PT00JiYodGhpcy50bXBQb2ludHMuc2hpZnQoKSx0aGlzLnRtcFBvaW50cy5zaGlmdCgpKSx0aGlzLnRtcFBvaW50cy5wdXNoKGVbMF0sZVsxXSk7Y29uc3QgYT10aGlzLmNvbXB1dFJlY3RDZW50ZXJQb2ludHMoKTtsZXQgcztjb25zdCBpPW5ldyBTZXQsbz1uZXcgTWFwO3RoaXMudk5vZGVzLnNldFRhcmdldCgpO2NvbnN0IGM9dGhpcy5nZXRVbkxvY2tOb2RlTWFwKHRoaXMudk5vZGVzLmdldExhc3RUYXJnZXQoKSk7Zm9yKGxldCBtPTA7bTxhLmxlbmd0aC0xO20rPTIpe3RoaXMuY3JlYXRlRXJhc2VyUmVjdChhLnNsaWNlKG0sbSsyKSk7Y29uc3QgdT10aGlzLnJlbW92ZSh7Y3VyTm9kZU1hcDpjLHJlbW92ZUlkczppLG5ld1dvcmtEYXRhczpvfSk7cz1PdChzLHUpfWlmKHRoaXMudk5vZGVzLmRlbGV0ZUxhc3RUYXJnZXQoKSxzJiZpLnNpemUpe2Zvcihjb25zdCBtIG9mIG8ua2V5cygpKWkuaGFzKG0pJiZvLmRlbGV0ZShtKTtyZXR1cm57dHlwZTpsdC5SZW1vdmVOb2RlLGRhdGFUeXBlOlR0LkxvY2FsLHJlY3Q6cyxyZW1vdmVJZHM6Wy4uLmldLG5ld1dvcmtEYXRhczpvfX1yZXR1cm57dHlwZTpsdC5Ob25lfX1jb25zdW1lQWxsKHQpe3JldHVybiB0aGlzLmNvbnN1bWUodCl9Y2xlYXJUbXBQb2ludHMoKXt0aGlzLnRtcFBvaW50cy5sZW5ndGg9MH1nZXRVbkxvY2tOb2RlTWFwKHQpe3ZhciBlO2lmKHRoaXMuc2VydmljZVdvcmspe2NvbnN0IG49WnQodCksYT10aGlzLnNlcnZpY2VXb3JrLnNlbGVjdG9yV29ya1NoYXBlcyxzPXRoaXMuc2VydmljZVdvcmsud29ya1NoYXBlcztmb3IoY29uc3QgaSBvZiBhLnZhbHVlcygpKWlmKChlPWkuc2VsZWN0SWRzKSE9bnVsbCYmZS5sZW5ndGgpZm9yKGNvbnN0IG8gb2YgaS5zZWxlY3RJZHMpbi5kZWxldGUobyk7Zm9yKGNvbnN0IGkgb2Ygcy5rZXlzKCkpbi5kZWxldGUoaSk7cmV0dXJuIG59cmV0dXJuIHR9fTtzdChQZSwiZXJhc2VyU2l6ZXMiLE9iamVjdC5mcmVlemUoW09iamVjdC5mcmVlemUoe3dpZHRoOjE4LGhlaWdodDoyNn0pLE9iamVjdC5mcmVlemUoe3dpZHRoOjI2LGhlaWdodDozNH0pLE9iamVjdC5mcmVlemUoe3dpZHRoOjM0LGhlaWdodDo1MH0pXSkpO2xldCBhZT1QZTtjb25zdCBWaD0iKysiLFloPSJzZWxlY3RvciIsWGg9ImFsbCI7dmFyIFpoPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjtmdW5jdGlvbiBKaChkKXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5zZXQoZCxaaCksdGhpc312YXIgUWg9Smg7ZnVuY3Rpb24ga2goZCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKGQpfXZhciBxaD1raCxfaD1Mcix0ZD1RaCxlZD1xaDtmdW5jdGlvbiBYZShkKXt2YXIgcj0tMSx0PWQ9PW51bGw/MDpkLmxlbmd0aDtmb3IodGhpcy5fX2RhdGFfXz1uZXcgX2g7KytyPHQ7KXRoaXMuYWRkKGRbcl0pfVhlLnByb3RvdHlwZS5hZGQ9WGUucHJvdG90eXBlLnB1c2g9dGQsWGUucHJvdG90eXBlLmhhcz1lZDt2YXIgcmQ9WGU7ZnVuY3Rpb24gbmQoZCxyKXtmb3IodmFyIHQ9LTEsZT1kPT1udWxsPzA6ZC5sZW5ndGg7Kyt0PGU7KWlmKHIoZFt0XSx0LGQpKXJldHVybiEwO3JldHVybiExfXZhciBpZD1uZDtmdW5jdGlvbiBzZChkLHIpe3JldHVybiBkLmhhcyhyKX12YXIgb2Q9c2QsYWQ9cmQsbGQ9aWQsY2Q9b2QsZmQ9MSx1ZD0yO2Z1bmN0aW9uIGhkKGQscix0LGUsbixhKXt2YXIgcz10JmZkLGk9ZC5sZW5ndGgsbz1yLmxlbmd0aDtpZihpIT1vJiYhKHMmJm8+aSkpcmV0dXJuITE7dmFyIGM9YS5nZXQoZCksbT1hLmdldChyKTtpZihjJiZtKXJldHVybiBjPT1yJiZtPT1kO3ZhciB1PS0xLHA9ITAseT10JnVkP25ldyBhZDp2b2lkIDA7Zm9yKGEuc2V0KGQsciksYS5zZXQocixkKTsrK3U8aTspe3ZhciBPPWRbdV0seD1yW3VdO2lmKGUpdmFyIHY9cz9lKHgsTyx1LHIsZCxhKTplKE8seCx1LGQscixhKTtpZih2IT09dm9pZCAwKXtpZih2KWNvbnRpbnVlO3A9ITE7YnJlYWt9aWYoeSl7aWYoIWxkKHIsZnVuY3Rpb24oVCxsKXtpZighY2QoeSxsKSYmKE89PT1UfHxuKE8sVCx0LGUsYSkpKXJldHVybiB5LnB1c2gobCl9KSl7cD0hMTticmVha319ZWxzZSBpZighKE89PT14fHxuKE8seCx0LGUsYSkpKXtwPSExO2JyZWFrfX1yZXR1cm4gYS5kZWxldGUoZCksYS5kZWxldGUocikscH12YXIgRW49aGQ7ZnVuY3Rpb24gZGQoZCl7dmFyIHI9LTEsdD1BcnJheShkLnNpemUpO3JldHVybiBkLmZvckVhY2goZnVuY3Rpb24oZSxuKXt0Wysrcl09W24sZV19KSx0fXZhciBnZD1kZDtmdW5jdGlvbiBwZChkKXt2YXIgcj0tMSx0PUFycmF5KGQuc2l6ZSk7cmV0dXJuIGQuZm9yRWFjaChmdW5jdGlvbihlKXt0Wysrcl09ZX0pLHR9dmFyIG1kPXBkLFBuPXdlLEFuPW5uLHZkPVFlLHlkPUVuLFNkPWdkLHhkPW1kLFRkPTEsTWQ9MixPZD0iW29iamVjdCBCb29sZWFuXSIsRWQ9IltvYmplY3QgRGF0ZV0iLFBkPSJbb2JqZWN0IEVycm9yXSIsQWQ9IltvYmplY3QgTWFwXSIsQ2Q9IltvYmplY3QgTnVtYmVyXSIsUmQ9IltvYmplY3QgUmVnRXhwXSIsSWQ9IltvYmplY3QgU2V0XSIsTGQ9IltvYmplY3QgU3RyaW5nXSIsYmQ9IltvYmplY3QgU3ltYm9sXSIsRGQ9IltvYmplY3QgQXJyYXlCdWZmZXJdIix3ZD0iW29iamVjdCBEYXRhVmlld10iLENuPVBuP1BuLnByb3RvdHlwZTp2b2lkIDAscHI9Q24/Q24udmFsdWVPZjp2b2lkIDA7ZnVuY3Rpb24gTmQoZCxyLHQsZSxuLGEscyl7c3dpdGNoKHQpe2Nhc2Ugd2Q6aWYoZC5ieXRlTGVuZ3RoIT1yLmJ5dGVMZW5ndGh8fGQuYnl0ZU9mZnNldCE9ci5ieXRlT2Zmc2V0KXJldHVybiExO2Q9ZC5idWZmZXIscj1yLmJ1ZmZlcjtjYXNlIERkOnJldHVybiEoZC5ieXRlTGVuZ3RoIT1yLmJ5dGVMZW5ndGh8fCFhKG5ldyBBbihkKSxuZXcgQW4ocikpKTtjYXNlIE9kOmNhc2UgRWQ6Y2FzZSBDZDpyZXR1cm4gdmQoK2QsK3IpO2Nhc2UgUGQ6cmV0dXJuIGQubmFtZT09ci5uYW1lJiZkLm1lc3NhZ2U9PXIubWVzc2FnZTtjYXNlIFJkOmNhc2UgTGQ6cmV0dXJuIGQ9PXIrIiI7Y2FzZSBBZDp2YXIgaT1TZDtjYXNlIElkOnZhciBvPWUmVGQ7aWYoaXx8KGk9eGQpLGQuc2l6ZSE9ci5zaXplJiYhbylyZXR1cm4hMTt2YXIgYz1zLmdldChkKTtpZihjKXJldHVybiBjPT1yO2V8PU1kLHMuc2V0KGQscik7dmFyIG09eWQoaShkKSxpKHIpLGUsbixhLHMpO3JldHVybiBzLmRlbGV0ZShkKSxtO2Nhc2UgYmQ6aWYocHIpcmV0dXJuIHByLmNhbGwoZCk9PXByLmNhbGwocil9cmV0dXJuITF9dmFyIEJkPU5kLFJuPVFyLFdkPTEsRmQ9T2JqZWN0LnByb3RvdHlwZSxqZD1GZC5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBVZChkLHIsdCxlLG4sYSl7dmFyIHM9dCZXZCxpPVJuKGQpLG89aS5sZW5ndGgsYz1SbihyKSxtPWMubGVuZ3RoO2lmKG8hPW0mJiFzKXJldHVybiExO2Zvcih2YXIgdT1vO3UtLTspe3ZhciBwPWlbdV07aWYoIShzP3AgaW4gcjpqZC5jYWxsKHIscCkpKXJldHVybiExfXZhciB5PWEuZ2V0KGQpLE89YS5nZXQocik7aWYoeSYmTylyZXR1cm4geT09ciYmTz09ZDt2YXIgeD0hMDthLnNldChkLHIpLGEuc2V0KHIsZCk7Zm9yKHZhciB2PXM7Kyt1PG87KXtwPWlbdV07dmFyIFQ9ZFtwXSxsPXJbcF07aWYoZSl2YXIgaD1zP2UobCxULHAscixkLGEpOmUoVCxsLHAsZCxyLGEpO2lmKCEoaD09PXZvaWQgMD9UPT09bHx8bihULGwsdCxlLGEpOmgpKXt4PSExO2JyZWFrfXZ8fCh2PXA9PSJjb25zdHJ1Y3RvciIpfWlmKHgmJiF2KXt2YXIgZj1kLmNvbnN0cnVjdG9yLGc9ci5jb25zdHJ1Y3RvcjtmIT1nJiYiY29uc3RydWN0b3IiaW4gZCYmImNvbnN0cnVjdG9yImluIHImJiEodHlwZW9mIGY9PSJmdW5jdGlvbiImJmYgaW5zdGFuY2VvZiBmJiZ0eXBlb2YgZz09ImZ1bmN0aW9uIiYmZyBpbnN0YW5jZW9mIGcpJiYoeD0hMSl9cmV0dXJuIGEuZGVsZXRlKGQpLGEuZGVsZXRlKHIpLHh9dmFyICRkPVVkLG1yPWJyLHpkPUVuLEdkPUJkLEhkPSRkLEluPXplLExuPUZlLGJuPV9lLEtkPSRyLFZkPTEsRG49IltvYmplY3QgQXJndW1lbnRzXSIsd249IltvYmplY3QgQXJyYXldIixaZT0iW29iamVjdCBPYmplY3RdIixZZD1PYmplY3QucHJvdG90eXBlLE5uPVlkLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIFhkKGQscix0LGUsbixhKXt2YXIgcz1MbihkKSxpPUxuKHIpLG89cz93bjpJbihkKSxjPWk/d246SW4ocik7bz1vPT1Ebj9aZTpvLGM9Yz09RG4/WmU6Yzt2YXIgbT1vPT1aZSx1PWM9PVplLHA9bz09YztpZihwJiZibihkKSl7aWYoIWJuKHIpKXJldHVybiExO3M9ITAsbT0hMX1pZihwJiYhbSlyZXR1cm4gYXx8KGE9bmV3IG1yKSxzfHxLZChkKT96ZChkLHIsdCxlLG4sYSk6R2QoZCxyLG8sdCxlLG4sYSk7aWYoISh0JlZkKSl7dmFyIHk9bSYmTm4uY2FsbChkLCJfX3dyYXBwZWRfXyIpLE89dSYmTm4uY2FsbChyLCJfX3dyYXBwZWRfXyIpO2lmKHl8fE8pe3ZhciB4PXk/ZC52YWx1ZSgpOmQsdj1PP3IudmFsdWUoKTpyO3JldHVybiBhfHwoYT1uZXcgbXIpLG4oeCx2LHQsZSxhKX19cmV0dXJuIHA/KGF8fChhPW5ldyBtciksSGQoZCxyLHQsZSxuLGEpKTohMX12YXIgWmQ9WGQsSmQ9WmQsQm49aWU7ZnVuY3Rpb24gV24oZCxyLHQsZSxuKXtyZXR1cm4gZD09PXI/ITA6ZD09bnVsbHx8cj09bnVsbHx8IUJuKGQpJiYhQm4ocik/ZCE9PWQmJnIhPT1yOkpkKGQscix0LGUsV24sbil9dmFyIFFkPVduLGtkPVFkO2Z1bmN0aW9uIHFkKGQscil7cmV0dXJuIGtkKGQscil9dmFyIF9kPXFkLHZyPVh0KF9kKTtjb25zdCBfdD1jbGFzcyBfdCBleHRlbmRzIHl0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO3N0KHRoaXMsInRvb2xzVHlwZSIsZ3QuU2VsZWN0b3IpO3N0KHRoaXMsInRtcFBvaW50cyIsW10pO3N0KHRoaXMsIndvcmtPcHRpb25zIik7c3QodGhpcywic2VsZWN0SWRzIik7c3QodGhpcywic2VsZWN0b3JDb2xvciIpO3N0KHRoaXMsInN0cm9rZUNvbG9yIik7c3QodGhpcywiZmlsbENvbG9yIik7c3QodGhpcywib2xkU2VsZWN0UmVjdCIpO3N0KHRoaXMsImNhblJvdGF0ZSIsITEpO3N0KHRoaXMsImNhblRleHRFZGl0IiwhMSk7c3QodGhpcywiY2FuTG9jayIsITEpO3N0KHRoaXMsInNjYWxlVHlwZSIsRnQuYWxsKTtzdCh0aGlzLCJ0b29sc1R5cGVzIik7c3QodGhpcywic2hhcGVPcHQiKTtzdCh0aGlzLCJ0ZXh0T3B0Iik7c3QodGhpcywiaXNMb2NrZWQiKTt0aGlzLndvcmtPcHRpb25zPXQudG9vbHNPcHR9Y29tcHV0U2VsZWN0b3IodD0hMCl7Y29uc3QgZT1CdCh0aGlzLnRtcFBvaW50cyk7aWYoZS53PT09MHx8ZS5oPT09MClyZXR1cm57c2VsZWN0SWRzOltdLGludGVyc2VjdFJlY3Q6dm9pZCAwLHN1Yk5vZGVNYXA6bmV3IE1hcH07Y29uc3R7cmVjdFJhbmdlOm4sbm9kZVJhbmdlOmF9PXRoaXMudk5vZGVzLmdldFJlY3RJbnRlcnNlY3RSYW5nZShlLHQpO3JldHVybntzZWxlY3RJZHM6Wy4uLmEua2V5cygpXSxpbnRlcnNlY3RSZWN0Om4sc3ViTm9kZU1hcDphfX11cGRhdGVUZW1wUG9pbnRzKHQpe2NvbnN0IGU9dGhpcy50bXBQb2ludHMubGVuZ3RoLG49dC5sZW5ndGg7aWYobj4xKXtjb25zdCBhPW5ldyBNdCh0W24tMl0qdGhpcy5mdWxsTGF5ZXIud29ybGRTY2FsaW5nWzBdK3RoaXMuZnVsbExheWVyLndvcmxkUG9zaXRpb25bMF0sdFtuLTFdKnRoaXMuZnVsbExheWVyLndvcmxkU2NhbGluZ1swXSt0aGlzLmZ1bGxMYXllci53b3JsZFBvc2l0aW9uWzFdKTtlPT09Mj90aGlzLnRtcFBvaW50cy5zcGxpY2UoMSwxLGEpOnRoaXMudG1wUG9pbnRzLnB1c2goYSl9fWRyYXdTZWxlY3Rvcih0KXtjb25zdHtkcmF3UmVjdDplLHN1Yk5vZGVNYXA6bixzZWxlY3RvcklkOmEsbGF5ZXI6cyxpc1NlcnZpY2U6aX09dCxvPW5ldyByZSh7cG9zOltlLngsZS55XSxhbmNob3I6WzAsMF0sc2l6ZTpbZS53LGUuaF0saWQ6YSxuYW1lOmEsekluZGV4OjFlM30pLGM9W107aWYoaSl7Y29uc3QgbT1uZXcgaHIoe25vcm1hbGl6ZTohMCxwb3M6W2Uudy8yLGUuaC8yXSxsaW5lV2lkdGg6MSxzdHJva2VDb2xvcjp0aGlzLnNlbGVjdG9yQ29sb3J8fHRoaXMud29ya09wdGlvbnMuc3Ryb2tlQ29sb3Isd2lkdGg6ZS53LGhlaWdodDplLmgsbmFtZTpfdC5zZWxlY3RvckJvcmRlcklkfSk7Yy5wdXNoKG0pfW4uZm9yRWFjaCgobSx1KT0+e2NvbnN0IHA9W20ucmVjdC54K20ucmVjdC53LzItZS54LG0ucmVjdC55K20ucmVjdC5oLzItZS55XSx5PW5ldyBocih7bm9ybWFsaXplOiEwLHBvczpwLGxpbmVXaWR0aDoxLHN0cm9rZUNvbG9yOm4uc2l6ZT4xP3RoaXMuc2VsZWN0b3JDb2xvcnx8dGhpcy53b3JrT3B0aW9ucy5zdHJva2VDb2xvcjp2b2lkIDAsd2lkdGg6bS5yZWN0LncsaGVpZ2h0Om0ucmVjdC5oLGlkOmBzZWxlY3Rvci0ke3V9YCxuYW1lOmBzZWxlY3Rvci0ke3V9YH0pO2MucHVzaCh5KX0pLGMmJm8uYXBwZW5kKC4uLmMpLChzPT1udWxsP3ZvaWQgMDpzLnBhcmVudCkuYXBwZW5kQ2hpbGQobyl9ZHJhdyh0LGUsbixhPSExKXt2YXIgbyxjO2NvbnN0e2ludGVyc2VjdFJlY3Q6cyxzdWJOb2RlTWFwOml9PW47KGM9KG89ZS5wYXJlbnQpPT1udWxsP3ZvaWQgMDpvLmdldEVsZW1lbnRCeUlkKHQpKT09bnVsbHx8Yy5yZW1vdmUoKSxzJiZ0aGlzLmRyYXdTZWxlY3Rvcih7ZHJhd1JlY3Q6cyxzdWJOb2RlTWFwOmksc2VsZWN0b3JJZDp0LGxheWVyOmUsaXNTZXJ2aWNlOmF9KX1nZXRTZWxlY3Rlb3JJbmZvKHQpe3RoaXMuc2NhbGVUeXBlPUZ0LmFsbCx0aGlzLmNhblJvdGF0ZT0hMSx0aGlzLnRleHRPcHQ9dm9pZCAwLHRoaXMuc3Ryb2tlQ29sb3I9dm9pZCAwLHRoaXMuZmlsbENvbG9yPXZvaWQgMCx0aGlzLmNhblRleHRFZGl0PSExLHRoaXMuY2FuTG9jaz0hMSx0aGlzLmlzTG9ja2VkPSExLHRoaXMudG9vbHNUeXBlcz12b2lkIDAsdGhpcy5zaGFwZU9wdD12b2lkIDA7Y29uc3QgZT1uZXcgU2V0O2xldCBuO2Zvcihjb25zdCBhIG9mIHQudmFsdWVzKCkpe2NvbnN0e29wdDpzLGNhblJvdGF0ZTppLHNjYWxlVHlwZTpvLHRvb2xzVHlwZTpjfT1hO3RoaXMuc2VsZWN0b3JDb2xvcj10aGlzLndvcmtPcHRpb25zLnN0cm9rZUNvbG9yLHMuc3Ryb2tlQ29sb3ImJih0aGlzLnN0cm9rZUNvbG9yPXMuc3Ryb2tlQ29sb3IpLHMuZmlsbENvbG9yJiYodGhpcy5maWxsQ29sb3I9cy5maWxsQ29sb3IpLHMudGV4dE9wdCYmKHRoaXMudGV4dE9wdD1zLnRleHRPcHQpLGM9PT1ndC5TcGVlY2hCYWxsb29uJiYoZS5hZGQoYyksdGhpcy5zaGFwZU9wdHx8KHRoaXMuc2hhcGVPcHQ9e30pLHRoaXMuc2hhcGVPcHQucGxhY2VtZW50PXMucGxhY2VtZW50KSxjPT09Z3QuUG9seWdvbiYmKGUuYWRkKGMpLHRoaXMuc2hhcGVPcHR8fCh0aGlzLnNoYXBlT3B0PXt9KSx0aGlzLnNoYXBlT3B0LnZlcnRpY2VzPXMudmVydGljZXMpLGM9PT1ndC5TdGFyJiYoZS5hZGQoYyksdGhpcy5zaGFwZU9wdHx8KHRoaXMuc2hhcGVPcHQ9e30pLHRoaXMuc2hhcGVPcHQudmVydGljZXM9cy52ZXJ0aWNlcyx0aGlzLnNoYXBlT3B0LmlubmVyUmF0aW89cy5pbm5lclJhdGlvLHRoaXMuc2hhcGVPcHQuaW5uZXJWZXJ0aWNlU3RlcD1zLmlubmVyVmVydGljZVN0ZXApLGM9PT1ndC5UZXh0JiYodGhpcy50ZXh0T3B0PXMpLHQuc2l6ZT09PTEmJih0aGlzLnRleHRPcHQmJih0aGlzLmNhblRleHRFZGl0PSEwKSx0aGlzLmNhblJvdGF0ZT1pLHRoaXMuc2NhbGVUeXBlPW8pLG89PT1GdC5ub25lJiYodGhpcy5zY2FsZVR5cGU9byksYz09PWd0LkltYWdlJiYobj1hKX1lLnNpemUmJih0aGlzLnRvb2xzVHlwZXM9Wy4uLmVdKSxuJiYodC5zaXplPT09MT8odGhpcy5jYW5Mb2NrPSEwLG4ub3B0LmxvY2tlZCYmKHRoaXMuaXNMb2NrZWQ9ITAsdGhpcy5zY2FsZVR5cGU9RnQubm9uZSx0aGlzLmNhblJvdGF0ZT0hMSx0aGlzLnRleHRPcHQ9dm9pZCAwLHRoaXMuZmlsbENvbG9yPXZvaWQgMCx0aGlzLnNlbGVjdG9yQ29sb3I9InJnYigxNzcsMTc3LDE3NykiLHRoaXMuc3Ryb2tlQ29sb3I9dm9pZCAwLHRoaXMuY2FuVGV4dEVkaXQ9ITEpKTp0LnNpemU+MSYmIW4ub3B0LmxvY2tlZCYmKHRoaXMuY2FuTG9jaz0hMSx0aGlzLmNhblJvdGF0ZT0hMSkpfWdldENoaWxkcmVuUG9pbnRzKCl7dmFyIHQ7aWYodGhpcy5zY2FsZVR5cGU9PT1GdC5ib3RoJiZ0aGlzLnNlbGVjdElkcyl7Y29uc3QgZT10aGlzLnNlbGVjdElkc1swXSxuPSh0PXRoaXMudk5vZGVzLmdldChlKSk9PW51bGw/dm9pZCAwOnQub3A7aWYobil7Y29uc3QgYT1bXTtmb3IobGV0IHM9MDtzPG4ubGVuZ3RoO3MrPTMpYS5wdXNoKFtuW3NdLG5bcysxXV0pO3JldHVybiBhfX19Y29uc3VtZSh0KXtjb25zdHtvcDplLHdvcmtTdGF0ZTpufT10LmRhdGE7bGV0IGE9dGhpcy5vbGRTZWxlY3RSZWN0O2lmKG49PT1JdC5TdGFydCYmKGE9dGhpcy5iYWNrVG9GdWxsTGF5ZXIoKSksIShlIT1udWxsJiZlLmxlbmd0aCl8fCF0aGlzLnZOb2Rlcy5jdXJOb2RlTWFwLnNpemUpcmV0dXJue3R5cGU6bHQuTm9uZX07dGhpcy51cGRhdGVUZW1wUG9pbnRzKGUpO2NvbnN0IHM9dGhpcy5jb21wdXRTZWxlY3RvcigpO2lmKHRoaXMuc2VsZWN0SWRzJiZJaCh0aGlzLnNlbGVjdElkcyxzLnNlbGVjdElkcykpcmV0dXJue3R5cGU6bHQuTm9uZX07dGhpcy5zZWxlY3RJZHM9cy5zZWxlY3RJZHM7Y29uc3QgaT1zLmludGVyc2VjdFJlY3Q7dGhpcy5nZXRTZWxlY3Rlb3JJbmZvKHMuc3ViTm9kZU1hcCksdGhpcy5kcmF3KF90LnNlbGVjdG9ySWQsdGhpcy5kcmF3TGF5ZXJ8fHRoaXMuZnVsbExheWVyLHMpLHRoaXMub2xkU2VsZWN0UmVjdD1pO2NvbnN0IG89dGhpcy5nZXRDaGlsZHJlblBvaW50cygpO3JldHVybnt0eXBlOmx0LlNlbGVjdCxkYXRhVHlwZTpUdC5Mb2NhbCxyZWN0Ok90KGksYSksc2VsZWN0SWRzOnMuc2VsZWN0SWRzLG9wdDp0aGlzLndvcmtPcHRpb25zLHNlbGVjdFJlY3Q6aSxzZWxlY3RvckNvbG9yOnRoaXMuc2VsZWN0b3JDb2xvcixzdHJva2VDb2xvcjp0aGlzLnN0cm9rZUNvbG9yLGZpbGxDb2xvcjp0aGlzLmZpbGxDb2xvcix0ZXh0T3B0OnRoaXMudGV4dE9wdCxjYW5UZXh0RWRpdDp0aGlzLmNhblRleHRFZGl0LGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxjYW5Mb2NrOnRoaXMuY2FuTG9jayxzY2FsZVR5cGU6dGhpcy5zY2FsZVR5cGUsd2lsbFN5bmNTZXJ2aWNlOiEwLHBvaW50czpvLGlzTG9ja2VkOnRoaXMuaXNMb2NrZWQsdG9vbHNUeXBlczp0aGlzLnRvb2xzVHlwZXMsc2hhcGVPcHQ6dGhpcy5zaGFwZU9wdH19Y29uc3VtZUFsbCh0KXt2YXIgZSxuO2lmKCEoKGU9dGhpcy5zZWxlY3RJZHMpIT1udWxsJiZlLmxlbmd0aCkmJnRoaXMudG1wUG9pbnRzWzBdJiZ0aGlzLnNlbGVjdFNpbmdsZVRvb2wodGhpcy50bXBQb2ludHNbMF0uWFksX3Quc2VsZWN0b3JJZCwhMSx0PT1udWxsP3ZvaWQgMDp0LmhvdmVySWQpLChuPXRoaXMuc2VsZWN0SWRzKSE9bnVsbCYmbi5sZW5ndGgmJnRoaXMuc2VhbFRvRHJhd0xheWVyKHRoaXMuc2VsZWN0SWRzKSx0aGlzLm9sZFNlbGVjdFJlY3Qpe2NvbnN0IGE9dGhpcy5nZXRDaGlsZHJlblBvaW50cygpO3JldHVybnt0eXBlOmx0LlNlbGVjdCxkYXRhVHlwZTpUdC5Mb2NhbCxyZWN0OnRoaXMub2xkU2VsZWN0UmVjdCxzZWxlY3RJZHM6dGhpcy5zZWxlY3RJZHMsb3B0OnRoaXMud29ya09wdGlvbnMsc2VsZWN0b3JDb2xvcjp0aGlzLnNlbGVjdG9yQ29sb3Isc2VsZWN0UmVjdDp0aGlzLm9sZFNlbGVjdFJlY3Qsc3Ryb2tlQ29sb3I6dGhpcy5zdHJva2VDb2xvcixmaWxsQ29sb3I6dGhpcy5maWxsQ29sb3IsdGV4dE9wdDp0aGlzLnRleHRPcHQsY2FuVGV4dEVkaXQ6dGhpcy5jYW5UZXh0RWRpdCxjYW5Sb3RhdGU6dGhpcy5jYW5Sb3RhdGUsY2FuTG9jazp0aGlzLmNhbkxvY2ssc2NhbGVUeXBlOnRoaXMuc2NhbGVUeXBlLHdpbGxTeW5jU2VydmljZTohMCxwb2ludHM6YSxpc0xvY2tlZDp0aGlzLmlzTG9ja2VkLHRvb2xzVHlwZXM6dGhpcy50b29sc1R5cGVzLHNoYXBlT3B0OnRoaXMuc2hhcGVPcHR9fXJldHVybnt0eXBlOmx0Lk5vbmV9fWNvbnN1bWVTZXJ2aWNlKCl7fWNsZWFyVG1wUG9pbnRzKCl7dGhpcy50bXBQb2ludHMubGVuZ3RoPTB9Y2xlYXJTZWxlY3REYXRhKCl7dGhpcy5zZWxlY3RJZHM9dm9pZCAwLHRoaXMub2xkU2VsZWN0UmVjdD12b2lkIDB9c2VsZWN0U2luZ2xlVG9vbCh0LGU9X3Quc2VsZWN0b3JJZCxuPSExLGEpe2lmKHQubGVuZ3RoPT09Mil7Y29uc3Qgcz10WzBdLGk9dFsxXTtsZXQgbztmb3IoY29uc3QgYyBvZiB0aGlzLmZ1bGxMYXllci5jaGlsZHJlbil7Y29uc3QgbT1ZbihbY10pO2xldCB1PSExO2lmKChhJiZhPT09Yy5uYW1lfHwhMSkmJm0uZmluZCh5PT55LmlzUG9pbnRDb2xsaXNpb24ocyxpKSkpe289YzticmVha31mb3IoY29uc3QgeSBvZiBtKWlmKHU9eS5pc1BvaW50Q29sbGlzaW9uKHMsaSksdSl7aWYoIW8pbz1jO2Vsc2V7Y29uc3QgTz10aGlzLnZOb2Rlcy5nZXQoYy5uYW1lKSx4PXRoaXMudk5vZGVzLmdldChvLm5hbWUpO2lmKChPPT1udWxsP3ZvaWQgMDpPLnRvb2xzVHlwZSkhPT1ndC5UZXh0JiYoeD09bnVsbD92b2lkIDA6eC50b29sc1R5cGUpPT09Z3QuVGV4dClicmVhaztpZigoTz09bnVsbD92b2lkIDA6Ty50b29sc1R5cGUpPT09Z3QuVGV4dCYmKHg9PW51bGw/dm9pZCAwOngudG9vbHNUeXBlKSE9PWd0LlRleHQpbz1jO2Vsc2V7Y29uc3Qgdj0oTz09bnVsbD92b2lkIDA6Ty5vcHQuekluZGV4KXx8MCxUPSh4PT1udWxsP3ZvaWQgMDp4Lm9wdC56SW5kZXgpfHwwO051bWJlcih2KT49TnVtYmVyKFQpJiYobz1jKX19YnJlYWt9fWlmKG8pe2NvbnN0IGM9by5uYW1lLG09dGhpcy52Tm9kZXMuZ2V0KGMpO2lmKG0pe2lmKCF2cih0aGlzLm9sZFNlbGVjdFJlY3QsbS5yZWN0KSl7Y29uc3QgdT1uZXcgTWFwKFtbYyxtXV0pO3RoaXMuZ2V0U2VsZWN0ZW9ySW5mbyh1KSx0aGlzLmRyYXcoZSx0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXIse2ludGVyc2VjdFJlY3Q6bS5yZWN0LHN1Yk5vZGVNYXA6dSxzZWxlY3RJZHM6dGhpcy5zZWxlY3RJZHN8fFtdfSxuKX10aGlzLnNlbGVjdElkcz1bY10sdGhpcy5vbGRTZWxlY3RSZWN0PW0ucmVjdH19fX1iYWNrVG9GdWxsTGF5ZXIodCl7dmFyIHMsaTtsZXQgZTtjb25zdCBuPVtdLGE9W107Zm9yKGNvbnN0IG8gb2YoKHM9dGhpcy5kcmF3TGF5ZXIpPT1udWxsP3ZvaWQgMDpzLmNoaWxkcmVuKXx8W10paWYoISh0IT1udWxsJiZ0Lmxlbmd0aCYmIXQuaW5jbHVkZXMoby5pZCkpJiZvLmlkIT09X3Quc2VsZWN0b3JJZCl7Y29uc3QgYz1vLmNsb25lTm9kZSghMCk7SGUobykmJmMuc2VhbCgpLHRoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKG8ubmFtZSkubGVuZ3RofHxuLnB1c2goYyksYS5wdXNoKG8pO2NvbnN0IG09KGk9dGhpcy52Tm9kZXMuZ2V0KG8ubmFtZSkpPT1udWxsP3ZvaWQgMDppLnJlY3Q7bSYmKGU9T3QoZSxtKSl9cmV0dXJuIGEuZm9yRWFjaChvPT5vLnJlbW92ZSgpKSxuLmxlbmd0aCYmdGhpcy5mdWxsTGF5ZXIuYXBwZW5kKC4uLm4pLGV9c2VhbFRvRHJhd0xheWVyKHQpe3ZhciBhO2NvbnN0IGU9W10sbj1bXTt0LmZvckVhY2gocz0+e3RoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKHMudG9TdHJpbmcoKSkuZm9yRWFjaChpPT57dmFyIGM7Y29uc3Qgbz1pLmNsb25lTm9kZSghMCk7SGUoaSkmJm8uc2VhbCgpLChjPXRoaXMuZHJhd0xheWVyKSE9bnVsbCYmYy5nZXRFbGVtZW50c0J5TmFtZShpLm5hbWUpLmxlbmd0aHx8ZS5wdXNoKG8pLG4ucHVzaChpKX0pfSksbi5mb3JFYWNoKHM9PnMucmVtb3ZlKCkpLGUmJigoYT10aGlzLmRyYXdMYXllcik9PW51bGx8fGEuYXBwZW5kKC4uLmUpKX1nZXRTZWxlY3RvclJlY3QodCxlKXt2YXIgaTtsZXQgbjtjb25zdCBhPShpPXQucGFyZW50KT09bnVsbD92b2lkIDA6aS5nZXRFbGVtZW50QnlJZChlKSxzPWE9PW51bGw/dm9pZCAwOmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuIHMmJihuPU90KG4se3g6TWF0aC5mbG9vcihzLngpLHk6TWF0aC5mbG9vcihzLnkpLHc6TWF0aC5yb3VuZChzLndpZHRoKSxoOk1hdGgucm91bmQocy5oZWlnaHQpfSkpLG59aXNDYW5GaWxsQ29sb3IodCl7cmV0dXJuIHQ9PT1ndC5FbGxpcHNlfHx0PT09Z3QuVHJpYW5nbGV8fHQ9PT1ndC5SZWN0YW5nbGV8fHQ9PT1ndC5Qb2x5Z29ufHx0PT09Z3QuU3Rhcnx8dD09PWd0LlNwZWVjaEJhbGxvb259YXN5bmMgdXBkYXRlU2VsZWN0b3IodCl7Y29uc3R7dXBkYXRlU2VsZWN0b3JPcHQ6ZSxzZWxlY3RJZHM6bix2Tm9kZXM6YSx3aWxsU2VyaWFsaXplRGF0YTpzLHdvcmtlcjppLG9mZnNldDpvLHNjZW5lOmN9PXQsbT10aGlzLmRyYXdMYXllcjtpZighbSlyZXR1cm47bGV0IHU7Y29uc3QgcD1uZXcgTWFwLHtib3g6eSx3b3JrU3RhdGU6TyxhbmdsZTp4LHRyYW5zbGF0ZTp2fT1lO2xldCBUPVswLDBdLGw9WzEsMV0saD1bMCwwXSxmLGc7aWYoeXx8dnx8b2UoeCkpe2lmKE89PT1JdC5TdGFydClyZXR1cm4gYS5zZXRUYXJnZXQoKSx7dHlwZTpsdC5TZWxlY3QsZGF0YVR5cGU6VHQuTG9jYWwsc2VsZWN0UmVjdDp0aGlzLm9sZFNlbGVjdFJlY3QscmVjdDp0aGlzLm9sZFNlbGVjdFJlY3R9O2lmKGY9YS5nZXRMYXN0VGFyZ2V0KCksZiYmeSl7bGV0IEM7bj09bnVsbHx8bi5mb3JFYWNoKGI9Pntjb25zdCBFPWY9PW51bGw/dm9pZCAwOmYuZ2V0KGIpO0M9T3QoQyxFPT1udWxsP3ZvaWQgMDpFLnJlY3QpfSksQyYmKGw9W3kudy9DLncseS5oL0MuaF0sVD1beS54K3kudy8yLShDLngrQy53LzIpLHkueSt5LmgvMi0oQy55K0MuaC8yKV0saD1bQy54K0Mudy8yLEMueStDLmgvMl0pLGc9Q319aWYobilmb3IoY29uc3QgQyBvZiBuKXtjb25zdCBiPWEuZ2V0KEMpO2lmKGIpe2NvbnN0e3Rvb2xzVHlwZTpFfT1iO2xldCBMPShtPT1udWxsP3ZvaWQgMDptLmdldEVsZW1lbnRzQnlOYW1lKEMpKVswXTtpZihMKXtjb25zdCBEPXsuLi5lfTtsZXQgSTtpZihFKXtpZihmJiYoST1mLmdldChDKSxJJiZ5KSl7RC5ib3hTY2FsZT1sO2NvbnN0IEI9W0kucmVjdC54K0kucmVjdC53LzIsSS5yZWN0LnkrSS5yZWN0LmgvMl0sej1bQlswXS1oWzBdLEJbMV0taFsxXV07RC5ib3hUcmFuc2xhdGU9W3pbMF0qKGxbMF0tMSkrVFswXSsobyYmb1swXXx8MCkselsxXSoobFsxXS0xKStUWzFdKyhvJiZvWzFdfHwwKV19Y29uc3QgUj1WbihFKTtpZihSPT1udWxsfHxSLnVwZGF0ZU5vZGVPcHQoe25vZGU6TCxvcHQ6RCx2Tm9kZXM6YSx3aWxsU2VyaWFsaXplRGF0YTpzLHRhcmdldE5vZGU6SX0pLGImJmkmJihzJiYoRC5hbmdsZXx8RC50cmFuc2xhdGUpfHxELmJveCYmRC53b3JrU3RhdGUhPT1JdC5TdGFydHx8RC5wb2ludE1hcCYmRC5wb2ludE1hcC5oYXMoQyl8fEU9PT1ndC5UZXh0JiYoRC5mb250U2l6ZXx8RC50cmFuc2xhdGV8fEQudGV4dEluZm9zJiZELnRleHRJbmZvcy5nZXQoQykpfHxFPT09Z3QuSW1hZ2UmJihELmFuZ2xlfHxELnRyYW5zbGF0ZXx8RC5ib3hTY2FsZSl8fEU9PT1ELnRvb2xzVHlwZSYmRC53aWxsUmVmcmVzaCkpe2NvbnN0IEI9aS5jcmVhdGVXb3JrU2hhcGVOb2RlKHt0b29sc1R5cGU6RSx0b29sc09wdDpiLm9wdH0pO0I9PW51bGx8fEIuc2V0V29ya0lkKEMpO2xldCB6O0U9PT1ndC5JbWFnZSYmYz96PWF3YWl0IEIuY29uc3VtZVNlcnZpY2VBc3luYyh7aXNGdWxsV29yazohMSxyZXBsYWNlSWQ6QyxzY2VuZTpjfSk6ej1CPT1udWxsP3ZvaWQgMDpCLmNvbnN1bWVTZXJ2aWNlKHtvcDpiLm9wLGlzRnVsbFdvcms6ITEscmVwbGFjZUlkOkMsaXNDbGVhckFsbDohMX0pLHomJihiLnJlY3Q9eiksTD0obT09bnVsbD92b2lkIDA6bS5nZXRFbGVtZW50c0J5TmFtZShDKSlbMF19YiYmKHAuc2V0KEMsYiksdT1PdCh1LGIucmVjdCkpfX19fWYmJk89PT1JdC5Eb25lJiZhLmRlbGV0ZUxhc3RUYXJnZXQoKTtjb25zdCBNPXU7aWYoZyYmZS5kaXImJk0pe2xldCBDPVswLDBdO3N3aXRjaChlLmRpcil7Y2FzZSJ0b3BMZWZ0IjpjYXNlImxlZnQiOntjb25zdCBiPVtnLngrZy53LGcueStnLmhdO0M9W2JbMF0tKE0ueCtNLncpLGJbMV0tKE0ueStNLmgpXTticmVha31jYXNlImJvdHRvbUxlZnQiOmNhc2UiYm90dG9tIjp7Y29uc3QgYj1bZy54K2cudyxnLnldO0M9W2JbMF0tKE0ueCtNLncpLGJbMV0tTS55XTticmVha31jYXNlInRvcFJpZ2h0IjpjYXNlInRvcCI6e2NvbnN0IGI9W2cueCxnLnkrZy5oXTtDPVtiWzBdLU0ueCxiWzFdLShNLnkrTS5oKV07YnJlYWt9Y2FzZSJyaWdodCI6Y2FzZSJib3R0b21SaWdodCI6e2NvbnN0IGI9W2cueCxnLnldO0M9W2JbMF0tTS54LGJbMV0tTS55XTticmVha319aWYoQ1swXXx8Q1sxXSlyZXR1cm4gTS54PU0ueCtDWzBdLE0ueT1NLnkrQ1sxXSxhd2FpdCB0aGlzLnVwZGF0ZVNlbGVjdG9yKHsuLi50LG9mZnNldDpDfSl9dGhpcy5nZXRTZWxlY3Rlb3JJbmZvKHApLHRoaXMuZHJhdyhfdC5zZWxlY3RvcklkLG0se3NlbGVjdElkczpufHxbXSxzdWJOb2RlTWFwOnAsaW50ZXJzZWN0UmVjdDpNfSk7Y29uc3QgQT1PdCh0aGlzLm9sZFNlbGVjdFJlY3QsdSk7cmV0dXJuIHRoaXMub2xkU2VsZWN0UmVjdD11LHt0eXBlOmx0LlNlbGVjdCxkYXRhVHlwZTpUdC5Mb2NhbCxzZWxlY3RSZWN0Ok0scmVuZGVyUmVjdDp1LHJlY3Q6T3QoQSxNKX19Ymx1clNlbGVjdG9yKCl7Y29uc3QgdD10aGlzLmJhY2tUb0Z1bGxMYXllcigpO3JldHVybnt0eXBlOmx0LlNlbGVjdCxkYXRhVHlwZTpUdC5Mb2NhbCxyZWN0OnQsc2VsZWN0SWRzOltdLHdpbGxTeW5jU2VydmljZTohMH19Z2V0UmlnaHRTZXJ2aWNlSWQodCl7cmV0dXJuIHQucmVwbGFjZSgiKysiLCItIil9c2VsZWN0U2VydmljZU5vZGUodCxlLG4pe2NvbnN0e3NlbGVjdElkczphfT1lLHM9dGhpcy5nZXRSaWdodFNlcnZpY2VJZCh0KSxpPXRoaXMuZ2V0U2VsZWN0b3JSZWN0KHRoaXMuZnVsbExheWVyLHMpO2xldCBvO2NvbnN0IGM9bmV3IE1hcDtyZXR1cm4gYT09bnVsbHx8YS5mb3JFYWNoKG09Pntjb25zdCB1PXRoaXMudk5vZGVzLmdldChtKSxwPXRoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKG0pWzBdO3UmJnAmJihvPU90KG8sdS5yZWN0KSxjLnNldChtLHUpKX0pLHRoaXMuZ2V0U2VsZWN0ZW9ySW5mbyhjKSx0aGlzLmRyYXcocyx0aGlzLmZ1bGxMYXllcix7aW50ZXJzZWN0UmVjdDpvLHNlbGVjdElkczphfHxbXSxzdWJOb2RlTWFwOmN9LG4pLE90KG8saSl9cmVSZW5kZXJTZWxlY3Rvcigpe3ZhciBuO2xldCB0O2NvbnN0IGU9bmV3IE1hcDtyZXR1cm4obj10aGlzLnNlbGVjdElkcyk9PW51bGx8fG4uZm9yRWFjaChhPT57Y29uc3Qgcz10aGlzLnZOb2Rlcy5nZXQoYSk7cyYmKHQ9T3QodCxzLnJlY3QpLGUuc2V0KGEscykpfSx0aGlzKSx0aGlzLmdldFNlbGVjdGVvckluZm8oZSksdGhpcy5kcmF3KF90LnNlbGVjdG9ySWQsdGhpcy5kcmF3TGF5ZXJ8fHRoaXMuZnVsbExheWVyLHtpbnRlcnNlY3RSZWN0OnQsc3ViTm9kZU1hcDplLHNlbGVjdElkczp0aGlzLnNlbGVjdElkc3x8W119KSx0aGlzLm9sZFNlbGVjdFJlY3Q9dCx0fXVwZGF0ZVNlbGVjdElkcyh0KXt2YXIgaSxvO2xldCBlO2NvbnN0IG49KGk9dGhpcy5zZWxlY3RJZHMpPT1udWxsP3ZvaWQgMDppLmZpbHRlcihjPT4hdC5pbmNsdWRlcyhjKSksYT10LmZpbHRlcihjPT57dmFyIG07cmV0dXJuISgobT10aGlzLnNlbGVjdElkcykhPW51bGwmJm0uaW5jbHVkZXMoYykpfSk7aWYobiE9bnVsbCYmbi5sZW5ndGgmJihlPXRoaXMuYmFja1RvRnVsbExheWVyKG4pKSxhLmxlbmd0aCl7dGhpcy5zZWFsVG9EcmF3TGF5ZXIoYSk7Zm9yKGNvbnN0IGMgb2YgYSl7Y29uc3QgbT0obz10aGlzLnZOb2Rlcy5nZXQoYykpPT1udWxsP3ZvaWQgMDpvLnJlY3Q7bSYmKGU9T3QoZSxtKSl9fXRoaXMuc2VsZWN0SWRzPXQ7Y29uc3Qgcz10aGlzLnJlUmVuZGVyU2VsZWN0b3IoKTtyZXR1cm57YmdSZWN0OmUsc2VsZWN0UmVjdDpzfX1jdXJzb3JIb3Zlcih0KXt2YXIgcyxpO2NvbnN0IGU9dGhpcy5vbGRTZWxlY3RSZWN0O3RoaXMuc2VsZWN0SWRzPVtdO2NvbnN0IG49KHM9dGhpcy53b3JrSWQpPT1udWxsP3ZvaWQgMDpzLnRvU3RyaW5nKCksYT1bdFswXSp0aGlzLmZ1bGxMYXllci53b3JsZFNjYWxpbmdbMF0rdGhpcy5mdWxsTGF5ZXIud29ybGRQb3NpdGlvblswXSx0WzFdKnRoaXMuZnVsbExheWVyLndvcmxkU2NhbGluZ1swXSt0aGlzLmZ1bGxMYXllci53b3JsZFBvc2l0aW9uWzFdXTtpZih0aGlzLnNlbGVjdFNpbmdsZVRvb2woYSxuLCEwKSx0aGlzLm9sZFNlbGVjdFJlY3QmJiF2cihlLHRoaXMub2xkU2VsZWN0UmVjdCkpcmV0dXJue3R5cGU6bHQuQ3Vyc29ySG92ZXIsZGF0YVR5cGU6VHQuTG9jYWwscmVjdDpPdChlLHRoaXMub2xkU2VsZWN0UmVjdCksc2VsZWN0b3JDb2xvcjp0aGlzLnNlbGVjdG9yQ29sb3Isd2lsbFN5bmNTZXJ2aWNlOiExfTtpZigoaT10aGlzLnNlbGVjdElkcykhPW51bGwmJmkubGVuZ3RofHwodGhpcy5vbGRTZWxlY3RSZWN0PXZvaWQgMCksZSYmIXRoaXMub2xkU2VsZWN0UmVjdClyZXR1cm4gdGhpcy5jdXJzb3JCbHVyKCkse3R5cGU6bHQuQ3Vyc29ySG92ZXIsZGF0YVR5cGU6VHQuTG9jYWwscmVjdDplLHNlbGVjdG9yQ29sb3I6dGhpcy5zZWxlY3RvckNvbG9yLHdpbGxTeW5jU2VydmljZTohMX19Y3Vyc29yQmx1cigpe3ZhciBlLG47dGhpcy5zZWxlY3RJZHM9W107Y29uc3QgdD0oZT10aGlzLndvcmtJZCk9PW51bGw/dm9pZCAwOmUudG9TdHJpbmcoKTsoKG49dGhpcy5mdWxsTGF5ZXIpPT1udWxsP3ZvaWQgMDpuLnBhcmVudCkuY2hpbGRyZW4uZm9yRWFjaChhPT57YS5uYW1lPT09dCYmYS5yZW1vdmUoKX0pfX07c3QoX3QsInNlbGVjdG9ySWQiLFloKSxzdChfdCwic2VsZWN0b3JCb3JkZXJJZCIsInNlbGVjdG9yLWJvcmRlciIpO2xldCB3dD1fdDtjbGFzcyBGbiBleHRlbmRzIHl0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO3N0KHRoaXMsImNhblJvdGF0ZSIsITEpO3N0KHRoaXMsInNjYWxlVHlwZSIsRnQuYm90aCk7c3QodGhpcywidG9vbHNUeXBlIixndC5BcnJvdyk7c3QodGhpcywidG1wUG9pbnRzIixbXSk7c3QodGhpcywid29ya09wdGlvbnMiKTtzdCh0aGlzLCJvbGRSZWN0Iik7c3QodGhpcywiYXJyb3dUaXBXaWR0aCIpO3N0KHRoaXMsInN5bmNUaW1lc3RhbXAiKTt0aGlzLndvcmtPcHRpb25zPXQudG9vbHNPcHQsdGhpcy5hcnJvd1RpcFdpZHRoPXRoaXMud29ya09wdGlvbnMudGhpY2tuZXNzKjQsdGhpcy5zeW5jVGltZXN0YW1wPTAsdGhpcy5zeW5jVW5pdFRpbWU9NTB9Y29uc3VtZSh0KXt2YXIgTztjb25zdHtkYXRhOmUsaXNGdWxsV29yazpuLGlzU3ViV29ya2VyOmF9PXQscz0oTz1lPT1udWxsP3ZvaWQgMDplLndvcmtJZCk9PW51bGw/dm9pZCAwOk8udG9TdHJpbmcoKTtpZighcylyZXR1cm57dHlwZTpsdC5Ob25lfTtjb25zdHtvcDppLHdvcmtTdGF0ZTpvfT1lLGM9aT09bnVsbD92b2lkIDA6aS5sZW5ndGg7aWYoIWN8fGM8MilyZXR1cm57dHlwZTpsdC5Ob25lfTtsZXQgbTtpZihvPT09SXQuU3RhcnQ/KHRoaXMudG1wUG9pbnRzPVtuZXcgTXQoaVswXSxpWzFdKV0sbT0hMSk6bT10aGlzLnVwZGF0ZVRlbXBQb2ludHMoaSksIW0pcmV0dXJue3R5cGU6bHQuTm9uZX07aWYoIWEpe2NvbnN0IHg9RGF0ZS5ub3coKTtyZXR1cm4geC10aGlzLnN5bmNUaW1lc3RhbXA+dGhpcy5zeW5jVW5pdFRpbWU/KHRoaXMuc3luY1RpbWVzdGFtcD14LHt0eXBlOmx0LkRyYXdXb3JrLGRhdGFUeXBlOlR0LkxvY2FsLHdvcmtJZDpzLG9wOnRoaXMudG1wUG9pbnRzLm1hcCh2PT5bLi4udi5YWSwwXSkuZmxhdCgxKSxpc1N5bmM6ITAsaW5kZXg6MH0pOnt0eXBlOmx0Lk5vbmV9fWNvbnN0IHU9bj90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXIscD10aGlzLmRyYXcoe3dvcmtJZDpzLGxheWVyOnV9KSx5PU90KHAsdGhpcy5vbGRSZWN0KTtyZXR1cm4gdGhpcy5vbGRSZWN0PXAse3JlY3Q6eSx0eXBlOmx0LkRyYXdXb3JrLGRhdGFUeXBlOlR0LkxvY2FsLHdvcmtJZDpzfX1jb25zdW1lQWxsKHQpe3ZhciBjO2NvbnN0e2RhdGE6ZX09dCxuPShjPWU9PW51bGw/dm9pZCAwOmUud29ya0lkKT09bnVsbD92b2lkIDA6Yy50b1N0cmluZygpO2lmKCFuKXJldHVybnt0eXBlOmx0Lk5vbmV9O2lmKHRoaXMudG1wUG9pbnRzLmxlbmd0aDwyKXJldHVybnt0eXBlOmx0LlJlbW92ZU5vZGUscmVtb3ZlSWRzOltuXX07Y29uc3QgYT10aGlzLmZ1bGxMYXllcixzPXRoaXMuZHJhdyh7d29ya0lkOm4sbGF5ZXI6YX0pO3RoaXMub2xkUmVjdD1zO2NvbnN0IGk9dGhpcy50bXBQb2ludHMubWFwKG09PlsuLi5tLlhZLDBdKS5mbGF0KDEpLG89bmUoaSk7cmV0dXJuIHRoaXMudk5vZGVzLnNldEluZm8obix7cmVjdDpzLG9wOmksb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxzY2FsZVR5cGU6dGhpcy5zY2FsZVR5cGUsY2VudGVyUG9zOnl0LmdldENlbnRlclBvcyhzLGEpfSkse3JlY3Q6cyx0eXBlOmx0LkZ1bGxXb3JrLGRhdGFUeXBlOlR0LkxvY2FsLHdvcmtJZDpuLG9wczpvLGlzU3luYzohMCxvcHQ6dGhpcy53b3JrT3B0aW9uc319ZHJhdyh0KXt2YXIgbDtjb25zdHt3b3JrSWQ6ZSxsYXllcjpufT10O3RoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKGUpLm1hcChoPT5oLnJlbW92ZSgpKSwobD10aGlzLmRyYXdMYXllcik9PW51bGx8fGwuZ2V0RWxlbWVudHNCeU5hbWUoZSkubWFwKGg9PmgucmVtb3ZlKCkpO2NvbnN0e3N0cm9rZUNvbG9yOmEsdGhpY2tuZXNzOnMsekluZGV4Omksc2NhbGU6byxyb3RhdGU6Yyx0cmFuc2xhdGU6bX09dGhpcy53b3JrT3B0aW9ucyx1PW4ud29ybGRQb3NpdGlvbixwPW4ud29ybGRTY2FsaW5nLHtwb2ludHM6eSxyZWN0Ok99PXRoaXMuY29tcHV0RHJhd1BvaW50cyhzKSx2PXtwb3M6W08ueCtPLncvMixPLnkrTy5oLzJdLG5hbWU6ZSxpZDplLGNsb3NlOiEwLHBvaW50czp5LGZpbGxDb2xvcjphLHN0cm9rZUNvbG9yOmEsbGluZVdpZHRoOjAsbm9ybWFsaXplOiEwLHpJbmRleDppfTtvJiYodi5zY2FsZT1vKSxjJiYodi5yb3RhdGU9YyksbSYmKHYudHJhbnNsYXRlPW0pO2NvbnN0IFQ9bmV3IGRlKHYpO2lmKG4uYXBwZW5kKFQpLG98fGN8fG0pe2NvbnN0IGg9VC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm57eDpNYXRoLmZsb29yKGgueC15dC5TYWZlQm9yZGVyUGFkZGluZykseTpNYXRoLmZsb29yKGgueS15dC5TYWZlQm9yZGVyUGFkZGluZyksdzpNYXRoLmZsb29yKGgud2lkdGgreXQuU2FmZUJvcmRlclBhZGRpbmcqMiksaDpNYXRoLmZsb29yKGguaGVpZ2h0K3l0LlNhZmVCb3JkZXJQYWRkaW5nKjIpfX1yZXR1cm57eDpNYXRoLmZsb29yKE8ueCpwWzBdK3VbMF0teXQuU2FmZUJvcmRlclBhZGRpbmcpLHk6TWF0aC5mbG9vcihPLnkqcFsxXSt1WzFdLXl0LlNhZmVCb3JkZXJQYWRkaW5nKSx3Ok1hdGguZmxvb3IoTy53KnBbMF0rMip5dC5TYWZlQm9yZGVyUGFkZGluZyksaDpNYXRoLmZsb29yKE8uaCpwWzFdKzIqeXQuU2FmZUJvcmRlclBhZGRpbmcpfX1jb21wdXREcmF3UG9pbnRzKHQpe3JldHVybiB0aGlzLnRtcFBvaW50c1sxXS5kaXN0YW5jZSh0aGlzLnRtcFBvaW50c1swXSk+dGhpcy5hcnJvd1RpcFdpZHRoP3RoaXMuY29tcHV0RnVsbEFycm93UG9pbnRzKHQpOnRoaXMuY29tcHV0VHJpYW5nbGVQb2ludHMoKX1jb21wdXRGdWxsQXJyb3dQb2ludHModCl7Y29uc3QgZT1ldC5TdWIodGhpcy50bXBQb2ludHNbMV0sdGhpcy50bXBQb2ludHNbMF0pLnVuaSgpLG49ZXQuUGVyKGUpLm11bCh0LzIpLGE9TXQuU3ViKHRoaXMudG1wUG9pbnRzWzBdLG4pLHM9TXQuQWRkKHRoaXMudG1wUG9pbnRzWzBdLG4pLGk9ZXQuTXVsKGUsdGhpcy5hcnJvd1RpcFdpZHRoKSxvPWV0LlN1Yih0aGlzLnRtcFBvaW50c1sxXSxpKSxjPU10LlN1YihvLG4pLG09TXQuQWRkKG8sbiksdT1ldC5QZXIoZSkubXVsKHQqMS41KSxwPU10LlN1YihvLHUpLHk9TXQuQWRkKG8sdSksTz1bYSxjLHAsdGhpcy50bXBQb2ludHNbMV0seSxtLHNdO3JldHVybntwb2ludHM6Ty5tYXAoeD0+TXQuU3ViKHgsdGhpcy50bXBQb2ludHNbMF0pLlhZKS5mbGF0KDEpLHJlY3Q6QnQoTyksaXNUcmlhbmdsZTohMSxwb3M6dGhpcy50bXBQb2ludHNbMF0uWFl9fWNvbXB1dFRyaWFuZ2xlUG9pbnRzKCl7Y29uc3QgdD1ldC5TdWIodGhpcy50bXBQb2ludHNbMV0sdGhpcy50bXBQb2ludHNbMF0pLnVuaSgpLGU9dGhpcy50bXBQb2ludHNbMV0uZGlzdGFuY2UodGhpcy50bXBQb2ludHNbMF0pLG49ZXQuUGVyKHQpLm11bChNYXRoLmZsb29yKGUqMy84KSksYT1NdC5TdWIodGhpcy50bXBQb2ludHNbMF0sbikscz1NdC5BZGQodGhpcy50bXBQb2ludHNbMF0sbiksaT1bYSx0aGlzLnRtcFBvaW50c1sxXSxzXTtyZXR1cm57cG9pbnRzOmkubWFwKG89Pk10LlN1YihvLHRoaXMudG1wUG9pbnRzWzBdKS5YWSkuZmxhdCgxKSxyZWN0OkJ0KGkpLGlzVHJpYW5nbGU6ITAscG9zOnRoaXMudG1wUG9pbnRzWzBdLlhZfX11cGRhdGVUZW1wUG9pbnRzKHQpe2NvbnN0IGU9dC5zbGljZSgtMiksbj1uZXcgTXQoZVswXSxlWzFdKSxhPXRoaXMudG1wUG9pbnRzWzBdLHt0aGlja25lc3M6c309dGhpcy53b3JrT3B0aW9ucztpZihhLmlzTmVhcihuLHMpKXJldHVybiExO2lmKHRoaXMudG1wUG9pbnRzLmxlbmd0aD09PTIpe2lmKG4uaXNOZWFyKHRoaXMudG1wUG9pbnRzWzFdLDEpKXJldHVybiExO3RoaXMudG1wUG9pbnRzWzFdPW59ZWxzZSB0aGlzLnRtcFBvaW50cy5wdXNoKG4pO3JldHVybiEwfWNvbnN1bWVTZXJ2aWNlKHQpe3ZhciBvO2NvbnN0e29wOmUsaXNGdWxsV29yazpufT10LGE9KG89dGhpcy53b3JrSWQpPT1udWxsP3ZvaWQgMDpvLnRvU3RyaW5nKCk7aWYoIWEpcmV0dXJuO3RoaXMudG1wUG9pbnRzLmxlbmd0aD0wO2ZvcihsZXQgYz0wO2M8ZS5sZW5ndGg7Yys9Myl0aGlzLnRtcFBvaW50cy5wdXNoKG5ldyBNdChlW2NdLGVbYysxXSxlW2MrMl0pKTtjb25zdCBzPW4/dGhpcy5mdWxsTGF5ZXI6dGhpcy5kcmF3TGF5ZXJ8fHRoaXMuZnVsbExheWVyLGk9dGhpcy5kcmF3KHt3b3JrSWQ6YSxsYXllcjpzfSk7cmV0dXJuIHRoaXMub2xkUmVjdD1pLHRoaXMudk5vZGVzLnNldEluZm8oYSx7cmVjdDppLG9wOmUsb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxzY2FsZVR5cGU6dGhpcy5zY2FsZVR5cGUsY2VudGVyUG9zOnl0LmdldENlbnRlclBvcyhpLHMpfSksaX1jbGVhclRtcFBvaW50cygpe3RoaXMudG1wUG9pbnRzLmxlbmd0aD0wfXN0YXRpYyB1cGRhdGVOb2RlT3B0KHQpe3ZhciBvO2NvbnN0e25vZGU6ZSxvcHQ6bix2Tm9kZXM6YX09dCx7c3Ryb2tlQ29sb3I6c309bixpPWEuZ2V0KGUubmFtZSk7cmV0dXJuIHMmJihlLnNldEF0dHJpYnV0ZSgic3Ryb2tlQ29sb3IiLHMpLGUuc2V0QXR0cmlidXRlKCJmaWxsQ29sb3IiLHMpLChvPWk9PW51bGw/dm9pZCAwOmkub3B0KSE9bnVsbCYmby5zdHJva2VDb2xvciYmKGkub3B0LnN0cm9rZUNvbG9yPXMpLGkmJmEuc2V0SW5mbyhlLm5hbWUsaSkpLHl0LnVwZGF0ZU5vZGVPcHQodCl9fWNsYXNzIGpuIGV4dGVuZHMgeXR7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7c3QodGhpcywiY2FuUm90YXRlIiwhMSk7c3QodGhpcywic2NhbGVUeXBlIixGdC5hbGwpO3N0KHRoaXMsInRvb2xzVHlwZSIsZ3QuRWxsaXBzZSk7c3QodGhpcywidG1wUG9pbnRzIixbXSk7c3QodGhpcywid29ya09wdGlvbnMiKTtzdCh0aGlzLCJvbGRSZWN0Iik7c3QodGhpcywic3luY1RpbWVzdGFtcCIpO3RoaXMud29ya09wdGlvbnM9dC50b29sc09wdCx0aGlzLnN5bmNUaW1lc3RhbXA9MCx0aGlzLnN5bmNVbml0VGltZT01MH1jb25zdW1lKHQpe3ZhciBPO2NvbnN0e2RhdGE6ZSxpc0Z1bGxXb3JrOm4saXNTdWJXb3JrZXI6YX09dCxzPShPPWU9PW51bGw/dm9pZCAwOmUud29ya0lkKT09bnVsbD92b2lkIDA6Ty50b1N0cmluZygpO2lmKCFzKXJldHVybnt0eXBlOmx0Lk5vbmV9O2NvbnN0e29wOmksd29ya1N0YXRlOm99PWUsYz1pPT1udWxsP3ZvaWQgMDppLmxlbmd0aDtpZighY3x8YzwyKXJldHVybnt0eXBlOmx0Lk5vbmV9O2xldCBtO2lmKG89PT1JdC5TdGFydD8odGhpcy50bXBQb2ludHM9W25ldyBNdChpWzBdLGlbMV0pXSxtPSExKTptPXRoaXMudXBkYXRlVGVtcFBvaW50cyhpKSwhbSlyZXR1cm57dHlwZTpsdC5Ob25lfTtpZighYSl7Y29uc3QgeD1EYXRlLm5vdygpO3JldHVybiB4LXRoaXMuc3luY1RpbWVzdGFtcD50aGlzLnN5bmNVbml0VGltZT8odGhpcy5zeW5jVGltZXN0YW1wPXgse3R5cGU6bHQuRHJhd1dvcmssZGF0YVR5cGU6VHQuTG9jYWwsd29ya0lkOnMsb3A6dGhpcy50bXBQb2ludHMubWFwKHY9PlsuLi52LlhZLDBdKS5mbGF0KDEpLGlzU3luYzohMCxpbmRleDowfSk6e3R5cGU6bHQuTm9uZX19Y29uc3QgdT1uP3RoaXMuZnVsbExheWVyOnRoaXMuZHJhd0xheWVyfHx0aGlzLmZ1bGxMYXllcixwPXRoaXMuZHJhdyh7d29ya0lkOnMsbGF5ZXI6dSxpc0RyYXdpbmc6ITB9KSx5PU90KHAsdGhpcy5vbGRSZWN0KTtyZXR1cm4gdGhpcy5vbGRSZWN0PXAse3JlY3Q6eSx0eXBlOmx0LkRyYXdXb3JrLGRhdGFUeXBlOlR0LkxvY2FsLHdvcmtJZDpzfX1jb25zdW1lQWxsKHQpe3ZhciBjO2NvbnN0e2RhdGE6ZX09dCxuPShjPWU9PW51bGw/dm9pZCAwOmUud29ya0lkKT09bnVsbD92b2lkIDA6Yy50b1N0cmluZygpO2lmKCFuKXJldHVybnt0eXBlOmx0Lk5vbmV9O2lmKHRoaXMudG1wUG9pbnRzLmxlbmd0aDwyKXJldHVybnt0eXBlOmx0LlJlbW92ZU5vZGUscmVtb3ZlSWRzOltuXX07Y29uc3QgYT10aGlzLmZ1bGxMYXllcixzPXRoaXMuZHJhdyh7d29ya0lkOm4sbGF5ZXI6YSxpc0RyYXdpbmc6ITF9KTt0aGlzLm9sZFJlY3Q9cztjb25zdCBpPXRoaXMudG1wUG9pbnRzLm1hcChtPT5bLi4ubS5YWSwwXSkuZmxhdCgxKSxvPW5lKGkpO3JldHVybiB0aGlzLnZOb2Rlcy5zZXRJbmZvKG4se3JlY3Q6cyxvcDppLG9wdDp0aGlzLndvcmtPcHRpb25zLHRvb2xzVHlwZTp0aGlzLnRvb2xzVHlwZSxjYW5Sb3RhdGU6dGhpcy5jYW5Sb3RhdGUsc2NhbGVUeXBlOnRoaXMuc2NhbGVUeXBlLGNlbnRlclBvczpzJiZ5dC5nZXRDZW50ZXJQb3MocyxhKX0pLHtyZWN0OnMsdHlwZTpsdC5GdWxsV29yayxkYXRhVHlwZTpUdC5Mb2NhbCx3b3JrSWQ6bixvcHM6byxpc1N5bmM6ITAsb3B0OnRoaXMud29ya09wdGlvbnN9fWRyYXcodCl7dmFyIGc7Y29uc3R7d29ya0lkOmUsbGF5ZXI6bixpc0RyYXdpbmc6YX09dDt0aGlzLmZ1bGxMYXllci5nZXRFbGVtZW50c0J5TmFtZShlKS5tYXAoTT0+TS5yZW1vdmUoKSksKGc9dGhpcy5kcmF3TGF5ZXIpPT1udWxsfHxnLmdldEVsZW1lbnRzQnlOYW1lKGUpLm1hcChNPT5NLnJlbW92ZSgpKTtjb25zdHtzdHJva2VDb2xvcjpzLGZpbGxDb2xvcjppLHRoaWNrbmVzczpvLHpJbmRleDpjLHNjYWxlOm0scm90YXRlOnUsdHJhbnNsYXRlOnB9PXRoaXMud29ya09wdGlvbnMseT1uLndvcmxkUG9zaXRpb24sTz1uLndvcmxkU2NhbGluZyx7cmFkaXVzOngscmVjdDp2LHBvczpUfT10aGlzLmNvbXB1dERyYXdQb2ludHMobyksbD17cG9zOlQsbmFtZTplLGlkOmUscmFkaXVzOngsbGluZVdpZHRoOm8sZmlsbENvbG9yOmkhPT0idHJhbnNwYXJlbnQiJiZpfHx2b2lkIDAsc3Ryb2tlQ29sb3I6cyxub3JtYWxpemU6ITAsekluZGV4OmN9LGg9e3g6TWF0aC5mbG9vcih2LngqT1swXSt5WzBdLXl0LlNhZmVCb3JkZXJQYWRkaW5nKSx5Ok1hdGguZmxvb3Iodi55Kk9bMV0reVsxXS15dC5TYWZlQm9yZGVyUGFkZGluZyksdzpNYXRoLmZsb29yKHYudypPWzBdKzIqeXQuU2FmZUJvcmRlclBhZGRpbmcpLGg6TWF0aC5mbG9vcih2LmgqT1sxXSsyKnl0LlNhZmVCb3JkZXJQYWRkaW5nKX07aWYoYSl7Y29uc3R7bmFtZTpNLGlkOkEsekluZGV4OkMsc3Ryb2tlQ29sb3I6Yn09bCxFPXl0LmdldENlbnRlclBvcyhoLG4pLEw9bmV3IHJlKHtuYW1lOk0saWQ6QSx6SW5kZXg6Qyxwb3M6RSxhbmNob3I6Wy41LC41XSxzaXplOltoLncsaC5oXX0pLEQ9bmV3IHhuKHsuLi5sLHBvczpbMCwwXX0pLEk9bmV3IGhlKHtkOiJNLTQsMEg0TTAsLTRWNCIsbm9ybWFsaXplOiEwLHBvczpbMCwwXSxzdHJva2VDb2xvcjpiLGxpbmVXaWR0aDoxLHNjYWxlOlsxL09bMF0sMS9PWzFdXX0pO3JldHVybiBMLmFwcGVuZChELEkpLG4uYXBwZW5kKEwpLGh9bSYmKGwuc2NhbGU9bSksdSYmKGwucm90YXRlPXUpLHAmJihsLnRyYW5zbGF0ZT1wKTtjb25zdCBmPW5ldyB4bihsKTtpZihuLmFwcGVuZChmKSx1fHxtfHxwKXtjb25zdCBNPWYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJue3g6TWF0aC5mbG9vcihNLngteXQuU2FmZUJvcmRlclBhZGRpbmcpLHk6TWF0aC5mbG9vcihNLnkteXQuU2FmZUJvcmRlclBhZGRpbmcpLHc6TWF0aC5mbG9vcihNLndpZHRoK3l0LlNhZmVCb3JkZXJQYWRkaW5nKjIpLGg6TWF0aC5mbG9vcihNLmhlaWdodCt5dC5TYWZlQm9yZGVyUGFkZGluZyoyKX19cmV0dXJuIGh9Y29tcHV0RHJhd1BvaW50cyh0KXtjb25zdCBlPUJ0KHRoaXMudG1wUG9pbnRzKSxuPUJ0KHRoaXMudG1wUG9pbnRzLHQpLGE9W01hdGguZmxvb3IoZS54K2Uudy8yKSxNYXRoLmZsb29yKGUueStlLmgvMildO3JldHVybntyZWN0Om4scG9zOmEscmFkaXVzOltNYXRoLmZsb29yKGUudy8yKSxNYXRoLmZsb29yKGUuaC8yKV19fXVwZGF0ZVRlbXBQb2ludHModCl7Y29uc3QgZT10LnNsaWNlKC0yKSxuPW5ldyBNdChlWzBdLGVbMV0pLGE9dGhpcy50bXBQb2ludHNbMF0se3RoaWNrbmVzczpzfT10aGlzLndvcmtPcHRpb25zO2lmKGEuaXNOZWFyKG4scykpcmV0dXJuITE7aWYodGhpcy50bXBQb2ludHMubGVuZ3RoPT09Mil7aWYobi5pc05lYXIodGhpcy50bXBQb2ludHNbMV0sMSkpcmV0dXJuITE7dGhpcy50bXBQb2ludHNbMV09bn1lbHNlIHRoaXMudG1wUG9pbnRzLnB1c2gobik7cmV0dXJuITB9Y29uc3VtZVNlcnZpY2UodCl7dmFyIG87Y29uc3R7b3A6ZSxpc0Z1bGxXb3JrOm59PXQsYT0obz10aGlzLndvcmtJZCk9PW51bGw/dm9pZCAwOm8udG9TdHJpbmcoKTtpZighYSlyZXR1cm47dGhpcy50bXBQb2ludHMubGVuZ3RoPTA7Zm9yKGxldCBjPTA7YzxlLmxlbmd0aDtjKz0zKXRoaXMudG1wUG9pbnRzLnB1c2gobmV3IE10KGVbY10sZVtjKzFdLGVbYysyXSkpO2NvbnN0IHM9bj90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXIsaT10aGlzLmRyYXcoe3dvcmtJZDphLGxheWVyOnMsaXNEcmF3aW5nOiExfSk7cmV0dXJuIHRoaXMub2xkUmVjdD1pLHRoaXMudk5vZGVzLnNldEluZm8oYSx7cmVjdDppLG9wOmUsb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxzY2FsZVR5cGU6dGhpcy5zY2FsZVR5cGUsY2VudGVyUG9zOnl0LmdldENlbnRlclBvcyhpLHMpfSksaX1jbGVhclRtcFBvaW50cygpe3RoaXMudG1wUG9pbnRzLmxlbmd0aD0wfXN0YXRpYyB1cGRhdGVOb2RlT3B0KHQpe3ZhciBtLHU7Y29uc3R7bm9kZTplLG9wdDpuLHZOb2RlczphfT10LHtzdHJva2VDb2xvcjpzLGZpbGxDb2xvcjppfT1uLG89YS5nZXQoZS5uYW1lKTtsZXQgYz1lO3JldHVybiBlLnRhZ05hbWU9PT0iR1JPVVAiJiYoYz1lLmNoaWxkcmVuWzBdKSxzJiYoYy5zZXRBdHRyaWJ1dGUoInN0cm9rZUNvbG9yIixzKSwobT1vPT1udWxsP3ZvaWQgMDpvLm9wdCkhPW51bGwmJm0uc3Ryb2tlQ29sb3ImJihvLm9wdC5zdHJva2VDb2xvcj1zKSksaSYmKGk9PT0idHJhbnNwYXJlbnQiP2Muc2V0QXR0cmlidXRlKCJmaWxsQ29sb3IiLCJyZ2JhKDAsMCwwLDApIik6Yy5zZXRBdHRyaWJ1dGUoImZpbGxDb2xvciIsaSksKHU9bz09bnVsbD92b2lkIDA6by5vcHQpIT1udWxsJiZ1LmZpbGxDb2xvciYmKG8ub3B0LmZpbGxDb2xvcj1pKSksbyYmYS5zZXRJbmZvKGUubmFtZSxvKSx5dC51cGRhdGVOb2RlT3B0KHQpfX12YXIgdDA9Y2UsZTA9aWUscjA9IltvYmplY3QgQm9vbGVhbl0iO2Z1bmN0aW9uIG4wKGQpe3JldHVybiBkPT09ITB8fGQ9PT0hMXx8ZTAoZCkmJnQwKGQpPT1yMH12YXIgaTA9bjAsZ2U9WHQoaTApO2NsYXNzIFVuIGV4dGVuZHMgeXR7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7c3QodGhpcywiY2FuUm90YXRlIiwhMCk7c3QodGhpcywic2NhbGVUeXBlIixGdC5hbGwpO3N0KHRoaXMsInRvb2xzVHlwZSIsZ3QuUmVjdGFuZ2xlKTtzdCh0aGlzLCJ0bXBQb2ludHMiLFtdKTtzdCh0aGlzLCJ3b3JrT3B0aW9ucyIpO3N0KHRoaXMsIm9sZFJlY3QiKTtzdCh0aGlzLCJzeW5jVGltZXN0YW1wIik7dGhpcy53b3JrT3B0aW9ucz10LnRvb2xzT3B0LHRoaXMuc3luY1RpbWVzdGFtcD0wLHRoaXMuc3luY1VuaXRUaW1lPTUwfXRyYW5zZm9ybURhdGEoKXtjb25zdCB0PUJ0KHRoaXMudG1wUG9pbnRzKTtyZXR1cm5bW3QueCx0LnksMF0sW3QueCt0LncsdC55LDBdLFt0LngrdC53LHQueSt0LmgsMF0sW3QueCx0LnkrdC5oLDBdXX1jb21wdXREcmF3UG9pbnRzKHQpe2NvbnN0e3RoaWNrbmVzczplfT10aGlzLndvcmtPcHRpb25zLG49W107Zm9yKGNvbnN0IGkgb2YgdCluLnB1c2gobmV3IGV0KC4uLmkpKTtjb25zdCBhPUJ0KG4sZSkscz1bYS54K2Eudy8yLGEueSthLmgvMl07cmV0dXJue3JlY3Q6YSxwb3M6cyxwb2ludHM6bi5tYXAoaT0+aS5YWSkuZmxhdCgxKX19Y29uc3VtZSh0KXt2YXIgeDtjb25zdHtkYXRhOmUsaXNGdWxsV29yazpuLGlzU3ViV29ya2VyOmF9PXQscz0oeD1lPT1udWxsP3ZvaWQgMDplLndvcmtJZCk9PW51bGw/dm9pZCAwOngudG9TdHJpbmcoKTtpZighcylyZXR1cm57dHlwZTpsdC5Ob25lfTtjb25zdHtvcDppLHdvcmtTdGF0ZTpvfT1lLGM9aT09bnVsbD92b2lkIDA6aS5sZW5ndGg7aWYoIWN8fGM8MilyZXR1cm57dHlwZTpsdC5Ob25lfTtsZXQgbTtpZihvPT09SXQuU3RhcnQ/KHRoaXMudG1wUG9pbnRzPVtuZXcgTXQoaVswXSxpWzFdKV0sbT0hMSk6bT10aGlzLnVwZGF0ZVRlbXBQb2ludHMoaSksIW0pcmV0dXJue3R5cGU6bHQuTm9uZX07Y29uc3QgdT10aGlzLnRyYW5zZm9ybURhdGEoKTtpZighYSl7Y29uc3Qgdj1EYXRlLm5vdygpO3JldHVybiB2LXRoaXMuc3luY1RpbWVzdGFtcD50aGlzLnN5bmNVbml0VGltZT8odGhpcy5zeW5jVGltZXN0YW1wPXYse3R5cGU6bHQuRHJhd1dvcmssZGF0YVR5cGU6VHQuTG9jYWwsd29ya0lkOnMsb3A6dS5mbGF0KDEpLGlzU3luYzohMCxpbmRleDowfSk6e3R5cGU6bHQuTm9uZX19Y29uc3QgcD1uP3RoaXMuZnVsbExheWVyOnRoaXMuZHJhd0xheWVyfHx0aGlzLmZ1bGxMYXllcix5PXRoaXMuZHJhdyh7cHM6dSx3b3JrSWQ6cyxsYXllcjpwLGlzRHJhd2luZzohMH0pLE89T3QoeSx0aGlzLm9sZFJlY3QpO3JldHVybiB0aGlzLm9sZFJlY3Q9eSx7cmVjdDpPLHR5cGU6bHQuRHJhd1dvcmssZGF0YVR5cGU6VHQuTG9jYWwsd29ya0lkOnN9fWNvbnN1bWVBbGwodCl7dmFyIG07Y29uc3R7ZGF0YTplfT10LG49KG09ZT09bnVsbD92b2lkIDA6ZS53b3JrSWQpPT1udWxsP3ZvaWQgMDptLnRvU3RyaW5nKCk7aWYoIW4pcmV0dXJue3R5cGU6bHQuTm9uZX07aWYodGhpcy50bXBQb2ludHMubGVuZ3RoPDIpcmV0dXJue3R5cGU6bHQuUmVtb3ZlTm9kZSxyZW1vdmVJZHM6W25dfTtjb25zdCBhPXRoaXMudHJhbnNmb3JtRGF0YSgpLHM9dGhpcy5mdWxsTGF5ZXIsaT10aGlzLmRyYXcoe3BzOmEsd29ya0lkOm4sbGF5ZXI6cyxpc0RyYXdpbmc6ITF9KTt0aGlzLm9sZFJlY3Q9aTtjb25zdCBvPWEuZmxhdCgxKSxjPW5lKG8pO3JldHVybiB0aGlzLnZOb2Rlcy5zZXRJbmZvKG4se3JlY3Q6aSxvcDpvLG9wdDp0aGlzLndvcmtPcHRpb25zLHRvb2xzVHlwZTp0aGlzLnRvb2xzVHlwZSxzY2FsZVR5cGU6dGhpcy5zY2FsZVR5cGUsY2FuUm90YXRlOnRoaXMuY2FuUm90YXRlLGNlbnRlclBvczppJiZ5dC5nZXRDZW50ZXJQb3MoaSxzKX0pLHtyZWN0OmksdHlwZTpsdC5GdWxsV29yayxkYXRhVHlwZTpUdC5Mb2NhbCx3b3JrSWQ6bixvcHM6YyxvcHQ6dGhpcy53b3JrT3B0aW9ucyxpc1N5bmM6ITB9fWRyYXcodCl7dmFyIGI7Y29uc3R7d29ya0lkOmUsbGF5ZXI6bixpc0RyYXdpbmc6YSxwczpzLHJlcGxhY2VJZDppfT10O3RoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKGl8fGUpLm1hcChFPT5FLnJlbW92ZSgpKSwoYj10aGlzLmRyYXdMYXllcik9PW51bGx8fGIuZ2V0RWxlbWVudHNCeU5hbWUoaXx8ZSkubWFwKEU9PkUucmVtb3ZlKCkpO2NvbnN0e3N0cm9rZUNvbG9yOm8sZmlsbENvbG9yOmMsdGhpY2tuZXNzOm0sekluZGV4OnUsc2NhbGU6cCxyb3RhdGU6eSx0cmFuc2xhdGU6Tyx0ZXh0T3B0Onh9PXRoaXMud29ya09wdGlvbnMsdj1uLndvcmxkUG9zaXRpb24sVD1uLndvcmxkU2NhbGluZyx7cG9pbnRzOmwscmVjdDpoLHBvczpmfT10aGlzLmNvbXB1dERyYXdQb2ludHMocyksZz17Y2xvc2U6ITAsbm9ybWFsaXplOiEwLHBvaW50czpsLGxpbmVXaWR0aDptLGZpbGxDb2xvcjpjIT09InRyYW5zcGFyZW50IiYmY3x8dm9pZCAwLHN0cm9rZUNvbG9yOm8sbGluZUpvaW46InJvdW5kIn0sTT17eDpNYXRoLmZsb29yKGgueCpUWzBdK3ZbMF0teXQuU2FmZUJvcmRlclBhZGRpbmcpLHk6TWF0aC5mbG9vcihoLnkqVFsxXSt2WzFdLXl0LlNhZmVCb3JkZXJQYWRkaW5nKSx3Ok1hdGguZmxvb3IoaC53KlRbMF0rMip5dC5TYWZlQm9yZGVyUGFkZGluZyksaDpNYXRoLmZsb29yKGguaCpUWzBdKzIqeXQuU2FmZUJvcmRlclBhZGRpbmcpfSxBPW5ldyByZSh7bmFtZTplLGlkOmUsekluZGV4OnUscG9zOmYsYW5jaG9yOlsuNSwuNV0sc2l6ZTpbaC53LGguaF0sc2NhbGU6cCxyb3RhdGU6eSx0cmFuc2xhdGU6T30pLEM9bmV3IGRlKHsuLi5nLHBvczpbMCwwXX0pO2lmKEEuYXBwZW5kQ2hpbGQoQyksYSl7Y29uc3QgRT1uZXcgaGUoe2Q6Ik0tNCwwSDRNMCwtNFY0Iixub3JtYWxpemU6ITAscG9zOlswLDBdLHN0cm9rZUNvbG9yOm8sbGluZVdpZHRoOjEsc2NhbGU6WzEvVFswXSwxL1RbMV1dfSk7QS5hcHBlbmRDaGlsZChFKX1pZihuLmFwcGVuZChBKSxwfHx5fHxPKXtjb25zdCBFPUEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJue3g6TWF0aC5mbG9vcihFLngteXQuU2FmZUJvcmRlclBhZGRpbmcpLHk6TWF0aC5mbG9vcihFLnkteXQuU2FmZUJvcmRlclBhZGRpbmcpLHc6TWF0aC5mbG9vcihFLndpZHRoKzIqeXQuU2FmZUJvcmRlclBhZGRpbmcpLGg6TWF0aC5mbG9vcihFLmhlaWdodCsyKnl0LlNhZmVCb3JkZXJQYWRkaW5nKX19cmV0dXJuIE19dXBkYXRlVGVtcFBvaW50cyh0KXtjb25zdCBlPXQuc2xpY2UoLTIpLG49bmV3IE10KGVbMF0sZVsxXSksYT10aGlzLnRtcFBvaW50c1swXSx7dGhpY2tuZXNzOnN9PXRoaXMud29ya09wdGlvbnM7aWYoYS5pc05lYXIobixzKSlyZXR1cm4hMTtpZih0aGlzLnRtcFBvaW50cy5sZW5ndGg9PT0yKXtpZihuLmlzTmVhcih0aGlzLnRtcFBvaW50c1sxXSwxKSlyZXR1cm4hMTt0aGlzLnRtcFBvaW50c1sxXT1ufWVsc2UgdGhpcy50bXBQb2ludHMucHVzaChuKTtyZXR1cm4hMH1jb25zdW1lU2VydmljZSh0KXt2YXIgbTtjb25zdHtvcDplLGlzRnVsbFdvcms6bixyZXBsYWNlSWQ6YX09dCxzPShtPXRoaXMud29ya0lkKT09bnVsbD92b2lkIDA6bS50b1N0cmluZygpO2lmKCFzKXJldHVybjtjb25zdCBpPVtdO2ZvcihsZXQgdT0wO3U8ZS5sZW5ndGg7dSs9MylpLnB1c2goW2VbdV0sZVt1KzFdLGVbdSsyXV0pO2NvbnN0IG89bj90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXIsYz10aGlzLmRyYXcoe3BzOmksd29ya0lkOnMsbGF5ZXI6byxpc0RyYXdpbmc6ITEscmVwbGFjZUlkOmF9KTtyZXR1cm4gdGhpcy5vbGRSZWN0PWMsdGhpcy52Tm9kZXMuc2V0SW5mbyhzLHtyZWN0OmMsb3A6ZSxvcHQ6dGhpcy53b3JrT3B0aW9ucyx0b29sc1R5cGU6dGhpcy50b29sc1R5cGUsc2NhbGVUeXBlOnRoaXMuc2NhbGVUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxjZW50ZXJQb3M6YyYmeXQuZ2V0Q2VudGVyUG9zKGMsbyl9KSxjfWNsZWFyVG1wUG9pbnRzKCl7dGhpcy50bXBQb2ludHMubGVuZ3RoPTB9c3RhdGljIHVwZGF0ZU5vZGVPcHQodCl7dmFyIFQsbDtjb25zdHtub2RlOmUsb3B0Om4sdk5vZGVzOmF9PXQse3N0cm9rZUNvbG9yOnMsZmlsbENvbG9yOmksZm9udENvbG9yOm8sZm9udEJnQ29sb3I6Yyxib2xkOm0saXRhbGljOnUsbGluZVRocm91Z2g6cCx1bmRlcmxpbmU6eSxmb250U2l6ZTpPfT1uLHg9YS5nZXQoZS5uYW1lKTtsZXQgdj1lO2lmKGUudGFnTmFtZT09PSJHUk9VUCImJih2PWUuY2hpbGRyZW5bMF0pLHMmJih2LnNldEF0dHJpYnV0ZSgic3Ryb2tlQ29sb3IiLHMpLChUPXg9PW51bGw/dm9pZCAwOngub3B0KSE9bnVsbCYmVC5zdHJva2VDb2xvciYmKHgub3B0LnN0cm9rZUNvbG9yPXMpKSxpJiYoaT09PSJ0cmFuc3BhcmVudCI/di5zZXRBdHRyaWJ1dGUoImZpbGxDb2xvciIsInJnYmEoMCwwLDAsMCkiKTp2LnNldEF0dHJpYnV0ZSgiZmlsbENvbG9yIixpKSwobD14PT1udWxsP3ZvaWQgMDp4Lm9wdCkhPW51bGwmJmwuZmlsbENvbG9yJiYoeC5vcHQuZmlsbENvbG9yPWkpKSx4IT1udWxsJiZ4Lm9wdC50ZXh0T3B0KXtjb25zdCBoPXgub3B0LnRleHRPcHQ7byYmaC5mb250Q29sb3ImJihoLmZvbnRDb2xvcj1vKSxjJiZoLmZvbnRCZ0NvbG9yJiYoaC5mb250QmdDb2xvcj1jKSxtJiYoaC5ib2xkPW0pLHUmJihoLml0YWxpYz11KSxnZShwKSYmKGgubGluZVRocm91Z2g9cCksZ2UoeSkmJihoLnVuZGVybGluZT15KSxPJiYoaC5mb250U2l6ZT1PKX1yZXR1cm4geCYmYS5zZXRJbmZvKGUubmFtZSx4KSx5dC51cGRhdGVOb2RlT3B0KHQpfX1jbGFzcyAkbiBleHRlbmRzIHl0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO3N0KHRoaXMsImNhblJvdGF0ZSIsITEpO3N0KHRoaXMsInNjYWxlVHlwZSIsRnQuYWxsKTtzdCh0aGlzLCJ0b29sc1R5cGUiLGd0LlN0YXIpO3N0KHRoaXMsInRtcFBvaW50cyIsW10pO3N0KHRoaXMsIndvcmtPcHRpb25zIik7c3QodGhpcywib2xkUmVjdCIpO3N0KHRoaXMsInN5bmNUaW1lc3RhbXAiKTt0aGlzLndvcmtPcHRpb25zPXQudG9vbHNPcHQsdGhpcy5zeW5jVGltZXN0YW1wPTAsdGhpcy5zeW5jVW5pdFRpbWU9NTB9Y29uc3VtZSh0KXt2YXIgTztjb25zdHtkYXRhOmUsaXNGdWxsV29yazpuLGlzU3ViV29ya2VyOmF9PXQscz0oTz1lPT1udWxsP3ZvaWQgMDplLndvcmtJZCk9PW51bGw/dm9pZCAwOk8udG9TdHJpbmcoKTtpZighcylyZXR1cm57dHlwZTpsdC5Ob25lfTtjb25zdHtvcDppLHdvcmtTdGF0ZTpvfT1lLGM9aT09bnVsbD92b2lkIDA6aS5sZW5ndGg7aWYoIWN8fGM8MilyZXR1cm57dHlwZTpsdC5Ob25lfTtsZXQgbTtpZihvPT09SXQuU3RhcnQ/KHRoaXMudG1wUG9pbnRzPVtuZXcgTXQoaVswXSxpWzFdKV0sbT0hMSk6bT10aGlzLnVwZGF0ZVRlbXBQb2ludHMoaSksIW0pcmV0dXJue3R5cGU6bHQuTm9uZX07aWYoIWEpe2NvbnN0IHg9RGF0ZS5ub3coKTtyZXR1cm4geC10aGlzLnN5bmNUaW1lc3RhbXA+dGhpcy5zeW5jVW5pdFRpbWU/KHRoaXMuc3luY1RpbWVzdGFtcD14LHt0eXBlOmx0LkRyYXdXb3JrLGRhdGFUeXBlOlR0LkxvY2FsLHdvcmtJZDpzLG9wOnRoaXMudG1wUG9pbnRzLm1hcCh2PT5bLi4udi5YWSwwXSkuZmxhdCgxKSxpc1N5bmM6ITAsaW5kZXg6MH0pOnt0eXBlOmx0Lk5vbmV9fWNvbnN0IHU9bj90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXIscD10aGlzLmRyYXcoe3dvcmtJZDpzLGxheWVyOnUsaXNEcmF3aW5nOiEwfSkseT1PdChwLHRoaXMub2xkUmVjdCk7cmV0dXJuIHRoaXMub2xkUmVjdD1wLHtyZWN0OnksdHlwZTpsdC5EcmF3V29yayxkYXRhVHlwZTpUdC5Mb2NhbCx3b3JrSWQ6c319Y29uc3VtZUFsbCh0KXt2YXIgYztjb25zdHtkYXRhOmV9PXQsbj0oYz1lPT1udWxsP3ZvaWQgMDplLndvcmtJZCk9PW51bGw/dm9pZCAwOmMudG9TdHJpbmcoKTtpZighbilyZXR1cm57dHlwZTpsdC5Ob25lfTtpZih0aGlzLnRtcFBvaW50cy5sZW5ndGg8MilyZXR1cm57dHlwZTpsdC5SZW1vdmVOb2RlLHJlbW92ZUlkczpbbl19O2NvbnN0IGE9dGhpcy5mdWxsTGF5ZXIscz10aGlzLmRyYXcoe3dvcmtJZDpuLGxheWVyOmEsaXNEcmF3aW5nOiExfSk7dGhpcy5vbGRSZWN0PXM7Y29uc3QgaT10aGlzLnRtcFBvaW50cy5tYXAobT0+Wy4uLm0uWFksMF0pLmZsYXQoMSksbz1uZShpKTtyZXR1cm4gdGhpcy52Tm9kZXMuc2V0SW5mbyhuLHtyZWN0OnMsb3A6aSxvcHQ6dGhpcy53b3JrT3B0aW9ucyx0b29sc1R5cGU6dGhpcy50b29sc1R5cGUsc2NhbGVUeXBlOnRoaXMuc2NhbGVUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxjZW50ZXJQb3M6cyYmeXQuZ2V0Q2VudGVyUG9zKHMsYSl9KSx7cmVjdDpzLHR5cGU6bHQuRnVsbFdvcmssZGF0YVR5cGU6VHQuTG9jYWwsd29ya0lkOm4sb3BzOm8saXNTeW5jOiEwLG9wdDp0aGlzLndvcmtPcHRpb25zfX1kcmF3KHQpe3ZhciBiO2NvbnN0e3dvcmtJZDplLGxheWVyOm4saXNEcmF3aW5nOmF9PXQ7dGhpcy5mdWxsTGF5ZXIuZ2V0RWxlbWVudHNCeU5hbWUoZSkubWFwKEU9PkUucmVtb3ZlKCkpLChiPXRoaXMuZHJhd0xheWVyKT09bnVsbHx8Yi5nZXRFbGVtZW50c0J5TmFtZShlKS5tYXAoRT0+RS5yZW1vdmUoKSk7Y29uc3R7c3Ryb2tlQ29sb3I6cyxmaWxsQ29sb3I6aSx0aGlja25lc3M6byx6SW5kZXg6Yyx2ZXJ0aWNlczptLGlubmVyVmVydGljZVN0ZXA6dSxpbm5lclJhdGlvOnAsc2NhbGU6eSxyb3RhdGU6Tyx0cmFuc2xhdGU6eH09dGhpcy53b3JrT3B0aW9ucyx2PW4ud29ybGRTY2FsaW5nLHtyZWN0OlQscG9zOmwscG9pbnRzOmh9PXRoaXMuY29tcHV0RHJhd1BvaW50cyhvLG0sdSxwKSxmPXtjbG9zZTohMCxwb2ludHM6aCxsaW5lV2lkdGg6byxmaWxsQ29sb3I6aSE9PSJ0cmFuc3BhcmVudCImJml8fHZvaWQgMCxzdHJva2VDb2xvcjpzLG5vcm1hbGl6ZTohMCxsaW5lSm9pbjoicm91bmQifSxnPXtuYW1lOmUsaWQ6ZSx6SW5kZXg6Yyxwb3M6bCxhbmNob3I6Wy41LC41XSxzaXplOltULncsVC5oXSxjbGFzc05hbWU6YCR7bFswXX0sJHtsWzFdfWB9O3kmJihnLnNjYWxlPXkpLE8mJihnLnJvdGF0ZT1PKSx4JiYoZy50cmFuc2xhdGU9eCk7Y29uc3QgTT1uZXcgcmUoZyk7aWYoYSl7Y29uc3QgRT1uZXcgaGUoe2Q6Ik0tNCwwSDRNMCwtNFY0Iixub3JtYWxpemU6ITAscG9zOlswLDBdLHN0cm9rZUNvbG9yOnMsbGluZVdpZHRoOjEsc2NhbGU6WzEvdlswXSwxL3ZbMV1dfSk7TS5hcHBlbmQoRSl9Y29uc3QgQT1uZXcgZGUoey4uLmYscG9zOlswLDBdfSk7TS5hcHBlbmQoQSksbi5hcHBlbmQoTSk7Y29uc3QgQz1NLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybnt4Ok1hdGguZmxvb3IoQy54LXl0LlNhZmVCb3JkZXJQYWRkaW5nKSx5Ok1hdGguZmxvb3IoQy55LXl0LlNhZmVCb3JkZXJQYWRkaW5nKSx3Ok1hdGguZmxvb3IoQy53aWR0aCt5dC5TYWZlQm9yZGVyUGFkZGluZyoyKSxoOk1hdGguZmxvb3IoQy5oZWlnaHQreXQuU2FmZUJvcmRlclBhZGRpbmcqMil9fWNvbXB1dERyYXdQb2ludHModCxlLG4sYSl7Y29uc3Qgcz1CdCh0aGlzLnRtcFBvaW50cyksaT1bTWF0aC5mbG9vcihzLngrcy53LzIpLE1hdGguZmxvb3Iocy55K3MuaC8yKV0sbz1TbihzLncscy5oKSxjPU1hdGguZmxvb3IoTWF0aC5taW4ocy53LHMuaCkvMiksbT1hKmMsdT1bXSxwPTIqTWF0aC5QSS9lO2ZvcihsZXQgTz0wO088ZTtPKyspe2NvbnN0IHg9TypwLS41Kk1hdGguUEk7bGV0IHYsVDtPJW49PT0xPyh2PW0qb1swXSpNYXRoLmNvcyh4KSxUPW0qb1sxXSpNYXRoLnNpbih4KSk6KHY9YypvWzBdKk1hdGguY29zKHgpLFQ9YypvWzFdKk1hdGguc2luKHgpLHUucHVzaCh2LFQpKSx1LnB1c2godixUKX1yZXR1cm57cmVjdDpCdCh0aGlzLnRtcFBvaW50cyx0KSxwb3M6aSxwb2ludHM6dX19dXBkYXRlVGVtcFBvaW50cyh0KXtjb25zdCBlPXQuc2xpY2UoLTIpLG49bmV3IE10KGVbMF0sZVsxXSksYT10aGlzLnRtcFBvaW50c1swXSx7dGhpY2tuZXNzOnN9PXRoaXMud29ya09wdGlvbnM7aWYoYS5pc05lYXIobixzKXx8TXQuU3ViKGEsbikuWFkuaW5jbHVkZXMoMCkpcmV0dXJuITE7aWYodGhpcy50bXBQb2ludHMubGVuZ3RoPT09Mil7aWYobi5pc05lYXIodGhpcy50bXBQb2ludHNbMV0sMSkpcmV0dXJuITE7dGhpcy50bXBQb2ludHNbMV09bn1lbHNlIHRoaXMudG1wUG9pbnRzLnB1c2gobik7cmV0dXJuITB9Y29uc3VtZVNlcnZpY2UodCl7dmFyIG87Y29uc3R7b3A6ZSxpc0Z1bGxXb3JrOm59PXQsYT0obz10aGlzLndvcmtJZCk9PW51bGw/dm9pZCAwOm8udG9TdHJpbmcoKTtpZighYSlyZXR1cm47dGhpcy50bXBQb2ludHMubGVuZ3RoPTA7Zm9yKGxldCBjPTA7YzxlLmxlbmd0aDtjKz0zKXRoaXMudG1wUG9pbnRzLnB1c2gobmV3IE10KGVbY10sZVtjKzFdLGVbYysyXSkpO2NvbnN0IHM9bj90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXIsaT10aGlzLmRyYXcoe3dvcmtJZDphLGxheWVyOnMsaXNEcmF3aW5nOiExfSk7cmV0dXJuIHRoaXMub2xkUmVjdD1pLHRoaXMudk5vZGVzLnNldEluZm8oYSx7cmVjdDppLG9wOmUsb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLHNjYWxlVHlwZTp0aGlzLnNjYWxlVHlwZSxjYW5Sb3RhdGU6dGhpcy5jYW5Sb3RhdGUsY2VudGVyUG9zOmkmJnl0LmdldENlbnRlclBvcyhpLHMpfSksaX1jbGVhclRtcFBvaW50cygpe3RoaXMudG1wUG9pbnRzLmxlbmd0aD0wfXN0YXRpYyB1cGRhdGVOb2RlT3B0KHQpe2NvbnN0e25vZGU6ZSxvcHQ6bix2Tm9kZXM6YX09dCx7c3Ryb2tlQ29sb3I6cyxmaWxsQ29sb3I6aSx0b29sc1R5cGU6byx2ZXJ0aWNlczpjLGlubmVyVmVydGljZVN0ZXA6bSxpbm5lclJhdGlvOnV9PW4scD1hLmdldChlLm5hbWUpLHk9cD09bnVsbD92b2lkIDA6cC5vcHQ7bGV0IE89ZTtyZXR1cm4gZS50YWdOYW1lPT09IkdST1VQIiYmKE89ZS5jaGlsZHJlblswXSkscyYmKE8uc2V0QXR0cmlidXRlKCJzdHJva2VDb2xvciIscykseSE9bnVsbCYmeS5zdHJva2VDb2xvciYmKHkuc3Ryb2tlQ29sb3I9cykpLGkmJihpPT09InRyYW5zcGFyZW50Ij9PLnNldEF0dHJpYnV0ZSgiZmlsbENvbG9yIiwicmdiYSgwLDAsMCwwKSIpOk8uc2V0QXR0cmlidXRlKCJmaWxsQ29sb3IiLGkpLHkhPW51bGwmJnkuZmlsbENvbG9yJiYoeS5maWxsQ29sb3I9aSkpLG89PT1ndC5TdGFyJiYoYyYmKHkudmVydGljZXM9YyksbSYmKHkuaW5uZXJWZXJ0aWNlU3RlcD1tKSx1JiYoeS5pbm5lclJhdGlvPXUpKSxwJiZhLnNldEluZm8oZS5uYW1lLHsuLi5wLG9wdDp5fSkseXQudXBkYXRlTm9kZU9wdCh0KX19Y2xhc3Mgem4gZXh0ZW5kcyB5dHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KTtzdCh0aGlzLCJjYW5Sb3RhdGUiLCExKTtzdCh0aGlzLCJzY2FsZVR5cGUiLEZ0LmFsbCk7c3QodGhpcywidG9vbHNUeXBlIixndC5Qb2x5Z29uKTtzdCh0aGlzLCJ0bXBQb2ludHMiLFtdKTtzdCh0aGlzLCJ3b3JrT3B0aW9ucyIpO3N0KHRoaXMsIm9sZFJlY3QiKTtzdCh0aGlzLCJzeW5jVGltZXN0YW1wIik7dGhpcy53b3JrT3B0aW9ucz10LnRvb2xzT3B0LHRoaXMuc3luY1RpbWVzdGFtcD0wLHRoaXMuc3luY1VuaXRUaW1lPTUwfWNvbnN1bWUodCl7dmFyIE87Y29uc3R7ZGF0YTplLGlzRnVsbFdvcms6bixpc1N1YldvcmtlcjphfT10LHM9KE89ZT09bnVsbD92b2lkIDA6ZS53b3JrSWQpPT1udWxsP3ZvaWQgMDpPLnRvU3RyaW5nKCk7aWYoIXMpcmV0dXJue3R5cGU6bHQuTm9uZX07Y29uc3R7b3A6aSx3b3JrU3RhdGU6b309ZSxjPWk9PW51bGw/dm9pZCAwOmkubGVuZ3RoO2lmKCFjfHxjPDIpcmV0dXJue3R5cGU6bHQuTm9uZX07bGV0IG07aWYobz09PUl0LlN0YXJ0Pyh0aGlzLnRtcFBvaW50cz1bbmV3IE10KGlbMF0saVsxXSldLG09ITEpOm09dGhpcy51cGRhdGVUZW1wUG9pbnRzKGkpLCFtKXJldHVybnt0eXBlOmx0Lk5vbmV9O2lmKCFhKXtjb25zdCB4PURhdGUubm93KCk7cmV0dXJuIHgtdGhpcy5zeW5jVGltZXN0YW1wPnRoaXMuc3luY1VuaXRUaW1lPyh0aGlzLnN5bmNUaW1lc3RhbXA9eCx7dHlwZTpsdC5EcmF3V29yayxkYXRhVHlwZTpUdC5Mb2NhbCx3b3JrSWQ6cyxvcDp0aGlzLnRtcFBvaW50cy5tYXAodj0+Wy4uLnYuWFksMF0pLmZsYXQoMSksaXNTeW5jOiEwLGluZGV4OjB9KTp7dHlwZTpsdC5Ob25lfX1jb25zdCB1PW4/dGhpcy5mdWxsTGF5ZXI6dGhpcy5kcmF3TGF5ZXJ8fHRoaXMuZnVsbExheWVyLHA9dGhpcy5kcmF3KHt3b3JrSWQ6cyxsYXllcjp1LGlzRHJhd2luZzohMH0pLHk9T3QocCx0aGlzLm9sZFJlY3QpO3JldHVybiB0aGlzLm9sZFJlY3Q9cCx7cmVjdDp5LHR5cGU6bHQuRHJhd1dvcmssZGF0YVR5cGU6VHQuTG9jYWwsd29ya0lkOnN9fWNvbnN1bWVBbGwodCl7dmFyIGM7Y29uc3R7ZGF0YTplfT10LG49KGM9ZT09bnVsbD92b2lkIDA6ZS53b3JrSWQpPT1udWxsP3ZvaWQgMDpjLnRvU3RyaW5nKCk7aWYoIW4pcmV0dXJue3R5cGU6bHQuTm9uZX07aWYodGhpcy50bXBQb2ludHMubGVuZ3RoPDIpcmV0dXJue3R5cGU6bHQuUmVtb3ZlTm9kZSxyZW1vdmVJZHM6W25dfTtjb25zdCBhPXRoaXMuZnVsbExheWVyLHM9dGhpcy5kcmF3KHt3b3JrSWQ6bixsYXllcjphLGlzRHJhd2luZzohMX0pO3RoaXMub2xkUmVjdD1zO2NvbnN0IGk9dGhpcy50bXBQb2ludHMubWFwKG09PlsuLi5tLlhZLDBdKS5mbGF0KDEpLG89bmUoaSk7cmV0dXJuIHRoaXMudk5vZGVzLnNldEluZm8obix7cmVjdDpzLG9wOmksb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLHNjYWxlVHlwZTp0aGlzLnNjYWxlVHlwZSxjYW5Sb3RhdGU6dGhpcy5jYW5Sb3RhdGUsY2VudGVyUG9zOnMmJnl0LmdldENlbnRlclBvcyhzLGEpfSkse3JlY3Q6cyx0eXBlOmx0LkZ1bGxXb3JrLGRhdGFUeXBlOlR0LkxvY2FsLHdvcmtJZDpuLG9wczpvLGlzU3luYzohMCxvcHQ6dGhpcy53b3JrT3B0aW9uc319ZHJhdyh0KXt2YXIgQTtjb25zdHt3b3JrSWQ6ZSxsYXllcjpuLGlzRHJhd2luZzphfT10O3RoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKGUpLm1hcChDPT5DLnJlbW92ZSgpKSwoQT10aGlzLmRyYXdMYXllcik9PW51bGx8fEEuZ2V0RWxlbWVudHNCeU5hbWUoZSkubWFwKEM9PkMucmVtb3ZlKCkpO2NvbnN0e3N0cm9rZUNvbG9yOnMsZmlsbENvbG9yOmksdGhpY2tuZXNzOm8sekluZGV4OmMsdmVydGljZXM6bSxzY2FsZTp1LHJvdGF0ZTpwLHRyYW5zbGF0ZTp5fT10aGlzLndvcmtPcHRpb25zLE89bi53b3JsZFNjYWxpbmcse3JlY3Q6eCxwb3M6dixwb2ludHM6VH09dGhpcy5jb21wdXREcmF3UG9pbnRzKG8sbSksbD17Y2xvc2U6ITAscG9pbnRzOlQsbGluZVdpZHRoOm8sZmlsbENvbG9yOmkhPT0idHJhbnNwYXJlbnQiJiZpfHx2b2lkIDAsc3Ryb2tlQ29sb3I6cyxub3JtYWxpemU6ITAsbGluZUpvaW46InJvdW5kIn0saD17bmFtZTplLGlkOmUsekluZGV4OmMscG9zOnYsYW5jaG9yOlsuNSwuNV0sc2l6ZTpbeC53LHguaF19O3UmJihoLnNjYWxlPXUpLHAmJihoLnJvdGF0ZT1wKSx5JiYoaC50cmFuc2xhdGU9eSk7Y29uc3QgZj1uZXcgcmUoaCk7aWYoYSl7Y29uc3QgQz1uZXcgaGUoe2Q6Ik0tNCwwSDRNMCwtNFY0Iixub3JtYWxpemU6ITAscG9zOlswLDBdLHN0cm9rZUNvbG9yOnMsbGluZVdpZHRoOjEsc2NhbGU6WzEvT1swXSwxL09bMV1dfSk7Zi5hcHBlbmQoQyl9Y29uc3QgZz1uZXcgZGUoey4uLmwscG9zOlswLDBdfSk7Zi5hcHBlbmQoZyksbi5hcHBlbmQoZik7Y29uc3QgTT1mLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybnt4Ok1hdGguZmxvb3IoTS54LXl0LlNhZmVCb3JkZXJQYWRkaW5nKSx5Ok1hdGguZmxvb3IoTS55LXl0LlNhZmVCb3JkZXJQYWRkaW5nKSx3Ok1hdGguZmxvb3IoTS53aWR0aCt5dC5TYWZlQm9yZGVyUGFkZGluZyoyKSxoOk1hdGguZmxvb3IoTS5oZWlnaHQreXQuU2FmZUJvcmRlclBhZGRpbmcqMil9fWNvbXB1dERyYXdQb2ludHModCxlKXtjb25zdCBuPUJ0KHRoaXMudG1wUG9pbnRzKSxhPVtNYXRoLmZsb29yKG4ueCtuLncvMiksTWF0aC5mbG9vcihuLnkrbi5oLzIpXSxzPVNuKG4udyxuLmgpLGk9TWF0aC5mbG9vcihNYXRoLm1pbihuLncsbi5oKS8yKSxvPVtdLGM9MipNYXRoLlBJL2U7Zm9yKGxldCB1PTA7dTxlO3UrKyl7Y29uc3QgcD11KmMtLjUqTWF0aC5QSSx5PWkqc1swXSpNYXRoLmNvcyhwKSxPPWkqc1sxXSpNYXRoLnNpbihwKTtvLnB1c2goeSxPKX1yZXR1cm57cmVjdDpCdCh0aGlzLnRtcFBvaW50cyx0KSxwb3M6YSxwb2ludHM6b319dXBkYXRlVGVtcFBvaW50cyh0KXtjb25zdCBlPXQuc2xpY2UoLTIpLG49bmV3IE10KGVbMF0sZVsxXSksYT10aGlzLnRtcFBvaW50c1swXSx7dGhpY2tuZXNzOnN9PXRoaXMud29ya09wdGlvbnM7aWYoYS5pc05lYXIobixzKXx8TXQuU3ViKGEsbikuWFkuaW5jbHVkZXMoMCkpcmV0dXJuITE7aWYodGhpcy50bXBQb2ludHMubGVuZ3RoPT09Mil7aWYobi5pc05lYXIodGhpcy50bXBQb2ludHNbMV0sMSkpcmV0dXJuITE7dGhpcy50bXBQb2ludHNbMV09bn1lbHNlIHRoaXMudG1wUG9pbnRzLnB1c2gobik7cmV0dXJuITB9Y29uc3VtZVNlcnZpY2UodCl7dmFyIG87Y29uc3R7b3A6ZSxpc0Z1bGxXb3JrOm59PXQsYT0obz10aGlzLndvcmtJZCk9PW51bGw/dm9pZCAwOm8udG9TdHJpbmcoKTtpZighYSlyZXR1cm47dGhpcy50bXBQb2ludHMubGVuZ3RoPTA7Zm9yKGxldCBjPTA7YzxlLmxlbmd0aDtjKz0zKXRoaXMudG1wUG9pbnRzLnB1c2gobmV3IE10KGVbY10sZVtjKzFdLGVbYysyXSkpO2NvbnN0IHM9bj90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXIsaT10aGlzLmRyYXcoe3dvcmtJZDphLGxheWVyOnMsaXNEcmF3aW5nOiExfSk7cmV0dXJuIHRoaXMub2xkUmVjdD1pLHRoaXMudk5vZGVzLnNldEluZm8oYSx7cmVjdDppLG9wOmUsb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLHNjYWxlVHlwZTp0aGlzLnNjYWxlVHlwZSxjYW5Sb3RhdGU6dGhpcy5jYW5Sb3RhdGUsY2VudGVyUG9zOmkmJnl0LmdldENlbnRlclBvcyhpLHMpfSksaX1jbGVhclRtcFBvaW50cygpe3RoaXMudG1wUG9pbnRzLmxlbmd0aD0wfXN0YXRpYyB1cGRhdGVOb2RlT3B0KHQpe2NvbnN0e25vZGU6ZSxvcHQ6bix2Tm9kZXM6YX09dCx7c3Ryb2tlQ29sb3I6cyxmaWxsQ29sb3I6aSx0b29sc1R5cGU6byx2ZXJ0aWNlczpjfT1uLG09YS5nZXQoZS5uYW1lKSx1PW09PW51bGw/dm9pZCAwOm0ub3B0O2xldCBwPWU7cmV0dXJuIGUudGFnTmFtZT09PSJHUk9VUCImJihwPWUuY2hpbGRyZW5bMF0pLHMmJihwLnNldEF0dHJpYnV0ZSgic3Ryb2tlQ29sb3IiLHMpLHUhPW51bGwmJnUuc3Ryb2tlQ29sb3ImJih1LnN0cm9rZUNvbG9yPXMpKSxpJiYoaT09PSJ0cmFuc3BhcmVudCI/cC5zZXRBdHRyaWJ1dGUoImZpbGxDb2xvciIsInJnYmEoMCwwLDAsMCkiKTpwLnNldEF0dHJpYnV0ZSgiZmlsbENvbG9yIixpKSx1IT1udWxsJiZ1LmZpbGxDb2xvciYmKHUuZmlsbENvbG9yPWkpKSxvPT09Z3QuUG9seWdvbiYmYyYmKHUudmVydGljZXM9YyksbSYmYS5zZXRJbmZvKGUubmFtZSx7Li4ubSxvcHQ6dX0pLHl0LnVwZGF0ZU5vZGVPcHQodCl9fWNsYXNzIGt0e3N0YXRpYyBiZXppZXIocix0KXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bis9NCl7Y29uc3QgYT10W25dLHM9dFtuKzFdLGk9dFtuKzJdLG89dFtuKzNdO2EmJnMmJmkmJm8/ZS5wdXNoKC4uLmt0LmdldEJlemllclBvaW50cyhyLGEscyxpLG8pKTphJiZzJiZpP2UucHVzaCguLi5rdC5nZXRCZXppZXJQb2ludHMocixhLHMsaSkpOmEmJnM/ZS5wdXNoKC4uLmt0LmdldEJlemllclBvaW50cyhyLGEscykpOmEmJmUucHVzaChhKX1yZXR1cm4gZX1zdGF0aWMgZ2V0QmV6aWVyUG9pbnRzKHI9MTAsdCxlLG4sYSl7bGV0IHM9bnVsbDtjb25zdCBpPVtdOyFuJiYhYT9zPWt0Lm9uZUJlemllcjpuJiYhYT9zPWt0LnR3b0JlemllcjpuJiZhJiYocz1rdC50aHJlZUJlemllcik7Zm9yKGxldCBvPTA7bzxyO28rKylzJiZpLnB1c2gocyhvL3IsdCxlLG4sYSkpO3JldHVybiBhP2kucHVzaChhKTpuJiZpLnB1c2gobiksaX1zdGF0aWMgb25lQmV6aWVyKHIsdCxlKXtjb25zdCBuPXQueCsoZS54LXQueCkqcixhPXQueSsoZS55LXQueSkqcjtyZXR1cm4gbmV3IGV0KG4sYSl9c3RhdGljIHR3b0JlemllcihyLHQsZSxuKXtjb25zdCBhPSgxLXIpKigxLXIpKnQueCsyKnIqKDEtcikqZS54K3IqcipuLngscz0oMS1yKSooMS1yKSp0LnkrMipyKigxLXIpKmUueStyKnIqbi55O3JldHVybiBuZXcgZXQoYSxzKX1zdGF0aWMgdGhyZWVCZXppZXIocix0LGUsbixhKXtjb25zdCBzPXQueCooMS1yKSooMS1yKSooMS1yKSszKmUueCpyKigxLXIpKigxLXIpKzMqbi54KnIqciooMS1yKSthLngqcipyKnIsaT10LnkqKDEtcikqKDEtcikqKDEtcikrMyplLnkqciooMS1yKSooMS1yKSszKm4ueSpyKnIqKDEtcikrYS55KnIqcipyO3JldHVybiBuZXcgZXQocyxpKX19Y2xhc3MgR24gZXh0ZW5kcyB5dHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KTtzdCh0aGlzLCJjYW5Sb3RhdGUiLCExKTtzdCh0aGlzLCJzY2FsZVR5cGUiLEZ0LmFsbCk7c3QodGhpcywidG9vbHNUeXBlIixndC5TcGVlY2hCYWxsb29uKTtzdCh0aGlzLCJyYXRpbyIsLjgpO3N0KHRoaXMsInRtcFBvaW50cyIsW10pO3N0KHRoaXMsIndvcmtPcHRpb25zIik7c3QodGhpcywib2xkUmVjdCIpO3N0KHRoaXMsInN5bmNUaW1lc3RhbXAiKTt0aGlzLndvcmtPcHRpb25zPXQudG9vbHNPcHQsdGhpcy5zeW5jVGltZXN0YW1wPTAsdGhpcy5zeW5jVW5pdFRpbWU9NTB9Y29uc3VtZSh0KXt2YXIgTztjb25zdHtkYXRhOmUsaXNGdWxsV29yazpuLGlzU3ViV29ya2VyOmF9PXQscz0oTz1lPT1udWxsP3ZvaWQgMDplLndvcmtJZCk9PW51bGw/dm9pZCAwOk8udG9TdHJpbmcoKTtpZighcylyZXR1cm57dHlwZTpsdC5Ob25lfTtjb25zdHtvcDppLHdvcmtTdGF0ZTpvfT1lLGM9aT09bnVsbD92b2lkIDA6aS5sZW5ndGg7aWYoIWN8fGM8MilyZXR1cm57dHlwZTpsdC5Ob25lfTtsZXQgbTtpZihvPT09SXQuU3RhcnQ/KHRoaXMudG1wUG9pbnRzPVtuZXcgTXQoaVswXSxpWzFdKV0sbT0hMSk6bT10aGlzLnVwZGF0ZVRlbXBQb2ludHMoaSksIW0pcmV0dXJue3R5cGU6bHQuTm9uZX07aWYoIWEpe2NvbnN0IHg9RGF0ZS5ub3coKTtyZXR1cm4geC10aGlzLnN5bmNUaW1lc3RhbXA+dGhpcy5zeW5jVW5pdFRpbWU/KHRoaXMuc3luY1RpbWVzdGFtcD14LHt0eXBlOmx0LkRyYXdXb3JrLGRhdGFUeXBlOlR0LkxvY2FsLHdvcmtJZDpzLG9wOnRoaXMudG1wUG9pbnRzLm1hcCh2PT5bLi4udi5YWSwwXSkuZmxhdCgxKSxpc1N5bmM6ITAsaW5kZXg6MH0pOnt0eXBlOmx0Lk5vbmV9fWNvbnN0IHU9bj90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXIscD10aGlzLmRyYXcoe3dvcmtJZDpzLGxheWVyOnUsaXNEcmF3aW5nOiEwfSkseT1PdChwLHRoaXMub2xkUmVjdCk7cmV0dXJuIHRoaXMub2xkUmVjdD1wLHtyZWN0OnksdHlwZTpsdC5EcmF3V29yayxkYXRhVHlwZTpUdC5Mb2NhbCx3b3JrSWQ6c319Y29uc3VtZUFsbCh0KXt2YXIgYztjb25zdHtkYXRhOmV9PXQsbj0oYz1lPT1udWxsP3ZvaWQgMDplLndvcmtJZCk9PW51bGw/dm9pZCAwOmMudG9TdHJpbmcoKTtpZighbilyZXR1cm57dHlwZTpsdC5Ob25lfTtpZih0aGlzLnRtcFBvaW50cy5sZW5ndGg8MilyZXR1cm57dHlwZTpsdC5SZW1vdmVOb2RlLHJlbW92ZUlkczpbbl19O2NvbnN0IGE9dGhpcy5mdWxsTGF5ZXIscz10aGlzLmRyYXcoe3dvcmtJZDpuLGxheWVyOmEsaXNEcmF3aW5nOiExfSk7dGhpcy5vbGRSZWN0PXM7Y29uc3QgaT10aGlzLnRtcFBvaW50cy5tYXAobT0+Wy4uLm0uWFksMF0pLmZsYXQoMSksbz1uZShpKTtyZXR1cm4gdGhpcy52Tm9kZXMuc2V0SW5mbyhuLHtyZWN0OnMsb3A6aSxvcHQ6dGhpcy53b3JrT3B0aW9ucyx0b29sc1R5cGU6dGhpcy50b29sc1R5cGUsc2NhbGVUeXBlOnRoaXMuc2NhbGVUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxjZW50ZXJQb3M6cyYmeXQuZ2V0Q2VudGVyUG9zKHMsYSl9KSx7cmVjdDpzLHR5cGU6bHQuRnVsbFdvcmssZGF0YVR5cGU6VHQuTG9jYWwsd29ya0lkOm4sb3BzOm8saXNTeW5jOiEwLG9wdDp0aGlzLndvcmtPcHRpb25zfX1kcmF3KHQpe3ZhciBnO2NvbnN0e3dvcmtJZDplLGxheWVyOm59PXQ7dGhpcy5mdWxsTGF5ZXIuZ2V0RWxlbWVudHNCeU5hbWUoZSkubWFwKE09Pk0ucmVtb3ZlKCkpLChnPXRoaXMuZHJhd0xheWVyKT09bnVsbHx8Zy5nZXRFbGVtZW50c0J5TmFtZShlKS5tYXAoTT0+TS5yZW1vdmUoKSk7Y29uc3R7c3Ryb2tlQ29sb3I6YSxmaWxsQ29sb3I6cyx0aGlja25lc3M6aSx6SW5kZXg6byxwbGFjZW1lbnQ6YyxzY2FsZTptLHJvdGF0ZTp1LHRyYW5zbGF0ZTpwfT10aGlzLndvcmtPcHRpb25zLHtyZWN0OnkscG9zOk8scG9pbnRzOnh9PXRoaXMuY29tcHV0RHJhd1BvaW50cyhpLGMpLHY9e3BvaW50czp4Lm1hcChNPT5NLlhZKSxsaW5lV2lkdGg6aSxmaWxsQ29sb3I6cyE9PSJ0cmFuc3BhcmVudCImJnN8fHZvaWQgMCxzdHJva2VDb2xvcjphLG5vcm1hbGl6ZTohMCxjbGFzc05hbWU6YCR7T1swXX0sJHtPWzFdfWAsbGluZUpvaW46InJvdW5kIixjbG9zZTohMH0sVD17bmFtZTplLGlkOmUsekluZGV4Om8scG9zOk8sYW5jaG9yOlsuNSwuNV0sc2l6ZTpbeS53LHkuaF19O20mJihULnNjYWxlPW0pLHUmJihULnJvdGF0ZT11KSxwJiYoVC50cmFuc2xhdGU9cCk7Y29uc3QgbD1uZXcgcmUoVCksaD1uZXcgZGUoey4uLnYscG9zOlswLDBdfSk7bC5hcHBlbmQoaCksbi5hcHBlbmQobCk7Y29uc3QgZj1sLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybnt4Ok1hdGguZmxvb3IoZi54LXl0LlNhZmVCb3JkZXJQYWRkaW5nKSx5Ok1hdGguZmxvb3IoZi55LXl0LlNhZmVCb3JkZXJQYWRkaW5nKSx3Ok1hdGguZmxvb3IoZi53aWR0aCt5dC5TYWZlQm9yZGVyUGFkZGluZyoyKSxoOk1hdGguZmxvb3IoZi5oZWlnaHQreXQuU2FmZUJvcmRlclBhZGRpbmcqMil9fXRyYW5zZm9ybUNvbnRyb2xQb2ludHModCl7Y29uc3QgZT1CdCh0aGlzLnRtcFBvaW50cyk7c3dpdGNoKHQpe2Nhc2UiYm90dG9tIjpjYXNlImJvdHRvbUxlZnQiOmNhc2UiYm90dG9tUmlnaHQiOntjb25zdCBuPWUueStlLmgqdGhpcy5yYXRpbztyZXR1cm5bbmV3IGV0KGUueCxlLnksMCksbmV3IGV0KGUueCtlLncsZS55LDApLG5ldyBldChlLngrZS53LG4sMCksbmV3IGV0KGUueCxuLDApXX1jYXNlInRvcCI6Y2FzZSJ0b3BMZWZ0IjpjYXNlInRvcFJpZ2h0Ijp7Y29uc3Qgbj1lLnkrZS5oKigxLXRoaXMucmF0aW8pO3JldHVybltuZXcgZXQoZS54LG4sMCksbmV3IGV0KGUueCtlLncsbiwwKSxuZXcgZXQoZS54K2UudyxlLnkrZS5oLDApLG5ldyBldChlLngsZS55K2UuaCwwKV19Y2FzZSJsZWZ0IjpjYXNlImxlZnRCb3R0b20iOmNhc2UibGVmdFRvcCI6e2NvbnN0IG49ZS54K2UudyooMS10aGlzLnJhdGlvKTtyZXR1cm5bbmV3IGV0KG4sZS55LDApLG5ldyBldChlLngrZS53LGUueSwwKSxuZXcgZXQoZS54K2UudyxlLnkrZS5oLDApLG5ldyBldChuLGUueStlLmgsMCldfWNhc2UicmlnaHQiOmNhc2UicmlnaHRCb3R0b20iOmNhc2UicmlnaHRUb3AiOntjb25zdCBuPWUueCtlLncqdGhpcy5yYXRpbztyZXR1cm5bbmV3IGV0KGUueCxlLnksMCksbmV3IGV0KG4sZS55LDApLG5ldyBldChuLGUueStlLmgsMCksbmV3IGV0KGUueCxlLnkrZS5oLDApXX19fWNvbXB1dERyYXdQb2ludHModCxlKXtjb25zdCBuPUJ0KHRoaXMudG1wUG9pbnRzKSxhPXRoaXMudHJhbnNmb3JtQ29udHJvbFBvaW50cyhlKSxzPU1hdGguZmxvb3Iobi53Ki4xKSxpPU1hdGguZmxvb3Iobi5oKi4xKSxvPVtdLGM9ZXQuQWRkKGFbMF0sbmV3IGV0KDAsaSwwKSksbT1ldC5BZGQoYVswXSxuZXcgZXQocywwLDApKSx1PWt0LmdldEJlemllclBvaW50cygxMCxjLGFbMF0sbSkscD1ldC5TdWIoYVsxXSxuZXcgZXQocywwLDApKSx5PWV0LkFkZChhWzFdLG5ldyBldCgwLGksMCkpLE89a3QuZ2V0QmV6aWVyUG9pbnRzKDEwLHAsYVsxXSx5KSx4PWV0LlN1YihhWzJdLG5ldyBldCgwLGksMCkpLHY9ZXQuU3ViKGFbMl0sbmV3IGV0KHMsMCwwKSksVD1rdC5nZXRCZXppZXJQb2ludHMoMTAseCxhWzJdLHYpLGw9ZXQuQWRkKGFbM10sbmV3IGV0KHMsMCwwKSksaD1ldC5TdWIoYVszXSxuZXcgZXQoMCxpLDApKSxmPWt0LmdldEJlemllclBvaW50cygxMCxsLGFbM10saCksZz1zKigxLXRoaXMucmF0aW8pKjEwLE09aSooMS10aGlzLnJhdGlvKSoxMDtzd2l0Y2goZSl7Y2FzZSJib3R0b20iOntjb25zdCBiPWV0LlN1YihhWzJdLG5ldyBldChzKjUtZy8yLDAsMCkpLEU9ZXQuU3ViKGFbMl0sbmV3IGV0KHMqNSwtTSwwKSksTD1ldC5TdWIoYVsyXSxuZXcgZXQocyo1K2cvMiwwLDApKTtvLnB1c2goRSxMLC4uLmYsLi4udSwuLi5PLC4uLlQsYik7YnJlYWt9Y2FzZSJib3R0b21SaWdodCI6e2NvbnN0IGI9ZXQuU3ViKGFbMl0sbmV3IGV0KHMqMS4xLDAsMCkpLEU9ZXQuU3ViKGFbMl0sbmV3IGV0KHMqMS4xK2cvMiwtTSwwKSksTD1ldC5TdWIoYVsyXSxuZXcgZXQocyoxLjErZywwLDApKTtvLnB1c2goRSxMLC4uLmYsLi4udSwuLi5PLC4uLlQsYik7YnJlYWt9Y2FzZSJib3R0b21MZWZ0Ijp7Y29uc3QgYj1ldC5BZGQoYVszXSxuZXcgZXQocyoxLjErZywwLDApKSxFPWV0LkFkZChhWzNdLG5ldyBldChzKjEuMStnLzIsTSwwKSksTD1ldC5BZGQoYVszXSxuZXcgZXQocyoxLjEsMCwwKSk7by5wdXNoKEUsTCwuLi5mLC4uLnUsLi4uTywuLi5ULGIpO2JyZWFrfWNhc2UidG9wIjp7Y29uc3QgYj1ldC5TdWIoYVsxXSxuZXcgZXQocyo1LWcvMiwwLDApKSxFPWV0LlN1YihhWzFdLG5ldyBldChzKjUsTSwwKSksTD1ldC5TdWIoYVsxXSxuZXcgZXQocyo1K2cvMiwwLDApKTtvLnB1c2goRSxiLC4uLk8sLi4uVCwuLi5mLC4uLnUsTCk7YnJlYWt9Y2FzZSJ0b3BSaWdodCI6e2NvbnN0IGI9ZXQuU3ViKGFbMV0sbmV3IGV0KHMqMS4xLDAsMCkpLEU9ZXQuU3ViKGFbMV0sbmV3IGV0KHMqMS4xK2cvMixNLDApKSxMPWV0LlN1YihhWzFdLG5ldyBldChzKjEuMStnLDAsMCkpO28ucHVzaChFLGIsLi4uTywuLi5ULC4uLmYsLi4udSxMKTticmVha31jYXNlInRvcExlZnQiOntjb25zdCBiPWV0LkFkZChhWzBdLG5ldyBldChzKjEuMStnLDAsMCkpLEU9ZXQuQWRkKGFbMF0sbmV3IGV0KHMqMS4xK2cvMiwtTSwwKSksTD1ldC5BZGQoYVswXSxuZXcgZXQocyoxLjEsMCwwKSk7by5wdXNoKEUsYiwuLi5PLC4uLlQsLi4uZiwuLi51LEwpO2JyZWFrfWNhc2UibGVmdCI6e2NvbnN0IGI9ZXQuQWRkKGFbMF0sbmV3IGV0KDAsaSo1LU0vMiwwKSksRT1ldC5BZGQoYVswXSxuZXcgZXQoLWcsaSo1LDApKSxMPWV0LkFkZChhWzBdLG5ldyBldCgwLGkqNStNLzIsMCkpO28ucHVzaChFLGIsLi4udSwuLi5PLC4uLlQsLi4uZixMKTticmVha31jYXNlImxlZnRUb3AiOntjb25zdCBiPWV0LkFkZChhWzBdLG5ldyBldCgwLGkqMS4xLDApKSxFPWV0LkFkZChhWzBdLG5ldyBldCgtZyxpKjEuMStNLzIsMCkpLEw9ZXQuQWRkKGFbMF0sbmV3IGV0KDAsaSoxLjErTSwwKSk7by5wdXNoKEUsYiwuLi51LC4uLk8sLi4uVCwuLi5mLEwpO2JyZWFrfWNhc2UibGVmdEJvdHRvbSI6e2NvbnN0IGI9ZXQuU3ViKGFbM10sbmV3IGV0KDAsaSoxLjErTSwwKSksRT1ldC5TdWIoYVszXSxuZXcgZXQoZyxpKjEuMStNLzIsMCkpLEw9ZXQuU3ViKGFbM10sbmV3IGV0KDAsaSoxLjEsMCkpO28ucHVzaChFLGIsLi4udSwuLi5PLC4uLlQsLi4uZixMKTticmVha31jYXNlInJpZ2h0Ijp7Y29uc3QgYj1ldC5BZGQoYVsxXSxuZXcgZXQoMCxpKjUtTS8yLDApKSxFPWV0LkFkZChhWzFdLG5ldyBldChnLGkqNSwwKSksTD1ldC5BZGQoYVsxXSxuZXcgZXQoMCxpKjUrTS8yLDApKTtvLnB1c2goRSxMLC4uLlQsLi4uZiwuLi51LC4uLk8sYik7YnJlYWt9Y2FzZSJyaWdodFRvcCI6e2NvbnN0IGI9ZXQuQWRkKGFbMV0sbmV3IGV0KDAsaSoxLjEsMCkpLEU9ZXQuQWRkKGFbMV0sbmV3IGV0KGcsaSoxLjErTS8yLDApKSxMPWV0LkFkZChhWzFdLG5ldyBldCgwLGkqMS4xK00sMCkpO28ucHVzaChFLEwsLi4uVCwuLi5mLC4uLnUsLi4uTyxiKTticmVha31jYXNlInJpZ2h0Qm90dG9tIjp7Y29uc3QgYj1ldC5TdWIoYVsyXSxuZXcgZXQoMCxpKjEuMStNLDApKSxFPWV0LlN1YihhWzJdLG5ldyBldCgtZyxpKjEuMStNLzIsMCkpLEw9ZXQuU3ViKGFbMl0sbmV3IGV0KDAsaSoxLjEsMCkpO28ucHVzaChFLEwsLi4uVCwuLi5mLC4uLnUsLi4uTyxiKTticmVha319Y29uc3QgQT1CdCh0aGlzLnRtcFBvaW50cyx0KSxDPVtNYXRoLmZsb29yKEEueCtBLncvMiksTWF0aC5mbG9vcihBLnkrQS5oLzIpXTtyZXR1cm57cmVjdDpBLHBvczpDLHBvaW50czpvfX11cGRhdGVUZW1wUG9pbnRzKHQpe2NvbnN0IGU9dC5zbGljZSgtMiksbj1uZXcgTXQoZVswXSxlWzFdKSxhPXRoaXMudG1wUG9pbnRzWzBdLHt0aGlja25lc3M6c309dGhpcy53b3JrT3B0aW9ucztpZihhLmlzTmVhcihuLHMpfHxNdC5TdWIoYSxuKS5YWS5pbmNsdWRlcygwKSlyZXR1cm4hMTtpZih0aGlzLnRtcFBvaW50cy5sZW5ndGg9PT0yKXtpZihuLmlzTmVhcih0aGlzLnRtcFBvaW50c1sxXSwxKSlyZXR1cm4hMTt0aGlzLnRtcFBvaW50c1sxXT1ufWVsc2UgdGhpcy50bXBQb2ludHMucHVzaChuKTtyZXR1cm4hMH1jb25zdW1lU2VydmljZSh0KXt2YXIgbztjb25zdHtvcDplLGlzRnVsbFdvcms6bn09dCxhPShvPXRoaXMud29ya0lkKT09bnVsbD92b2lkIDA6by50b1N0cmluZygpO2lmKCFhKXJldHVybjt0aGlzLnRtcFBvaW50cy5sZW5ndGg9MDtmb3IobGV0IGM9MDtjPGUubGVuZ3RoO2MrPTMpdGhpcy50bXBQb2ludHMucHVzaChuZXcgTXQoZVtjXSxlW2MrMV0sZVtjKzJdKSk7Y29uc3Qgcz1uP3RoaXMuZnVsbExheWVyOnRoaXMuZHJhd0xheWVyfHx0aGlzLmZ1bGxMYXllcixpPXRoaXMuZHJhdyh7d29ya0lkOmEsbGF5ZXI6cyxpc0RyYXdpbmc6ITF9KTtyZXR1cm4gdGhpcy5vbGRSZWN0PWksdGhpcy52Tm9kZXMuc2V0SW5mbyhhLHtyZWN0Omksb3A6ZSxvcHQ6dGhpcy53b3JrT3B0aW9ucyx0b29sc1R5cGU6dGhpcy50b29sc1R5cGUsc2NhbGVUeXBlOnRoaXMuc2NhbGVUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxjZW50ZXJQb3M6aSYmeXQuZ2V0Q2VudGVyUG9zKGkscyl9KSxpfWNsZWFyVG1wUG9pbnRzKCl7dGhpcy50bXBQb2ludHMubGVuZ3RoPTB9c3RhdGljIHVwZGF0ZU5vZGVPcHQodCl7Y29uc3R7bm9kZTplLG9wdDpuLHZOb2RlczphfT10LHtzdHJva2VDb2xvcjpzLGZpbGxDb2xvcjppLHRvb2xzVHlwZTpvLHBsYWNlbWVudDpjfT1uLG09YS5nZXQoZS5uYW1lKSx1PW09PW51bGw/dm9pZCAwOm0ub3B0O2xldCBwPWU7cmV0dXJuIGUudGFnTmFtZT09PSJHUk9VUCImJihwPWUuY2hpbGRyZW5bMF0pLHMmJihwLnNldEF0dHJpYnV0ZSgic3Ryb2tlQ29sb3IiLHMpLHUhPW51bGwmJnUuc3Ryb2tlQ29sb3ImJih1LnN0cm9rZUNvbG9yPXMpKSxpJiYoaT09PSJ0cmFuc3BhcmVudCI/cC5zZXRBdHRyaWJ1dGUoImZpbGxDb2xvciIsInJnYmEoMCwwLDAsMCkiKTpwLnNldEF0dHJpYnV0ZSgiZmlsbENvbG9yIixpKSx1IT1udWxsJiZ1LmZpbGxDb2xvciYmKHUuZmlsbENvbG9yPWkpKSxvPT09Z3QuU3BlZWNoQmFsbG9vbiYmYyYmKHUucGxhY2VtZW50PWMpLG0mJmEuc2V0SW5mbyhlLm5hbWUsey4uLm0sb3B0OnV9KSx5dC51cGRhdGVOb2RlT3B0KHQpfX1jbGFzcyBIbiBleHRlbmRzIHl0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO3N0KHRoaXMsImNhblJvdGF0ZSIsITApO3N0KHRoaXMsInNjYWxlVHlwZSIsRnQuYWxsKTtzdCh0aGlzLCJ0b29sc1R5cGUiLGd0LkltYWdlKTtzdCh0aGlzLCJ0bXBQb2ludHMiLFtdKTtzdCh0aGlzLCJ3b3JrT3B0aW9ucyIpO3N0KHRoaXMsIm9sZFJlY3QiKTt0aGlzLndvcmtPcHRpb25zPXQudG9vbHNPcHQsdGhpcy5zY2FsZVR5cGU9dGhpcy53b3JrT3B0aW9ucy51bmlmb3JtU2NhbGU/RnQucHJvcG9ydGlvbmFsOkZ0LmFsbH1jb25zdW1lKCl7cmV0dXJue3R5cGU6bHQuTm9uZX19Y29uc3VtZUFsbCgpe3JldHVybnt0eXBlOmx0Lk5vbmV9fWRyYXcodCl7dmFyIGg7Y29uc3R7bGF5ZXI6ZSx3b3JrSWQ6bixyZXBsYWNlSWQ6YSxpbWFnZUJpdG1hcDpzfT10LHtjZW50ZXJYOmksY2VudGVyWTpvLHdpZHRoOmMsaGVpZ2h0Om0sc2NhbGU6dSxyb3RhdGU6cCx0cmFuc2xhdGU6eSx6SW5kZXg6T309dGhpcy53b3JrT3B0aW9uczt0aGlzLmZ1bGxMYXllci5nZXRFbGVtZW50c0J5TmFtZShhfHxuKS5tYXAoZj0+Zi5yZW1vdmUoKSksKGg9dGhpcy5kcmF3TGF5ZXIpPT1udWxsfHxoLmdldEVsZW1lbnRzQnlOYW1lKGF8fG4pLm1hcChmPT5mLnJlbW92ZSgpKTtjb25zdCB4PXthbmNob3I6Wy41LC41XSxwb3M6W2ksb10sbmFtZTpuLHNpemU6W2MsbV0sekluZGV4Ok99O2lmKHUpaWYodGhpcy5zY2FsZVR5cGU9PT1GdC5wcm9wb3J0aW9uYWwpe2NvbnN0IGY9TWF0aC5taW4odVswXSx1WzFdKTt4LnNjYWxlPVtmLGZdfWVsc2UgeC5zY2FsZT11O3kmJih4LnRyYW5zbGF0ZT15KSxwJiYoeC5yb3RhdGU9cCk7Y29uc3Qgdj1uZXcgcmUoeCksVD1uZXcgemgoe2FuY2hvcjpbLjUsLjVdLHBvczpbMCwwXSxzaXplOltjLG1dLHRleHR1cmU6cyxyb3RhdGU6MTgwfSk7di5hcHBlbmQoVCksZS5hcHBlbmQodik7Y29uc3QgbD12LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKGwpcmV0dXJue3g6TWF0aC5mbG9vcihsLngteXQuU2FmZUJvcmRlclBhZGRpbmcpLHk6TWF0aC5mbG9vcihsLnkteXQuU2FmZUJvcmRlclBhZGRpbmcpLHc6TWF0aC5mbG9vcihsLndpZHRoK3l0LlNhZmVCb3JkZXJQYWRkaW5nKjIpLGg6TWF0aC5mbG9vcihsLmhlaWdodCt5dC5TYWZlQm9yZGVyUGFkZGluZyoyKX19Y29uc3VtZVNlcnZpY2UoKXt9YXN5bmMgY29uc3VtZVNlcnZpY2VBc3luYyh0KXt2YXIgbSx1O2NvbnN0e2lzRnVsbFdvcms6ZSxyZXBsYWNlSWQ6bixzY2VuZTphfT10LHtzcmM6cyx1dWlkOml9PXRoaXMud29ya09wdGlvbnMsbz0oKG09dGhpcy53b3JrSWQpPT1udWxsP3ZvaWQgMDptLnRvU3RyaW5nKCkpfHxpLGM9ZT90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXI7aWYocyl7Y29uc3QgcD1hd2FpdCBhLnByZWxvYWQoe2lkOmksc3JjOnRoaXMud29ya09wdGlvbnMuc3JjfSkseT10aGlzLmRyYXcoe3dvcmtJZDpvLGxheWVyOmMscmVwbGFjZUlkOm4saW1hZ2VCaXRtYXA6cFswXX0pO3JldHVybiB0aGlzLm9sZFJlY3Q9byYmKCh1PXRoaXMudk5vZGVzLmdldChvKSk9PW51bGw/dm9pZCAwOnUucmVjdCl8fHZvaWQgMCx0aGlzLnZOb2Rlcy5zZXRJbmZvKG8se3JlY3Q6eSxvcDpbXSxvcHQ6dGhpcy53b3JrT3B0aW9ucyx0b29sc1R5cGU6dGhpcy50b29sc1R5cGUsc2NhbGVUeXBlOnRoaXMuc2NhbGVUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxjZW50ZXJQb3M6eSYmeXQuZ2V0Q2VudGVyUG9zKHksYyl9KSx5fX1jbGVhclRtcFBvaW50cygpe3RoaXMudG1wUG9pbnRzLmxlbmd0aD0wfXN0YXRpYyB1cGRhdGVOb2RlT3B0KHQpe2NvbnN0e25vZGU6ZSxvcHQ6bix2Tm9kZXM6YSx0YXJnZXROb2RlOnN9PXQse3RyYW5zbGF0ZTppLGJveDpvLGJveFNjYWxlOmMsYm94VHJhbnNsYXRlOm0sYW5nbGU6dSxpc0xvY2tlZDpwLHpJbmRleDp5fT1uLE89cyYmWnQocyl8fGEuZ2V0KGUubmFtZSk7aWYoIU8pcmV0dXJuO2NvbnN0IHg9ZS5wYXJlbnQ7aWYoeCl7aWYob2UoeSkmJihlLnNldEF0dHJpYnV0ZSgiekluZGV4Iix5KSxPLm9wdC56SW5kZXg9eSksZ2UocCkmJihPLm9wdC5sb2NrZWQ9cCksbyYmbSYmYyl7Y29uc3R7Y2VudGVyWDp2LGNlbnRlclk6VCx3aWR0aDpsLGhlaWdodDpoLHVuaWZvcm1TY2FsZTpmfT1PLm9wdDtpZihmKXtjb25zdCBBPU1hdGgubWluKGNbMF0sY1sxXSk7Ty5vcHQuc2NhbGU9W0EsQV19ZWxzZSBPLm9wdC5zY2FsZT1jO08ub3B0LndpZHRoPU1hdGguZmxvb3IobCpjWzBdKSxPLm9wdC5oZWlnaHQ9TWF0aC5mbG9vcihoKmNbMV0pO2NvbnN0IGc9W21bMF0veC53b3JsZFNjYWxpbmdbMF0sbVsxXS94LndvcmxkU2NhbGluZ1sxXV07Ty5vcHQuY2VudGVyWD12K2dbMF0sTy5vcHQuY2VudGVyWT1UK2dbMV07Y29uc3QgTT1bTy5jZW50ZXJQb3NbMF0rZ1swXSxPLmNlbnRlclBvc1sxXStnWzFdXTtpZihPLmNlbnRlclBvcz1NLHMpe2xldCBBPXluKE8ucmVjdCxjKTtBPUNlKEEsZyksTy5yZWN0PUF9fWVsc2UgaWYoaSl7Y29uc3Qgdj1baVswXS94LndvcmxkU2NhbGluZ1swXSxpWzFdL3gud29ybGRTY2FsaW5nWzFdXTtpZihPLm9wdC5jZW50ZXJYPU8ub3B0LmNlbnRlclgrdlswXSxPLm9wdC5jZW50ZXJZPU8ub3B0LmNlbnRlclkrdlsxXSxPLmNlbnRlclBvcz1bTy5jZW50ZXJQb3NbMF0rdlswXSxPLmNlbnRlclBvc1sxXSt2WzFdXSxzKXtjb25zdCBUPUNlKE8ucmVjdCx2KTtPLnJlY3Q9VH19ZWxzZSBpZihvZSh1KSYmKGUuc2V0QXR0cmlidXRlKCJyb3RhdGUiLHUpLE8ub3B0LnJvdGF0ZT11LHMpKXtjb25zdCB2PXZuKE8ucmVjdCx1KTtPLnJlY3Q9dn1yZXR1cm4gTyYmYS5zZXRJbmZvKGUubmFtZSxPKSxPPT1udWxsP3ZvaWQgMDpPLnJlY3R9fX1jbGFzcyBLbiBleHRlbmRzIHl0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO3N0KHRoaXMsImNhblJvdGF0ZSIsITEpO3N0KHRoaXMsInNjYWxlVHlwZSIsRnQuYm90aCk7c3QodGhpcywidG9vbHNUeXBlIixndC5TdHJhaWdodCk7c3QodGhpcywidG1wUG9pbnRzIixbXSk7c3QodGhpcywid29ya09wdGlvbnMiKTtzdCh0aGlzLCJvbGRSZWN0Iik7c3QodGhpcywic3RyYWlnaHRUaXBXaWR0aCIpO3N0KHRoaXMsInN5bmNUaW1lc3RhbXAiKTt0aGlzLndvcmtPcHRpb25zPXQudG9vbHNPcHQsdGhpcy5zdHJhaWdodFRpcFdpZHRoPXRoaXMud29ya09wdGlvbnMudGhpY2tuZXNzLzIsdGhpcy5zeW5jVGltZXN0YW1wPTAsdGhpcy5zeW5jVW5pdFRpbWU9NTB9Y29uc3VtZSh0KXt2YXIgTztjb25zdHtkYXRhOmUsaXNGdWxsV29yazpuLGlzU3ViV29ya2VyOmF9PXQscz0oTz1lPT1udWxsP3ZvaWQgMDplLndvcmtJZCk9PW51bGw/dm9pZCAwOk8udG9TdHJpbmcoKTtpZighcylyZXR1cm57dHlwZTpsdC5Ob25lfTtjb25zdHtvcDppLHdvcmtTdGF0ZTpvfT1lLGM9aT09bnVsbD92b2lkIDA6aS5sZW5ndGg7aWYoIWN8fGM8MilyZXR1cm57dHlwZTpsdC5Ob25lfTtsZXQgbTtpZihvPT09SXQuU3RhcnQ/KHRoaXMudG1wUG9pbnRzPVtuZXcgTXQoaVswXSxpWzFdKV0sbT0hMSk6bT10aGlzLnVwZGF0ZVRlbXBQb2ludHMoaSksIW0pcmV0dXJue3R5cGU6bHQuTm9uZX07aWYoIWEpe2NvbnN0IHg9RGF0ZS5ub3coKTtyZXR1cm4geC10aGlzLnN5bmNUaW1lc3RhbXA+dGhpcy5zeW5jVW5pdFRpbWU/KHRoaXMuc3luY1RpbWVzdGFtcD14LHt0eXBlOmx0LkRyYXdXb3JrLGRhdGFUeXBlOlR0LkxvY2FsLHdvcmtJZDpzLG9wOnRoaXMudG1wUG9pbnRzLm1hcCh2PT5bLi4udi5YWSwwXSkuZmxhdCgxKSxpc1N5bmM6ITAsaW5kZXg6MH0pOnt0eXBlOmx0Lk5vbmV9fWNvbnN0IHU9bj90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXIscD10aGlzLmRyYXcoe3dvcmtJZDpzLGxheWVyOnV9KSx5PU90KHAsdGhpcy5vbGRSZWN0KTtyZXR1cm4gdGhpcy5vbGRSZWN0PXAse3JlY3Q6eSx0eXBlOmx0LkRyYXdXb3JrLGRhdGFUeXBlOlR0LkxvY2FsLHdvcmtJZDpzfX1jb25zdW1lQWxsKHQpe3ZhciBjO2NvbnN0e2RhdGE6ZX09dCxuPShjPWU9PW51bGw/dm9pZCAwOmUud29ya0lkKT09bnVsbD92b2lkIDA6Yy50b1N0cmluZygpO2lmKCFuKXJldHVybnt0eXBlOmx0Lk5vbmV9O2lmKHRoaXMudG1wUG9pbnRzLmxlbmd0aDwyKXJldHVybnt0eXBlOmx0LlJlbW92ZU5vZGUscmVtb3ZlSWRzOltuXX07Y29uc3QgYT10aGlzLmZ1bGxMYXllcixzPXRoaXMuZHJhdyh7d29ya0lkOm4sbGF5ZXI6YX0pO3RoaXMub2xkUmVjdD1zO2NvbnN0IGk9dGhpcy50bXBQb2ludHMubWFwKG09PlsuLi5tLlhZLDBdKS5mbGF0KDEpLG89bmUoaSk7cmV0dXJuIHRoaXMudk5vZGVzLnNldEluZm8obix7cmVjdDpzLG9wOmksb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLHNjYWxlVHlwZTp0aGlzLnNjYWxlVHlwZSxjYW5Sb3RhdGU6dGhpcy5jYW5Sb3RhdGUsY2VudGVyUG9zOnMmJnl0LmdldENlbnRlclBvcyhzLGEpfSkse3JlY3Q6cyx0eXBlOmx0LkZ1bGxXb3JrLGRhdGFUeXBlOlR0LkxvY2FsLHdvcmtJZDpuLG9wczpvLGlzU3luYzohMCxvcHQ6dGhpcy53b3JrT3B0aW9uc319ZHJhdyh0KXt2YXIgaDtjb25zdHt3b3JrSWQ6ZSxsYXllcjpufT10O3RoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKGUpLm1hcChmPT5mLnJlbW92ZSgpKSwoaD10aGlzLmRyYXdMYXllcik9PW51bGx8fGguZ2V0RWxlbWVudHNCeU5hbWUoZSkubWFwKGY9PmYucmVtb3ZlKCkpO2NvbnN0e3N0cm9rZUNvbG9yOmEsdGhpY2tuZXNzOnMsekluZGV4Omksc2NhbGU6byxyb3RhdGU6Yyx0cmFuc2xhdGU6bX09dGhpcy53b3JrT3B0aW9ucyx1PW4ud29ybGRQb3NpdGlvbixwPW4ud29ybGRTY2FsaW5nLHtkOnkscmVjdDpPfT10aGlzLmNvbXB1dERyYXdQb2ludHMocykseD1bTy54K08udy8yLE8ueStPLmgvMl0sdj17cG9zOngsbmFtZTplLGlkOmUsZDp5LGZpbGxDb2xvcjphLHN0cm9rZUNvbG9yOmEsbGluZVdpZHRoOjAsY2xhc3NOYW1lOmAke3hbMF19LCR7eFsxXX1gLG5vcm1hbGl6ZTohMCx6SW5kZXg6aX07byYmKHYuc2NhbGU9byksYyYmKHYucm90YXRlPWMpLG0mJih2LnRyYW5zbGF0ZT1tKTtjb25zdCBUPW5ldyBoZSh2KTtpZihuLmFwcGVuZChUKSxjfHxvfHxtKXtjb25zdCBmPVQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJue3g6TWF0aC5mbG9vcihmLngteXQuU2FmZUJvcmRlclBhZGRpbmcpLHk6TWF0aC5mbG9vcihmLnkteXQuU2FmZUJvcmRlclBhZGRpbmcpLHc6TWF0aC5mbG9vcihmLndpZHRoK3l0LlNhZmVCb3JkZXJQYWRkaW5nKjIpLGg6TWF0aC5mbG9vcihmLmhlaWdodCt5dC5TYWZlQm9yZGVyUGFkZGluZyoyKX19cmV0dXJue3g6TWF0aC5mbG9vcihPLngqcFswXSt1WzBdLXl0LlNhZmVCb3JkZXJQYWRkaW5nKSx5Ok1hdGguZmxvb3IoTy55KnBbMV0rdVsxXS15dC5TYWZlQm9yZGVyUGFkZGluZyksdzpNYXRoLmZsb29yKE8udypwWzBdKzIqeXQuU2FmZUJvcmRlclBhZGRpbmcpLGg6TWF0aC5mbG9vcihPLmgqcFsxXSsyKnl0LlNhZmVCb3JkZXJQYWRkaW5nKX19Y29tcHV0RHJhd1BvaW50cyh0KXtyZXR1cm4gdGhpcy50bXBQb2ludHNbMV0uZGlzdGFuY2UodGhpcy50bXBQb2ludHNbMF0pPnRoaXMuc3RyYWlnaHRUaXBXaWR0aD90aGlzLmNvbXB1dEZ1bGxQb2ludHModCk6dGhpcy5jb21wdXREb3RQb2ludHModCl9Y29tcHV0RnVsbFBvaW50cyh0KXtjb25zdCBlPWV0LlN1Yih0aGlzLnRtcFBvaW50c1sxXSx0aGlzLnRtcFBvaW50c1swXSkudW5pKCksbj1ldC5QZXIoZSkubXVsKHQvMiksYT1NdC5TdWIodGhpcy50bXBQb2ludHNbMF0sbikscz1NdC5BZGQodGhpcy50bXBQb2ludHNbMF0sbiksaT1NdC5TdWIodGhpcy50bXBQb2ludHNbMV0sbiksbz1NdC5BZGQodGhpcy50bXBQb2ludHNbMV0sbiksYz1NdC5HZXRTZW1pY2lyY2xlU3Ryb2tlKHRoaXMudG1wUG9pbnRzWzFdLGksLTEsOCksbT1NdC5HZXRTZW1pY2lyY2xlU3Ryb2tlKHRoaXMudG1wUG9pbnRzWzBdLHMsLTEsOCksdT1bYSxpLC4uLmMsbyxzLC4uLm1dO3JldHVybntkOk9lKHUsITApLHJlY3Q6QnQodSksaXNEb3Q6ITEscG9zOnRoaXMudG1wUG9pbnRzWzBdLlhZfX1jb21wdXREb3RQb2ludHModCl7Y29uc3QgZT1NdC5HZXREb3RTdHJva2UodGhpcy50bXBQb2ludHNbMF0sdC8yLDgpO3JldHVybntkOk9lKGUsITApLHJlY3Q6QnQoZSksaXNEb3Q6ITAscG9zOnRoaXMudG1wUG9pbnRzWzBdLlhZfX11cGRhdGVUZW1wUG9pbnRzKHQpe2NvbnN0IGU9dC5zbGljZSgtMiksbj1uZXcgTXQoZVswXSxlWzFdKSxhPXRoaXMudG1wUG9pbnRzWzBdLHt0aGlja25lc3M6c309dGhpcy53b3JrT3B0aW9ucztpZihhLmlzTmVhcihuLHMpKXJldHVybiExO2lmKHRoaXMudG1wUG9pbnRzLmxlbmd0aD09PTIpe2lmKG4uaXNOZWFyKHRoaXMudG1wUG9pbnRzWzFdLDEpKXJldHVybiExO3RoaXMudG1wUG9pbnRzWzFdPW59ZWxzZSB0aGlzLnRtcFBvaW50cy5wdXNoKG4pO3JldHVybiEwfWNvbnN1bWVTZXJ2aWNlKHQpe3ZhciBvO2NvbnN0e29wOmUsaXNGdWxsV29yazpufT10LGE9KG89dGhpcy53b3JrSWQpPT1udWxsP3ZvaWQgMDpvLnRvU3RyaW5nKCk7aWYoIWEpcmV0dXJuO3RoaXMudG1wUG9pbnRzLmxlbmd0aD0wO2ZvcihsZXQgYz0wO2M8ZS5sZW5ndGg7Yys9Myl0aGlzLnRtcFBvaW50cy5wdXNoKG5ldyBNdChlW2NdLGVbYysxXSxlW2MrMl0pKTtjb25zdCBzPW4/dGhpcy5mdWxsTGF5ZXI6dGhpcy5kcmF3TGF5ZXJ8fHRoaXMuZnVsbExheWVyLGk9dGhpcy5kcmF3KHt3b3JrSWQ6YSxsYXllcjpzfSk7cmV0dXJuIHRoaXMub2xkUmVjdD1pLHRoaXMudk5vZGVzLnNldEluZm8oYSx7cmVjdDppLG9wOmUsb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLHNjYWxlVHlwZTp0aGlzLnNjYWxlVHlwZSxjYW5Sb3RhdGU6dGhpcy5jYW5Sb3RhdGUsY2VudGVyUG9zOmkmJnl0LmdldENlbnRlclBvcyhpLHMpfSksaX1jbGVhclRtcFBvaW50cygpe3RoaXMudG1wUG9pbnRzLmxlbmd0aD0wfXN0YXRpYyB1cGRhdGVOb2RlT3B0KHQpe3ZhciBvO2NvbnN0e25vZGU6ZSxvcHQ6bix2Tm9kZXM6YX09dCx7c3Ryb2tlQ29sb3I6c309bixpPWEuZ2V0KGUubmFtZSk7cmV0dXJuIHMmJihlLnNldEF0dHJpYnV0ZSgic3Ryb2tlQ29sb3IiLHMpLGUuc2V0QXR0cmlidXRlKCJmaWxsQ29sb3IiLHMpLChvPWk9PW51bGw/dm9pZCAwOmkub3B0KSE9bnVsbCYmby5zdHJva2VDb2xvciYmKGkub3B0LnN0cm9rZUNvbG9yPXMpKSxpJiZhLnNldEluZm8oZS5uYW1lLGkpLHl0LnVwZGF0ZU5vZGVPcHQodCl9fWNsYXNzIFJlIGV4dGVuZHMgeXR7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7c3QodGhpcywiY2FuUm90YXRlIiwhMSk7c3QodGhpcywic2NhbGVUeXBlIixGdC5hbGwpO3N0KHRoaXMsInRvb2xzVHlwZSIsZ3QuVGV4dCk7c3QodGhpcywidG1wUG9pbnRzIixbXSk7c3QodGhpcywid29ya09wdGlvbnMiKTtzdCh0aGlzLCJvbGRSZWN0Iik7dGhpcy53b3JrT3B0aW9ucz10LnRvb2xzT3B0fWNvbnN1bWUoKXtyZXR1cm57dHlwZTpsdC5Ob25lfX1jb25zdW1lQWxsKCl7cmV0dXJue3R5cGU6bHQuTm9uZX19ZHJhdyh0KXt2YXIgeDtjb25zdHt3b3JrSWQ6ZSxsYXllcjpuLGlzRHJhd0xhYmVsOmF9PXQ7dGhpcy5mdWxsTGF5ZXIuZ2V0RWxlbWVudHNCeU5hbWUoZSkubWFwKHY9PnYucmVtb3ZlKCkpLCh4PXRoaXMuZHJhd0xheWVyKT09bnVsbHx8eC5nZXRFbGVtZW50c0J5TmFtZShlKS5tYXAodj0+di5yZW1vdmUoKSk7Y29uc3R7Ym94U2l6ZTpzLGJveFBvaW50OmksekluZGV4Om99PXRoaXMud29ya09wdGlvbnMsYz1uLndvcmxkUG9zaXRpb24sbT1uLndvcmxkU2NhbGluZztpZighaXx8IXMpcmV0dXJuO2NvbnN0IHU9bmV3IHJlKHtuYW1lOmUsaWQ6ZSxwb3M6W2lbMF0rc1swXS8yLGlbMV0rc1sxXS8yXSxhbmNob3I6Wy41LC41XSxzaXplOnMsekluZGV4Om99KSxwPXt4OmlbMF0seTppWzFdLHc6c1swXSxoOnNbMV19LHk9bmV3IGhyKHtub3JtYWxpemU6ITAscG9zOlswLDBdLHNpemU6c30pLE89YSYmUmUuY3JlYXRlTGFiZWxzKHRoaXMud29ya09wdGlvbnMsbil8fFtdO3JldHVybiB1LmFwcGVuZCguLi5PLHkpLG4uYXBwZW5kKHUpLHt4Ok1hdGguZmxvb3IocC54Km1bMF0rY1swXSkseTpNYXRoLmZsb29yKHAueSptWzFdK2NbMV0pLHc6TWF0aC5mbG9vcihwLncqbVswXSksaDpNYXRoLmZsb29yKHAuaCptWzFdKX19Y29uc3VtZVNlcnZpY2UodCl7dmFyIGMsbTtjb25zdCBlPShjPXRoaXMud29ya0lkKT09bnVsbD92b2lkIDA6Yy50b1N0cmluZygpO2lmKCFlKXJldHVybjtjb25zdHtpc0Z1bGxXb3JrOm4scmVwbGFjZUlkOmEsaXNEcmF3TGFiZWw6c309dDt0aGlzLm9sZFJlY3Q9YSYmKChtPXRoaXMudk5vZGVzLmdldChhKSk9PW51bGw/dm9pZCAwOm0ucmVjdCl8fHZvaWQgMDtjb25zdCBpPW4/dGhpcy5mdWxsTGF5ZXI6dGhpcy5kcmF3TGF5ZXJ8fHRoaXMuZnVsbExheWVyLG89dGhpcy5kcmF3KHt3b3JrSWQ6ZSxsYXllcjppLGlzRHJhd0xhYmVsOnN9KTtyZXR1cm4gdGhpcy52Tm9kZXMuc2V0SW5mbyhlLHtyZWN0Om8sb3A6W10sb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLHNjYWxlVHlwZTp0aGlzLnNjYWxlVHlwZSxjYW5Sb3RhdGU6dGhpcy5jYW5Sb3RhdGUsY2VudGVyUG9zOm8mJnl0LmdldENlbnRlclBvcyhvLGkpfSksb311cGRhdGFPcHRTZXJ2aWNlKHQpe2lmKCF0aGlzLndvcmtJZClyZXR1cm47Y29uc3QgZT10aGlzLndvcmtJZC50b1N0cmluZygpLHtmb250Q29sb3I6bixmb250QmdDb2xvcjphLGJvbGQ6cyxpdGFsaWM6aSxsaW5lVGhyb3VnaDpvLHVuZGVybGluZTpjLHpJbmRleDptfT10LHU9dGhpcy52Tm9kZXMuZ2V0KGUpO2lmKCF1KXJldHVybjtuJiYodS5vcHQuZm9udENvbG9yPW4pLGEmJih1Lm9wdC5mb250QmdDb2xvcj1hKSxzJiYodS5vcHQuYm9sZD1zKSxpJiYodS5vcHQuaXRhbGljPWkpLGdlKG8pJiYodS5vcHQubGluZVRocm91Z2g9byksZ2UoYykmJih1Lm9wdC51bmRlcmxpbmU9YyksYSYmKHUub3B0LmZvbnRCZ0NvbG9yPWEpLG9lKG0pJiYodS5vcHQuekluZGV4PW0pLHRoaXMub2xkUmVjdD11LnJlY3Q7Y29uc3QgcD10aGlzLmRyYXcoe3dvcmtJZDplLGxheWVyOnRoaXMuZnVsbExheWVyLGlzRHJhd0xhYmVsOiExfSk7cmV0dXJuIHRoaXMudk5vZGVzLnNldEluZm8oZSx7cmVjdDpwLG9wOltdLG9wdDp0aGlzLndvcmtPcHRpb25zLHRvb2xzVHlwZTp0aGlzLnRvb2xzVHlwZSxzY2FsZVR5cGU6dGhpcy5zY2FsZVR5cGUsY2FuUm90YXRlOnRoaXMuY2FuUm90YXRlLGNlbnRlclBvczpwJiZ5dC5nZXRDZW50ZXJQb3MocCx0aGlzLmZ1bGxMYXllcil9KSxwfWNsZWFyVG1wUG9pbnRzKCl7dGhpcy50bXBQb2ludHMubGVuZ3RoPTB9c3RhdGljIGdldEZvbnRXaWR0aCh0KXtjb25zdHtjdHg6ZSxvcHQ6bix0ZXh0OmF9PXQse2JvbGQ6cyxpdGFsaWM6aSxmb250U2l6ZTpvLGZvbnRGYW1pbHk6Y309bjtyZXR1cm4gZS5mb250PWAke3N9ICR7aX0gJHtvfXB4ICR7Y31gLGUubWVhc3VyZVRleHQoYSkud2lkdGh9c3RhdGljIGNyZWF0ZUxhYmVscyh0LGUpe2NvbnN0IG49W10sYT10LnRleHQuc3BsaXQoIiwiKSxzPWEubGVuZ3RoO2ZvcihsZXQgaT0wO2k8cztpKyspe2NvbnN0IG89YVtpXSx7Zm9udFNpemU6YyxsaW5lSGVpZ2h0Om0sYm9sZDp1LHRleHRBbGlnbjpwLGl0YWxpYzp5LGJveFNpemU6Tyxmb250RmFtaWx5OngsdmVydGljYWxBbGlnbjp2LGZvbnRDb2xvcjpULHVuZGVybGluZTpsLGxpbmVUaHJvdWdoOmh9PXQsZj1tfHxjKjEuMixnPWUmJmUucGFyZW50LmNhbnZhcy5nZXRDb250ZXh0KCIyZCIpLE09ZyYmUmUuZ2V0Rm9udFdpZHRoKHt0ZXh0Om8sb3B0OnQsY3R4Omcsd29ybGRTY2FsaW5nOmUud29ybGRTY2FsaW5nfSk7aWYoTSl7Y29uc3QgQT17YW5jaG9yOlswLC41XSx0ZXh0Om8sZm9udFNpemU6YyxsaW5lSGVpZ2h0OmYsZm9udEZhbWlseTp4LGZvbnRXZWlnaHQ6dSxmaWxsQ29sb3I6VCx0ZXh0QWxpZ246cCxmb250U3R5bGU6eSxuYW1lOmkudG9TdHJpbmcoKSxjbGFzc05hbWU6ImxhYmVsIn0sQz1bMCwwXTtpZih2PT09Im1pZGRsZSIpe2NvbnN0IEU9KHMtMSkvMjtDWzFdPShpLUUpKmZ9cD09PSJsZWZ0IiYmKENbMF09TyYmLU9bMF0vMis1fHwwKSxBLnBvcz1DO2NvbnN0IGI9bmV3IFVoKEEpO2lmKG4ucHVzaChiKSxsKXtjb25zdCBFPXtub3JtYWxpemU6ITEscG9zOltBLnBvc1swXSxBLnBvc1sxXStjLzJdLGxpbmVXaWR0aDoyKmUud29ybGRTY2FsaW5nWzBdLHBvaW50czpbMCwwLE0sMF0sc3Ryb2tlQ29sb3I6VCxuYW1lOmAke2l9X3VuZGVybGluZWAsY2xhc3NOYW1lOiJ1bmRlcmxpbmUifSxMPW5ldyBkZShFKTtuLnB1c2goTCl9aWYoaCl7Y29uc3QgRT17bm9ybWFsaXplOiExLHBvczpBLnBvcyxsaW5lV2lkdGg6MiplLndvcmxkU2NhbGluZ1swXSxwb2ludHM6WzAsMCxNLDBdLHN0cm9rZUNvbG9yOlQsbmFtZTpgJHtpfV9saW5lVGhyb3VnaGAsY2xhc3NOYW1lOiJsaW5lVGhyb3VnaCJ9LEw9bmV3IGRlKEUpO24ucHVzaChMKX19fXJldHVybiBufXN0YXRpYyB1cGRhdGVOb2RlT3B0KHQpe2NvbnN0e25vZGU6ZSxvcHQ6bix2Tm9kZXM6YSx0YXJnZXROb2RlOnN9PXQse2ZvbnRCZ0NvbG9yOmksZm9udENvbG9yOm8sdHJhbnNsYXRlOmMsYm94Om0sYm94U2NhbGU6dSxib3hUcmFuc2xhdGU6cCxib2xkOnksaXRhbGljOk8sbGluZVRocm91Z2g6eCx1bmRlcmxpbmU6dixmb250U2l6ZTpULHRleHRJbmZvczpsfT1uLGg9cyYmWnQocyl8fGEuZ2V0KGUubmFtZSk7aWYoIWgpcmV0dXJuO2NvbnN0IGY9ZS5wYXJlbnQ7aWYoIWYpcmV0dXJuO2NvbnN0IGc9aC5vcHQ7aWYobyYmZy5mb250Q29sb3ImJihnLmZvbnRDb2xvcj1vKSxpJiZnLmZvbnRCZ0NvbG9yJiYoZy5mb250QmdDb2xvcj1pKSx5JiYoZy5ib2xkPXkpLE8mJihnLml0YWxpYz1PKSxnZSh4KSYmKGcubGluZVRocm91Z2g9eCksZ2UodikmJihnLnVuZGVybGluZT12KSxUJiYoZy5mb250U2l6ZT1UKSxtJiZwJiZ1KXtjb25zdCBNPWw9PW51bGw/dm9pZCAwOmwuZ2V0KGUubmFtZSk7aWYoTSl7Y29uc3R7Zm9udFNpemU6Yixib3hTaXplOkV9PU07Zy5ib3hTaXplPUV8fGcuYm94U2l6ZSxnLmZvbnRTaXplPWJ8fGcuZm9udFNpemV9Y29uc3QgQT1oLnJlY3QsQz1DZSh5bihBLHUpLHApO2cuYm94UG9pbnQ9QyYmWyhDLngtZi53b3JsZFBvc2l0aW9uWzBdKS9mLndvcmxkU2NhbGluZ1swXSwoQy55LWYud29ybGRQb3NpdGlvblsxXSkvZi53b3JsZFNjYWxpbmdbMV1dfWVsc2UgaWYoYyYmZy5ib3hQb2ludCl7Y29uc3QgTT1bY1swXS9mLndvcmxkU2NhbGluZ1swXSxjWzFdL2Yud29ybGRTY2FsaW5nWzFdXTtnLmJveFBvaW50PVtnLmJveFBvaW50WzBdK01bMF0sZy5ib3hQb2ludFsxXStNWzFdXSxoLmNlbnRlclBvcz1baC5jZW50ZXJQb3NbMF0rTVswXSxoLmNlbnRlclBvc1sxXStNWzFdXSxoLnJlY3Q9Q2UoaC5yZWN0LE0pfXJldHVybiBoJiZhLnNldEluZm8oZS5uYW1lLGgpLGg9PW51bGw/dm9pZCAwOmgucmVjdH1zdGF0aWMgZ2V0UmVjdEZyb21MYXllcih0LGUpe2NvbnN0IG49dC5nZXRFbGVtZW50c0J5TmFtZShlKVswXTtpZihuKXtjb25zdCBhPW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJue3g6TWF0aC5mbG9vcihhLngpLHk6TWF0aC5mbG9vcihhLnkpLHc6TWF0aC5mbG9vcihhLndpZHRoKSxoOk1hdGguZmxvb3IoYS5oZWlnaHQpfX19fWZ1bmN0aW9uIFZuKGQpe3N3aXRjaChkKXtjYXNlIGd0LkFycm93OnJldHVybiBGbjtjYXNlIGd0LlBlbmNpbDpyZXR1cm4gTW47Y2FzZSBndC5TdHJhaWdodDpyZXR1cm4gS247Y2FzZSBndC5FbGxpcHNlOnJldHVybiBqbjtjYXNlIGd0LlBvbHlnb246Y2FzZSBndC5UcmlhbmdsZTpyZXR1cm4gem47Y2FzZSBndC5TdGFyOmNhc2UgZ3QuUmhvbWJ1czpyZXR1cm4gJG47Y2FzZSBndC5SZWN0YW5nbGU6cmV0dXJuIFVuO2Nhc2UgZ3QuU3BlZWNoQmFsbG9vbjpyZXR1cm4gR247Y2FzZSBndC5UZXh0OnJldHVybiBSZTtjYXNlIGd0Lkxhc2VyUGVuOnJldHVybiBPbjtjYXNlIGd0LkVyYXNlcjpyZXR1cm4gYWU7Y2FzZSBndC5TZWxlY3RvcjpyZXR1cm4gd3Q7Y2FzZSBndC5JbWFnZTpyZXR1cm4gSG59fWZ1bmN0aW9uIHlyKGQscil7Y29uc3R7dG9vbHNUeXBlOnQsLi4uZX09ZDtzd2l0Y2godCl7Y2FzZSBndC5BcnJvdzpyZXR1cm4gbmV3IEZuKGUpO2Nhc2UgZ3QuUGVuY2lsOnJldHVybiBuZXcgTW4oZSk7Y2FzZSBndC5TdHJhaWdodDpyZXR1cm4gbmV3IEtuKGUpO2Nhc2UgZ3QuRWxsaXBzZTpyZXR1cm4gbmV3IGpuKGUpO2Nhc2UgZ3QuUG9seWdvbjpjYXNlIGd0LlRyaWFuZ2xlOnJldHVybiBuZXcgem4oZSk7Y2FzZSBndC5TdGFyOmNhc2UgZ3QuUmhvbWJ1czpyZXR1cm4gbmV3ICRuKGUpO2Nhc2UgZ3QuUmVjdGFuZ2xlOnJldHVybiBuZXcgVW4oZSk7Y2FzZSBndC5TcGVlY2hCYWxsb29uOnJldHVybiBuZXcgR24oZSk7Y2FzZSBndC5UZXh0OnJldHVybiBuZXcgUmUoZSk7Y2FzZSBndC5MYXNlclBlbjpyZXR1cm4gbmV3IE9uKGUpO2Nhc2UgZ3QuRXJhc2VyOnJldHVybiBuZXcgYWUoZSxyKTtjYXNlIGd0LlNlbGVjdG9yOnJldHVybiBuZXcgd3QoZSk7Y2FzZSBndC5JbWFnZTpyZXR1cm4gbmV3IEhuKGUpO2RlZmF1bHQ6cmV0dXJufX1mdW5jdGlvbiBZbihkKXtjb25zdCByPVtdLHQ9WyJQQVRIIiwiU1BSSVRFIiwiUE9MWUxJTkUiLCJSRUNUIiwiRUxMSVBTRSJdO2Zvcihjb25zdCBlIG9mIGQpe2lmKGUudGFnTmFtZT09PSJHUk9VUCImJmUuY2hpbGRyZW4ubGVuZ3RoKXJldHVybiBZbihlLmNoaWxkcmVuKTtlLnRhZ05hbWUmJnQuaW5jbHVkZXMoZS50YWdOYW1lKSYmci5wdXNoKGUpfXJldHVybiByfWNsYXNzIHMwIGV4dGVuZHMgSnR7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3N0KHRoaXMsImVtaXRFdmVudFR5cGUiLEx0LlpJbmRleEFjdGl2ZSl9Y29uc3VtZSh0KXtjb25zdHttc2dUeXBlOmUsZGF0YVR5cGU6bixlbWl0RXZlbnRUeXBlOmF9PXQ7aWYoZT09PWx0LlVwZGF0ZU5vZGUmJm49PT1UdC5Mb2NhbCYmYT09PXRoaXMuZW1pdEV2ZW50VHlwZSlyZXR1cm4gdGhpcy5jb25zdW1lRm9yTG9jYWxXb3JrZXIodCksITB9Y29uc3VtZUZvckxvY2FsV29ya2VyKHQpe3ZhciBvLGMsbSx1LHA7Y29uc3R7d29ya0lkOmUsaXNBY3RpdmVaSW5kZXg6bix3aWxsUmVmcmVzaFNlbGVjdG9yOmF9PXQ7aWYoZSE9PXd0LnNlbGVjdG9ySWQpcmV0dXJuO2NvbnN0IHM9KG89dGhpcy5sb2NhbFdvcmspPT1udWxsP3ZvaWQgMDpvLndvcmtTaGFwZXMuZ2V0KHd0LnNlbGVjdG9ySWQpO2lmKCFzKXJldHVybjtjb25zdCBpPXMub2xkU2VsZWN0UmVjdDtpZihuJiZpJiZ0aGlzLmxvY2FsV29yayl7Y29uc3QgeT1uZXcgU2V0O2lmKHRoaXMubG9jYWxXb3JrLnZOb2Rlcy5jdXJOb2RlTWFwLmZvckVhY2goKE8seCk9Pnt4ZShpLE8ucmVjdCkmJnkuYWRkKHgpfSkseS5zaXplKXtjb25zdCBPPVtdO3kuZm9yRWFjaCh4PT57dmFyIHY7KHY9dGhpcy5sb2NhbFdvcmspPT1udWxsfHx2LmZ1bGxMYXllci5nZXRFbGVtZW50c0J5TmFtZSh4KS5mb3JFYWNoKFQ9Pnt2YXIgaCxmO2NvbnN0IGw9VC5jbG9uZU5vZGUoITApO0hlKFQpJiZsLnNlYWwoKSwoZj0oaD10aGlzLmxvY2FsV29yayk9PW51bGw/dm9pZCAwOmguZHJhd0xheWVyKSE9bnVsbCYmZi5nZXRFbGVtZW50c0J5TmFtZSh4KS5sZW5ndGh8fE8ucHVzaChsKX0pfSksTy5sZW5ndGgmJigoYz10aGlzLmxvY2FsV29yay5kcmF3TGF5ZXIpPT1udWxsfHxjLmFwcGVuZCguLi5PKSl9fWVsc2UodT0obT10aGlzLmxvY2FsV29yayk9PW51bGw/dm9pZCAwOm0uZHJhd0xheWVyKT09bnVsbHx8dS5jaGlsZHJlbi5maWx0ZXIoeT0+e3ZhciBPO3JldHVybiEoKE89cy5zZWxlY3RJZHMpIT1udWxsJiZPLmluY2x1ZGVzKHkubmFtZSkpfSkuZm9yRWFjaCh5PT55LnJlbW92ZSgpKTthJiYoKHA9dGhpcy5sb2NhbFdvcmspPT1udWxsfHxwLl9wb3N0KHtyZW5kZXI6W3tyZWN0OmksZHJhd0NhbnZhczpTdC5TZWxlY3RvcixjbGVhckNhbnZhczpTdC5TZWxlY3Rvcixpc0NsZWFyOiEwLGlzRnVsbFdvcms6ITEsdmlld0lkOnRoaXMubG9jYWxXb3JrLnZpZXdJZH1dLHNwOlt7dHlwZTpsdC5TZWxlY3Qsc2VsZWN0SWRzOnMuc2VsZWN0SWRzLG9wdDpzLmdldFdvcmtPcHRpb25zKCksc2VsZWN0UmVjdDppLHN0cm9rZUNvbG9yOnMuc3Ryb2tlQ29sb3IsZmlsbENvbG9yOnMuZmlsbENvbG9yLHdpbGxTeW5jU2VydmljZTohMSxpc1N5bmM6ITB9XX0pKX19Y2xhc3MgbzAgZXh0ZW5kcyBKdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7c3QodGhpcywiZW1pdEV2ZW50VHlwZSIsTHQuQ29weU5vZGUpfWNvbnN1bWUodCl7Y29uc3R7bXNnVHlwZTplLGRhdGFUeXBlOm4sZW1pdEV2ZW50VHlwZTphLHVuZG9UaWNrZXJJZDpzfT10O2lmKGU9PT1sdC5GdWxsV29yayYmbj09PVR0LkxvY2FsJiZhPT09dGhpcy5lbWl0RXZlbnRUeXBlKXJldHVybiB0aGlzLmNvbnN1bWVGb3JMb2NhbFdvcmtlcih0KS5maW5hbGx5KCgpPT57cyYmc2V0VGltZW91dCgoKT0+e3ZhciBpOyhpPXRoaXMubG9jYWxXb3JrKT09bnVsbHx8aS5fcG9zdCh7c3A6W3t0eXBlOmx0Lk5vbmUsdW5kb1RpY2tlcklkOnN9XX0pfSwwKX0pLCEwfWFzeW5jIGNvbnN1bWVGb3JMb2NhbFdvcmtlcih0KXt2YXIgbjtjb25zdHt3b3JrSWQ6ZX09dDtlJiZhd2FpdCgobj10aGlzLmxvY2FsV29yayk9PW51bGw/dm9pZCAwOm4uY29uc3VtZUZ1bGwodCx0aGlzLnNjZW5lKSl9fWNsYXNzIGEwIGV4dGVuZHMgSnR7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3N0KHRoaXMsImVtaXRFdmVudFR5cGUiLEx0LlNldENvbG9yTm9kZSl9Y29uc3VtZSh0KXtjb25zdHttc2dUeXBlOmUsZGF0YVR5cGU6bixlbWl0RXZlbnRUeXBlOmEsdW5kb1RpY2tlcklkOnN9PXQ7aWYoZT09PWx0LlVwZGF0ZU5vZGUmJm49PT1UdC5Mb2NhbCYmYT09PXRoaXMuZW1pdEV2ZW50VHlwZSlyZXR1cm4gdGhpcy5jb25zdW1lRm9yTG9jYWxXb3JrZXIodCkuZmluYWxseSgoKT0+e3MmJnNldFRpbWVvdXQoKCk9Pnt2YXIgaTsoaT10aGlzLmxvY2FsV29yayk9PW51bGx8fGkuX3Bvc3Qoe3NwOlt7dHlwZTpsdC5Ob25lLHVuZG9UaWNrZXJJZDpzfV19KX0sMCl9KSwhMH1hc3luYyBjb25zdW1lRm9yTG9jYWxXb3JrZXIodCl7dmFyIGM7Y29uc3R7d29ya0lkOmUsdXBkYXRlTm9kZU9wdDpuLHdpbGxSZWZyZXNoU2VsZWN0b3I6YSx3aWxsU3luY1NlcnZpY2U6cyx3aWxsU2VyaWFsaXplRGF0YTppLHRleHRVcGRhdGVGb3JXb2tlcjpvfT10O2U9PT13dC5zZWxlY3RvcklkJiZuJiZhd2FpdCgoYz10aGlzLmxvY2FsV29yayk9PW51bGw/dm9pZCAwOmMudXBkYXRlU2VsZWN0b3Ioe3VwZGF0ZVNlbGVjdG9yT3B0Om4sd2lsbFJlZnJlc2hTZWxlY3RvcjphLHdpbGxTeW5jU2VydmljZTpzLHdpbGxTZXJpYWxpemVEYXRhOmksdGV4dFVwZGF0ZUZvcldva2VyOm8sY2FsbGJhY2s6dGhpcy51cGRhdGVTZWxlY3RvckNhbGxiYWNrfSkpfXVwZGF0ZVNlbGVjdG9yQ2FsbGJhY2sodCl7Y29uc3R7cGFyYW06ZSxwb3N0RGF0YTpuLG5ld1NlcnZpY2VTdG9yZTphfT10LHt3aWxsU3luY1NlcnZpY2U6cyxpc1N5bmM6aSx0ZXh0VXBkYXRlRm9yV29rZXI6b309ZSxjPW4ucmVuZGVyfHxbXSxtPW4uc3B8fFtdO2lmKHMpZm9yKGNvbnN0W3UscF1vZiBhLmVudHJpZXMoKSlvJiZwLnRvb2xzVHlwZT09PWd0LlRleHQ/bS5wdXNoKHsuLi5wLHdvcmtJZDp1LHR5cGU6bHQuVGV4dFVwZGF0ZSxkYXRhVHlwZTpUdC5Mb2NhbCx3aWxsU3luY1NlcnZpY2U6ITB9KTptLnB1c2goey4uLnAsd29ya0lkOnUsdHlwZTpsdC5VcGRhdGVOb2RlLHVwZGF0ZU5vZGVPcHQ6e3VzZUFuaW1hdGlvbjohMX0saXNTeW5jOml9KTtyZXR1cm57cmVuZGVyOmMsc3A6bX19fWNsYXNzIGwwIGV4dGVuZHMgSnR7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3N0KHRoaXMsImVtaXRFdmVudFR5cGUiLEx0LlpJbmRleE5vZGUpfWNvbnN1bWUodCl7Y29uc3R7bXNnVHlwZTplLGRhdGFUeXBlOm4sZW1pdEV2ZW50VHlwZTphfT10O2lmKGU9PT1sdC5VcGRhdGVOb2RlJiZuPT09VHQuTG9jYWwmJmE9PT10aGlzLmVtaXRFdmVudFR5cGUpcmV0dXJuIHRoaXMuY29uc3VtZUZvckxvY2FsV29ya2VyKHQpLCEwfWFzeW5jIGNvbnN1bWVGb3JMb2NhbFdvcmtlcih0KXt2YXIgbztjb25zdHt3b3JrSWQ6ZSx1cGRhdGVOb2RlT3B0Om4sd2lsbFJlZnJlc2hTZWxlY3RvcjphLHdpbGxTeW5jU2VydmljZTpzLHdpbGxTZXJpYWxpemVEYXRhOml9PXQ7ZT09PXd0LnNlbGVjdG9ySWQmJm4mJmF3YWl0KChvPXRoaXMubG9jYWxXb3JrKT09bnVsbD92b2lkIDA6by51cGRhdGVTZWxlY3Rvcih7dXBkYXRlU2VsZWN0b3JPcHQ6bix3aWxsUmVmcmVzaFNlbGVjdG9yOmEsd2lsbFN5bmNTZXJ2aWNlOnMsd2lsbFNlcmlhbGl6ZURhdGE6aSxjYWxsYmFjazp0aGlzLnVwZGF0ZVNlbGVjdG9yQ2FsbGJhY2t9KSl9dXBkYXRlU2VsZWN0b3JDYWxsYmFjayh0KXtjb25zdHtwYXJhbTplLHBvc3REYXRhOm4sbmV3U2VydmljZVN0b3JlOmF9PXQse3dpbGxTeW5jU2VydmljZTpzLGlzU3luYzppfT1lLG89bi5yZW5kZXJ8fFtdLGM9bi5zcHx8W107aWYocyYmYylmb3IoY29uc3RbbSx1XW9mIGEuZW50cmllcygpKWMucHVzaCh7Li4udSx3b3JrSWQ6bSx0eXBlOmx0LlVwZGF0ZU5vZGUsdXBkYXRlTm9kZU9wdDp7dXNlQW5pbWF0aW9uOiExfSxpc1N5bmM6aX0pO3JldHVybntyZW5kZXI6byxzcDpjfX19Y2xhc3MgYzAgZXh0ZW5kcyBKdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7c3QodGhpcywiZW1pdEV2ZW50VHlwZSIsTHQuVHJhbnNsYXRlTm9kZSl9Y29uc3VtZSh0KXtjb25zdHttc2dUeXBlOmUsZGF0YVR5cGU6bixlbWl0RXZlbnRUeXBlOmEsdW5kb1RpY2tlcklkOnN9PXQ7aWYoZT09PWx0LlVwZGF0ZU5vZGUmJm49PT1UdC5Mb2NhbCYmYT09PXRoaXMuZW1pdEV2ZW50VHlwZSlyZXR1cm4gdGhpcy5jb25zdW1lRm9yTG9jYWxXb3JrZXIodCkuZmluYWxseSgoKT0+e3MmJnNldFRpbWVvdXQoKCk9Pnt2YXIgaTsoaT10aGlzLmxvY2FsV29yayk9PW51bGx8fGkuX3Bvc3Qoe3NwOlt7dHlwZTpsdC5Ob25lLHVuZG9UaWNrZXJJZDpzfV19KX0sMCl9KSwhMH1hc3luYyBjb25zdW1lRm9yTG9jYWxXb3JrZXIodCl7dmFyIG0sdTtjb25zdHt3b3JrSWQ6ZSx1cGRhdGVOb2RlT3B0Om4sd2lsbFJlZnJlc2hTZWxlY3RvcjphLHdpbGxTeW5jU2VydmljZTpzLHdpbGxTZXJpYWxpemVEYXRhOmksdGV4dFVwZGF0ZUZvcldva2VyOm8sZW1pdEV2ZW50VHlwZTpjfT10O2U9PT13dC5zZWxlY3RvcklkJiZuJiYobi53b3JrU3RhdGU9PT1JdC5Eb25lJiYobiE9bnVsbCYmbi50cmFuc2xhdGUpJiYobi50cmFuc2xhdGVbMF18fG4udHJhbnNsYXRlWzFdKXx8bi53b3JrU3RhdGUhPT1JdC5Eb25lP2F3YWl0KChtPXRoaXMubG9jYWxXb3JrKT09bnVsbD92b2lkIDA6bS51cGRhdGVTZWxlY3Rvcih7dXBkYXRlU2VsZWN0b3JPcHQ6bix3aWxsUmVmcmVzaFNlbGVjdG9yOmEsd2lsbFN5bmNTZXJ2aWNlOnMsd2lsbFNlcmlhbGl6ZURhdGE6aSxpc1N5bmM6ITAsdGV4dFVwZGF0ZUZvcldva2VyOm8sZW1pdEV2ZW50VHlwZTpjLHNjZW5lOnRoaXMuc2NlbmUsY2FsbGJhY2s6dGhpcy51cGRhdGVTZWxlY3RvckNhbGxiYWNrfSkpOm4ud29ya1N0YXRlPT09SXQuRG9uZSYmKCh1PXRoaXMubG9jYWxXb3JrKT09bnVsbHx8dS52Tm9kZXMuZGVsZXRlTGFzdFRhcmdldCgpKSl9dXBkYXRlU2VsZWN0b3JDYWxsYmFjayh0KXtjb25zdHtwYXJhbTplLHBvc3REYXRhOm4sbmV3U2VydmljZVN0b3JlOmEsd29ya1NoYXBlTm9kZTpzLHJlczppfT10LHt3aWxsU3luY1NlcnZpY2U6byxpc1N5bmM6Yyx1cGRhdGVTZWxlY3Rvck9wdDptLHdpbGxTZXJpYWxpemVEYXRhOnUsdGV4dFVwZGF0ZUZvcldva2VyOnB9PWUseT1tLndvcmtTdGF0ZSxPPW4ucmVuZGVyfHxbXSx4PW4uc3B8fFtdO2lmKHk9PT1JdC5TdGFydClyZXR1cm57c3A6W10scmVuZGVyOltdfTtjb25zdCB2PWk9PW51bGw/dm9pZCAwOmkuc2VsZWN0UmVjdDtpZihvKXtpZih1KXtjb25zdCBUPXMuZ2V0Q2hpbGRyZW5Qb2ludHMoKTtUJiZ4LnB1c2goe3R5cGU6bHQuU2VsZWN0LHNlbGVjdElkczpzLnNlbGVjdElkcyxzZWxlY3RSZWN0OnYsd2lsbFN5bmNTZXJ2aWNlOiExLGlzU3luYzpjLHBvaW50czpUfSl9Zm9yKGNvbnN0W1QsbF1vZiBhLmVudHJpZXMoKSlwJiZsLnRvb2xzVHlwZT09PWd0LlRleHQ/eC5wdXNoKHsuLi5sLHdvcmtJZDpULHR5cGU6bHQuVGV4dFVwZGF0ZSxkYXRhVHlwZTpUdC5Mb2NhbCx3aWxsU3luY1NlcnZpY2U6ITB9KTp4LnB1c2goey4uLmwsd29ya0lkOlQsdHlwZTpsdC5VcGRhdGVOb2RlLHVwZGF0ZU5vZGVPcHQ6e3VzZUFuaW1hdGlvbjohMX0saXNTeW5jOmN9KX1yZXR1cm57cmVuZGVyOk8sc3A6eH19fWNsYXNzIGYwIGV4dGVuZHMgSnR7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3N0KHRoaXMsImVtaXRFdmVudFR5cGUiLEx0LkRlbGV0ZU5vZGUpfWNvbnN1bWUodCl7Y29uc3R7bXNnVHlwZTplLGRhdGFUeXBlOm4sZW1pdEV2ZW50VHlwZTphfT10O2lmKGU9PT1sdC5SZW1vdmVOb2RlKXtpZihuPT09VHQuTG9jYWwmJmE9PT10aGlzLmVtaXRFdmVudFR5cGUpcmV0dXJuIHRoaXMuY29uc3VtZUZvckxvY2FsV29ya2VyKHQpLCEwO2lmKG49PT1UdC5TZXJ2aWNlJiZhPT09dGhpcy5lbWl0RXZlbnRUeXBlKXJldHVybiB0aGlzLmNvbnN1bWVGb3JTZXJ2aWNlV29ya2VyKHQpLCEwfX1jb25zdW1lRm9yTG9jYWxXb3JrZXIodCl7aWYoIXRoaXMubG9jYWxXb3JrKXJldHVybjtjb25zdHtyZW1vdmVJZHM6ZSx3aWxsUmVmcmVzaDpuLHdpbGxTeW5jU2VydmljZTphLHZpZXdJZDpzfT10O2lmKCEoZSE9bnVsbCYmZS5sZW5ndGgpKXJldHVybjtsZXQgaTtjb25zdCBvPVtdLGM9W10sbT1bXTtmb3IoY29uc3QgdSBvZiBlKXtpZih1PT09d3Quc2VsZWN0b3JJZCl7Y29uc3QgeT10aGlzLmxvY2FsV29yay53b3JrU2hhcGVzLmdldCh3dC5zZWxlY3RvcklkKTtpZigheSlyZXR1cm47Y29uc3QgTz15LnNlbGVjdElkcyYmWy4uLnkuc2VsZWN0SWRzXXx8W107Zm9yKGNvbnN0IHYgb2YgTyl7aWYodGhpcy5sb2NhbFdvcmsudk5vZGVzLmdldCh2KSl7Y29uc3QgbD10aGlzLmNvbW1hbmREZWxldGVUZXh0KHYpO2wmJm8ucHVzaChsKX1pPU90KGksdGhpcy5sb2NhbFdvcmsucmVtb3ZlTm9kZSh2KSksbS5wdXNoKHYpfWNvbnN0IHg9eT09bnVsbD92b2lkIDA6eS51cGRhdGVTZWxlY3RJZHMoW10pO2k9T3QoaSx4LmJnUmVjdCksdGhpcy5sb2NhbFdvcmsuY2xlYXJXb3JrU2hhcGVOb2RlQ2FjaGUod3Quc2VsZWN0b3JJZCksdGhpcy5sb2NhbFdvcmsud29ya1NoYXBlcy5kZWxldGUod3Quc2VsZWN0b3JJZCksby5wdXNoKHt0eXBlOmx0LlNlbGVjdCxzZWxlY3RJZHM6W10sd2lsbFN5bmNTZXJ2aWNlOmF9KTtjb250aW51ZX1jb25zdCBwPXRoaXMuY29tbWFuZERlbGV0ZVRleHQodSk7cCYmby5wdXNoKHApLGk9T3QoaSx0aGlzLmxvY2FsV29yay5yZW1vdmVOb2RlKHUpKSxtLnB1c2godSl9YSYmby5wdXNoKHt0eXBlOmx0LlJlbW92ZU5vZGUscmVtb3ZlSWRzOm0sdW5kb1RpY2tlcklkOnQudW5kb1RpY2tlcklkfSksaSYmbiYmYy5wdXNoKHtyZWN0OmksZHJhd0NhbnZhczpTdC5CZyxjbGVhckNhbnZhczpTdC5CZyxpc0NsZWFyOiEwLGlzRnVsbFdvcms6ITAsdmlld0lkOnN9KSwoYy5sZW5ndGh8fG8ubGVuZ3RoKSYmdGhpcy5sb2NhbFdvcmsuX3Bvc3Qoe3JlbmRlcjpjLHNwOm99KX1jb25zdW1lRm9yU2VydmljZVdvcmtlcih0KXt0aGlzLnNlcnZpY2VXb3JrJiZ0aGlzLnNlcnZpY2VXb3JrLnJlbW92ZVNlbGVjdFdvcmsodCl9Y29tbWFuZERlbGV0ZVRleHQodCl7dmFyIG47Y29uc3QgZT0obj10aGlzLmxvY2FsV29yayk9PW51bGw/dm9pZCAwOm4udk5vZGVzLmdldCh0KTtpZihlJiZlLnRvb2xzVHlwZT09PWd0LlRleHQpcmV0dXJue3R5cGU6bHQuVGV4dFVwZGF0ZSx0b29sc1R5cGU6Z3QuVGV4dCx3b3JrSWQ6dCxkYXRhVHlwZTpUdC5Mb2NhbH19fWNsYXNzIHUwIGV4dGVuZHMgSnR7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3N0KHRoaXMsImVtaXRFdmVudFR5cGUiLEx0LlNjYWxlTm9kZSl9Y29uc3VtZSh0KXtjb25zdHttc2dUeXBlOmUsZGF0YVR5cGU6bixlbWl0RXZlbnRUeXBlOmEsdW5kb1RpY2tlcklkOnN9PXQ7aWYoZT09PWx0LlVwZGF0ZU5vZGUmJm49PT1UdC5Mb2NhbCYmYT09PXRoaXMuZW1pdEV2ZW50VHlwZSlyZXR1cm4gdGhpcy5jb25zdW1lRm9yTG9jYWxXb3JrZXIodCkuZmluYWxseSgoKT0+e3MmJnNldFRpbWVvdXQoKCk9Pnt2YXIgaTsoaT10aGlzLmxvY2FsV29yayk9PW51bGx8fGkuX3Bvc3Qoe3NwOlt7dHlwZTpsdC5Ob25lLHVuZG9UaWNrZXJJZDpzfV19KX0sMCl9KSwhMH1hc3luYyBjb25zdW1lRm9yTG9jYWxXb3JrZXIodCl7dmFyIGk7Y29uc3R7d29ya0lkOmUsdXBkYXRlTm9kZU9wdDpuLHdpbGxTeW5jU2VydmljZTphLHdpbGxTZXJpYWxpemVEYXRhOnN9PXQ7ZT09PXd0LnNlbGVjdG9ySWQmJm4mJmF3YWl0KChpPXRoaXMubG9jYWxXb3JrKT09bnVsbD92b2lkIDA6aS51cGRhdGVTZWxlY3Rvcih7dXBkYXRlU2VsZWN0b3JPcHQ6bix3aWxsU3luY1NlcnZpY2U6YSx3aWxsU2VyaWFsaXplRGF0YTpzLGlzU3luYzohMCxzY2VuZTp0aGlzLnNjZW5lLGNhbGxiYWNrOnRoaXMudXBkYXRlU2VsZWN0b3JDYWxsYmFjay5iaW5kKHRoaXMpfSkpfXVwZGF0ZVNlbGVjdG9yQ2FsbGJhY2sodCl7Y29uc3R7cGFyYW06ZSxwb3N0RGF0YTpuLHdvcmtTaGFwZU5vZGU6YSxyZXM6cyxuZXdTZXJ2aWNlU3RvcmU6aX09dCx7dXBkYXRlU2VsZWN0b3JPcHQ6byx3aWxsU3luY1NlcnZpY2U6Yyx3aWxsU2VyaWFsaXplRGF0YTptfT1lLHU9by53b3JrU3RhdGUscD1uLnJlbmRlcnx8W10seT1uLnNwfHxbXSxPPXM9PW51bGw/dm9pZCAwOnMuc2VsZWN0UmVjdCx4PXM9PW51bGw/dm9pZCAwOnMucmVuZGVyUmVjdDtpZih1PT09SXQuU3RhcnQpcmV0dXJue3NwOltdLHJlbmRlcjpbXX07aWYodGhpcy5sb2NhbFdvcmspe3AucHVzaCh7aXNDbGVhckFsbDohMCxpc0Z1bGxXb3JrOiExLGNsZWFyQ2FudmFzOlN0LlNlbGVjdG9yLHZpZXdJZDp0aGlzLmxvY2FsV29yay52aWV3SWR9KTtjb25zdCB2PXtyZWN0OngsaXNGdWxsV29yazohMSxkcmF3Q2FudmFzOlN0LlNlbGVjdG9yLHZpZXdJZDp0aGlzLmxvY2FsV29yay52aWV3SWR9O3AucHVzaCh2KX1pZihjKXt1PT09SXQuRG9pbmcmJnkucHVzaCh7dHlwZTpsdC5TZWxlY3Qsc2VsZWN0SWRzOmEuc2VsZWN0SWRzLHNlbGVjdFJlY3Q6Tyx3aWxsU3luY1NlcnZpY2U6ITAsaXNTeW5jOiEwLHBvaW50czphLmdldENoaWxkcmVuUG9pbnRzKCksdGV4dE9wdDphLnRleHRPcHR9KSxtJiZ1PT09SXQuRG9uZSYmeS5wdXNoKHt0eXBlOmx0LlNlbGVjdCxzZWxlY3RJZHM6YS5zZWxlY3RJZHMsc2VsZWN0UmVjdDpPLHdpbGxTeW5jU2VydmljZTohMSxpc1N5bmM6ITAscG9pbnRzOmEuZ2V0Q2hpbGRyZW5Qb2ludHMoKSx0ZXh0T3B0OmEudGV4dE9wdH0pO2Zvcihjb25zdFt2LFRdb2YgaS5lbnRyaWVzKCkpVC50b29sc1R5cGU9PT1ndC5UZXh0P3kucHVzaCh7Li4uVCx3b3JrSWQ6dix0eXBlOmx0LlRleHRVcGRhdGUsZGF0YVR5cGU6VHQuTG9jYWwsd2lsbFN5bmNTZXJ2aWNlOiEwfSk6eS5wdXNoKHsuLi5ULHdvcmtJZDp2LHR5cGU6bHQuVXBkYXRlTm9kZSx1cGRhdGVOb2RlT3B0Ont1c2VBbmltYXRpb246ITF9LGlzU3luYzohMH0pfXJldHVybntyZW5kZXI6cCxzcDp5fX19Y2xhc3MgaDAgZXh0ZW5kcyBKdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7c3QodGhpcywiZW1pdEV2ZW50VHlwZSIsTHQuUm90YXRlTm9kZSl9Y29uc3VtZSh0KXtjb25zdHttc2dUeXBlOmUsZGF0YVR5cGU6bixlbWl0RXZlbnRUeXBlOmEsdW5kb1RpY2tlcklkOnN9PXQ7aWYoZT09PWx0LlVwZGF0ZU5vZGUmJm49PT1UdC5Mb2NhbCYmYT09PXRoaXMuZW1pdEV2ZW50VHlwZSlyZXR1cm4gdGhpcy5jb25zdW1lRm9yTG9jYWxXb3JrZXIodCkuZmluYWxseSgoKT0+e3MmJnNldFRpbWVvdXQoKCk9Pnt2YXIgaTsoaT10aGlzLmxvY2FsV29yayk9PW51bGx8fGkuX3Bvc3Qoe3NwOlt7dHlwZTpsdC5Ob25lLHVuZG9UaWNrZXJJZDpzfV19KX0sMCl9KSwhMH1hc3luYyBjb25zdW1lRm9yTG9jYWxXb3JrZXIodCl7dmFyIGM7Y29uc3R7d29ya0lkOmUsdXBkYXRlTm9kZU9wdDpuLHdpbGxSZWZyZXNoU2VsZWN0b3I6YSx3aWxsU3luY1NlcnZpY2U6cyx3aWxsU2VyaWFsaXplRGF0YTppLGVtaXRFdmVudFR5cGU6b309dDtlPT09d3Quc2VsZWN0b3JJZCYmbiYmYXdhaXQoKGM9dGhpcy5sb2NhbFdvcmspPT1udWxsP3ZvaWQgMDpjLnVwZGF0ZVNlbGVjdG9yKHt1cGRhdGVTZWxlY3Rvck9wdDpuLHdpbGxSZWZyZXNoU2VsZWN0b3I6YSx3aWxsU3luY1NlcnZpY2U6cyx3aWxsU2VyaWFsaXplRGF0YTppLGVtaXRFdmVudFR5cGU6byxpc1N5bmM6ITAsc2NlbmU6dGhpcy5zY2VuZSxjYWxsYmFjazp0aGlzLnVwZGF0ZVNlbGVjdG9yQ2FsbGJhY2t9KSl9dXBkYXRlU2VsZWN0b3JDYWxsYmFjayh0KXtjb25zdHtwYXJhbTplLHBvc3REYXRhOm4sd29ya1NoYXBlTm9kZTphLHJlczpzLG5ld1NlcnZpY2VTdG9yZTppfT10LHt1cGRhdGVTZWxlY3Rvck9wdDpvLHdpbGxTeW5jU2VydmljZTpjLHdpbGxTZXJpYWxpemVEYXRhOm0saXNTeW5jOnV9PWUscD1vLndvcmtTdGF0ZSx5PW4ucmVuZGVyfHxbXSxPPW4uc3B8fFtdLHg9cz09bnVsbD92b2lkIDA6cy5zZWxlY3RSZWN0O2lmKGMpe20mJnA9PT1JdC5Eb25lJiZPLnB1c2goe3R5cGU6bHQuU2VsZWN0LHNlbGVjdElkczphLnNlbGVjdElkcyxzZWxlY3RSZWN0Ongsd2lsbFN5bmNTZXJ2aWNlOiEwLGlzU3luYzp1LHBvaW50czphLmdldENoaWxkcmVuUG9pbnRzKCl9KTtmb3IoY29uc3RbdixUXW9mIGkuZW50cmllcygpKU8ucHVzaCh7Li4uVCx3b3JrSWQ6dix0eXBlOmx0LlVwZGF0ZU5vZGUsdXBkYXRlTm9kZU9wdDp7dXNlQW5pbWF0aW9uOiExfSxpc1N5bmM6dX0pfXJldHVybntyZW5kZXI6eSxzcDpPfX19Y2xhc3MgZDAgZXh0ZW5kcyBKdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7c3QodGhpcywiZW1pdEV2ZW50VHlwZSIsTHQuU2V0Rm9udFN0eWxlKX1jb25zdW1lKHQpe2NvbnN0e21zZ1R5cGU6ZSxkYXRhVHlwZTpuLGVtaXRFdmVudFR5cGU6YSx1bmRvVGlja2VySWQ6c309dDtpZihlPT09bHQuVXBkYXRlTm9kZSYmbj09PVR0LkxvY2FsJiZhPT09dGhpcy5lbWl0RXZlbnRUeXBlKXJldHVybiB0aGlzLmNvbnN1bWVGb3JMb2NhbFdvcmtlcih0KS5maW5hbGx5KCgpPT57cyYmc2V0VGltZW91dCgoKT0+e3ZhciBpOyhpPXRoaXMubG9jYWxXb3JrKT09bnVsbHx8aS5fcG9zdCh7c3A6W3t0eXBlOmx0Lk5vbmUsdW5kb1RpY2tlcklkOnN9XX0pfSwwKX0pLCEwfWFzeW5jIGNvbnN1bWVGb3JMb2NhbFdvcmtlcih0KXt2YXIgYztjb25zdHt3b3JrSWQ6ZSx1cGRhdGVOb2RlT3B0Om4sd2lsbFJlZnJlc2hTZWxlY3RvcjphLHdpbGxTeW5jU2VydmljZTpzLHdpbGxTZXJpYWxpemVEYXRhOmksdGV4dFVwZGF0ZUZvcldva2VyOm99PXQ7ZT09PXd0LnNlbGVjdG9ySWQmJm4mJmF3YWl0KChjPXRoaXMubG9jYWxXb3JrKT09bnVsbD92b2lkIDA6Yy51cGRhdGVTZWxlY3Rvcih7dXBkYXRlU2VsZWN0b3JPcHQ6bix3aWxsUmVmcmVzaFNlbGVjdG9yOmEsd2lsbFN5bmNTZXJ2aWNlOnMsd2lsbFNlcmlhbGl6ZURhdGE6aSx0ZXh0VXBkYXRlRm9yV29rZXI6byxjYWxsYmFjazp0aGlzLnVwZGF0ZVNlbGVjdG9yQ2FsbGJhY2t9KSl9dXBkYXRlU2VsZWN0b3JDYWxsYmFjayh0KXtjb25zdHtwYXJhbTplLHBvc3REYXRhOm4sbmV3U2VydmljZVN0b3JlOmEsd29ya1NoYXBlTm9kZTpzLHJlczppfT10LHt3aWxsU3luY1NlcnZpY2U6byxpc1N5bmM6Yyx1cGRhdGVTZWxlY3Rvck9wdDptLHRleHRVcGRhdGVGb3JXb2tlcjp1fT1lLHA9bi5yZW5kZXJ8fFtdLHk9bi5zcHx8W10sTz1pPT1udWxsP3ZvaWQgMDppLnNlbGVjdFJlY3Q7aWYobyYmeSl7bS5mb250U2l6ZSYmeS5wdXNoKHt0eXBlOmx0LlNlbGVjdCxzZWxlY3RJZHM6cy5zZWxlY3RJZHMsc2VsZWN0UmVjdDpPLHdpbGxTeW5jU2VydmljZTpvLGlzU3luYzpjLHBvaW50czpzLmdldENoaWxkcmVuUG9pbnRzKCl9KTtmb3IoY29uc3RbeCx2XW9mIGEuZW50cmllcygpKXUmJnYudG9vbHNUeXBlPT09Z3QuVGV4dD95LnB1c2goey4uLnYsd29ya0lkOngsdHlwZTpsdC5UZXh0VXBkYXRlLGRhdGFUeXBlOlR0LkxvY2FsLHdpbGxTeW5jU2VydmljZTohMH0pOnkucHVzaCh7Li4udix3b3JrSWQ6eCx0eXBlOmx0LlVwZGF0ZU5vZGUsdXBkYXRlTm9kZU9wdDp7dXNlQW5pbWF0aW9uOiExfSxpc1N5bmM6Y30pfXJldHVybntyZW5kZXI6cCxzcDp5fX19Y2xhc3MgZzAgZXh0ZW5kcyBKdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7c3QodGhpcywiZW1pdEV2ZW50VHlwZSIsTHQuU2V0UG9pbnQpfWNvbnN1bWUodCl7Y29uc3R7bXNnVHlwZTplLGRhdGFUeXBlOm4sZW1pdEV2ZW50VHlwZTphLHVuZG9UaWNrZXJJZDpzfT10O2lmKGU9PT1sdC5VcGRhdGVOb2RlJiZuPT09VHQuTG9jYWwmJmE9PT10aGlzLmVtaXRFdmVudFR5cGUpcmV0dXJuIHRoaXMuY29uc3VtZUZvckxvY2FsV29ya2VyKHQpLmZpbmFsbHkoKCk9PntzJiZzZXRUaW1lb3V0KCgpPT57dmFyIGk7KGk9dGhpcy5sb2NhbFdvcmspPT1udWxsfHxpLl9wb3N0KHtzcDpbe3R5cGU6bHQuTm9uZSx1bmRvVGlja2VySWQ6c31dfSl9LDApfSksITB9YXN5bmMgY29uc3VtZUZvckxvY2FsV29ya2VyKHQpe3ZhciBjO2NvbnN0e3dvcmtJZDplLHVwZGF0ZU5vZGVPcHQ6bix3aWxsUmVmcmVzaFNlbGVjdG9yOmEsd2lsbFN5bmNTZXJ2aWNlOnMsd2lsbFNlcmlhbGl6ZURhdGE6aSx0ZXh0VXBkYXRlRm9yV29rZXI6b309dDtlPT09d3Quc2VsZWN0b3JJZCYmbiYmYXdhaXQoKGM9dGhpcy5sb2NhbFdvcmspPT1udWxsP3ZvaWQgMDpjLnVwZGF0ZVNlbGVjdG9yKHt1cGRhdGVTZWxlY3Rvck9wdDpuLHdpbGxSZWZyZXNoU2VsZWN0b3I6YSx3aWxsU3luY1NlcnZpY2U6cyxlbWl0RXZlbnRUeXBlOnRoaXMuZW1pdEV2ZW50VHlwZSx3aWxsU2VyaWFsaXplRGF0YTppLGlzU3luYzohMCx0ZXh0VXBkYXRlRm9yV29rZXI6byxjYWxsYmFjazp0aGlzLnVwZGF0ZVNlbGVjdG9yQ2FsbGJhY2t9KSl9dXBkYXRlU2VsZWN0b3JDYWxsYmFjayh0KXtjb25zdHtwYXJhbTplLHBvc3REYXRhOm4sbmV3U2VydmljZVN0b3JlOmEsd29ya1NoYXBlTm9kZTpzLHJlczppfT10LHt3aWxsU3luY1NlcnZpY2U6byxpc1N5bmM6Y309ZSxtPW4ucmVuZGVyfHxbXSx1PW4uc3B8fFtdLHA9aT09bnVsbD92b2lkIDA6aS5zZWxlY3RSZWN0O2lmKG8mJnUpe2Zvcihjb25zdFt5LE9db2YgYS5lbnRyaWVzKCkpdS5wdXNoKHsuLi5PLHdvcmtJZDp5LHR5cGU6bHQuVXBkYXRlTm9kZSx1cGRhdGVOb2RlT3B0Ont1c2VBbmltYXRpb246ITF9LGlzU3luYzpjfSk7dS5wdXNoKHt0eXBlOmx0LlNlbGVjdCxzZWxlY3RJZHM6cy5zZWxlY3RJZHMsc2VsZWN0UmVjdDpwLHdpbGxTeW5jU2VydmljZTpvLGlzU3luYzpjLHBvaW50czpzLmdldENoaWxkcmVuUG9pbnRzKCl9KX1yZXR1cm57cmVuZGVyOm0sc3A6dX19fWNsYXNzIHAwIGV4dGVuZHMgSnR7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3N0KHRoaXMsImVtaXRFdmVudFR5cGUiLEx0LlNldExvY2spfWNvbnN1bWUodCl7Y29uc3R7bXNnVHlwZTplLGRhdGFUeXBlOm4sZW1pdEV2ZW50VHlwZTphLHVuZG9UaWNrZXJJZDpzfT10O2lmKGU9PT1sdC5VcGRhdGVOb2RlJiZuPT09VHQuTG9jYWwmJmE9PT10aGlzLmVtaXRFdmVudFR5cGUpcmV0dXJuIHRoaXMuY29uc3VtZUZvckxvY2FsV29ya2VyKHQpLmZpbmFsbHkoKCk9PntzJiZzZXRUaW1lb3V0KCgpPT57dmFyIGk7KGk9dGhpcy5sb2NhbFdvcmspPT1udWxsfHxpLl9wb3N0KHtzcDpbe3R5cGU6bHQuTm9uZSx1bmRvVGlja2VySWQ6c31dfSl9LDApfSksITB9YXN5bmMgY29uc3VtZUZvckxvY2FsV29ya2VyKHQpe3ZhciBvO2NvbnN0e3dvcmtJZDplLHVwZGF0ZU5vZGVPcHQ6bix3aWxsUmVmcmVzaFNlbGVjdG9yOmEsd2lsbFN5bmNTZXJ2aWNlOnMsd2lsbFNlcmlhbGl6ZURhdGE6aX09dDtlPT09d3Quc2VsZWN0b3JJZCYmbiYmYXdhaXQoKG89dGhpcy5sb2NhbFdvcmspPT1udWxsP3ZvaWQgMDpvLnVwZGF0ZVNlbGVjdG9yKHt1cGRhdGVTZWxlY3Rvck9wdDpuLHdpbGxSZWZyZXNoU2VsZWN0b3I6YSx3aWxsU3luY1NlcnZpY2U6cyx3aWxsU2VyaWFsaXplRGF0YTppLGNhbGxiYWNrOnRoaXMudXBkYXRlU2VsZWN0b3JDYWxsYmFja30pKX11cGRhdGVTZWxlY3RvckNhbGxiYWNrKHQpe2NvbnN0e3BhcmFtOmUscG9zdERhdGE6bixuZXdTZXJ2aWNlU3RvcmU6YSx3b3JrU2hhcGVOb2RlOnMscmVzOml9PXQse3dpbGxTeW5jU2VydmljZTpvLGlzU3luYzpjLHVwZGF0ZVNlbGVjdG9yT3B0Om19PWUsdT1uLnJlbmRlcnx8W10scD1uLnNwfHxbXSx5PWk9PW51bGw/dm9pZCAwOmkuc2VsZWN0UmVjdDtpZihvJiZwKXtmb3IoY29uc3RbTyx4XW9mIGEuZW50cmllcygpKXAucHVzaCh7Li4ueCx3b3JrSWQ6Tyx0eXBlOmx0LlVwZGF0ZU5vZGUsdXBkYXRlTm9kZU9wdDp7dXNlQW5pbWF0aW9uOiExfSxpc1N5bmM6Y30pO3AucHVzaCh7aXNMb2NrZWQ6bS5pc0xvY2tlZCxzZWxlY3RvckNvbG9yOnMuc2VsZWN0b3JDb2xvcixzY2FsZVR5cGU6cy5zY2FsZVR5cGUsY2FuUm90YXRlOnMuY2FuUm90YXRlLHR5cGU6bHQuU2VsZWN0LHNlbGVjdElkczpzLnNlbGVjdElkcyxzZWxlY3RSZWN0Onksd2lsbFN5bmNTZXJ2aWNlOm8saXNTeW5jOmN9KX1yZXR1cm57cmVuZGVyOnUsc3A6cH19fWNsYXNzIG0wIGV4dGVuZHMgSnR7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3N0KHRoaXMsImVtaXRFdmVudFR5cGUiLEx0LlNldFNoYXBlT3B0KX1jb25zdW1lKHQpe2NvbnN0e21zZ1R5cGU6ZSxkYXRhVHlwZTpuLGVtaXRFdmVudFR5cGU6YSx1bmRvVGlja2VySWQ6c309dDtpZihlPT09bHQuVXBkYXRlTm9kZSYmbj09PVR0LkxvY2FsJiZhPT09dGhpcy5lbWl0RXZlbnRUeXBlKXJldHVybiB0aGlzLmNvbnN1bWVGb3JMb2NhbFdvcmtlcih0KS5maW5hbGx5KCgpPT57cyYmc2V0VGltZW91dCgoKT0+e3ZhciBpOyhpPXRoaXMubG9jYWxXb3JrKT09bnVsbHx8aS5fcG9zdCh7c3A6W3t0eXBlOmx0Lk5vbmUsdW5kb1RpY2tlcklkOnN9XX0pfSwwKX0pLCEwfWFzeW5jIGNvbnN1bWVGb3JMb2NhbFdvcmtlcih0KXt2YXIgbztjb25zdHt3b3JrSWQ6ZSx1cGRhdGVOb2RlT3B0Om4sd2lsbFJlZnJlc2hTZWxlY3RvcjphLHdpbGxTeW5jU2VydmljZTpzLHdpbGxTZXJpYWxpemVEYXRhOml9PXQ7ZT09PXd0LnNlbGVjdG9ySWQmJm4mJmF3YWl0KChvPXRoaXMubG9jYWxXb3JrKT09bnVsbD92b2lkIDA6by51cGRhdGVTZWxlY3Rvcih7dXBkYXRlU2VsZWN0b3JPcHQ6bix3aWxsUmVmcmVzaFNlbGVjdG9yOmEsd2lsbFN5bmNTZXJ2aWNlOnMsd2lsbFNlcmlhbGl6ZURhdGE6aSxjYWxsYmFjazp0aGlzLnVwZGF0ZVNlbGVjdG9yQ2FsbGJhY2t9KSl9dXBkYXRlU2VsZWN0b3JDYWxsYmFjayh0KXtjb25zdHtwYXJhbTplLHBvc3REYXRhOm4sbmV3U2VydmljZVN0b3JlOmF9PXQse3dpbGxTeW5jU2VydmljZTpzLGlzU3luYzppfT1lLG89bi5yZW5kZXJ8fFtdLGM9bi5zcHx8W107aWYocyYmYylmb3IoY29uc3RbbSx1XW9mIGEuZW50cmllcygpKWMucHVzaCh7Li4udSx3b3JrSWQ6bSx0eXBlOmx0LlVwZGF0ZU5vZGUsdXBkYXRlTm9kZU9wdDp7dXNlQW5pbWF0aW9uOiExfSxpc1N5bmM6aX0pO3JldHVybntyZW5kZXI6byxzcDpjfX19Y2xhc3MgdjB7Y29uc3RydWN0b3Iocil7c3QodGhpcywiYnVpbGRlcnMiLG5ldyBNYXApO3RoaXMuYnVpbGRlcnM9bmV3IE1hcChyLm1hcCh0PT5bdCx0aGlzLmJ1aWxkKHQpXSkpfWJ1aWxkKHIpe3N3aXRjaChyKXtjYXNlIEx0LlRyYW5zbGF0ZU5vZGU6cmV0dXJuIG5ldyBjMDtjYXNlIEx0LlpJbmRleE5vZGU6cmV0dXJuIG5ldyBsMDtjYXNlIEx0LlpJbmRleEFjdGl2ZTpyZXR1cm4gbmV3IHMwO2Nhc2UgTHQuQ29weU5vZGU6cmV0dXJuIG5ldyBvMDtjYXNlIEx0LlNldENvbG9yTm9kZTpyZXR1cm4gbmV3IGEwO2Nhc2UgTHQuRGVsZXRlTm9kZTpyZXR1cm4gbmV3IGYwO2Nhc2UgTHQuU2NhbGVOb2RlOnJldHVybiBuZXcgdTA7Y2FzZSBMdC5Sb3RhdGVOb2RlOnJldHVybiBuZXcgaDA7Y2FzZSBMdC5TZXRGb250U3R5bGU6cmV0dXJuIG5ldyBkMDtjYXNlIEx0LlNldFBvaW50OnJldHVybiBuZXcgZzA7Y2FzZSBMdC5TZXRMb2NrOnJldHVybiBuZXcgcDA7Y2FzZSBMdC5TZXRTaGFwZU9wdDpyZXR1cm4gbmV3IG0wfX1yZWdpc3RlckZvcldvcmtlcihyLHQsZSl7cmV0dXJuIHRoaXMuYnVpbGRlcnMuZm9yRWFjaChuPT57biYmbi5yZWdpc3RlckZvcldvcmtlcihyLHQsZSl9KSx0aGlzfWNvbnN1bWVGb3JXb3JrZXIocil7Zm9yKGNvbnN0IHQgb2YgdGhpcy5idWlsZGVycy52YWx1ZXMoKSlpZih0IT1udWxsJiZ0LmNvbnN1bWUocikpcmV0dXJuITA7cmV0dXJuITF9fWNvbnN0IEplPSJjdXJzb3Job3ZlciI7Y2xhc3MgeTB7Y29uc3RydWN0b3Iocix0KXtzdCh0aGlzLCJ2aWV3SWQiKTtzdCh0aGlzLCJzY2VuZSIpO3N0KHRoaXMsInNjZW5lUGF0aCIpO3N0KHRoaXMsImRyYXdMYXllciIpO3N0KHRoaXMsImZ1bGxMYXllciIpO3N0KHRoaXMsImN1ck5vZGVNYXAiLG5ldyBNYXApO3N0KHRoaXMsInRhcmdldE5vZGVNYXAiLFtdKTt0aGlzLnZpZXdJZD1yLHRoaXMuc2NlbmU9dH1pbml0KHIsdCl7dGhpcy5mdWxsTGF5ZXI9cix0aGlzLmRyYXdMYXllcj10fWdldChyKXtyZXR1cm4gdGhpcy5jdXJOb2RlTWFwLmdldChyKX1oYXNSZW5kZXJOb2Rlcygpe2xldCByPSExO2Zvcihjb25zdCB0IG9mIHRoaXMuY3VyTm9kZU1hcC52YWx1ZXMoKSl3aCh0LnRvb2xzVHlwZSkmJihyPSEwKTtyZXR1cm4gcn1oYXMocil7dGhpcy5jdXJOb2RlTWFwLmhhcyhyKX1zZXRJbmZvKHIsdCl7Y29uc3QgZT10aGlzLmN1ck5vZGVNYXAuZ2V0KHIpfHx7bmFtZTpyLHJlY3Q6dC5yZWN0fTt0LnJlY3QmJihlLnJlY3Q9WnQodC5yZWN0KSksdC5vcCYmKGUub3A9WnQodC5vcCkpLHQuY2FuUm90YXRlJiYoZS5jYW5Sb3RhdGU9dC5jYW5Sb3RhdGUpLHQuc2NhbGVUeXBlJiYoZS5zY2FsZVR5cGU9dC5zY2FsZVR5cGUpLHQub3B0JiYoZS5vcHQ9WnQodC5vcHQpKSx0LnRvb2xzVHlwZSYmKGUudG9vbHNUeXBlPXQudG9vbHNUeXBlKSx0LmNlbnRlclBvcyYmKGUuY2VudGVyUG9zPVp0KHQuY2VudGVyUG9zKSksZS5yZWN0P3RoaXMuY3VyTm9kZU1hcC5zZXQocixlKTp0aGlzLmN1ck5vZGVNYXAuZGVsZXRlKHIpfWRlbGV0ZShyKXt0aGlzLmN1ck5vZGVNYXAuZGVsZXRlKHIpfWNsZWFyKCl7dGhpcy5jdXJOb2RlTWFwLmNsZWFyKCksdGhpcy50YXJnZXROb2RlTWFwLmxlbmd0aD0wfWhhc1JlY3RJbnRlcnNlY3RSYW5nZShyLHQ9ITApe2Zvcihjb25zdCBlIG9mIHRoaXMuY3VyTm9kZU1hcC52YWx1ZXMoKSlpZih4ZShyLGUucmVjdCkpe2lmKHQmJmUudG9vbHNUeXBlPT09Z3QuSW1hZ2UmJmUub3B0LmxvY2tlZHx8dCYmZS50b29sc1R5cGU9PT1ndC5UZXh0JiYoZS5vcHQud29ya1N0YXRlPT09SXQuRG9pbmd8fGUub3B0LndvcmtTdGF0ZT09PUl0LlN0YXJ0KSljb250aW51ZTtyZXR1cm4hMH1yZXR1cm4hMX1nZXRSZWN0SW50ZXJzZWN0UmFuZ2Uocix0PSEwKXtsZXQgZTtjb25zdCBuPW5ldyBNYXA7Zm9yKGNvbnN0W2Esc11vZiB0aGlzLmN1ck5vZGVNYXAuZW50cmllcygpKWlmKHhlKHIscy5yZWN0KSl7aWYodCYmcy50b29sc1R5cGU9PT1ndC5JbWFnZSYmcy5vcHQubG9ja2VkfHx0JiZzLnRvb2xzVHlwZT09PWd0LlRleHQmJihzLm9wdC53b3JrU3RhdGU9PT1JdC5Eb2luZ3x8cy5vcHQud29ya1N0YXRlPT09SXQuU3RhcnQpKWNvbnRpbnVlO2U9T3QoZSxzLnJlY3QpLG4uc2V0KGEscyl9cmV0dXJue3JlY3RSYW5nZTplLG5vZGVSYW5nZTpufX1nZXROb2RlUmVjdEZvcm1TaGFwZShyLHQpe2NvbnN0IGU9Vm4odC50b29sc1R5cGUpO2xldCBuPXRoaXMuZnVsbExheWVyJiYoZT09bnVsbD92b2lkIDA6ZS5nZXRSZWN0RnJvbUxheWVyKHRoaXMuZnVsbExheWVyLHIpKTtyZXR1cm4hbiYmdGhpcy5kcmF3TGF5ZXImJihuPWU9PW51bGw/dm9pZCAwOmUuZ2V0UmVjdEZyb21MYXllcih0aGlzLmRyYXdMYXllcixyKSksbn11cGRhdGVOb2Rlc1JlY3QoKXt0aGlzLmN1ck5vZGVNYXAuZm9yRWFjaCgocix0KT0+e2NvbnN0IGU9dGhpcy5nZXROb2RlUmVjdEZvcm1TaGFwZSh0LHIpO2U/KHIucmVjdD1lLHRoaXMuY3VyTm9kZU1hcC5zZXQodCxyKSk6dGhpcy5jdXJOb2RlTWFwLmRlbGV0ZSh0KX0pfWNvbWJpbmVJbnRlcnNlY3RSZWN0KHIpe2xldCB0PXI7cmV0dXJuIHRoaXMuY3VyTm9kZU1hcC5mb3JFYWNoKGU9Pnt4ZSh0LGUucmVjdCkmJih0PU90KHQsZS5yZWN0KSl9KSx0fXNldFRhcmdldCgpe3JldHVybiB0aGlzLnRhcmdldE5vZGVNYXAucHVzaChadCh0aGlzLmN1ck5vZGVNYXApKSx0aGlzLnRhcmdldE5vZGVNYXAubGVuZ3RoLTF9Z2V0TGFzdFRhcmdldCgpe3JldHVybiB0aGlzLnRhcmdldE5vZGVNYXBbdGhpcy50YXJnZXROb2RlTWFwLmxlbmd0aC0xXX1kZWxldGVMYXN0VGFyZ2V0KCl7dGhpcy50YXJnZXROb2RlTWFwLmxlbmd0aD10aGlzLnRhcmdldE5vZGVNYXAubGVuZ3RoLTF9Z2V0VGFyZ2V0KHIpe3JldHVybiB0aGlzLnRhcmdldE5vZGVNYXBbcl19ZGVsZXRlVGFyZ2V0KHIpe3RoaXMudGFyZ2V0Tm9kZU1hcC5sZW5ndGg9cn19Y2xhc3MgWG57Y29uc3RydWN0b3Iocix0KXtzdCh0aGlzLCJ2aWV3SWQiKTtzdCh0aGlzLCJmdWxsTGF5ZXIiKTtzdCh0aGlzLCJ2Tm9kZXMiKTtzdCh0aGlzLCJkcHIiKTtzdCh0aGlzLCJvcHQiKTtzdCh0aGlzLCJjYW1lcmFPcHQiKTtzdCh0aGlzLCJzY2VuZSIpO3N0KHRoaXMsImlzU2FmYXJpIiwhMSk7dGhpcy52aWV3SWQ9cix0aGlzLm9wdD10LHRoaXMuZHByPXQuZHByLHRoaXMuc2NlbmU9dGhpcy5jcmVhdGVTY2VuZSh0Lm9mZnNjcmVlbkNhbnZhc09wdCksdGhpcy5mdWxsTGF5ZXI9dGhpcy5jcmVhdGVMYXllcigiZnVsbExheWVyIix0aGlzLnNjZW5lLHsuLi50LmxheWVyT3B0LGJ1ZmZlclNpemU6dGhpcy52aWV3SWQ9PT0ibWFpblZpZXciPzZlMzozZTN9KSx0aGlzLnZOb2Rlcz1uZXcgeTAocix0aGlzLnNjZW5lKX1zZXRJc1NhZmFyaShyKXt0aGlzLmlzU2FmYXJpPXJ9b24ocil7Y29uc3R7bXNnVHlwZTp0LHRvb2xzVHlwZTplLG9wdDpuLHdvcmtJZDphLHdvcmtTdGF0ZTpzLGRhdGFUeXBlOml9PXI7c3dpdGNoKHQpe2Nhc2UgbHQuRGVzdHJveTp0aGlzLmRlc3Ryb3koKTticmVhaztjYXNlIGx0LkNsZWFyOnRoaXMuY2xlYXJBbGwoKTticmVhaztjYXNlIGx0LlVwZGF0ZVRvb2xzOmlmKGUmJm4pe2NvbnN0IG89e3Rvb2xzVHlwZTplLHRvb2xzT3B0Om59O3RoaXMubG9jYWxXb3JrLnNldFRvb2xzT3B0KG8pfWJyZWFrO2Nhc2UgbHQuQ3JlYXRlV29yazphJiZuJiYoIXRoaXMubG9jYWxXb3JrLmdldFRtcFdvcmtTaGFwZU5vZGUoKSYmZSYmdGhpcy5zZXRUb29sc09wdCh7dG9vbHNUeXBlOmUsdG9vbHNPcHQ6bn0pLHRoaXMuc2V0V29ya09wdCh7d29ya0lkOmEsdG9vbHNPcHQ6bn0pKTticmVhaztjYXNlIGx0LkRyYXdXb3JrOnM9PT1JdC5Eb25lJiZpPT09VHQuTG9jYWw/dGhpcy5jb25zdW1lRHJhd0FsbChpLHIpOnRoaXMuY29uc3VtZURyYXcoaSxyKTticmVha319dXBkYXRlU2NlbmUocil7dGhpcy5zY2VuZS5hdHRyKHsuLi5yfSk7Y29uc3R7d2lkdGg6dCxoZWlnaHQ6ZX09cjt0aGlzLnNjZW5lLmNvbnRhaW5lci53aWR0aD10LHRoaXMuc2NlbmUuY29udGFpbmVyLmhlaWdodD1lLHRoaXMuc2NlbmUud2lkdGg9dCx0aGlzLnNjZW5lLmhlaWdodD1lLHRoaXMudXBkYXRlTGF5ZXIoe3dpZHRoOnQsaGVpZ2h0OmV9KX11cGRhdGVMYXllcihyKXtjb25zdHt3aWR0aDp0LGhlaWdodDplfT1yO3RoaXMuZnVsbExheWVyJiYodGhpcy5mdWxsTGF5ZXIucGFyZW50LnNldEF0dHJpYnV0ZSgid2lkdGgiLHQpLHRoaXMuZnVsbExheWVyLnBhcmVudC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsZSksdGhpcy5mdWxsTGF5ZXIuc2V0QXR0cmlidXRlKCJzaXplIixbdCxlXSksdGhpcy5mdWxsTGF5ZXIuc2V0QXR0cmlidXRlKCJwb3MiLFt0Ki41LGUqLjVdKSksdGhpcy5kcmF3TGF5ZXImJih0aGlzLmRyYXdMYXllci5wYXJlbnQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsdCksdGhpcy5kcmF3TGF5ZXIucGFyZW50LnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixlKSx0aGlzLmRyYXdMYXllci5zZXRBdHRyaWJ1dGUoInNpemUiLFt0LGVdKSx0aGlzLmRyYXdMYXllci5zZXRBdHRyaWJ1dGUoInBvcyIsW3QqLjUsZSouNV0pKSx0aGlzLnNuYXBzaG90RnVsbExheWVyJiYodGhpcy5zbmFwc2hvdEZ1bGxMYXllci5wYXJlbnQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsdCksdGhpcy5zbmFwc2hvdEZ1bGxMYXllci5wYXJlbnQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLGUpLHRoaXMuc25hcHNob3RGdWxsTGF5ZXIuc2V0QXR0cmlidXRlKCJzaXplIixbdCxlXSksdGhpcy5zbmFwc2hvdEZ1bGxMYXllci5zZXRBdHRyaWJ1dGUoInBvcyIsW3QqLjUsZSouNV0pKX1jcmVhdGVTY2VuZShyKXtjb25zdHt3aWR0aDp0LGhlaWdodDplfT1yLG49bmV3IE9mZnNjcmVlbkNhbnZhcyh0LGUpO3JldHVybiBuZXcgJGgoe2NvbnRhaW5lcjpuLGRpc3BsYXlSYXRpbzp0aGlzLmRwcixkZXB0aDohMSxkZXN5bmNocm9uaXplZDohMCwuLi5yfSl9Y3JlYXRlTGF5ZXIocix0LGUpe2NvbnN0e3dpZHRoOm4saGVpZ2h0OmF9PWUscz1gb2Zmc2NyZWVuLSR7cn1gLGk9dC5sYXllcihzLGUpLG89bmV3IHJlKHthbmNob3I6Wy41LC41XSxwb3M6W24qLjUsYSouNV0sc2l6ZTpbbixhXSxuYW1lOiJ2aWV3cG9ydCIsaWQ6cn0pO3JldHVybiBpLmFwcGVuZChvKSxvfWNsZWFyQWxsKCl7dmFyIHI7dGhpcy5mdWxsTGF5ZXImJih0aGlzLmZ1bGxMYXllci5wYXJlbnQuY2hpbGRyZW4uZm9yRWFjaCh0PT57dC5uYW1lIT09InZpZXdwb3J0IiYmdC5yZW1vdmUoKX0pLHRoaXMuZnVsbExheWVyLnJlbW92ZUFsbENoaWxkcmVuKCkpLHRoaXMuZHJhd0xheWVyJiYodGhpcy5kcmF3TGF5ZXIucGFyZW50LmNoaWxkcmVuLmZvckVhY2godD0+e3QubmFtZSE9PSJ2aWV3cG9ydCImJnQucmVtb3ZlKCl9KSx0aGlzLmRyYXdMYXllci5yZW1vdmVBbGxDaGlsZHJlbigpKSx0aGlzLmxvY2FsV29yay5jbGVhckFsbFdvcmtTaGFwZXNDYWNoZSgpLChyPXRoaXMuc2VydmljZVdvcmspPT1udWxsfHxyLmNsZWFyQWxsV29ya1NoYXBlc0NhY2hlKCl9c2V0VG9vbHNPcHQocil7dGhpcy5sb2NhbFdvcmsuc2V0VG9vbHNPcHQocil9c2V0V29ya09wdChyKXtjb25zdHt3b3JrSWQ6dCx0b29sc09wdDplfT1yO3QmJmUmJnRoaXMubG9jYWxXb3JrLnNldFdvcmtPcHRpb25zKHQsZSl9ZGVzdHJveSgpe3ZhciByO3RoaXMudk5vZGVzLmNsZWFyKCksdGhpcy5mdWxsTGF5ZXIucmVtb3ZlKCksdGhpcy5zY2VuZS5yZW1vdmUoKSx0aGlzLmxvY2FsV29yay5kZXN0cm95KCksKHI9dGhpcy5zZXJ2aWNlV29yayk9PW51bGx8fHIuZGVzdHJveSgpfX1jbGFzcyBabntjb25zdHJ1Y3RvcihyKXtzdCh0aGlzLCJ2aWV3SWQiKTtzdCh0aGlzLCJ2Tm9kZXMiKTtzdCh0aGlzLCJ0aHJlYWQiKTtzdCh0aGlzLCJmdWxsTGF5ZXIiKTtzdCh0aGlzLCJkcmF3TGF5ZXIiKTtzdCh0aGlzLCJfcG9zdCIpO3N0KHRoaXMsInRtcFdvcmtTaGFwZU5vZGUiKTtzdCh0aGlzLCJ0bXBPcHQiKTtzdCh0aGlzLCJ3b3JrU2hhcGVzIixuZXcgTWFwKTtzdCh0aGlzLCJ3b3JrU2hhcGVTdGF0ZSIsbmV3IE1hcCk7c3QodGhpcywiZWZmZWN0V29ya0lkIik7c3QodGhpcywiZHJhd0NvdW50IiwwKTt0aGlzLnRocmVhZD1yLnRocmVhZCx0aGlzLnZpZXdJZD1yLnZpZXdJZCx0aGlzLnZOb2Rlcz1yLnZOb2Rlcyx0aGlzLmZ1bGxMYXllcj1yLmZ1bGxMYXllcix0aGlzLmRyYXdMYXllcj1yLmRyYXdMYXllcix0aGlzLl9wb3N0PXIucG9zdH1kZXN0cm95KCl7dGhpcy53b3JrU2hhcGVTdGF0ZS5jbGVhcigpLHRoaXMud29ya1NoYXBlcy5jbGVhcigpfWdldFdvcmtTaGFwZShyKXtyZXR1cm4gdGhpcy53b3JrU2hhcGVzLmdldChyKX1nZXRUbXBXb3JrU2hhcGVOb2RlKCl7cmV0dXJuIHRoaXMudG1wV29ya1NoYXBlTm9kZX1zZXRUbXBXb3JrSWQocil7aWYociYmdGhpcy50bXBXb3JrU2hhcGVOb2RlKXt0aGlzLnRtcFdvcmtTaGFwZU5vZGUuc2V0V29ya0lkKHIpLHRoaXMud29ya1NoYXBlcy5zZXQocix0aGlzLnRtcFdvcmtTaGFwZU5vZGUpLHRoaXMudG1wT3B0JiZ0aGlzLnNldFRvb2xzT3B0KHRoaXMudG1wT3B0KTtyZXR1cm59fXNldFRtcFdvcmtPcHRpb25zKHIpe3ZhciB0Oyh0PXRoaXMudG1wV29ya1NoYXBlTm9kZSk9PW51bGx8fHQuc2V0V29ya09wdGlvbnMocil9c2V0V29ya09wdGlvbnMocix0KXt2YXIgbjt0aGlzLndvcmtTaGFwZXMuZ2V0KHIpfHx0aGlzLnNldFRtcFdvcmtJZChyKSwobj10aGlzLndvcmtTaGFwZXMuZ2V0KHIpKT09bnVsbHx8bi5zZXRXb3JrT3B0aW9ucyh0KX1jcmVhdGVXb3JrU2hhcGVOb2RlKHIpe3ZhciBuO2NvbnN0e3Rvb2xzVHlwZTp0LHdvcmtJZDplfT1yO3JldHVybiB0PT09Z3QuU2VsZWN0b3ImJmU9PT1KZT95cih7Li4ucix2Tm9kZXM6dGhpcy52Tm9kZXMsZnVsbExheWVyOnRoaXMuZnVsbExheWVyLGRyYXdMYXllcjp0aGlzLmZ1bGxMYXllcn0pOnlyKHsuLi5yLHZOb2Rlczp0aGlzLnZOb2RlcyxmdWxsTGF5ZXI6dGhpcy5mdWxsTGF5ZXIsZHJhd0xheWVyOnRoaXMuZHJhd0xheWVyfSwobj10aGlzLnRocmVhZCk9PW51bGw/dm9pZCAwOm4uc2VydmljZVdvcmspfXNldFRvb2xzT3B0KHIpe3ZhciB0LGU7KCh0PXRoaXMudG1wT3B0KT09bnVsbD92b2lkIDA6dC50b29sc1R5cGUpIT09ci50b29sc1R5cGUmJihlPXRoaXMudG1wT3B0KSE9bnVsbCYmZS50b29sc1R5cGUmJnRoaXMuY2xlYXJBbGxXb3JrU2hhcGVzQ2FjaGUoKSx0aGlzLnRtcE9wdD1yLHRoaXMudG1wV29ya1NoYXBlTm9kZT10aGlzLmNyZWF0ZVdvcmtTaGFwZU5vZGUocil9Y2xlYXJXb3JrU2hhcGVOb2RlQ2FjaGUocil7dmFyIHQ7KHQ9dGhpcy5nZXRXb3JrU2hhcGUocikpPT1udWxsfHx0LmNsZWFyVG1wUG9pbnRzKCksdGhpcy53b3JrU2hhcGVzLmRlbGV0ZShyKSx0aGlzLndvcmtTaGFwZVN0YXRlLmRlbGV0ZShyKX1jbGVhckFsbFdvcmtTaGFwZXNDYWNoZSgpe3RoaXMud29ya1NoYXBlcy5mb3JFYWNoKHI9PnIuY2xlYXJUbXBQb2ludHMoKSksdGhpcy53b3JrU2hhcGVzLmNsZWFyKCksdGhpcy53b3JrU2hhcGVTdGF0ZS5jbGVhcigpfXNldEZ1bGxXb3JrKHIpe2NvbnN0e3dvcmtJZDp0LG9wdDplLHRvb2xzVHlwZTpufT1yO2lmKHQmJmUmJm4pe2NvbnN0IGE9dCYmdGhpcy53b3JrU2hhcGVzLmdldCh0KXx8dGhpcy5jcmVhdGVXb3JrU2hhcGVOb2RlKHt0b29sc09wdDplLHRvb2xzVHlwZTpuLHdvcmtJZDp0fSk7cmV0dXJuIGE/KGEuc2V0V29ya0lkKHQpLHRoaXMud29ya1NoYXBlcy5zZXQodCxhKSxhKTp2b2lkIDB9fX12YXIgUzA9UXQseDA9ZnVuY3Rpb24oKXtyZXR1cm4gUzAuRGF0ZS5ub3coKX0sVDA9eDAsTTA9L1xzLztmdW5jdGlvbiBPMChkKXtmb3IodmFyIHI9ZC5sZW5ndGg7ci0tJiZNMC50ZXN0KGQuY2hhckF0KHIpKTspO3JldHVybiByfXZhciBFMD1PMCxQMD1FMCxBMD0vXlxzKy87ZnVuY3Rpb24gQzAoZCl7cmV0dXJuIGQmJmQuc2xpY2UoMCxQMChkKSsxKS5yZXBsYWNlKEEwLCIiKX12YXIgUjA9QzAsSTA9Y2UsTDA9aWUsYjA9IltvYmplY3QgU3ltYm9sXSI7ZnVuY3Rpb24gRDAoZCl7cmV0dXJuIHR5cGVvZiBkPT0ic3ltYm9sInx8TDAoZCkmJkkwKGQpPT1iMH12YXIgdzA9RDAsTjA9UjAsSm49c2UsQjA9dzAsUW49TmFOLFcwPS9eWy0rXTB4WzAtOWEtZl0rJC9pLEYwPS9eMGJbMDFdKyQvaSxqMD0vXjBvWzAtN10rJC9pLFUwPXBhcnNlSW50O2Z1bmN0aW9uICQwKGQpe2lmKHR5cGVvZiBkPT0ibnVtYmVyIilyZXR1cm4gZDtpZihCMChkKSlyZXR1cm4gUW47aWYoSm4oZCkpe3ZhciByPXR5cGVvZiBkLnZhbHVlT2Y9PSJmdW5jdGlvbiI/ZC52YWx1ZU9mKCk6ZDtkPUpuKHIpP3IrIiI6cn1pZih0eXBlb2YgZCE9InN0cmluZyIpcmV0dXJuIGQ9PT0wP2Q6K2Q7ZD1OMChkKTt2YXIgdD1GMC50ZXN0KGQpO3JldHVybiB0fHxqMC50ZXN0KGQpP1UwKGQuc2xpY2UoMiksdD8yOjgpOlcwLnRlc3QoZCk/UW46K2R9dmFyIHowPSQwLEcwPXNlLFNyPVQwLGtuPXowLEgwPSJFeHBlY3RlZCBhIGZ1bmN0aW9uIixLMD1NYXRoLm1heCxWMD1NYXRoLm1pbjtmdW5jdGlvbiBZMChkLHIsdCl7dmFyIGUsbixhLHMsaSxvLGM9MCxtPSExLHU9ITEscD0hMDtpZih0eXBlb2YgZCE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEgwKTtyPWtuKHIpfHwwLEcwKHQpJiYobT0hIXQubGVhZGluZyx1PSJtYXhXYWl0ImluIHQsYT11P0swKGtuKHQubWF4V2FpdCl8fDAscik6YSxwPSJ0cmFpbGluZyJpbiB0PyEhdC50cmFpbGluZzpwKTtmdW5jdGlvbiB5KE0pe3ZhciBBPWUsQz1uO3JldHVybiBlPW49dm9pZCAwLGM9TSxzPWQuYXBwbHkoQyxBKSxzfWZ1bmN0aW9uIE8oTSl7cmV0dXJuIGM9TSxpPXNldFRpbWVvdXQoVCxyKSxtP3koTSk6c31mdW5jdGlvbiB4KE0pe3ZhciBBPU0tbyxDPU0tYyxiPXItQTtyZXR1cm4gdT9WMChiLGEtQyk6Yn1mdW5jdGlvbiB2KE0pe3ZhciBBPU0tbyxDPU0tYztyZXR1cm4gbz09PXZvaWQgMHx8QT49cnx8QTwwfHx1JiZDPj1hfWZ1bmN0aW9uIFQoKXt2YXIgTT1TcigpO2lmKHYoTSkpcmV0dXJuIGwoTSk7aT1zZXRUaW1lb3V0KFQseChNKSl9ZnVuY3Rpb24gbChNKXtyZXR1cm4gaT12b2lkIDAscCYmZT95KE0pOihlPW49dm9pZCAwLHMpfWZ1bmN0aW9uIGgoKXtpIT09dm9pZCAwJiZjbGVhclRpbWVvdXQoaSksYz0wLGU9bz1uPWk9dm9pZCAwfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaT09PXZvaWQgMD9zOmwoU3IoKSl9ZnVuY3Rpb24gZygpe3ZhciBNPVNyKCksQT12KE0pO2lmKGU9YXJndW1lbnRzLG49dGhpcyxvPU0sQSl7aWYoaT09PXZvaWQgMClyZXR1cm4gTyhvKTtpZih1KXJldHVybiBjbGVhclRpbWVvdXQoaSksaT1zZXRUaW1lb3V0KFQscikseShvKX1yZXR1cm4gaT09PXZvaWQgMCYmKGk9c2V0VGltZW91dChULHIpKSxzfXJldHVybiBnLmNhbmNlbD1oLGcuZmx1c2g9ZixnfXZhciBYMD1ZMCxaMD1YMCxKMD1zZSxRMD0iRXhwZWN0ZWQgYSBmdW5jdGlvbiI7ZnVuY3Rpb24gazAoZCxyLHQpe3ZhciBlPSEwLG49ITA7aWYodHlwZW9mIGQhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihRMCk7cmV0dXJuIEowKHQpJiYoZT0ibGVhZGluZyJpbiB0PyEhdC5sZWFkaW5nOmUsbj0idHJhaWxpbmciaW4gdD8hIXQudHJhaWxpbmc6biksWjAoZCxyLHtsZWFkaW5nOmUsbWF4V2FpdDpyLHRyYWlsaW5nOm59KX12YXIgcTA9azAsXzA9WHQocTApO2NsYXNzIHRnIGV4dGVuZHMgWm57Y29uc3RydWN0b3IodCl7c3VwZXIodCk7c3QodGhpcywiY29tYmluZVVuaXRUaW1lIiw2MDApO3N0KHRoaXMsImNvbWJpbmVUaW1lcklkIik7c3QodGhpcywiZWZmZWN0U2VsZWN0Tm9kZURhdGEiLG5ldyBTZXQpO3N0KHRoaXMsImJhdGNoRXJhc2VyV29ya3MiLG5ldyBTZXQpO3N0KHRoaXMsImJhdGNoRXJhc2VyUmVtb3ZlTm9kZXMiLG5ldyBTZXQpO3N0KHRoaXMsImJhdGNoRXJhc2VyQ29tYmluZSIsXzAoKCk9Pntjb25zdCB0PXRoaXMudXBkYXRlQmF0Y2hFcmFzZXJDb21iaW5lTm9kZSh0aGlzLmJhdGNoRXJhc2VyV29ya3MsdGhpcy5iYXRjaEVyYXNlclJlbW92ZU5vZGVzKTt0aGlzLmJhdGNoRXJhc2VyV29ya3MuY2xlYXIoKSx0aGlzLmJhdGNoRXJhc2VyUmVtb3ZlTm9kZXMuY2xlYXIoKSx0Lmxlbmd0aCYmdGhpcy5fcG9zdCh7cmVuZGVyOnR9KX0sMTAwLHtsZWFkaW5nOiExfSkpfWNvbnN1bWVEcmF3KHQsZSl7Y29uc3R7b3A6bix3b3JrSWQ6YX09dDtpZihuIT1udWxsJiZuLmxlbmd0aCYmYSl7Y29uc3Qgcz10aGlzLndvcmtTaGFwZXMuZ2V0KGEpO2lmKCFzKXJldHVybjtjb25zdCBpPXMudG9vbHNUeXBlO2lmKGk9PT1ndC5MYXNlclBlbilyZXR1cm47Y29uc3Qgbz1zLmNvbnN1bWUoe2RhdGE6dCxpc0Z1bGxXb3JrOiEwfSk7c3dpdGNoKGkpe2Nhc2UgZ3QuU2VsZWN0b3I6by50eXBlPT09bHQuU2VsZWN0JiYoby5zZWxlY3RJZHMmJmUucnVuUmV2ZXJzZVNlbGVjdFdvcmsoby5zZWxlY3RJZHMpLHRoaXMuZHJhd1NlbGVjdG9yKG8sITApKTticmVhaztjYXNlIGd0LkVyYXNlcjpvIT1udWxsJiZvLnJlY3QmJnRoaXMuZHJhd0VyYXNlcihvKTticmVhaztjYXNlIGd0LkFycm93OmNhc2UgZ3QuU3RyYWlnaHQ6Y2FzZSBndC5FbGxpcHNlOmNhc2UgZ3QuUmVjdGFuZ2xlOmNhc2UgZ3QuU3RhcjpjYXNlIGd0LlBvbHlnb246Y2FzZSBndC5TcGVlY2hCYWxsb29uOm8mJih0aGlzLmRyYXdDb3VudCsrLHRoaXMuZHJhd1BlbmNpbChvKSk7YnJlYWs7Y2FzZSBndC5QZW5jaWw6dGhpcy5jb21iaW5lVGltZXJJZHx8KHRoaXMuY29tYmluZVRpbWVySWQ9c2V0VGltZW91dCgoKT0+e3RoaXMuY29tYmluZVRpbWVySWQ9dm9pZCAwLHRoaXMuZHJhd1BlbmNpbENvbWJpbmUoYSl9LE1hdGguZmxvb3Iocy5nZXRXb3JrT3B0aW9ucygpLnN5bmNVbml0VGltZXx8dGhpcy5jb21iaW5lVW5pdFRpbWUvMikpKSxvJiYodGhpcy5kcmF3Q291bnQrKyx0aGlzLmRyYXdQZW5jaWwobykpO2JyZWFrfX19Y29uc3VtZURyYXdBbGwodCxlKXt2YXIgaSxvLGM7dGhpcy5jb21iaW5lVGltZXJJZCYmKGNsZWFyVGltZW91dCh0aGlzLmNvbWJpbmVUaW1lcklkKSx0aGlzLmNvbWJpbmVUaW1lcklkPXZvaWQgMCk7Y29uc3R7d29ya0lkOm4sdW5kb1RpY2tlcklkOmEsc2NlbmVQYXRoOnN9PXQ7aWYobil7YSYmc2V0VGltZW91dCgoKT0+e3RoaXMuX3Bvc3Qoe3NwOlt7dHlwZTpsdC5Ob25lLHVuZG9UaWNrZXJJZDphfV19KX0sMCk7Y29uc3QgbT10aGlzLndvcmtTaGFwZXMuZ2V0KG4pO2lmKCFtKXJldHVybjtjb25zdCB1PW0udG9vbHNUeXBlO2lmKHU9PT1ndC5MYXNlclBlbilyZXR1cm47Y29uc3QgcD10aGlzLndvcmtTaGFwZXMuZ2V0KEplKSx5PShpPXA9PW51bGw/dm9pZCAwOnAuc2VsZWN0SWRzKT09bnVsbD92b2lkIDA6aVswXSxPPW0uY29uc3VtZUFsbCh7ZGF0YTp0LGhvdmVySWQ6eX0pLHg9dGhpcy53b3JrU2hhcGVTdGF0ZS5nZXQobik7c3dpdGNoKHUpe2Nhc2UgZ3QuU2VsZWN0b3I6Ty5zZWxlY3RJZHMmJnkmJigobz1PLnNlbGVjdElkcykhPW51bGwmJm8uaW5jbHVkZXMoeSkpJiZwLmN1cnNvckJsdXIoKSxPLnNlbGVjdElkcyYmZS5ydW5SZXZlcnNlU2VsZWN0V29yayhPLnNlbGVjdElkcyksdGhpcy5kcmF3U2VsZWN0b3Ioey4uLk8sc2NlbmVQYXRoOnN9LCExKSwoYz1tLnNlbGVjdElkcykhPW51bGwmJmMubGVuZ3RoP20uY2xlYXJUbXBQb2ludHMoKTp0aGlzLmNsZWFyV29ya1NoYXBlTm9kZUNhY2hlKG4pO2JyZWFrO2Nhc2UgZ3QuRXJhc2VyOk8hPW51bGwmJk8ucmVjdCYmdGhpcy5kcmF3RXJhc2VyKHsuLi5PLHNjZW5lUGF0aDpzfSksbS5jbGVhclRtcFBvaW50cygpO2JyZWFrO2Nhc2UgZ3QuQXJyb3c6Y2FzZSBndC5TdHJhaWdodDpjYXNlIGd0LkVsbGlwc2U6Y2FzZSBndC5SZWN0YW5nbGU6Y2FzZSBndC5TdGFyOmNhc2UgZ3QuUG9seWdvbjpjYXNlIGd0LlNwZWVjaEJhbGxvb246dGhpcy5kcmF3UGVuY2lsRnVsbCh7Li4uTyxzY2VuZVBhdGg6c30sbS5nZXRXb3JrT3B0aW9ucygpLHgpLHRoaXMuZHJhd0NvdW50PTAsdGhpcy5jbGVhcldvcmtTaGFwZU5vZGVDYWNoZShuKTticmVhaztjYXNlIGd0LlBlbmNpbDpPIT1udWxsJiZPLnJlY3QmJih0aGlzLmRyYXdQZW5jaWxGdWxsKHsuLi5PLHNjZW5lUGF0aDpzfSxtLmdldFdvcmtPcHRpb25zKCkseCksdGhpcy5kcmF3Q291bnQ9MCksdGhpcy5jbGVhcldvcmtTaGFwZU5vZGVDYWNoZShuKTticmVha319fWFzeW5jIGNvbnN1bWVGdWxsKHQsZSl7dmFyIGksbztjb25zdCBuPXRoaXMuc2V0RnVsbFdvcmsodCksYT10Lm9wcyYmVmUodC5vcHMpLHM9KGk9dC53b3JrSWQpPT1udWxsP3ZvaWQgMDppLnRvU3RyaW5nKCk7aWYocyYmbil7Y29uc3QgYz0obz10aGlzLnZOb2Rlcy5nZXQocykpPT1udWxsP3ZvaWQgMDpvLnJlY3Q7bGV0IG07bi50b29sc1R5cGU9PT1ndC5JbWFnZSYmZT9tPWF3YWl0IG4uY29uc3VtZVNlcnZpY2VBc3luYyh7c2NlbmU6ZSxpc0Z1bGxXb3JrOiEwLHJlcGxhY2VJZDpzfSk6bT1uLmNvbnN1bWVTZXJ2aWNlKHtvcDphLGlzRnVsbFdvcms6ITAscmVwbGFjZUlkOnN9KTtjb25zdCB1PSh0PT1udWxsP3ZvaWQgMDp0LnVwZGF0ZU5vZGVPcHQpJiZuLnVwZGF0YU9wdFNlcnZpY2UodC51cGRhdGVOb2RlT3B0KTttPU90KG0sdSk7Y29uc3QgcD1bXSx5PVtdO2lmKHQud29ya0lkJiZ0aGlzLndvcmtTaGFwZXMuZGVsZXRlKHQud29ya0lkKSxtJiZ0LndpbGxSZWZyZXNoJiYoYyYmcC5wdXNoKHtyZWN0Om0saXNDbGVhcjohMCxjbGVhckNhbnZhczpTdC5CZyxpc0Z1bGxXb3JrOiEwLHZpZXdJZDp0aGlzLnZpZXdJZH0pLHAucHVzaCh7cmVjdDptLGRyYXdDYW52YXM6U3QuQmcsaXNGdWxsV29yazohMCx2aWV3SWQ6dGhpcy52aWV3SWR9KSksdC53aWxsU3luY1NlcnZpY2UmJnkucHVzaCh7b3B0OnQub3B0LHRvb2xzVHlwZTp0LnRvb2xzVHlwZSx0eXBlOmx0LkZ1bGxXb3JrLHdvcmtJZDp0LndvcmtJZCxvcHM6dC5vcHMsdXBkYXRlTm9kZU9wdDp0LnVwZGF0ZU5vZGVPcHQsdW5kb1RpY2tlcklkOnQudW5kb1RpY2tlcklkLHZpZXdJZDp0aGlzLnZpZXdJZH0pLHAubGVuZ3RofHx5Lmxlbmd0aCl7Y29uc3QgTz17cmVuZGVyOnAsc3A6eX07YXdhaXQgdGhpcy5fcG9zdChPKX19fWFzeW5jIHJlbW92ZVdvcmsodCl7Y29uc3R7d29ya0lkOmV9PXQsbj1lPT1udWxsP3ZvaWQgMDplLnRvU3RyaW5nKCk7aWYobil7Y29uc3QgYT10aGlzLnJlbW92ZU5vZGUobik7YSYmYXdhaXQgdGhpcy5fcG9zdCh7cmVuZGVyOlt7cmVjdDphLGlzQ2xlYXI6ITAsaXNGdWxsV29yazohMCxjbGVhckNhbnZhczpTdC5CZyxkcmF3Q2FudmFzOlN0LkJnLHZpZXdJZDp0aGlzLnZpZXdJZH1dfSl9fXJlbW92ZU5vZGUodCl7dmFyIGE7dGhpcy53b3JrU2hhcGVzLmhhcyh0KSYmdGhpcy5jbGVhcldvcmtTaGFwZU5vZGVDYWNoZSh0KTtsZXQgZTtjb25zdCBuPXRoaXMudk5vZGVzLmdldCh0KTtyZXR1cm4gbiYmKHRoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKHQpLmNvbmNhdCgoKGE9dGhpcy5kcmF3TGF5ZXIpPT1udWxsP3ZvaWQgMDphLmdldEVsZW1lbnRzQnlOYW1lKHQpKXx8W10pLmZvckVhY2gocz0+e3MucmVtb3ZlKCl9KSxlPU90KGUsbi5yZWN0KSx0aGlzLnZOb2Rlcy5kZWxldGUodCkpLGV9YXN5bmMgY2hlY2tUZXh0QWN0aXZlKHQpe2NvbnN0e29wOmUsdmlld0lkOm4sZGF0YVR5cGU6YX09dDtpZihlIT1udWxsJiZlLmxlbmd0aCl7bGV0IHM7Zm9yKGNvbnN0IGkgb2YgdGhpcy52Tm9kZXMuY3VyTm9kZU1hcC52YWx1ZXMoKSl7Y29uc3R7cmVjdDpvLG5hbWU6Yyx0b29sc1R5cGU6bSxvcHQ6dX09aSxwPWVbMF0qdGhpcy5mdWxsTGF5ZXIud29ybGRTY2FsaW5nWzBdK3RoaXMuZnVsbExheWVyLndvcmxkUG9zaXRpb25bMF0seT1lWzFdKnRoaXMuZnVsbExheWVyLndvcmxkU2NhbGluZ1sxXSt0aGlzLmZ1bGxMYXllci53b3JsZFBvc2l0aW9uWzFdO2lmKG09PT1ndC5UZXh0JiZEaChbcCx5XSxvKSYmdS53b3JrU3RhdGU9PT1JdC5Eb25lKXtzPWM7YnJlYWt9fXMmJihhd2FpdCB0aGlzLmJsdXJTZWxlY3Rvcih7dmlld0lkOm4sbXNnVHlwZTpsdC5TZWxlY3QsZGF0YVR5cGU6YSxpc1N5bmM6ITB9KSxhd2FpdCB0aGlzLl9wb3N0KHtzcDpbe3R5cGU6bHQuR2V0VGV4dEFjdGl2ZSx0b29sc1R5cGU6Z3QuVGV4dCx3b3JrSWQ6c31dfSkpfX1hc3luYyBjb2xsb2N0RWZmZWN0U2VsZWN0V29yayh0KXtjb25zdCBlPXRoaXMud29ya1NoYXBlcy5nZXQod3Quc2VsZWN0b3JJZCkse3dvcmtJZDpuLG1zZ1R5cGU6YX09dDtpZihlJiZuJiZlLnNlbGVjdElkcyYmZS5zZWxlY3RJZHMuaW5jbHVkZXMobi50b1N0cmluZygpKSl7YT09PWx0LlJlbW92ZU5vZGU/ZS5zZWxlY3RJZHM9ZS5zZWxlY3RJZHMuZmlsdGVyKHM9PnMhPT1uLnRvU3RyaW5nKCkpOnRoaXMuZWZmZWN0U2VsZWN0Tm9kZURhdGEuYWRkKHQpLGF3YWl0IG5ldyBQcm9taXNlKHM9PntzZXRUaW1lb3V0KCgpPT57cyghMCl9LDApfSksYXdhaXQgdGhpcy5ydW5FZmZlY3RTZWxlY3RXb3JrKCEwKS50aGVuKCgpPT57dmFyIHM7KHM9dGhpcy5lZmZlY3RTZWxlY3ROb2RlRGF0YSk9PW51bGx8fHMuY2xlYXIoKX0pO3JldHVybn1yZXR1cm4gdH1hc3luYyB1cGRhdGVTZWxlY3Rvcih0KXt2YXIgbDtjb25zdCBlPXRoaXMud29ya1NoYXBlcy5nZXQod3Quc2VsZWN0b3JJZCk7aWYoISgobD1lPT1udWxsP3ZvaWQgMDplLnNlbGVjdElkcykhPW51bGwmJmwubGVuZ3RoKSlyZXR1cm47Y29uc3R7Y2FsbGJhY2s6biwuLi5hfT10LHt1cGRhdGVTZWxlY3Rvck9wdDpzLHdpbGxSZWZyZXNoU2VsZWN0b3I6aSx3aWxsU2VyaWFsaXplRGF0YTpvLGVtaXRFdmVudFR5cGU6YyxzY2VuZTptfT1hLHU9cy53b3JrU3RhdGUscD1hd2FpdChlPT1udWxsP3ZvaWQgMDplLnVwZGF0ZVNlbGVjdG9yKHt1cGRhdGVTZWxlY3Rvck9wdDpzLHNlbGVjdElkczplLnNlbGVjdElkcyx2Tm9kZXM6dGhpcy52Tm9kZXMsd2lsbFNlcmlhbGl6ZURhdGE6byx3b3JrZXI6dGhpcyxzY2VuZTptfSkpLHk9cD09bnVsbD92b2lkIDA6cC5zZWxlY3RSZWN0LE89bmV3IE1hcDtlLnNlbGVjdElkcy5mb3JFYWNoKGg9Pntjb25zdCBmPXRoaXMudk5vZGVzLmdldChoKTtpZihmKXtjb25zdHt0b29sc1R5cGU6ZyxvcDpNLG9wdDpBfT1mO08uc2V0KGgse29wdDpBLHRvb2xzVHlwZTpnLG9wczooTT09bnVsbD92b2lkIDA6TS5sZW5ndGgpJiZuZShNKXx8dm9pZCAwfSl9fSk7Y29uc3QgeD1bXSx2PVtdO2lmKGkpe3gucHVzaCh7aXNDbGVhckFsbDohMCxpc0Z1bGxXb3JrOiExLGNsZWFyQ2FudmFzOlN0LlNlbGVjdG9yLHZpZXdJZDp0aGlzLnZpZXdJZH0pO2NvbnN0IGg9e3JlY3Q6eSxpc0Z1bGxXb3JrOiExLGRyYXdDYW52YXM6U3QuU2VsZWN0b3Isdmlld0lkOnRoaXMudmlld0lkfTtzLnRyYW5zbGF0ZSYmYz09PUx0LlRyYW5zbGF0ZU5vZGUmJnU9PT1JdC5Eb2luZyYmKGgudHJhbnNsYXRlPXMudHJhbnNsYXRlKSx4LnB1c2goaCl9Y29uc3QgVD1uJiZuKHtyZXM6cCx3b3JrU2hhcGVOb2RlOmUscGFyYW06YSxwb3N0RGF0YTp7cmVuZGVyOngsc3A6dn0sbmV3U2VydmljZVN0b3JlOk99KXx8e3JlbmRlcjp4LHNwOnZ9OyhULnJlbmRlci5sZW5ndGh8fFQuc3AubGVuZ3RoKSYmdGhpcy5fcG9zdChUKX1hc3luYyBibHVyU2VsZWN0b3IodCl7dmFyIGE7Y29uc3QgZT10aGlzLndvcmtTaGFwZXMuZ2V0KHd0LnNlbGVjdG9ySWQpLG49ZT09bnVsbD92b2lkIDA6ZS5ibHVyU2VsZWN0b3IoKTtpZih0aGlzLmNsZWFyV29ya1NoYXBlTm9kZUNhY2hlKHd0LnNlbGVjdG9ySWQpLCgoYT10aGlzLmRyYXdMYXllcik9PW51bGw/dm9pZCAwOmEucGFyZW50KS5jaGlsZHJlbi5mb3JFYWNoKHM9PntzLm5hbWU9PT13dC5zZWxlY3RvcklkJiZzLnJlbW92ZSgpfSksbil7Y29uc3Qgcz1bXTtzLnB1c2goey4uLm4sdW5kb1RpY2tlcklkOnQ9PW51bGw/dm9pZCAwOnQudW5kb1RpY2tlcklkLGlzU3luYzp0PT1udWxsP3ZvaWQgMDp0LmlzU3luY30pLGF3YWl0IHRoaXMuX3Bvc3Qoe3JlbmRlcjoobj09bnVsbD92b2lkIDA6bi5yZWN0KSYmW3tyZWN0Om4ucmVjdCxkcmF3Q2FudmFzOlN0LkJnLGlzQ2xlYXI6ITAsY2xlYXJDYW52YXM6U3QuQmcsaXNGdWxsV29yazohMCx2aWV3SWQ6dGhpcy52aWV3SWR9XSxzcDpzfSl9fXJlUmVuZGVyU2VsZWN0b3IodD0hMSl7dmFyIG47Y29uc3QgZT10aGlzLndvcmtTaGFwZXMuZ2V0KHd0LnNlbGVjdG9ySWQpO2lmKGUpe2lmKGUmJiEoKG49ZS5zZWxlY3RJZHMpIT1udWxsJiZuLmxlbmd0aCkpcmV0dXJuIHRoaXMuYmx1clNlbGVjdG9yKCk7aWYodGhpcy5kcmF3TGF5ZXIpe2NvbnN0IGE9ZS5yZVJlbmRlclNlbGVjdG9yKCk7YSYmdGhpcy5fcG9zdCh7cmVuZGVyOlt7cmVjdDphLGlzQ2xlYXI6ITAsaXNGdWxsV29yazohMSxjbGVhckNhbnZhczpTdC5TZWxlY3RvcixkcmF3Q2FudmFzOlN0LlNlbGVjdG9yLHZpZXdJZDp0aGlzLnZpZXdJZH1dLHNwOlt7dHlwZTpsdC5TZWxlY3Qsc2VsZWN0SWRzOmUuc2VsZWN0SWRzLHNlbGVjdFJlY3Q6YSx3aWxsU3luY1NlcnZpY2U6dCx2aWV3SWQ6dGhpcy52aWV3SWQscG9pbnRzOmUuZ2V0Q2hpbGRyZW5Qb2ludHMoKSx0ZXh0T3B0OmUudGV4dE9wdH1dfSl9fX11cGRhdGVGdWxsU2VsZWN0V29yayh0KXt2YXIgYSxzLGksbyxjLG0sdSxwO2NvbnN0IGU9dGhpcy53b3JrU2hhcGVzLmdldCh3dC5zZWxlY3RvcklkKSx7c2VsZWN0SWRzOm59PXQ7aWYoIShuIT1udWxsJiZuLmxlbmd0aCkpe3RoaXMuYmx1clNlbGVjdG9yKHQpO3JldHVybn1pZighZSl7IXRoaXMuc2V0RnVsbFdvcmsodCkmJnQud29ya0lkJiYoKGE9dGhpcy50bXBXb3JrU2hhcGVOb2RlKT09bnVsbD92b2lkIDA6YS50b29sc1R5cGUpPT09Z3QuU2VsZWN0b3ImJnRoaXMuc2V0VG1wV29ya0lkKHQud29ya0lkKSx0aGlzLnVwZGF0ZUZ1bGxTZWxlY3RXb3JrKHQpO3JldHVybn1pZihlJiYobiE9bnVsbCYmbi5sZW5ndGgpKXtjb25zdHtiZ1JlY3Q6eSxzZWxlY3RSZWN0Ok99PWUudXBkYXRlU2VsZWN0SWRzKG4pLHg9e3JlbmRlcjpbXSxzcDpbXX07eSYmKChzPXgucmVuZGVyKT09bnVsbHx8cy5wdXNoKHtyZWN0Oll0KHkpLGlzQ2xlYXI6ITAsaXNGdWxsV29yazohMCxjbGVhckNhbnZhczpTdC5CZyxkcmF3Q2FudmFzOlN0LkJnLHZpZXdJZDp0aGlzLnZpZXdJZH0pKSwoaT14LnJlbmRlcik9PW51bGx8fGkucHVzaCh7cmVjdDpPLGlzQ2xlYXI6ITAsaXNGdWxsV29yazohMSxjbGVhckNhbnZhczpTdC5TZWxlY3RvcixkcmF3Q2FudmFzOlN0LlNlbGVjdG9yLHZpZXdJZDp0aGlzLnZpZXdJZH0pLChwPXguc3ApPT1udWxsfHxwLnB1c2goey4uLnQsc2VsZWN0b3JDb2xvcjooKG89dC5vcHQpPT1udWxsP3ZvaWQgMDpvLnN0cm9rZUNvbG9yKXx8ZS5zZWxlY3RvckNvbG9yLHN0cm9rZUNvbG9yOigoYz10Lm9wdCk9PW51bGw/dm9pZCAwOmMuc3Ryb2tlQ29sb3IpfHxlLnN0cm9rZUNvbG9yLGZpbGxDb2xvcjooKG09dC5vcHQpPT1udWxsP3ZvaWQgMDptLmZpbGxDb2xvcil8fGUuZmlsbENvbG9yLHRleHRPcHQ6KCh1PXQub3B0KT09bnVsbD92b2lkIDA6dS50ZXh0T3B0KXx8ZS50ZXh0T3B0LGNhblRleHRFZGl0OmUuY2FuVGV4dEVkaXQsY2FuUm90YXRlOmUuY2FuUm90YXRlLHNjYWxlVHlwZTplLnNjYWxlVHlwZSx0eXBlOmx0LlNlbGVjdCxzZWxlY3RSZWN0Ok8scG9pbnRzOmUuZ2V0Q2hpbGRyZW5Qb2ludHMoKSx3aWxsU3luY1NlcnZpY2U6KHQ9PW51bGw/dm9pZCAwOnQud2lsbFN5bmNTZXJ2aWNlKXx8ITEsb3B0Oih0PT1udWxsP3ZvaWQgMDp0LndpbGxTeW5jU2VydmljZSkmJmUuZ2V0V29ya09wdGlvbnMoKXx8dm9pZCAwLGNhbkxvY2s6ZS5jYW5Mb2NrLGlzTG9ja2VkOmUuaXNMb2NrZWQsdG9vbHNUeXBlczplLnRvb2xzVHlwZXMsc2hhcGVPcHQ6ZS5zaGFwZU9wdH0pLHRoaXMuX3Bvc3QoeCl9fWRlc3Ryb3koKXtzdXBlci5kZXN0cm95KCksdGhpcy5lZmZlY3RTZWxlY3ROb2RlRGF0YS5jbGVhcigpLHRoaXMuYmF0Y2hFcmFzZXJXb3Jrcy5jbGVhcigpLHRoaXMuYmF0Y2hFcmFzZXJSZW1vdmVOb2Rlcy5jbGVhcigpfWRyYXdQZW5jaWxDb21iaW5lKHQpe3ZhciBuLGE7Y29uc3QgZT0obj10aGlzLndvcmtTaGFwZXMuZ2V0KHQpKT09bnVsbD92b2lkIDA6bi5jb21iaW5lQ29uc3VtZSgpO2lmKGUpe2NvbnN0IHM9e3JlbmRlcjpbXSxkcmF3Q291bnQ6dGhpcy5kcmF3Q291bnR9OyhhPXMucmVuZGVyKT09bnVsbHx8YS5wdXNoKHtyZWN0OihlPT1udWxsP3ZvaWQgMDplLnJlY3QpJiZZdChlLnJlY3QpLGlzQ2xlYXI6ITAsZHJhd0NhbnZhczpTdC5GbG9hdCxjbGVhckNhbnZhczpTdC5GbG9hdCxpc0Z1bGxXb3JrOiExLHZpZXdJZDp0aGlzLnZpZXdJZH0pLHRoaXMuX3Bvc3Qocyl9fWRyYXdTZWxlY3Rvcih0LGUpe3ZhciBhLHM7Y29uc3Qgbj17cmVuZGVyOltdLHNwOlt0XX07dC50eXBlPT09bHQuU2VsZWN0JiYhZSYmKChhPW4ucmVuZGVyKT09bnVsbHx8YS5wdXNoKHtyZWN0OnQuc2VsZWN0UmVjdCxkcmF3Q2FudmFzOlN0LlNlbGVjdG9yLGlzQ2xlYXI6ITAsY2xlYXJDYW52YXM6U3QuU2VsZWN0b3IsaXNGdWxsV29yazohMSx2aWV3SWQ6dGhpcy52aWV3SWR9LHtyZWN0OnQucmVjdCYmWXQodC5yZWN0KSxpc0NsZWFyOiEwLGNsZWFyQ2FudmFzOlN0LkZsb2F0LGlzRnVsbFdvcms6ITEsdmlld0lkOnRoaXMudmlld0lkfSx7cmVjdDp0LnJlY3QmJll0KHQucmVjdCksZHJhd0NhbnZhczpTdC5CZyxpc0NsZWFyOiEwLGNsZWFyQ2FudmFzOlN0LkJnLGlzRnVsbFdvcms6ITAsdmlld0lkOnRoaXMudmlld0lkfSkpLGUmJigocz1uLnJlbmRlcik9PW51bGx8fHMucHVzaCh7cmVjdDp0LnJlY3QmJll0KHQucmVjdCksZHJhd0NhbnZhczpTdC5GbG9hdCxpc0NsZWFyOiEwLGNsZWFyQ2FudmFzOlN0LkZsb2F0LGlzRnVsbFdvcms6ITEsdmlld0lkOnRoaXMudmlld0lkfSx7cmVjdDp0LnJlY3QmJll0KHQucmVjdCksZHJhd0NhbnZhczpTdC5CZyxpc0NsZWFyOiEwLGNsZWFyQ2FudmFzOlN0LkJnLGlzRnVsbFdvcms6ITAsdmlld0lkOnRoaXMudmlld0lkfSkpLHRoaXMuX3Bvc3Qobil9YXN5bmMgZHJhd0VyYXNlcih0KXt2YXIgbixhO2NvbnN0IGU9W107aWYoKG49dC5uZXdXb3JrRGF0YXMpIT1udWxsJiZuLnNpemUpe2Zvcihjb25zdCBzIG9mIHQubmV3V29ya0RhdGFzLnZhbHVlcygpKXtjb25zdCBpPXMud29ya0lkLnRvU3RyaW5nKCk7dGhpcy5iYXRjaEVyYXNlcldvcmtzLmFkZChpKSxlLnB1c2goe3R5cGU6bHQuRnVsbFdvcmssd29ya0lkOmksb3BzOm5lKHMub3ApLG9wdDpzLm9wdCx0b29sc1R5cGU6cy50b29sc1R5cGUsdXBkYXRlTm9kZU9wdDp7dXNlQW5pbWF0aW9uOiExfX0pfWRlbGV0ZSB0Lm5ld1dvcmtEYXRhc30oYT10LnJlbW92ZUlkcyk9PW51bGx8fGEuZm9yRWFjaChzPT57dGhpcy5iYXRjaEVyYXNlclJlbW92ZU5vZGVzLmFkZChzKX0pLGUucHVzaCh0KSx0aGlzLl9wb3N0KHtzcDplfSksdGhpcy5iYXRjaEVyYXNlckNvbWJpbmUoKX1kcmF3UGVuY2lsKHQpe3RoaXMuX3Bvc3Qoe2RyYXdDb3VudDp0aGlzLmRyYXdDb3VudCxzcDoodD09bnVsbD92b2lkIDA6dC5vcCkmJlt0XX0pfWRyYXdQZW5jaWxGdWxsKHQsZSxuKXt2YXIgaTtsZXQgYT0obj09bnVsbD92b2lkIDA6bi53aWxsQ2xlYXIpfHwoZT09bnVsbD92b2lkIDA6ZS5pc09wYWNpdHkpfHwhMTshYSYmdC5yZWN0JiYoYT10aGlzLnZOb2Rlcy5oYXNSZWN0SW50ZXJzZWN0UmFuZ2UodC5yZWN0KSk7Y29uc3Qgcz17ZHJhd0NvdW50OjEvMCxyZW5kZXI6W3tyZWN0OnQucmVjdCxkcmF3Q2FudmFzOlN0LkJnLGlzQ2xlYXI6YSxjbGVhckNhbnZhczpTdC5CZyxpc0Z1bGxXb3JrOiEwLHZpZXdJZDp0aGlzLnZpZXdJZH1dLHNwOlt0XX07KGk9cy5yZW5kZXIpPT1udWxsfHxpLnB1c2goe2lzQ2xlYXJBbGw6ITAsY2xlYXJDYW52YXM6U3QuRmxvYXQsaXNGdWxsV29yazohMSx2aWV3SWQ6dGhpcy52aWV3SWR9KSx0aGlzLl9wb3N0KHMpfXVwZGF0ZUJhdGNoRXJhc2VyQ29tYmluZU5vZGUodCxlKXtjb25zdCBuPVtdO2xldCBhO2Zvcihjb25zdCBzIG9mIGUua2V5cygpKXRoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKHMpLmZvckVhY2goaT0+e2NvbnN0IG89aS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTthPU90KGEse3g6by54LWFlLlNhZmVCb3JkZXJQYWRkaW5nLHk6by55LWFlLlNhZmVCb3JkZXJQYWRkaW5nLHc6by53aWR0aCthZS5TYWZlQm9yZGVyUGFkZGluZyoyLGg6by5oZWlnaHQrYWUuU2FmZUJvcmRlclBhZGRpbmcqMn0pLGkucmVtb3ZlKCl9KTtyZXR1cm4gdC5mb3JFYWNoKHM9Pntjb25zdCBpPXRoaXMudk5vZGVzLmdldChzKTtpZihpKWlmKHRoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKHMpWzBdKWE9T3QoYSxpLnJlY3QpO2Vsc2V7Y29uc3QgYz10aGlzLnNldEZ1bGxXb3JrKHsuLi5pLHdvcmtJZDpzfSksbT1jJiZjLmNvbnN1bWVTZXJ2aWNlKHtvcDppLm9wLGlzRnVsbFdvcms6ITB9KTttJiYoaS5yZWN0PW0sYT1PdChhLG0pKX19KSxhJiZuLnB1c2goe3JlY3Q6YSxpc0NsZWFyOiEwLGlzRnVsbFdvcms6ITAsY2xlYXJDYW52YXM6U3QuQmcsZHJhd0NhbnZhczpTdC5CZyx2aWV3SWQ6dGhpcy52aWV3SWR9KSxufWFzeW5jIHJ1bkVmZmVjdFNlbGVjdFdvcmsodCl7dmFyIGUsbixhLHM7Zm9yKGNvbnN0IGkgb2YgdGhpcy5lZmZlY3RTZWxlY3ROb2RlRGF0YS52YWx1ZXMoKSl7Y29uc3Qgbz10aGlzLnNldEZ1bGxXb3JrKGkpO2lmKG8pe2lmKG8udG9vbHNUeXBlPT09Z3QuSW1hZ2UpYXdhaXQgby5jb25zdW1lU2VydmljZUFzeW5jKHtzY2VuZToobj0oZT10aGlzLmRyYXdMYXllcik9PW51bGw/dm9pZCAwOmUucGFyZW50KT09bnVsbD92b2lkIDA6bi5wYXJlbnQsaXNGdWxsV29yazohMSxyZXBsYWNlSWQ6KGE9by5nZXRXb3JrSWQoKSk9PW51bGw/dm9pZCAwOmEudG9TdHJpbmcoKX0pO2Vsc2V7Y29uc3QgYz1pLm9wcyYmVmUoaS5vcHMpO28uY29uc3VtZVNlcnZpY2Uoe29wOmMsaXNGdWxsV29yazohMSxyZXBsYWNlSWQ6KHM9by5nZXRXb3JrSWQoKSk9PW51bGw/dm9pZCAwOnMudG9TdHJpbmcoKX0pfWkhPW51bGwmJmkudXBkYXRlTm9kZU9wdCYmby51cGRhdGFPcHRTZXJ2aWNlKGkudXBkYXRlTm9kZU9wdCksaS53b3JrSWQmJnRoaXMud29ya1NoYXBlcy5kZWxldGUoaS53b3JrSWQpfX10aGlzLnJlUmVuZGVyU2VsZWN0b3IodCl9Y3Vyc29ySG92ZXIodCl7dmFyIGk7Y29uc3R7b3B0OmUsdG9vbHNUeXBlOm4scG9pbnQ6YX09dCxzPXRoaXMuc2V0RnVsbFdvcmsoe3dvcmtJZDpKZSx0b29sc1R5cGU6bixvcHQ6ZX0pO2lmKHMmJmEpe2NvbnN0IG89cy5jdXJzb3JIb3ZlcihhKSxjPXtyZW5kZXI6W119O28mJm8udHlwZT09PWx0LkN1cnNvckhvdmVyJiYoKGk9Yy5yZW5kZXIpPT1udWxsfHxpLnB1c2goe3JlY3Q6by5yZWN0JiZZdChvLnJlY3QpLGlzQ2xlYXI6ITAsY2xlYXJDYW52YXM6U3QuQmcsZHJhd0NhbnZhczpTdC5CZyxpc0Z1bGxXb3JrOiEwLHZpZXdJZDp0aGlzLnZpZXdJZH0pLHRoaXMuX3Bvc3QoYykpfX19Y2xhc3MgZWd7Y29uc3RydWN0b3Iocil7c3QodGhpcywidmlld0lkIik7c3QodGhpcywidk5vZGVzIik7c3QodGhpcywiZnVsbExheWVyIik7c3QodGhpcywiZHJhd0xheWVyIik7c3QodGhpcywic2VydmljZURyYXdMYXllciIpO3N0KHRoaXMsIndvcmtTaGFwZXMiLG5ldyBNYXApO3N0KHRoaXMsInNlbGVjdG9yV29ya1NoYXBlcyIsbmV3IE1hcCk7c3QodGhpcywiYW5pbWF0aW9uSWQiKTtzdCh0aGlzLCJ3aWxsUnVuRWZmZWN0U2VsZWN0b3JJZHMiLG5ldyBTZXQpO3N0KHRoaXMsInJ1bkVmZmVjdElkIik7c3QodGhpcywibm9BbmltYXRpb25SZWN0Iik7c3QodGhpcywicG9zdCIpO3RoaXMudmlld0lkPXIudmlld0lkLHRoaXMudk5vZGVzPXIudk5vZGVzLHRoaXMuZnVsbExheWVyPXIuZnVsbExheWVyLHRoaXMuZHJhd0xheWVyPXIuZHJhd0xheWVyLHRoaXMuc2VydmljZURyYXdMYXllcj1yLnNlcnZpY2VEcmF3TGF5ZXIsdGhpcy5wb3N0PXIucG9zdH1kZXN0cm95KCl7dGhpcy53b3JrU2hhcGVzLmNsZWFyKCksdGhpcy5zZWxlY3RvcldvcmtTaGFwZXMuY2xlYXIoKSx0aGlzLndpbGxSdW5FZmZlY3RTZWxlY3Rvcklkcy5jbGVhcigpfWNvbnN1bWVEcmF3KHIpe3RoaXMuYWN0aXZlV29ya1NoYXBlKHIpLHRoaXMucnVuQW5pbWF0aW9uKCl9Y29uc3VtZUZ1bGwocil7dGhpcy5hY3RpdmVXb3JrU2hhcGUociksdGhpcy5ydW5BbmltYXRpb24oKX1jbGVhckFsbFdvcmtTaGFwZXNDYWNoZSgpe3RoaXMud29ya1NoYXBlcy5mb3JFYWNoKChyLHQpPT57ci50b29sc1R5cGU9PT1ndC5MYXNlclBlbj9zZXRUaW1lb3V0KCgpPT57dGhpcy53b3JrU2hhcGVzLmRlbGV0ZSh0KX0sMmUzKTp0aGlzLndvcmtTaGFwZXMuZGVsZXRlKHQpfSl9cnVuU2VsZWN0V29yayhyKXt0aGlzLmFjdGl2ZVNlbGVjdG9yU2hhcGUocik7Y29uc3R7d29ya0lkOnR9PXIsZT10PT1udWxsP3ZvaWQgMDp0LnRvU3RyaW5nKCk7ZSYmdGhpcy53aWxsUnVuRWZmZWN0U2VsZWN0b3JJZHMuYWRkKGUpLHRoaXMucnVuRWZmZWN0KCl9c2V0Tm9kZUtleShyLHQsZSl7cmV0dXJuIHIudG9vbHNUeXBlPXQsci5ub2RlPXlyKHt0b29sc1R5cGU6dCx0b29sc09wdDplLHZOb2Rlczp0aGlzLnZOb2RlcyxmdWxsTGF5ZXI6dGhpcy5mdWxsTGF5ZXIsZHJhd0xheWVyOnRoaXMuc2VydmljZURyYXdMYXllcn0sdGhpcykscn1ydW5SZXZlcnNlU2VsZWN0V29yayhyKXtyLmZvckVhY2godD0+e3RoaXMuc2VsZWN0b3JXb3JrU2hhcGVzLmZvckVhY2goKGUsbik9Pnt2YXIgYTtpZigoYT1lLnNlbGVjdElkcykhPW51bGwmJmEubGVuZ3RoKXtjb25zdCBzPWUuc2VsZWN0SWRzLmluZGV4T2YodCk7cz4tMSYmKGUuc2VsZWN0SWRzLnNwbGljZShzLDEpLHRoaXMud2lsbFJ1bkVmZmVjdFNlbGVjdG9ySWRzLmFkZChuKSl9fSl9KSx0aGlzLndpbGxSdW5FZmZlY3RTZWxlY3Rvcklkcy5zaXplJiZ0aGlzLnJ1bkVmZmVjdCgpfWFzeW5jIHJlbW92ZVdvcmsocil7Y29uc3R7d29ya0lkOnR9PXIsZT10PT1udWxsP3ZvaWQgMDp0LnRvU3RyaW5nKCk7aWYoZSl7Y29uc3Qgbj10aGlzLndvcmtTaGFwZXMuZ2V0KGUpO2lmKG4pe3RoaXMud29ya1NoYXBlcy5kZWxldGUoZSksYXdhaXQgdGhpcy5yZW1vdmVOb2RlKGUscixuPT1udWxsP3ZvaWQgMDpuLnRvdGFsUmVjdCwhMSk7cmV0dXJufWF3YWl0IHRoaXMucmVtb3ZlTm9kZShlLHIpfX1yZW1vdmVTZWxlY3RXb3JrKHIpe2NvbnN0e3dvcmtJZDp0fT1yLGU9dD09bnVsbD92b2lkIDA6dC50b1N0cmluZygpO2UmJih0aGlzLmFjdGl2ZVNlbGVjdG9yU2hhcGUociksdGhpcy53aWxsUnVuRWZmZWN0U2VsZWN0b3JJZHMuYWRkKGUpKSx0aGlzLnJ1bkVmZmVjdCgpfWFzeW5jIHJlbW92ZU5vZGUocix0LGUsbj0hMCl7dmFyIGk7ci5pbmRleE9mKHd0LnNlbGVjdG9ySWQpPi0xJiZ0aGlzLnJlbW92ZVNlbGVjdFdvcmsodCk7bGV0IGE9ZTtjb25zdCBzPShpPXRoaXMudk5vZGVzLmdldChyKSk9PW51bGw/dm9pZCAwOmkucmVjdDtzJiYoYT1PdChzLGEpKSx0aGlzLmZ1bGxMYXllci5nZXRFbGVtZW50c0J5TmFtZShyKS5mb3JFYWNoKG89PntvLnJlbW92ZSgpfSksdGhpcy5kcmF3TGF5ZXIuZ2V0RWxlbWVudHNCeU5hbWUocikuZm9yRWFjaChvPT57by5yZW1vdmUoKX0pLHRoaXMuc2VydmljZURyYXdMYXllci5nZXRFbGVtZW50c0J5TmFtZShyKS5mb3JFYWNoKG89PntvLnJlbW92ZSgpfSksdGhpcy52Tm9kZXMuZGVsZXRlKHIpLGEmJmF3YWl0IHRoaXMucG9zdCh7cmVuZGVyOlt7cmVjdDpZdChhKSxpc0NsZWFyOiEwLGlzRnVsbFdvcms6bixjbGVhckNhbnZhczpuP1N0LkJnOlN0LlNlcnZpY2VGbG9hdCxkcmF3Q2FudmFzOm4/U3QuQmc6U3QuU2VydmljZUZsb2F0LHdvcmtlclR5cGU6bj92b2lkIDA6VHQuU2VydmljZSx2aWV3SWQ6dGhpcy52aWV3SWR9XX0pfWFjdGl2ZVdvcmtTaGFwZShyKXt2YXIgeSxPLHgsdjtjb25zdHt3b3JrSWQ6dCxvcHQ6ZSx0b29sc1R5cGU6bix0eXBlOmEsdXBkYXRlTm9kZU9wdDpzLG9wczppLG9wOm8sdXNlQW5pbWF0aW9uOmN9PXI7aWYoIXQpcmV0dXJuO2NvbnN0IG09dC50b1N0cmluZygpLHU9KHk9dGhpcy52Tm9kZXMuZ2V0KG0pKT09bnVsbD92b2lkIDA6eS5yZWN0O2lmKCEoKE89dGhpcy53b3JrU2hhcGVzKSE9bnVsbCYmTy5oYXMobSkpKXtsZXQgVD17dG9vbHNUeXBlOm4sYW5pbWF0aW9uV29ya0RhdGE6b3x8W10sYW5pbWF0aW9uSW5kZXg6MCx0eXBlOmEsdXBkYXRlTm9kZU9wdDpzLG9wczppLHVzZUFuaW1hdGlvbjp0eXBlb2YgYzwidSI/Yzp0eXBlb2Yocz09bnVsbD92b2lkIDA6cy51c2VBbmltYXRpb24pPCJ1Ij9zPT1udWxsP3ZvaWQgMDpzLnVzZUFuaW1hdGlvbjohMCxvbGRSZWN0OnUsaXNEaWZmOiExfTtuJiZlJiYoVD10aGlzLnNldE5vZGVLZXkoVCxuLGUpKSwoeD10aGlzLndvcmtTaGFwZXMpPT1udWxsfHx4LnNldChtLFQpfWNvbnN0IHA9KHY9dGhpcy53b3JrU2hhcGVzKT09bnVsbD92b2lkIDA6di5nZXQobSk7YSYmKHAudHlwZT1hKSxpJiYocC5hbmltYXRpb25Xb3JrRGF0YT1WZShpKSxwLm9wcz1pKSxzJiYocC51cGRhdGVOb2RlT3B0PXMpLG8mJihwLmlzRGlmZj10aGlzLmhhc0RpZmZEYXRhKHAuYW5pbWF0aW9uV29ya0RhdGF8fFtdLG8scC50b29sc1R5cGUpLHAuYW5pbWF0aW9uV29ya0RhdGE9bykscC5ub2RlJiZwLm5vZGUuZ2V0V29ya0lkKCkhPT1tJiZwLm5vZGUuc2V0V29ya0lkKG0pLHUmJihwLm9sZFJlY3Q9dSksbiYmZSYmKHAudG9vbHNUeXBlIT09biYmbiYmZSYmdGhpcy5zZXROb2RlS2V5KHAsbixlKSxwLm5vZGUmJnAubm9kZS5zZXRXb3JrT3B0aW9ucyhlKSl9aGFzRGlmZkRhdGEocix0LGUpe2NvbnN0IG49ci5sZW5ndGg7aWYodC5sZW5ndGg8bilyZXR1cm4hMDtzd2l0Y2goZSl7Y2FzZSBndC5QZW5jaWw6e2ZvcihsZXQgYT0wO2E8bjthKz0zKWlmKHRbYV0hPT1yW2FdfHx0W2ErMV0hPT1yW2ErMV0pcmV0dXJuITA7YnJlYWt9Y2FzZSBndC5MYXNlclBlbjp7Zm9yKGxldCBhPTA7YTxuO2ErPTIpaWYodFthXSE9PXJbYV18fHRbYSsxXSE9PXJbYSsxXSlyZXR1cm4hMDticmVha319cmV0dXJuITF9YXN5bmMgYW5pbWF0aW9uRHJhdygpe3ZhciBvLGMsbSx1LHAseSxPLHgsdixULGwsaCxmLGcsTSxBLEMsYixFLEwsRCxJLFIsQix6LEssUSxfLGosRzt0aGlzLmFuaW1hdGlvbklkPXZvaWQgMDtsZXQgcj0hMTtjb25zdCB0PW5ldyBNYXAsZT1bXSxuPVtdLGE9W10scz1bXTtmb3IoY29uc3RbWCxaXW9mIHRoaXMud29ya1NoYXBlcy5lbnRyaWVzKCkpc3dpdGNoKFoudG9vbHNUeXBlKXtjYXNlIGd0LkltYWdlOntjb25zdCB0dD1aLm9sZFJlY3Q7dHQmJmEucHVzaCh7cmVjdDp0dCxpc0NsZWFyOiEwLGNsZWFyQ2FudmFzOlN0LkJnLHZpZXdJZDp0aGlzLnZpZXdJZH0pO2NvbnN0IG50PWF3YWl0KChjPVoubm9kZSk9PW51bGw/dm9pZCAwOmMuY29uc3VtZVNlcnZpY2VBc3luYyh7aXNGdWxsV29yazohMCxzY2VuZToobz10aGlzLmZ1bGxMYXllci5wYXJlbnQpPT1udWxsP3ZvaWQgMDpvLnBhcmVudH0pKTt0aGlzLnNlbGVjdG9yV29ya1NoYXBlcy5mb3JFYWNoKChxLGR0KT0+e3ZhciB1dDsodXQ9cS5zZWxlY3RJZHMpIT1udWxsJiZ1dC5pbmNsdWRlcyhYKSYmKHRoaXMud2lsbFJ1bkVmZmVjdFNlbGVjdG9ySWRzLmFkZChkdCksdGhpcy5ub0FuaW1hdGlvblJlY3Q9T3QodGhpcy5ub0FuaW1hdGlvblJlY3QsdHQpLHRoaXMubm9BbmltYXRpb25SZWN0PU90KHRoaXMubm9BbmltYXRpb25SZWN0LG50KSx0aGlzLnJ1bkVmZmVjdCgpKX0pLHRoaXMud29ya1NoYXBlcy5kZWxldGUoWCksZS5wdXNoKHtyZWN0Om50LGRyYXdDYW52YXM6U3QuQmcsaXNGdWxsV29yazohMCx2aWV3SWQ6dGhpcy52aWV3SWR9KTticmVha31jYXNlIGd0LlRleHQ6e2lmKFoubm9kZSl7Y29uc3QgdHQ9Wi5vbGRSZWN0LG50PShtPVoubm9kZSk9PW51bGw/dm9pZCAwOm0uY29uc3VtZVNlcnZpY2Uoe29wOlouYW5pbWF0aW9uV29ya0RhdGF8fFtdLGlzRnVsbFdvcms6ITB9KTt0aGlzLnNlbGVjdG9yV29ya1NoYXBlcy5mb3JFYWNoKChxLGR0KT0+e3ZhciB1dDsodXQ9cS5zZWxlY3RJZHMpIT1udWxsJiZ1dC5pbmNsdWRlcyhYKSYmKHRoaXMud2lsbFJ1bkVmZmVjdFNlbGVjdG9ySWRzLmFkZChkdCksdGhpcy5ub0FuaW1hdGlvblJlY3Q9T3QodGhpcy5ub0FuaW1hdGlvblJlY3QsdHQpLHRoaXMubm9BbmltYXRpb25SZWN0PU90KHRoaXMubm9BbmltYXRpb25SZWN0LG50KSx0aGlzLnJ1bkVmZmVjdCgpKX0pLCh1PVoubm9kZSk9PW51bGx8fHUuY2xlYXJUbXBQb2ludHMoKSx0aGlzLndvcmtTaGFwZXMuZGVsZXRlKFgpfWJyZWFrfWNhc2UgZ3QuQXJyb3c6Y2FzZSBndC5TdHJhaWdodDpjYXNlIGd0LlJlY3RhbmdsZTpjYXNlIGd0LkVsbGlwc2U6Y2FzZSBndC5TdGFyOmNhc2UgZ3QuUG9seWdvbjpjYXNlIGd0LlNwZWVjaEJhbGxvb246e2NvbnN0IHR0PSEhWi5vcHM7aWYoKHA9Wi5hbmltYXRpb25Xb3JrRGF0YSkhPW51bGwmJnAubGVuZ3RoKXtjb25zdCBudD1aLm9sZFJlY3QscT1aLm5vZGUub2xkUmVjdDtudCYmKGEucHVzaCh7cmVjdDpudCxpc0NsZWFyOiEwLGNsZWFyQ2FudmFzOlN0LkJnLHZpZXdJZDp0aGlzLnZpZXdJZH0pLGUucHVzaCh7cmVjdDpudCxkcmF3Q2FudmFzOlN0LkJnLHZpZXdJZDp0aGlzLnZpZXdJZH0pKSxxJiZzLnB1c2goe3JlY3Q6cSxpc0NsZWFyOiEwLGNsZWFyQ2FudmFzOlN0LlNlcnZpY2VGbG9hdCx2aWV3SWQ6dGhpcy52aWV3SWR9KTtjb25zdCBkdD0oeT1aLm5vZGUpPT1udWxsP3ZvaWQgMDp5LmNvbnN1bWVTZXJ2aWNlKHtvcDpaLmFuaW1hdGlvbldvcmtEYXRhLGlzRnVsbFdvcms6dHR9KTt0LnNldChYLHt3b3JrU3RhdGU6bnQ/Wi5vcHM/SXQuRG9uZTpJdC5Eb2luZzpJdC5TdGFydCxvcDpaLmFuaW1hdGlvbldvcmtEYXRhLmZpbHRlcigodXQsVyk9PntpZihXJTMhPT0yKXJldHVybiEwfSkuc2xpY2UoLTIpfSksdHQ/KHRoaXMuc2VsZWN0b3JXb3JrU2hhcGVzLmZvckVhY2goKHV0LFcpPT57dmFyIEY7KEY9dXQuc2VsZWN0SWRzKSE9bnVsbCYmRi5pbmNsdWRlcyhYKSYmKHRoaXMud2lsbFJ1bkVmZmVjdFNlbGVjdG9ySWRzLmFkZChXKSx0aGlzLm5vQW5pbWF0aW9uUmVjdD1PdCh0aGlzLm5vQW5pbWF0aW9uUmVjdCxudCksdGhpcy5ub0FuaW1hdGlvblJlY3Q9T3QodGhpcy5ub0FuaW1hdGlvblJlY3QscSksdGhpcy5ub0FuaW1hdGlvblJlY3Q9T3QodGhpcy5ub0FuaW1hdGlvblJlY3QsZHQpLHRoaXMucnVuRWZmZWN0KCkpfSksKE89Wi5ub2RlKT09bnVsbHx8Ty5jbGVhclRtcFBvaW50cygpLHRoaXMud29ya1NoYXBlcy5kZWxldGUoWCksZS5wdXNoKHtyZWN0OmR0LGRyYXdDYW52YXM6U3QuQmcsaXNGdWxsV29yazp0dCx2aWV3SWQ6dGhpcy52aWV3SWR9KSx0LnNldChYLHt3b3JrU3RhdGU6SXQuRG9uZSxvcDpaLmFuaW1hdGlvbldvcmtEYXRhLmZpbHRlcigodXQsVyk9PntpZihXJTMhPT0yKXJldHVybiEwfSkuc2xpY2UoLTIpfSkpOm4ucHVzaCh7cmVjdDpkdCxkcmF3Q2FudmFzOlN0LlNlcnZpY2VGbG9hdCx3b3JrZXJUeXBlOnR0P3ZvaWQgMDpUdC5TZXJ2aWNlLGlzRnVsbFdvcms6dHQsdmlld0lkOnRoaXMudmlld0lkfSksWi5hbmltYXRpb25Xb3JrRGF0YS5sZW5ndGg9MH1icmVha31jYXNlIGd0LlBlbmNpbDp7aWYoIVoudXNlQW5pbWF0aW9uJiZaLm9wcyl7bGV0IHR0PSh4PVoubm9kZSk9PW51bGw/dm9pZCAwOnguY29uc3VtZVNlcnZpY2Uoe29wOlouYW5pbWF0aW9uV29ya0RhdGF8fFtdLGlzRnVsbFdvcms6ITAscmVwbGFjZUlkOlh9KTtjb25zdCBudD0odj1aLm5vZGUpPT1udWxsP3ZvaWQgMDp2LnVwZGF0YU9wdFNlcnZpY2UoWi51cGRhdGVOb2RlT3B0KTt0dD1PdCh0dCxudCksYS5wdXNoKHtyZWN0Ok90KFoub2xkUmVjdCx0dCksY2xlYXJDYW52YXM6U3QuQmcsdmlld0lkOnRoaXMudmlld0lkfSksZS5wdXNoKHtyZWN0Ok90KFoub2xkUmVjdCx0dCksZHJhd0NhbnZhczpTdC5CZyx2aWV3SWQ6dGhpcy52aWV3SWR9KSx0aGlzLnNlbGVjdG9yV29ya1NoYXBlcy5mb3JFYWNoKChxLGR0KT0+e3ZhciB1dDsodXQ9cS5zZWxlY3RJZHMpIT1udWxsJiZ1dC5pbmNsdWRlcyhYKSYmKHRoaXMud2lsbFJ1bkVmZmVjdFNlbGVjdG9ySWRzLmFkZChkdCksdGhpcy5ub0FuaW1hdGlvblJlY3Q9T3QodGhpcy5ub0FuaW1hdGlvblJlY3QsdHQpLHRoaXMucnVuRWZmZWN0KCkpfSksKFQ9Wi5ub2RlKT09bnVsbHx8VC5jbGVhclRtcFBvaW50cygpLHRoaXMud29ya1NoYXBlcy5kZWxldGUoWCl9ZWxzZSBpZihaLnVzZUFuaW1hdGlvbil7Y29uc3QgbnQ9dGhpcy5jb21wdXROZXh0QW5pbWF0aW9uSW5kZXgoWiwzKSxxPVouaXNEaWZmPzA6TWF0aC5tYXgoMCwoWi5hbmltYXRpb25JbmRleHx8MCktMyksZHQ9KFouYW5pbWF0aW9uV29ya0RhdGF8fFtdKS5zbGljZShxLG50KTtpZihaLmlzRGVsKVouaXNEZWwmJigoYj1aLm5vZGUpPT1udWxsfHxiLmNsZWFyVG1wUG9pbnRzKCksdGhpcy53b3JrU2hhcGVzLmRlbGV0ZShYKSk7ZWxzZXtpZigoWi5hbmltYXRpb25JbmRleHx8MCk8bnR8fFouaXNEaWZmKXtjb25zdCB1dD0oaD1aLm5vZGUpPT1udWxsP3ZvaWQgMDpoLmNvbnN1bWVTZXJ2aWNlKHtvcDpkdCxpc0Z1bGxXb3JrOiExLHJlcGxhY2VJZDoobD1aLm5vZGUuZ2V0V29ya0lkKCkpPT1udWxsP3ZvaWQgMDpsLnRvU3RyaW5nKCl9KTtpZihuLnB1c2goe3JlY3Q6dXQsZHJhd0NhbnZhczpTdC5TZXJ2aWNlRmxvYXQsdmlld0lkOnRoaXMudmlld0lkfSksWi5hbmltYXRpb25JbmRleD1udCxaLmlzRGlmZiYmKFouaXNEaWZmPSExKSxkdC5sZW5ndGgpe2NvbnN0IFc9ZHQuZmlsdGVyKChGLFYpPT57aWYoViUzIT09MilyZXR1cm4hMH0pLnNsaWNlKC0yKTt0LnNldChYLHt3b3JrU3RhdGU6cT09PTA/SXQuU3RhcnQ6bnQ9PT0oKGY9Wi5hbmltYXRpb25Xb3JrRGF0YSk9PW51bGw/dm9pZCAwOmYubGVuZ3RoKT9JdC5Eb25lOkl0LkRvaW5nLG9wOld9KX19ZWxzZSBpZihaLm9wcyl7Y29uc3QgdXQ9KE09Wi5ub2RlKT09bnVsbD92b2lkIDA6TS5jb25zdW1lU2VydmljZSh7b3A6Wi5hbmltYXRpb25Xb3JrRGF0YXx8W10saXNGdWxsV29yazohMCxyZXBsYWNlSWQ6KGc9Wi5ub2RlLmdldFdvcmtJZCgpKT09bnVsbD92b2lkIDA6Zy50b1N0cmluZygpfSk7Wi5pc0RlbD0hMCxzLnB1c2goe3JlY3Q6dXQsY2xlYXJDYW52YXM6U3QuU2VydmljZUZsb2F0LHZpZXdJZDp0aGlzLnZpZXdJZH0pLChBPVoubm9kZSkhPW51bGwmJkEuZ2V0V29ya09wdGlvbnMoKS5pc09wYWNpdHkmJmEucHVzaCh7cmVjdDp1dCxjbGVhckNhbnZhczpTdC5CZyx2aWV3SWQ6dGhpcy52aWV3SWR9KSxlLnB1c2goe3JlY3Q6dXQsZHJhd0NhbnZhczpTdC5CZyx2aWV3SWQ6dGhpcy52aWV3SWR9KSx0aGlzLnZOb2Rlcy5zZXRJbmZvKFgse29wOlouYW5pbWF0aW9uV29ya0RhdGEsb3B0OihDPVoubm9kZSk9PW51bGw/dm9pZCAwOkMuZ2V0V29ya09wdGlvbnMoKSx0b29sc1R5cGU6Wi50b29sc1R5cGUscmVjdDp1dH0pLHQuc2V0KFgse3dvcmtTdGF0ZTpJdC5Eb25lLG9wOmR0LmZpbHRlcigoVyxGKT0+e2lmKEYlMyE9PTIpcmV0dXJuITB9KS5zbGljZSgtMil9KX1yPSEwfWJyZWFrfWJyZWFrfWNhc2UgZ3QuTGFzZXJQZW46e2NvbnN0IG50PXRoaXMuY29tcHV0TmV4dEFuaW1hdGlvbkluZGV4KFosMikscT1NYXRoLm1heCgwLChaLmFuaW1hdGlvbkluZGV4fHwwKS0yKSxkdD0oWi5hbmltYXRpb25Xb3JrRGF0YXx8W10pLnNsaWNlKHEsbnQpO2lmKFouaXNEZWwpe2lmKFouaXNEZWwpe2NvbnN0IHV0PShCPVoubm9kZSk9PW51bGw/dm9pZCAwOkIuY29uc3VtZVNlcnZpY2Uoe29wOltdLGlzRnVsbFdvcms6ITF9KTtaLnRvdGFsUmVjdD1PdChaLnRvdGFsUmVjdCx1dCkscy5wdXNoKHtyZWN0OloudG90YWxSZWN0LGNsZWFyQ2FudmFzOlN0LlNlcnZpY2VGbG9hdCx2aWV3SWQ6dGhpcy52aWV3SWR9KSxuLnB1c2goe3JlY3Q6Wi50b3RhbFJlY3QsZHJhd0NhbnZhczpTdC5TZXJ2aWNlRmxvYXQsdmlld0lkOnRoaXMudmlld0lkfSksKHo9Wi5ub2RlKT09bnVsbHx8ei5jbGVhclRtcFBvaW50cygpLHRoaXMud29ya1NoYXBlcy5kZWxldGUoWCl9fWVsc2V7aWYoKFouYW5pbWF0aW9uSW5kZXh8fDApPG50KXtjb25zdCB1dD0oTD1aLm5vZGUpPT1udWxsP3ZvaWQgMDpMLmNvbnN1bWVTZXJ2aWNlKHtvcDpkdCxpc0Z1bGxXb3JrOiExLHJlcGxhY2VJZDooRT1aLm5vZGUuZ2V0V29ya0lkKCkpPT1udWxsP3ZvaWQgMDpFLnRvU3RyaW5nKCl9KTtaLnRvdGFsUmVjdD1PdChaLnRvdGFsUmVjdCx1dCksWi50aW1lciYmKGNsZWFyVGltZW91dChaLnRpbWVyKSxaLnRpbWVyPXZvaWQgMCksWi5hbmltYXRpb25JbmRleD1udCxkdC5sZW5ndGgmJnQuc2V0KFgse3dvcmtTdGF0ZTpxPT09MD9JdC5TdGFydDpudD09PSgoRD1aLmFuaW1hdGlvbldvcmtEYXRhKT09bnVsbD92b2lkIDA6RC5sZW5ndGgpP0l0LkRvbmU6SXQuRG9pbmcsb3A6ZHQuc2xpY2UoLTIpfSl9ZWxzZXtaLnRpbWVyfHwoWi50aW1lcj1zZXRUaW1lb3V0KCgpPT57Wi50aW1lcj12b2lkIDAsWi5pc0RlbD0hMCx0aGlzLnJ1bkFuaW1hdGlvbigpfSwoKEk9Wi5ub2RlKT09bnVsbD92b2lkIDA6SS5nZXRXb3JrT3B0aW9ucygpKS5kdXJhdGlvbioxZTMrMTAwKSx0LnNldChYLHt3b3JrU3RhdGU6SXQuRG9uZSxvcDpbXX0pKTtjb25zdCB1dD0oUj1aLm5vZGUpPT1udWxsP3ZvaWQgMDpSLmNvbnN1bWVTZXJ2aWNlKHtvcDpbXSxpc0Z1bGxXb3JrOiExfSk7Wi50b3RhbFJlY3Q9T3QoWi50b3RhbFJlY3QsdXQpfXMucHVzaCh7cmVjdDpaLnRvdGFsUmVjdCxjbGVhckNhbnZhczpTdC5TZXJ2aWNlRmxvYXQsdmlld0lkOnRoaXMudmlld0lkfSksbi5wdXNoKHtyZWN0OloudG90YWxSZWN0LGRyYXdDYW52YXM6U3QuU2VydmljZUZsb2F0LHZpZXdJZDp0aGlzLnZpZXdJZH0pLHI9ITB9YnJlYWt9fXImJnRoaXMucnVuQW5pbWF0aW9uKCk7Y29uc3QgaT17cmVuZGVyOltdfTtpZihhLmxlbmd0aCl7Y29uc3QgWD1hLnJlZHVjZSgoWix0dCk9Pih0dC5yZWN0JiZ0dC5jbGVhckNhbnZhcz09PVN0LkJnJiYoWi5yZWN0PU90KFoucmVjdCx0dC5yZWN0KSksWikse2lzQ2xlYXI6ITAsY2xlYXJDYW52YXM6U3QuQmcsdmlld0lkOnRoaXMudmlld0lkfSk7WC5yZWN0JiYoWC5yZWN0PVgucmVjdCYmWXQoWC5yZWN0KSwoSz1pLnJlbmRlcik9PW51bGx8fEsucHVzaChYKSl9aWYocy5sZW5ndGgpe2NvbnN0IFg9cy5yZWR1Y2UoKFosdHQpPT4odHQucmVjdCYmdHQuY2xlYXJDYW52YXM9PT1TdC5TZXJ2aWNlRmxvYXQmJihaLnJlY3Q9T3QoWi5yZWN0LHR0LnJlY3QpKSxaKSx7aXNDbGVhcjohMCxjbGVhckNhbnZhczpTdC5TZXJ2aWNlRmxvYXQsd29ya2VyVHlwZTpUdC5TZXJ2aWNlLHZpZXdJZDp0aGlzLnZpZXdJZH0pO1gucmVjdCYmKFgucmVjdD1YLnJlY3QmJll0KFgucmVjdCksKFE9aS5yZW5kZXIpPT1udWxsfHxRLnB1c2goWCkpfWlmKGUubGVuZ3RoKXtjb25zdCBYPWUucmVkdWNlKChaLHR0KT0+KHR0LnJlY3QmJnR0LmRyYXdDYW52YXM9PT1TdC5CZyYmKFoucmVjdD1PdChaLnJlY3QsdHQucmVjdCkpLFopLHtpc0Z1bGxXb3JrOiEwLGRyYXdDYW52YXM6U3QuQmcsdmlld0lkOnRoaXMudmlld0lkfSk7WC5yZWN0JiYoWC5yZWN0PVgucmVjdCYmWXQoWC5yZWN0KSwoXz1pLnJlbmRlcik9PW51bGx8fF8ucHVzaChYKSl9aWYobi5sZW5ndGgpe2NvbnN0IFg9bi5yZWR1Y2UoKFosdHQpPT4odHQucmVjdCYmdHQuZHJhd0NhbnZhcz09PVN0LlNlcnZpY2VGbG9hdCYmKFoucmVjdD1PdChaLnJlY3QsdHQucmVjdCkpLFopLHtpc0Z1bGxXb3JrOiExLGRyYXdDYW52YXM6U3QuU2VydmljZUZsb2F0LHdvcmtlclR5cGU6VHQuU2VydmljZSx2aWV3SWQ6dGhpcy52aWV3SWR9KTtYLnJlY3QmJihYLnJlY3Q9WC5yZWN0JiZZdChYLnJlY3QpLChqPWkucmVuZGVyKT09bnVsbHx8ai5wdXNoKFgpKX10LnNpemUmJihpLnNwPVtdLHQuZm9yRWFjaCgoWCxaKT0+e3ZhciB0dDsodHQ9aS5zcCk9PW51bGx8fHR0LnB1c2goe3R5cGU6bHQuQ3Vyc29yLHVpZDpaLnNwbGl0KFZoKVswXSxvcDpYLm9wLHdvcmtTdGF0ZTpYLndvcmtTdGF0ZSx2aWV3SWQ6dGhpcy52aWV3SWR9KX0pKSwoRz1pLnJlbmRlcikhPW51bGwmJkcubGVuZ3RoJiZ0aGlzLnBvc3QoaSl9cnVuQW5pbWF0aW9uKCl7dGhpcy5hbmltYXRpb25JZHx8KHRoaXMuYW5pbWF0aW9uSWQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0aW9uRHJhdy5iaW5kKHRoaXMpKSl9Y29tcHV0TmV4dEFuaW1hdGlvbkluZGV4KHIsdCl7dmFyIG47Y29uc3QgZT1NYXRoLmZsb29yKChyLmFuaW1hdGlvbldvcmtEYXRhfHxbXSkuc2xpY2Uoci5hbmltYXRpb25JbmRleCkubGVuZ3RoKjMyL3QvKCgobj1yLm5vZGUpPT1udWxsP3ZvaWQgMDpuLnN5bmNVbml0VGltZSl8fDFlMykpKnQ7cmV0dXJuIE1hdGgubWluKChyLmFuaW1hdGlvbkluZGV4fHwwKSsoZXx8dCksKHIuYW5pbWF0aW9uV29ya0RhdGF8fFtdKS5sZW5ndGgpfXJ1bkVmZmVjdCgpe3RoaXMucnVuRWZmZWN0SWR8fCh0aGlzLnJ1bkVmZmVjdElkPXNldFRpbWVvdXQodGhpcy5lZmZlY3RSdW5TZWxlY3Rvci5iaW5kKHRoaXMpLDApKX1lZmZlY3RSdW5TZWxlY3Rvcigpe3RoaXMucnVuRWZmZWN0SWQ9dm9pZCAwO2xldCByPXRoaXMubm9BbmltYXRpb25SZWN0O3RoaXMud2lsbFJ1bkVmZmVjdFNlbGVjdG9ySWRzLmZvckVhY2godD0+e3ZhciBhLHM7Y29uc3QgZT10aGlzLnNlbGVjdG9yV29ya1NoYXBlcy5nZXQodCksbj1lJiZlLnNlbGVjdElkcyYmKChhPWUubm9kZSk9PW51bGw/dm9pZCAwOmEuc2VsZWN0U2VydmljZU5vZGUodCxlLCEwKSk7cj1PdChyLG4pLChzPWU9PW51bGw/dm9pZCAwOmUuc2VsZWN0SWRzKSE9bnVsbCYmcy5sZW5ndGh8fHRoaXMuc2VsZWN0b3JXb3JrU2hhcGVzLmRlbGV0ZSh0KX0pLHImJnRoaXMucG9zdCh7cmVuZGVyOlt7cmVjdDpZdChyKSxkcmF3Q2FudmFzOlN0LkJnLGlzQ2xlYXI6ITAsY2xlYXJDYW52YXM6U3QuQmcsaXNGdWxsV29yazohMCx2aWV3SWQ6dGhpcy52aWV3SWR9XX0pLHRoaXMud2lsbFJ1bkVmZmVjdFNlbGVjdG9ySWRzLmNsZWFyKCksdGhpcy5ub0FuaW1hdGlvblJlY3Q9dm9pZCAwfWFjdGl2ZVNlbGVjdG9yU2hhcGUocil7dmFyIGMsbSx1O2NvbnN0e3dvcmtJZDp0LG9wdDplLHRvb2xzVHlwZTpuLHR5cGU6YSxzZWxlY3RJZHM6c309cjtpZighdClyZXR1cm47Y29uc3QgaT10LnRvU3RyaW5nKCk7aWYoISgoYz10aGlzLnNlbGVjdG9yV29ya1NoYXBlcykhPW51bGwmJmMuaGFzKGkpKSl7bGV0IHA9e3Rvb2xzVHlwZTpuLHNlbGVjdElkczpzLHR5cGU6YSxvcHQ6ZX07biYmZSYmKHA9dGhpcy5zZXROb2RlS2V5KHAsbixlKSksKG09dGhpcy5zZWxlY3RvcldvcmtTaGFwZXMpPT1udWxsfHxtLnNldChpLHApfWNvbnN0IG89KHU9dGhpcy5zZWxlY3RvcldvcmtTaGFwZXMpPT1udWxsP3ZvaWQgMDp1LmdldChpKTthJiYoby50eXBlPWEpLG8ubm9kZSYmby5ub2RlLmdldFdvcmtJZCgpIT09aSYmby5ub2RlLnNldFdvcmtJZChpKSxvLnNlbGVjdElkcz1zfHxbXX19Y2xhc3MgcmcgZXh0ZW5kcyBabntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KTtzdCh0aGlzLCJhbmltYXRpb25Xb3JrUmVjdHMiLG5ldyBNYXApO3N0KHRoaXMsImNvbWJpbmVEcmF3VGltZXIiKTtzdCh0aGlzLCJhbmltYXRpb25JZCIpO3N0KHRoaXMsImNsb3NlQW5pbWF0aW9uVGltZSIsMTEwMCk7c3QodGhpcywicnVuTGFzZXJQZW5TdGVwIiwwKX1hc3luYyBydW5GdWxsV29yayh0LGUpe3ZhciBzLGk7Y29uc3Qgbj10aGlzLnNldEZ1bGxXb3JrKHQpLGE9dC5vcHMmJlZlKHQub3BzKTtpZihuKXtsZXQgbztuLnRvb2xzVHlwZT09PWd0LkltYWdlP289YXdhaXQgbi5jb25zdW1lU2VydmljZUFzeW5jKHtpc0Z1bGxXb3JrOiEwLHNjZW5lOihzPXRoaXMuZnVsbExheWVyLnBhcmVudCk9PW51bGw/dm9pZCAwOnMucGFyZW50fSk6bz1uLmNvbnN1bWVTZXJ2aWNlKHtvcDphLGlzRnVsbFdvcms6ITAscmVwbGFjZUlkOihpPW4uZ2V0V29ya0lkKCkpPT1udWxsP3ZvaWQgMDppLnRvU3RyaW5nKCksaXNEcmF3TGFiZWw6ZX0pO2NvbnN0IGM9KHQ9PW51bGw/dm9pZCAwOnQudXBkYXRlTm9kZU9wdCkmJm4udXBkYXRhT3B0U2VydmljZSh0LnVwZGF0ZU5vZGVPcHQpO3JldHVybiB0LndvcmtJZCYmdGhpcy53b3JrU2hhcGVzLmRlbGV0ZSh0LndvcmtJZCksY3x8b319cnVuU2VsZWN0V29yayh0KXt2YXIgbjtjb25zdCBlPXRoaXMuc2V0RnVsbFdvcmsodCk7ZSYmKChuPXQuc2VsZWN0SWRzKSE9bnVsbCYmbi5sZW5ndGgpJiZ0LndvcmtJZCYmZS5zZWxlY3RTZXJ2aWNlTm9kZSh0LndvcmtJZC50b1N0cmluZygpLHtzZWxlY3RJZHM6dC5zZWxlY3RJZHN9LCExKX1jb25zdW1lRHJhdyh0KXt2YXIgYTtjb25zdHtvcDplLHdvcmtJZDpufT10O2lmKGUhPW51bGwmJmUubGVuZ3RoJiZuKXtjb25zdCBzPXRoaXMud29ya1NoYXBlcy5nZXQobik7aWYoIXMpcmV0dXJuO2NvbnN0IGk9cy50b29sc1R5cGUsbz1zLmNvbnN1bWUoe2RhdGE6dCxpc0Z1bGxXb3JrOiExLGlzQ2xlYXJBbGw6ITAsaXNTdWJXb3JrZXI6ITB9KTtzd2l0Y2goaSl7Y2FzZSBndC5MYXNlclBlbjpvIT1udWxsJiZvLnJlY3QmJigoYT10aGlzLmFuaW1hdGlvbldvcmtSZWN0cyk9PW51bGx8fGEuc2V0KG4se3JlczpvLGNhbkRlbDohMSxpc1JlY3Q6ITB9KSksdGhpcy5ydW5MYXNlclBlbkFuaW1hdGlvbigpO2JyZWFrO2Nhc2UgZ3QuQXJyb3c6Y2FzZSBndC5TdHJhaWdodDpjYXNlIGd0LkVsbGlwc2U6Y2FzZSBndC5SZWN0YW5nbGU6Y2FzZSBndC5TdGFyOmNhc2UgZ3QuUG9seWdvbjpjYXNlIGd0LlNwZWVjaEJhbGxvb246byYmKHRoaXMuZHJhd0NvdW50KyssdGhpcy5kcmF3QXJyb3cobykpO2JyZWFrO2Nhc2UgZ3QuUGVuY2lsOm8mJih0aGlzLmRyYXdDb3VudCsrLHRoaXMuZHJhd1BlbmNpbChvKSk7YnJlYWt9fX1jb25zdW1lRHJhd0FsbCh0KXt2YXIgbixhO2NvbnN0e3dvcmtJZDplfT10O2lmKGUpe2NvbnN0IHM9dGhpcy53b3JrU2hhcGVzLmdldChlKTtpZighcylyZXR1cm47c3dpdGNoKHMudG9vbHNUeXBlKXtjYXNlIGd0Lkxhc2VyUGVuOmlmKHRoaXMuYW5pbWF0aW9uSWQpe2NvbnN0IG89cy5jb25zdW1lQWxsKHtkYXRhOnR9KTtvIT1udWxsJiZvLm9wJiZvIT1udWxsJiZvLnJlY3QmJigobj10aGlzLmFuaW1hdGlvbldvcmtSZWN0cyk9PW51bGx8fG4uc2V0KGUse3JlczpvLGNhbkRlbDohMSxpc1JlY3Q6ITB9KSx0aGlzLnJ1bkxhc2VyUGVuQW5pbWF0aW9uKG8pKTtjb25zdCBjPShhPXMuZ2V0V29ya09wdGlvbnMoKSk9PW51bGw/dm9pZCAwOmEuZHVyYXRpb247dGhpcy5jbG9zZUFuaW1hdGlvblRpbWU9Yz9jKjFlMysxMDA6dGhpcy5jbG9zZUFuaW1hdGlvblRpbWUsc2V0VGltZW91dCgoKT0+e3ZhciB1O3RoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKGUudG9TdHJpbmcoKSkubWFwKHA9PnAucmVtb3ZlKCkpLHRoaXMuY2xlYXJXb3JrU2hhcGVOb2RlQ2FjaGUoZSk7Y29uc3QgbT0odT10aGlzLmFuaW1hdGlvbldvcmtSZWN0cyk9PW51bGw/dm9pZCAwOnUuZ2V0KGUpO20mJihtLmNhbkRlbD0hMCksc2V0VGltZW91dCgoKT0+e3RoaXMuX3Bvc3Qoe3NwOlt7cmVtb3ZlSWRzOltlLnRvU3RyaW5nKCldLHR5cGU6bHQuUmVtb3ZlTm9kZX1dfSl9LHMuZ2V0V29ya09wdGlvbnMoKS5zeW5jVW5pdFRpbWV8fHRoaXMuY2xvc2VBbmltYXRpb25UaW1lKX0sdGhpcy5jbG9zZUFuaW1hdGlvblRpbWUpfWJyZWFrO2Nhc2UgZ3QuQXJyb3c6Y2FzZSBndC5TdHJhaWdodDpjYXNlIGd0LkVsbGlwc2U6Y2FzZSBndC5QZW5jaWw6Y2FzZSBndC5SZWN0YW5nbGU6Y2FzZSBndC5TdGFyOmNhc2UgZ3QuUG9seWdvbjpjYXNlIGd0LlNwZWVjaEJhbGxvb246dGhpcy5kcmF3Q291bnQ9MCx0aGlzLmZ1bGxMYXllci5yZW1vdmVBbGxDaGlsZHJlbigpLHRoaXMuY2xlYXJXb3JrU2hhcGVOb2RlQ2FjaGUoZSk7YnJlYWt9fX11cGRhdGVMYWJlbHModCxlKXt0LmNoaWxkcmVuLmZvckVhY2gobj0+e2lmKG4udGFnTmFtZT09PSJMQUJFTCIpe2NvbnN0IGE9bi5uYW1lLHt3aWR0aDpzfT1uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFtpXT10LndvcmxkU2NhbGluZyx7dW5kZXJsaW5lOm8sbGluZVRocm91Z2g6Y309ZS5vcHQ7byYmdC5nZXRFbGVtZW50c0J5TmFtZShgJHthfV91bmRlcmxpbmVgKVswXS5hdHRyKHtwb2ludHM6WzAsMCxzL2ksMF19KSxjJiZ0LmdldEVsZW1lbnRzQnlOYW1lKGAke2F9X2xpbmVUaHJvdWdoYClbMF0uYXR0cih7cG9pbnRzOlswLDAscy9pLDBdfSl9fSl9cnVuTGFzZXJQZW5BbmltYXRpb24odCl7dGhpcy5hbmltYXRpb25JZHx8KHRoaXMuYW5pbWF0aW9uSWQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dmFyIGEscztpZih0aGlzLmFuaW1hdGlvbklkPXZvaWQgMCx0aGlzLnJ1bkxhc2VyUGVuU3RlcCsrLHRoaXMucnVuTGFzZXJQZW5TdGVwPjEpe3RoaXMucnVuTGFzZXJQZW5TdGVwPTAsdGhpcy5ydW5MYXNlclBlbkFuaW1hdGlvbih0KTtyZXR1cm59bGV0IGU7Y29uc3Qgbj1bXTsoYT10aGlzLmFuaW1hdGlvbldvcmtSZWN0cyk9PW51bGx8fGEuZm9yRWFjaCgoaSxvLGMpPT57aS5pc1JlY3QmJihlPU90KGUsaS5yZXMucmVjdCkpLGkucmVzLndvcmtJZCYmbi5wdXNoKGkucmVzKSx0aGlzLmZ1bGxMYXllci5nZXRFbGVtZW50c0J5TmFtZShvLnRvU3RyaW5nKCkpLmxlbmd0aD9pLmlzUmVjdD0hMDppLmlzUmVjdD0hMSxpLmNhbkRlbCYmYy5kZWxldGUobyl9KSwocz10aGlzLmFuaW1hdGlvbldvcmtSZWN0cykhPW51bGwmJnMuc2l6ZSYmdGhpcy5ydW5MYXNlclBlbkFuaW1hdGlvbigpLGUmJih0JiZuLnB1c2godCksdGhpcy5fcG9zdCh7cmVuZGVyOlt7cmVjdDpZdChlKSxkcmF3Q2FudmFzOlN0LkZsb2F0LGlzQ2xlYXI6ITAsY2xlYXJDYW52YXM6U3QuRmxvYXQsaXNGdWxsV29yazohMSx2aWV3SWQ6dGhpcy52aWV3SWR9XSxzcDpufSkpfSkpfWRyYXdQZW5jaWwodCl7dGhpcy5fcG9zdCh7ZHJhd0NvdW50OnRoaXMuZHJhd0NvdW50LHJlbmRlcjpbe3JlY3Q6dD09bnVsbD92b2lkIDA6dC5yZWN0LGRyYXdDYW52YXM6U3QuRmxvYXQsaXNDbGVhcjohMSxpc0Z1bGxXb3JrOiExLHZpZXdJZDp0aGlzLnZpZXdJZH1dLHNwOih0PT1udWxsP3ZvaWQgMDp0Lm9wKSYmW3RdfSl9ZHJhd0Fycm93KHQpe3RoaXMuX3Bvc3Qoe2RyYXdDb3VudDp0aGlzLmRyYXdDb3VudCxyZW5kZXI6W3tyZWN0Oih0PT1udWxsP3ZvaWQgMDp0LnJlY3QpJiZZdCh0LnJlY3QpLGRyYXdDYW52YXM6U3QuRmxvYXQsaXNDbGVhcjohMCxjbGVhckNhbnZhczpTdC5GbG9hdCxpc0Z1bGxXb3JrOiExLHZpZXdJZDp0aGlzLnZpZXdJZH1dfSl9fXZhciBxbj0oZD0+KGQuRnVsbD0iZnVsbCIsZC5TdWI9InN1YiIsZCkpKHFufHx7fSk7Y2xhc3Mgbmd7Y29uc3RydWN0b3Iocix0KXtzdCh0aGlzLCJfc2VsZiIpO3N0KHRoaXMsInR5cGUiKTtzdCh0aGlzLCJ3b3JrVGhyZWFkTWFwIixuZXcgTWFwKTt0aGlzLl9zZWxmPXIsdGhpcy50eXBlPXQsdGhpcy5yZWdpc3RlcigpfWluaXQocil7Y29uc3R7dmlld0lkOnQsZHByOmUsb2Zmc2NyZWVuQ2FudmFzT3B0Om4sbGF5ZXJPcHQ6YSxpc1NhZmFyaTpzfT1yO2lmKCFlfHwhbnx8IWEpcmV0dXJuO2xldCBpO3RoaXMudHlwZT09PSJmdWxsIiYmKGk9bmV3IGlnKHQse2RwcjplLG9mZnNjcmVlbkNhbnZhc09wdDpuLGxheWVyT3B0OmF9LHRoaXMucG9zdC5iaW5kKHRoaXMpKSksdGhpcy50eXBlPT09InN1YiImJihpPW5ldyBzZyh0LHtkcHI6ZSxvZmZzY3JlZW5DYW52YXNPcHQ6bixsYXllck9wdDphfSx0aGlzLnBvc3QuYmluZCh0aGlzKSkpLGkmJnMmJmkuc2V0SXNTYWZhcmkocyksaSYmci5jYW1lcmFPcHQmJmkuc2V0Q2FtZXJhT3B0KHIuY2FtZXJhT3B0KSxpJiZ0aGlzLndvcmtUaHJlYWRNYXAuc2V0KHQsaSl9cmVnaXN0ZXIoKXtvbm1lc3NhZ2U9cj0+e2NvbnN0IHQ9ci5kYXRhO2lmKHQpZm9yKGNvbnN0IGUgb2YgdC52YWx1ZXMoKSl7Y29uc3R7bXNnVHlwZTpuLHZpZXdJZDphLHRhc2tzcXVldWU6cyxtYWluVGFza3NxdWV1ZUNvdW50Oml9PWU7aWYobj09PWx0LkluaXQpe3RoaXMuaW5pdChlKTtjb250aW51ZX1pZihuPT09bHQuVGFza3NRdWV1ZSYmKHMhPW51bGwmJnMuc2l6ZSkmJmkpe3RoaXMud29ya1RocmVhZE1hcC5mb3JFYWNoKChjLG0pPT57Y29uc3QgdT1zLmdldChtKTt1JiZjLm9uKHUpLHRoaXMucG9zdCh7d29ya2VyVGFza3NxdWV1ZUNvdW50Oml9KX0pO2NvbnRpbnVlfWlmKGE9PT1YaCl7dGhpcy53b3JrVGhyZWFkTWFwLmZvckVhY2goYz0+e2Mub24oZSksbj09PWx0LkRlc3Ryb3kmJnRoaXMud29ya1RocmVhZE1hcC5kZWxldGUoYSl9KTtjb250aW51ZX1jb25zdCBvPXRoaXMud29ya1RocmVhZE1hcC5nZXQoYSk7byYmKG8ub24oZSksbj09PWx0LkRlc3Ryb3kmJnRoaXMud29ya1RocmVhZE1hcC5kZWxldGUoYSkpfX19cG9zdChyLHQpe3Q/dGhpcy5fc2VsZi5wb3N0TWVzc2FnZShyLHQpOnRoaXMuX3NlbGYucG9zdE1lc3NhZ2Uocil9fWNsYXNzIGlnIGV4dGVuZHMgWG57Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKHQsZSk7c3QodGhpcywic2VydmljZURyYXdMYXllciIpO3N0KHRoaXMsImRyYXdMYXllciIpO3N0KHRoaXMsInNuYXBzaG90RnVsbExheWVyIik7c3QodGhpcywibWV0aG9kQnVpbGRlciIpO3N0KHRoaXMsImxvY2FsV29yayIpO3N0KHRoaXMsInNlcnZpY2VXb3JrIik7c3QodGhpcywiX3Bvc3QiKTt0aGlzLl9wb3N0PW4sdGhpcy5zZXJ2aWNlRHJhd0xheWVyPXRoaXMuY3JlYXRlTGF5ZXIoInNlcnZpY2VEcmF3TGF5ZXIiLHRoaXMuc2NlbmUsey4uLmUubGF5ZXJPcHQsYnVmZmVyU2l6ZToxZTN9KSx0aGlzLmRyYXdMYXllcj10aGlzLmNyZWF0ZUxheWVyKCJkcmF3TGF5ZXIiLHRoaXMuc2NlbmUsey4uLmUubGF5ZXJPcHQsYnVmZmVyU2l6ZToxZTN9KTtjb25zdCBhPXt0aHJlYWQ6dGhpcyx2aWV3SWQ6dGhpcy52aWV3SWQsdk5vZGVzOnRoaXMudk5vZGVzLGZ1bGxMYXllcjp0aGlzLmZ1bGxMYXllcixkcmF3TGF5ZXI6dGhpcy5kcmF3TGF5ZXIscG9zdDp0aGlzLnBvc3QuYmluZCh0aGlzKX07dGhpcy5sb2NhbFdvcms9bmV3IHRnKGEpLHRoaXMuc2VydmljZVdvcms9bmV3IGVnKHsuLi5hLHNlcnZpY2VEcmF3TGF5ZXI6dGhpcy5zZXJ2aWNlRHJhd0xheWVyfSksdGhpcy5tZXRob2RCdWlsZGVyPW5ldyB2MChbTHQuQ29weU5vZGUsTHQuU2V0Q29sb3JOb2RlLEx0LkRlbGV0ZU5vZGUsTHQuUm90YXRlTm9kZSxMdC5TY2FsZU5vZGUsTHQuVHJhbnNsYXRlTm9kZSxMdC5aSW5kZXhBY3RpdmUsTHQuWkluZGV4Tm9kZSxMdC5TZXRGb250U3R5bGUsTHQuU2V0UG9pbnQsTHQuU2V0TG9jayxMdC5TZXRTaGFwZU9wdF0pLnJlZ2lzdGVyRm9yV29ya2VyKHRoaXMubG9jYWxXb3JrLHRoaXMuc2VydmljZVdvcmssdGhpcy5zY2VuZSksdGhpcy52Tm9kZXMuaW5pdCh0aGlzLmZ1bGxMYXllcix0aGlzLmRyYXdMYXllcil9YXN5bmMgcG9zdCh0LGUpe3ZhciBvLGMsbTtjb25zdCBuPXQucmVuZGVyLGE9W107bGV0IHM9ZTtpZihuIT1udWxsJiZuLmxlbmd0aCl7Zm9yKGNvbnN0IHUgb2Ygbil7aWYodS5pc0NsZWFyQWxsJiYodS5yZWN0PXRoaXMuZ2V0U2NlbmVSZWN0KCksdS5pc0NsZWFyPSEwLGRlbGV0ZSB1LmlzQ2xlYXJBbGwpLHUuZHJhd0NhbnZhcyl7Y29uc3QgcD10aGlzLmdldExheWVyKHUuaXNGdWxsV29yayx1LndvcmtlclR5cGUpO2lmKChwPT1udWxsP3ZvaWQgMDpwLnBhcmVudCkucmVuZGVyKCksdS5pc0RyYXdBbGwpe2NvbnN0IHk9dGhpcy5nZXRTY2VuZVJlY3QoKSx7cmVjdFJhbmdlOk99PXRoaXMudk5vZGVzLmdldFJlY3RJbnRlcnNlY3RSYW5nZSh5LCExKTt1LnJlY3Q9TyxkZWxldGUgdS5pc0RyYXdBbGx9fWlmKHUucmVjdCl7dS5jbGVhckNhbnZhcz09PXUuZHJhd0NhbnZhcyYmdS5kcmF3Q2FudmFzPT09U3QuQmcmJih1LnJlY3Q9dGhpcy5jaGVja1JpZ2h0UmVjdEJvdW5kaW5nQm94KHUucmVjdCkpO2NvbnN0IHA9dS5kcmF3Q2FudmFzPT09U3QuU2VsZWN0b3ImJnUucmVjdDtpZih1LmRyYXdDYW52YXMmJih1LnJlY3Q9dGhpcy5zYWZhcmlGaXhSZWN0KFp0KHUucmVjdCkpKSwhdS5yZWN0KWNvbnRpbnVlO2lmKHUuZHJhd0NhbnZhcz09PVN0LlNlbGVjdG9yKXtjb25zdCB5PShvPXQuc3ApPT1udWxsP3ZvaWQgMDpvLmZpbmQoTz0+Ty50eXBlPT09bHQuU2VsZWN0KTt5JiYoeS5yZWN0PXUucmVjdCkscCYmKHUub2Zmc2V0PXt4OnUucmVjdC54LXAueCx5OnUucmVjdC55LXAueX0pfWlmKHUuZHJhd0NhbnZhcyl7Y29uc3QgeT1hd2FpdCB0aGlzLmdldFJlY3RJbWFnZUJpdG1hcCh1LnJlY3QsISF1LmlzRnVsbFdvcmssdS53b3JrZXJUeXBlKTt1LmltYWdlQml0bWFwPXksc3x8KHM9W10pLHMucHVzaCh5KX1hLnB1c2godSl9fXQucmVuZGVyPWF9Y29uc3QgaT0oYz10LnNwKT09bnVsbD92b2lkIDA6Yy5maWx0ZXIodT0+dS50eXBlIT09bHQuTm9uZXx8T2JqZWN0LmtleXModSkuZmlsdGVyKHA9PnA9PT0idHlwZSIpLmxlbmd0aCk7aWYoaSE9bnVsbCYmaS5sZW5ndGgmJih0LnNwPWkubWFwKHU9Pih7Li4udSx2aWV3SWQ6dGhpcy52aWV3SWR9KSkpLCh0LmRyYXdDb3VudHx8dC53b3JrZXJUYXNrc3F1ZXVlQ291bnR8fChtPXQuc3ApIT1udWxsJiZtLmxlbmd0aHx8YSE9bnVsbCYmYS5sZW5ndGgpJiYodGhpcy5fcG9zdCh0LHMpLHMhPW51bGwmJnMubGVuZ3RoKSlmb3IoY29uc3QgdSBvZiBzKXUgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCYmdS5jbG9zZSgpfW9uKHQpe2lmKHRoaXMubWV0aG9kQnVpbGRlci5jb25zdW1lRm9yV29ya2VyKHQpKXJldHVybjtjb25zdHttc2dUeXBlOmUsZGF0YVR5cGU6bix3b3JrSWQ6YX09dDtzd2l0Y2goZSl7Y2FzZSBsdC5VcGRhdGVDYW1lcmE6dGhpcy51cGRhdGVDYW1lcmEodCk7YnJlYWs7Y2FzZSBsdC5TZWxlY3Q6bj09PVR0LlNlcnZpY2UmJihhPT09d3Quc2VsZWN0b3JJZD90aGlzLmxvY2FsV29yay51cGRhdGVGdWxsU2VsZWN0V29yayh0KTp0aGlzLnNlcnZpY2VXb3JrLnJ1blNlbGVjdFdvcmsodCkpO2JyZWFrO2Nhc2UgbHQuVXBkYXRlTm9kZTpjYXNlIGx0LkZ1bGxXb3JrOnRoaXMuY29uc3VtZUZ1bGwobix0KTticmVhaztjYXNlIGx0LlJlbW92ZU5vZGU6dGhpcy5yZW1vdmVOb2RlKHQpO2JyZWFrO2Nhc2UgbHQuR2V0VGV4dEFjdGl2ZTp0aGlzLmNoZWNrVGV4dEFjdGl2ZSh0KTticmVhaztjYXNlIGx0LkN1cnNvckhvdmVyOnRoaXMuY3Vyc29ySG92ZXIodCl9c3VwZXIub24odCl9YXN5bmMgcmVtb3ZlTm9kZSh0KXtjb25zdHtkYXRhVHlwZTplLHdvcmtJZDpufT10O2lmKG49PT13dC5zZWxlY3RvcklkKXthd2FpdCB0aGlzLmxvY2FsV29yay5ibHVyU2VsZWN0b3IodCk7cmV0dXJufWU9PT1UdC5Mb2NhbCYmKGF3YWl0IHRoaXMubG9jYWxXb3JrLnJlbW92ZVdvcmsodCksYXdhaXQgdGhpcy5sb2NhbFdvcmsuY29sbG9jdEVmZmVjdFNlbGVjdFdvcmsodCkpLGU9PT1UdC5TZXJ2aWNlJiYoYXdhaXQgdGhpcy5zZXJ2aWNlV29yay5yZW1vdmVXb3JrKHQpLHRoaXMubG9jYWxXb3JrLmNvbGxvY3RFZmZlY3RTZWxlY3RXb3JrKHQpKX1jaGVja1RleHRBY3RpdmUodCl7Y29uc3R7ZGF0YVR5cGU6ZX09dDtlPT09VHQuTG9jYWwmJnRoaXMubG9jYWxXb3JrLmNoZWNrVGV4dEFjdGl2ZSh0KX1jbGVhckFsbCgpe3RoaXMudk5vZGVzLmNsZWFyKCksc3VwZXIuY2xlYXJBbGwoKSx0aGlzLnNlcnZpY2VEcmF3TGF5ZXImJih0aGlzLnNlcnZpY2VEcmF3TGF5ZXIucGFyZW50LmNoaWxkcmVuLmZvckVhY2godD0+e3QubmFtZSE9PSJ2aWV3cG9ydCImJnQucmVtb3ZlKCl9KSx0aGlzLnNlcnZpY2VEcmF3TGF5ZXIucmVtb3ZlQWxsQ2hpbGRyZW4oKSksdGhpcy5wb3N0KHtyZW5kZXI6W3tpc0NsZWFyQWxsOiEwLGNsZWFyQ2FudmFzOlN0LkJnLGlzRnVsbFdvcms6ITAsdmlld0lkOnRoaXMudmlld0lkfSx7aXNDbGVhckFsbDohMCxjbGVhckNhbnZhczpTdC5GbG9hdCxpc0Z1bGxXb3JrOiExLHZpZXdJZDp0aGlzLnZpZXdJZH0se2lzQ2xlYXJBbGw6ITAsY2xlYXJDYW52YXM6U3QuU2VydmljZUZsb2F0LGlzRnVsbFdvcms6ITEsdmlld0lkOnRoaXMudmlld0lkfV0sc3A6W3t0eXBlOmx0LkNsZWFyfV19KX11cGRhdGVMYXllcih0KXtjb25zdHt3aWR0aDplLGhlaWdodDpufT10O3N1cGVyLnVwZGF0ZUxheWVyKHQpLHRoaXMuc2VydmljZURyYXdMYXllciYmKHRoaXMuc2VydmljZURyYXdMYXllci5wYXJlbnQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsZSksdGhpcy5zZXJ2aWNlRHJhd0xheWVyLnBhcmVudC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsbiksdGhpcy5zZXJ2aWNlRHJhd0xheWVyLnNldEF0dHJpYnV0ZSgic2l6ZSIsW2Usbl0pLHRoaXMuc2VydmljZURyYXdMYXllci5zZXRBdHRyaWJ1dGUoInBvcyIsW2UqLjUsbiouNV0pKX1zZXRDYW1lcmFPcHQodCl7dGhpcy5jYW1lcmFPcHQ9dDtjb25zdHtzY2FsZTplLGNlbnRlclg6bixjZW50ZXJZOmEsd2lkdGg6cyxoZWlnaHQ6aX09dDsocyE9PXRoaXMuc2NlbmUud2lkdGh8fGkhPT10aGlzLnNjZW5lLmhlaWdodCkmJnRoaXMudXBkYXRlU2NlbmUoe3dpZHRoOnMsaGVpZ2h0Oml9KSx0aGlzLmZ1bGxMYXllciYmKHRoaXMuZnVsbExheWVyLnNldEF0dHJpYnV0ZSgic2NhbGUiLFtlLGVdKSx0aGlzLmZ1bGxMYXllci5zZXRBdHRyaWJ1dGUoInRyYW5zbGF0ZSIsWy1uLC1hXSkpLHRoaXMuZHJhd0xheWVyJiYodGhpcy5kcmF3TGF5ZXIuc2V0QXR0cmlidXRlKCJzY2FsZSIsW2UsZV0pLHRoaXMuZHJhd0xheWVyLnNldEF0dHJpYnV0ZSgidHJhbnNsYXRlIixbLW4sLWFdKSksdGhpcy5zZXJ2aWNlRHJhd0xheWVyJiYodGhpcy5zZXJ2aWNlRHJhd0xheWVyLnNldEF0dHJpYnV0ZSgic2NhbGUiLFtlLGVdKSx0aGlzLnNlcnZpY2VEcmF3TGF5ZXIuc2V0QXR0cmlidXRlKCJ0cmFuc2xhdGUiLFstbiwtYV0pKX1nZXRMYXllcih0LGUpe3JldHVybiB0P3RoaXMuZnVsbExheWVyOmUmJmU9PT1UdC5TZXJ2aWNlP3RoaXMuc2VydmljZURyYXdMYXllcjp0aGlzLmRyYXdMYXllcn1nZXRPZmZzY3JlZW4odCxlKXtyZXR1cm4gdGhpcy5nZXRMYXllcih0LGUpLnBhcmVudC5jYW52YXN9YXN5bmMgY29uc3VtZUZ1bGwodCxlKXtjb25zdCBuPWF3YWl0IHRoaXMubG9jYWxXb3JrLmNvbGxvY3RFZmZlY3RTZWxlY3RXb3JrKGUpO24mJnQ9PT1UdC5Mb2NhbCYmYXdhaXQgdGhpcy5sb2NhbFdvcmsuY29uc3VtZUZ1bGwobix0aGlzLnNjZW5lKSxuJiZ0PT09VHQuU2VydmljZSYmdGhpcy5zZXJ2aWNlV29yay5jb25zdW1lRnVsbChuKX1jb25zdW1lRHJhdyh0LGUpe3Q9PT1UdC5Mb2NhbCYmdGhpcy5sb2NhbFdvcmsuY29uc3VtZURyYXcoZSx0aGlzLnNlcnZpY2VXb3JrKSx0PT09VHQuU2VydmljZSYmdGhpcy5zZXJ2aWNlV29yay5jb25zdW1lRHJhdyhlKX1jb25zdW1lRHJhd0FsbCh0LGUpe3Q9PT1UdC5Mb2NhbCYmdGhpcy5sb2NhbFdvcmsuY29uc3VtZURyYXdBbGwoZSx0aGlzLnNlcnZpY2VXb3JrKX11cGRhdGVDYW1lcmEodCl7dmFyIGE7Y29uc3QgZT1bXSx7Y2FtZXJhT3B0Om59PXQ7aWYobiYmIXZyKHRoaXMuY2FtZXJhT3B0LG4pKXtjb25zdCBzPXRoaXMubG9jYWxXb3JrLmdldFdvcmtTaGFwZShKZSk7aWYocyYmKChhPXMuc2VsZWN0SWRzKSE9bnVsbCYmYS5sZW5ndGgpJiZzLmN1cnNvckJsdXIoKSx0aGlzLnNldENhbWVyYU9wdChuKSx0aGlzLmxvY2FsV29yay53b3JrU2hhcGVzLmZvckVhY2goKGksbyk9PnsoaS50b29sc1R5cGU9PT1ndC5QZW5jaWx8fGkudG9vbHNUeXBlPT09Z3QuQXJyb3d8fGkudG9vbHNUeXBlPT09Z3QuU3RyYWlnaHR8fGkudG9vbHNUeXBlPT09Z3QuRWxsaXBzZXx8aS50b29sc1R5cGU9PT1ndC5SZWN0YW5nbGV8fGkudG9vbHNUeXBlPT09Z3QuU3Rhcnx8aS50b29sc1R5cGU9PT1ndC5Qb2x5Z29ufHxpLnRvb2xzVHlwZT09PWd0LlNwZWVjaEJhbGxvb258fGkudG9vbHNUeXBlPT09Z3QuVGV4dCkmJnRoaXMubG9jYWxXb3JrLndvcmtTaGFwZVN0YXRlLnNldChvLHt3aWxsQ2xlYXI6ITB9KX0pLHRoaXMudk5vZGVzLmN1ck5vZGVNYXAuc2l6ZSYmKHRoaXMudk5vZGVzLnVwZGF0ZU5vZGVzUmVjdCgpLHRoaXMubG9jYWxXb3JrLnJlUmVuZGVyU2VsZWN0b3IoKSx0aGlzLnNlcnZpY2VXb3JrLnNlbGVjdG9yV29ya1NoYXBlcy5zaXplKSlmb3IoY29uc3RbaSxvXW9mIHRoaXMuc2VydmljZVdvcmsuc2VsZWN0b3JXb3JrU2hhcGVzLmVudHJpZXMoKSl0aGlzLnNlcnZpY2VXb3JrLnJ1blNlbGVjdFdvcmsoe3dvcmtJZDppLHNlbGVjdElkczpvLnNlbGVjdElkcyxtc2dUeXBlOmx0LlNlbGVjdCxkYXRhVHlwZTpUdC5TZXJ2aWNlLHZpZXdJZDp0aGlzLnZpZXdJZH0pO3RoaXMudk5vZGVzLmhhc1JlbmRlck5vZGVzKCkmJmUucHVzaCh7aXNDbGVhckFsbDohMCxjbGVhckNhbnZhczpTdC5CZyxpc0Z1bGxXb3JrOiEwLHZpZXdJZDp0aGlzLnZpZXdJZH0se2lzQ2xlYXJBbGw6ITAsY2xlYXJDYW52YXM6U3QuRmxvYXQsaXNGdWxsV29yazohMSx2aWV3SWQ6dGhpcy52aWV3SWR9LHtpc0NsZWFyQWxsOiEwLGNsZWFyQ2FudmFzOlN0LlNlcnZpY2VGbG9hdCxpc0Z1bGxXb3JrOiExLHZpZXdJZDp0aGlzLnZpZXdJZH0se2lzRHJhd0FsbDohMCxkcmF3Q2FudmFzOlN0LkJnLGlzRnVsbFdvcms6ITAsdmlld0lkOnRoaXMudmlld0lkfSksZS5sZW5ndGgmJnRoaXMucG9zdCh7cmVuZGVyOmV9KX19Z2V0UmVjdEltYWdlQml0bWFwKHQsZSxuKXtjb25zdCBhPXQueCp0aGlzLmRwcixzPXQueSp0aGlzLmRwcixpPXQudyp0aGlzLmRwcixvPXQuaCp0aGlzLmRwcjtyZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAodGhpcy5nZXRPZmZzY3JlZW4oZSxuKSxhLHMsaSxvKX1zYWZhcmlGaXhSZWN0KHQpe2lmKHQueD50aGlzLnNjZW5lLndpZHRofHx0Lnk+dGhpcy5zY2VuZS5oZWlnaHR8fHQudyt0Lng8PTB8fHQuaCt0Lnk8PTB8fHQudzw9MHx8dC5oPD0wKXJldHVybjtjb25zdCBlPXt4Ok1hdGguZmxvb3IoTWF0aC5tYXgoMCx0LngpKSx5Ok1hdGguZmxvb3IoTWF0aC5tYXgoMCx0LnkpKSx3Ok1hdGguZmxvb3IoTWF0aC5taW4odGhpcy5zY2VuZS53aWR0aCx0LncpKSxoOk1hdGguZmxvb3IoTWF0aC5taW4odGhpcy5zY2VuZS5oZWlnaHQsdC5oKSl9O2lmKHQueCt0Lnc8dGhpcy5zY2VuZS53aWR0aCYmKGUudz1NYXRoLmZsb29yKHQueCt0LnctZS54KSksdC55K3QuaDx0aGlzLnNjZW5lLmhlaWdodCYmKGUuaD1NYXRoLmZsb29yKHQueSt0LmgtZS55KSksIShlLnc8PTB8fGUuaDw9MCkpcmV0dXJuIGV9Z2V0U2NlbmVSZWN0KCl7Y29uc3R7d2lkdGg6dCxoZWlnaHQ6ZX09dGhpcy5zY2VuZTtyZXR1cm57eDowLHk6MCx3Ok1hdGguZmxvb3IodCksaDpNYXRoLmZsb29yKGUpfX1jaGVja1JpZ2h0UmVjdEJvdW5kaW5nQm94KHQpe3JldHVybiB0aGlzLnZOb2Rlcy5jb21iaW5lSW50ZXJzZWN0UmVjdCh0KX1jdXJzb3JIb3Zlcih0KXt0aGlzLmxvY2FsV29yay5jdXJzb3JIb3Zlcih0KX19Y2xhc3Mgc2cgZXh0ZW5kcyBYbntjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIodCxlKTtzdCh0aGlzLCJfcG9zdCIpO3N0KHRoaXMsImRyYXdMYXllciIpO3N0KHRoaXMsInNuYXBzaG90RnVsbExheWVyIik7c3QodGhpcywic2VydmljZVdvcmsiKTtzdCh0aGlzLCJsb2NhbFdvcmsiKTt0aGlzLl9wb3N0PW47Y29uc3QgYT17dGhyZWFkOnRoaXMsdmlld0lkOnRoaXMudmlld0lkLHZOb2Rlczp0aGlzLnZOb2RlcyxmdWxsTGF5ZXI6dGhpcy5mdWxsTGF5ZXIsZHJhd0xheWVyOnRoaXMuZHJhd0xheWVyLHBvc3Q6dGhpcy5wb3N0LmJpbmQodGhpcyl9O3RoaXMubG9jYWxXb3JrPW5ldyByZyhhKSx0aGlzLnZOb2Rlcy5pbml0KHRoaXMuZnVsbExheWVyLHRoaXMuZHJhd0xheWVyKX1hc3luYyBwb3N0KHQsZSl7dmFyIG8sYztjb25zdCBuPXQucmVuZGVyLGE9W107bGV0IHM9ZTtpZihuIT1udWxsJiZuLmxlbmd0aCl7Zm9yKGNvbnN0IG0gb2YgbilpZihtLmRyYXdDYW52YXMmJnRoaXMuZnVsbExheWVyLnBhcmVudC5yZW5kZXIoKSxtLnJlY3Qpe2lmKG0ucmVjdD10aGlzLnNhZmFyaUZpeFJlY3QoWnQobS5yZWN0KSksIW0ucmVjdCljb250aW51ZTtpZihtLmRyYXdDYW52YXMpe2NvbnN0IHU9YXdhaXQgdGhpcy5nZXRSZWN0SW1hZ2VCaXRtYXAobS5yZWN0LCEhbS5pc0Z1bGxXb3JrKTttLmltYWdlQml0bWFwPXUsc3x8KHM9W10pLHMucHVzaCh1KX1hLnB1c2gobSl9dC5yZW5kZXI9YX1jb25zdCBpPShvPXQuc3ApPT1udWxsP3ZvaWQgMDpvLmZpbHRlcihtPT5tLnR5cGUhPT1sdC5Ob25lfHxPYmplY3Qua2V5cyhtKS5maWx0ZXIodT0+dT09PSJ0eXBlIikubGVuZ3RoKTtpZihpIT1udWxsJiZpLmxlbmd0aCYmKHQuc3A9aS5tYXAobT0+KHsuLi5tLHZpZXdJZDp0aGlzLnZpZXdJZH0pKSksKChjPXQuc3ApIT1udWxsJiZjLmxlbmd0aHx8dC5kcmF3Q291bnR8fGEhPW51bGwmJmEubGVuZ3RoKSYmKHRoaXMuX3Bvc3QodCxzKSxzIT1udWxsJiZzLmxlbmd0aCkpZm9yKGNvbnN0IG0gb2YgcyltIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXAmJm0uY2xvc2UoKX1vbih0KXtjb25zdHttc2dUeXBlOmV9PXQ7c3dpdGNoKGUpe2Nhc2UgbHQuVXBkYXRlQ2FtZXJhOnRoaXMudXBkYXRlQ2FtZXJhKHQpO2JyZWFrO2Nhc2UgbHQuU25hcHNob3Q6dGhpcy5zbmFwc2hvdEZ1bGxMYXllcj10aGlzLmNyZWF0ZUxheWVyKCJzbmFwc2hvdEZ1bGxMYXllciIsdGhpcy5zY2VuZSx7Li4udGhpcy5vcHQubGF5ZXJPcHQsYnVmZmVyU2l6ZTp0aGlzLnZpZXdJZD09PSJtYWluVmlldyI/NmUzOjNlM30pLHRoaXMuc25hcHNob3RGdWxsTGF5ZXImJnRoaXMuZ2V0U25hcHNob3QodCkudGhlbigoKT0+e3RoaXMuc25hcHNob3RGdWxsTGF5ZXI9dm9pZCAwfSk7YnJlYWs7Y2FzZSBsdC5Cb3VuZGluZ0JveDp0aGlzLnNuYXBzaG90RnVsbExheWVyPXRoaXMuY3JlYXRlTGF5ZXIoInNuYXBzaG90RnVsbExheWVyIix0aGlzLnNjZW5lLHsuLi50aGlzLm9wdC5sYXllck9wdCxidWZmZXJTaXplOnRoaXMudmlld0lkPT09Im1haW5WaWV3Ij82ZTM6M2UzfSksdGhpcy5zbmFwc2hvdEZ1bGxMYXllciYmdGhpcy5nZXRCb3VuZGluZ1JlY3QodCkudGhlbigoKT0+e3RoaXMuc25hcHNob3RGdWxsTGF5ZXI9dm9pZCAwfSk7YnJlYWt9c3VwZXIub24odCl9Z2V0T2Zmc2NyZWVuKHQpe3ZhciBlO3JldHVybihlPSh0JiZ0aGlzLnNuYXBzaG90RnVsbExheWVyfHx0aGlzLmZ1bGxMYXllcikucGFyZW50KT09bnVsbD92b2lkIDA6ZS5jYW52YXN9Y29uc3VtZURyYXcodCxlKXt0PT09VHQuTG9jYWwmJnRoaXMubG9jYWxXb3JrLmNvbnN1bWVEcmF3KGUpfWNvbnN1bWVEcmF3QWxsKHQsZSl7dGhpcy5sb2NhbFdvcmsuY29uc3VtZURyYXdBbGwoZSl9Z2V0UmVjdEltYWdlQml0bWFwKHQsZT0hMSxuKXtjb25zdCBhPXQueCp0aGlzLmRwcixzPXQueSp0aGlzLmRwcixpPXQudyp0aGlzLmRwcixvPXQuaCp0aGlzLmRwcjtyZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAodGhpcy5nZXRPZmZzY3JlZW4oZSksYSxzLGksbyxuKX1zYWZhcmlGaXhSZWN0KHQpe2lmKHQudyt0Lng8PTB8fHQuaCt0Lnk8PTB8fHQudzw9MHx8dC5oPD0wKXJldHVybjtjb25zdCBlPXt4OjAseTowLHc6TWF0aC5mbG9vcih0aGlzLnNjZW5lLndpZHRoKSxoOk1hdGguZmxvb3IodGhpcy5zY2VuZS5oZWlnaHQpfTtpZih0Lng8MD90LncrdC54PHRoaXMuc2NlbmUud2lkdGgmJihlLnc9dC53K3QueCk6dC53K3QueD4wJiYoZS54PXQueCxlLnc9TWF0aC5mbG9vcih0aGlzLnNjZW5lLndpZHRoLXQueCkpLHQueTwwP3QuaCt0Lnk8dGhpcy5zY2VuZS5oZWlnaHQmJihlLmg9dC5oK3QueSk6dC5oK3QueT4wJiYoZS55PXQueSxlLmg9TWF0aC5mbG9vcih0aGlzLnNjZW5lLmhlaWdodC10LnkpKSwhKGUudzw9MHx8ZS5oPD0wKSlyZXR1cm4gZX11cGRhdGVDYW1lcmEodCl7Y29uc3R7Y2FtZXJhT3B0OmV9PXQ7ZSYmdGhpcy5zZXRDYW1lcmFPcHQoZSl9c2V0Q2FtZXJhT3B0KHQsZSl7dGhpcy5jYW1lcmFPcHQ9dDtjb25zdHtzY2FsZTpuLGNlbnRlclg6YSxjZW50ZXJZOnMsd2lkdGg6aSxoZWlnaHQ6b309dDsoaSE9PXRoaXMuc2NlbmUud2lkdGh8fG8hPT10aGlzLnNjZW5lLmhlaWdodCkmJnRoaXMudXBkYXRlU2NlbmUoe3dpZHRoOmksaGVpZ2h0Om99KSxlPyhlLnNldEF0dHJpYnV0ZSgic2NhbGUiLFtuLG5dKSxlLnNldEF0dHJpYnV0ZSgidHJhbnNsYXRlIixbLWEsLXNdKSk6KHRoaXMuZnVsbExheWVyLnNldEF0dHJpYnV0ZSgic2NhbGUiLFtuLG5dKSx0aGlzLmZ1bGxMYXllci5zZXRBdHRyaWJ1dGUoInRyYW5zbGF0ZSIsWy1hLC1zXSkpfWFzeW5jIGdldFNuYXBzaG90KHQpe2NvbnN0e3NjZW5lUGF0aDplLHNjZW5lczpuLGNhbWVyYU9wdDphLHc6cyxoOmksbWF4WkluZGV4Om99PXQ7aWYoZSYmbiYmYSYmdGhpcy5zbmFwc2hvdEZ1bGxMYXllcil7Y29uc3QgYz1adCh0aGlzLmNhbWVyYU9wdCk7dGhpcy5zZXRDYW1lcmFPcHQoYSx0aGlzLnNuYXBzaG90RnVsbExheWVyKSx0aGlzLmxvY2FsV29yay5mdWxsTGF5ZXI9dGhpcy5zbmFwc2hvdEZ1bGxMYXllcix0aGlzLmxvY2FsV29yay5kcmF3TGF5ZXI9dGhpcy5mdWxsTGF5ZXI7bGV0IG07Y29uc3QgdT1uZXcgTWFwO2Zvcihjb25zdFt5LE9db2YgT2JqZWN0LmVudHJpZXMobikpaWYoTyE9bnVsbCYmTy50eXBlKXN3aXRjaChPPT1udWxsP3ZvaWQgMDpPLnR5cGUpe2Nhc2UgbHQuVXBkYXRlTm9kZTpjYXNlIGx0LkZ1bGxXb3JrOntjb25zdHt0b29sc1R5cGU6eCxvcHQ6dn09Tzt4PT09Z3QuVGV4dCYmdiYmKHYuekluZGV4PXYuekluZGV4KyhvfHwwKSwodi5saW5lVGhyb3VnaHx8di51bmRlcmxpbmUpJiZ1LnNldCh5LE8pKTtjb25zdCBUPWF3YWl0IHRoaXMubG9jYWxXb3JrLnJ1bkZ1bGxXb3JrKHsuLi5PLG9wdDp2LHdvcmtJZDp5LG1zZ1R5cGU6bHQuRnVsbFdvcmssZGF0YVR5cGU6VHQuU2VydmljZSx2aWV3SWQ6dGhpcy52aWV3SWR9LHg9PT1ndC5UZXh0KTttPU90KG0sVCk7YnJlYWt9fXRoaXMubG9jYWxXb3JrLmZ1bGxMYXllcj10aGlzLmZ1bGxMYXllcix0aGlzLmxvY2FsV29yay5kcmF3TGF5ZXI9dm9pZCAwO2xldCBwO3MmJmkmJihwPXtyZXNpemVXaWR0aDpzLHJlc2l6ZUhlaWdodDppfSksdS5zaXplJiYoYXdhaXQgbmV3IFByb21pc2UoeT0+e3NldFRpbWVvdXQoeSw1MDApfSksdGhpcy53aWxsUmVuZGVyU3BlY2lhbExhYmVsKHUpKSxhd2FpdCB0aGlzLmdldFNuYXBzaG90UmVuZGVyKHtzY2VuZVBhdGg6ZSxjdXJDYW1lcmFPcHQ6YyxvcHRpb25zOnB9KX19d2lsbFJlbmRlclNwZWNpYWxMYWJlbCh0KXt2YXIgZTtmb3IoY29uc3RbbixhXW9mIHQuZW50cmllcygpKXtjb25zdCBzPShlPXRoaXMuc25hcHNob3RGdWxsTGF5ZXIpPT1udWxsP3ZvaWQgMDplLmdldEVsZW1lbnRzQnlOYW1lKG4pWzBdO3MmJmEub3B0JiZ0aGlzLmxvY2FsV29yay51cGRhdGVMYWJlbHMocyxhKX19YXN5bmMgZ2V0U25hcHNob3RSZW5kZXIodCl7dmFyIGksbztjb25zdHtzY2VuZVBhdGg6ZSxjdXJDYW1lcmFPcHQ6bixvcHRpb25zOmF9PXQ7KChpPXRoaXMuc25hcHNob3RGdWxsTGF5ZXIpPT1udWxsP3ZvaWQgMDppLnBhcmVudCkucmVuZGVyKCk7Y29uc3Qgcz1hd2FpdCB0aGlzLmdldFJlY3RJbWFnZUJpdG1hcCh7eDowLHk6MCx3OnRoaXMuc2NlbmUud2lkdGgsaDp0aGlzLnNjZW5lLmhlaWdodH0sITAsYSk7cyYmKGF3YWl0IHRoaXMucG9zdCh7c3A6W3t0eXBlOmx0LlNuYXBzaG90LHNjZW5lUGF0aDplLGltYWdlQml0bWFwOnN9XX0sW3NdKSxzLmNsb3NlKCksKG89dGhpcy5zbmFwc2hvdEZ1bGxMYXllcik9PW51bGx8fG8ucmVtb3ZlQWxsQ2hpbGRyZW4oKSx0aGlzLnNldENhbWVyYU9wdChuLHRoaXMuZnVsbExheWVyKSl9YXN5bmMgZ2V0Qm91bmRpbmdSZWN0KHQpe2NvbnN0e3NjZW5lUGF0aDplLHNjZW5lczpuLGNhbWVyYU9wdDphfT10O2lmKGUmJm4mJmEmJnRoaXMuc25hcHNob3RGdWxsTGF5ZXIpe2NvbnN0IHM9WnQodGhpcy5jYW1lcmFPcHQpO3RoaXMuc2V0Q2FtZXJhT3B0KGEsdGhpcy5zbmFwc2hvdEZ1bGxMYXllciksdGhpcy5sb2NhbFdvcmsuZnVsbExheWVyPXRoaXMuc25hcHNob3RGdWxsTGF5ZXIsdGhpcy5sb2NhbFdvcmsuZHJhd0xheWVyPXRoaXMuZHJhd0xheWVyO2xldCBpO2Zvcihjb25zdFtvLGNdb2YgT2JqZWN0LmVudHJpZXMobikpaWYoYyE9bnVsbCYmYy50eXBlKXN3aXRjaChjPT1udWxsP3ZvaWQgMDpjLnR5cGUpe2Nhc2UgbHQuVXBkYXRlTm9kZTpjYXNlIGx0LkZ1bGxXb3JrOntjb25zdCBtPWF3YWl0IHRoaXMubG9jYWxXb3JrLnJ1bkZ1bGxXb3JrKHsuLi5jLHdvcmtJZDpvLG1zZ1R5cGU6bHQuRnVsbFdvcmssZGF0YVR5cGU6VHQuU2VydmljZSx2aWV3SWQ6dGhpcy52aWV3SWR9KTtpPU90KGksbSk7YnJlYWt9fWkmJmF3YWl0IHRoaXMucG9zdCh7c3A6W3t0eXBlOmx0LkJvdW5kaW5nQm94LHNjZW5lUGF0aDplLHJlY3Q6aX1dfSksdGhpcy5sb2NhbFdvcmsuZnVsbExheWVyPXRoaXMuZnVsbExheWVyLHRoaXMubG9jYWxXb3JrLmRyYXdMYXllcj12b2lkIDAsdGhpcy5zbmFwc2hvdEZ1bGxMYXllci5yZW1vdmVBbGxDaGlsZHJlbigpLHRoaXMuc2V0Q2FtZXJhT3B0KHMsdGhpcy5mdWxsTGF5ZXIpfX19Y29uc3Qgb2c9c2VsZjtuZXcgbmcob2cscW4uRnVsbCl9KSgpOwo=",Mp=c=>Uint8Array.from(atob(c),l=>l.charCodeAt(0)),Bb=typeof window<"u"&&window.Blob&&new Blob([Mp(zZ)],{type:"text/javascript;charset=utf-8"});function gp(c){let l;try{if(l=Bb&&(window.URL||window.webkitURL).createObjectURL(Bb),!l)throw"";const d=new Worker(l,{name:c==null?void 0:c.name});return d.addEventListener("error",()=>{(window.URL||window.webkitURL).revokeObjectURL(l)}),d}catch{return new Worker("data:text/javascript;base64,"+zZ,{name:c==null?void 0:c.name})}finally{l&&(window.URL||window.webkitURL).revokeObjectURL(l)}}const HZ="dmFyIGFnPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgbGc9KGVlLFh0LGxlKT0+WHQgaW4gZWU/YWcoZWUsWHQse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmxlfSk6ZWVbWHRdPWxlO3ZhciBzdD0oZWUsWHQsbGUpPT4obGcoZWUsdHlwZW9mIFh0IT0ic3ltYm9sIj9YdCsiIjpYdCxsZSksbGUpOyhmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgZWU9dHlwZW9mIGdsb2JhbFRoaXM8InUiP2dsb2JhbFRoaXM6dHlwZW9mIHdpbmRvdzwidSI/d2luZG93OnR5cGVvZiBnbG9iYWw8InUiP2dsb2JhbDp0eXBlb2Ygc2VsZjwidSI/c2VsZjp7fTtmdW5jdGlvbiBYdChkKXtyZXR1cm4gZCYmZC5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZCwiZGVmYXVsdCIpP2QuZGVmYXVsdDpkfWZ1bmN0aW9uIGxlKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH12YXIgZWk9bGU7ZnVuY3Rpb24gcmkoZCxyKXtyZXR1cm4gZD09PXJ8fGQhPT1kJiZyIT09cn12YXIgUWU9cmksbmk9UWU7ZnVuY3Rpb24gaWkoZCxyKXtmb3IodmFyIHQ9ZC5sZW5ndGg7dC0tOylpZihuaShkW3RdWzBdLHIpKXJldHVybiB0O3JldHVybi0xfXZhciBiZT1paSxzaT1iZSxvaT1BcnJheS5wcm90b3R5cGUsYWk9b2kuc3BsaWNlO2Z1bmN0aW9uIGxpKGQpe3ZhciByPXRoaXMuX19kYXRhX18sdD1zaShyLGQpO2lmKHQ8MClyZXR1cm4hMTt2YXIgZT1yLmxlbmd0aC0xO3JldHVybiB0PT1lP3IucG9wKCk6YWkuY2FsbChyLHQsMSksLS10aGlzLnNpemUsITB9dmFyIGNpPWxpLGZpPWJlO2Z1bmN0aW9uIHVpKGQpe3ZhciByPXRoaXMuX19kYXRhX18sdD1maShyLGQpO3JldHVybiB0PDA/dm9pZCAwOnJbdF1bMV19dmFyIGhpPXVpLGRpPWJlO2Z1bmN0aW9uIGdpKGQpe3JldHVybiBkaSh0aGlzLl9fZGF0YV9fLGQpPi0xfXZhciBwaT1naSxtaT1iZTtmdW5jdGlvbiB2aShkLHIpe3ZhciB0PXRoaXMuX19kYXRhX18sZT1taSh0LGQpO3JldHVybiBlPDA/KCsrdGhpcy5zaXplLHQucHVzaChbZCxyXSkpOnRbZV1bMV09cix0aGlzfXZhciB5aT12aSxTaT1laSx4aT1jaSxUaT1oaSxNaT1waSxPaT15aTtmdW5jdGlvbiBwZShkKXt2YXIgcj0tMSx0PWQ9PW51bGw/MDpkLmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrcjx0Oyl7dmFyIGU9ZFtyXTt0aGlzLnNldChlWzBdLGVbMV0pfX1wZS5wcm90b3R5cGUuY2xlYXI9U2kscGUucHJvdG90eXBlLmRlbGV0ZT14aSxwZS5wcm90b3R5cGUuZ2V0PVRpLHBlLnByb3RvdHlwZS5oYXM9TWkscGUucHJvdG90eXBlLnNldD1PaTt2YXIgRGU9cGUsRWk9RGU7ZnVuY3Rpb24gUGkoKXt0aGlzLl9fZGF0YV9fPW5ldyBFaSx0aGlzLnNpemU9MH12YXIgQWk9UGk7ZnVuY3Rpb24gQ2koZCl7dmFyIHI9dGhpcy5fX2RhdGFfXyx0PXIuZGVsZXRlKGQpO3JldHVybiB0aGlzLnNpemU9ci5zaXplLHR9dmFyIFJpPUNpO2Z1bmN0aW9uIElpKGQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmdldChkKX12YXIgTGk9SWk7ZnVuY3Rpb24gYmkoZCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKGQpfXZhciBEaT1iaSx3aT10eXBlb2YgZWU9PSJvYmplY3QiJiZlZSYmZWUuT2JqZWN0PT09T2JqZWN0JiZlZSx4cj13aSxOaT14cixCaT10eXBlb2Ygc2VsZj09Im9iamVjdCImJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLFdpPU5pfHxCaXx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxRdD1XaSxGaT1RdCxqaT1GaS5TeW1ib2wsd2U9amksVHI9d2UsTXI9T2JqZWN0LnByb3RvdHlwZSxVaT1Nci5oYXNPd25Qcm9wZXJ0eSwkaT1Nci50b1N0cmluZyxBZT1Ucj9Uci50b1N0cmluZ1RhZzp2b2lkIDA7ZnVuY3Rpb24gemkoZCl7dmFyIHI9VWkuY2FsbChkLEFlKSx0PWRbQWVdO3RyeXtkW0FlXT12b2lkIDA7dmFyIGU9ITB9Y2F0Y2h7fXZhciBuPSRpLmNhbGwoZCk7cmV0dXJuIGUmJihyP2RbQWVdPXQ6ZGVsZXRlIGRbQWVdKSxufXZhciBHaT16aSxIaT1PYmplY3QucHJvdG90eXBlLEtpPUhpLnRvU3RyaW5nO2Z1bmN0aW9uIFZpKGQpe3JldHVybiBLaS5jYWxsKGQpfXZhciBZaT1WaSxPcj13ZSxYaT1HaSxaaT1ZaSxKaT0iW29iamVjdCBOdWxsXSIsUWk9IltvYmplY3QgVW5kZWZpbmVkXSIsRXI9T3I/T3IudG9TdHJpbmdUYWc6dm9pZCAwO2Z1bmN0aW9uIGtpKGQpe3JldHVybiBkPT1udWxsP2Q9PT12b2lkIDA/UWk6Smk6RXImJkVyIGluIE9iamVjdChkKT9YaShkKTpaaShkKX12YXIgY2U9a2k7ZnVuY3Rpb24gcWkoZCl7dmFyIHI9dHlwZW9mIGQ7cmV0dXJuIGQhPW51bGwmJihyPT0ib2JqZWN0Inx8cj09ImZ1bmN0aW9uIil9dmFyIHNlPXFpLF9pPWNlLHRzPXNlLGVzPSJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIixycz0iW29iamVjdCBGdW5jdGlvbl0iLG5zPSJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSIsaXM9IltvYmplY3QgUHJveHldIjtmdW5jdGlvbiBzcyhkKXtpZighdHMoZCkpcmV0dXJuITE7dmFyIHI9X2koZCk7cmV0dXJuIHI9PXJzfHxyPT1uc3x8cj09ZXN8fHI9PWlzfXZhciBQcj1zcyxvcz1RdCxhcz1vc1siX19jb3JlLWpzX3NoYXJlZF9fIl0sbHM9YXMsa2U9bHMsQXI9ZnVuY3Rpb24oKXt2YXIgZD0vW14uXSskLy5leGVjKGtlJiZrZS5rZXlzJiZrZS5rZXlzLklFX1BST1RPfHwiIik7cmV0dXJuIGQ/IlN5bWJvbChzcmMpXzEuIitkOiIifSgpO2Z1bmN0aW9uIGNzKGQpe3JldHVybiEhQXImJkFyIGluIGR9dmFyIGZzPWNzLHVzPUZ1bmN0aW9uLnByb3RvdHlwZSxocz11cy50b1N0cmluZztmdW5jdGlvbiBkcyhkKXtpZihkIT1udWxsKXt0cnl7cmV0dXJuIGhzLmNhbGwoZCl9Y2F0Y2h7fXRyeXtyZXR1cm4gZCsiIn1jYXRjaHt9fXJldHVybiIifXZhciBDcj1kcyxncz1Qcixwcz1mcyxtcz1zZSx2cz1Dcix5cz0vW1xcXiQuKis/KClbXF17fXxdL2csU3M9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8seHM9RnVuY3Rpb24ucHJvdG90eXBlLFRzPU9iamVjdC5wcm90b3R5cGUsTXM9eHMudG9TdHJpbmcsT3M9VHMuaGFzT3duUHJvcGVydHksRXM9UmVnRXhwKCJeIitNcy5jYWxsKE9zKS5yZXBsYWNlKHlzLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO2Z1bmN0aW9uIFBzKGQpe2lmKCFtcyhkKXx8cHMoZCkpcmV0dXJuITE7dmFyIHI9Z3MoZCk/RXM6U3M7cmV0dXJuIHIudGVzdCh2cyhkKSl9dmFyIEFzPVBzO2Z1bmN0aW9uIENzKGQscil7cmV0dXJuIGQ9PW51bGw/dm9pZCAwOmRbcl19dmFyIFJzPUNzLElzPUFzLExzPVJzO2Z1bmN0aW9uIGJzKGQscil7dmFyIHQ9THMoZCxyKTtyZXR1cm4gSXModCk/dDp2b2lkIDB9dmFyIGZlPWJzLERzPWZlLHdzPVF0LE5zPURzKHdzLCJNYXAiKSxxZT1OcyxCcz1mZSxXcz1CcyhPYmplY3QsImNyZWF0ZSIpLE5lPVdzLFJyPU5lO2Z1bmN0aW9uIEZzKCl7dGhpcy5fX2RhdGFfXz1Scj9ScihudWxsKTp7fSx0aGlzLnNpemU9MH12YXIganM9RnM7ZnVuY3Rpb24gVXMoZCl7dmFyIHI9dGhpcy5oYXMoZCkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW2RdO3JldHVybiB0aGlzLnNpemUtPXI/MTowLHJ9dmFyICRzPVVzLHpzPU5lLEdzPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIixIcz1PYmplY3QucHJvdG90eXBlLEtzPUhzLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIFZzKGQpe3ZhciByPXRoaXMuX19kYXRhX187aWYoenMpe3ZhciB0PXJbZF07cmV0dXJuIHQ9PT1Hcz92b2lkIDA6dH1yZXR1cm4gS3MuY2FsbChyLGQpP3JbZF06dm9pZCAwfXZhciBZcz1WcyxYcz1OZSxacz1PYmplY3QucHJvdG90eXBlLEpzPVpzLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIFFzKGQpe3ZhciByPXRoaXMuX19kYXRhX187cmV0dXJuIFhzP3JbZF0hPT12b2lkIDA6SnMuY2FsbChyLGQpfXZhciBrcz1Rcyxxcz1OZSxfcz0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI7ZnVuY3Rpb24gdG8oZCxyKXt2YXIgdD10aGlzLl9fZGF0YV9fO3JldHVybiB0aGlzLnNpemUrPXRoaXMuaGFzKGQpPzA6MSx0W2RdPXFzJiZyPT09dm9pZCAwP19zOnIsdGhpc312YXIgZW89dG8scm89anMsbm89JHMsaW89WXMsc289a3Msb289ZW87ZnVuY3Rpb24gbWUoZCl7dmFyIHI9LTEsdD1kPT1udWxsPzA6ZC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK3I8dDspe3ZhciBlPWRbcl07dGhpcy5zZXQoZVswXSxlWzFdKX19bWUucHJvdG90eXBlLmNsZWFyPXJvLG1lLnByb3RvdHlwZS5kZWxldGU9bm8sbWUucHJvdG90eXBlLmdldD1pbyxtZS5wcm90b3R5cGUuaGFzPXNvLG1lLnByb3RvdHlwZS5zZXQ9b287dmFyIGFvPW1lLElyPWFvLGxvPURlLGNvPXFlO2Z1bmN0aW9uIGZvKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgSXIsbWFwOm5ldyhjb3x8bG8pLHN0cmluZzpuZXcgSXJ9fXZhciB1bz1mbztmdW5jdGlvbiBobyhkKXt2YXIgcj10eXBlb2YgZDtyZXR1cm4gcj09InN0cmluZyJ8fHI9PSJudW1iZXIifHxyPT0ic3ltYm9sInx8cj09ImJvb2xlYW4iP2QhPT0iX19wcm90b19fIjpkPT09bnVsbH12YXIgZ289aG8scG89Z287ZnVuY3Rpb24gbW8oZCxyKXt2YXIgdD1kLl9fZGF0YV9fO3JldHVybiBwbyhyKT90W3R5cGVvZiByPT0ic3RyaW5nIj8ic3RyaW5nIjoiaGFzaCJdOnQubWFwfXZhciBCZT1tbyx2bz1CZTtmdW5jdGlvbiB5byhkKXt2YXIgcj12byh0aGlzLGQpLmRlbGV0ZShkKTtyZXR1cm4gdGhpcy5zaXplLT1yPzE6MCxyfXZhciBTbz15byx4bz1CZTtmdW5jdGlvbiBUbyhkKXtyZXR1cm4geG8odGhpcyxkKS5nZXQoZCl9dmFyIE1vPVRvLE9vPUJlO2Z1bmN0aW9uIEVvKGQpe3JldHVybiBPbyh0aGlzLGQpLmhhcyhkKX12YXIgUG89RW8sQW89QmU7ZnVuY3Rpb24gQ28oZCxyKXt2YXIgdD1Bbyh0aGlzLGQpLGU9dC5zaXplO3JldHVybiB0LnNldChkLHIpLHRoaXMuc2l6ZSs9dC5zaXplPT1lPzA6MSx0aGlzfXZhciBSbz1DbyxJbz11byxMbz1Tbyxibz1NbyxEbz1Qbyx3bz1SbztmdW5jdGlvbiB2ZShkKXt2YXIgcj0tMSx0PWQ9PW51bGw/MDpkLmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrcjx0Oyl7dmFyIGU9ZFtyXTt0aGlzLnNldChlWzBdLGVbMV0pfX12ZS5wcm90b3R5cGUuY2xlYXI9SW8sdmUucHJvdG90eXBlLmRlbGV0ZT1Mbyx2ZS5wcm90b3R5cGUuZ2V0PWJvLHZlLnByb3RvdHlwZS5oYXM9RG8sdmUucHJvdG90eXBlLnNldD13bzt2YXIgTHI9dmUsTm89RGUsQm89cWUsV289THIsRm89MjAwO2Z1bmN0aW9uIGpvKGQscil7dmFyIHQ9dGhpcy5fX2RhdGFfXztpZih0IGluc3RhbmNlb2YgTm8pe3ZhciBlPXQuX19kYXRhX187aWYoIUJvfHxlLmxlbmd0aDxGby0xKXJldHVybiBlLnB1c2goW2Qscl0pLHRoaXMuc2l6ZT0rK3Quc2l6ZSx0aGlzO3Q9dGhpcy5fX2RhdGFfXz1uZXcgV28oZSl9cmV0dXJuIHQuc2V0KGQsciksdGhpcy5zaXplPXQuc2l6ZSx0aGlzfXZhciBVbz1qbywkbz1EZSx6bz1BaSxHbz1SaSxIbz1MaSxLbz1EaSxWbz1VbztmdW5jdGlvbiB5ZShkKXt2YXIgcj10aGlzLl9fZGF0YV9fPW5ldyAkbyhkKTt0aGlzLnNpemU9ci5zaXplfXllLnByb3RvdHlwZS5jbGVhcj16byx5ZS5wcm90b3R5cGUuZGVsZXRlPUdvLHllLnByb3RvdHlwZS5nZXQ9SG8seWUucHJvdG90eXBlLmhhcz1Lbyx5ZS5wcm90b3R5cGUuc2V0PVZvO3ZhciBicj15ZTtmdW5jdGlvbiBZbyhkLHIpe2Zvcih2YXIgdD0tMSxlPWQ9PW51bGw/MDpkLmxlbmd0aDsrK3Q8ZSYmcihkW3RdLHQsZCkhPT0hMTspO3JldHVybiBkfXZhciBYbz1Zbyxabz1mZSxKbz1mdW5jdGlvbigpe3RyeXt2YXIgZD1abyhPYmplY3QsImRlZmluZVByb3BlcnR5Iik7cmV0dXJuIGQoe30sIiIse30pLGR9Y2F0Y2h7fX0oKSxRbz1KbyxEcj1RbztmdW5jdGlvbiBrbyhkLHIsdCl7cj09Il9fcHJvdG9fXyImJkRyP0RyKGQscix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6dCx3cml0YWJsZTohMH0pOmRbcl09dH12YXIgd3I9a28scW89d3IsX289UWUsdGE9T2JqZWN0LnByb3RvdHlwZSxlYT10YS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiByYShkLHIsdCl7dmFyIGU9ZFtyXTsoIShlYS5jYWxsKGQscikmJl9vKGUsdCkpfHx0PT09dm9pZCAwJiYhKHIgaW4gZCkpJiZxbyhkLHIsdCl9dmFyIE5yPXJhLG5hPU5yLGlhPXdyO2Z1bmN0aW9uIHNhKGQscix0LGUpe3ZhciBuPSF0O3R8fCh0PXt9KTtmb3IodmFyIGE9LTEscz1yLmxlbmd0aDsrK2E8czspe3ZhciBpPXJbYV0sbz1lP2UodFtpXSxkW2ldLGksdCxkKTp2b2lkIDA7bz09PXZvaWQgMCYmKG89ZFtpXSksbj9pYSh0LGksbyk6bmEodCxpLG8pfXJldHVybiB0fXZhciBXZT1zYTtmdW5jdGlvbiBvYShkLHIpe2Zvcih2YXIgdD0tMSxlPUFycmF5KGQpOysrdDxkOyllW3RdPXIodCk7cmV0dXJuIGV9dmFyIGFhPW9hO2Z1bmN0aW9uIGxhKGQpe3JldHVybiBkIT1udWxsJiZ0eXBlb2YgZD09Im9iamVjdCJ9dmFyIGllPWxhLGNhPWNlLGZhPWllLHVhPSJbb2JqZWN0IEFyZ3VtZW50c10iO2Z1bmN0aW9uIGhhKGQpe3JldHVybiBmYShkKSYmY2EoZCk9PXVhfXZhciBkYT1oYSxCcj1kYSxnYT1pZSxXcj1PYmplY3QucHJvdG90eXBlLHBhPVdyLmhhc093blByb3BlcnR5LG1hPVdyLnByb3BlcnR5SXNFbnVtZXJhYmxlLHZhPUJyKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk/QnI6ZnVuY3Rpb24oZCl7cmV0dXJuIGdhKGQpJiZwYS5jYWxsKGQsImNhbGxlZSIpJiYhbWEuY2FsbChkLCJjYWxsZWUiKX0seWE9dmEsU2E9QXJyYXkuaXNBcnJheSxGZT1TYSxqZT17ZXhwb3J0czp7fX07ZnVuY3Rpb24geGEoKXtyZXR1cm4hMX12YXIgVGE9eGE7amUuZXhwb3J0cyxmdW5jdGlvbihkLHIpe3ZhciB0PVF0LGU9VGEsbj1yJiYhci5ub2RlVHlwZSYmcixhPW4mJiEwJiZkJiYhZC5ub2RlVHlwZSYmZCxzPWEmJmEuZXhwb3J0cz09PW4saT1zP3QuQnVmZmVyOnZvaWQgMCxvPWk/aS5pc0J1ZmZlcjp2b2lkIDAsYz1vfHxlO2QuZXhwb3J0cz1jfShqZSxqZS5leHBvcnRzKTt2YXIgX2U9amUuZXhwb3J0cyxNYT05MDA3MTk5MjU0NzQwOTkxLE9hPS9eKD86MHxbMS05XVxkKikkLztmdW5jdGlvbiBFYShkLHIpe3ZhciB0PXR5cGVvZiBkO3JldHVybiByPXI/P01hLCEhciYmKHQ9PSJudW1iZXIifHx0IT0ic3ltYm9sIiYmT2EudGVzdChkKSkmJmQ+LTEmJmQlMT09MCYmZDxyfXZhciBQYT1FYSxBYT05MDA3MTk5MjU0NzQwOTkxO2Z1bmN0aW9uIENhKGQpe3JldHVybiB0eXBlb2YgZD09Im51bWJlciImJmQ+LTEmJmQlMT09MCYmZDw9QWF9dmFyIEZyPUNhLFJhPWNlLElhPUZyLExhPWllLGJhPSJbb2JqZWN0IEFyZ3VtZW50c10iLERhPSJbb2JqZWN0IEFycmF5XSIsd2E9IltvYmplY3QgQm9vbGVhbl0iLE5hPSJbb2JqZWN0IERhdGVdIixCYT0iW29iamVjdCBFcnJvcl0iLFdhPSJbb2JqZWN0IEZ1bmN0aW9uXSIsRmE9IltvYmplY3QgTWFwXSIsamE9IltvYmplY3QgTnVtYmVyXSIsVWE9IltvYmplY3QgT2JqZWN0XSIsJGE9IltvYmplY3QgUmVnRXhwXSIsemE9IltvYmplY3QgU2V0XSIsR2E9IltvYmplY3QgU3RyaW5nXSIsSGE9IltvYmplY3QgV2Vha01hcF0iLEthPSJbb2JqZWN0IEFycmF5QnVmZmVyXSIsVmE9IltvYmplY3QgRGF0YVZpZXddIixZYT0iW29iamVjdCBGbG9hdDMyQXJyYXldIixYYT0iW29iamVjdCBGbG9hdDY0QXJyYXldIixaYT0iW29iamVjdCBJbnQ4QXJyYXldIixKYT0iW29iamVjdCBJbnQxNkFycmF5XSIsUWE9IltvYmplY3QgSW50MzJBcnJheV0iLGthPSJbb2JqZWN0IFVpbnQ4QXJyYXldIixxYT0iW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLF9hPSJbb2JqZWN0IFVpbnQxNkFycmF5XSIsdGw9IltvYmplY3QgVWludDMyQXJyYXldIixXdD17fTtXdFtZYV09V3RbWGFdPVd0W1phXT1XdFtKYV09V3RbUWFdPVd0W2thXT1XdFtxYV09V3RbX2FdPVd0W3RsXT0hMCxXdFtiYV09V3RbRGFdPVd0W0thXT1XdFt3YV09V3RbVmFdPVd0W05hXT1XdFtCYV09V3RbV2FdPVd0W0ZhXT1XdFtqYV09V3RbVWFdPVd0WyRhXT1XdFt6YV09V3RbR2FdPVd0W0hhXT0hMTtmdW5jdGlvbiBlbChkKXtyZXR1cm4gTGEoZCkmJklhKGQubGVuZ3RoKSYmISFXdFtSYShkKV19dmFyIHJsPWVsO2Z1bmN0aW9uIG5sKGQpe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gZChyKX19dmFyIHRyPW5sLFVlPXtleHBvcnRzOnt9fTtVZS5leHBvcnRzLGZ1bmN0aW9uKGQscil7dmFyIHQ9eHIsZT1yJiYhci5ub2RlVHlwZSYmcixuPWUmJiEwJiZkJiYhZC5ub2RlVHlwZSYmZCxhPW4mJm4uZXhwb3J0cz09PWUscz1hJiZ0LnByb2Nlc3MsaT1mdW5jdGlvbigpe3RyeXt2YXIgbz1uJiZuLnJlcXVpcmUmJm4ucmVxdWlyZSgidXRpbCIpLnR5cGVzO3JldHVybiBvfHxzJiZzLmJpbmRpbmcmJnMuYmluZGluZygidXRpbCIpfWNhdGNoe319KCk7ZC5leHBvcnRzPWl9KFVlLFVlLmV4cG9ydHMpO3ZhciBlcj1VZS5leHBvcnRzLGlsPXJsLHNsPXRyLGpyPWVyLFVyPWpyJiZqci5pc1R5cGVkQXJyYXksb2w9VXI/c2woVXIpOmlsLCRyPW9sLGFsPWFhLGxsPXlhLGNsPUZlLGZsPV9lLHVsPVBhLGhsPSRyLGRsPU9iamVjdC5wcm90b3R5cGUsZ2w9ZGwuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gcGwoZCxyKXt2YXIgdD1jbChkKSxlPSF0JiZsbChkKSxuPSF0JiYhZSYmZmwoZCksYT0hdCYmIWUmJiFuJiZobChkKSxzPXR8fGV8fG58fGEsaT1zP2FsKGQubGVuZ3RoLFN0cmluZyk6W10sbz1pLmxlbmd0aDtmb3IodmFyIGMgaW4gZCkocnx8Z2wuY2FsbChkLGMpKSYmIShzJiYoYz09Imxlbmd0aCJ8fG4mJihjPT0ib2Zmc2V0Inx8Yz09InBhcmVudCIpfHxhJiYoYz09ImJ1ZmZlciJ8fGM9PSJieXRlTGVuZ3RoInx8Yz09ImJ5dGVPZmZzZXQiKXx8dWwoYyxvKSkpJiZpLnB1c2goYyk7cmV0dXJuIGl9dmFyIHpyPXBsLG1sPU9iamVjdC5wcm90b3R5cGU7ZnVuY3Rpb24gdmwoZCl7dmFyIHI9ZCYmZC5jb25zdHJ1Y3Rvcix0PXR5cGVvZiByPT0iZnVuY3Rpb24iJiZyLnByb3RvdHlwZXx8bWw7cmV0dXJuIGQ9PT10fXZhciBycj12bDtmdW5jdGlvbiB5bChkLHIpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZChyKHQpKX19dmFyIEdyPXlsLFNsPUdyLHhsPVNsKE9iamVjdC5rZXlzLE9iamVjdCksVGw9eGwsTWw9cnIsT2w9VGwsRWw9T2JqZWN0LnByb3RvdHlwZSxQbD1FbC5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBBbChkKXtpZighTWwoZCkpcmV0dXJuIE9sKGQpO3ZhciByPVtdO2Zvcih2YXIgdCBpbiBPYmplY3QoZCkpUGwuY2FsbChkLHQpJiZ0IT0iY29uc3RydWN0b3IiJiZyLnB1c2godCk7cmV0dXJuIHJ9dmFyIENsPUFsLFJsPVByLElsPUZyO2Z1bmN0aW9uIExsKGQpe3JldHVybiBkIT1udWxsJiZJbChkLmxlbmd0aCkmJiFSbChkKX12YXIgSHI9TGwsYmw9enIsRGw9Q2wsd2w9SHI7ZnVuY3Rpb24gTmwoZCl7cmV0dXJuIHdsKGQpP2JsKGQpOkRsKGQpfXZhciBucj1ObCxCbD1XZSxXbD1ucjtmdW5jdGlvbiBGbChkLHIpe3JldHVybiBkJiZCbChyLFdsKHIpLGQpfXZhciBqbD1GbDtmdW5jdGlvbiBVbChkKXt2YXIgcj1bXTtpZihkIT1udWxsKWZvcih2YXIgdCBpbiBPYmplY3QoZCkpci5wdXNoKHQpO3JldHVybiByfXZhciAkbD1VbCx6bD1zZSxHbD1ycixIbD0kbCxLbD1PYmplY3QucHJvdG90eXBlLFZsPUtsLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIFlsKGQpe2lmKCF6bChkKSlyZXR1cm4gSGwoZCk7dmFyIHI9R2woZCksdD1bXTtmb3IodmFyIGUgaW4gZCllPT0iY29uc3RydWN0b3IiJiYocnx8IVZsLmNhbGwoZCxlKSl8fHQucHVzaChlKTtyZXR1cm4gdH12YXIgWGw9WWwsWmw9enIsSmw9WGwsUWw9SHI7ZnVuY3Rpb24ga2woZCl7cmV0dXJuIFFsKGQpP1psKGQsITApOkpsKGQpfXZhciBpcj1rbCxxbD1XZSxfbD1pcjtmdW5jdGlvbiB0YyhkLHIpe3JldHVybiBkJiZxbChyLF9sKHIpLGQpfXZhciBlYz10YywkZT17ZXhwb3J0czp7fX07JGUuZXhwb3J0cyxmdW5jdGlvbihkLHIpe3ZhciB0PVF0LGU9ciYmIXIubm9kZVR5cGUmJnIsbj1lJiYhMCYmZCYmIWQubm9kZVR5cGUmJmQsYT1uJiZuLmV4cG9ydHM9PT1lLHM9YT90LkJ1ZmZlcjp2b2lkIDAsaT1zP3MuYWxsb2NVbnNhZmU6dm9pZCAwO2Z1bmN0aW9uIG8oYyxtKXtpZihtKXJldHVybiBjLnNsaWNlKCk7dmFyIHU9Yy5sZW5ndGgscD1pP2kodSk6bmV3IGMuY29uc3RydWN0b3IodSk7cmV0dXJuIGMuY29weShwKSxwfWQuZXhwb3J0cz1vfSgkZSwkZS5leHBvcnRzKTt2YXIgcmM9JGUuZXhwb3J0cztmdW5jdGlvbiBuYyhkLHIpe3ZhciB0PS0xLGU9ZC5sZW5ndGg7Zm9yKHJ8fChyPUFycmF5KGUpKTsrK3Q8ZTspclt0XT1kW3RdO3JldHVybiByfXZhciBpYz1uYztmdW5jdGlvbiBzYyhkLHIpe2Zvcih2YXIgdD0tMSxlPWQ9PW51bGw/MDpkLmxlbmd0aCxuPTAsYT1bXTsrK3Q8ZTspe3ZhciBzPWRbdF07cihzLHQsZCkmJihhW24rK109cyl9cmV0dXJuIGF9dmFyIG9jPXNjO2Z1bmN0aW9uIGFjKCl7cmV0dXJuW119dmFyIEtyPWFjLGxjPW9jLGNjPUtyLGZjPU9iamVjdC5wcm90b3R5cGUsdWM9ZmMucHJvcGVydHlJc0VudW1lcmFibGUsVnI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxoYz1Wcj9mdW5jdGlvbihkKXtyZXR1cm4gZD09bnVsbD9bXTooZD1PYmplY3QoZCksbGMoVnIoZCksZnVuY3Rpb24ocil7cmV0dXJuIHVjLmNhbGwoZCxyKX0pKX06Y2Msc3I9aGMsZGM9V2UsZ2M9c3I7ZnVuY3Rpb24gcGMoZCxyKXtyZXR1cm4gZGMoZCxnYyhkKSxyKX12YXIgbWM9cGM7ZnVuY3Rpb24gdmMoZCxyKXtmb3IodmFyIHQ9LTEsZT1yLmxlbmd0aCxuPWQubGVuZ3RoOysrdDxlOylkW24rdF09clt0XTtyZXR1cm4gZH12YXIgWXI9dmMseWM9R3IsU2M9eWMoT2JqZWN0LmdldFByb3RvdHlwZU9mLE9iamVjdCksWHI9U2MseGM9WXIsVGM9WHIsTWM9c3IsT2M9S3IsRWM9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxQYz1FYz9mdW5jdGlvbihkKXtmb3IodmFyIHI9W107ZDspeGMocixNYyhkKSksZD1UYyhkKTtyZXR1cm4gcn06T2MsWnI9UGMsQWM9V2UsQ2M9WnI7ZnVuY3Rpb24gUmMoZCxyKXtyZXR1cm4gQWMoZCxDYyhkKSxyKX12YXIgSWM9UmMsTGM9WXIsYmM9RmU7ZnVuY3Rpb24gRGMoZCxyLHQpe3ZhciBlPXIoZCk7cmV0dXJuIGJjKGQpP2U6TGMoZSx0KGQpKX12YXIgSnI9RGMsd2M9SnIsTmM9c3IsQmM9bnI7ZnVuY3Rpb24gV2MoZCl7cmV0dXJuIHdjKGQsQmMsTmMpfXZhciBRcj1XYyxGYz1KcixqYz1acixVYz1pcjtmdW5jdGlvbiAkYyhkKXtyZXR1cm4gRmMoZCxVYyxqYyl9dmFyIHpjPSRjLEdjPWZlLEhjPVF0LEtjPUdjKEhjLCJEYXRhVmlldyIpLFZjPUtjLFljPWZlLFhjPVF0LFpjPVljKFhjLCJQcm9taXNlIiksSmM9WmMsUWM9ZmUsa2M9UXQscWM9UWMoa2MsIlNldCIpLF9jPXFjLHRmPWZlLGVmPVF0LHJmPXRmKGVmLCJXZWFrTWFwIiksbmY9cmYsb3I9VmMsYXI9cWUsbHI9SmMsY3I9X2MsZnI9bmYsa3I9Y2UsU2U9Q3IscXI9IltvYmplY3QgTWFwXSIsc2Y9IltvYmplY3QgT2JqZWN0XSIsX3I9IltvYmplY3QgUHJvbWlzZV0iLHRuPSJbb2JqZWN0IFNldF0iLGVuPSJbb2JqZWN0IFdlYWtNYXBdIixybj0iW29iamVjdCBEYXRhVmlld10iLG9mPVNlKG9yKSxhZj1TZShhciksbGY9U2UobHIpLGNmPVNlKGNyKSxmZj1TZShmciksdWU9a3I7KG9yJiZ1ZShuZXcgb3IobmV3IEFycmF5QnVmZmVyKDEpKSkhPXJufHxhciYmdWUobmV3IGFyKSE9cXJ8fGxyJiZ1ZShsci5yZXNvbHZlKCkpIT1fcnx8Y3ImJnVlKG5ldyBjcikhPXRufHxmciYmdWUobmV3IGZyKSE9ZW4pJiYodWU9ZnVuY3Rpb24oZCl7dmFyIHI9a3IoZCksdD1yPT1zZj9kLmNvbnN0cnVjdG9yOnZvaWQgMCxlPXQ/U2UodCk6IiI7aWYoZSlzd2l0Y2goZSl7Y2FzZSBvZjpyZXR1cm4gcm47Y2FzZSBhZjpyZXR1cm4gcXI7Y2FzZSBsZjpyZXR1cm4gX3I7Y2FzZSBjZjpyZXR1cm4gdG47Y2FzZSBmZjpyZXR1cm4gZW59cmV0dXJuIHJ9KTt2YXIgemU9dWUsdWY9T2JqZWN0LnByb3RvdHlwZSxoZj11Zi5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBkZihkKXt2YXIgcj1kLmxlbmd0aCx0PW5ldyBkLmNvbnN0cnVjdG9yKHIpO3JldHVybiByJiZ0eXBlb2YgZFswXT09InN0cmluZyImJmhmLmNhbGwoZCwiaW5kZXgiKSYmKHQuaW5kZXg9ZC5pbmRleCx0LmlucHV0PWQuaW5wdXQpLHR9dmFyIGdmPWRmLHBmPVF0LG1mPXBmLlVpbnQ4QXJyYXksbm49bWYsc249bm47ZnVuY3Rpb24gdmYoZCl7dmFyIHI9bmV3IGQuY29uc3RydWN0b3IoZC5ieXRlTGVuZ3RoKTtyZXR1cm4gbmV3IHNuKHIpLnNldChuZXcgc24oZCkpLHJ9dmFyIHVyPXZmLHlmPXVyO2Z1bmN0aW9uIFNmKGQscil7dmFyIHQ9cj95ZihkLmJ1ZmZlcik6ZC5idWZmZXI7cmV0dXJuIG5ldyBkLmNvbnN0cnVjdG9yKHQsZC5ieXRlT2Zmc2V0LGQuYnl0ZUxlbmd0aCl9dmFyIHhmPVNmLFRmPS9cdyokLztmdW5jdGlvbiBNZihkKXt2YXIgcj1uZXcgZC5jb25zdHJ1Y3RvcihkLnNvdXJjZSxUZi5leGVjKGQpKTtyZXR1cm4gci5sYXN0SW5kZXg9ZC5sYXN0SW5kZXgscn12YXIgT2Y9TWYsb249d2UsYW49b24/b24ucHJvdG90eXBlOnZvaWQgMCxsbj1hbj9hbi52YWx1ZU9mOnZvaWQgMDtmdW5jdGlvbiBFZihkKXtyZXR1cm4gbG4/T2JqZWN0KGxuLmNhbGwoZCkpOnt9fXZhciBQZj1FZixBZj11cjtmdW5jdGlvbiBDZihkLHIpe3ZhciB0PXI/QWYoZC5idWZmZXIpOmQuYnVmZmVyO3JldHVybiBuZXcgZC5jb25zdHJ1Y3Rvcih0LGQuYnl0ZU9mZnNldCxkLmxlbmd0aCl9dmFyIFJmPUNmLElmPXVyLExmPXhmLGJmPU9mLERmPVBmLHdmPVJmLE5mPSJbb2JqZWN0IEJvb2xlYW5dIixCZj0iW29iamVjdCBEYXRlXSIsV2Y9IltvYmplY3QgTWFwXSIsRmY9IltvYmplY3QgTnVtYmVyXSIsamY9IltvYmplY3QgUmVnRXhwXSIsVWY9IltvYmplY3QgU2V0XSIsJGY9IltvYmplY3QgU3RyaW5nXSIsemY9IltvYmplY3QgU3ltYm9sXSIsR2Y9IltvYmplY3QgQXJyYXlCdWZmZXJdIixIZj0iW29iamVjdCBEYXRhVmlld10iLEtmPSJbb2JqZWN0IEZsb2F0MzJBcnJheV0iLFZmPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLFlmPSJbb2JqZWN0IEludDhBcnJheV0iLFhmPSJbb2JqZWN0IEludDE2QXJyYXldIixaZj0iW29iamVjdCBJbnQzMkFycmF5XSIsSmY9IltvYmplY3QgVWludDhBcnJheV0iLFFmPSJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSIsa2Y9IltvYmplY3QgVWludDE2QXJyYXldIixxZj0iW29iamVjdCBVaW50MzJBcnJheV0iO2Z1bmN0aW9uIF9mKGQscix0KXt2YXIgZT1kLmNvbnN0cnVjdG9yO3N3aXRjaChyKXtjYXNlIEdmOnJldHVybiBJZihkKTtjYXNlIE5mOmNhc2UgQmY6cmV0dXJuIG5ldyBlKCtkKTtjYXNlIEhmOnJldHVybiBMZihkLHQpO2Nhc2UgS2Y6Y2FzZSBWZjpjYXNlIFlmOmNhc2UgWGY6Y2FzZSBaZjpjYXNlIEpmOmNhc2UgUWY6Y2FzZSBrZjpjYXNlIHFmOnJldHVybiB3ZihkLHQpO2Nhc2UgV2Y6cmV0dXJuIG5ldyBlO2Nhc2UgRmY6Y2FzZSAkZjpyZXR1cm4gbmV3IGUoZCk7Y2FzZSBqZjpyZXR1cm4gYmYoZCk7Y2FzZSBVZjpyZXR1cm4gbmV3IGU7Y2FzZSB6ZjpyZXR1cm4gRGYoZCl9fXZhciB0dT1fZixldT1zZSxjbj1PYmplY3QuY3JlYXRlLHJ1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZCgpe31yZXR1cm4gZnVuY3Rpb24ocil7aWYoIWV1KHIpKXJldHVybnt9O2lmKGNuKXJldHVybiBjbihyKTtkLnByb3RvdHlwZT1yO3ZhciB0PW5ldyBkO3JldHVybiBkLnByb3RvdHlwZT12b2lkIDAsdH19KCksbnU9cnUsaXU9bnUsc3U9WHIsb3U9cnI7ZnVuY3Rpb24gYXUoZCl7cmV0dXJuIHR5cGVvZiBkLmNvbnN0cnVjdG9yPT0iZnVuY3Rpb24iJiYhb3UoZCk/aXUoc3UoZCkpOnt9fXZhciBsdT1hdSxjdT16ZSxmdT1pZSx1dT0iW29iamVjdCBNYXBdIjtmdW5jdGlvbiBodShkKXtyZXR1cm4gZnUoZCkmJmN1KGQpPT11dX12YXIgZHU9aHUsZ3U9ZHUscHU9dHIsZm49ZXIsdW49Zm4mJmZuLmlzTWFwLG11PXVuP3B1KHVuKTpndSx2dT1tdSx5dT16ZSxTdT1pZSx4dT0iW29iamVjdCBTZXRdIjtmdW5jdGlvbiBUdShkKXtyZXR1cm4gU3UoZCkmJnl1KGQpPT14dX12YXIgTXU9VHUsT3U9TXUsRXU9dHIsaG49ZXIsZG49aG4mJmhuLmlzU2V0LFB1PWRuP0V1KGRuKTpPdSxBdT1QdSxDdT1icixSdT1YbyxJdT1OcixMdT1qbCxidT1lYyxEdT1yYyx3dT1pYyxOdT1tYyxCdT1JYyxXdT1RcixGdT16YyxqdT16ZSxVdT1nZiwkdT10dSx6dT1sdSxHdT1GZSxIdT1fZSxLdT12dSxWdT1zZSxZdT1BdSxYdT1ucixadT1pcixKdT0xLFF1PTIsa3U9NCxnbj0iW29iamVjdCBBcmd1bWVudHNdIixxdT0iW29iamVjdCBBcnJheV0iLF91PSJbb2JqZWN0IEJvb2xlYW5dIix0aD0iW29iamVjdCBEYXRlXSIsZWg9IltvYmplY3QgRXJyb3JdIixwbj0iW29iamVjdCBGdW5jdGlvbl0iLHJoPSJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSIsbmg9IltvYmplY3QgTWFwXSIsaWg9IltvYmplY3QgTnVtYmVyXSIsbW49IltvYmplY3QgT2JqZWN0XSIsc2g9IltvYmplY3QgUmVnRXhwXSIsb2g9IltvYmplY3QgU2V0XSIsYWg9IltvYmplY3QgU3RyaW5nXSIsbGg9IltvYmplY3QgU3ltYm9sXSIsY2g9IltvYmplY3QgV2Vha01hcF0iLGZoPSJbb2JqZWN0IEFycmF5QnVmZmVyXSIsdWg9IltvYmplY3QgRGF0YVZpZXddIixoaD0iW29iamVjdCBGbG9hdDMyQXJyYXldIixkaD0iW29iamVjdCBGbG9hdDY0QXJyYXldIixnaD0iW29iamVjdCBJbnQ4QXJyYXldIixwaD0iW29iamVjdCBJbnQxNkFycmF5XSIsbWg9IltvYmplY3QgSW50MzJBcnJheV0iLHZoPSJbb2JqZWN0IFVpbnQ4QXJyYXldIix5aD0iW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLFNoPSJbb2JqZWN0IFVpbnQxNkFycmF5XSIseGg9IltvYmplY3QgVWludDMyQXJyYXldIixOdD17fTtOdFtnbl09TnRbcXVdPU50W2ZoXT1OdFt1aF09TnRbX3VdPU50W3RoXT1OdFtoaF09TnRbZGhdPU50W2doXT1OdFtwaF09TnRbbWhdPU50W25oXT1OdFtpaF09TnRbbW5dPU50W3NoXT1OdFtvaF09TnRbYWhdPU50W2xoXT1OdFt2aF09TnRbeWhdPU50W1NoXT1OdFt4aF09ITAsTnRbZWhdPU50W3BuXT1OdFtjaF09ITE7ZnVuY3Rpb24gR2UoZCxyLHQsZSxuLGEpe3ZhciBzLGk9ciZKdSxvPXImUXUsYz1yJmt1O2lmKHQmJihzPW4/dChkLGUsbixhKTp0KGQpKSxzIT09dm9pZCAwKXJldHVybiBzO2lmKCFWdShkKSlyZXR1cm4gZDt2YXIgbT1HdShkKTtpZihtKXtpZihzPVV1KGQpLCFpKXJldHVybiB3dShkLHMpfWVsc2V7dmFyIHU9anUoZCkscD11PT1wbnx8dT09cmg7aWYoSHUoZCkpcmV0dXJuIER1KGQsaSk7aWYodT09bW58fHU9PWdufHxwJiYhbil7aWYocz1vfHxwP3t9Onp1KGQpLCFpKXJldHVybiBvP0J1KGQsYnUocyxkKSk6TnUoZCxMdShzLGQpKX1lbHNle2lmKCFOdFt1XSlyZXR1cm4gbj9kOnt9O3M9JHUoZCx1LGkpfX1hfHwoYT1uZXcgQ3UpO3ZhciB5PWEuZ2V0KGQpO2lmKHkpcmV0dXJuIHk7YS5zZXQoZCxzKSxZdShkKT9kLmZvckVhY2goZnVuY3Rpb24odil7cy5hZGQoR2UodixyLHQsdixkLGEpKX0pOkt1KGQpJiZkLmZvckVhY2goZnVuY3Rpb24odixUKXtzLnNldChULEdlKHYscix0LFQsZCxhKSl9KTt2YXIgTz1jP28/RnU6V3U6bz9adTpYdSx4PW0/dm9pZCAwOk8oZCk7cmV0dXJuIFJ1KHh8fGQsZnVuY3Rpb24odixUKXt4JiYoVD12LHY9ZFtUXSksSXUocyxULEdlKHYscix0LFQsZCxhKSl9KSxzfXZhciBUaD1HZSxNaD1UaCxPaD0xLEVoPTQ7ZnVuY3Rpb24gUGgoZCl7cmV0dXJuIE1oKGQsT2h8RWgpfXZhciBBaD1QaCxadD1YdChBaCksS3Q9KGQ9PihkLk5vcm1hbD0iTm9ybWFsIixkLlN0cm9rZT0iU3Ryb2tlIixkLkRvdHRlZD0iRG90dGVkIixkLkxvbmdEb3R0ZWQ9IkxvbmdEb3R0ZWQiLGQpKShLdHx8e30pLEx0PShkPT4oZC5Ob25lPSJOb25lIixkLlNob3dGbG9hdEJhcj0iU2hvd0Zsb2F0QmFyIixkLlpJbmRleEZsb2F0QmFyPSJaSW5kZXhGbG9hdEJhciIsZC5EZWxldGVOb2RlPSJEZWxldGVOb2RlIixkLkNvcHlOb2RlPSJDb3B5Tm9kZSIsZC5aSW5kZXhBY3RpdmU9IlpJbmRleEFjdGl2ZSIsZC5aSW5kZXhOb2RlPSJaSW5kZXhOb2RlIixkLlJvdGF0ZU5vZGU9IlJvdGF0ZU5vZGUiLGQuU2V0Q29sb3JOb2RlPSJTZXRDb2xvck5vZGUiLGQuVHJhbnNsYXRlTm9kZT0iVHJhbnNsYXRlTm9kZSIsZC5TY2FsZU5vZGU9IlNjYWxlTm9kZSIsZC5PcmlnaW5hbEV2ZW50PSJPcmlnaW5hbEV2ZW50IixkLkNyZWF0ZVNjZW5lPSJDcmVhdGVTY2VuZSIsZC5BY3RpdmVDdXJzb3I9IkFjdGl2ZUN1cnNvciIsZC5Nb3ZlQ3Vyc29yPSJNb3ZlQ3Vyc29yIixkLkNvbW1hbmRFZGl0b3I9IkNvbW1hbmRFZGl0b3IiLGQuU2V0RWRpdG9yRGF0YT0iU2V0RWRpdG9yRGF0YSIsZC5TZXRGb250U3R5bGU9IlNldEZvbnRTdHlsZSIsZC5TZXRQb2ludD0iU2V0UG9pbnQiLGQuU2V0TG9jaz0iU2V0TG9jayIsZC5TZXRTaGFwZU9wdD0iU2V0U2hhcGVPcHQiLGQpKShMdHx8e30pLGd0PShkPT4oZFtkLlBlbmNpbD0xXT0iUGVuY2lsIixkW2QuRXJhc2VyPTJdPSJFcmFzZXIiLGRbZC5TZWxlY3Rvcj0zXT0iU2VsZWN0b3IiLGRbZC5DbGlja2VyPTRdPSJDbGlja2VyIixkW2QuQXJyb3c9NV09IkFycm93IixkW2QuSGFuZD02XT0iSGFuZCIsZFtkLkxhc2VyUGVuPTddPSJMYXNlclBlbiIsZFtkLlRleHQ9OF09IlRleHQiLGRbZC5TdHJhaWdodD05XT0iU3RyYWlnaHQiLGRbZC5SZWN0YW5nbGU9MTBdPSJSZWN0YW5nbGUiLGRbZC5FbGxpcHNlPTExXT0iRWxsaXBzZSIsZFtkLlN0YXI9MTJdPSJTdGFyIixkW2QuVHJpYW5nbGU9MTNdPSJUcmlhbmdsZSIsZFtkLlJob21idXM9MTRdPSJSaG9tYnVzIixkW2QuUG9seWdvbj0xNV09IlBvbHlnb24iLGRbZC5TcGVlY2hCYWxsb29uPTE2XT0iU3BlZWNoQmFsbG9vbiIsZFtkLkltYWdlPTE3XT0iSW1hZ2UiLGQpKShndHx8e30pLFR0PShkPT4oZFtkLkxvY2FsPTFdPSJMb2NhbCIsZFtkLlNlcnZpY2U9Ml09IlNlcnZpY2UiLGRbZC5Xb3JrZXI9M109IldvcmtlciIsZCkpKFR0fHx7fSksSXQ9KGQ9PihkW2QuUGVuZGluZz0wXT0iUGVuZGluZyIsZFtkLlN0YXJ0PTFdPSJTdGFydCIsZFtkLkRvaW5nPTJdPSJEb2luZyIsZFtkLkRvbmU9M109IkRvbmUiLGRbZC5GcmVlemU9NF09IkZyZWV6ZSIsZFtkLlVud3JpdGFibGU9NV09IlVud3JpdGFibGUiLGQpKShJdHx8e30pLGx0PShkPT4oZFtkLk5vbmU9MF09Ik5vbmUiLGRbZC5Jbml0PTFdPSJJbml0IixkW2QuVXBkYXRlQ2FtZXJhPTJdPSJVcGRhdGVDYW1lcmEiLGRbZC5VcGRhdGVUb29scz0zXT0iVXBkYXRlVG9vbHMiLGRbZC5DcmVhdGVXb3JrPTRdPSJDcmVhdGVXb3JrIixkW2QuRHJhd1dvcms9NV09IkRyYXdXb3JrIixkW2QuRnVsbFdvcms9Nl09IkZ1bGxXb3JrIixkW2QuVXBkYXRlTm9kZT03XT0iVXBkYXRlTm9kZSIsZFtkLlJlbW92ZU5vZGU9OF09IlJlbW92ZU5vZGUiLGRbZC5DbGVhcj05XT0iQ2xlYXIiLGRbZC5TZWxlY3Q9MTBdPSJTZWxlY3QiLGRbZC5EZXN0cm95PTExXT0iRGVzdHJveSIsZFtkLlNuYXBzaG90PTEyXT0iU25hcHNob3QiLGRbZC5Cb3VuZGluZ0JveD0xM109IkJvdW5kaW5nQm94IixkW2QuQ3Vyc29yPTE0XT0iQ3Vyc29yIixkW2QuVGV4dFVwZGF0ZT0xNV09IlRleHRVcGRhdGUiLGRbZC5HZXRUZXh0QWN0aXZlPTE2XT0iR2V0VGV4dEFjdGl2ZSIsZFtkLlRhc2tzUXVldWU9MTddPSJUYXNrc1F1ZXVlIixkW2QuQ3Vyc29ySG92ZXI9MThdPSJDdXJzb3JIb3ZlciIsZCkpKGx0fHx7fSksU3Q9KGQ9PihkW2QuRmxvYXQ9MV09IkZsb2F0IixkW2QuQmc9Ml09IkJnIixkW2QuU2VsZWN0b3I9M109IlNlbGVjdG9yIixkW2QuU2VydmljZUZsb2F0PTRdPSJTZXJ2aWNlRmxvYXQiLGRbZC5Ob25lPTVdPSJOb25lIixkKSkoU3R8fHt9KSxGdD0oZD0+KGRbZC5ub25lPTFdPSJub25lIixkW2QuYWxsPTJdPSJhbGwiLGRbZC5ib3RoPTNdPSJib3RoIixkW2QucHJvcG9ydGlvbmFsPTRdPSJwcm9wb3J0aW9uYWwiLGQpKShGdHx8e30pO2NsYXNzIEp0e2NvbnN0cnVjdG9yKCl7c3QodGhpcywibG9jYWxXb3JrIik7c3QodGhpcywic2VydmljZVdvcmsiKTtzdCh0aGlzLCJzY2VuZSIpfXJlZ2lzdGVyRm9yV29ya2VyKHIsdCxlKXtyZXR1cm4gdGhpcy5sb2NhbFdvcms9cix0aGlzLnNlcnZpY2VXb3JrPXQsdGhpcy5zY2VuZT1lLHRoaXN9fWNvbnN0IENoPXtsaW5lYXI6ZD0+ZCxlYXNlSW5RdWFkOmQ9PmQqZCxlYXNlT3V0UXVhZDpkPT5kKigyLWQpLGVhc2VJbk91dFF1YWQ6ZD0+ZDwuNT8yKmQqZDotMSsoNC0yKmQpKmQsZWFzZUluQ3ViaWM6ZD0+ZCpkKmQsZWFzZU91dEN1YmljOmQ9Pi0tZCpkKmQrMSxlYXNlSW5PdXRDdWJpYzpkPT5kPC41PzQqZCpkKmQ6KGQtMSkqKDIqZC0yKSooMipkLTIpKzEsZWFzZUluUXVhcnQ6ZD0+ZCpkKmQqZCxlYXNlT3V0UXVhcnQ6ZD0+MS0gLS1kKmQqZCpkLGVhc2VJbk91dFF1YXJ0OmQ9PmQ8LjU/OCpkKmQqZCpkOjEtOCotLWQqZCpkKmQsZWFzZUluUXVpbnQ6ZD0+ZCpkKmQqZCpkLGVhc2VPdXRRdWludDpkPT4xKy0tZCpkKmQqZCpkLGVhc2VJbk91dFF1aW50OmQ9PmQ8LjU/MTYqZCpkKmQqZCpkOjErMTYqLS1kKmQqZCpkKmQsZWFzZUluU2luZTpkPT4xLU1hdGguY29zKGQqTWF0aC5QSS8yKSxlYXNlT3V0U2luZTpkPT5NYXRoLnNpbihkKk1hdGguUEkvMiksZWFzZUluT3V0U2luZTpkPT4tKE1hdGguY29zKE1hdGguUEkqZCktMSkvMixlYXNlSW5FeHBvOmQ9PmQ8PTA/MDpNYXRoLnBvdygyLDEwKmQtMTApLGVhc2VPdXRFeHBvOmQ9PmQ+PTE/MToxLU1hdGgucG93KDIsLTEwKmQpLGVhc2VJbk91dEV4cG86ZD0+ZDw9MD8wOmQ+PTE/MTpkPC41P01hdGgucG93KDIsMjAqZC0xMCkvMjooMi1NYXRoLnBvdygyLC0yMCpkKzEwKSkvMn07Y2xhc3MgZXR7Y29uc3RydWN0b3Iocj0wLHQ9MCxlPTEpe3RoaXMueD1yLHRoaXMueT10LHRoaXMuej1lfWdldCBYWSgpe3JldHVyblt0aGlzLngsdGhpcy55XX1zZXR6KHIpe3JldHVybiB0aGlzLno9cix0aGlzfXNldFhZKHI9dGhpcy54LHQ9dGhpcy55KXtyZXR1cm4gdGhpcy54PXIsdGhpcy55PXQsdGhpc31zZXQocj10aGlzLngsdD10aGlzLnksZT10aGlzLnope3JldHVybiB0aGlzLng9cix0aGlzLnk9dCx0aGlzLno9ZSx0aGlzfXNldFRvKHt4OnI9MCx5OnQ9MCx6OmU9MX0pe3JldHVybiB0aGlzLng9cix0aGlzLnk9dCx0aGlzLno9ZSx0aGlzfXJvdChyKXtpZihyPT09MClyZXR1cm4gdGhpcztjb25zdHt4OnQseTplfT10aGlzLG49TWF0aC5zaW4ociksYT1NYXRoLmNvcyhyKTtyZXR1cm4gdGhpcy54PXQqYS1lKm4sdGhpcy55PXQqbitlKmEsdGhpc31yb3RXaXRoKHIsdCl7aWYodD09PTApcmV0dXJuIHRoaXM7Y29uc3QgZT10aGlzLngtci54LG49dGhpcy55LXIueSxhPU1hdGguc2luKHQpLHM9TWF0aC5jb3ModCk7cmV0dXJuIHRoaXMueD1yLngrKGUqcy1uKmEpLHRoaXMueT1yLnkrKGUqYStuKnMpLHRoaXN9Y2xvbmUoKXtjb25zdHt4OnIseTp0LHo6ZX09dGhpcztyZXR1cm4gbmV3IGV0KHIsdCxlKX1zdWIocil7cmV0dXJuIHRoaXMueC09ci54LHRoaXMueS09ci55LHRoaXN9c3ViWFkocix0KXtyZXR1cm4gdGhpcy54LT1yLHRoaXMueS09dCx0aGlzfXN1YlNjYWxhcihyKXtyZXR1cm4gdGhpcy54LT1yLHRoaXMueS09cix0aGlzfWFkZChyKXtyZXR1cm4gdGhpcy54Kz1yLngsdGhpcy55Kz1yLnksdGhpc31hZGRYWShyLHQpe3JldHVybiB0aGlzLngrPXIsdGhpcy55Kz10LHRoaXN9YWRkU2NhbGFyKHIpe3JldHVybiB0aGlzLngrPXIsdGhpcy55Kz1yLHRoaXN9Y2xhbXAocix0KXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHRoaXMueCxyKSx0aGlzLnk9TWF0aC5tYXgodGhpcy55LHIpLHQhPT12b2lkIDAmJih0aGlzLng9TWF0aC5taW4odGhpcy54LHQpLHRoaXMueT1NYXRoLm1pbih0aGlzLnksdCkpLHRoaXN9ZGl2KHIpe3JldHVybiB0aGlzLngvPXIsdGhpcy55Lz1yLHRoaXN9ZGl2VihyKXtyZXR1cm4gdGhpcy54Lz1yLngsdGhpcy55Lz1yLnksdGhpc31tdWwocil7cmV0dXJuIHRoaXMueCo9cix0aGlzLnkqPXIsdGhpc31tdWxWKHIpe3JldHVybiB0aGlzLngqPXIueCx0aGlzLnkqPXIueSx0aGlzfWFicygpe3JldHVybiB0aGlzLng9TWF0aC5hYnModGhpcy54KSx0aGlzLnk9TWF0aC5hYnModGhpcy55KSx0aGlzfW51ZGdlKHIsdCl7Y29uc3QgZT1ldC5UYW4ocix0aGlzKTtyZXR1cm4gdGhpcy5hZGQoZS5tdWwodCkpfW5lZygpe3JldHVybiB0aGlzLngqPS0xLHRoaXMueSo9LTEsdGhpc31jcm9zcyhyKXtyZXR1cm4gdGhpcy54PXRoaXMueSpyLnotdGhpcy56KnIueSx0aGlzLnk9dGhpcy56KnIueC10aGlzLngqci56LHRoaXN9ZHByKHIpe3JldHVybiBldC5EcHIodGhpcyxyKX1jcHIocil7cmV0dXJuIGV0LkNwcih0aGlzLHIpfWxlbjIoKXtyZXR1cm4gZXQuTGVuMih0aGlzKX1sZW4oKXtyZXR1cm4gZXQuTGVuKHRoaXMpfXByeShyKXtyZXR1cm4gZXQuUHJ5KHRoaXMscil9cGVyKCl7Y29uc3R7eDpyLHk6dH09dGhpcztyZXR1cm4gdGhpcy54PXQsdGhpcy55PS1yLHRoaXN9dW5pKCl7cmV0dXJuIGV0LlVuaSh0aGlzKX10YW4ocil7cmV0dXJuIGV0LlRhbih0aGlzLHIpfWRpc3Qocil7cmV0dXJuIGV0LkRpc3QodGhpcyxyKX1kaXN0YW5jZVRvTGluZVNlZ21lbnQocix0KXtyZXR1cm4gZXQuRGlzdGFuY2VUb0xpbmVTZWdtZW50KHIsdCx0aGlzKX1zbG9wZShyKXtyZXR1cm4gZXQuU2xvcGUodGhpcyxyKX1zbmFwVG9HcmlkKHIpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngvcikqcix0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkvcikqcix0aGlzfWFuZ2xlKHIpe3JldHVybiBldC5BbmdsZSh0aGlzLHIpfXRvQW5nbGUoKXtyZXR1cm4gZXQuVG9BbmdsZSh0aGlzKX1scnAocix0KXtyZXR1cm4gdGhpcy54PXRoaXMueCsoci54LXRoaXMueCkqdCx0aGlzLnk9dGhpcy55KyhyLnktdGhpcy55KSp0LHRoaXN9ZXF1YWxzKHIsdCl7cmV0dXJuIGV0LkVxdWFscyh0aGlzLHIsdCl9ZXF1YWxzWFkocix0KXtyZXR1cm4gZXQuRXF1YWxzWFkodGhpcyxyLHQpfW5vcm0oKXtjb25zdCByPXRoaXMubGVuKCk7cmV0dXJuIHRoaXMueD1yPT09MD8wOnRoaXMueC9yLHRoaXMueT1yPT09MD8wOnRoaXMueS9yLHRoaXN9dG9GaXhlZCgpe3JldHVybiBldC5Ub0ZpeGVkKHRoaXMpfXRvU3RyaW5nKCl7cmV0dXJuIGV0LlRvU3RyaW5nKGV0LlRvRml4ZWQodGhpcykpfXRvSnNvbigpe3JldHVybiBldC5Ub0pzb24odGhpcyl9dG9BcnJheSgpe3JldHVybiBldC5Ub0FycmF5KHRoaXMpfXN0YXRpYyBBZGQocix0KXtyZXR1cm4gbmV3IGV0KHIueCt0Lngsci55K3QueSl9c3RhdGljIEFkZFhZKHIsdCxlKXtyZXR1cm4gbmV3IGV0KHIueCt0LHIueStlKX1zdGF0aWMgU3ViKHIsdCl7cmV0dXJuIG5ldyBldChyLngtdC54LHIueS10LnkpfXN0YXRpYyBTdWJYWShyLHQsZSl7cmV0dXJuIG5ldyBldChyLngtdCxyLnktZSl9c3RhdGljIEFkZFNjYWxhcihyLHQpe3JldHVybiBuZXcgZXQoci54K3Qsci55K3QpfXN0YXRpYyBTdWJTY2FsYXIocix0KXtyZXR1cm4gbmV3IGV0KHIueC10LHIueS10KX1zdGF0aWMgRGl2KHIsdCl7cmV0dXJuIG5ldyBldChyLngvdCxyLnkvdCl9c3RhdGljIE11bChyLHQpe3JldHVybiBuZXcgZXQoci54KnQsci55KnQpfXN0YXRpYyBEaXZWKHIsdCl7cmV0dXJuIG5ldyBldChyLngvdC54LHIueS90LnkpfXN0YXRpYyBNdWxWKHIsdCl7cmV0dXJuIG5ldyBldChyLngqdC54LHIueSp0LnkpfXN0YXRpYyBOZWcocil7cmV0dXJuIG5ldyBldCgtci54LC1yLnkpfXN0YXRpYyBQZXIocil7cmV0dXJuIG5ldyBldChyLnksLXIueCl9c3RhdGljIERpc3QyKHIsdCl7cmV0dXJuIGV0LlN1YihyLHQpLmxlbjIoKX1zdGF0aWMgQWJzKHIpe3JldHVybiBuZXcgZXQoTWF0aC5hYnMoci54KSxNYXRoLmFicyhyLnkpKX1zdGF0aWMgRGlzdChyLHQpe3JldHVybiBNYXRoLmh5cG90KHIueS10Lnksci54LXQueCl9c3RhdGljIERwcihyLHQpe3JldHVybiByLngqdC54K3IueSp0Lnl9c3RhdGljIENyb3NzKHIsdCl7cmV0dXJuIG5ldyBldChyLnkqdC56LXIueip0Lnksci56KnQueC1yLngqdC56KX1zdGF0aWMgQ3ByKHIsdCl7cmV0dXJuIHIueCp0LnktdC54KnIueX1zdGF0aWMgTGVuMihyKXtyZXR1cm4gci54KnIueCtyLnkqci55fXN0YXRpYyBMZW4ocil7cmV0dXJuIE1hdGguaHlwb3Qoci54LHIueSl9c3RhdGljIFByeShyLHQpe3JldHVybiBldC5EcHIocix0KS9ldC5MZW4odCl9c3RhdGljIFVuaShyKXtyZXR1cm4gZXQuRGl2KHIsZXQuTGVuKHIpKX1zdGF0aWMgVGFuKHIsdCl7cmV0dXJuIGV0LlVuaShldC5TdWIocix0KSl9c3RhdGljIE1pbihyLHQpe3JldHVybiBuZXcgZXQoTWF0aC5taW4oci54LHQueCksTWF0aC5taW4oci55LHQueSkpfXN0YXRpYyBNYXgocix0KXtyZXR1cm4gbmV3IGV0KE1hdGgubWF4KHIueCx0LngpLE1hdGgubWF4KHIueSx0LnkpKX1zdGF0aWMgRnJvbShyKXtyZXR1cm4gbmV3IGV0KCkuYWRkKHIpfXN0YXRpYyBGcm9tQXJyYXkocil7cmV0dXJuIG5ldyBldChyWzBdLHJbMV0pfXN0YXRpYyBSb3Qocix0PTApe2NvbnN0IGU9TWF0aC5zaW4odCksbj1NYXRoLmNvcyh0KTtyZXR1cm4gbmV3IGV0KHIueCpuLXIueSplLHIueCplK3IueSpuKX1zdGF0aWMgUm90V2l0aChyLHQsZSl7Y29uc3Qgbj1yLngtdC54LGE9ci55LXQueSxzPU1hdGguc2luKGUpLGk9TWF0aC5jb3MoZSk7cmV0dXJuIG5ldyBldCh0LngrKG4qaS1hKnMpLHQueSsobipzK2EqaSkpfXN0YXRpYyBOZWFyZXN0UG9pbnRPbkxpbmVUaHJvdWdoUG9pbnQocix0LGUpe3JldHVybiBldC5NdWwodCxldC5TdWIoZSxyKS5wcnkodCkpLmFkZChyKX1zdGF0aWMgTmVhcmVzdFBvaW50T25MaW5lU2VnbWVudChyLHQsZSxuPSEwKXtjb25zdCBhPWV0LlRhbih0LHIpLHM9ZXQuQWRkKHIsZXQuTXVsKGEsZXQuU3ViKGUscikucHJ5KGEpKSk7aWYobil7aWYocy54PE1hdGgubWluKHIueCx0LngpKXJldHVybiBldC5DYXN0KHIueDx0Lng/cjp0KTtpZihzLng+TWF0aC5tYXgoci54LHQueCkpcmV0dXJuIGV0LkNhc3Qoci54PnQueD9yOnQpO2lmKHMueTxNYXRoLm1pbihyLnksdC55KSlyZXR1cm4gZXQuQ2FzdChyLnk8dC55P3I6dCk7aWYocy55Pk1hdGgubWF4KHIueSx0LnkpKXJldHVybiBldC5DYXN0KHIueT50Lnk/cjp0KX1yZXR1cm4gc31zdGF0aWMgRGlzdGFuY2VUb0xpbmVUaHJvdWdoUG9pbnQocix0LGUpe3JldHVybiBldC5EaXN0KGUsZXQuTmVhcmVzdFBvaW50T25MaW5lVGhyb3VnaFBvaW50KHIsdCxlKSl9c3RhdGljIERpc3RhbmNlVG9MaW5lU2VnbWVudChyLHQsZSxuPSEwKXtyZXR1cm4gZXQuRGlzdChlLGV0Lk5lYXJlc3RQb2ludE9uTGluZVNlZ21lbnQocix0LGUsbikpfXN0YXRpYyBTbmFwKHIsdD0xKXtyZXR1cm4gbmV3IGV0KE1hdGgucm91bmQoci54L3QpKnQsTWF0aC5yb3VuZChyLnkvdCkqdCl9c3RhdGljIENhc3Qocil7cmV0dXJuIHIgaW5zdGFuY2VvZiBldD9yOmV0LkZyb20ocil9c3RhdGljIFNsb3BlKHIsdCl7cmV0dXJuIHIueD09PXQueT9OYU46KHIueS10LnkpLyhyLngtdC54KX1zdGF0aWMgQW5nbGUocix0KXtyZXR1cm4gTWF0aC5hdGFuMih0Lnktci55LHQueC1yLngpfXN0YXRpYyBMcnAocix0LGUpe3JldHVybiBldC5TdWIodCxyKS5tdWwoZSkuYWRkKHIpfXN0YXRpYyBNZWQocix0KXtyZXR1cm4gbmV3IGV0KChyLngrdC54KS8yLChyLnkrdC55KS8yKX1zdGF0aWMgRXF1YWxzKHIsdCxlPTFlLTQpe3JldHVybiBNYXRoLmFicyhyLngtdC54KTxlJiZNYXRoLmFicyhyLnktdC55KTxlfXN0YXRpYyBFcXVhbHNYWShyLHQsZSl7cmV0dXJuIHIueD09PXQmJnIueT09PWV9c3RhdGljIEVxdWFsc1hZWihyLHQsZT0xZS00KXtyZXR1cm4gZXQuRXF1YWxzKHIsdCxlKSYmTWF0aC5hYnMoKHIuenx8MCktKHQuenx8MCkpPGV9c3RhdGljIENsb2Nrd2lzZShyLHQsZSl7cmV0dXJuKGUueC1yLngpKih0Lnktci55KS0odC54LXIueCkqKGUueS1yLnkpPDB9c3RhdGljIFJlc2NhbGUocix0KXtjb25zdCBlPWV0LkxlbihyKTtyZXR1cm4gbmV3IGV0KHQqci54L2UsdCpyLnkvZSl9c3RhdGljIFNjYWxlV2l0aE9yaWdpbihyLHQsZSl7cmV0dXJuIGV0LlN1YihyLGUpLm11bCh0KS5hZGQoZSl9c3RhdGljIFNjYWxlV09yaWdpbihyLHQsZSl7cmV0dXJuIGV0LlN1YihyLGUpLm11bFYodCkuYWRkKGUpfXN0YXRpYyBUb0ZpeGVkKHIsdD0yKXtyZXR1cm4gbmV3IGV0KCtyLngudG9GaXhlZCh0KSwrci55LnRvRml4ZWQodCksK3Iuei50b0ZpeGVkKHQpKX1zdGF0aWMgTnVkZ2Uocix0LGUpe3JldHVybiBldC5BZGQocixldC5UYW4odCxyKS5tdWwoZSkpfXN0YXRpYyBUb1N0cmluZyhyKXtyZXR1cm5gJHtyLnh9LCAke3IueX1gfXN0YXRpYyBUb0FuZ2xlKHIpe2xldCB0PU1hdGguYXRhbjIoci55LHIueCk7cmV0dXJuIHQ8MCYmKHQrPU1hdGguUEkqMiksdH1zdGF0aWMgRnJvbUFuZ2xlKHIsdD0xKXtyZXR1cm4gbmV3IGV0KE1hdGguY29zKHIpKnQsTWF0aC5zaW4ocikqdCl9c3RhdGljIFRvQXJyYXkocil7cmV0dXJuW3IueCxyLnksci56XX1zdGF0aWMgVG9Kc29uKHIpe2NvbnN0e3g6dCx5OmUsejpufT1yO3JldHVybnt4OnQseTplLHo6bn19c3RhdGljIEF2ZXJhZ2Uocil7Y29uc3QgdD1yLmxlbmd0aCxlPW5ldyBldCgwLDApO2ZvcihsZXQgbj0wO248dDtuKyspZS5hZGQocltuXSk7cmV0dXJuIGUuZGl2KHQpfXN0YXRpYyBDbGFtcChyLHQsZSl7cmV0dXJuIGU9PT12b2lkIDA/bmV3IGV0KE1hdGgubWluKE1hdGgubWF4KHIueCx0KSksTWF0aC5taW4oTWF0aC5tYXgoci55LHQpKSk6bmV3IGV0KE1hdGgubWluKE1hdGgubWF4KHIueCx0KSxlKSxNYXRoLm1pbihNYXRoLm1heChyLnksdCksZSkpfXN0YXRpYyBQb2ludHNCZXR3ZWVuKHIsdCxlPTYpe2NvbnN0IG49W107Zm9yKGxldCBhPTA7YTxlO2ErKyl7Y29uc3Qgcz1DaC5lYXNlSW5RdWFkKGEvKGUtMSkpLGk9ZXQuTHJwKHIsdCxzKTtpLno9TWF0aC5taW4oMSwuNStNYXRoLmFicyguNS1SaChzKSkqLjY1KSxuLnB1c2goaSl9cmV0dXJuIG59c3RhdGljIFNuYXBUb0dyaWQocix0PTgpe3JldHVybiBuZXcgZXQoTWF0aC5yb3VuZChyLngvdCkqdCxNYXRoLnJvdW5kKHIueS90KSp0KX19Y29uc3QgUmg9ZD0+ZDwuNT8yKmQqZDotMSsoNC0yKmQpKmQ7Y2xhc3MgTXQgZXh0ZW5kcyBldHtjb25zdHJ1Y3RvcihyPTAsdD0wLGU9MCxuPXt4OjAseTowfSxhPTAscz0wKXtzdXBlcihyLHQsZSksdGhpcy54PXIsdGhpcy55PXQsdGhpcy56PWUsdGhpcy52PW4sdGhpcy50PWEsdGhpcy5hPXN9Z2V0IHRpbWVzdGFtcCgpe3JldHVybiB0aGlzLnR9Z2V0IHByZXNzdXJlKCl7cmV0dXJuIHRoaXMuen1nZXQgYW5nbGVOdW0oKXtyZXR1cm4gdGhpcy5hfWdldCBYWSgpe3JldHVyblt0aGlzLngsdGhpcy55XX1zZXRBKHIpe3RoaXMuYT1yfXNldFQocil7dGhpcy50PXJ9c2V0dihyKXtyZXR1cm4gdGhpcy52PXt4OnIueCx5OnIueX0sdGhpc31zZXQocj10aGlzLngsdD10aGlzLnksZT10aGlzLnosbj10aGlzLnYsYT10aGlzLnQscz10aGlzLmEpe3JldHVybiB0aGlzLng9cix0aGlzLnk9dCx0aGlzLno9ZSx0aGlzLnY9bix0aGlzLnQ9YSx0aGlzLmE9cyx0aGlzfWNsb25lKCl7Y29uc3R7eDpyLHk6dCx6OmUsdjpuLHQ6YSxhOnN9PXRoaXMsaT17eDpuLngseTpuLnl9O3JldHVybiBuZXcgTXQocix0LGUsaSxhLHMpfWRpc3RhbmNlKHIpe3JldHVybiBNdC5HZXREaXN0YW5jZSh0aGlzLHIpfWlzTmVhcihyLHQpe3JldHVybiBNdC5Jc05lYXIodGhpcyxyLHQpfWdldEFuZ2xlQnlQb2ludHMocix0KXtyZXR1cm4gTXQuR2V0QW5nbGVCeVBvaW50cyhyLHRoaXMsdCl9c3RhdGljIFN1YihyLHQpe3JldHVybiBuZXcgTXQoci54LXQueCxyLnktdC55KX1zdGF0aWMgQWRkKHIsdCl7cmV0dXJuIG5ldyBNdChyLngrdC54LHIueSt0LnkpfXN0YXRpYyBHZXREaXN0YW5jZShyLHQpe3JldHVybiBNdC5MZW4oci5jbG9uZSgpLnN1Yih0KSl9c3RhdGljIEdldEFuZ2xlQnlQb2ludHMocix0LGUpe2NvbnN0IG49dC54LXIueCxhPWUueC10Lngscz10Lnktci55LGk9ZS55LXQueTtsZXQgbz0wO2NvbnN0IGM9TWF0aC5zcXJ0KG4qbitzKnMpLG09TWF0aC5zcXJ0KGEqYStpKmkpO2lmKGMmJm0pe2NvbnN0IHU9biphK3MqaTtvPU1hdGguYWNvcyh1LyhjKm0pKSxvPW8vTWF0aC5QSSoxODA7bGV0IHA9bippLXMqYTtwPXA+MD8xOi0xLG89MTgwK3Aqb31yZXR1cm4gb31zdGF0aWMgSXNOZWFyKHIsdCxlKXtyZXR1cm4gTXQuTGVuKHIuY2xvbmUoKS5zdWIodCkpPGV9c3RhdGljIFJvdFdpdGgocix0LGUsbj0yKXtjb25zdCBhPXIueC10Lngscz1yLnktdC55LGk9TWF0aC5zaW4oZSksbz1NYXRoLmNvcyhlKSxjPU1hdGgucG93KDEwLG4pLG09TWF0aC5mbG9vcigodC54KyhhKm8tcyppKSkqYykvYyx1PU1hdGguZmxvb3IoKHQueSsoYSppK3MqbykpKmMpL2M7cmV0dXJuIG5ldyBNdChtLHUpfXN0YXRpYyBHZXREb3RTdHJva2Uocix0LGU9MTYpe2NvbnN0IG49bmV3IGV0KDEsMSksYT1NYXRoLlBJKy4wMDEscz1NdC5BZGQocixNdC5TdWIocixuKS51bmkoKS5wZXIoKS5tdWwoLXQpKSxpPVtdO2ZvcihsZXQgbz0xL2UsYz1vO2M8PTE7Yys9bylpLnB1c2goTXQuUm90V2l0aChzLHIsYSoyKmMpKTtyZXR1cm4gaX1zdGF0aWMgR2V0U2VtaWNpcmNsZVN0cm9rZShyLHQsZT0tMSxuPTgpe2NvbnN0IGE9ZSooTWF0aC5QSSsuMDAxKSxzPVtdO2ZvcihsZXQgaT0xL24sbz1pO288PTE7bys9aSlzLnB1c2goTXQuUm90V2l0aCh0LHIsYSpvKSk7cmV0dXJuIHN9fWZ1bmN0aW9uIE90KGQscil7aWYoZCYmcil7Y29uc3QgdD1NYXRoLm1pbihkLngsci54KSxlPU1hdGgubWluKGQueSxyLnkpLG49TWF0aC5tYXgoZC54K2QudyxyLngrci53KSxhPU1hdGgubWF4KGQueStkLmgsci55K3IuaCkscz1uLXQsaT1hLWU7cmV0dXJue3g6dCx5OmUsdzpzLGg6aX19cmV0dXJuIHJ8fGR9ZnVuY3Rpb24gQnQoZCxyPTApe2NvbnN0IHQ9e3g6MCx5OjAsdzowLGg6MH07bGV0IGU9MS8wLG49MS8wLGE9LTEvMCxzPS0xLzA7cmV0dXJuIGQuZm9yRWFjaChpPT57Y29uc3RbbyxjXT1pLlhZO2U9TWF0aC5taW4oZSxvLXIpLG49TWF0aC5taW4obixjLXIpLGE9TWF0aC5tYXgoYSxvK3IpLHM9TWF0aC5tYXgocyxjK3IpfSksdC54PWUsdC55PW4sdC53PWEtZSx0Lmg9cy1uLHR9ZnVuY3Rpb24geGUoZCxyKXtyZXR1cm4hKGQueCtkLnc8ci54fHxkLng+ci54K3Iud3x8ZC55K2QuaDxyLnl8fGQueT5yLnkrci5oKX1mdW5jdGlvbiBJaChkLHIpe3JldHVybiBkLmxlbmd0aD09PXIubGVuZ3RoJiZkLnNvcnQoKS50b1N0cmluZygpPT09ci5zb3J0KCkudG9TdHJpbmcoKX1mdW5jdGlvbiBZdChkLHI9MTApe3JldHVybnt4Ok1hdGguZmxvb3IoZC54LXIpLHk6TWF0aC5mbG9vcihkLnktciksdzpNYXRoLmZsb29yKGQudytyKjIpLGg6TWF0aC5mbG9vcihkLmgrcioyKX19ZnVuY3Rpb24gQ2UoZCxyKXtyZXR1cm57eDpkLngrclswXSx5OmQueStyWzFdLHc6ZC53LGg6ZC5ofX1mdW5jdGlvbiB2bihkLHIpe2NvbnN0IHQ9bmV3IGV0KGQueCxkLnkpLGU9bmV3IGV0KGQueCtkLncsZC55KSxuPW5ldyBldChkLngrZC53LGQueStkLmgpLGE9bmV3IGV0KGQueCxkLnkrZC5oKSxzPW5ldyBldChkLngrZC53LzIsZC55K2QuaC8yKSxpPU1hdGguUEkqci8xODAsbz1ldC5Sb3RXaXRoKHQscyxpKSxjPWV0LlJvdFdpdGgoZSxzLGkpLG09ZXQuUm90V2l0aChuLHMsaSksdT1ldC5Sb3RXaXRoKGEscyxpKTtyZXR1cm4gQnQoW28sYyxtLHVdKX1mdW5jdGlvbiB5bihkLHIpe2NvbnN0IHQ9bmV3IGV0KGQueCxkLnkpLGU9bmV3IGV0KGQueCtkLncsZC55KSxuPW5ldyBldChkLngrZC53LGQueStkLmgpLGE9bmV3IGV0KGQueCxkLnkrZC5oKSxzPW5ldyBldChkLngrZC53LzIsZC55K2QuaC8yKSxpPW5ldyBldChyWzBdLHJbMV0pLG89ZXQuU2NhbGVXT3JpZ2luKHQsaSxzKSxjPWV0LlNjYWxlV09yaWdpbihlLGkscyksbT1ldC5TY2FsZVdPcmlnaW4obixpLHMpLHU9ZXQuU2NhbGVXT3JpZ2luKGEsaSxzKTtyZXR1cm4gQnQoW28sYyxtLHVdKX1mdW5jdGlvbiBMaChkLHIsdCl7Y29uc3QgZT1uZXcgZXQoclswXSxyWzFdKTtmb3IobGV0IG49MDtuPGQubGVuZ3RoO24rPTMpe2NvbnN0IGE9bmV3IGV0KGRbbl0sZFtuKzFdKSxzPU1hdGguUEkqdC8xODAsaT1ldC5Sb3RXaXRoKGEsZSxzKTtkW25dPWkueCxkW24rMV09aS55fX1mdW5jdGlvbiBiaChkLHIsdCl7Y29uc3QgZT1uZXcgZXQoclswXSxyWzFdKTtmb3IobGV0IG49MDtuPGQubGVuZ3RoO24rPTMpe2NvbnN0IGE9bmV3IGV0KGRbbl0sZFtuKzFdKSxzPW5ldyBldCh0WzBdLHRbMV0pO2lmKG48ZC5sZW5ndGgtMyl7Y29uc3Qgbz1uZXcgZXQoZFtuKzNdLGRbbis0XSksYz1ldC5UYW4obyxhKS5wZXIoKS5tdWwoZFtuKzJdKS5tdWxWKHMpLmxlbigpO2RbbisyXT1jfWVsc2UgaWYobj09PWQubGVuZ3RoLTMpe2NvbnN0IG89bmV3IGV0KGRbbi0zXSxkW24tMl0pLGM9ZXQuVGFuKGEsbykucGVyKCkubXVsKGRbbisyXSkubXVsVihzKS5sZW4oKTtkW24rMl09Y31jb25zdCBpPWV0LlNjYWxlV09yaWdpbihhLHMsZSk7ZFtuXT1pLngsZFtuKzFdPWkueX19ZnVuY3Rpb24gRGgoZCxyKXtyZXR1cm4gZFswXT49ci54JiZkWzBdPD1yLngrci53JiZkWzFdPj1yLnkmJmRbMV08PXIueStyLmh9ZnVuY3Rpb24gU24oZCxyKXtjb25zdCB0PWQ8PXI/MTpkL3IsZT1yPD1kPzE6ci9kO3JldHVyblt0LGVdfWNvbnN0IEhlPWQ9PntpZihkLnRhZ05hbWU9PT0iR1JPVVAiKXtjb25zdCByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZCkuZmluZCh0PT50LnRvU3RyaW5nKCk9PT0iU3ltYm9sKHNlYWxlZCkiKTtpZihyJiZkW3JdKXJldHVybiEwfXJldHVybiExfSx3aD1kPT5kIT09Z3QuVGV4dDtmdW5jdGlvbiBUZShkKXtyZXR1cm5gJHtLZShkLngpfSwke0tlKGQueSl9IGB9ZnVuY3Rpb24gTWUoZCxyKXtyZXR1cm5gJHtLZSgoZC54K3IueCkvMil9LCR7S2UoKGQueStyLnkpLzIpfSBgfWZ1bmN0aW9uIEtlKGQpe3JldHVybitkLnRvRml4ZWQoNCl9dmFyIE5oPWNlLEJoPWllLFdoPSJbb2JqZWN0IE51bWJlcl0iO2Z1bmN0aW9uIEZoKGQpe3JldHVybiB0eXBlb2YgZD09Im51bWJlciJ8fEJoKGQpJiZOaChkKT09V2h9dmFyIGpoPUZoLG9lPVh0KGpoKTtjb25zdCBxdD1jbGFzcyBxdHtjb25zdHJ1Y3RvcihyKXtzdCh0aGlzLCJzeW5jVW5pdFRpbWUiLDFlMyk7c3QodGhpcywidk5vZGVzIik7c3QodGhpcywiZHJhd0xheWVyIik7c3QodGhpcywiZnVsbExheWVyIik7c3QodGhpcywid29ya0lkIik7Y29uc3R7dk5vZGVzOnQsZnVsbExheWVyOmUsZHJhd0xheWVyOm59PXI7dGhpcy52Tm9kZXM9dCx0aGlzLmZ1bGxMYXllcj1lLHRoaXMuZHJhd0xheWVyPW59c2V0V29ya0lkKHIpe3RoaXMud29ya0lkPXJ9Z2V0V29ya0lkKCl7cmV0dXJuIHRoaXMud29ya0lkfWdldFdvcmtPcHRpb25zKCl7cmV0dXJuIHRoaXMud29ya09wdGlvbnN9c2V0V29ya09wdGlvbnMocil7dmFyIG47dGhpcy53b3JrT3B0aW9ucz1yLHRoaXMuc3luY1VuaXRUaW1lPXIuc3luY1VuaXRUaW1lfHx0aGlzLnN5bmNVbml0VGltZTtjb25zdCB0PShuPXRoaXMud29ya0lkKT09bnVsbD92b2lkIDA6bi50b1N0cmluZygpLGU9dCYmdGhpcy52Tm9kZXMuZ2V0KHQpfHx2b2lkIDA7dCYmZSYmKGUub3B0PXIsdGhpcy52Tm9kZXMuc2V0SW5mbyh0LGUpKX11cGRhdGFPcHRTZXJ2aWNlKHIpe3ZhciBuO2xldCB0O2NvbnN0IGU9KG49dGhpcy53b3JrSWQpPT1udWxsP3ZvaWQgMDpuLnRvU3RyaW5nKCk7aWYoZSYmcil7Y29uc3QgYT10aGlzLmZ1bGxMYXllci5nZXRFbGVtZW50c0J5TmFtZShlKXx8dGhpcy5kcmF3TGF5ZXImJnRoaXMuZHJhd0xheWVyLmdldEVsZW1lbnRzQnlOYW1lKGUpfHxbXTtpZihhLmxlbmd0aCE9PTEpcmV0dXJuO2NvbnN0IHM9YVswXSx7cG9zOmksekluZGV4Om8sc2NhbGU6YyxhbmdsZTptLHRyYW5zbGF0ZTp1fT1yLHA9e307b2UobykmJihwLnpJbmRleD1vKSxpJiYocC5wb3M9W2lbMF0saVsxXV0pLGMmJihwLnNjYWxlPWMpLG0mJihwLnJvdGF0ZT1tKSx1JiYocC50cmFuc2xhdGU9dSkscy5hdHRyKHApO2NvbnN0IHk9cz09bnVsbD92b2lkIDA6cy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm4geSYmKHQ9T3QodCx7eDpNYXRoLmZsb29yKHkueC1xdC5TYWZlQm9yZGVyUGFkZGluZykseTpNYXRoLmZsb29yKHkueS1xdC5TYWZlQm9yZGVyUGFkZGluZyksdzpNYXRoLmZsb29yKHkud2lkdGgrcXQuU2FmZUJvcmRlclBhZGRpbmcqMiksaDpNYXRoLmZsb29yKHkuaGVpZ2h0K3F0LlNhZmVCb3JkZXJQYWRkaW5nKjIpfSkpLHRoaXMudk5vZGVzLnNldEluZm8oZSx7cmVjdDp0LGNlbnRlclBvczppfSksdH19c3RhdGljIHVwZGF0ZU5vZGVPcHQocil7Y29uc3R7bm9kZTp0LG9wdDplLHZOb2RlczpuLHdpbGxTZXJpYWxpemVEYXRhOmEsdGFyZ2V0Tm9kZTpzfT1yLHt6SW5kZXg6aSx0cmFuc2xhdGU6byxhbmdsZTpjLGJveDptLGJveFNjYWxlOnUsYm94VHJhbnNsYXRlOnAscG9pbnRNYXA6eX09ZTtsZXQgTztjb25zdCB4PXMmJlp0KHMpfHxuLmdldCh0Lm5hbWUpO2lmKCF4KXJldHVybjtvZShpKSYmKHQuc2V0QXR0cmlidXRlKCJ6SW5kZXgiLGkpLHgub3B0LnpJbmRleD1pKTtjb25zdCB2PXQucGFyZW50O2lmKHYpe2lmKG0mJnAmJnUpe2NvbnN0e3JlY3Q6VH09eCxsPVtdO2ZvcihsZXQgTD0wO0w8eC5vcC5sZW5ndGg7TCs9MylsLnB1c2gobmV3IE10KHgub3BbTF0seC5vcFtMKzFdLHgub3BbTCsyXSkpO2NvbnN0IGg9QnQobCksZj1baC53KnYud29ybGRTY2FsaW5nWzBdLGguaCp2LndvcmxkU2NhbGluZ1swXV0sZz1bVC53LWZbMF0sVC5oLWZbMV1dLE09WyhULncqdVswXS1nWzBdKS9mWzBdLChULmgqdVsxXS1nWzFdKS9mWzFdXSxBPVtwWzBdL3Yud29ybGRTY2FsaW5nWzBdLHBbMV0vdi53b3JsZFNjYWxpbmdbMV1dLEM9eC5vcC5tYXAoKEwsRCk9Pntjb25zdCBJPUQlMztyZXR1cm4gST09PTA/TCtBWzBdOkk9PT0xP0wrQVsxXTpMfSksYj1beC5jZW50ZXJQb3NbMF0rQVswXSx4LmNlbnRlclBvc1sxXStBWzFdXTtiaChDLGIsTSk7Y29uc3QgRT1bXTtmb3IobGV0IEw9MDtMPEMubGVuZ3RoO0wrPTMpRS5wdXNoKG5ldyBNdChDW0xdLENbTCsxXSxDW0wrMl0pKTt4Lm9wPUMseC5jZW50ZXJQb3M9Yn1lbHNlIGlmKG8pe2NvbnN0IFQ9W29bMF0vdi53b3JsZFNjYWxpbmdbMF0sb1sxXS92LndvcmxkU2NhbGluZ1sxXV07dC5zZXRBdHRyaWJ1dGUoInRyYW5zbGF0ZSIsVCkseC5vcHQudHJhbnNsYXRlPVQscyYmKE89Q2UoeC5yZWN0LG8pLHgucmVjdD1PKX1lbHNlIG9lKGMpJiYodC5zZXRBdHRyaWJ1dGUoInJvdGF0ZSIsYykseC5vcHQucm90YXRlPWMscyYmKE89dm4oeC5yZWN0LGMpLHgucmVjdD1PKSk7aWYoeSl7Y29uc3QgVD15LmdldCh0Lm5hbWUpO2lmKFQpZm9yKGxldCBsPTAsaD0wO2w8eC5vcC5sZW5ndGg7bCs9MyxoKyspeC5vcFtsXT1UW2hdWzBdLHgub3BbbCsxXT1UW2hdWzFdfWlmKGEpe2lmKG8pe2NvbnN0IFQ9W29bMF0vdi53b3JsZFNjYWxpbmdbMF0sb1sxXS92LndvcmxkU2NhbGluZ1sxXV0sbD14Lm9wLm1hcCgoaCxmKT0+e2NvbnN0IGc9ZiUzO3JldHVybiBnPT09MD9oK1RbMF06Zz09PTE/aCtUWzFdOmh9KTt4Lm9wPWwseC5jZW50ZXJQb3M9W3guY2VudGVyUG9zWzBdK1RbMF0seC5jZW50ZXJQb3NbMV0rVFsxXV0seCE9bnVsbCYmeC5vcHQmJih4Lm9wdC50cmFuc2xhdGU9dm9pZCAwKX1lbHNlIGlmKG9lKGMpKXtjb25zdCBUPXgub3A7TGgoVCx4LmNlbnRlclBvcyxjKSx4Lm9wPVQseCE9bnVsbCYmeC5vcHQmJih4Lm9wdC5yb3RhdGU9dm9pZCAwKX19eCYmbi5zZXRJbmZvKHQubmFtZSx4KX19c3RhdGljIGdldENlbnRlclBvcyhyLHQpe2NvbnN0e3dvcmxkUG9zaXRpb246ZSx3b3JsZFNjYWxpbmc6bn09dDtyZXR1cm5bKHIueCtyLncvMi1lWzBdKS9uWzBdLChyLnkrci5oLzItZVsxXSkvblsxXV19c3RhdGljIGdldFJlY3RGcm9tTGF5ZXIocix0KXtjb25zdCBlPXIuZ2V0RWxlbWVudHNCeU5hbWUodClbMF07aWYoZSl7Y29uc3Qgbj1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybnt4Ok1hdGguZmxvb3Iobi54LXF0LlNhZmVCb3JkZXJQYWRkaW5nKSx5Ok1hdGguZmxvb3Iobi55LXF0LlNhZmVCb3JkZXJQYWRkaW5nKSx3Ok1hdGguZmxvb3Iobi53aWR0aCtxdC5TYWZlQm9yZGVyUGFkZGluZyoyKSxoOk1hdGguZmxvb3Iobi5oZWlnaHQrcXQuU2FmZUJvcmRlclBhZGRpbmcqMil9fX19O3N0KHF0LCJTYWZlQm9yZGVyUGFkZGluZyIsMTApO2xldCB5dD1xdDt2YXIgRHQ9ZnVuY3Rpb24oZCl7dmFyIHI9e307ZnVuY3Rpb24gdChlKXtpZihyW2VdKXJldHVybiByW2VdLmV4cG9ydHM7dmFyIG49cltlXT17aTplLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIGRbZV0uY2FsbChuLmV4cG9ydHMsbixuLmV4cG9ydHMsdCksbi5sPSEwLG4uZXhwb3J0c31yZXR1cm4gdC5tPWQsdC5jPXIsdC5kPWZ1bmN0aW9uKGUsbixhKXt0Lm8oZSxuKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbix7ZW51bWVyYWJsZTohMCxnZXQ6YX0pfSx0LnI9ZnVuY3Rpb24oZSl7dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0sdC50PWZ1bmN0aW9uKGUsbil7aWYobiYxJiYoZT10KGUpKSxuJjh8fG4mNCYmdHlwZW9mIGU9PSJvYmplY3QiJiZlJiZlLl9fZXNNb2R1bGUpcmV0dXJuIGU7dmFyIGE9T2JqZWN0LmNyZWF0ZShudWxsKTtpZih0LnIoYSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsImRlZmF1bHQiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOmV9KSxuJjImJnR5cGVvZiBlIT0ic3RyaW5nIilmb3IodmFyIHMgaW4gZSl0LmQoYSxzLChmdW5jdGlvbihpKXtyZXR1cm4gZVtpXX0pLmJpbmQobnVsbCxzKSk7cmV0dXJuIGF9LHQubj1mdW5jdGlvbihlKXt2YXIgbj1lJiZlLl9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gZS5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiBlfTtyZXR1cm4gdC5kKG4sImEiLG4pLG59LHQubz1mdW5jdGlvbihlLG4pe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxuKX0sdC5wPSIvanMvIix0KHQucz0wKX0oW2Z1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsInZlcnNpb24iLGZ1bmN0aW9uKCl7cmV0dXJuIEt9KSx0LmQociwiaGVscGVycyIsZnVuY3Rpb24oKXtyZXR1cm4gQn0pLHQuZChyLCJjcmVhdGVFbGVtZW50IixmdW5jdGlvbigpe3JldHVybiBEfSksdC5kKHIsImlzU3ByaXRlTm9kZSIsZnVuY3Rpb24oKXtyZXR1cm4gSX0pLHQuZChyLCJyZWdpc3Rlck5vZGUiLGZ1bmN0aW9uKCl7cmV0dXJuIFJ9KTt2YXIgZT10KDEyKTt0LmQociwiRU5WIixmdW5jdGlvbigpe3JldHVybiBlLkVOVn0pO3ZhciBuPXQoNjgpO3QuZChyLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLGZ1bmN0aW9uKCl7cmV0dXJuIG4ucmVxdWVzdEFuaW1hdGlvbkZyYW1lfSksdC5kKHIsImNhbmNlbEFuaW1hdGlvbkZyYW1lIixmdW5jdGlvbigpe3JldHVybiBuLmNhbmNlbEFuaW1hdGlvbkZyYW1lfSk7dmFyIGE9dCg3MCk7dC5kKHIsIk5vZGUiLGZ1bmN0aW9uKCl7cmV0dXJuIGEuZGVmYXVsdH0pO3ZhciBzPXQoMjE3KTt0LmQociwiQ2xvdWQiLGZ1bmN0aW9uKCl7cmV0dXJuIHMuZGVmYXVsdH0pO3ZhciBpPXQoMjE5KTt0LmQociwiQmxvY2siLGZ1bmN0aW9uKCl7cmV0dXJuIGkuZGVmYXVsdH0pO3ZhciBvPXQoMjI0KTt0LmQociwiU3ByaXRlIixmdW5jdGlvbigpe3JldHVybiBvLmRlZmF1bHR9KTt2YXIgYz10KDIyNik7dC5kKHIsIlBhdGgiLGZ1bmN0aW9uKCl7cmV0dXJuIGMuZGVmYXVsdH0pO3ZhciBtPXQoMjI5KTt0LmQociwiUmVjdCIsZnVuY3Rpb24oKXtyZXR1cm4gbS5kZWZhdWx0fSk7dmFyIHU9dCgyMzEpO3QuZChyLCJUcmlhbmdsZSIsZnVuY3Rpb24oKXtyZXR1cm4gdS5kZWZhdWx0fSk7dmFyIHA9dCgyMzYpO3QuZChyLCJQYXJhbGxlbCIsZnVuY3Rpb24oKXtyZXR1cm4gcC5kZWZhdWx0fSk7dmFyIHk9dCgyMzgpO3QuZChyLCJSZWd1bGFyIixmdW5jdGlvbigpe3JldHVybiB5LmRlZmF1bHR9KTt2YXIgTz10KDI0MCk7dC5kKHIsIlN0YXIiLGZ1bmN0aW9uKCl7cmV0dXJuIE8uZGVmYXVsdH0pO3ZhciB4PXQoMjQyKTt0LmQociwiRWxsaXBzZSIsZnVuY3Rpb24oKXtyZXR1cm4geC5kZWZhdWx0fSk7dmFyIHY9dCgyNDQpO3QuZChyLCJBcmMiLGZ1bmN0aW9uKCl7cmV0dXJuIHYuZGVmYXVsdH0pO3ZhciBUPXQoMjQ2KTt0LmQociwiUmluZyIsZnVuY3Rpb24oKXtyZXR1cm4gVC5kZWZhdWx0fSk7dmFyIGw9dCgyMzIpO3QuZChyLCJQb2x5bGluZSIsZnVuY3Rpb24oKXtyZXR1cm4gbC5kZWZhdWx0fSk7dmFyIGg9dCgyNDgpO3QuZChyLCJMYWJlbCIsZnVuY3Rpb24oKXtyZXR1cm4gaC5kZWZhdWx0fSk7dmFyIGY9dCgyNTApO3QuZChyLCJHcm91cCIsZnVuY3Rpb24oKXtyZXR1cm4gZi5kZWZhdWx0fSk7dmFyIGc9dCgyODYpO3QuZChyLCJMYXllciIsZnVuY3Rpb24oKXtyZXR1cm4gZy5kZWZhdWx0fSk7dmFyIE09dCgyODcpO3QuZChyLCJTcHJpdGVTdmciLGZ1bmN0aW9uKCl7cmV0dXJuIE0uZGVmYXVsdH0pO3ZhciBBPXQoMjg5KTt0LmQociwiTGF5ZXJXb3JrZXIiLGZ1bmN0aW9uKCl7cmV0dXJuIEEuZGVmYXVsdH0pO3ZhciBDPXQoMjkwKTt0LmQociwiU2NlbmUiLGZ1bmN0aW9uKCl7cmV0dXJuIEMuZGVmYXVsdH0pO3ZhciBiPXQoMjEzKSxFPXQoMjIxKTt0LmQociwiQ29sb3IiLGZ1bmN0aW9uKCl7cmV0dXJuIEUuQ29sb3J9KSx0LmQociwiR3JhZGllbnQiLGZ1bmN0aW9uKCl7cmV0dXJuIEUuR3JhZGllbnR9KTt2YXIgTD10KDcyKTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7Y29uc3QgRD1iLmRlZmF1bHQuY3JlYXRlRWxlbWVudCxJPWIuZGVmYXVsdC5pc1Nwcml0ZU5vZGUsUj1iLmRlZmF1bHQucmVnaXN0ZXJOb2RlLEI9e3BhcnNlQ29sb3I6RS5wYXJzZUNvbG9yLHNpemVUb1BpeGVsOkwuc2l6ZVRvUGl4ZWwsdG9BcnJheTpMLnRvQXJyYXksdG9TdHJpbmc6TC50b1N0cmluZyx0b051bWJlcjpMLnRvTnVtYmVyfTtsZXQgejt6PSIzLjguMyI7Y29uc3QgSz16fSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpO3ZhciBlPXQoMik7dC5kKHIsImdsTWF0cml4IixmdW5jdGlvbigpe3JldHVybiBlfSk7dmFyIG49dCgzKTt0LmQociwibWF0MiIsZnVuY3Rpb24oKXtyZXR1cm4gbn0pO3ZhciBhPXQoNCk7dC5kKHIsIm1hdDJkIixmdW5jdGlvbigpe3JldHVybiBhfSk7dmFyIHM9dCg1KTt0LmQociwibWF0MyIsZnVuY3Rpb24oKXtyZXR1cm4gc30pO3ZhciBpPXQoNik7dC5kKHIsIm1hdDQiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KTt2YXIgbz10KDcpO3QuZChyLCJxdWF0IixmdW5jdGlvbigpe3JldHVybiBvfSk7dmFyIGM9dCgxMCk7dC5kKHIsInF1YXQyIixmdW5jdGlvbigpe3JldHVybiBjfSk7dmFyIG09dCgxMSk7dC5kKHIsInZlYzIiLGZ1bmN0aW9uKCl7cmV0dXJuIG19KTt2YXIgdT10KDgpO3QuZChyLCJ2ZWMzIixmdW5jdGlvbigpe3JldHVybiB1fSk7dmFyIHA9dCg5KTt0LmQociwidmVjNCIsZnVuY3Rpb24oKXtyZXR1cm4gcH0pfSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJFUFNJTE9OIixmdW5jdGlvbigpe3JldHVybiBlfSksdC5kKHIsIkFSUkFZX1RZUEUiLGZ1bmN0aW9uKCl7cmV0dXJuIG59KSx0LmQociwiUkFORE9NIixmdW5jdGlvbigpe3JldHVybiBhfSksdC5kKHIsInNldE1hdHJpeEFycmF5VHlwZSIsZnVuY3Rpb24oKXtyZXR1cm4gc30pLHQuZChyLCJ0b1JhZGlhbiIsZnVuY3Rpb24oKXtyZXR1cm4gb30pLHQuZChyLCJlcXVhbHMiLGZ1bmN0aW9uKCl7cmV0dXJuIGN9KTt2YXIgZT0xZS02LG49dHlwZW9mIEZsb2F0MzJBcnJheTwidSI/RmxvYXQzMkFycmF5OkFycmF5LGE9TWF0aC5yYW5kb207ZnVuY3Rpb24gcyhtKXtuPW19dmFyIGk9TWF0aC5QSS8xODA7ZnVuY3Rpb24gbyhtKXtyZXR1cm4gbSppfWZ1bmN0aW9uIGMobSx1KXtyZXR1cm4gTWF0aC5hYnMobS11KTw9ZSpNYXRoLm1heCgxLE1hdGguYWJzKG0pLE1hdGguYWJzKHUpKX1NYXRoLmh5cG90fHwoTWF0aC5oeXBvdD1mdW5jdGlvbigpe2Zvcih2YXIgbT0wLHU9YXJndW1lbnRzLmxlbmd0aDt1LS07KW0rPWFyZ3VtZW50c1t1XSphcmd1bWVudHNbdV07cmV0dXJuIE1hdGguc3FydChtKX0pfSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJjcmVhdGUiLGZ1bmN0aW9uKCl7cmV0dXJuIG59KSx0LmQociwiY2xvbmUiLGZ1bmN0aW9uKCl7cmV0dXJuIGF9KSx0LmQociwiY29weSIsZnVuY3Rpb24oKXtyZXR1cm4gc30pLHQuZChyLCJpZGVudGl0eSIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pLHQuZChyLCJmcm9tVmFsdWVzIixmdW5jdGlvbigpe3JldHVybiBvfSksdC5kKHIsInNldCIsZnVuY3Rpb24oKXtyZXR1cm4gY30pLHQuZChyLCJ0cmFuc3Bvc2UiLGZ1bmN0aW9uKCl7cmV0dXJuIG19KSx0LmQociwiaW52ZXJ0IixmdW5jdGlvbigpe3JldHVybiB1fSksdC5kKHIsImFkam9pbnQiLGZ1bmN0aW9uKCl7cmV0dXJuIHB9KSx0LmQociwiZGV0ZXJtaW5hbnQiLGZ1bmN0aW9uKCl7cmV0dXJuIHl9KSx0LmQociwibXVsdGlwbHkiLGZ1bmN0aW9uKCl7cmV0dXJuIE99KSx0LmQociwicm90YXRlIixmdW5jdGlvbigpe3JldHVybiB4fSksdC5kKHIsInNjYWxlIixmdW5jdGlvbigpe3JldHVybiB2fSksdC5kKHIsImZyb21Sb3RhdGlvbiIsZnVuY3Rpb24oKXtyZXR1cm4gVH0pLHQuZChyLCJmcm9tU2NhbGluZyIsZnVuY3Rpb24oKXtyZXR1cm4gbH0pLHQuZChyLCJzdHIiLGZ1bmN0aW9uKCl7cmV0dXJuIGh9KSx0LmQociwiZnJvYiIsZnVuY3Rpb24oKXtyZXR1cm4gZn0pLHQuZChyLCJMRFUiLGZ1bmN0aW9uKCl7cmV0dXJuIGd9KSx0LmQociwiYWRkIixmdW5jdGlvbigpe3JldHVybiBNfSksdC5kKHIsInN1YnRyYWN0IixmdW5jdGlvbigpe3JldHVybiBBfSksdC5kKHIsImV4YWN0RXF1YWxzIixmdW5jdGlvbigpe3JldHVybiBDfSksdC5kKHIsImVxdWFscyIsZnVuY3Rpb24oKXtyZXR1cm4gYn0pLHQuZChyLCJtdWx0aXBseVNjYWxhciIsZnVuY3Rpb24oKXtyZXR1cm4gRX0pLHQuZChyLCJtdWx0aXBseVNjYWxhckFuZEFkZCIsZnVuY3Rpb24oKXtyZXR1cm4gTH0pLHQuZChyLCJtdWwiLGZ1bmN0aW9uKCl7cmV0dXJuIER9KSx0LmQociwic3ViIixmdW5jdGlvbigpe3JldHVybiBJfSk7dmFyIGU9dCgyKTtmdW5jdGlvbiBuKCl7dmFyIFI9bmV3IGUuQVJSQVlfVFlQRSg0KTtyZXR1cm4gZS5BUlJBWV9UWVBFIT1GbG9hdDMyQXJyYXkmJihSWzFdPTAsUlsyXT0wKSxSWzBdPTEsUlszXT0xLFJ9ZnVuY3Rpb24gYShSKXt2YXIgQj1uZXcgZS5BUlJBWV9UWVBFKDQpO3JldHVybiBCWzBdPVJbMF0sQlsxXT1SWzFdLEJbMl09UlsyXSxCWzNdPVJbM10sQn1mdW5jdGlvbiBzKFIsQil7cmV0dXJuIFJbMF09QlswXSxSWzFdPUJbMV0sUlsyXT1CWzJdLFJbM109QlszXSxSfWZ1bmN0aW9uIGkoUil7cmV0dXJuIFJbMF09MSxSWzFdPTAsUlsyXT0wLFJbM109MSxSfWZ1bmN0aW9uIG8oUixCLHosSyl7dmFyIFE9bmV3IGUuQVJSQVlfVFlQRSg0KTtyZXR1cm4gUVswXT1SLFFbMV09QixRWzJdPXosUVszXT1LLFF9ZnVuY3Rpb24gYyhSLEIseixLLFEpe3JldHVybiBSWzBdPUIsUlsxXT16LFJbMl09SyxSWzNdPVEsUn1mdW5jdGlvbiBtKFIsQil7aWYoUj09PUIpe3ZhciB6PUJbMV07UlsxXT1CWzJdLFJbMl09en1lbHNlIFJbMF09QlswXSxSWzFdPUJbMl0sUlsyXT1CWzFdLFJbM109QlszXTtyZXR1cm4gUn1mdW5jdGlvbiB1KFIsQil7dmFyIHo9QlswXSxLPUJbMV0sUT1CWzJdLF89QlszXSxqPXoqXy1RKks7cmV0dXJuIGo/KGo9MS9qLFJbMF09XypqLFJbMV09LUsqaixSWzJdPS1RKmosUlszXT16KmosUik6bnVsbH1mdW5jdGlvbiBwKFIsQil7dmFyIHo9QlswXTtyZXR1cm4gUlswXT1CWzNdLFJbMV09LUJbMV0sUlsyXT0tQlsyXSxSWzNdPXosUn1mdW5jdGlvbiB5KFIpe3JldHVybiBSWzBdKlJbM10tUlsyXSpSWzFdfWZ1bmN0aW9uIE8oUixCLHope3ZhciBLPUJbMF0sUT1CWzFdLF89QlsyXSxqPUJbM10sRz16WzBdLFg9elsxXSxaPXpbMl0sdHQ9elszXTtyZXR1cm4gUlswXT1LKkcrXypYLFJbMV09USpHK2oqWCxSWzJdPUsqWitfKnR0LFJbM109USpaK2oqdHQsUn1mdW5jdGlvbiB4KFIsQix6KXt2YXIgSz1CWzBdLFE9QlsxXSxfPUJbMl0saj1CWzNdLEc9TWF0aC5zaW4oeiksWD1NYXRoLmNvcyh6KTtyZXR1cm4gUlswXT1LKlgrXypHLFJbMV09USpYK2oqRyxSWzJdPUsqLUcrXypYLFJbM109USotRytqKlgsUn1mdW5jdGlvbiB2KFIsQix6KXt2YXIgSz1CWzBdLFE9QlsxXSxfPUJbMl0saj1CWzNdLEc9elswXSxYPXpbMV07cmV0dXJuIFJbMF09SypHLFJbMV09USpHLFJbMl09XypYLFJbM109aipYLFJ9ZnVuY3Rpb24gVChSLEIpe3ZhciB6PU1hdGguc2luKEIpLEs9TWF0aC5jb3MoQik7cmV0dXJuIFJbMF09SyxSWzFdPXosUlsyXT0teixSWzNdPUssUn1mdW5jdGlvbiBsKFIsQil7cmV0dXJuIFJbMF09QlswXSxSWzFdPTAsUlsyXT0wLFJbM109QlsxXSxSfWZ1bmN0aW9uIGgoUil7cmV0dXJuIm1hdDIoIitSWzBdKyIsICIrUlsxXSsiLCAiK1JbMl0rIiwgIitSWzNdKyIpIn1mdW5jdGlvbiBmKFIpe3JldHVybiBNYXRoLmh5cG90KFJbMF0sUlsxXSxSWzJdLFJbM10pfWZ1bmN0aW9uIGcoUixCLHosSyl7cmV0dXJuIFJbMl09S1syXS9LWzBdLHpbMF09S1swXSx6WzFdPUtbMV0selszXT1LWzNdLVJbMl0qelsxXSxbUixCLHpdfWZ1bmN0aW9uIE0oUixCLHope3JldHVybiBSWzBdPUJbMF0relswXSxSWzFdPUJbMV0relsxXSxSWzJdPUJbMl0relsyXSxSWzNdPUJbM10relszXSxSfWZ1bmN0aW9uIEEoUixCLHope3JldHVybiBSWzBdPUJbMF0telswXSxSWzFdPUJbMV0telsxXSxSWzJdPUJbMl0telsyXSxSWzNdPUJbM10telszXSxSfWZ1bmN0aW9uIEMoUixCKXtyZXR1cm4gUlswXT09PUJbMF0mJlJbMV09PT1CWzFdJiZSWzJdPT09QlsyXSYmUlszXT09PUJbM119ZnVuY3Rpb24gYihSLEIpe3ZhciB6PVJbMF0sSz1SWzFdLFE9UlsyXSxfPVJbM10saj1CWzBdLEc9QlsxXSxYPUJbMl0sWj1CWzNdO3JldHVybiBNYXRoLmFicyh6LWopPD1lLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyh6KSxNYXRoLmFicyhqKSkmJk1hdGguYWJzKEstRyk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKEspLE1hdGguYWJzKEcpKSYmTWF0aC5hYnMoUS1YKTw9ZS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoUSksTWF0aC5hYnMoWCkpJiZNYXRoLmFicyhfLVopPD1lLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhfKSxNYXRoLmFicyhaKSl9ZnVuY3Rpb24gRShSLEIseil7cmV0dXJuIFJbMF09QlswXSp6LFJbMV09QlsxXSp6LFJbMl09QlsyXSp6LFJbM109QlszXSp6LFJ9ZnVuY3Rpb24gTChSLEIseixLKXtyZXR1cm4gUlswXT1CWzBdK3pbMF0qSyxSWzFdPUJbMV0relsxXSpLLFJbMl09QlsyXSt6WzJdKkssUlszXT1CWzNdK3pbM10qSyxSfXZhciBEPU8sST1BfSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJjcmVhdGUiLGZ1bmN0aW9uKCl7cmV0dXJuIG59KSx0LmQociwiY2xvbmUiLGZ1bmN0aW9uKCl7cmV0dXJuIGF9KSx0LmQociwiY29weSIsZnVuY3Rpb24oKXtyZXR1cm4gc30pLHQuZChyLCJpZGVudGl0eSIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pLHQuZChyLCJmcm9tVmFsdWVzIixmdW5jdGlvbigpe3JldHVybiBvfSksdC5kKHIsInNldCIsZnVuY3Rpb24oKXtyZXR1cm4gY30pLHQuZChyLCJpbnZlcnQiLGZ1bmN0aW9uKCl7cmV0dXJuIG19KSx0LmQociwiZGV0ZXJtaW5hbnQiLGZ1bmN0aW9uKCl7cmV0dXJuIHV9KSx0LmQociwibXVsdGlwbHkiLGZ1bmN0aW9uKCl7cmV0dXJuIHB9KSx0LmQociwicm90YXRlIixmdW5jdGlvbigpe3JldHVybiB5fSksdC5kKHIsInNjYWxlIixmdW5jdGlvbigpe3JldHVybiBPfSksdC5kKHIsInRyYW5zbGF0ZSIsZnVuY3Rpb24oKXtyZXR1cm4geH0pLHQuZChyLCJmcm9tUm90YXRpb24iLGZ1bmN0aW9uKCl7cmV0dXJuIHZ9KSx0LmQociwiZnJvbVNjYWxpbmciLGZ1bmN0aW9uKCl7cmV0dXJuIFR9KSx0LmQociwiZnJvbVRyYW5zbGF0aW9uIixmdW5jdGlvbigpe3JldHVybiBsfSksdC5kKHIsInN0ciIsZnVuY3Rpb24oKXtyZXR1cm4gaH0pLHQuZChyLCJmcm9iIixmdW5jdGlvbigpe3JldHVybiBmfSksdC5kKHIsImFkZCIsZnVuY3Rpb24oKXtyZXR1cm4gZ30pLHQuZChyLCJzdWJ0cmFjdCIsZnVuY3Rpb24oKXtyZXR1cm4gTX0pLHQuZChyLCJtdWx0aXBseVNjYWxhciIsZnVuY3Rpb24oKXtyZXR1cm4gQX0pLHQuZChyLCJtdWx0aXBseVNjYWxhckFuZEFkZCIsZnVuY3Rpb24oKXtyZXR1cm4gQ30pLHQuZChyLCJleGFjdEVxdWFscyIsZnVuY3Rpb24oKXtyZXR1cm4gYn0pLHQuZChyLCJlcXVhbHMiLGZ1bmN0aW9uKCl7cmV0dXJuIEV9KSx0LmQociwibXVsIixmdW5jdGlvbigpe3JldHVybiBMfSksdC5kKHIsInN1YiIsZnVuY3Rpb24oKXtyZXR1cm4gRH0pO3ZhciBlPXQoMik7ZnVuY3Rpb24gbigpe3ZhciBJPW5ldyBlLkFSUkFZX1RZUEUoNik7cmV0dXJuIGUuQVJSQVlfVFlQRSE9RmxvYXQzMkFycmF5JiYoSVsxXT0wLElbMl09MCxJWzRdPTAsSVs1XT0wKSxJWzBdPTEsSVszXT0xLEl9ZnVuY3Rpb24gYShJKXt2YXIgUj1uZXcgZS5BUlJBWV9UWVBFKDYpO3JldHVybiBSWzBdPUlbMF0sUlsxXT1JWzFdLFJbMl09SVsyXSxSWzNdPUlbM10sUls0XT1JWzRdLFJbNV09SVs1XSxSfWZ1bmN0aW9uIHMoSSxSKXtyZXR1cm4gSVswXT1SWzBdLElbMV09UlsxXSxJWzJdPVJbMl0sSVszXT1SWzNdLElbNF09Uls0XSxJWzVdPVJbNV0sSX1mdW5jdGlvbiBpKEkpe3JldHVybiBJWzBdPTEsSVsxXT0wLElbMl09MCxJWzNdPTEsSVs0XT0wLElbNV09MCxJfWZ1bmN0aW9uIG8oSSxSLEIseixLLFEpe3ZhciBfPW5ldyBlLkFSUkFZX1RZUEUoNik7cmV0dXJuIF9bMF09SSxfWzFdPVIsX1syXT1CLF9bM109eixfWzRdPUssX1s1XT1RLF99ZnVuY3Rpb24gYyhJLFIsQix6LEssUSxfKXtyZXR1cm4gSVswXT1SLElbMV09QixJWzJdPXosSVszXT1LLElbNF09USxJWzVdPV8sSX1mdW5jdGlvbiBtKEksUil7dmFyIEI9UlswXSx6PVJbMV0sSz1SWzJdLFE9UlszXSxfPVJbNF0saj1SWzVdLEc9QipRLXoqSztyZXR1cm4gRz8oRz0xL0csSVswXT1RKkcsSVsxXT0teipHLElbMl09LUsqRyxJWzNdPUIqRyxJWzRdPShLKmotUSpfKSpHLElbNV09KHoqXy1CKmopKkcsSSk6bnVsbH1mdW5jdGlvbiB1KEkpe3JldHVybiBJWzBdKklbM10tSVsxXSpJWzJdfWZ1bmN0aW9uIHAoSSxSLEIpe3ZhciB6PVJbMF0sSz1SWzFdLFE9UlsyXSxfPVJbM10saj1SWzRdLEc9Uls1XSxYPUJbMF0sWj1CWzFdLHR0PUJbMl0sbnQ9QlszXSxxPUJbNF0sZHQ9Qls1XTtyZXR1cm4gSVswXT16KlgrUSpaLElbMV09SypYK18qWixJWzJdPXoqdHQrUSpudCxJWzNdPUsqdHQrXypudCxJWzRdPXoqcStRKmR0K2osSVs1XT1LKnErXypkdCtHLEl9ZnVuY3Rpb24geShJLFIsQil7dmFyIHo9UlswXSxLPVJbMV0sUT1SWzJdLF89UlszXSxqPVJbNF0sRz1SWzVdLFg9TWF0aC5zaW4oQiksWj1NYXRoLmNvcyhCKTtyZXR1cm4gSVswXT16KlorUSpYLElbMV09SypaK18qWCxJWzJdPXoqLVgrUSpaLElbM109SyotWCtfKlosSVs0XT1qLElbNV09RyxJfWZ1bmN0aW9uIE8oSSxSLEIpe3ZhciB6PVJbMF0sSz1SWzFdLFE9UlsyXSxfPVJbM10saj1SWzRdLEc9Uls1XSxYPUJbMF0sWj1CWzFdO3JldHVybiBJWzBdPXoqWCxJWzFdPUsqWCxJWzJdPVEqWixJWzNdPV8qWixJWzRdPWosSVs1XT1HLEl9ZnVuY3Rpb24geChJLFIsQil7dmFyIHo9UlswXSxLPVJbMV0sUT1SWzJdLF89UlszXSxqPVJbNF0sRz1SWzVdLFg9QlswXSxaPUJbMV07cmV0dXJuIElbMF09eixJWzFdPUssSVsyXT1RLElbM109XyxJWzRdPXoqWCtRKloraixJWzVdPUsqWCtfKlorRyxJfWZ1bmN0aW9uIHYoSSxSKXt2YXIgQj1NYXRoLnNpbihSKSx6PU1hdGguY29zKFIpO3JldHVybiBJWzBdPXosSVsxXT1CLElbMl09LUIsSVszXT16LElbNF09MCxJWzVdPTAsSX1mdW5jdGlvbiBUKEksUil7cmV0dXJuIElbMF09UlswXSxJWzFdPTAsSVsyXT0wLElbM109UlsxXSxJWzRdPTAsSVs1XT0wLEl9ZnVuY3Rpb24gbChJLFIpe3JldHVybiBJWzBdPTEsSVsxXT0wLElbMl09MCxJWzNdPTEsSVs0XT1SWzBdLElbNV09UlsxXSxJfWZ1bmN0aW9uIGgoSSl7cmV0dXJuIm1hdDJkKCIrSVswXSsiLCAiK0lbMV0rIiwgIitJWzJdKyIsICIrSVszXSsiLCAiK0lbNF0rIiwgIitJWzVdKyIpIn1mdW5jdGlvbiBmKEkpe3JldHVybiBNYXRoLmh5cG90KElbMF0sSVsxXSxJWzJdLElbM10sSVs0XSxJWzVdLDEpfWZ1bmN0aW9uIGcoSSxSLEIpe3JldHVybiBJWzBdPVJbMF0rQlswXSxJWzFdPVJbMV0rQlsxXSxJWzJdPVJbMl0rQlsyXSxJWzNdPVJbM10rQlszXSxJWzRdPVJbNF0rQls0XSxJWzVdPVJbNV0rQls1XSxJfWZ1bmN0aW9uIE0oSSxSLEIpe3JldHVybiBJWzBdPVJbMF0tQlswXSxJWzFdPVJbMV0tQlsxXSxJWzJdPVJbMl0tQlsyXSxJWzNdPVJbM10tQlszXSxJWzRdPVJbNF0tQls0XSxJWzVdPVJbNV0tQls1XSxJfWZ1bmN0aW9uIEEoSSxSLEIpe3JldHVybiBJWzBdPVJbMF0qQixJWzFdPVJbMV0qQixJWzJdPVJbMl0qQixJWzNdPVJbM10qQixJWzRdPVJbNF0qQixJWzVdPVJbNV0qQixJfWZ1bmN0aW9uIEMoSSxSLEIseil7cmV0dXJuIElbMF09UlswXStCWzBdKnosSVsxXT1SWzFdK0JbMV0qeixJWzJdPVJbMl0rQlsyXSp6LElbM109UlszXStCWzNdKnosSVs0XT1SWzRdK0JbNF0qeixJWzVdPVJbNV0rQls1XSp6LEl9ZnVuY3Rpb24gYihJLFIpe3JldHVybiBJWzBdPT09UlswXSYmSVsxXT09PVJbMV0mJklbMl09PT1SWzJdJiZJWzNdPT09UlszXSYmSVs0XT09PVJbNF0mJklbNV09PT1SWzVdfWZ1bmN0aW9uIEUoSSxSKXt2YXIgQj1JWzBdLHo9SVsxXSxLPUlbMl0sUT1JWzNdLF89SVs0XSxqPUlbNV0sRz1SWzBdLFg9UlsxXSxaPVJbMl0sdHQ9UlszXSxudD1SWzRdLHE9Uls1XTtyZXR1cm4gTWF0aC5hYnMoQi1HKTw9ZS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoQiksTWF0aC5hYnMoRykpJiZNYXRoLmFicyh6LVgpPD1lLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyh6KSxNYXRoLmFicyhYKSkmJk1hdGguYWJzKEstWik8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKEspLE1hdGguYWJzKFopKSYmTWF0aC5hYnMoUS10dCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKFEpLE1hdGguYWJzKHR0KSkmJk1hdGguYWJzKF8tbnQpPD1lLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhfKSxNYXRoLmFicyhudCkpJiZNYXRoLmFicyhqLXEpPD1lLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhqKSxNYXRoLmFicyhxKSl9dmFyIEw9cCxEPU19LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImNyZWF0ZSIsZnVuY3Rpb24oKXtyZXR1cm4gbn0pLHQuZChyLCJmcm9tTWF0NCIsZnVuY3Rpb24oKXtyZXR1cm4gYX0pLHQuZChyLCJjbG9uZSIsZnVuY3Rpb24oKXtyZXR1cm4gc30pLHQuZChyLCJjb3B5IixmdW5jdGlvbigpe3JldHVybiBpfSksdC5kKHIsImZyb21WYWx1ZXMiLGZ1bmN0aW9uKCl7cmV0dXJuIG99KSx0LmQociwic2V0IixmdW5jdGlvbigpe3JldHVybiBjfSksdC5kKHIsImlkZW50aXR5IixmdW5jdGlvbigpe3JldHVybiBtfSksdC5kKHIsInRyYW5zcG9zZSIsZnVuY3Rpb24oKXtyZXR1cm4gdX0pLHQuZChyLCJpbnZlcnQiLGZ1bmN0aW9uKCl7cmV0dXJuIHB9KSx0LmQociwiYWRqb2ludCIsZnVuY3Rpb24oKXtyZXR1cm4geX0pLHQuZChyLCJkZXRlcm1pbmFudCIsZnVuY3Rpb24oKXtyZXR1cm4gT30pLHQuZChyLCJtdWx0aXBseSIsZnVuY3Rpb24oKXtyZXR1cm4geH0pLHQuZChyLCJ0cmFuc2xhdGUiLGZ1bmN0aW9uKCl7cmV0dXJuIHZ9KSx0LmQociwicm90YXRlIixmdW5jdGlvbigpe3JldHVybiBUfSksdC5kKHIsInNjYWxlIixmdW5jdGlvbigpe3JldHVybiBsfSksdC5kKHIsImZyb21UcmFuc2xhdGlvbiIsZnVuY3Rpb24oKXtyZXR1cm4gaH0pLHQuZChyLCJmcm9tUm90YXRpb24iLGZ1bmN0aW9uKCl7cmV0dXJuIGZ9KSx0LmQociwiZnJvbVNjYWxpbmciLGZ1bmN0aW9uKCl7cmV0dXJuIGd9KSx0LmQociwiZnJvbU1hdDJkIixmdW5jdGlvbigpe3JldHVybiBNfSksdC5kKHIsImZyb21RdWF0IixmdW5jdGlvbigpe3JldHVybiBBfSksdC5kKHIsIm5vcm1hbEZyb21NYXQ0IixmdW5jdGlvbigpe3JldHVybiBDfSksdC5kKHIsInByb2plY3Rpb24iLGZ1bmN0aW9uKCl7cmV0dXJuIGJ9KSx0LmQociwic3RyIixmdW5jdGlvbigpe3JldHVybiBFfSksdC5kKHIsImZyb2IiLGZ1bmN0aW9uKCl7cmV0dXJuIEx9KSx0LmQociwiYWRkIixmdW5jdGlvbigpe3JldHVybiBEfSksdC5kKHIsInN1YnRyYWN0IixmdW5jdGlvbigpe3JldHVybiBJfSksdC5kKHIsIm11bHRpcGx5U2NhbGFyIixmdW5jdGlvbigpe3JldHVybiBSfSksdC5kKHIsIm11bHRpcGx5U2NhbGFyQW5kQWRkIixmdW5jdGlvbigpe3JldHVybiBCfSksdC5kKHIsImV4YWN0RXF1YWxzIixmdW5jdGlvbigpe3JldHVybiB6fSksdC5kKHIsImVxdWFscyIsZnVuY3Rpb24oKXtyZXR1cm4gS30pLHQuZChyLCJtdWwiLGZ1bmN0aW9uKCl7cmV0dXJuIFF9KSx0LmQociwic3ViIixmdW5jdGlvbigpe3JldHVybiBffSk7dmFyIGU9dCgyKTtmdW5jdGlvbiBuKCl7dmFyIGo9bmV3IGUuQVJSQVlfVFlQRSg5KTtyZXR1cm4gZS5BUlJBWV9UWVBFIT1GbG9hdDMyQXJyYXkmJihqWzFdPTAsalsyXT0wLGpbM109MCxqWzVdPTAsals2XT0wLGpbN109MCksalswXT0xLGpbNF09MSxqWzhdPTEsan1mdW5jdGlvbiBhKGosRyl7cmV0dXJuIGpbMF09R1swXSxqWzFdPUdbMV0salsyXT1HWzJdLGpbM109R1s0XSxqWzRdPUdbNV0sals1XT1HWzZdLGpbNl09R1s4XSxqWzddPUdbOV0sals4XT1HWzEwXSxqfWZ1bmN0aW9uIHMoail7dmFyIEc9bmV3IGUuQVJSQVlfVFlQRSg5KTtyZXR1cm4gR1swXT1qWzBdLEdbMV09alsxXSxHWzJdPWpbMl0sR1szXT1qWzNdLEdbNF09als0XSxHWzVdPWpbNV0sR1s2XT1qWzZdLEdbN109als3XSxHWzhdPWpbOF0sR31mdW5jdGlvbiBpKGosRyl7cmV0dXJuIGpbMF09R1swXSxqWzFdPUdbMV0salsyXT1HWzJdLGpbM109R1szXSxqWzRdPUdbNF0sals1XT1HWzVdLGpbNl09R1s2XSxqWzddPUdbN10sals4XT1HWzhdLGp9ZnVuY3Rpb24gbyhqLEcsWCxaLHR0LG50LHEsZHQsdXQpe3ZhciBXPW5ldyBlLkFSUkFZX1RZUEUoOSk7cmV0dXJuIFdbMF09aixXWzFdPUcsV1syXT1YLFdbM109WixXWzRdPXR0LFdbNV09bnQsV1s2XT1xLFdbN109ZHQsV1s4XT11dCxXfWZ1bmN0aW9uIGMoaixHLFgsWix0dCxudCxxLGR0LHV0LFcpe3JldHVybiBqWzBdPUcsalsxXT1YLGpbMl09WixqWzNdPXR0LGpbNF09bnQsals1XT1xLGpbNl09ZHQsals3XT11dCxqWzhdPVcsan1mdW5jdGlvbiBtKGope3JldHVybiBqWzBdPTEsalsxXT0wLGpbMl09MCxqWzNdPTAsals0XT0xLGpbNV09MCxqWzZdPTAsals3XT0wLGpbOF09MSxqfWZ1bmN0aW9uIHUoaixHKXtpZihqPT09Ryl7dmFyIFg9R1sxXSxaPUdbMl0sdHQ9R1s1XTtqWzFdPUdbM10salsyXT1HWzZdLGpbM109WCxqWzVdPUdbN10sals2XT1aLGpbN109dHR9ZWxzZSBqWzBdPUdbMF0salsxXT1HWzNdLGpbMl09R1s2XSxqWzNdPUdbMV0sals0XT1HWzRdLGpbNV09R1s3XSxqWzZdPUdbMl0sals3XT1HWzVdLGpbOF09R1s4XTtyZXR1cm4gan1mdW5jdGlvbiBwKGosRyl7dmFyIFg9R1swXSxaPUdbMV0sdHQ9R1syXSxudD1HWzNdLHE9R1s0XSxkdD1HWzVdLHV0PUdbNl0sVz1HWzddLEY9R1s4XSxWPUYqcS1kdCpXLEo9LUYqbnQrZHQqdXQsTj1XKm50LXEqdXQsJD1YKlYrWipKK3R0Kk47cmV0dXJuICQ/KCQ9MS8kLGpbMF09ViokLGpbMV09KC1GKlordHQqVykqJCxqWzJdPShkdCpaLXR0KnEpKiQsalszXT1KKiQsals0XT0oRipYLXR0KnV0KSokLGpbNV09KC1kdCpYK3R0Km50KSokLGpbNl09TiokLGpbN109KC1XKlgrWip1dCkqJCxqWzhdPShxKlgtWipudCkqJCxqKTpudWxsfWZ1bmN0aW9uIHkoaixHKXt2YXIgWD1HWzBdLFo9R1sxXSx0dD1HWzJdLG50PUdbM10scT1HWzRdLGR0PUdbNV0sdXQ9R1s2XSxXPUdbN10sRj1HWzhdO3JldHVybiBqWzBdPXEqRi1kdCpXLGpbMV09dHQqVy1aKkYsalsyXT1aKmR0LXR0KnEsalszXT1kdCp1dC1udCpGLGpbNF09WCpGLXR0KnV0LGpbNV09dHQqbnQtWCpkdCxqWzZdPW50KlctcSp1dCxqWzddPVoqdXQtWCpXLGpbOF09WCpxLVoqbnQsan1mdW5jdGlvbiBPKGope3ZhciBHPWpbMF0sWD1qWzFdLFo9alsyXSx0dD1qWzNdLG50PWpbNF0scT1qWzVdLGR0PWpbNl0sdXQ9als3XSxXPWpbOF07cmV0dXJuIEcqKFcqbnQtcSp1dCkrWCooLVcqdHQrcSpkdCkrWioodXQqdHQtbnQqZHQpfWZ1bmN0aW9uIHgoaixHLFgpe3ZhciBaPUdbMF0sdHQ9R1sxXSxudD1HWzJdLHE9R1szXSxkdD1HWzRdLHV0PUdbNV0sVz1HWzZdLEY9R1s3XSxWPUdbOF0sSj1YWzBdLE49WFsxXSwkPVhbMl0sUz1YWzNdLFA9WFs0XSx3PVhbNV0sVT1YWzZdLEg9WFs3XSxZPVhbOF07cmV0dXJuIGpbMF09SipaK04qcSskKlcsalsxXT1KKnR0K04qZHQrJCpGLGpbMl09SipudCtOKnV0KyQqVixqWzNdPVMqWitQKnErdypXLGpbNF09Uyp0dCtQKmR0K3cqRixqWzVdPVMqbnQrUCp1dCt3KlYsals2XT1VKlorSCpxK1kqVyxqWzddPVUqdHQrSCpkdCtZKkYsals4XT1VKm50K0gqdXQrWSpWLGp9ZnVuY3Rpb24gdihqLEcsWCl7dmFyIFo9R1swXSx0dD1HWzFdLG50PUdbMl0scT1HWzNdLGR0PUdbNF0sdXQ9R1s1XSxXPUdbNl0sRj1HWzddLFY9R1s4XSxKPVhbMF0sTj1YWzFdO3JldHVybiBqWzBdPVosalsxXT10dCxqWzJdPW50LGpbM109cSxqWzRdPWR0LGpbNV09dXQsals2XT1KKlorTipxK1csals3XT1KKnR0K04qZHQrRixqWzhdPUoqbnQrTip1dCtWLGp9ZnVuY3Rpb24gVChqLEcsWCl7dmFyIFo9R1swXSx0dD1HWzFdLG50PUdbMl0scT1HWzNdLGR0PUdbNF0sdXQ9R1s1XSxXPUdbNl0sRj1HWzddLFY9R1s4XSxKPU1hdGguc2luKFgpLE49TWF0aC5jb3MoWCk7cmV0dXJuIGpbMF09TipaK0oqcSxqWzFdPU4qdHQrSipkdCxqWzJdPU4qbnQrSip1dCxqWzNdPU4qcS1KKlosals0XT1OKmR0LUoqdHQsals1XT1OKnV0LUoqbnQsals2XT1XLGpbN109RixqWzhdPVYsan1mdW5jdGlvbiBsKGosRyxYKXt2YXIgWj1YWzBdLHR0PVhbMV07cmV0dXJuIGpbMF09WipHWzBdLGpbMV09WipHWzFdLGpbMl09WipHWzJdLGpbM109dHQqR1szXSxqWzRdPXR0KkdbNF0sals1XT10dCpHWzVdLGpbNl09R1s2XSxqWzddPUdbN10sals4XT1HWzhdLGp9ZnVuY3Rpb24gaChqLEcpe3JldHVybiBqWzBdPTEsalsxXT0wLGpbMl09MCxqWzNdPTAsals0XT0xLGpbNV09MCxqWzZdPUdbMF0sals3XT1HWzFdLGpbOF09MSxqfWZ1bmN0aW9uIGYoaixHKXt2YXIgWD1NYXRoLnNpbihHKSxaPU1hdGguY29zKEcpO3JldHVybiBqWzBdPVosalsxXT1YLGpbMl09MCxqWzNdPS1YLGpbNF09WixqWzVdPTAsals2XT0wLGpbN109MCxqWzhdPTEsan1mdW5jdGlvbiBnKGosRyl7cmV0dXJuIGpbMF09R1swXSxqWzFdPTAsalsyXT0wLGpbM109MCxqWzRdPUdbMV0sals1XT0wLGpbNl09MCxqWzddPTAsals4XT0xLGp9ZnVuY3Rpb24gTShqLEcpe3JldHVybiBqWzBdPUdbMF0salsxXT1HWzFdLGpbMl09MCxqWzNdPUdbMl0sals0XT1HWzNdLGpbNV09MCxqWzZdPUdbNF0sals3XT1HWzVdLGpbOF09MSxqfWZ1bmN0aW9uIEEoaixHKXt2YXIgWD1HWzBdLFo9R1sxXSx0dD1HWzJdLG50PUdbM10scT1YK1gsZHQ9WitaLHV0PXR0K3R0LFc9WCpxLEY9WipxLFY9WipkdCxKPXR0KnEsTj10dCpkdCwkPXR0KnV0LFM9bnQqcSxQPW50KmR0LHc9bnQqdXQ7cmV0dXJuIGpbMF09MS1WLSQsalszXT1GLXcsals2XT1KK1AsalsxXT1GK3csals0XT0xLVctJCxqWzddPU4tUyxqWzJdPUotUCxqWzVdPU4rUyxqWzhdPTEtVy1WLGp9ZnVuY3Rpb24gQyhqLEcpe3ZhciBYPUdbMF0sWj1HWzFdLHR0PUdbMl0sbnQ9R1szXSxxPUdbNF0sZHQ9R1s1XSx1dD1HWzZdLFc9R1s3XSxGPUdbOF0sVj1HWzldLEo9R1sxMF0sTj1HWzExXSwkPUdbMTJdLFM9R1sxM10sUD1HWzE0XSx3PUdbMTVdLFU9WCpkdC1aKnEsSD1YKnV0LXR0KnEsWT1YKlctbnQqcSxrPVoqdXQtdHQqZHQscnQ9WipXLW50KmR0LGl0PXR0KlctbnQqdXQsY3Q9RipTLVYqJCxodD1GKlAtSiokLGF0PUYqdy1OKiQsb3Q9VipQLUoqUyxmdD1WKnctTipTLG10PUoqdy1OKlAsdnQ9VSptdC1IKmZ0K1kqb3QrayphdC1ydCpodCtpdCpjdDtyZXR1cm4gdnQ/KHZ0PTEvdnQsalswXT0oZHQqbXQtdXQqZnQrVypvdCkqdnQsalsxXT0odXQqYXQtcSptdC1XKmh0KSp2dCxqWzJdPShxKmZ0LWR0KmF0K1cqY3QpKnZ0LGpbM109KHR0KmZ0LVoqbXQtbnQqb3QpKnZ0LGpbNF09KFgqbXQtdHQqYXQrbnQqaHQpKnZ0LGpbNV09KFoqYXQtWCpmdC1udCpjdCkqdnQsals2XT0oUyppdC1QKnJ0K3cqaykqdnQsals3XT0oUCpZLSQqaXQtdypIKSp2dCxqWzhdPSgkKnJ0LVMqWSt3KlUpKnZ0LGopOm51bGx9ZnVuY3Rpb24gYihqLEcsWCl7cmV0dXJuIGpbMF09Mi9HLGpbMV09MCxqWzJdPTAsalszXT0wLGpbNF09LTIvWCxqWzVdPTAsals2XT0tMSxqWzddPTEsals4XT0xLGp9ZnVuY3Rpb24gRShqKXtyZXR1cm4ibWF0MygiK2pbMF0rIiwgIitqWzFdKyIsICIralsyXSsiLCAiK2pbM10rIiwgIitqWzRdKyIsICIrals1XSsiLCAiK2pbNl0rIiwgIitqWzddKyIsICIrals4XSsiKSJ9ZnVuY3Rpb24gTChqKXtyZXR1cm4gTWF0aC5oeXBvdChqWzBdLGpbMV0salsyXSxqWzNdLGpbNF0sals1XSxqWzZdLGpbN10sals4XSl9ZnVuY3Rpb24gRChqLEcsWCl7cmV0dXJuIGpbMF09R1swXStYWzBdLGpbMV09R1sxXStYWzFdLGpbMl09R1syXStYWzJdLGpbM109R1szXStYWzNdLGpbNF09R1s0XStYWzRdLGpbNV09R1s1XStYWzVdLGpbNl09R1s2XStYWzZdLGpbN109R1s3XStYWzddLGpbOF09R1s4XStYWzhdLGp9ZnVuY3Rpb24gSShqLEcsWCl7cmV0dXJuIGpbMF09R1swXS1YWzBdLGpbMV09R1sxXS1YWzFdLGpbMl09R1syXS1YWzJdLGpbM109R1szXS1YWzNdLGpbNF09R1s0XS1YWzRdLGpbNV09R1s1XS1YWzVdLGpbNl09R1s2XS1YWzZdLGpbN109R1s3XS1YWzddLGpbOF09R1s4XS1YWzhdLGp9ZnVuY3Rpb24gUihqLEcsWCl7cmV0dXJuIGpbMF09R1swXSpYLGpbMV09R1sxXSpYLGpbMl09R1syXSpYLGpbM109R1szXSpYLGpbNF09R1s0XSpYLGpbNV09R1s1XSpYLGpbNl09R1s2XSpYLGpbN109R1s3XSpYLGpbOF09R1s4XSpYLGp9ZnVuY3Rpb24gQihqLEcsWCxaKXtyZXR1cm4galswXT1HWzBdK1hbMF0qWixqWzFdPUdbMV0rWFsxXSpaLGpbMl09R1syXStYWzJdKlosalszXT1HWzNdK1hbM10qWixqWzRdPUdbNF0rWFs0XSpaLGpbNV09R1s1XStYWzVdKlosals2XT1HWzZdK1hbNl0qWixqWzddPUdbN10rWFs3XSpaLGpbOF09R1s4XStYWzhdKlosan1mdW5jdGlvbiB6KGosRyl7cmV0dXJuIGpbMF09PT1HWzBdJiZqWzFdPT09R1sxXSYmalsyXT09PUdbMl0mJmpbM109PT1HWzNdJiZqWzRdPT09R1s0XSYmals1XT09PUdbNV0mJmpbNl09PT1HWzZdJiZqWzddPT09R1s3XSYmals4XT09PUdbOF19ZnVuY3Rpb24gSyhqLEcpe3ZhciBYPWpbMF0sWj1qWzFdLHR0PWpbMl0sbnQ9alszXSxxPWpbNF0sZHQ9als1XSx1dD1qWzZdLFc9als3XSxGPWpbOF0sVj1HWzBdLEo9R1sxXSxOPUdbMl0sJD1HWzNdLFM9R1s0XSxQPUdbNV0sdz1HWzZdLFU9R1s3XSxIPUdbOF07cmV0dXJuIE1hdGguYWJzKFgtVik8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKFgpLE1hdGguYWJzKFYpKSYmTWF0aC5hYnMoWi1KKTw9ZS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoWiksTWF0aC5hYnMoSikpJiZNYXRoLmFicyh0dC1OKTw9ZS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnModHQpLE1hdGguYWJzKE4pKSYmTWF0aC5hYnMobnQtJCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKG50KSxNYXRoLmFicygkKSkmJk1hdGguYWJzKHEtUyk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHEpLE1hdGguYWJzKFMpKSYmTWF0aC5hYnMoZHQtUCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGR0KSxNYXRoLmFicyhQKSkmJk1hdGguYWJzKHV0LXcpPD1lLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyh1dCksTWF0aC5hYnModykpJiZNYXRoLmFicyhXLVUpPD1lLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhXKSxNYXRoLmFicyhVKSkmJk1hdGguYWJzKEYtSCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKEYpLE1hdGguYWJzKEgpKX12YXIgUT14LF89SX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiY3JlYXRlIixmdW5jdGlvbigpe3JldHVybiBufSksdC5kKHIsImNsb25lIixmdW5jdGlvbigpe3JldHVybiBhfSksdC5kKHIsImNvcHkiLGZ1bmN0aW9uKCl7cmV0dXJuIHN9KSx0LmQociwiZnJvbVZhbHVlcyIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pLHQuZChyLCJzZXQiLGZ1bmN0aW9uKCl7cmV0dXJuIG99KSx0LmQociwiaWRlbnRpdHkiLGZ1bmN0aW9uKCl7cmV0dXJuIGN9KSx0LmQociwidHJhbnNwb3NlIixmdW5jdGlvbigpe3JldHVybiBtfSksdC5kKHIsImludmVydCIsZnVuY3Rpb24oKXtyZXR1cm4gdX0pLHQuZChyLCJhZGpvaW50IixmdW5jdGlvbigpe3JldHVybiBwfSksdC5kKHIsImRldGVybWluYW50IixmdW5jdGlvbigpe3JldHVybiB5fSksdC5kKHIsIm11bHRpcGx5IixmdW5jdGlvbigpe3JldHVybiBPfSksdC5kKHIsInRyYW5zbGF0ZSIsZnVuY3Rpb24oKXtyZXR1cm4geH0pLHQuZChyLCJzY2FsZSIsZnVuY3Rpb24oKXtyZXR1cm4gdn0pLHQuZChyLCJyb3RhdGUiLGZ1bmN0aW9uKCl7cmV0dXJuIFR9KSx0LmQociwicm90YXRlWCIsZnVuY3Rpb24oKXtyZXR1cm4gbH0pLHQuZChyLCJyb3RhdGVZIixmdW5jdGlvbigpe3JldHVybiBofSksdC5kKHIsInJvdGF0ZVoiLGZ1bmN0aW9uKCl7cmV0dXJuIGZ9KSx0LmQociwiZnJvbVRyYW5zbGF0aW9uIixmdW5jdGlvbigpe3JldHVybiBnfSksdC5kKHIsImZyb21TY2FsaW5nIixmdW5jdGlvbigpe3JldHVybiBNfSksdC5kKHIsImZyb21Sb3RhdGlvbiIsZnVuY3Rpb24oKXtyZXR1cm4gQX0pLHQuZChyLCJmcm9tWFJvdGF0aW9uIixmdW5jdGlvbigpe3JldHVybiBDfSksdC5kKHIsImZyb21ZUm90YXRpb24iLGZ1bmN0aW9uKCl7cmV0dXJuIGJ9KSx0LmQociwiZnJvbVpSb3RhdGlvbiIsZnVuY3Rpb24oKXtyZXR1cm4gRX0pLHQuZChyLCJmcm9tUm90YXRpb25UcmFuc2xhdGlvbiIsZnVuY3Rpb24oKXtyZXR1cm4gTH0pLHQuZChyLCJmcm9tUXVhdDIiLGZ1bmN0aW9uKCl7cmV0dXJuIER9KSx0LmQociwiZ2V0VHJhbnNsYXRpb24iLGZ1bmN0aW9uKCl7cmV0dXJuIEl9KSx0LmQociwiZ2V0U2NhbGluZyIsZnVuY3Rpb24oKXtyZXR1cm4gUn0pLHQuZChyLCJnZXRSb3RhdGlvbiIsZnVuY3Rpb24oKXtyZXR1cm4gQn0pLHQuZChyLCJmcm9tUm90YXRpb25UcmFuc2xhdGlvblNjYWxlIixmdW5jdGlvbigpe3JldHVybiB6fSksdC5kKHIsImZyb21Sb3RhdGlvblRyYW5zbGF0aW9uU2NhbGVPcmlnaW4iLGZ1bmN0aW9uKCl7cmV0dXJuIEt9KSx0LmQociwiZnJvbVF1YXQiLGZ1bmN0aW9uKCl7cmV0dXJuIFF9KSx0LmQociwiZnJ1c3R1bSIsZnVuY3Rpb24oKXtyZXR1cm4gX30pLHQuZChyLCJwZXJzcGVjdGl2ZSIsZnVuY3Rpb24oKXtyZXR1cm4gan0pLHQuZChyLCJwZXJzcGVjdGl2ZUZyb21GaWVsZE9mVmlldyIsZnVuY3Rpb24oKXtyZXR1cm4gR30pLHQuZChyLCJvcnRobyIsZnVuY3Rpb24oKXtyZXR1cm4gWH0pLHQuZChyLCJsb29rQXQiLGZ1bmN0aW9uKCl7cmV0dXJuIFp9KSx0LmQociwidGFyZ2V0VG8iLGZ1bmN0aW9uKCl7cmV0dXJuIHR0fSksdC5kKHIsInN0ciIsZnVuY3Rpb24oKXtyZXR1cm4gbnR9KSx0LmQociwiZnJvYiIsZnVuY3Rpb24oKXtyZXR1cm4gcX0pLHQuZChyLCJhZGQiLGZ1bmN0aW9uKCl7cmV0dXJuIGR0fSksdC5kKHIsInN1YnRyYWN0IixmdW5jdGlvbigpe3JldHVybiB1dH0pLHQuZChyLCJtdWx0aXBseVNjYWxhciIsZnVuY3Rpb24oKXtyZXR1cm4gV30pLHQuZChyLCJtdWx0aXBseVNjYWxhckFuZEFkZCIsZnVuY3Rpb24oKXtyZXR1cm4gRn0pLHQuZChyLCJleGFjdEVxdWFscyIsZnVuY3Rpb24oKXtyZXR1cm4gVn0pLHQuZChyLCJlcXVhbHMiLGZ1bmN0aW9uKCl7cmV0dXJuIEp9KSx0LmQociwibXVsIixmdW5jdGlvbigpe3JldHVybiBOfSksdC5kKHIsInN1YiIsZnVuY3Rpb24oKXtyZXR1cm4gJH0pO3ZhciBlPXQoMik7ZnVuY3Rpb24gbigpe3ZhciBTPW5ldyBlLkFSUkFZX1RZUEUoMTYpO3JldHVybiBlLkFSUkFZX1RZUEUhPUZsb2F0MzJBcnJheSYmKFNbMV09MCxTWzJdPTAsU1szXT0wLFNbNF09MCxTWzZdPTAsU1s3XT0wLFNbOF09MCxTWzldPTAsU1sxMV09MCxTWzEyXT0wLFNbMTNdPTAsU1sxNF09MCksU1swXT0xLFNbNV09MSxTWzEwXT0xLFNbMTVdPTEsU31mdW5jdGlvbiBhKFMpe3ZhciBQPW5ldyBlLkFSUkFZX1RZUEUoMTYpO3JldHVybiBQWzBdPVNbMF0sUFsxXT1TWzFdLFBbMl09U1syXSxQWzNdPVNbM10sUFs0XT1TWzRdLFBbNV09U1s1XSxQWzZdPVNbNl0sUFs3XT1TWzddLFBbOF09U1s4XSxQWzldPVNbOV0sUFsxMF09U1sxMF0sUFsxMV09U1sxMV0sUFsxMl09U1sxMl0sUFsxM109U1sxM10sUFsxNF09U1sxNF0sUFsxNV09U1sxNV0sUH1mdW5jdGlvbiBzKFMsUCl7cmV0dXJuIFNbMF09UFswXSxTWzFdPVBbMV0sU1syXT1QWzJdLFNbM109UFszXSxTWzRdPVBbNF0sU1s1XT1QWzVdLFNbNl09UFs2XSxTWzddPVBbN10sU1s4XT1QWzhdLFNbOV09UFs5XSxTWzEwXT1QWzEwXSxTWzExXT1QWzExXSxTWzEyXT1QWzEyXSxTWzEzXT1QWzEzXSxTWzE0XT1QWzE0XSxTWzE1XT1QWzE1XSxTfWZ1bmN0aW9uIGkoUyxQLHcsVSxILFksayxydCxpdCxjdCxodCxhdCxvdCxmdCxtdCx2dCl7dmFyIHB0PW5ldyBlLkFSUkFZX1RZUEUoMTYpO3JldHVybiBwdFswXT1TLHB0WzFdPVAscHRbMl09dyxwdFszXT1VLHB0WzRdPUgscHRbNV09WSxwdFs2XT1rLHB0WzddPXJ0LHB0WzhdPWl0LHB0WzldPWN0LHB0WzEwXT1odCxwdFsxMV09YXQscHRbMTJdPW90LHB0WzEzXT1mdCxwdFsxNF09bXQscHRbMTVdPXZ0LHB0fWZ1bmN0aW9uIG8oUyxQLHcsVSxILFksayxydCxpdCxjdCxodCxhdCxvdCxmdCxtdCx2dCxwdCl7cmV0dXJuIFNbMF09UCxTWzFdPXcsU1syXT1VLFNbM109SCxTWzRdPVksU1s1XT1rLFNbNl09cnQsU1s3XT1pdCxTWzhdPWN0LFNbOV09aHQsU1sxMF09YXQsU1sxMV09b3QsU1sxMl09ZnQsU1sxM109bXQsU1sxNF09dnQsU1sxNV09cHQsU31mdW5jdGlvbiBjKFMpe3JldHVybiBTWzBdPTEsU1sxXT0wLFNbMl09MCxTWzNdPTAsU1s0XT0wLFNbNV09MSxTWzZdPTAsU1s3XT0wLFNbOF09MCxTWzldPTAsU1sxMF09MSxTWzExXT0wLFNbMTJdPTAsU1sxM109MCxTWzE0XT0wLFNbMTVdPTEsU31mdW5jdGlvbiBtKFMsUCl7aWYoUz09PVApe3ZhciB3PVBbMV0sVT1QWzJdLEg9UFszXSxZPVBbNl0saz1QWzddLHJ0PVBbMTFdO1NbMV09UFs0XSxTWzJdPVBbOF0sU1szXT1QWzEyXSxTWzRdPXcsU1s2XT1QWzldLFNbN109UFsxM10sU1s4XT1VLFNbOV09WSxTWzExXT1QWzE0XSxTWzEyXT1ILFNbMTNdPWssU1sxNF09cnR9ZWxzZSBTWzBdPVBbMF0sU1sxXT1QWzRdLFNbMl09UFs4XSxTWzNdPVBbMTJdLFNbNF09UFsxXSxTWzVdPVBbNV0sU1s2XT1QWzldLFNbN109UFsxM10sU1s4XT1QWzJdLFNbOV09UFs2XSxTWzEwXT1QWzEwXSxTWzExXT1QWzE0XSxTWzEyXT1QWzNdLFNbMTNdPVBbN10sU1sxNF09UFsxMV0sU1sxNV09UFsxNV07cmV0dXJuIFN9ZnVuY3Rpb24gdShTLFApe3ZhciB3PVBbMF0sVT1QWzFdLEg9UFsyXSxZPVBbM10saz1QWzRdLHJ0PVBbNV0saXQ9UFs2XSxjdD1QWzddLGh0PVBbOF0sYXQ9UFs5XSxvdD1QWzEwXSxmdD1QWzExXSxtdD1QWzEyXSx2dD1QWzEzXSxwdD1QWzE0XSx4dD1QWzE1XSxSdD13KnJ0LVUqayxFdD13Kml0LUgqayxQdD13KmN0LVkqayxBdD1VKml0LUgqcnQsQ3Q9VSpjdC1ZKnJ0LHp0PUgqY3QtWSppdCxqdD1odCp2dC1hdCptdCxVdD1odCpwdC1vdCptdCwkdD1odCp4dC1mdCptdCxHdD1hdCpwdC1vdCp2dCxIdD1hdCp4dC1mdCp2dCxWdD1vdCp4dC1mdCpwdCxidD1SdCpWdC1FdCpIdCtQdCpHdCtBdCokdC1DdCpVdCt6dCpqdDtyZXR1cm4gYnQ/KGJ0PTEvYnQsU1swXT0ocnQqVnQtaXQqSHQrY3QqR3QpKmJ0LFNbMV09KEgqSHQtVSpWdC1ZKkd0KSpidCxTWzJdPSh2dCp6dC1wdCpDdCt4dCpBdCkqYnQsU1szXT0ob3QqQ3QtYXQqenQtZnQqQXQpKmJ0LFNbNF09KGl0KiR0LWsqVnQtY3QqVXQpKmJ0LFNbNV09KHcqVnQtSCokdCtZKlV0KSpidCxTWzZdPShwdCpQdC1tdCp6dC14dCpFdCkqYnQsU1s3XT0oaHQqenQtb3QqUHQrZnQqRXQpKmJ0LFNbOF09KGsqSHQtcnQqJHQrY3QqanQpKmJ0LFNbOV09KFUqJHQtdypIdC1ZKmp0KSpidCxTWzEwXT0obXQqQ3QtdnQqUHQreHQqUnQpKmJ0LFNbMTFdPShhdCpQdC1odCpDdC1mdCpSdCkqYnQsU1sxMl09KHJ0KlV0LWsqR3QtaXQqanQpKmJ0LFNbMTNdPSh3Kkd0LVUqVXQrSCpqdCkqYnQsU1sxNF09KHZ0KkV0LW10KkF0LXB0KlJ0KSpidCxTWzE1XT0oaHQqQXQtYXQqRXQrb3QqUnQpKmJ0LFMpOm51bGx9ZnVuY3Rpb24gcChTLFApe3ZhciB3PVBbMF0sVT1QWzFdLEg9UFsyXSxZPVBbM10saz1QWzRdLHJ0PVBbNV0saXQ9UFs2XSxjdD1QWzddLGh0PVBbOF0sYXQ9UFs5XSxvdD1QWzEwXSxmdD1QWzExXSxtdD1QWzEyXSx2dD1QWzEzXSxwdD1QWzE0XSx4dD1QWzE1XTtyZXR1cm4gU1swXT1ydCoob3QqeHQtZnQqcHQpLWF0KihpdCp4dC1jdCpwdCkrdnQqKGl0KmZ0LWN0Km90KSxTWzFdPS0oVSoob3QqeHQtZnQqcHQpLWF0KihIKnh0LVkqcHQpK3Z0KihIKmZ0LVkqb3QpKSxTWzJdPVUqKGl0Knh0LWN0KnB0KS1ydCooSCp4dC1ZKnB0KSt2dCooSCpjdC1ZKml0KSxTWzNdPS0oVSooaXQqZnQtY3Qqb3QpLXJ0KihIKmZ0LVkqb3QpK2F0KihIKmN0LVkqaXQpKSxTWzRdPS0oayoob3QqeHQtZnQqcHQpLWh0KihpdCp4dC1jdCpwdCkrbXQqKGl0KmZ0LWN0Km90KSksU1s1XT13KihvdCp4dC1mdCpwdCktaHQqKEgqeHQtWSpwdCkrbXQqKEgqZnQtWSpvdCksU1s2XT0tKHcqKGl0Knh0LWN0KnB0KS1rKihIKnh0LVkqcHQpK210KihIKmN0LVkqaXQpKSxTWzddPXcqKGl0KmZ0LWN0Km90KS1rKihIKmZ0LVkqb3QpK2h0KihIKmN0LVkqaXQpLFNbOF09ayooYXQqeHQtZnQqdnQpLWh0KihydCp4dC1jdCp2dCkrbXQqKHJ0KmZ0LWN0KmF0KSxTWzldPS0odyooYXQqeHQtZnQqdnQpLWh0KihVKnh0LVkqdnQpK210KihVKmZ0LVkqYXQpKSxTWzEwXT13KihydCp4dC1jdCp2dCktayooVSp4dC1ZKnZ0KSttdCooVSpjdC1ZKnJ0KSxTWzExXT0tKHcqKHJ0KmZ0LWN0KmF0KS1rKihVKmZ0LVkqYXQpK2h0KihVKmN0LVkqcnQpKSxTWzEyXT0tKGsqKGF0KnB0LW90KnZ0KS1odCoocnQqcHQtaXQqdnQpK210KihydCpvdC1pdCphdCkpLFNbMTNdPXcqKGF0KnB0LW90KnZ0KS1odCooVSpwdC1IKnZ0KSttdCooVSpvdC1IKmF0KSxTWzE0XT0tKHcqKHJ0KnB0LWl0KnZ0KS1rKihVKnB0LUgqdnQpK210KihVKml0LUgqcnQpKSxTWzE1XT13KihydCpvdC1pdCphdCktayooVSpvdC1IKmF0KStodCooVSppdC1IKnJ0KSxTfWZ1bmN0aW9uIHkoUyl7dmFyIFA9U1swXSx3PVNbMV0sVT1TWzJdLEg9U1szXSxZPVNbNF0saz1TWzVdLHJ0PVNbNl0saXQ9U1s3XSxjdD1TWzhdLGh0PVNbOV0sYXQ9U1sxMF0sb3Q9U1sxMV0sZnQ9U1sxMl0sbXQ9U1sxM10sdnQ9U1sxNF0scHQ9U1sxNV0seHQ9UCprLXcqWSxSdD1QKnJ0LVUqWSxFdD1QKml0LUgqWSxQdD13KnJ0LVUqayxBdD13Kml0LUgqayxDdD1VKml0LUgqcnQsenQ9Y3QqbXQtaHQqZnQsanQ9Y3QqdnQtYXQqZnQsVXQ9Y3QqcHQtb3QqZnQsJHQ9aHQqdnQtYXQqbXQsR3Q9aHQqcHQtb3QqbXQsSHQ9YXQqcHQtb3QqdnQ7cmV0dXJuIHh0Kkh0LVJ0Kkd0K0V0KiR0K1B0KlV0LUF0Kmp0K0N0Knp0fWZ1bmN0aW9uIE8oUyxQLHcpe3ZhciBVPVBbMF0sSD1QWzFdLFk9UFsyXSxrPVBbM10scnQ9UFs0XSxpdD1QWzVdLGN0PVBbNl0saHQ9UFs3XSxhdD1QWzhdLG90PVBbOV0sZnQ9UFsxMF0sbXQ9UFsxMV0sdnQ9UFsxMl0scHQ9UFsxM10seHQ9UFsxNF0sUnQ9UFsxNV0sRXQ9d1swXSxQdD13WzFdLEF0PXdbMl0sQ3Q9d1szXTtyZXR1cm4gU1swXT1FdCpVK1B0KnJ0K0F0KmF0K0N0KnZ0LFNbMV09RXQqSCtQdCppdCtBdCpvdCtDdCpwdCxTWzJdPUV0KlkrUHQqY3QrQXQqZnQrQ3QqeHQsU1szXT1FdCprK1B0Kmh0K0F0Km10K0N0KlJ0LEV0PXdbNF0sUHQ9d1s1XSxBdD13WzZdLEN0PXdbN10sU1s0XT1FdCpVK1B0KnJ0K0F0KmF0K0N0KnZ0LFNbNV09RXQqSCtQdCppdCtBdCpvdCtDdCpwdCxTWzZdPUV0KlkrUHQqY3QrQXQqZnQrQ3QqeHQsU1s3XT1FdCprK1B0Kmh0K0F0Km10K0N0KlJ0LEV0PXdbOF0sUHQ9d1s5XSxBdD13WzEwXSxDdD13WzExXSxTWzhdPUV0KlUrUHQqcnQrQXQqYXQrQ3QqdnQsU1s5XT1FdCpIK1B0Kml0K0F0Km90K0N0KnB0LFNbMTBdPUV0KlkrUHQqY3QrQXQqZnQrQ3QqeHQsU1sxMV09RXQqaytQdCpodCtBdCptdCtDdCpSdCxFdD13WzEyXSxQdD13WzEzXSxBdD13WzE0XSxDdD13WzE1XSxTWzEyXT1FdCpVK1B0KnJ0K0F0KmF0K0N0KnZ0LFNbMTNdPUV0KkgrUHQqaXQrQXQqb3QrQ3QqcHQsU1sxNF09RXQqWStQdCpjdCtBdCpmdCtDdCp4dCxTWzE1XT1FdCprK1B0Kmh0K0F0Km10K0N0KlJ0LFN9ZnVuY3Rpb24geChTLFAsdyl7dmFyIFU9d1swXSxIPXdbMV0sWT13WzJdLGsscnQsaXQsY3QsaHQsYXQsb3QsZnQsbXQsdnQscHQseHQ7cmV0dXJuIFA9PT1TPyhTWzEyXT1QWzBdKlUrUFs0XSpIK1BbOF0qWStQWzEyXSxTWzEzXT1QWzFdKlUrUFs1XSpIK1BbOV0qWStQWzEzXSxTWzE0XT1QWzJdKlUrUFs2XSpIK1BbMTBdKlkrUFsxNF0sU1sxNV09UFszXSpVK1BbN10qSCtQWzExXSpZK1BbMTVdKTooaz1QWzBdLHJ0PVBbMV0saXQ9UFsyXSxjdD1QWzNdLGh0PVBbNF0sYXQ9UFs1XSxvdD1QWzZdLGZ0PVBbN10sbXQ9UFs4XSx2dD1QWzldLHB0PVBbMTBdLHh0PVBbMTFdLFNbMF09ayxTWzFdPXJ0LFNbMl09aXQsU1szXT1jdCxTWzRdPWh0LFNbNV09YXQsU1s2XT1vdCxTWzddPWZ0LFNbOF09bXQsU1s5XT12dCxTWzEwXT1wdCxTWzExXT14dCxTWzEyXT1rKlUraHQqSCttdCpZK1BbMTJdLFNbMTNdPXJ0KlUrYXQqSCt2dCpZK1BbMTNdLFNbMTRdPWl0KlUrb3QqSCtwdCpZK1BbMTRdLFNbMTVdPWN0KlUrZnQqSCt4dCpZK1BbMTVdKSxTfWZ1bmN0aW9uIHYoUyxQLHcpe3ZhciBVPXdbMF0sSD13WzFdLFk9d1syXTtyZXR1cm4gU1swXT1QWzBdKlUsU1sxXT1QWzFdKlUsU1syXT1QWzJdKlUsU1szXT1QWzNdKlUsU1s0XT1QWzRdKkgsU1s1XT1QWzVdKkgsU1s2XT1QWzZdKkgsU1s3XT1QWzddKkgsU1s4XT1QWzhdKlksU1s5XT1QWzldKlksU1sxMF09UFsxMF0qWSxTWzExXT1QWzExXSpZLFNbMTJdPVBbMTJdLFNbMTNdPVBbMTNdLFNbMTRdPVBbMTRdLFNbMTVdPVBbMTVdLFN9ZnVuY3Rpb24gVChTLFAsdyxVKXt2YXIgSD1VWzBdLFk9VVsxXSxrPVVbMl0scnQ9TWF0aC5oeXBvdChILFksayksaXQsY3QsaHQsYXQsb3QsZnQsbXQsdnQscHQseHQsUnQsRXQsUHQsQXQsQ3QsenQsanQsVXQsJHQsR3QsSHQsVnQsYnQsdGU7cmV0dXJuIHJ0PGUuRVBTSUxPTj9udWxsOihydD0xL3J0LEgqPXJ0LFkqPXJ0LGsqPXJ0LGl0PU1hdGguc2luKHcpLGN0PU1hdGguY29zKHcpLGh0PTEtY3QsYXQ9UFswXSxvdD1QWzFdLGZ0PVBbMl0sbXQ9UFszXSx2dD1QWzRdLHB0PVBbNV0seHQ9UFs2XSxSdD1QWzddLEV0PVBbOF0sUHQ9UFs5XSxBdD1QWzEwXSxDdD1QWzExXSx6dD1IKkgqaHQrY3QsanQ9WSpIKmh0K2sqaXQsVXQ9aypIKmh0LVkqaXQsJHQ9SCpZKmh0LWsqaXQsR3Q9WSpZKmh0K2N0LEh0PWsqWSpodCtIKml0LFZ0PUgqaypodCtZKml0LGJ0PVkqaypodC1IKml0LHRlPWsqaypodCtjdCxTWzBdPWF0Knp0K3Z0Kmp0K0V0KlV0LFNbMV09b3QqenQrcHQqanQrUHQqVXQsU1syXT1mdCp6dCt4dCpqdCtBdCpVdCxTWzNdPW10Knp0K1J0Kmp0K0N0KlV0LFNbNF09YXQqJHQrdnQqR3QrRXQqSHQsU1s1XT1vdCokdCtwdCpHdCtQdCpIdCxTWzZdPWZ0KiR0K3h0Kkd0K0F0Kkh0LFNbN109bXQqJHQrUnQqR3QrQ3QqSHQsU1s4XT1hdCpWdCt2dCpidCtFdCp0ZSxTWzldPW90KlZ0K3B0KmJ0K1B0KnRlLFNbMTBdPWZ0KlZ0K3h0KmJ0K0F0KnRlLFNbMTFdPW10KlZ0K1J0KmJ0K0N0KnRlLFAhPT1TJiYoU1sxMl09UFsxMl0sU1sxM109UFsxM10sU1sxNF09UFsxNF0sU1sxNV09UFsxNV0pLFMpfWZ1bmN0aW9uIGwoUyxQLHcpe3ZhciBVPU1hdGguc2luKHcpLEg9TWF0aC5jb3ModyksWT1QWzRdLGs9UFs1XSxydD1QWzZdLGl0PVBbN10sY3Q9UFs4XSxodD1QWzldLGF0PVBbMTBdLG90PVBbMTFdO3JldHVybiBQIT09UyYmKFNbMF09UFswXSxTWzFdPVBbMV0sU1syXT1QWzJdLFNbM109UFszXSxTWzEyXT1QWzEyXSxTWzEzXT1QWzEzXSxTWzE0XT1QWzE0XSxTWzE1XT1QWzE1XSksU1s0XT1ZKkgrY3QqVSxTWzVdPWsqSCtodCpVLFNbNl09cnQqSCthdCpVLFNbN109aXQqSCtvdCpVLFNbOF09Y3QqSC1ZKlUsU1s5XT1odCpILWsqVSxTWzEwXT1hdCpILXJ0KlUsU1sxMV09b3QqSC1pdCpVLFN9ZnVuY3Rpb24gaChTLFAsdyl7dmFyIFU9TWF0aC5zaW4odyksSD1NYXRoLmNvcyh3KSxZPVBbMF0saz1QWzFdLHJ0PVBbMl0saXQ9UFszXSxjdD1QWzhdLGh0PVBbOV0sYXQ9UFsxMF0sb3Q9UFsxMV07cmV0dXJuIFAhPT1TJiYoU1s0XT1QWzRdLFNbNV09UFs1XSxTWzZdPVBbNl0sU1s3XT1QWzddLFNbMTJdPVBbMTJdLFNbMTNdPVBbMTNdLFNbMTRdPVBbMTRdLFNbMTVdPVBbMTVdKSxTWzBdPVkqSC1jdCpVLFNbMV09aypILWh0KlUsU1syXT1ydCpILWF0KlUsU1szXT1pdCpILW90KlUsU1s4XT1ZKlUrY3QqSCxTWzldPWsqVStodCpILFNbMTBdPXJ0KlUrYXQqSCxTWzExXT1pdCpVK290KkgsU31mdW5jdGlvbiBmKFMsUCx3KXt2YXIgVT1NYXRoLnNpbih3KSxIPU1hdGguY29zKHcpLFk9UFswXSxrPVBbMV0scnQ9UFsyXSxpdD1QWzNdLGN0PVBbNF0saHQ9UFs1XSxhdD1QWzZdLG90PVBbN107cmV0dXJuIFAhPT1TJiYoU1s4XT1QWzhdLFNbOV09UFs5XSxTWzEwXT1QWzEwXSxTWzExXT1QWzExXSxTWzEyXT1QWzEyXSxTWzEzXT1QWzEzXSxTWzE0XT1QWzE0XSxTWzE1XT1QWzE1XSksU1swXT1ZKkgrY3QqVSxTWzFdPWsqSCtodCpVLFNbMl09cnQqSCthdCpVLFNbM109aXQqSCtvdCpVLFNbNF09Y3QqSC1ZKlUsU1s1XT1odCpILWsqVSxTWzZdPWF0KkgtcnQqVSxTWzddPW90KkgtaXQqVSxTfWZ1bmN0aW9uIGcoUyxQKXtyZXR1cm4gU1swXT0xLFNbMV09MCxTWzJdPTAsU1szXT0wLFNbNF09MCxTWzVdPTEsU1s2XT0wLFNbN109MCxTWzhdPTAsU1s5XT0wLFNbMTBdPTEsU1sxMV09MCxTWzEyXT1QWzBdLFNbMTNdPVBbMV0sU1sxNF09UFsyXSxTWzE1XT0xLFN9ZnVuY3Rpb24gTShTLFApe3JldHVybiBTWzBdPVBbMF0sU1sxXT0wLFNbMl09MCxTWzNdPTAsU1s0XT0wLFNbNV09UFsxXSxTWzZdPTAsU1s3XT0wLFNbOF09MCxTWzldPTAsU1sxMF09UFsyXSxTWzExXT0wLFNbMTJdPTAsU1sxM109MCxTWzE0XT0wLFNbMTVdPTEsU31mdW5jdGlvbiBBKFMsUCx3KXt2YXIgVT13WzBdLEg9d1sxXSxZPXdbMl0saz1NYXRoLmh5cG90KFUsSCxZKSxydCxpdCxjdDtyZXR1cm4gazxlLkVQU0lMT04/bnVsbDooaz0xL2ssVSo9ayxIKj1rLFkqPWsscnQ9TWF0aC5zaW4oUCksaXQ9TWF0aC5jb3MoUCksY3Q9MS1pdCxTWzBdPVUqVSpjdCtpdCxTWzFdPUgqVSpjdCtZKnJ0LFNbMl09WSpVKmN0LUgqcnQsU1szXT0wLFNbNF09VSpIKmN0LVkqcnQsU1s1XT1IKkgqY3QraXQsU1s2XT1ZKkgqY3QrVSpydCxTWzddPTAsU1s4XT1VKlkqY3QrSCpydCxTWzldPUgqWSpjdC1VKnJ0LFNbMTBdPVkqWSpjdCtpdCxTWzExXT0wLFNbMTJdPTAsU1sxM109MCxTWzE0XT0wLFNbMTVdPTEsUyl9ZnVuY3Rpb24gQyhTLFApe3ZhciB3PU1hdGguc2luKFApLFU9TWF0aC5jb3MoUCk7cmV0dXJuIFNbMF09MSxTWzFdPTAsU1syXT0wLFNbM109MCxTWzRdPTAsU1s1XT1VLFNbNl09dyxTWzddPTAsU1s4XT0wLFNbOV09LXcsU1sxMF09VSxTWzExXT0wLFNbMTJdPTAsU1sxM109MCxTWzE0XT0wLFNbMTVdPTEsU31mdW5jdGlvbiBiKFMsUCl7dmFyIHc9TWF0aC5zaW4oUCksVT1NYXRoLmNvcyhQKTtyZXR1cm4gU1swXT1VLFNbMV09MCxTWzJdPS13LFNbM109MCxTWzRdPTAsU1s1XT0xLFNbNl09MCxTWzddPTAsU1s4XT13LFNbOV09MCxTWzEwXT1VLFNbMTFdPTAsU1sxMl09MCxTWzEzXT0wLFNbMTRdPTAsU1sxNV09MSxTfWZ1bmN0aW9uIEUoUyxQKXt2YXIgdz1NYXRoLnNpbihQKSxVPU1hdGguY29zKFApO3JldHVybiBTWzBdPVUsU1sxXT13LFNbMl09MCxTWzNdPTAsU1s0XT0tdyxTWzVdPVUsU1s2XT0wLFNbN109MCxTWzhdPTAsU1s5XT0wLFNbMTBdPTEsU1sxMV09MCxTWzEyXT0wLFNbMTNdPTAsU1sxNF09MCxTWzE1XT0xLFN9ZnVuY3Rpb24gTChTLFAsdyl7dmFyIFU9UFswXSxIPVBbMV0sWT1QWzJdLGs9UFszXSxydD1VK1UsaXQ9SCtILGN0PVkrWSxodD1VKnJ0LGF0PVUqaXQsb3Q9VSpjdCxmdD1IKml0LG10PUgqY3QsdnQ9WSpjdCxwdD1rKnJ0LHh0PWsqaXQsUnQ9aypjdDtyZXR1cm4gU1swXT0xLShmdCt2dCksU1sxXT1hdCtSdCxTWzJdPW90LXh0LFNbM109MCxTWzRdPWF0LVJ0LFNbNV09MS0oaHQrdnQpLFNbNl09bXQrcHQsU1s3XT0wLFNbOF09b3QreHQsU1s5XT1tdC1wdCxTWzEwXT0xLShodCtmdCksU1sxMV09MCxTWzEyXT13WzBdLFNbMTNdPXdbMV0sU1sxNF09d1syXSxTWzE1XT0xLFN9ZnVuY3Rpb24gRChTLFApe3ZhciB3PW5ldyBlLkFSUkFZX1RZUEUoMyksVT0tUFswXSxIPS1QWzFdLFk9LVBbMl0saz1QWzNdLHJ0PVBbNF0saXQ9UFs1XSxjdD1QWzZdLGh0PVBbN10sYXQ9VSpVK0gqSCtZKlkrayprO3JldHVybiBhdD4wPyh3WzBdPShydCprK2h0KlUraXQqWS1jdCpIKSoyL2F0LHdbMV09KGl0KmsraHQqSCtjdCpVLXJ0KlkpKjIvYXQsd1syXT0oY3QqaytodCpZK3J0KkgtaXQqVSkqMi9hdCk6KHdbMF09KHJ0KmsraHQqVStpdCpZLWN0KkgpKjIsd1sxXT0oaXQqaytodCpIK2N0KlUtcnQqWSkqMix3WzJdPShjdCprK2h0KlkrcnQqSC1pdCpVKSoyKSxMKFMsUCx3KSxTfWZ1bmN0aW9uIEkoUyxQKXtyZXR1cm4gU1swXT1QWzEyXSxTWzFdPVBbMTNdLFNbMl09UFsxNF0sU31mdW5jdGlvbiBSKFMsUCl7dmFyIHc9UFswXSxVPVBbMV0sSD1QWzJdLFk9UFs0XSxrPVBbNV0scnQ9UFs2XSxpdD1QWzhdLGN0PVBbOV0saHQ9UFsxMF07cmV0dXJuIFNbMF09TWF0aC5oeXBvdCh3LFUsSCksU1sxXT1NYXRoLmh5cG90KFksayxydCksU1syXT1NYXRoLmh5cG90KGl0LGN0LGh0KSxTfWZ1bmN0aW9uIEIoUyxQKXt2YXIgdz1uZXcgZS5BUlJBWV9UWVBFKDMpO1IodyxQKTt2YXIgVT0xL3dbMF0sSD0xL3dbMV0sWT0xL3dbMl0saz1QWzBdKlUscnQ9UFsxXSpILGl0PVBbMl0qWSxjdD1QWzRdKlUsaHQ9UFs1XSpILGF0PVBbNl0qWSxvdD1QWzhdKlUsZnQ9UFs5XSpILG10PVBbMTBdKlksdnQ9aytodCttdCxwdD0wO3JldHVybiB2dD4wPyhwdD1NYXRoLnNxcnQodnQrMSkqMixTWzNdPS4yNSpwdCxTWzBdPShhdC1mdCkvcHQsU1sxXT0ob3QtaXQpL3B0LFNbMl09KHJ0LWN0KS9wdCk6az5odCYmaz5tdD8ocHQ9TWF0aC5zcXJ0KDEray1odC1tdCkqMixTWzNdPShhdC1mdCkvcHQsU1swXT0uMjUqcHQsU1sxXT0ocnQrY3QpL3B0LFNbMl09KG90K2l0KS9wdCk6aHQ+bXQ/KHB0PU1hdGguc3FydCgxK2h0LWstbXQpKjIsU1szXT0ob3QtaXQpL3B0LFNbMF09KHJ0K2N0KS9wdCxTWzFdPS4yNSpwdCxTWzJdPShhdCtmdCkvcHQpOihwdD1NYXRoLnNxcnQoMSttdC1rLWh0KSoyLFNbM109KHJ0LWN0KS9wdCxTWzBdPShvdCtpdCkvcHQsU1sxXT0oYXQrZnQpL3B0LFNbMl09LjI1KnB0KSxTfWZ1bmN0aW9uIHooUyxQLHcsVSl7dmFyIEg9UFswXSxZPVBbMV0saz1QWzJdLHJ0PVBbM10saXQ9SCtILGN0PVkrWSxodD1rK2ssYXQ9SCppdCxvdD1IKmN0LGZ0PUgqaHQsbXQ9WSpjdCx2dD1ZKmh0LHB0PWsqaHQseHQ9cnQqaXQsUnQ9cnQqY3QsRXQ9cnQqaHQsUHQ9VVswXSxBdD1VWzFdLEN0PVVbMl07cmV0dXJuIFNbMF09KDEtKG10K3B0KSkqUHQsU1sxXT0ob3QrRXQpKlB0LFNbMl09KGZ0LVJ0KSpQdCxTWzNdPTAsU1s0XT0ob3QtRXQpKkF0LFNbNV09KDEtKGF0K3B0KSkqQXQsU1s2XT0odnQreHQpKkF0LFNbN109MCxTWzhdPShmdCtSdCkqQ3QsU1s5XT0odnQteHQpKkN0LFNbMTBdPSgxLShhdCttdCkpKkN0LFNbMTFdPTAsU1sxMl09d1swXSxTWzEzXT13WzFdLFNbMTRdPXdbMl0sU1sxNV09MSxTfWZ1bmN0aW9uIEsoUyxQLHcsVSxIKXt2YXIgWT1QWzBdLGs9UFsxXSxydD1QWzJdLGl0PVBbM10sY3Q9WStZLGh0PWsrayxhdD1ydCtydCxvdD1ZKmN0LGZ0PVkqaHQsbXQ9WSphdCx2dD1rKmh0LHB0PWsqYXQseHQ9cnQqYXQsUnQ9aXQqY3QsRXQ9aXQqaHQsUHQ9aXQqYXQsQXQ9VVswXSxDdD1VWzFdLHp0PVVbMl0sanQ9SFswXSxVdD1IWzFdLCR0PUhbMl0sR3Q9KDEtKHZ0K3h0KSkqQXQsSHQ9KGZ0K1B0KSpBdCxWdD0obXQtRXQpKkF0LGJ0PShmdC1QdCkqQ3QsdGU9KDEtKG90K3h0KSkqQ3QsSWU9KHB0K1J0KSpDdCxMZT0obXQrRXQpKnp0LF9uPShwdC1SdCkqenQsdGk9KDEtKG90K3Z0KSkqenQ7cmV0dXJuIFNbMF09R3QsU1sxXT1IdCxTWzJdPVZ0LFNbM109MCxTWzRdPWJ0LFNbNV09dGUsU1s2XT1JZSxTWzddPTAsU1s4XT1MZSxTWzldPV9uLFNbMTBdPXRpLFNbMTFdPTAsU1sxMl09d1swXStqdC0oR3QqanQrYnQqVXQrTGUqJHQpLFNbMTNdPXdbMV0rVXQtKEh0Kmp0K3RlKlV0K19uKiR0KSxTWzE0XT13WzJdKyR0LShWdCpqdCtJZSpVdCt0aSokdCksU1sxNV09MSxTfWZ1bmN0aW9uIFEoUyxQKXt2YXIgdz1QWzBdLFU9UFsxXSxIPVBbMl0sWT1QWzNdLGs9dyt3LHJ0PVUrVSxpdD1IK0gsY3Q9dyprLGh0PVUqayxhdD1VKnJ0LG90PUgqayxmdD1IKnJ0LG10PUgqaXQsdnQ9WSprLHB0PVkqcnQseHQ9WSppdDtyZXR1cm4gU1swXT0xLWF0LW10LFNbMV09aHQreHQsU1syXT1vdC1wdCxTWzNdPTAsU1s0XT1odC14dCxTWzVdPTEtY3QtbXQsU1s2XT1mdCt2dCxTWzddPTAsU1s4XT1vdCtwdCxTWzldPWZ0LXZ0LFNbMTBdPTEtY3QtYXQsU1sxMV09MCxTWzEyXT0wLFNbMTNdPTAsU1sxNF09MCxTWzE1XT0xLFN9ZnVuY3Rpb24gXyhTLFAsdyxVLEgsWSxrKXt2YXIgcnQ9MS8ody1QKSxpdD0xLyhILVUpLGN0PTEvKFktayk7cmV0dXJuIFNbMF09WSoyKnJ0LFNbMV09MCxTWzJdPTAsU1szXT0wLFNbNF09MCxTWzVdPVkqMippdCxTWzZdPTAsU1s3XT0wLFNbOF09KHcrUCkqcnQsU1s5XT0oSCtVKSppdCxTWzEwXT0oaytZKSpjdCxTWzExXT0tMSxTWzEyXT0wLFNbMTNdPTAsU1sxNF09aypZKjIqY3QsU1sxNV09MCxTfWZ1bmN0aW9uIGooUyxQLHcsVSxIKXt2YXIgWT0xL01hdGgudGFuKFAvMiksaztyZXR1cm4gU1swXT1ZL3csU1sxXT0wLFNbMl09MCxTWzNdPTAsU1s0XT0wLFNbNV09WSxTWzZdPTAsU1s3XT0wLFNbOF09MCxTWzldPTAsU1sxMV09LTEsU1sxMl09MCxTWzEzXT0wLFNbMTVdPTAsSCE9bnVsbCYmSCE9PTEvMD8oaz0xLyhVLUgpLFNbMTBdPShIK1UpKmssU1sxNF09MipIKlUqayk6KFNbMTBdPS0xLFNbMTRdPS0yKlUpLFN9ZnVuY3Rpb24gRyhTLFAsdyxVKXt2YXIgSD1NYXRoLnRhbihQLnVwRGVncmVlcypNYXRoLlBJLzE4MCksWT1NYXRoLnRhbihQLmRvd25EZWdyZWVzKk1hdGguUEkvMTgwKSxrPU1hdGgudGFuKFAubGVmdERlZ3JlZXMqTWF0aC5QSS8xODApLHJ0PU1hdGgudGFuKFAucmlnaHREZWdyZWVzKk1hdGguUEkvMTgwKSxpdD0yLyhrK3J0KSxjdD0yLyhIK1kpO3JldHVybiBTWzBdPWl0LFNbMV09MCxTWzJdPTAsU1szXT0wLFNbNF09MCxTWzVdPWN0LFNbNl09MCxTWzddPTAsU1s4XT0tKChrLXJ0KSppdCouNSksU1s5XT0oSC1ZKSpjdCouNSxTWzEwXT1VLyh3LVUpLFNbMTFdPS0xLFNbMTJdPTAsU1sxM109MCxTWzE0XT1VKncvKHctVSksU1sxNV09MCxTfWZ1bmN0aW9uIFgoUyxQLHcsVSxILFksayl7dmFyIHJ0PTEvKFAtdyksaXQ9MS8oVS1IKSxjdD0xLyhZLWspO3JldHVybiBTWzBdPS0yKnJ0LFNbMV09MCxTWzJdPTAsU1szXT0wLFNbNF09MCxTWzVdPS0yKml0LFNbNl09MCxTWzddPTAsU1s4XT0wLFNbOV09MCxTWzEwXT0yKmN0LFNbMTFdPTAsU1sxMl09KFArdykqcnQsU1sxM109KEgrVSkqaXQsU1sxNF09KGsrWSkqY3QsU1sxNV09MSxTfWZ1bmN0aW9uIFooUyxQLHcsVSl7dmFyIEgsWSxrLHJ0LGl0LGN0LGh0LGF0LG90LGZ0LG10PVBbMF0sdnQ9UFsxXSxwdD1QWzJdLHh0PVVbMF0sUnQ9VVsxXSxFdD1VWzJdLFB0PXdbMF0sQXQ9d1sxXSxDdD13WzJdO3JldHVybiBNYXRoLmFicyhtdC1QdCk8ZS5FUFNJTE9OJiZNYXRoLmFicyh2dC1BdCk8ZS5FUFNJTE9OJiZNYXRoLmFicyhwdC1DdCk8ZS5FUFNJTE9OP2MoUyk6KGh0PW10LVB0LGF0PXZ0LUF0LG90PXB0LUN0LGZ0PTEvTWF0aC5oeXBvdChodCxhdCxvdCksaHQqPWZ0LGF0Kj1mdCxvdCo9ZnQsSD1SdCpvdC1FdCphdCxZPUV0Kmh0LXh0Km90LGs9eHQqYXQtUnQqaHQsZnQ9TWF0aC5oeXBvdChILFksayksZnQ/KGZ0PTEvZnQsSCo9ZnQsWSo9ZnQsayo9ZnQpOihIPTAsWT0wLGs9MCkscnQ9YXQqay1vdCpZLGl0PW90KkgtaHQqayxjdD1odCpZLWF0KkgsZnQ9TWF0aC5oeXBvdChydCxpdCxjdCksZnQ/KGZ0PTEvZnQscnQqPWZ0LGl0Kj1mdCxjdCo9ZnQpOihydD0wLGl0PTAsY3Q9MCksU1swXT1ILFNbMV09cnQsU1syXT1odCxTWzNdPTAsU1s0XT1ZLFNbNV09aXQsU1s2XT1hdCxTWzddPTAsU1s4XT1rLFNbOV09Y3QsU1sxMF09b3QsU1sxMV09MCxTWzEyXT0tKEgqbXQrWSp2dCtrKnB0KSxTWzEzXT0tKHJ0Km10K2l0KnZ0K2N0KnB0KSxTWzE0XT0tKGh0Km10K2F0KnZ0K290KnB0KSxTWzE1XT0xLFMpfWZ1bmN0aW9uIHR0KFMsUCx3LFUpe3ZhciBIPVBbMF0sWT1QWzFdLGs9UFsyXSxydD1VWzBdLGl0PVVbMV0sY3Q9VVsyXSxodD1ILXdbMF0sYXQ9WS13WzFdLG90PWstd1syXSxmdD1odCpodCthdCphdCtvdCpvdDtmdD4wJiYoZnQ9MS9NYXRoLnNxcnQoZnQpLGh0Kj1mdCxhdCo9ZnQsb3QqPWZ0KTt2YXIgbXQ9aXQqb3QtY3QqYXQsdnQ9Y3QqaHQtcnQqb3QscHQ9cnQqYXQtaXQqaHQ7cmV0dXJuIGZ0PW10Km10K3Z0KnZ0K3B0KnB0LGZ0PjAmJihmdD0xL01hdGguc3FydChmdCksbXQqPWZ0LHZ0Kj1mdCxwdCo9ZnQpLFNbMF09bXQsU1sxXT12dCxTWzJdPXB0LFNbM109MCxTWzRdPWF0KnB0LW90KnZ0LFNbNV09b3QqbXQtaHQqcHQsU1s2XT1odCp2dC1hdCptdCxTWzddPTAsU1s4XT1odCxTWzldPWF0LFNbMTBdPW90LFNbMTFdPTAsU1sxMl09SCxTWzEzXT1ZLFNbMTRdPWssU1sxNV09MSxTfWZ1bmN0aW9uIG50KFMpe3JldHVybiJtYXQ0KCIrU1swXSsiLCAiK1NbMV0rIiwgIitTWzJdKyIsICIrU1szXSsiLCAiK1NbNF0rIiwgIitTWzVdKyIsICIrU1s2XSsiLCAiK1NbN10rIiwgIitTWzhdKyIsICIrU1s5XSsiLCAiK1NbMTBdKyIsICIrU1sxMV0rIiwgIitTWzEyXSsiLCAiK1NbMTNdKyIsICIrU1sxNF0rIiwgIitTWzE1XSsiKSJ9ZnVuY3Rpb24gcShTKXtyZXR1cm4gTWF0aC5oeXBvdChTWzBdLFNbMV0sU1syXSxTWzNdLFNbNF0sU1s1XSxTWzZdLFNbN10sU1s4XSxTWzldLFNbMTBdLFNbMTFdLFNbMTJdLFNbMTNdLFNbMTRdLFNbMTVdKX1mdW5jdGlvbiBkdChTLFAsdyl7cmV0dXJuIFNbMF09UFswXSt3WzBdLFNbMV09UFsxXSt3WzFdLFNbMl09UFsyXSt3WzJdLFNbM109UFszXSt3WzNdLFNbNF09UFs0XSt3WzRdLFNbNV09UFs1XSt3WzVdLFNbNl09UFs2XSt3WzZdLFNbN109UFs3XSt3WzddLFNbOF09UFs4XSt3WzhdLFNbOV09UFs5XSt3WzldLFNbMTBdPVBbMTBdK3dbMTBdLFNbMTFdPVBbMTFdK3dbMTFdLFNbMTJdPVBbMTJdK3dbMTJdLFNbMTNdPVBbMTNdK3dbMTNdLFNbMTRdPVBbMTRdK3dbMTRdLFNbMTVdPVBbMTVdK3dbMTVdLFN9ZnVuY3Rpb24gdXQoUyxQLHcpe3JldHVybiBTWzBdPVBbMF0td1swXSxTWzFdPVBbMV0td1sxXSxTWzJdPVBbMl0td1syXSxTWzNdPVBbM10td1szXSxTWzRdPVBbNF0td1s0XSxTWzVdPVBbNV0td1s1XSxTWzZdPVBbNl0td1s2XSxTWzddPVBbN10td1s3XSxTWzhdPVBbOF0td1s4XSxTWzldPVBbOV0td1s5XSxTWzEwXT1QWzEwXS13WzEwXSxTWzExXT1QWzExXS13WzExXSxTWzEyXT1QWzEyXS13WzEyXSxTWzEzXT1QWzEzXS13WzEzXSxTWzE0XT1QWzE0XS13WzE0XSxTWzE1XT1QWzE1XS13WzE1XSxTfWZ1bmN0aW9uIFcoUyxQLHcpe3JldHVybiBTWzBdPVBbMF0qdyxTWzFdPVBbMV0qdyxTWzJdPVBbMl0qdyxTWzNdPVBbM10qdyxTWzRdPVBbNF0qdyxTWzVdPVBbNV0qdyxTWzZdPVBbNl0qdyxTWzddPVBbN10qdyxTWzhdPVBbOF0qdyxTWzldPVBbOV0qdyxTWzEwXT1QWzEwXSp3LFNbMTFdPVBbMTFdKncsU1sxMl09UFsxMl0qdyxTWzEzXT1QWzEzXSp3LFNbMTRdPVBbMTRdKncsU1sxNV09UFsxNV0qdyxTfWZ1bmN0aW9uIEYoUyxQLHcsVSl7cmV0dXJuIFNbMF09UFswXSt3WzBdKlUsU1sxXT1QWzFdK3dbMV0qVSxTWzJdPVBbMl0rd1syXSpVLFNbM109UFszXSt3WzNdKlUsU1s0XT1QWzRdK3dbNF0qVSxTWzVdPVBbNV0rd1s1XSpVLFNbNl09UFs2XSt3WzZdKlUsU1s3XT1QWzddK3dbN10qVSxTWzhdPVBbOF0rd1s4XSpVLFNbOV09UFs5XSt3WzldKlUsU1sxMF09UFsxMF0rd1sxMF0qVSxTWzExXT1QWzExXSt3WzExXSpVLFNbMTJdPVBbMTJdK3dbMTJdKlUsU1sxM109UFsxM10rd1sxM10qVSxTWzE0XT1QWzE0XSt3WzE0XSpVLFNbMTVdPVBbMTVdK3dbMTVdKlUsU31mdW5jdGlvbiBWKFMsUCl7cmV0dXJuIFNbMF09PT1QWzBdJiZTWzFdPT09UFsxXSYmU1syXT09PVBbMl0mJlNbM109PT1QWzNdJiZTWzRdPT09UFs0XSYmU1s1XT09PVBbNV0mJlNbNl09PT1QWzZdJiZTWzddPT09UFs3XSYmU1s4XT09PVBbOF0mJlNbOV09PT1QWzldJiZTWzEwXT09PVBbMTBdJiZTWzExXT09PVBbMTFdJiZTWzEyXT09PVBbMTJdJiZTWzEzXT09PVBbMTNdJiZTWzE0XT09PVBbMTRdJiZTWzE1XT09PVBbMTVdfWZ1bmN0aW9uIEooUyxQKXt2YXIgdz1TWzBdLFU9U1sxXSxIPVNbMl0sWT1TWzNdLGs9U1s0XSxydD1TWzVdLGl0PVNbNl0sY3Q9U1s3XSxodD1TWzhdLGF0PVNbOV0sb3Q9U1sxMF0sZnQ9U1sxMV0sbXQ9U1sxMl0sdnQ9U1sxM10scHQ9U1sxNF0seHQ9U1sxNV0sUnQ9UFswXSxFdD1QWzFdLFB0PVBbMl0sQXQ9UFszXSxDdD1QWzRdLHp0PVBbNV0sanQ9UFs2XSxVdD1QWzddLCR0PVBbOF0sR3Q9UFs5XSxIdD1QWzEwXSxWdD1QWzExXSxidD1QWzEyXSx0ZT1QWzEzXSxJZT1QWzE0XSxMZT1QWzE1XTtyZXR1cm4gTWF0aC5hYnMody1SdCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHcpLE1hdGguYWJzKFJ0KSkmJk1hdGguYWJzKFUtRXQpPD1lLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhVKSxNYXRoLmFicyhFdCkpJiZNYXRoLmFicyhILVB0KTw9ZS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoSCksTWF0aC5hYnMoUHQpKSYmTWF0aC5hYnMoWS1BdCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKFkpLE1hdGguYWJzKEF0KSkmJk1hdGguYWJzKGstQ3QpPD1lLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhrKSxNYXRoLmFicyhDdCkpJiZNYXRoLmFicyhydC16dCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHJ0KSxNYXRoLmFicyh6dCkpJiZNYXRoLmFicyhpdC1qdCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGl0KSxNYXRoLmFicyhqdCkpJiZNYXRoLmFicyhjdC1VdCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGN0KSxNYXRoLmFicyhVdCkpJiZNYXRoLmFicyhodC0kdCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGh0KSxNYXRoLmFicygkdCkpJiZNYXRoLmFicyhhdC1HdCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGF0KSxNYXRoLmFicyhHdCkpJiZNYXRoLmFicyhvdC1IdCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKG90KSxNYXRoLmFicyhIdCkpJiZNYXRoLmFicyhmdC1WdCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGZ0KSxNYXRoLmFicyhWdCkpJiZNYXRoLmFicyhtdC1idCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKG10KSxNYXRoLmFicyhidCkpJiZNYXRoLmFicyh2dC10ZSk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHZ0KSxNYXRoLmFicyh0ZSkpJiZNYXRoLmFicyhwdC1JZSk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHB0KSxNYXRoLmFicyhJZSkpJiZNYXRoLmFicyh4dC1MZSk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHh0KSxNYXRoLmFicyhMZSkpfXZhciBOPU8sJD11dH0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiY3JlYXRlIixmdW5jdGlvbigpe3JldHVybiBpfSksdC5kKHIsImlkZW50aXR5IixmdW5jdGlvbigpe3JldHVybiBvfSksdC5kKHIsInNldEF4aXNBbmdsZSIsZnVuY3Rpb24oKXtyZXR1cm4gY30pLHQuZChyLCJnZXRBeGlzQW5nbGUiLGZ1bmN0aW9uKCl7cmV0dXJuIG19KSx0LmQociwiZ2V0QW5nbGUiLGZ1bmN0aW9uKCl7cmV0dXJuIHV9KSx0LmQociwibXVsdGlwbHkiLGZ1bmN0aW9uKCl7cmV0dXJuIHB9KSx0LmQociwicm90YXRlWCIsZnVuY3Rpb24oKXtyZXR1cm4geX0pLHQuZChyLCJyb3RhdGVZIixmdW5jdGlvbigpe3JldHVybiBPfSksdC5kKHIsInJvdGF0ZVoiLGZ1bmN0aW9uKCl7cmV0dXJuIHh9KSx0LmQociwiY2FsY3VsYXRlVyIsZnVuY3Rpb24oKXtyZXR1cm4gdn0pLHQuZChyLCJleHAiLGZ1bmN0aW9uKCl7cmV0dXJuIFR9KSx0LmQociwibG4iLGZ1bmN0aW9uKCl7cmV0dXJuIGx9KSx0LmQociwicG93IixmdW5jdGlvbigpe3JldHVybiBofSksdC5kKHIsInNsZXJwIixmdW5jdGlvbigpe3JldHVybiBmfSksdC5kKHIsInJhbmRvbSIsZnVuY3Rpb24oKXtyZXR1cm4gZ30pLHQuZChyLCJpbnZlcnQiLGZ1bmN0aW9uKCl7cmV0dXJuIE19KSx0LmQociwiY29uanVnYXRlIixmdW5jdGlvbigpe3JldHVybiBBfSksdC5kKHIsImZyb21NYXQzIixmdW5jdGlvbigpe3JldHVybiBDfSksdC5kKHIsImZyb21FdWxlciIsZnVuY3Rpb24oKXtyZXR1cm4gYn0pLHQuZChyLCJzdHIiLGZ1bmN0aW9uKCl7cmV0dXJuIEV9KSx0LmQociwiY2xvbmUiLGZ1bmN0aW9uKCl7cmV0dXJuIEx9KSx0LmQociwiZnJvbVZhbHVlcyIsZnVuY3Rpb24oKXtyZXR1cm4gRH0pLHQuZChyLCJjb3B5IixmdW5jdGlvbigpe3JldHVybiBJfSksdC5kKHIsInNldCIsZnVuY3Rpb24oKXtyZXR1cm4gUn0pLHQuZChyLCJhZGQiLGZ1bmN0aW9uKCl7cmV0dXJuIEJ9KSx0LmQociwibXVsIixmdW5jdGlvbigpe3JldHVybiB6fSksdC5kKHIsInNjYWxlIixmdW5jdGlvbigpe3JldHVybiBLfSksdC5kKHIsImRvdCIsZnVuY3Rpb24oKXtyZXR1cm4gUX0pLHQuZChyLCJsZXJwIixmdW5jdGlvbigpe3JldHVybiBffSksdC5kKHIsImxlbmd0aCIsZnVuY3Rpb24oKXtyZXR1cm4gan0pLHQuZChyLCJsZW4iLGZ1bmN0aW9uKCl7cmV0dXJuIEd9KSx0LmQociwic3F1YXJlZExlbmd0aCIsZnVuY3Rpb24oKXtyZXR1cm4gWH0pLHQuZChyLCJzcXJMZW4iLGZ1bmN0aW9uKCl7cmV0dXJuIFp9KSx0LmQociwibm9ybWFsaXplIixmdW5jdGlvbigpe3JldHVybiB0dH0pLHQuZChyLCJleGFjdEVxdWFscyIsZnVuY3Rpb24oKXtyZXR1cm4gbnR9KSx0LmQociwiZXF1YWxzIixmdW5jdGlvbigpe3JldHVybiBxfSksdC5kKHIsInJvdGF0aW9uVG8iLGZ1bmN0aW9uKCl7cmV0dXJuIGR0fSksdC5kKHIsInNxbGVycCIsZnVuY3Rpb24oKXtyZXR1cm4gdXR9KSx0LmQociwic2V0QXhlcyIsZnVuY3Rpb24oKXtyZXR1cm4gV30pO3ZhciBlPXQoMiksbj10KDUpLGE9dCg4KSxzPXQoOSk7ZnVuY3Rpb24gaSgpe3ZhciBGPW5ldyBlLkFSUkFZX1RZUEUoNCk7cmV0dXJuIGUuQVJSQVlfVFlQRSE9RmxvYXQzMkFycmF5JiYoRlswXT0wLEZbMV09MCxGWzJdPTApLEZbM109MSxGfWZ1bmN0aW9uIG8oRil7cmV0dXJuIEZbMF09MCxGWzFdPTAsRlsyXT0wLEZbM109MSxGfWZ1bmN0aW9uIGMoRixWLEope0o9SiouNTt2YXIgTj1NYXRoLnNpbihKKTtyZXR1cm4gRlswXT1OKlZbMF0sRlsxXT1OKlZbMV0sRlsyXT1OKlZbMl0sRlszXT1NYXRoLmNvcyhKKSxGfWZ1bmN0aW9uIG0oRixWKXt2YXIgSj1NYXRoLmFjb3MoVlszXSkqMixOPU1hdGguc2luKEovMik7cmV0dXJuIE4+ZS5FUFNJTE9OPyhGWzBdPVZbMF0vTixGWzFdPVZbMV0vTixGWzJdPVZbMl0vTik6KEZbMF09MSxGWzFdPTAsRlsyXT0wKSxKfWZ1bmN0aW9uIHUoRixWKXt2YXIgSj1RKEYsVik7cmV0dXJuIE1hdGguYWNvcygyKkoqSi0xKX1mdW5jdGlvbiBwKEYsVixKKXt2YXIgTj1WWzBdLCQ9VlsxXSxTPVZbMl0sUD1WWzNdLHc9SlswXSxVPUpbMV0sSD1KWzJdLFk9SlszXTtyZXR1cm4gRlswXT1OKlkrUCp3KyQqSC1TKlUsRlsxXT0kKlkrUCpVK1Mqdy1OKkgsRlsyXT1TKlkrUCpIK04qVS0kKncsRlszXT1QKlktTip3LSQqVS1TKkgsRn1mdW5jdGlvbiB5KEYsVixKKXtKKj0uNTt2YXIgTj1WWzBdLCQ9VlsxXSxTPVZbMl0sUD1WWzNdLHc9TWF0aC5zaW4oSiksVT1NYXRoLmNvcyhKKTtyZXR1cm4gRlswXT1OKlUrUCp3LEZbMV09JCpVK1MqdyxGWzJdPVMqVS0kKncsRlszXT1QKlUtTip3LEZ9ZnVuY3Rpb24gTyhGLFYsSil7Sio9LjU7dmFyIE49VlswXSwkPVZbMV0sUz1WWzJdLFA9VlszXSx3PU1hdGguc2luKEopLFU9TWF0aC5jb3MoSik7cmV0dXJuIEZbMF09TipVLVMqdyxGWzFdPSQqVStQKncsRlsyXT1TKlUrTip3LEZbM109UCpVLSQqdyxGfWZ1bmN0aW9uIHgoRixWLEope0oqPS41O3ZhciBOPVZbMF0sJD1WWzFdLFM9VlsyXSxQPVZbM10sdz1NYXRoLnNpbihKKSxVPU1hdGguY29zKEopO3JldHVybiBGWzBdPU4qVSskKncsRlsxXT0kKlUtTip3LEZbMl09UypVK1AqdyxGWzNdPVAqVS1TKncsRn1mdW5jdGlvbiB2KEYsVil7dmFyIEo9VlswXSxOPVZbMV0sJD1WWzJdO3JldHVybiBGWzBdPUosRlsxXT1OLEZbMl09JCxGWzNdPU1hdGguc3FydChNYXRoLmFicygxLUoqSi1OKk4tJCokKSksRn1mdW5jdGlvbiBUKEYsVil7dmFyIEo9VlswXSxOPVZbMV0sJD1WWzJdLFM9VlszXSxQPU1hdGguc3FydChKKkorTipOKyQqJCksdz1NYXRoLmV4cChTKSxVPVA+MD93Kk1hdGguc2luKFApL1A6MDtyZXR1cm4gRlswXT1KKlUsRlsxXT1OKlUsRlsyXT0kKlUsRlszXT13Kk1hdGguY29zKFApLEZ9ZnVuY3Rpb24gbChGLFYpe3ZhciBKPVZbMF0sTj1WWzFdLCQ9VlsyXSxTPVZbM10sUD1NYXRoLnNxcnQoSipKK04qTiskKiQpLHc9UD4wP01hdGguYXRhbjIoUCxTKS9QOjA7cmV0dXJuIEZbMF09Sip3LEZbMV09Tip3LEZbMl09JCp3LEZbM109LjUqTWF0aC5sb2coSipKK04qTiskKiQrUypTKSxGfWZ1bmN0aW9uIGgoRixWLEope3JldHVybiBsKEYsViksSyhGLEYsSiksVChGLEYpLEZ9ZnVuY3Rpb24gZihGLFYsSixOKXt2YXIgJD1WWzBdLFM9VlsxXSxQPVZbMl0sdz1WWzNdLFU9SlswXSxIPUpbMV0sWT1KWzJdLGs9SlszXSxydCxpdCxjdCxodCxhdDtyZXR1cm4gaXQ9JCpVK1MqSCtQKlkrdyprLGl0PDAmJihpdD0taXQsVT0tVSxIPS1ILFk9LVksaz0tayksMS1pdD5lLkVQU0lMT04/KHJ0PU1hdGguYWNvcyhpdCksY3Q9TWF0aC5zaW4ocnQpLGh0PU1hdGguc2luKCgxLU4pKnJ0KS9jdCxhdD1NYXRoLnNpbihOKnJ0KS9jdCk6KGh0PTEtTixhdD1OKSxGWzBdPWh0KiQrYXQqVSxGWzFdPWh0KlMrYXQqSCxGWzJdPWh0KlArYXQqWSxGWzNdPWh0KncrYXQqayxGfWZ1bmN0aW9uIGcoRil7dmFyIFY9ZS5SQU5ET00oKSxKPWUuUkFORE9NKCksTj1lLlJBTkRPTSgpLCQ9TWF0aC5zcXJ0KDEtViksUz1NYXRoLnNxcnQoVik7cmV0dXJuIEZbMF09JCpNYXRoLnNpbigyKk1hdGguUEkqSiksRlsxXT0kKk1hdGguY29zKDIqTWF0aC5QSSpKKSxGWzJdPVMqTWF0aC5zaW4oMipNYXRoLlBJKk4pLEZbM109UypNYXRoLmNvcygyKk1hdGguUEkqTiksRn1mdW5jdGlvbiBNKEYsVil7dmFyIEo9VlswXSxOPVZbMV0sJD1WWzJdLFM9VlszXSxQPUoqSitOKk4rJCokK1MqUyx3PVA/MS9QOjA7cmV0dXJuIEZbMF09LUoqdyxGWzFdPS1OKncsRlsyXT0tJCp3LEZbM109Uyp3LEZ9ZnVuY3Rpb24gQShGLFYpe3JldHVybiBGWzBdPS1WWzBdLEZbMV09LVZbMV0sRlsyXT0tVlsyXSxGWzNdPVZbM10sRn1mdW5jdGlvbiBDKEYsVil7dmFyIEo9VlswXStWWzRdK1ZbOF0sTjtpZihKPjApTj1NYXRoLnNxcnQoSisxKSxGWzNdPS41Kk4sTj0uNS9OLEZbMF09KFZbNV0tVls3XSkqTixGWzFdPShWWzZdLVZbMl0pKk4sRlsyXT0oVlsxXS1WWzNdKSpOO2Vsc2V7dmFyICQ9MDtWWzRdPlZbMF0mJigkPTEpLFZbOF0+VlskKjMrJF0mJigkPTIpO3ZhciBTPSgkKzEpJTMsUD0oJCsyKSUzO049TWF0aC5zcXJ0KFZbJCozKyRdLVZbUyozK1NdLVZbUCozK1BdKzEpLEZbJF09LjUqTixOPS41L04sRlszXT0oVltTKjMrUF0tVltQKjMrU10pKk4sRltTXT0oVltTKjMrJF0rVlskKjMrU10pKk4sRltQXT0oVltQKjMrJF0rVlskKjMrUF0pKk59cmV0dXJuIEZ9ZnVuY3Rpb24gYihGLFYsSixOKXt2YXIgJD0uNSpNYXRoLlBJLzE4MDtWKj0kLEoqPSQsTio9JDt2YXIgUz1NYXRoLnNpbihWKSxQPU1hdGguY29zKFYpLHc9TWF0aC5zaW4oSiksVT1NYXRoLmNvcyhKKSxIPU1hdGguc2luKE4pLFk9TWF0aC5jb3MoTik7cmV0dXJuIEZbMF09UypVKlktUCp3KkgsRlsxXT1QKncqWStTKlUqSCxGWzJdPVAqVSpILVMqdypZLEZbM109UCpVKlkrUyp3KkgsRn1mdW5jdGlvbiBFKEYpe3JldHVybiJxdWF0KCIrRlswXSsiLCAiK0ZbMV0rIiwgIitGWzJdKyIsICIrRlszXSsiKSJ9dmFyIEw9cy5jbG9uZSxEPXMuZnJvbVZhbHVlcyxJPXMuY29weSxSPXMuc2V0LEI9cy5hZGQsej1wLEs9cy5zY2FsZSxRPXMuZG90LF89cy5sZXJwLGo9cy5sZW5ndGgsRz1qLFg9cy5zcXVhcmVkTGVuZ3RoLFo9WCx0dD1zLm5vcm1hbGl6ZSxudD1zLmV4YWN0RXF1YWxzLHE9cy5lcXVhbHMsZHQ9ZnVuY3Rpb24oKXt2YXIgRj1hLmNyZWF0ZSgpLFY9YS5mcm9tVmFsdWVzKDEsMCwwKSxKPWEuZnJvbVZhbHVlcygwLDEsMCk7cmV0dXJuIGZ1bmN0aW9uKE4sJCxTKXt2YXIgUD1hLmRvdCgkLFMpO3JldHVybiBQPC0uOTk5OTk5PyhhLmNyb3NzKEYsViwkKSxhLmxlbihGKTwxZS02JiZhLmNyb3NzKEYsSiwkKSxhLm5vcm1hbGl6ZShGLEYpLGMoTixGLE1hdGguUEkpLE4pOlA+Ljk5OTk5OT8oTlswXT0wLE5bMV09MCxOWzJdPTAsTlszXT0xLE4pOihhLmNyb3NzKEYsJCxTKSxOWzBdPUZbMF0sTlsxXT1GWzFdLE5bMl09RlsyXSxOWzNdPTErUCx0dChOLE4pKX19KCksdXQ9ZnVuY3Rpb24oKXt2YXIgRj1pKCksVj1pKCk7cmV0dXJuIGZ1bmN0aW9uKEosTiwkLFMsUCx3KXtyZXR1cm4gZihGLE4sUCx3KSxmKFYsJCxTLHcpLGYoSixGLFYsMip3KigxLXcpKSxKfX0oKSxXPWZ1bmN0aW9uKCl7dmFyIEY9bi5jcmVhdGUoKTtyZXR1cm4gZnVuY3Rpb24oVixKLE4sJCl7cmV0dXJuIEZbMF09TlswXSxGWzNdPU5bMV0sRls2XT1OWzJdLEZbMV09JFswXSxGWzRdPSRbMV0sRls3XT0kWzJdLEZbMl09LUpbMF0sRls1XT0tSlsxXSxGWzhdPS1KWzJdLHR0KFYsQyhWLEYpKX19KCl9LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImNyZWF0ZSIsZnVuY3Rpb24oKXtyZXR1cm4gbn0pLHQuZChyLCJjbG9uZSIsZnVuY3Rpb24oKXtyZXR1cm4gYX0pLHQuZChyLCJsZW5ndGgiLGZ1bmN0aW9uKCl7cmV0dXJuIHN9KSx0LmQociwiZnJvbVZhbHVlcyIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pLHQuZChyLCJjb3B5IixmdW5jdGlvbigpe3JldHVybiBvfSksdC5kKHIsInNldCIsZnVuY3Rpb24oKXtyZXR1cm4gY30pLHQuZChyLCJhZGQiLGZ1bmN0aW9uKCl7cmV0dXJuIG19KSx0LmQociwic3VidHJhY3QiLGZ1bmN0aW9uKCl7cmV0dXJuIHV9KSx0LmQociwibXVsdGlwbHkiLGZ1bmN0aW9uKCl7cmV0dXJuIHB9KSx0LmQociwiZGl2aWRlIixmdW5jdGlvbigpe3JldHVybiB5fSksdC5kKHIsImNlaWwiLGZ1bmN0aW9uKCl7cmV0dXJuIE99KSx0LmQociwiZmxvb3IiLGZ1bmN0aW9uKCl7cmV0dXJuIHh9KSx0LmQociwibWluIixmdW5jdGlvbigpe3JldHVybiB2fSksdC5kKHIsIm1heCIsZnVuY3Rpb24oKXtyZXR1cm4gVH0pLHQuZChyLCJyb3VuZCIsZnVuY3Rpb24oKXtyZXR1cm4gbH0pLHQuZChyLCJzY2FsZSIsZnVuY3Rpb24oKXtyZXR1cm4gaH0pLHQuZChyLCJzY2FsZUFuZEFkZCIsZnVuY3Rpb24oKXtyZXR1cm4gZn0pLHQuZChyLCJkaXN0YW5jZSIsZnVuY3Rpb24oKXtyZXR1cm4gZ30pLHQuZChyLCJzcXVhcmVkRGlzdGFuY2UiLGZ1bmN0aW9uKCl7cmV0dXJuIE19KSx0LmQociwic3F1YXJlZExlbmd0aCIsZnVuY3Rpb24oKXtyZXR1cm4gQX0pLHQuZChyLCJuZWdhdGUiLGZ1bmN0aW9uKCl7cmV0dXJuIEN9KSx0LmQociwiaW52ZXJzZSIsZnVuY3Rpb24oKXtyZXR1cm4gYn0pLHQuZChyLCJub3JtYWxpemUiLGZ1bmN0aW9uKCl7cmV0dXJuIEV9KSx0LmQociwiZG90IixmdW5jdGlvbigpe3JldHVybiBMfSksdC5kKHIsImNyb3NzIixmdW5jdGlvbigpe3JldHVybiBEfSksdC5kKHIsImxlcnAiLGZ1bmN0aW9uKCl7cmV0dXJuIEl9KSx0LmQociwiaGVybWl0ZSIsZnVuY3Rpb24oKXtyZXR1cm4gUn0pLHQuZChyLCJiZXppZXIiLGZ1bmN0aW9uKCl7cmV0dXJuIEJ9KSx0LmQociwicmFuZG9tIixmdW5jdGlvbigpe3JldHVybiB6fSksdC5kKHIsInRyYW5zZm9ybU1hdDQiLGZ1bmN0aW9uKCl7cmV0dXJuIEt9KSx0LmQociwidHJhbnNmb3JtTWF0MyIsZnVuY3Rpb24oKXtyZXR1cm4gUX0pLHQuZChyLCJ0cmFuc2Zvcm1RdWF0IixmdW5jdGlvbigpe3JldHVybiBffSksdC5kKHIsInJvdGF0ZVgiLGZ1bmN0aW9uKCl7cmV0dXJuIGp9KSx0LmQociwicm90YXRlWSIsZnVuY3Rpb24oKXtyZXR1cm4gR30pLHQuZChyLCJyb3RhdGVaIixmdW5jdGlvbigpe3JldHVybiBYfSksdC5kKHIsImFuZ2xlIixmdW5jdGlvbigpe3JldHVybiBafSksdC5kKHIsInplcm8iLGZ1bmN0aW9uKCl7cmV0dXJuIHR0fSksdC5kKHIsInN0ciIsZnVuY3Rpb24oKXtyZXR1cm4gbnR9KSx0LmQociwiZXhhY3RFcXVhbHMiLGZ1bmN0aW9uKCl7cmV0dXJuIHF9KSx0LmQociwiZXF1YWxzIixmdW5jdGlvbigpe3JldHVybiBkdH0pLHQuZChyLCJzdWIiLGZ1bmN0aW9uKCl7cmV0dXJuIHV0fSksdC5kKHIsIm11bCIsZnVuY3Rpb24oKXtyZXR1cm4gV30pLHQuZChyLCJkaXYiLGZ1bmN0aW9uKCl7cmV0dXJuIEZ9KSx0LmQociwiZGlzdCIsZnVuY3Rpb24oKXtyZXR1cm4gVn0pLHQuZChyLCJzcXJEaXN0IixmdW5jdGlvbigpe3JldHVybiBKfSksdC5kKHIsImxlbiIsZnVuY3Rpb24oKXtyZXR1cm4gTn0pLHQuZChyLCJzcXJMZW4iLGZ1bmN0aW9uKCl7cmV0dXJuICR9KSx0LmQociwiZm9yRWFjaCIsZnVuY3Rpb24oKXtyZXR1cm4gU30pO3ZhciBlPXQoMik7ZnVuY3Rpb24gbigpe3ZhciBQPW5ldyBlLkFSUkFZX1RZUEUoMyk7cmV0dXJuIGUuQVJSQVlfVFlQRSE9RmxvYXQzMkFycmF5JiYoUFswXT0wLFBbMV09MCxQWzJdPTApLFB9ZnVuY3Rpb24gYShQKXt2YXIgdz1uZXcgZS5BUlJBWV9UWVBFKDMpO3JldHVybiB3WzBdPVBbMF0sd1sxXT1QWzFdLHdbMl09UFsyXSx3fWZ1bmN0aW9uIHMoUCl7dmFyIHc9UFswXSxVPVBbMV0sSD1QWzJdO3JldHVybiBNYXRoLmh5cG90KHcsVSxIKX1mdW5jdGlvbiBpKFAsdyxVKXt2YXIgSD1uZXcgZS5BUlJBWV9UWVBFKDMpO3JldHVybiBIWzBdPVAsSFsxXT13LEhbMl09VSxIfWZ1bmN0aW9uIG8oUCx3KXtyZXR1cm4gUFswXT13WzBdLFBbMV09d1sxXSxQWzJdPXdbMl0sUH1mdW5jdGlvbiBjKFAsdyxVLEgpe3JldHVybiBQWzBdPXcsUFsxXT1VLFBbMl09SCxQfWZ1bmN0aW9uIG0oUCx3LFUpe3JldHVybiBQWzBdPXdbMF0rVVswXSxQWzFdPXdbMV0rVVsxXSxQWzJdPXdbMl0rVVsyXSxQfWZ1bmN0aW9uIHUoUCx3LFUpe3JldHVybiBQWzBdPXdbMF0tVVswXSxQWzFdPXdbMV0tVVsxXSxQWzJdPXdbMl0tVVsyXSxQfWZ1bmN0aW9uIHAoUCx3LFUpe3JldHVybiBQWzBdPXdbMF0qVVswXSxQWzFdPXdbMV0qVVsxXSxQWzJdPXdbMl0qVVsyXSxQfWZ1bmN0aW9uIHkoUCx3LFUpe3JldHVybiBQWzBdPXdbMF0vVVswXSxQWzFdPXdbMV0vVVsxXSxQWzJdPXdbMl0vVVsyXSxQfWZ1bmN0aW9uIE8oUCx3KXtyZXR1cm4gUFswXT1NYXRoLmNlaWwod1swXSksUFsxXT1NYXRoLmNlaWwod1sxXSksUFsyXT1NYXRoLmNlaWwod1syXSksUH1mdW5jdGlvbiB4KFAsdyl7cmV0dXJuIFBbMF09TWF0aC5mbG9vcih3WzBdKSxQWzFdPU1hdGguZmxvb3Iod1sxXSksUFsyXT1NYXRoLmZsb29yKHdbMl0pLFB9ZnVuY3Rpb24gdihQLHcsVSl7cmV0dXJuIFBbMF09TWF0aC5taW4od1swXSxVWzBdKSxQWzFdPU1hdGgubWluKHdbMV0sVVsxXSksUFsyXT1NYXRoLm1pbih3WzJdLFVbMl0pLFB9ZnVuY3Rpb24gVChQLHcsVSl7cmV0dXJuIFBbMF09TWF0aC5tYXgod1swXSxVWzBdKSxQWzFdPU1hdGgubWF4KHdbMV0sVVsxXSksUFsyXT1NYXRoLm1heCh3WzJdLFVbMl0pLFB9ZnVuY3Rpb24gbChQLHcpe3JldHVybiBQWzBdPU1hdGgucm91bmQod1swXSksUFsxXT1NYXRoLnJvdW5kKHdbMV0pLFBbMl09TWF0aC5yb3VuZCh3WzJdKSxQfWZ1bmN0aW9uIGgoUCx3LFUpe3JldHVybiBQWzBdPXdbMF0qVSxQWzFdPXdbMV0qVSxQWzJdPXdbMl0qVSxQfWZ1bmN0aW9uIGYoUCx3LFUsSCl7cmV0dXJuIFBbMF09d1swXStVWzBdKkgsUFsxXT13WzFdK1VbMV0qSCxQWzJdPXdbMl0rVVsyXSpILFB9ZnVuY3Rpb24gZyhQLHcpe3ZhciBVPXdbMF0tUFswXSxIPXdbMV0tUFsxXSxZPXdbMl0tUFsyXTtyZXR1cm4gTWF0aC5oeXBvdChVLEgsWSl9ZnVuY3Rpb24gTShQLHcpe3ZhciBVPXdbMF0tUFswXSxIPXdbMV0tUFsxXSxZPXdbMl0tUFsyXTtyZXR1cm4gVSpVK0gqSCtZKll9ZnVuY3Rpb24gQShQKXt2YXIgdz1QWzBdLFU9UFsxXSxIPVBbMl07cmV0dXJuIHcqdytVKlUrSCpIfWZ1bmN0aW9uIEMoUCx3KXtyZXR1cm4gUFswXT0td1swXSxQWzFdPS13WzFdLFBbMl09LXdbMl0sUH1mdW5jdGlvbiBiKFAsdyl7cmV0dXJuIFBbMF09MS93WzBdLFBbMV09MS93WzFdLFBbMl09MS93WzJdLFB9ZnVuY3Rpb24gRShQLHcpe3ZhciBVPXdbMF0sSD13WzFdLFk9d1syXSxrPVUqVStIKkgrWSpZO3JldHVybiBrPjAmJihrPTEvTWF0aC5zcXJ0KGspKSxQWzBdPXdbMF0qayxQWzFdPXdbMV0qayxQWzJdPXdbMl0qayxQfWZ1bmN0aW9uIEwoUCx3KXtyZXR1cm4gUFswXSp3WzBdK1BbMV0qd1sxXStQWzJdKndbMl19ZnVuY3Rpb24gRChQLHcsVSl7dmFyIEg9d1swXSxZPXdbMV0saz13WzJdLHJ0PVVbMF0saXQ9VVsxXSxjdD1VWzJdO3JldHVybiBQWzBdPVkqY3QtayppdCxQWzFdPWsqcnQtSCpjdCxQWzJdPUgqaXQtWSpydCxQfWZ1bmN0aW9uIEkoUCx3LFUsSCl7dmFyIFk9d1swXSxrPXdbMV0scnQ9d1syXTtyZXR1cm4gUFswXT1ZK0gqKFVbMF0tWSksUFsxXT1rK0gqKFVbMV0tayksUFsyXT1ydCtIKihVWzJdLXJ0KSxQfWZ1bmN0aW9uIFIoUCx3LFUsSCxZLGspe3ZhciBydD1rKmssaXQ9cnQqKDIqay0zKSsxLGN0PXJ0KihrLTIpK2ssaHQ9cnQqKGstMSksYXQ9cnQqKDMtMiprKTtyZXR1cm4gUFswXT13WzBdKml0K1VbMF0qY3QrSFswXSpodCtZWzBdKmF0LFBbMV09d1sxXSppdCtVWzFdKmN0K0hbMV0qaHQrWVsxXSphdCxQWzJdPXdbMl0qaXQrVVsyXSpjdCtIWzJdKmh0K1lbMl0qYXQsUH1mdW5jdGlvbiBCKFAsdyxVLEgsWSxrKXt2YXIgcnQ9MS1rLGl0PXJ0KnJ0LGN0PWsqayxodD1pdCpydCxhdD0zKmsqaXQsb3Q9MypjdCpydCxmdD1jdCprO3JldHVybiBQWzBdPXdbMF0qaHQrVVswXSphdCtIWzBdKm90K1lbMF0qZnQsUFsxXT13WzFdKmh0K1VbMV0qYXQrSFsxXSpvdCtZWzFdKmZ0LFBbMl09d1syXSpodCtVWzJdKmF0K0hbMl0qb3QrWVsyXSpmdCxQfWZ1bmN0aW9uIHooUCx3KXt3PXd8fDE7dmFyIFU9ZS5SQU5ET00oKSoyKk1hdGguUEksSD1lLlJBTkRPTSgpKjItMSxZPU1hdGguc3FydCgxLUgqSCkqdztyZXR1cm4gUFswXT1NYXRoLmNvcyhVKSpZLFBbMV09TWF0aC5zaW4oVSkqWSxQWzJdPUgqdyxQfWZ1bmN0aW9uIEsoUCx3LFUpe3ZhciBIPXdbMF0sWT13WzFdLGs9d1syXSxydD1VWzNdKkgrVVs3XSpZK1VbMTFdKmsrVVsxNV07cmV0dXJuIHJ0PXJ0fHwxLFBbMF09KFVbMF0qSCtVWzRdKlkrVVs4XSprK1VbMTJdKS9ydCxQWzFdPShVWzFdKkgrVVs1XSpZK1VbOV0qaytVWzEzXSkvcnQsUFsyXT0oVVsyXSpIK1VbNl0qWStVWzEwXSprK1VbMTRdKS9ydCxQfWZ1bmN0aW9uIFEoUCx3LFUpe3ZhciBIPXdbMF0sWT13WzFdLGs9d1syXTtyZXR1cm4gUFswXT1IKlVbMF0rWSpVWzNdK2sqVVs2XSxQWzFdPUgqVVsxXStZKlVbNF0raypVWzddLFBbMl09SCpVWzJdK1kqVVs1XStrKlVbOF0sUH1mdW5jdGlvbiBfKFAsdyxVKXt2YXIgSD1VWzBdLFk9VVsxXSxrPVVbMl0scnQ9VVszXSxpdD13WzBdLGN0PXdbMV0saHQ9d1syXSxhdD1ZKmh0LWsqY3Qsb3Q9ayppdC1IKmh0LGZ0PUgqY3QtWSppdCxtdD1ZKmZ0LWsqb3QsdnQ9ayphdC1IKmZ0LHB0PUgqb3QtWSphdCx4dD1ydCoyO3JldHVybiBhdCo9eHQsb3QqPXh0LGZ0Kj14dCxtdCo9Mix2dCo9MixwdCo9MixQWzBdPWl0K2F0K210LFBbMV09Y3Qrb3QrdnQsUFsyXT1odCtmdCtwdCxQfWZ1bmN0aW9uIGooUCx3LFUsSCl7dmFyIFk9W10saz1bXTtyZXR1cm4gWVswXT13WzBdLVVbMF0sWVsxXT13WzFdLVVbMV0sWVsyXT13WzJdLVVbMl0sa1swXT1ZWzBdLGtbMV09WVsxXSpNYXRoLmNvcyhIKS1ZWzJdKk1hdGguc2luKEgpLGtbMl09WVsxXSpNYXRoLnNpbihIKStZWzJdKk1hdGguY29zKEgpLFBbMF09a1swXStVWzBdLFBbMV09a1sxXStVWzFdLFBbMl09a1syXStVWzJdLFB9ZnVuY3Rpb24gRyhQLHcsVSxIKXt2YXIgWT1bXSxrPVtdO3JldHVybiBZWzBdPXdbMF0tVVswXSxZWzFdPXdbMV0tVVsxXSxZWzJdPXdbMl0tVVsyXSxrWzBdPVlbMl0qTWF0aC5zaW4oSCkrWVswXSpNYXRoLmNvcyhIKSxrWzFdPVlbMV0sa1syXT1ZWzJdKk1hdGguY29zKEgpLVlbMF0qTWF0aC5zaW4oSCksUFswXT1rWzBdK1VbMF0sUFsxXT1rWzFdK1VbMV0sUFsyXT1rWzJdK1VbMl0sUH1mdW5jdGlvbiBYKFAsdyxVLEgpe3ZhciBZPVtdLGs9W107cmV0dXJuIFlbMF09d1swXS1VWzBdLFlbMV09d1sxXS1VWzFdLFlbMl09d1syXS1VWzJdLGtbMF09WVswXSpNYXRoLmNvcyhIKS1ZWzFdKk1hdGguc2luKEgpLGtbMV09WVswXSpNYXRoLnNpbihIKStZWzFdKk1hdGguY29zKEgpLGtbMl09WVsyXSxQWzBdPWtbMF0rVVswXSxQWzFdPWtbMV0rVVsxXSxQWzJdPWtbMl0rVVsyXSxQfWZ1bmN0aW9uIFooUCx3KXt2YXIgVT1QWzBdLEg9UFsxXSxZPVBbMl0saz13WzBdLHJ0PXdbMV0saXQ9d1syXSxjdD1NYXRoLnNxcnQoVSpVK0gqSCtZKlkpLGh0PU1hdGguc3FydChrKmsrcnQqcnQraXQqaXQpLGF0PWN0Kmh0LG90PWF0JiZMKFAsdykvYXQ7cmV0dXJuIE1hdGguYWNvcyhNYXRoLm1pbihNYXRoLm1heChvdCwtMSksMSkpfWZ1bmN0aW9uIHR0KFApe3JldHVybiBQWzBdPTAsUFsxXT0wLFBbMl09MCxQfWZ1bmN0aW9uIG50KFApe3JldHVybiJ2ZWMzKCIrUFswXSsiLCAiK1BbMV0rIiwgIitQWzJdKyIpIn1mdW5jdGlvbiBxKFAsdyl7cmV0dXJuIFBbMF09PT13WzBdJiZQWzFdPT09d1sxXSYmUFsyXT09PXdbMl19ZnVuY3Rpb24gZHQoUCx3KXt2YXIgVT1QWzBdLEg9UFsxXSxZPVBbMl0saz13WzBdLHJ0PXdbMV0saXQ9d1syXTtyZXR1cm4gTWF0aC5hYnMoVS1rKTw9ZS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoVSksTWF0aC5hYnMoaykpJiZNYXRoLmFicyhILXJ0KTw9ZS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoSCksTWF0aC5hYnMocnQpKSYmTWF0aC5hYnMoWS1pdCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKFkpLE1hdGguYWJzKGl0KSl9dmFyIHV0PXUsVz1wLEY9eSxWPWcsSj1NLE49cywkPUEsUz1mdW5jdGlvbigpe3ZhciBQPW4oKTtyZXR1cm4gZnVuY3Rpb24odyxVLEgsWSxrLHJ0KXt2YXIgaXQsY3Q7Zm9yKFV8fChVPTMpLEh8fChIPTApLFk/Y3Q9TWF0aC5taW4oWSpVK0gsdy5sZW5ndGgpOmN0PXcubGVuZ3RoLGl0PUg7aXQ8Y3Q7aXQrPVUpUFswXT13W2l0XSxQWzFdPXdbaXQrMV0sUFsyXT13W2l0KzJdLGsoUCxQLHJ0KSx3W2l0XT1QWzBdLHdbaXQrMV09UFsxXSx3W2l0KzJdPVBbMl07cmV0dXJuIHd9fSgpfSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJjcmVhdGUiLGZ1bmN0aW9uKCl7cmV0dXJuIG59KSx0LmQociwiY2xvbmUiLGZ1bmN0aW9uKCl7cmV0dXJuIGF9KSx0LmQociwiZnJvbVZhbHVlcyIsZnVuY3Rpb24oKXtyZXR1cm4gc30pLHQuZChyLCJjb3B5IixmdW5jdGlvbigpe3JldHVybiBpfSksdC5kKHIsInNldCIsZnVuY3Rpb24oKXtyZXR1cm4gb30pLHQuZChyLCJhZGQiLGZ1bmN0aW9uKCl7cmV0dXJuIGN9KSx0LmQociwic3VidHJhY3QiLGZ1bmN0aW9uKCl7cmV0dXJuIG19KSx0LmQociwibXVsdGlwbHkiLGZ1bmN0aW9uKCl7cmV0dXJuIHV9KSx0LmQociwiZGl2aWRlIixmdW5jdGlvbigpe3JldHVybiBwfSksdC5kKHIsImNlaWwiLGZ1bmN0aW9uKCl7cmV0dXJuIHl9KSx0LmQociwiZmxvb3IiLGZ1bmN0aW9uKCl7cmV0dXJuIE99KSx0LmQociwibWluIixmdW5jdGlvbigpe3JldHVybiB4fSksdC5kKHIsIm1heCIsZnVuY3Rpb24oKXtyZXR1cm4gdn0pLHQuZChyLCJyb3VuZCIsZnVuY3Rpb24oKXtyZXR1cm4gVH0pLHQuZChyLCJzY2FsZSIsZnVuY3Rpb24oKXtyZXR1cm4gbH0pLHQuZChyLCJzY2FsZUFuZEFkZCIsZnVuY3Rpb24oKXtyZXR1cm4gaH0pLHQuZChyLCJkaXN0YW5jZSIsZnVuY3Rpb24oKXtyZXR1cm4gZn0pLHQuZChyLCJzcXVhcmVkRGlzdGFuY2UiLGZ1bmN0aW9uKCl7cmV0dXJuIGd9KSx0LmQociwibGVuZ3RoIixmdW5jdGlvbigpe3JldHVybiBNfSksdC5kKHIsInNxdWFyZWRMZW5ndGgiLGZ1bmN0aW9uKCl7cmV0dXJuIEF9KSx0LmQociwibmVnYXRlIixmdW5jdGlvbigpe3JldHVybiBDfSksdC5kKHIsImludmVyc2UiLGZ1bmN0aW9uKCl7cmV0dXJuIGJ9KSx0LmQociwibm9ybWFsaXplIixmdW5jdGlvbigpe3JldHVybiBFfSksdC5kKHIsImRvdCIsZnVuY3Rpb24oKXtyZXR1cm4gTH0pLHQuZChyLCJjcm9zcyIsZnVuY3Rpb24oKXtyZXR1cm4gRH0pLHQuZChyLCJsZXJwIixmdW5jdGlvbigpe3JldHVybiBJfSksdC5kKHIsInJhbmRvbSIsZnVuY3Rpb24oKXtyZXR1cm4gUn0pLHQuZChyLCJ0cmFuc2Zvcm1NYXQ0IixmdW5jdGlvbigpe3JldHVybiBCfSksdC5kKHIsInRyYW5zZm9ybVF1YXQiLGZ1bmN0aW9uKCl7cmV0dXJuIHp9KSx0LmQociwiemVybyIsZnVuY3Rpb24oKXtyZXR1cm4gS30pLHQuZChyLCJzdHIiLGZ1bmN0aW9uKCl7cmV0dXJuIFF9KSx0LmQociwiZXhhY3RFcXVhbHMiLGZ1bmN0aW9uKCl7cmV0dXJuIF99KSx0LmQociwiZXF1YWxzIixmdW5jdGlvbigpe3JldHVybiBqfSksdC5kKHIsInN1YiIsZnVuY3Rpb24oKXtyZXR1cm4gR30pLHQuZChyLCJtdWwiLGZ1bmN0aW9uKCl7cmV0dXJuIFh9KSx0LmQociwiZGl2IixmdW5jdGlvbigpe3JldHVybiBafSksdC5kKHIsImRpc3QiLGZ1bmN0aW9uKCl7cmV0dXJuIHR0fSksdC5kKHIsInNxckRpc3QiLGZ1bmN0aW9uKCl7cmV0dXJuIG50fSksdC5kKHIsImxlbiIsZnVuY3Rpb24oKXtyZXR1cm4gcX0pLHQuZChyLCJzcXJMZW4iLGZ1bmN0aW9uKCl7cmV0dXJuIGR0fSksdC5kKHIsImZvckVhY2giLGZ1bmN0aW9uKCl7cmV0dXJuIHV0fSk7dmFyIGU9dCgyKTtmdW5jdGlvbiBuKCl7dmFyIFc9bmV3IGUuQVJSQVlfVFlQRSg0KTtyZXR1cm4gZS5BUlJBWV9UWVBFIT1GbG9hdDMyQXJyYXkmJihXWzBdPTAsV1sxXT0wLFdbMl09MCxXWzNdPTApLFd9ZnVuY3Rpb24gYShXKXt2YXIgRj1uZXcgZS5BUlJBWV9UWVBFKDQpO3JldHVybiBGWzBdPVdbMF0sRlsxXT1XWzFdLEZbMl09V1syXSxGWzNdPVdbM10sRn1mdW5jdGlvbiBzKFcsRixWLEope3ZhciBOPW5ldyBlLkFSUkFZX1RZUEUoNCk7cmV0dXJuIE5bMF09VyxOWzFdPUYsTlsyXT1WLE5bM109SixOfWZ1bmN0aW9uIGkoVyxGKXtyZXR1cm4gV1swXT1GWzBdLFdbMV09RlsxXSxXWzJdPUZbMl0sV1szXT1GWzNdLFd9ZnVuY3Rpb24gbyhXLEYsVixKLE4pe3JldHVybiBXWzBdPUYsV1sxXT1WLFdbMl09SixXWzNdPU4sV31mdW5jdGlvbiBjKFcsRixWKXtyZXR1cm4gV1swXT1GWzBdK1ZbMF0sV1sxXT1GWzFdK1ZbMV0sV1syXT1GWzJdK1ZbMl0sV1szXT1GWzNdK1ZbM10sV31mdW5jdGlvbiBtKFcsRixWKXtyZXR1cm4gV1swXT1GWzBdLVZbMF0sV1sxXT1GWzFdLVZbMV0sV1syXT1GWzJdLVZbMl0sV1szXT1GWzNdLVZbM10sV31mdW5jdGlvbiB1KFcsRixWKXtyZXR1cm4gV1swXT1GWzBdKlZbMF0sV1sxXT1GWzFdKlZbMV0sV1syXT1GWzJdKlZbMl0sV1szXT1GWzNdKlZbM10sV31mdW5jdGlvbiBwKFcsRixWKXtyZXR1cm4gV1swXT1GWzBdL1ZbMF0sV1sxXT1GWzFdL1ZbMV0sV1syXT1GWzJdL1ZbMl0sV1szXT1GWzNdL1ZbM10sV31mdW5jdGlvbiB5KFcsRil7cmV0dXJuIFdbMF09TWF0aC5jZWlsKEZbMF0pLFdbMV09TWF0aC5jZWlsKEZbMV0pLFdbMl09TWF0aC5jZWlsKEZbMl0pLFdbM109TWF0aC5jZWlsKEZbM10pLFd9ZnVuY3Rpb24gTyhXLEYpe3JldHVybiBXWzBdPU1hdGguZmxvb3IoRlswXSksV1sxXT1NYXRoLmZsb29yKEZbMV0pLFdbMl09TWF0aC5mbG9vcihGWzJdKSxXWzNdPU1hdGguZmxvb3IoRlszXSksV31mdW5jdGlvbiB4KFcsRixWKXtyZXR1cm4gV1swXT1NYXRoLm1pbihGWzBdLFZbMF0pLFdbMV09TWF0aC5taW4oRlsxXSxWWzFdKSxXWzJdPU1hdGgubWluKEZbMl0sVlsyXSksV1szXT1NYXRoLm1pbihGWzNdLFZbM10pLFd9ZnVuY3Rpb24gdihXLEYsVil7cmV0dXJuIFdbMF09TWF0aC5tYXgoRlswXSxWWzBdKSxXWzFdPU1hdGgubWF4KEZbMV0sVlsxXSksV1syXT1NYXRoLm1heChGWzJdLFZbMl0pLFdbM109TWF0aC5tYXgoRlszXSxWWzNdKSxXfWZ1bmN0aW9uIFQoVyxGKXtyZXR1cm4gV1swXT1NYXRoLnJvdW5kKEZbMF0pLFdbMV09TWF0aC5yb3VuZChGWzFdKSxXWzJdPU1hdGgucm91bmQoRlsyXSksV1szXT1NYXRoLnJvdW5kKEZbM10pLFd9ZnVuY3Rpb24gbChXLEYsVil7cmV0dXJuIFdbMF09RlswXSpWLFdbMV09RlsxXSpWLFdbMl09RlsyXSpWLFdbM109RlszXSpWLFd9ZnVuY3Rpb24gaChXLEYsVixKKXtyZXR1cm4gV1swXT1GWzBdK1ZbMF0qSixXWzFdPUZbMV0rVlsxXSpKLFdbMl09RlsyXStWWzJdKkosV1szXT1GWzNdK1ZbM10qSixXfWZ1bmN0aW9uIGYoVyxGKXt2YXIgVj1GWzBdLVdbMF0sSj1GWzFdLVdbMV0sTj1GWzJdLVdbMl0sJD1GWzNdLVdbM107cmV0dXJuIE1hdGguaHlwb3QoVixKLE4sJCl9ZnVuY3Rpb24gZyhXLEYpe3ZhciBWPUZbMF0tV1swXSxKPUZbMV0tV1sxXSxOPUZbMl0tV1syXSwkPUZbM10tV1szXTtyZXR1cm4gVipWK0oqSitOKk4rJCokfWZ1bmN0aW9uIE0oVyl7dmFyIEY9V1swXSxWPVdbMV0sSj1XWzJdLE49V1szXTtyZXR1cm4gTWF0aC5oeXBvdChGLFYsSixOKX1mdW5jdGlvbiBBKFcpe3ZhciBGPVdbMF0sVj1XWzFdLEo9V1syXSxOPVdbM107cmV0dXJuIEYqRitWKlYrSipKK04qTn1mdW5jdGlvbiBDKFcsRil7cmV0dXJuIFdbMF09LUZbMF0sV1sxXT0tRlsxXSxXWzJdPS1GWzJdLFdbM109LUZbM10sV31mdW5jdGlvbiBiKFcsRil7cmV0dXJuIFdbMF09MS9GWzBdLFdbMV09MS9GWzFdLFdbMl09MS9GWzJdLFdbM109MS9GWzNdLFd9ZnVuY3Rpb24gRShXLEYpe3ZhciBWPUZbMF0sSj1GWzFdLE49RlsyXSwkPUZbM10sUz1WKlYrSipKK04qTiskKiQ7cmV0dXJuIFM+MCYmKFM9MS9NYXRoLnNxcnQoUykpLFdbMF09VipTLFdbMV09SipTLFdbMl09TipTLFdbM109JCpTLFd9ZnVuY3Rpb24gTChXLEYpe3JldHVybiBXWzBdKkZbMF0rV1sxXSpGWzFdK1dbMl0qRlsyXStXWzNdKkZbM119ZnVuY3Rpb24gRChXLEYsVixKKXt2YXIgTj1WWzBdKkpbMV0tVlsxXSpKWzBdLCQ9VlswXSpKWzJdLVZbMl0qSlswXSxTPVZbMF0qSlszXS1WWzNdKkpbMF0sUD1WWzFdKkpbMl0tVlsyXSpKWzFdLHc9VlsxXSpKWzNdLVZbM10qSlsxXSxVPVZbMl0qSlszXS1WWzNdKkpbMl0sSD1GWzBdLFk9RlsxXSxrPUZbMl0scnQ9RlszXTtyZXR1cm4gV1swXT1ZKlUtayp3K3J0KlAsV1sxXT0tKEgqVSkraypTLXJ0KiQsV1syXT1IKnctWSpTK3J0Kk4sV1szXT0tKEgqUCkrWSokLWsqTixXfWZ1bmN0aW9uIEkoVyxGLFYsSil7dmFyIE49RlswXSwkPUZbMV0sUz1GWzJdLFA9RlszXTtyZXR1cm4gV1swXT1OK0oqKFZbMF0tTiksV1sxXT0kK0oqKFZbMV0tJCksV1syXT1TK0oqKFZbMl0tUyksV1szXT1QK0oqKFZbM10tUCksV31mdW5jdGlvbiBSKFcsRil7Rj1GfHwxO3ZhciBWLEosTiwkLFMsUDtkbyBWPWUuUkFORE9NKCkqMi0xLEo9ZS5SQU5ET00oKSoyLTEsUz1WKlYrSipKO3doaWxlKFM+PTEpO2RvIE49ZS5SQU5ET00oKSoyLTEsJD1lLlJBTkRPTSgpKjItMSxQPU4qTiskKiQ7d2hpbGUoUD49MSk7dmFyIHc9TWF0aC5zcXJ0KCgxLVMpL1ApO3JldHVybiBXWzBdPUYqVixXWzFdPUYqSixXWzJdPUYqTip3LFdbM109RiokKncsV31mdW5jdGlvbiBCKFcsRixWKXt2YXIgSj1GWzBdLE49RlsxXSwkPUZbMl0sUz1GWzNdO3JldHVybiBXWzBdPVZbMF0qSitWWzRdKk4rVls4XSokK1ZbMTJdKlMsV1sxXT1WWzFdKkorVls1XSpOK1ZbOV0qJCtWWzEzXSpTLFdbMl09VlsyXSpKK1ZbNl0qTitWWzEwXSokK1ZbMTRdKlMsV1szXT1WWzNdKkorVls3XSpOK1ZbMTFdKiQrVlsxNV0qUyxXfWZ1bmN0aW9uIHooVyxGLFYpe3ZhciBKPUZbMF0sTj1GWzFdLCQ9RlsyXSxTPVZbMF0sUD1WWzFdLHc9VlsyXSxVPVZbM10sSD1VKkorUCokLXcqTixZPVUqTit3KkotUyokLGs9VSokK1MqTi1QKkoscnQ9LVMqSi1QKk4tdyokO3JldHVybiBXWzBdPUgqVStydCotUytZKi13LWsqLVAsV1sxXT1ZKlUrcnQqLVArayotUy1IKi13LFdbMl09aypVK3J0Ki13K0gqLVAtWSotUyxXWzNdPUZbM10sV31mdW5jdGlvbiBLKFcpe3JldHVybiBXWzBdPTAsV1sxXT0wLFdbMl09MCxXWzNdPTAsV31mdW5jdGlvbiBRKFcpe3JldHVybiJ2ZWM0KCIrV1swXSsiLCAiK1dbMV0rIiwgIitXWzJdKyIsICIrV1szXSsiKSJ9ZnVuY3Rpb24gXyhXLEYpe3JldHVybiBXWzBdPT09RlswXSYmV1sxXT09PUZbMV0mJldbMl09PT1GWzJdJiZXWzNdPT09RlszXX1mdW5jdGlvbiBqKFcsRil7dmFyIFY9V1swXSxKPVdbMV0sTj1XWzJdLCQ9V1szXSxTPUZbMF0sUD1GWzFdLHc9RlsyXSxVPUZbM107cmV0dXJuIE1hdGguYWJzKFYtUyk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKFYpLE1hdGguYWJzKFMpKSYmTWF0aC5hYnMoSi1QKTw9ZS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoSiksTWF0aC5hYnMoUCkpJiZNYXRoLmFicyhOLXcpPD1lLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhOKSxNYXRoLmFicyh3KSkmJk1hdGguYWJzKCQtVSk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKCQpLE1hdGguYWJzKFUpKX12YXIgRz1tLFg9dSxaPXAsdHQ9ZixudD1nLHE9TSxkdD1BLHV0PWZ1bmN0aW9uKCl7dmFyIFc9bigpO3JldHVybiBmdW5jdGlvbihGLFYsSixOLCQsUyl7dmFyIFAsdztmb3IoVnx8KFY9NCksSnx8KEo9MCksTj93PU1hdGgubWluKE4qVitKLEYubGVuZ3RoKTp3PUYubGVuZ3RoLFA9SjtQPHc7UCs9VilXWzBdPUZbUF0sV1sxXT1GW1ArMV0sV1syXT1GW1ArMl0sV1szXT1GW1ArM10sJChXLFcsUyksRltQXT1XWzBdLEZbUCsxXT1XWzFdLEZbUCsyXT1XWzJdLEZbUCszXT1XWzNdO3JldHVybiBGfX0oKX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiY3JlYXRlIixmdW5jdGlvbigpe3JldHVybiBzfSksdC5kKHIsImNsb25lIixmdW5jdGlvbigpe3JldHVybiBpfSksdC5kKHIsImZyb21WYWx1ZXMiLGZ1bmN0aW9uKCl7cmV0dXJuIG99KSx0LmQociwiZnJvbVJvdGF0aW9uVHJhbnNsYXRpb25WYWx1ZXMiLGZ1bmN0aW9uKCl7cmV0dXJuIGN9KSx0LmQociwiZnJvbVJvdGF0aW9uVHJhbnNsYXRpb24iLGZ1bmN0aW9uKCl7cmV0dXJuIG19KSx0LmQociwiZnJvbVRyYW5zbGF0aW9uIixmdW5jdGlvbigpe3JldHVybiB1fSksdC5kKHIsImZyb21Sb3RhdGlvbiIsZnVuY3Rpb24oKXtyZXR1cm4gcH0pLHQuZChyLCJmcm9tTWF0NCIsZnVuY3Rpb24oKXtyZXR1cm4geX0pLHQuZChyLCJjb3B5IixmdW5jdGlvbigpe3JldHVybiBPfSksdC5kKHIsImlkZW50aXR5IixmdW5jdGlvbigpe3JldHVybiB4fSksdC5kKHIsInNldCIsZnVuY3Rpb24oKXtyZXR1cm4gdn0pLHQuZChyLCJnZXRSZWFsIixmdW5jdGlvbigpe3JldHVybiBUfSksdC5kKHIsImdldER1YWwiLGZ1bmN0aW9uKCl7cmV0dXJuIGx9KSx0LmQociwic2V0UmVhbCIsZnVuY3Rpb24oKXtyZXR1cm4gaH0pLHQuZChyLCJzZXREdWFsIixmdW5jdGlvbigpe3JldHVybiBmfSksdC5kKHIsImdldFRyYW5zbGF0aW9uIixmdW5jdGlvbigpe3JldHVybiBnfSksdC5kKHIsInRyYW5zbGF0ZSIsZnVuY3Rpb24oKXtyZXR1cm4gTX0pLHQuZChyLCJyb3RhdGVYIixmdW5jdGlvbigpe3JldHVybiBBfSksdC5kKHIsInJvdGF0ZVkiLGZ1bmN0aW9uKCl7cmV0dXJuIEN9KSx0LmQociwicm90YXRlWiIsZnVuY3Rpb24oKXtyZXR1cm4gYn0pLHQuZChyLCJyb3RhdGVCeVF1YXRBcHBlbmQiLGZ1bmN0aW9uKCl7cmV0dXJuIEV9KSx0LmQociwicm90YXRlQnlRdWF0UHJlcGVuZCIsZnVuY3Rpb24oKXtyZXR1cm4gTH0pLHQuZChyLCJyb3RhdGVBcm91bmRBeGlzIixmdW5jdGlvbigpe3JldHVybiBEfSksdC5kKHIsImFkZCIsZnVuY3Rpb24oKXtyZXR1cm4gSX0pLHQuZChyLCJtdWx0aXBseSIsZnVuY3Rpb24oKXtyZXR1cm4gUn0pLHQuZChyLCJtdWwiLGZ1bmN0aW9uKCl7cmV0dXJuIEJ9KSx0LmQociwic2NhbGUiLGZ1bmN0aW9uKCl7cmV0dXJuIHp9KSx0LmQociwiZG90IixmdW5jdGlvbigpe3JldHVybiBLfSksdC5kKHIsImxlcnAiLGZ1bmN0aW9uKCl7cmV0dXJuIFF9KSx0LmQociwiaW52ZXJ0IixmdW5jdGlvbigpe3JldHVybiBffSksdC5kKHIsImNvbmp1Z2F0ZSIsZnVuY3Rpb24oKXtyZXR1cm4gan0pLHQuZChyLCJsZW5ndGgiLGZ1bmN0aW9uKCl7cmV0dXJuIEd9KSx0LmQociwibGVuIixmdW5jdGlvbigpe3JldHVybiBYfSksdC5kKHIsInNxdWFyZWRMZW5ndGgiLGZ1bmN0aW9uKCl7cmV0dXJuIFp9KSx0LmQociwic3FyTGVuIixmdW5jdGlvbigpe3JldHVybiB0dH0pLHQuZChyLCJub3JtYWxpemUiLGZ1bmN0aW9uKCl7cmV0dXJuIG50fSksdC5kKHIsInN0ciIsZnVuY3Rpb24oKXtyZXR1cm4gcX0pLHQuZChyLCJleGFjdEVxdWFscyIsZnVuY3Rpb24oKXtyZXR1cm4gZHR9KSx0LmQociwiZXF1YWxzIixmdW5jdGlvbigpe3JldHVybiB1dH0pO3ZhciBlPXQoMiksbj10KDcpLGE9dCg2KTtmdW5jdGlvbiBzKCl7dmFyIFc9bmV3IGUuQVJSQVlfVFlQRSg4KTtyZXR1cm4gZS5BUlJBWV9UWVBFIT1GbG9hdDMyQXJyYXkmJihXWzBdPTAsV1sxXT0wLFdbMl09MCxXWzRdPTAsV1s1XT0wLFdbNl09MCxXWzddPTApLFdbM109MSxXfWZ1bmN0aW9uIGkoVyl7dmFyIEY9bmV3IGUuQVJSQVlfVFlQRSg4KTtyZXR1cm4gRlswXT1XWzBdLEZbMV09V1sxXSxGWzJdPVdbMl0sRlszXT1XWzNdLEZbNF09V1s0XSxGWzVdPVdbNV0sRls2XT1XWzZdLEZbN109V1s3XSxGfWZ1bmN0aW9uIG8oVyxGLFYsSixOLCQsUyxQKXt2YXIgdz1uZXcgZS5BUlJBWV9UWVBFKDgpO3JldHVybiB3WzBdPVcsd1sxXT1GLHdbMl09Vix3WzNdPUosd1s0XT1OLHdbNV09JCx3WzZdPVMsd1s3XT1QLHd9ZnVuY3Rpb24gYyhXLEYsVixKLE4sJCxTKXt2YXIgUD1uZXcgZS5BUlJBWV9UWVBFKDgpO1BbMF09VyxQWzFdPUYsUFsyXT1WLFBbM109Sjt2YXIgdz1OKi41LFU9JCouNSxIPVMqLjU7cmV0dXJuIFBbNF09dypKK1UqVi1IKkYsUFs1XT1VKkorSCpXLXcqVixQWzZdPUgqSit3KkYtVSpXLFBbN109LXcqVy1VKkYtSCpWLFB9ZnVuY3Rpb24gbShXLEYsVil7dmFyIEo9VlswXSouNSxOPVZbMV0qLjUsJD1WWzJdKi41LFM9RlswXSxQPUZbMV0sdz1GWzJdLFU9RlszXTtyZXR1cm4gV1swXT1TLFdbMV09UCxXWzJdPXcsV1szXT1VLFdbNF09SipVK04qdy0kKlAsV1s1XT1OKlUrJCpTLUoqdyxXWzZdPSQqVStKKlAtTipTLFdbN109LUoqUy1OKlAtJCp3LFd9ZnVuY3Rpb24gdShXLEYpe3JldHVybiBXWzBdPTAsV1sxXT0wLFdbMl09MCxXWzNdPTEsV1s0XT1GWzBdKi41LFdbNV09RlsxXSouNSxXWzZdPUZbMl0qLjUsV1s3XT0wLFd9ZnVuY3Rpb24gcChXLEYpe3JldHVybiBXWzBdPUZbMF0sV1sxXT1GWzFdLFdbMl09RlsyXSxXWzNdPUZbM10sV1s0XT0wLFdbNV09MCxXWzZdPTAsV1s3XT0wLFd9ZnVuY3Rpb24geShXLEYpe3ZhciBWPW4uY3JlYXRlKCk7YS5nZXRSb3RhdGlvbihWLEYpO3ZhciBKPW5ldyBlLkFSUkFZX1RZUEUoMyk7cmV0dXJuIGEuZ2V0VHJhbnNsYXRpb24oSixGKSxtKFcsVixKKSxXfWZ1bmN0aW9uIE8oVyxGKXtyZXR1cm4gV1swXT1GWzBdLFdbMV09RlsxXSxXWzJdPUZbMl0sV1szXT1GWzNdLFdbNF09Rls0XSxXWzVdPUZbNV0sV1s2XT1GWzZdLFdbN109Rls3XSxXfWZ1bmN0aW9uIHgoVyl7cmV0dXJuIFdbMF09MCxXWzFdPTAsV1syXT0wLFdbM109MSxXWzRdPTAsV1s1XT0wLFdbNl09MCxXWzddPTAsV31mdW5jdGlvbiB2KFcsRixWLEosTiwkLFMsUCx3KXtyZXR1cm4gV1swXT1GLFdbMV09VixXWzJdPUosV1szXT1OLFdbNF09JCxXWzVdPVMsV1s2XT1QLFdbN109dyxXfXZhciBUPW4uY29weTtmdW5jdGlvbiBsKFcsRil7cmV0dXJuIFdbMF09Rls0XSxXWzFdPUZbNV0sV1syXT1GWzZdLFdbM109Rls3XSxXfXZhciBoPW4uY29weTtmdW5jdGlvbiBmKFcsRil7cmV0dXJuIFdbNF09RlswXSxXWzVdPUZbMV0sV1s2XT1GWzJdLFdbN109RlszXSxXfWZ1bmN0aW9uIGcoVyxGKXt2YXIgVj1GWzRdLEo9Rls1XSxOPUZbNl0sJD1GWzddLFM9LUZbMF0sUD0tRlsxXSx3PS1GWzJdLFU9RlszXTtyZXR1cm4gV1swXT0oVipVKyQqUytKKnctTipQKSoyLFdbMV09KEoqVSskKlArTipTLVYqdykqMixXWzJdPShOKlUrJCp3K1YqUC1KKlMpKjIsV31mdW5jdGlvbiBNKFcsRixWKXt2YXIgSj1GWzBdLE49RlsxXSwkPUZbMl0sUz1GWzNdLFA9VlswXSouNSx3PVZbMV0qLjUsVT1WWzJdKi41LEg9Rls0XSxZPUZbNV0saz1GWzZdLHJ0PUZbN107cmV0dXJuIFdbMF09SixXWzFdPU4sV1syXT0kLFdbM109UyxXWzRdPVMqUCtOKlUtJCp3K0gsV1s1XT1TKncrJCpQLUoqVStZLFdbNl09UypVK0oqdy1OKlArayxXWzddPS1KKlAtTip3LSQqVStydCxXfWZ1bmN0aW9uIEEoVyxGLFYpe3ZhciBKPS1GWzBdLE49LUZbMV0sJD0tRlsyXSxTPUZbM10sUD1GWzRdLHc9Rls1XSxVPUZbNl0sSD1GWzddLFk9UCpTK0gqSit3KiQtVSpOLGs9dypTK0gqTitVKkotUCokLHJ0PVUqUytIKiQrUCpOLXcqSixpdD1IKlMtUCpKLXcqTi1VKiQ7cmV0dXJuIG4ucm90YXRlWChXLEYsViksSj1XWzBdLE49V1sxXSwkPVdbMl0sUz1XWzNdLFdbNF09WSpTK2l0KkorayokLXJ0Kk4sV1s1XT1rKlMraXQqTitydCpKLVkqJCxXWzZdPXJ0KlMraXQqJCtZKk4taypKLFdbN109aXQqUy1ZKkotaypOLXJ0KiQsV31mdW5jdGlvbiBDKFcsRixWKXt2YXIgSj0tRlswXSxOPS1GWzFdLCQ9LUZbMl0sUz1GWzNdLFA9Rls0XSx3PUZbNV0sVT1GWzZdLEg9Rls3XSxZPVAqUytIKkordyokLVUqTixrPXcqUytIKk4rVSpKLVAqJCxydD1VKlMrSCokK1AqTi13KkosaXQ9SCpTLVAqSi13Kk4tVSokO3JldHVybiBuLnJvdGF0ZVkoVyxGLFYpLEo9V1swXSxOPVdbMV0sJD1XWzJdLFM9V1szXSxXWzRdPVkqUytpdCpKK2sqJC1ydCpOLFdbNV09aypTK2l0Kk4rcnQqSi1ZKiQsV1s2XT1ydCpTK2l0KiQrWSpOLWsqSixXWzddPWl0KlMtWSpKLWsqTi1ydCokLFd9ZnVuY3Rpb24gYihXLEYsVil7dmFyIEo9LUZbMF0sTj0tRlsxXSwkPS1GWzJdLFM9RlszXSxQPUZbNF0sdz1GWzVdLFU9Rls2XSxIPUZbN10sWT1QKlMrSCpKK3cqJC1VKk4saz13KlMrSCpOK1UqSi1QKiQscnQ9VSpTK0gqJCtQKk4tdypKLGl0PUgqUy1QKkotdypOLVUqJDtyZXR1cm4gbi5yb3RhdGVaKFcsRixWKSxKPVdbMF0sTj1XWzFdLCQ9V1syXSxTPVdbM10sV1s0XT1ZKlMraXQqSitrKiQtcnQqTixXWzVdPWsqUytpdCpOK3J0KkotWSokLFdbNl09cnQqUytpdCokK1kqTi1rKkosV1s3XT1pdCpTLVkqSi1rKk4tcnQqJCxXfWZ1bmN0aW9uIEUoVyxGLFYpe3ZhciBKPVZbMF0sTj1WWzFdLCQ9VlsyXSxTPVZbM10sUD1GWzBdLHc9RlsxXSxVPUZbMl0sSD1GWzNdO3JldHVybiBXWzBdPVAqUytIKkordyokLVUqTixXWzFdPXcqUytIKk4rVSpKLVAqJCxXWzJdPVUqUytIKiQrUCpOLXcqSixXWzNdPUgqUy1QKkotdypOLVUqJCxQPUZbNF0sdz1GWzVdLFU9Rls2XSxIPUZbN10sV1s0XT1QKlMrSCpKK3cqJC1VKk4sV1s1XT13KlMrSCpOK1UqSi1QKiQsV1s2XT1VKlMrSCokK1AqTi13KkosV1s3XT1IKlMtUCpKLXcqTi1VKiQsV31mdW5jdGlvbiBMKFcsRixWKXt2YXIgSj1GWzBdLE49RlsxXSwkPUZbMl0sUz1GWzNdLFA9VlswXSx3PVZbMV0sVT1WWzJdLEg9VlszXTtyZXR1cm4gV1swXT1KKkgrUypQK04qVS0kKncsV1sxXT1OKkgrUyp3KyQqUC1KKlUsV1syXT0kKkgrUypVK0oqdy1OKlAsV1szXT1TKkgtSipQLU4qdy0kKlUsUD1WWzRdLHc9Vls1XSxVPVZbNl0sSD1WWzddLFdbNF09SipIK1MqUCtOKlUtJCp3LFdbNV09TipIK1MqdyskKlAtSipVLFdbNl09JCpIK1MqVStKKnctTipQLFdbN109UypILUoqUC1OKnctJCpVLFd9ZnVuY3Rpb24gRChXLEYsVixKKXtpZihNYXRoLmFicyhKKTxlLkVQU0lMT04pcmV0dXJuIE8oVyxGKTt2YXIgTj1NYXRoLmh5cG90KFZbMF0sVlsxXSxWWzJdKTtKPUoqLjU7dmFyICQ9TWF0aC5zaW4oSiksUz0kKlZbMF0vTixQPSQqVlsxXS9OLHc9JCpWWzJdL04sVT1NYXRoLmNvcyhKKSxIPUZbMF0sWT1GWzFdLGs9RlsyXSxydD1GWzNdO1dbMF09SCpVK3J0KlMrWSp3LWsqUCxXWzFdPVkqVStydCpQK2sqUy1IKncsV1syXT1rKlUrcnQqdytIKlAtWSpTLFdbM109cnQqVS1IKlMtWSpQLWsqdzt2YXIgaXQ9Rls0XSxjdD1GWzVdLGh0PUZbNl0sYXQ9Rls3XTtyZXR1cm4gV1s0XT1pdCpVK2F0KlMrY3Qqdy1odCpQLFdbNV09Y3QqVSthdCpQK2h0KlMtaXQqdyxXWzZdPWh0KlUrYXQqdytpdCpQLWN0KlMsV1s3XT1hdCpVLWl0KlMtY3QqUC1odCp3LFd9ZnVuY3Rpb24gSShXLEYsVil7cmV0dXJuIFdbMF09RlswXStWWzBdLFdbMV09RlsxXStWWzFdLFdbMl09RlsyXStWWzJdLFdbM109RlszXStWWzNdLFdbNF09Rls0XStWWzRdLFdbNV09Rls1XStWWzVdLFdbNl09Rls2XStWWzZdLFdbN109Rls3XStWWzddLFd9ZnVuY3Rpb24gUihXLEYsVil7dmFyIEo9RlswXSxOPUZbMV0sJD1GWzJdLFM9RlszXSxQPVZbNF0sdz1WWzVdLFU9Vls2XSxIPVZbN10sWT1GWzRdLGs9Rls1XSxydD1GWzZdLGl0PUZbN10sY3Q9VlswXSxodD1WWzFdLGF0PVZbMl0sb3Q9VlszXTtyZXR1cm4gV1swXT1KKm90K1MqY3QrTiphdC0kKmh0LFdbMV09TipvdCtTKmh0KyQqY3QtSiphdCxXWzJdPSQqb3QrUyphdCtKKmh0LU4qY3QsV1szXT1TKm90LUoqY3QtTipodC0kKmF0LFdbNF09SipIK1MqUCtOKlUtJCp3K1kqb3QraXQqY3QrayphdC1ydCpodCxXWzVdPU4qSCtTKncrJCpQLUoqVStrKm90K2l0Kmh0K3J0KmN0LVkqYXQsV1s2XT0kKkgrUypVK0oqdy1OKlArcnQqb3QraXQqYXQrWSpodC1rKmN0LFdbN109UypILUoqUC1OKnctJCpVK2l0Km90LVkqY3QtaypodC1ydCphdCxXfXZhciBCPVI7ZnVuY3Rpb24geihXLEYsVil7cmV0dXJuIFdbMF09RlswXSpWLFdbMV09RlsxXSpWLFdbMl09RlsyXSpWLFdbM109RlszXSpWLFdbNF09Rls0XSpWLFdbNV09Rls1XSpWLFdbNl09Rls2XSpWLFdbN109Rls3XSpWLFd9dmFyIEs9bi5kb3Q7ZnVuY3Rpb24gUShXLEYsVixKKXt2YXIgTj0xLUo7cmV0dXJuIEsoRixWKTwwJiYoSj0tSiksV1swXT1GWzBdKk4rVlswXSpKLFdbMV09RlsxXSpOK1ZbMV0qSixXWzJdPUZbMl0qTitWWzJdKkosV1szXT1GWzNdKk4rVlszXSpKLFdbNF09Rls0XSpOK1ZbNF0qSixXWzVdPUZbNV0qTitWWzVdKkosV1s2XT1GWzZdKk4rVls2XSpKLFdbN109Rls3XSpOK1ZbN10qSixXfWZ1bmN0aW9uIF8oVyxGKXt2YXIgVj1aKEYpO3JldHVybiBXWzBdPS1GWzBdL1YsV1sxXT0tRlsxXS9WLFdbMl09LUZbMl0vVixXWzNdPUZbM10vVixXWzRdPS1GWzRdL1YsV1s1XT0tRls1XS9WLFdbNl09LUZbNl0vVixXWzddPUZbN10vVixXfWZ1bmN0aW9uIGooVyxGKXtyZXR1cm4gV1swXT0tRlswXSxXWzFdPS1GWzFdLFdbMl09LUZbMl0sV1szXT1GWzNdLFdbNF09LUZbNF0sV1s1XT0tRls1XSxXWzZdPS1GWzZdLFdbN109Rls3XSxXfXZhciBHPW4ubGVuZ3RoLFg9RyxaPW4uc3F1YXJlZExlbmd0aCx0dD1aO2Z1bmN0aW9uIG50KFcsRil7dmFyIFY9WihGKTtpZihWPjApe1Y9TWF0aC5zcXJ0KFYpO3ZhciBKPUZbMF0vVixOPUZbMV0vViwkPUZbMl0vVixTPUZbM10vVixQPUZbNF0sdz1GWzVdLFU9Rls2XSxIPUZbN10sWT1KKlArTip3KyQqVStTKkg7V1swXT1KLFdbMV09TixXWzJdPSQsV1szXT1TLFdbNF09KFAtSipZKS9WLFdbNV09KHctTipZKS9WLFdbNl09KFUtJCpZKS9WLFdbN109KEgtUypZKS9WfXJldHVybiBXfWZ1bmN0aW9uIHEoVyl7cmV0dXJuInF1YXQyKCIrV1swXSsiLCAiK1dbMV0rIiwgIitXWzJdKyIsICIrV1szXSsiLCAiK1dbNF0rIiwgIitXWzVdKyIsICIrV1s2XSsiLCAiK1dbN10rIikifWZ1bmN0aW9uIGR0KFcsRil7cmV0dXJuIFdbMF09PT1GWzBdJiZXWzFdPT09RlsxXSYmV1syXT09PUZbMl0mJldbM109PT1GWzNdJiZXWzRdPT09Rls0XSYmV1s1XT09PUZbNV0mJldbNl09PT1GWzZdJiZXWzddPT09Rls3XX1mdW5jdGlvbiB1dChXLEYpe3ZhciBWPVdbMF0sSj1XWzFdLE49V1syXSwkPVdbM10sUz1XWzRdLFA9V1s1XSx3PVdbNl0sVT1XWzddLEg9RlswXSxZPUZbMV0saz1GWzJdLHJ0PUZbM10saXQ9Rls0XSxjdD1GWzVdLGh0PUZbNl0sYXQ9Rls3XTtyZXR1cm4gTWF0aC5hYnMoVi1IKTw9ZS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoViksTWF0aC5hYnMoSCkpJiZNYXRoLmFicyhKLVkpPD1lLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhKKSxNYXRoLmFicyhZKSkmJk1hdGguYWJzKE4tayk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKE4pLE1hdGguYWJzKGspKSYmTWF0aC5hYnMoJC1ydCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKCQpLE1hdGguYWJzKHJ0KSkmJk1hdGguYWJzKFMtaXQpPD1lLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhTKSxNYXRoLmFicyhpdCkpJiZNYXRoLmFicyhQLWN0KTw9ZS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoUCksTWF0aC5hYnMoY3QpKSYmTWF0aC5hYnMody1odCk8PWUuRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHcpLE1hdGguYWJzKGh0KSkmJk1hdGguYWJzKFUtYXQpPD1lLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhVKSxNYXRoLmFicyhhdCkpfX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiY3JlYXRlIixmdW5jdGlvbigpe3JldHVybiBufSksdC5kKHIsImNsb25lIixmdW5jdGlvbigpe3JldHVybiBhfSksdC5kKHIsImZyb21WYWx1ZXMiLGZ1bmN0aW9uKCl7cmV0dXJuIHN9KSx0LmQociwiY29weSIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pLHQuZChyLCJzZXQiLGZ1bmN0aW9uKCl7cmV0dXJuIG99KSx0LmQociwiYWRkIixmdW5jdGlvbigpe3JldHVybiBjfSksdC5kKHIsInN1YnRyYWN0IixmdW5jdGlvbigpe3JldHVybiBtfSksdC5kKHIsIm11bHRpcGx5IixmdW5jdGlvbigpe3JldHVybiB1fSksdC5kKHIsImRpdmlkZSIsZnVuY3Rpb24oKXtyZXR1cm4gcH0pLHQuZChyLCJjZWlsIixmdW5jdGlvbigpe3JldHVybiB5fSksdC5kKHIsImZsb29yIixmdW5jdGlvbigpe3JldHVybiBPfSksdC5kKHIsIm1pbiIsZnVuY3Rpb24oKXtyZXR1cm4geH0pLHQuZChyLCJtYXgiLGZ1bmN0aW9uKCl7cmV0dXJuIHZ9KSx0LmQociwicm91bmQiLGZ1bmN0aW9uKCl7cmV0dXJuIFR9KSx0LmQociwic2NhbGUiLGZ1bmN0aW9uKCl7cmV0dXJuIGx9KSx0LmQociwic2NhbGVBbmRBZGQiLGZ1bmN0aW9uKCl7cmV0dXJuIGh9KSx0LmQociwiZGlzdGFuY2UiLGZ1bmN0aW9uKCl7cmV0dXJuIGZ9KSx0LmQociwic3F1YXJlZERpc3RhbmNlIixmdW5jdGlvbigpe3JldHVybiBnfSksdC5kKHIsImxlbmd0aCIsZnVuY3Rpb24oKXtyZXR1cm4gTX0pLHQuZChyLCJzcXVhcmVkTGVuZ3RoIixmdW5jdGlvbigpe3JldHVybiBBfSksdC5kKHIsIm5lZ2F0ZSIsZnVuY3Rpb24oKXtyZXR1cm4gQ30pLHQuZChyLCJpbnZlcnNlIixmdW5jdGlvbigpe3JldHVybiBifSksdC5kKHIsIm5vcm1hbGl6ZSIsZnVuY3Rpb24oKXtyZXR1cm4gRX0pLHQuZChyLCJkb3QiLGZ1bmN0aW9uKCl7cmV0dXJuIEx9KSx0LmQociwiY3Jvc3MiLGZ1bmN0aW9uKCl7cmV0dXJuIER9KSx0LmQociwibGVycCIsZnVuY3Rpb24oKXtyZXR1cm4gSX0pLHQuZChyLCJyYW5kb20iLGZ1bmN0aW9uKCl7cmV0dXJuIFJ9KSx0LmQociwidHJhbnNmb3JtTWF0MiIsZnVuY3Rpb24oKXtyZXR1cm4gQn0pLHQuZChyLCJ0cmFuc2Zvcm1NYXQyZCIsZnVuY3Rpb24oKXtyZXR1cm4gen0pLHQuZChyLCJ0cmFuc2Zvcm1NYXQzIixmdW5jdGlvbigpe3JldHVybiBLfSksdC5kKHIsInRyYW5zZm9ybU1hdDQiLGZ1bmN0aW9uKCl7cmV0dXJuIFF9KSx0LmQociwicm90YXRlIixmdW5jdGlvbigpe3JldHVybiBffSksdC5kKHIsImFuZ2xlIixmdW5jdGlvbigpe3JldHVybiBqfSksdC5kKHIsInplcm8iLGZ1bmN0aW9uKCl7cmV0dXJuIEd9KSx0LmQociwic3RyIixmdW5jdGlvbigpe3JldHVybiBYfSksdC5kKHIsImV4YWN0RXF1YWxzIixmdW5jdGlvbigpe3JldHVybiBafSksdC5kKHIsImVxdWFscyIsZnVuY3Rpb24oKXtyZXR1cm4gdHR9KSx0LmQociwibGVuIixmdW5jdGlvbigpe3JldHVybiBudH0pLHQuZChyLCJzdWIiLGZ1bmN0aW9uKCl7cmV0dXJuIHF9KSx0LmQociwibXVsIixmdW5jdGlvbigpe3JldHVybiBkdH0pLHQuZChyLCJkaXYiLGZ1bmN0aW9uKCl7cmV0dXJuIHV0fSksdC5kKHIsImRpc3QiLGZ1bmN0aW9uKCl7cmV0dXJuIFd9KSx0LmQociwic3FyRGlzdCIsZnVuY3Rpb24oKXtyZXR1cm4gRn0pLHQuZChyLCJzcXJMZW4iLGZ1bmN0aW9uKCl7cmV0dXJuIFZ9KSx0LmQociwiZm9yRWFjaCIsZnVuY3Rpb24oKXtyZXR1cm4gSn0pO3ZhciBlPXQoMik7ZnVuY3Rpb24gbigpe3ZhciBOPW5ldyBlLkFSUkFZX1RZUEUoMik7cmV0dXJuIGUuQVJSQVlfVFlQRSE9RmxvYXQzMkFycmF5JiYoTlswXT0wLE5bMV09MCksTn1mdW5jdGlvbiBhKE4pe3ZhciAkPW5ldyBlLkFSUkFZX1RZUEUoMik7cmV0dXJuICRbMF09TlswXSwkWzFdPU5bMV0sJH1mdW5jdGlvbiBzKE4sJCl7dmFyIFM9bmV3IGUuQVJSQVlfVFlQRSgyKTtyZXR1cm4gU1swXT1OLFNbMV09JCxTfWZ1bmN0aW9uIGkoTiwkKXtyZXR1cm4gTlswXT0kWzBdLE5bMV09JFsxXSxOfWZ1bmN0aW9uIG8oTiwkLFMpe3JldHVybiBOWzBdPSQsTlsxXT1TLE59ZnVuY3Rpb24gYyhOLCQsUyl7cmV0dXJuIE5bMF09JFswXStTWzBdLE5bMV09JFsxXStTWzFdLE59ZnVuY3Rpb24gbShOLCQsUyl7cmV0dXJuIE5bMF09JFswXS1TWzBdLE5bMV09JFsxXS1TWzFdLE59ZnVuY3Rpb24gdShOLCQsUyl7cmV0dXJuIE5bMF09JFswXSpTWzBdLE5bMV09JFsxXSpTWzFdLE59ZnVuY3Rpb24gcChOLCQsUyl7cmV0dXJuIE5bMF09JFswXS9TWzBdLE5bMV09JFsxXS9TWzFdLE59ZnVuY3Rpb24geShOLCQpe3JldHVybiBOWzBdPU1hdGguY2VpbCgkWzBdKSxOWzFdPU1hdGguY2VpbCgkWzFdKSxOfWZ1bmN0aW9uIE8oTiwkKXtyZXR1cm4gTlswXT1NYXRoLmZsb29yKCRbMF0pLE5bMV09TWF0aC5mbG9vcigkWzFdKSxOfWZ1bmN0aW9uIHgoTiwkLFMpe3JldHVybiBOWzBdPU1hdGgubWluKCRbMF0sU1swXSksTlsxXT1NYXRoLm1pbigkWzFdLFNbMV0pLE59ZnVuY3Rpb24gdihOLCQsUyl7cmV0dXJuIE5bMF09TWF0aC5tYXgoJFswXSxTWzBdKSxOWzFdPU1hdGgubWF4KCRbMV0sU1sxXSksTn1mdW5jdGlvbiBUKE4sJCl7cmV0dXJuIE5bMF09TWF0aC5yb3VuZCgkWzBdKSxOWzFdPU1hdGgucm91bmQoJFsxXSksTn1mdW5jdGlvbiBsKE4sJCxTKXtyZXR1cm4gTlswXT0kWzBdKlMsTlsxXT0kWzFdKlMsTn1mdW5jdGlvbiBoKE4sJCxTLFApe3JldHVybiBOWzBdPSRbMF0rU1swXSpQLE5bMV09JFsxXStTWzFdKlAsTn1mdW5jdGlvbiBmKE4sJCl7dmFyIFM9JFswXS1OWzBdLFA9JFsxXS1OWzFdO3JldHVybiBNYXRoLmh5cG90KFMsUCl9ZnVuY3Rpb24gZyhOLCQpe3ZhciBTPSRbMF0tTlswXSxQPSRbMV0tTlsxXTtyZXR1cm4gUypTK1AqUH1mdW5jdGlvbiBNKE4pe3ZhciAkPU5bMF0sUz1OWzFdO3JldHVybiBNYXRoLmh5cG90KCQsUyl9ZnVuY3Rpb24gQShOKXt2YXIgJD1OWzBdLFM9TlsxXTtyZXR1cm4gJCokK1MqU31mdW5jdGlvbiBDKE4sJCl7cmV0dXJuIE5bMF09LSRbMF0sTlsxXT0tJFsxXSxOfWZ1bmN0aW9uIGIoTiwkKXtyZXR1cm4gTlswXT0xLyRbMF0sTlsxXT0xLyRbMV0sTn1mdW5jdGlvbiBFKE4sJCl7dmFyIFM9JFswXSxQPSRbMV0sdz1TKlMrUCpQO3JldHVybiB3PjAmJih3PTEvTWF0aC5zcXJ0KHcpKSxOWzBdPSRbMF0qdyxOWzFdPSRbMV0qdyxOfWZ1bmN0aW9uIEwoTiwkKXtyZXR1cm4gTlswXSokWzBdK05bMV0qJFsxXX1mdW5jdGlvbiBEKE4sJCxTKXt2YXIgUD0kWzBdKlNbMV0tJFsxXSpTWzBdO3JldHVybiBOWzBdPU5bMV09MCxOWzJdPVAsTn1mdW5jdGlvbiBJKE4sJCxTLFApe3ZhciB3PSRbMF0sVT0kWzFdO3JldHVybiBOWzBdPXcrUCooU1swXS13KSxOWzFdPVUrUCooU1sxXS1VKSxOfWZ1bmN0aW9uIFIoTiwkKXskPSR8fDE7dmFyIFM9ZS5SQU5ET00oKSoyKk1hdGguUEk7cmV0dXJuIE5bMF09TWF0aC5jb3MoUykqJCxOWzFdPU1hdGguc2luKFMpKiQsTn1mdW5jdGlvbiBCKE4sJCxTKXt2YXIgUD0kWzBdLHc9JFsxXTtyZXR1cm4gTlswXT1TWzBdKlArU1syXSp3LE5bMV09U1sxXSpQK1NbM10qdyxOfWZ1bmN0aW9uIHooTiwkLFMpe3ZhciBQPSRbMF0sdz0kWzFdO3JldHVybiBOWzBdPVNbMF0qUCtTWzJdKncrU1s0XSxOWzFdPVNbMV0qUCtTWzNdKncrU1s1XSxOfWZ1bmN0aW9uIEsoTiwkLFMpe3ZhciBQPSRbMF0sdz0kWzFdO3JldHVybiBOWzBdPVNbMF0qUCtTWzNdKncrU1s2XSxOWzFdPVNbMV0qUCtTWzRdKncrU1s3XSxOfWZ1bmN0aW9uIFEoTiwkLFMpe3ZhciBQPSRbMF0sdz0kWzFdO3JldHVybiBOWzBdPVNbMF0qUCtTWzRdKncrU1sxMl0sTlsxXT1TWzFdKlArU1s1XSp3K1NbMTNdLE59ZnVuY3Rpb24gXyhOLCQsUyxQKXt2YXIgdz0kWzBdLVNbMF0sVT0kWzFdLVNbMV0sSD1NYXRoLnNpbihQKSxZPU1hdGguY29zKFApO3JldHVybiBOWzBdPXcqWS1VKkgrU1swXSxOWzFdPXcqSCtVKlkrU1sxXSxOfWZ1bmN0aW9uIGooTiwkKXt2YXIgUz1OWzBdLFA9TlsxXSx3PSRbMF0sVT0kWzFdLEg9TWF0aC5zcXJ0KFMqUytQKlApKk1hdGguc3FydCh3KncrVSpVKSxZPUgmJihTKncrUCpVKS9IO3JldHVybiBNYXRoLmFjb3MoTWF0aC5taW4oTWF0aC5tYXgoWSwtMSksMSkpfWZ1bmN0aW9uIEcoTil7cmV0dXJuIE5bMF09MCxOWzFdPTAsTn1mdW5jdGlvbiBYKE4pe3JldHVybiJ2ZWMyKCIrTlswXSsiLCAiK05bMV0rIikifWZ1bmN0aW9uIFooTiwkKXtyZXR1cm4gTlswXT09PSRbMF0mJk5bMV09PT0kWzFdfWZ1bmN0aW9uIHR0KE4sJCl7dmFyIFM9TlswXSxQPU5bMV0sdz0kWzBdLFU9JFsxXTtyZXR1cm4gTWF0aC5hYnMoUy13KTw9ZS5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoUyksTWF0aC5hYnModykpJiZNYXRoLmFicyhQLVUpPD1lLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhQKSxNYXRoLmFicyhVKSl9dmFyIG50PU0scT1tLGR0PXUsdXQ9cCxXPWYsRj1nLFY9QSxKPWZ1bmN0aW9uKCl7dmFyIE49bigpO3JldHVybiBmdW5jdGlvbigkLFMsUCx3LFUsSCl7dmFyIFksaztmb3IoU3x8KFM9MiksUHx8KFA9MCksdz9rPU1hdGgubWluKHcqUytQLCQubGVuZ3RoKTprPSQubGVuZ3RoLFk9UDtZPGs7WSs9UylOWzBdPSRbWV0sTlsxXT0kW1krMV0sVShOLE4sSCksJFtZXT1OWzBdLCRbWSsxXT1OWzFdO3JldHVybiAkfX0oKX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKTt2YXIgZT10KDEzKTt0LmQociwiUmVuZGVyZXIiLGZ1bmN0aW9uKCl7cmV0dXJuIGUuZGVmYXVsdH0pO3ZhciBuPXQoNDApO3QuZChyLCJGaWd1cmUyRCIsZnVuY3Rpb24oKXtyZXR1cm4gbi5kZWZhdWx0fSk7dmFyIGE9dCg1Nik7dC5kKHIsIk1lc2gyRCIsZnVuY3Rpb24oKXtyZXR1cm4gYS5kZWZhdWx0fSk7dmFyIHM9dCgyOSk7dC5kKHIsIk1lc2hDbG91ZCIsZnVuY3Rpb24oKXtyZXR1cm4gcy5kZWZhdWx0fSk7dmFyIGk9dCgyMyk7dC5kKHIsInBhcnNlRm9udCIsZnVuY3Rpb24oKXtyZXR1cm4gaS5kZWZhdWx0fSk7dmFyIG89dCgzMSk7dC5kKHIsInBhcnNlQ29sb3IiLGZ1bmN0aW9uKCl7cmV0dXJuIG8uZGVmYXVsdH0pO3ZhciBjPXQoMjEpO3QuZChyLCJFTlYiLGZ1bmN0aW9uKCl7cmV0dXJuIGMuZGVmYXVsdH0pLHQoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gYn0pO3ZhciBlPXQoMTQpLG49dCgxKSxhPXQoMjApLHM9dCgyNyksaT10KDI1KSxvPXQoNDApLGM9dCg1NiksbT10KDI5KSx1PXQoNTkpLHA9dCgyMSkseT10KDYzKTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7Y29uc3QgTz17YXV0b1VwZGF0ZTohMSxwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6ITEsYnVmZmVyU2l6ZToxNTAwfSx4PWBhdHRyaWJ1dGUgdmVjMyBhX3ZlcnRleFBvc2l0aW9uOwphdHRyaWJ1dGUgdmVjMyBhX3ZlcnRleFRleHR1cmVDb29yZDsKdmFyeWluZyB2ZWMzIHZUZXh0dXJlQ29vcmQ7CnVuaWZvcm0gbWF0MyB2aWV3TWF0cml4Owp1bmlmb3JtIG1hdDMgcHJvamVjdGlvbk1hdHJpeDsKCnZvaWQgbWFpbigpIHsKICBnbF9Qb2ludFNpemUgPSAxLjA7CiAgdmVjMyBwb3MgPSBwcm9qZWN0aW9uTWF0cml4ICogdmlld01hdHJpeCAqIHZlYzMoYV92ZXJ0ZXhQb3NpdGlvbi54eSwgMS4wKTsKICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zLnh5LCAxLjAsIDEuMCk7ICAgIAogIHZUZXh0dXJlQ29vcmQgPSBhX3ZlcnRleFRleHR1cmVDb29yZDsgICAgICAgICAgICAgIAp9CmAsdj1gcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7CnZhcnlpbmcgdmVjMyB2VGV4dHVyZUNvb3JkOwp1bmlmb3JtIHNhbXBsZXIyRCB1X3RleFNhbXBsZXI7CnZvaWQgbWFpbigpIHsKICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodV90ZXhTYW1wbGVyLCB2VGV4dHVyZUNvb3JkLnh5KTsKfQpgLFQ9U3ltYm9sKCJnbFJlbmRlcmVyIiksbD1TeW1ib2woImNhbnZhc1JlbmRlcmVyIiksaD1TeW1ib2woIm9wdGlvbnMiKSxmPVN5bWJvbCgiZ2xvYmFsVHJhbnNmb3JtIiksZz1TeW1ib2woImFwcGx5R2xvYmFsVHJhbnNmb3JtIiksTT1TeW1ib2woImNhbnZhcyIpO2Z1bmN0aW9uIEEoRSl7Y29uc3QgTD1FLmdsLEQ9RS5mYm87RCYmTC5iaW5kRnJhbWVidWZmZXIoTC5GUkFNRUJVRkZFUixEKSxFLl9kcmF3KCksRCYmTC5iaW5kRnJhbWVidWZmZXIoTC5GUkFNRUJVRkZFUixudWxsKX1mdW5jdGlvbiBDKEUsTCxELEkpe2NvbnN0IFI9RS5jcmVhdGVUZXh0dXJlKEwuY2FudmFzKSxCPVtbWzAsMF0sW0QsMF0sW0QsSV0sWzAsSV0sWzAsMF1dXTtCLmNsb3NlZD0hMDtjb25zdCB6PW5ldyBjLmRlZmF1bHQoe2NvbnRvdXJzOkJ9KTt6LnNldFRleHR1cmUoUiksRS5zZXRNZXNoRGF0YShbei5tZXNoRGF0YV0pLEEoRSksUi5kZWxldGUoKSxMLmNsZWFyUmVjdCgwLDAsRCxJKSxkZWxldGUgTC5fZmlsdGVyfWNsYXNzIGJ7Y29uc3RydWN0b3IoTCxEPXt9KXtsZXQgST1ELmNvbnRleHRUeXBlO2lmKEl8fCh0eXBlb2YgV2ViR0wyUmVuZGVyaW5nQ29udGV4dD09ImZ1bmN0aW9uIj9JPSJ3ZWJnbDIiOnR5cGVvZiBXZWJHTFJlbmRlcmluZ0NvbnRleHQ9PSJmdW5jdGlvbiI/ST0id2ViZ2wiOkk9IjJkIiksIUwuZ2V0Q29udGV4dCl7Y29uc3QgUj1MO0w9e2dldENvbnRleHQoKXtyZXR1cm4gUn0sd2lkdGg6RC53aWR0aCxoZWlnaHQ6RC5oZWlnaHR9LFIuY2FudmFzPUwsST0iMmQifWlmKHRoaXNbTV09TCxJIT09IndlYmdsIiYmSSE9PSJ3ZWJnbDIiJiZJIT09IjJkIil0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY29udGV4dCB0eXBlICR7SX1gKTtpZihELmNvbnRleHRUeXBlPUksdGhpc1toXT1PYmplY3QuYXNzaWduKHt9LE8sRCksST09PSJ3ZWJnbCJ8fEk9PT0id2ViZ2wyIil7ST09PSJ3ZWJnbDIiJiYodGhpc1toXS53ZWJnbDI9ITApO2NvbnN0IFI9bmV3IGUuZGVmYXVsdChMLHRoaXNbaF0pO0k9PT0id2ViZ2wyIiYmIVIuaXNXZWJHTDImJihELmNvbnRleHRUeXBlPSJ3ZWJnbCIpLE9iamVjdCh5LmNyZWF0ZVNoYWRlcnMpKFIpLE9iamVjdCh5LmFwcGx5U2hhZGVyKShSKSxPYmplY3QoeS5jcmVhdGVDbG91ZFNoYWRlcnMpKFIpO2NvbnN0IEI9Ui5nbDtCLmNsZWFyQ29sb3IoMCwwLDAsMCksQi5ibGVuZEZ1bmNTZXBhcmF0ZShCLlNSQ19BTFBIQSxCLk9ORV9NSU5VU19TUkNfQUxQSEEsQi5PTkUsQi5PTkVfTUlOVVNfU1JDX0FMUEhBKSx0aGlzW1RdPVJ9ZWxzZSB0aGlzW2xdPW5ldyBhLmRlZmF1bHQoTCx0aGlzW2hdKTt0aGlzW2ZdPVsxLDAsMCwwLDEsMCwwLDAsMV0sdGhpcy51cGRhdGVSZXNvbHV0aW9uKCl9Z2V0IGNhbnZhcygpe3JldHVybiB0aGlzW01dfWdldCBjYW52YXNSZW5kZXJlcigpe3JldHVybiB0aGlzW2xdfWdldCBnbFJlbmRlcmVyKCl7cmV0dXJuIHRoaXNbVF19Z2V0IGlzV2ViR0wyKCl7cmV0dXJuIHRoaXNbVF0mJnRoaXNbVF0uaXNXZWJHTDJ9Z2V0IG9wdGlvbnMoKXtyZXR1cm4gdGhpc1toXX1nZXQgZ2xvYmFsVHJhbnNmb3JtTWF0cml4KCl7Y29uc3QgTD10aGlzW2ZdO3JldHVybltMWzBdLExbMV0sTFszXSxMWzRdLExbNl0sTFs3XV19Z2V0IHZpZXdNYXRyaXgoKXtyZXR1cm4gdGhpc1tmXX1bZ10oKXtjb25zdCBMPXRoaXNbVF18fHRoaXNbbF07aWYodGhpc1tUXSl7Y29uc3R7d2lkdGg6RCxoZWlnaHQ6SX09dGhpcy5jYW52YXM7TC51bmlmb3Jtcy52aWV3TWF0cml4PXRoaXMudmlld01hdHJpeCxMLnVuaWZvcm1zLnByb2plY3Rpb25NYXRyaXg9dGhpcy5wcm9qZWN0aW9uTWF0cml4LEwudW5pZm9ybXMudV9yZXNvbHV0aW9uPVtELEldfX11cGRhdGVSZXNvbHV0aW9uKCl7Y29uc3R7d2lkdGg6TCxoZWlnaHQ6RH09dGhpcy5jYW52YXMsST1bMSwwLDAsMCwxLDAsLUwvMiwtRC8yLDFdLFI9WzIvTCwwLDAsMCwtMi9ELDAsMCwwLDFdLEI9bi5tYXQzLm11bHRpcGx5KEFycmF5Lm9mKDAsMCwwLDAsMCwwLDAsMCwwKSxSLEkpO3RoaXMucHJvamVjdGlvbk1hdHJpeD1CLHRoaXNbVF0mJnRoaXNbVF0uZ2wudmlld3BvcnQoMCwwLEwsRCl9Y3JlYXRlVGV4dHVyZShMLEQpe3JldHVybih0aGlzW1RdfHx0aGlzW2xdKS5jcmVhdGVUZXh0dXJlKEwsRCl9bG9hZFRleHR1cmUoTCx7dXNlSW1hZ2VCaXRtYXA6RD0hMX09e30pe3JldHVybih0aGlzW1RdfHx0aGlzW2xdKS5sb2FkVGV4dHVyZShMLHt1c2VJbWFnZUJpdG1hcDpEfSl9Y3JlYXRlVGV4dChMLHtmb250OkQ9IjE2cHggYXJpYWwiLGZpbGxDb2xvcjpJPW51bGwsc3Ryb2tlQ29sb3I6Uj1udWxsLHN0cm9rZVdpZHRoOkI9MX09e30pe2lmKHRoaXNbVF0pe2NvbnN0IHo9cC5kZWZhdWx0LmNyZWF0ZVRleHQoTCx7Zm9udDpELGZpbGxDb2xvcjpJLHN0cm9rZUNvbG9yOlIsc3Ryb2tlV2lkdGg6Qn0pO3JldHVybntpbWFnZTp0aGlzLmNyZWF0ZVRleHR1cmUoei5pbWFnZSkscmVjdDp6LnJlY3R9fXJldHVybntfaW1nOntmb250OkQsZmlsbENvbG9yOkksc3Ryb2tlQ29sb3I6UixzdHJva2VXaWR0aDpCLHRleHQ6TH19fWNyZWF0ZVByb2dyYW0oe3ZlcnRleDpMLGZyYWdtZW50OkQsb3B0aW9uczpJfT17fSl7aWYodGhpc1tUXSl7Y29uc3QgUj10aGlzW1RdLmNvbXBpbGVTeW5jKEQsTCk7cmV0dXJuIFIuX2F0dHJpYk9wdHM9SSxSfXRocm93IG5ldyBFcnJvcigiQ29udGV4dCAyRCBjYW5ub3QgY3JlYXRlIHdlYmdsIHByb2dyYW0uIil9Y3JlYXRlUGFzc1Byb2dyYW0oe3ZlcnRleDpMPXgsZnJhZ21lbnQ6RD12LG9wdGlvbnM6SX09e30pe3JldHVybiB0aGlzLmNyZWF0ZVByb2dyYW0oe3ZlcnRleDpMLGZyYWdtZW50OkQsb3B0aW9uczpJfSl9dXNlUHJvZ3JhbShMLEQ9e30pe2lmKHRoaXNbVF0pe2NvbnN0IEk9T2JqZWN0LmFzc2lnbih7fSxMLl9hdHRyaWJPcHRzLEQpO3JldHVybiB0aGlzW1RdLnVzZVByb2dyYW0oTCxJKX10aHJvdyBuZXcgRXJyb3IoIkNvbnRleHQgMkQgY2Fubm90IHVzZSB3ZWJnbCBwcm9ncmFtLiIpfWRlbGV0ZVRleHR1cmUoTCl7cmV0dXJuKHRoaXNbVF18fHRoaXNbbF0pLmRlbGV0ZVRleHR1cmUoTCl9Y2xlYXIoLi4uTCl7aWYodGhpc1tUXSl7Y29uc3QgRD10aGlzW1RdLmdsO0QuY2xlYXIoRC5DT0xPUl9CVUZGRVJfQklUKX1lbHNlIHRoaXNbbF0uY2xlYXIoLi4uTCl9ZHJhd01lc2hDbG91ZChMLHtjbGVhcjpEPSExLHByb2dyYW06ST1udWxsfT17fSl7Y29uc3QgUj10aGlzW1RdfHx0aGlzW2xdLEI9SXx8TC5wcm9ncmFtO2lmKHRoaXNbVF0pe2NvbnN0IHo9Ui5nbDtpZihEJiZ6LmNsZWFyKHouQ09MT1JfQlVGRkVSX0JJVCksQilSLnByb2dyYW0hPT1CJiZ0aGlzLnVzZVByb2dyYW0oQix7YV9jb2xvcjp7dHlwZToiVU5TSUdORURfQllURSIsbm9ybWFsaXplOiEwfSxhX2ZpbGxDbG91ZENvbG9yOnt0eXBlOiJVTlNJR05FRF9CWVRFIixub3JtYWxpemU6ITB9LGFfc3Ryb2tlQ2xvdWRDb2xvcjp7dHlwZToiVU5TSUdORURfQllURSIsbm9ybWFsaXplOiEwfSxhX2ZyYW1lSW5kZXg6e3R5cGU6IlVOU0lHTkVEX0JZVEUiLG5vcm1hbGl6ZTohMX19KTtlbHNle2NvbnN0IEs9TC5tZXNoLm1lc2hEYXRhLFE9ISFLLnVuaWZvcm1zLnVfdGV4U2FtcGxlcixfPSEhSy51bmlmb3Jtcy51X2ZpbHRlckZsYWcsaj0hIUsudW5pZm9ybXMudV9yYWRpYWxHcmFkaWVudFZlY3RvcixHPUwuaGFzQ2xvdWRDb2xvcixYPUwuaGFzQ2xvdWRGaWx0ZXIsWj0hIUsudW5pZm9ybXMudV9jbGlwU2FtcGxlcjtPYmplY3QoeS5hcHBseUNsb3VkU2hhZGVyKShSLHtoYXNUZXh0dXJlOlEsaGFzRmlsdGVyOl8saGFzR3JhZGllbnQ6aixoYXNDbG91ZENvbG9yOkcsaGFzQ2xvdWRGaWx0ZXI6WCxoYXNDbGlwUGF0aDpafSl9dGhpc1tnXSgpLFIuc2V0TWVzaERhdGEoW0wubWVzaERhdGFdKSxMLmJlZm9yZVJlbmRlciYmTC5iZWZvcmVSZW5kZXIoeixMKSxBKFIpLEwuYWZ0ZXJSZW5kZXImJkwuYWZ0ZXJSZW5kZXIoeixMKX1lbHNlIFIuc2V0VHJhbnNmb3JtKHRoaXMuZ2xvYmFsVHJhbnNmb3JtTWF0cml4KSxSLmRyYXdNZXNoQ2xvdWQoTCx7Y2xlYXI6RCxob29rOiExfSl9ZHJhd01lc2hlcyhMLHtjbGVhcjpEPSExLHByb2dyYW06ST1udWxsfT17fSl7Y29uc3QgUj10aGlzW1RdfHx0aGlzW2xdO2lmKHRoaXNbVF0pe2NvbnN0IEI9Ui5mYm8sej1PYmplY3Qocy5kZWZhdWx0KSh0aGlzLEwsST09bnVsbCksSz1SLmdsO0QmJksuY2xlYXIoSy5DT0xPUl9CVUZGRVJfQklUKTtjb25zdCBRPSFPYmplY3QodS5pc1VuaXRUcmFuc2Zvcm0pKHRoaXMuZ2xvYmFsVHJhbnNmb3JtTWF0cml4KTt0aGlzLl9kcmF3Q2FsbHM9MDtmb3IoY29uc3QgXyBvZiB6KXt0aGlzLl9kcmF3Q2FsbHMrKztjb25zdCBqPUl8fF8ucHJvZ3JhbTtpZihfIGluc3RhbmNlb2YgbS5kZWZhdWx0KXRoaXMuZHJhd01lc2hDbG91ZChfLHtjbGVhcjpELHByb2dyYW06an0pO2Vsc2V7Y29uc3R7d2lkdGg6RyxoZWlnaHQ6WH09dGhpcy5jYW52YXM7aWYoXy5iZWZvcmVSZW5kZXImJl8uYmVmb3JlUmVuZGVyKEssXyksXy5wYXNzLmxlbmd0aCYmKCghdGhpcy5mYm98fHRoaXMuZmJvLndpZHRoIT09R3x8dGhpcy5mYm8uaGVpZ2h0IT09WCkmJih0aGlzLmZibz17d2lkdGg6RyxoZWlnaHQ6WCx0YXJnZXQ6Ui5jcmVhdGVGQk8oKSxidWZmZXI6Ui5jcmVhdGVGQk8oKSxzd2FwKCl7W3RoaXMudGFyZ2V0LHRoaXMuYnVmZmVyXT1bdGhpcy5idWZmZXIsdGhpcy50YXJnZXRdfX0pLFIuYmluZEZCTyh0aGlzLmZiby50YXJnZXQpKSwhaiYmXy5maWx0ZXJDYW52YXMpe09iamVjdCh5LmFwcGx5U2hhZGVyKShSLHtoYXNUZXh0dXJlOiEwfSk7bGV0IFo9dGhpcy5maWx0ZXJDb250ZXh0O1p8fChaPXAuZGVmYXVsdC5jcmVhdGVDYW52YXMoRyxYKS5nZXRDb250ZXh0KCIyZCIpLHRoaXMuZmlsdGVyQ29udGV4dD1aKTtjb25zdCB0dD1MW18ucGFja0luZGV4XSxudD10dC5maWx0ZXIscT1MW18ucGFja0luZGV4KzFdLGR0PUxbXy5wYWNrSW5kZXgtMV07KCFkdHx8IWR0LmZpbHRlckNhbnZhc3x8ZHQuZmlsdGVyIT09bnQpJiYoIXF8fCFxLmZpbHRlckNhbnZhc3x8cS5maWx0ZXIhPT1udCk/KFE/KFouc2F2ZSgpLE9iamVjdChpLmRyYXdNZXNoMkQpKHR0LFosITEpLFoucmVzdG9yZSgpLE9iamVjdChpLmFwcGx5RmlsdGVyKShaLG50KSk6T2JqZWN0KGkuZHJhd01lc2gyRCkodHQsWiwhMCksdGhpc1tnXSgpLEMoUixaLEcsWCkpOihRJiZaLnNhdmUoKSxPYmplY3QoaS5kcmF3TWVzaDJEKSh0dCxaLCExKSxRJiZaLnJlc3RvcmUoKSwoIXF8fCFxLmZpbHRlckNhbnZhc3x8dHQuZmlsdGVyIT09cS5maWx0ZXIpJiYoT2JqZWN0KGkuYXBwbHlGaWx0ZXIpKFosbnQpLHRoaXNbZ10oKSxDKFIsWixHLFgpKSl9ZWxzZXtpZihqKVIucHJvZ3JhbSE9PWomJnRoaXMudXNlUHJvZ3JhbShqLHthX2NvbG9yOnt0eXBlOiJVTlNJR05FRF9CWVRFIixub3JtYWxpemU6ITB9fSk7ZWxzZXtjb25zdCBaPSEhXy51bmlmb3Jtcy51X3RleFNhbXBsZXIsdHQ9ISFfLnVuaWZvcm1zLnVfZmlsdGVyRmxhZyxudD0hIV8udW5pZm9ybXMudV9yYWRpYWxHcmFkaWVudFZlY3RvcixxPSEhXy51bmlmb3Jtcy51X2NsaXBTYW1wbGVyO09iamVjdCh5LmFwcGx5U2hhZGVyKShSLHtoYXNUZXh0dXJlOlosaGFzRmlsdGVyOnR0LGhhc0dyYWRpZW50Om50LGhhc0NsaXBQYXRoOnF9KX1fLmZpbHRlckNhbnZhcyYmY29uc29sZS53YXJuKCJVc2VyIHByb2dyYW0gaWdub3JlZCBzb21lIGZpbHRlciBlZmZlY3RzLiIpLHRoaXNbZ10oKSxSLnNldE1lc2hEYXRhKFtfXSksQShSKX1pZihfLnBhc3MubGVuZ3RoKXtjb25zdCBaPV8ucGFzcy5sZW5ndGg7Xy5wYXNzLmZvckVhY2goKHR0LG50KT0+e3R0LmJsZW5kPV8uZW5hYmxlQmxlbmQsdHQuc2V0VGV4dHVyZShSLmZiby50ZXh0dXJlKSxudD09PVotMT9SLmJpbmRGQk8oQik6KHRoaXMuZmJvLnN3YXAoKSxSLmJpbmRGQk8odGhpcy5mYm8udGFyZ2V0KSksdHQucHJvZ3JhbT9SLnVzZVByb2dyYW0odHQucHJvZ3JhbSk6KHRoaXMuZGVmYXVsdFBhc3NQcm9ncmFtPXRoaXMuZGVmYXVsdFBhc3NQcm9ncmFtfHx0aGlzLmNyZWF0ZVBhc3NQcm9ncmFtKCksUi51c2VQcm9ncmFtKHRoaXMuZGVmYXVsdFBhc3NQcm9ncmFtKSksUi5zZXRNZXNoRGF0YShbdHQubWVzaERhdGFdKSxLLmNsZWFyKEsuQ09MT1JfQlVGRkVSX0JJVCksQShSKX0pfV8uYWZ0ZXJSZW5kZXImJl8uYWZ0ZXJSZW5kZXIoSyxfKX19fWVsc2UgUi5zZXRUcmFuc2Zvcm0odGhpcy5nbG9iYWxUcmFuc2Zvcm1NYXRyaXgpLFIuZHJhd01lc2hlcyhMLHtjbGVhcjpEfSl9ZHJhd0ltYWdlKEwsLi4uRCl7Y29uc3QgST1ELmxlbmd0aDtpZihJPDIpdGhyb3cgbmV3IFR5cGVFcnJvcihgRmFpbGVkIHRvIGV4ZWN1dGUgJ2RyYXdJbWFnZScgb24gJ1JlbmRlcmVyJzogMyBhcmd1bWVudHMgcmVxdWlyZWQsIGJ1dCBvbmx5ICR7RC5sZW5ndGgrMX0gcHJlc2VudC5gKTtpZihJIT09MiYmSSE9PTQmJkkhPT04KXRocm93IG5ldyBUeXBlRXJyb3IoYEZhaWxlZCB0byBleGVjdXRlICdkcmF3SW1hZ2UnIG9uICdSZW5kZXJlcic6IFZhbGlkIGFyaXRpZXMgYXJlOiBbMywgNSwgOV0sIGJ1dCAke0QubGVuZ3RoKzF9IGFyZ3VtZW50cyBwcm92aWRlZC5gKTtsZXQgUj1udWxsLEI9bnVsbDtJPT09Mj9SPVtEWzBdLERbMV0sTC53aWR0aCxMLmhlaWdodF06ST09PTQ/Uj1EOkk9PT04JiYoQj1ELnNsaWNlKDAsNCksUj1ELnNsaWNlKDQpKTtjb25zdCB6PXRoaXMuY3JlYXRlVGV4dHVyZShMKSx7d2lkdGg6SyxoZWlnaHQ6UX09dGhpcy5jYW52YXMsXz1uZXcgby5kZWZhdWx0O18ucmVjdChSWzBdLFJbMV0sSyxRKTtjb25zdCBqPW5ldyBjLmRlZmF1bHQoXyx7d2lkdGg6SyxoZWlnaHQ6UX0pO2ouc2V0VGV4dHVyZSh6LHtyZWN0OlIsc3JjUmVjdDpCfSksdGhpcy5kcmF3TWVzaGVzKFtqXSksdGhpcy5kZWxldGVUZXh0dXJlKHopfXNldEdsb2JhbFRyYW5zZm9ybSguLi5MKXtyZXR1cm4gdGhpc1tmXT1bTFswXSxMWzFdLDAsTFsyXSxMWzNdLDAsTFs0XSxMWzVdLDFdLHRoaXN9Z2xvYmFsVHJhbnNmb3JtKC4uLkwpe2NvbnN0IEQ9dGhpc1tmXTtyZXR1cm4gdGhpc1tmXT1uLm1hdDMubXVsdGlwbHkoQXJyYXkub2YoMCwwLDAsMCwwLDAsMCwwLDApLEQsTCksdGhpc31nbG9iYWxUcmFuc2xhdGUoTCxEKXtsZXQgST1uLm1hdDMuY3JlYXRlKCk7cmV0dXJuIEk9bi5tYXQzLnRyYW5zbGF0ZShBcnJheS5vZigwLDAsMCwwLDAsMCwwLDAsMCksSSxbTCxEXSksdGhpcy5nbG9iYWxUcmFuc2Zvcm0oLi4uSSl9Z2xvYmFsUm90YXRlKEwsW0QsSV09WzAsMF0pe2xldCBSPW4ubWF0My5jcmVhdGUoKTtyZXR1cm4gUj1uLm1hdDMudHJhbnNsYXRlKEFycmF5Lm9mKDAsMCwwLDAsMCwwLDAsMCwwKSxSLFtELEldKSxSPW4ubWF0My5yb3RhdGUoQXJyYXkub2YoMCwwLDAsMCwwLDAsMCwwLDApLFIsTCksUj1uLm1hdDMudHJhbnNsYXRlKEFycmF5Lm9mKDAsMCwwLDAsMCwwLDAsMCwwKSxSLFstRCwtSV0pLHRoaXMuZ2xvYmFsVHJhbnNmb3JtKC4uLlIpfWdsb2JhbFNjYWxlKEwsRD1MLFtJLFJdPVswLDBdKXtsZXQgQj1uLm1hdDMuY3JlYXRlKCk7cmV0dXJuIEI9bi5tYXQzLnRyYW5zbGF0ZShBcnJheS5vZigwLDAsMCwwLDAsMCwwLDAsMCksQixbSSxSXSksQj1uLm1hdDMuc2NhbGUoQXJyYXkub2YoMCwwLDAsMCwwLDAsMCwwLDApLEIsW0wsRF0pLEI9bi5tYXQzLnRyYW5zbGF0ZShBcnJheS5vZigwLDAsMCwwLDAsMCwwLDAsMCksQixbLUksLVJdKSx0aGlzLmdsb2JhbFRyYW5zZm9ybSguLi5CKX1nbG9iYWxTa2V3KEwsRD1MLFtJLFJdPVswLDBdKXtsZXQgQj1uLm1hdDMuY3JlYXRlKCk7cmV0dXJuIEI9bi5tYXQzLnRyYW5zbGF0ZShBcnJheS5vZigwLDAsMCwwLDAsMCwwLDAsMCksQixbSSxSXSksQj1uLm1hdDMubXVsdGlwbHkoQXJyYXkub2YoMCwwLDAsMCwwLDAsMCwwLDApLEIsbi5tYXQzLmZyb21WYWx1ZXMoMSxNYXRoLnRhbihEKSxNYXRoLnRhbihMKSwxLDAsMCkpLEI9bi5tYXQzLnRyYW5zbGF0ZShBcnJheS5vZigwLDAsMCwwLDAsMCwwLDAsMCksQixbLUksLVJdKSx0aGlzLmdsb2JhbFRyYW5zZm9ybSguLi5CKX10cmFuc2Zvcm1Qb2ludChMLEQsSSl7bGV0IFI9dGhpcy5nbG9iYWxUcmFuc2Zvcm1NYXRyaXg7SSYmKFI9bi5tYXQzLm11bHRpcGx5KEFycmF5Lm9mKDAsMCwwLDAsMCwwLDAsMCwwKSxSLEkpKTtjb25zdCBCPUwqUlswXStEKlJbMl0rUls0XSx6PUwqUlsxXStEKlJbM10rUls1XTtyZXR1cm5bQix6XX19fSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpO3ZhciBlPXQoMTUpO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KSxyLmRlZmF1bHQ9ZS5kZWZhdWx0fSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJkZWZhdWx0IixmdW5jdGlvbigpe3JldHVybiB5fSk7dmFyIGU9dCgxNiksbj10KDE3KSxhPXQoMTgpLHM9dCgxOSk7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2Z1bmN0aW9uIGkoTyx4LHYpe3JldHVybiB4IGluIE8/T2JqZWN0LmRlZmluZVByb3BlcnR5KE8seCx7dmFsdWU6dixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOk9beF09dixPfWNvbnN0IG89e307ZnVuY3Rpb24gYyhPLHg9Myl7Y29uc3Qgdj1bXSxUPU8ubGVuZ3RoO2ZvcihsZXQgbD0wO2w8VDtsKyspbCV4PDImJnYucHVzaCguNSooT1tsXSsxKSk7cmV0dXJuIHZ9ZnVuY3Rpb24gbShPLHgpe2NvbnN0IHY9eC5fYnVmZmVycztPYmplY3QudmFsdWVzKHYpLmZvckVhY2goVD0+e08uZGVsZXRlQnVmZmVyKFQpfSkseC5fYnVmZmVycz17fX1mdW5jdGlvbiB1KE8seCx2KXtyZXR1cm4gTy5hY3RpdmVUZXh0dXJlKE8uVEVYVFVSRTArdiksQXJyYXkuaXNBcnJheSh4Ll9pbWcpP08uYmluZFRleHR1cmUoTy5URVhUVVJFX0NVQkVfTUFQLHgpOk8uYmluZFRleHR1cmUoTy5URVhUVVJFXzJELHgpLHh9Y29uc3QgcD17aW50OiIxaSIsaXZlYzI6IjJpIixpdmVjMzoiM2kiLGl2ZWM0OiI0aSIsZmxvYXQ6IjFmIix2ZWMyOiIyZiIsdmVjMzoiM2YiLHZlYzQ6IjRmIixtYXQyOiJNYXRyaXgyZnYiLG1hdDM6Ik1hdHJpeDNmdiIsbWF0NDoiTWF0cml4NGZ2IixzYW1wbGVyMUQ6InNhbXBsZXIxRCIsc2FtcGxlcjJEOiJzYW1wbGVyMkQiLHNhbXBsZXIzRDoic2FtcGxlcjNEIixzYW1wbGVyQ3ViZToic2FtcGxlckN1YmUiLHNhbXBsZXIxRFNoYWRvdzoic2FtcGxlcjFEU2hhZG93IixzYW1wbGVyMkRTaGFkb3c6InNhbXBsZXIyRFNoYWRvdyIsc2FtcGxlcjJEUmVjdDoic2FtcGxlcjJEUmVjdCIsc2FtcGxlcjJEUmVjdFNoYWRvdzoic2FtcGxlcjJEUmVjdFNoYWRvdyJ9O2NsYXNzIHl7c3RhdGljIGFkZExpYnMoeD17fSl7T2JqZWN0LmFzc2lnbihvLHgpfXN0YXRpYyBGTE9BVCh4LHYpe3JldHVybiBPYmplY3QoZS5wb2ludHNUb0J1ZmZlcikoeCxGbG9hdDMyQXJyYXksdil9c3RhdGljIFVOU0lHTkVEX0JZVEUoeCx2KXtyZXR1cm4gT2JqZWN0KGUucG9pbnRzVG9CdWZmZXIpKHgsVWludDhBcnJheSx2KX1zdGF0aWMgVU5TSUdORURfU0hPUlQoeCx2KXtyZXR1cm4gT2JqZWN0KGUucG9pbnRzVG9CdWZmZXIpKHgsVWludDE2QXJyYXksdil9c3RhdGljIEJZVEUoeCx2KXtyZXR1cm4gT2JqZWN0KGUucG9pbnRzVG9CdWZmZXIpKHgsSW50OEFycmF5LHYpfXN0YXRpYyBTSE9SVCh4LHYpe3JldHVybiBPYmplY3QoZS5wb2ludHNUb0J1ZmZlcikoeCxJbnQxNkFycmF5LHYpfWNvbnN0cnVjdG9yKHgsdj17fSl7dGhpcy5vcHRpb25zPU9iamVjdC5hc3NpZ24oe30seS5kZWZhdWx0T3B0aW9ucyx2KSx0aGlzLmNhbnZhcz14O2xldCBUO3RoaXMub3B0aW9ucy53ZWJnbDImJihUPXguZ2V0Q29udGV4dCgid2ViZ2wyIix0aGlzLm9wdGlvbnMpKSxUPT1udWxsJiYoVD1PYmplY3QoZS5zZXR1cFdlYkdMKSh4LHRoaXMub3B0aW9ucyksdGhpcy5haWFfZXh0PVQuZ2V0RXh0ZW5zaW9uKCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIikpLHRoaXMuZ2w9VCxULnZpZXdwb3J0KDAsMCx4LndpZHRoLHguaGVpZ2h0KSxULmNsZWFyQ29sb3IoMCwwLDAsMCksVC5ibGVuZEZ1bmNTZXBhcmF0ZShULlNSQ19BTFBIQSxULk9ORV9NSU5VU19TUkNfQUxQSEEsVC5PTkUsVC5PTkVfTUlOVVNfU1JDX0FMUEhBKSx0aGlzLnByb2dyYW1zPVtdLHRoaXMuX2V2ZW50cz17fX1nZXQgcHJvZ3JhbSgpe2NvbnN0IHg9dGhpcy5nbDtyZXR1cm4geC5nZXRQYXJhbWV0ZXIoeC5DVVJSRU5UX1BST0dSQU0pfV9kZWNsYXJlVW5pZm9ybSh4LHYsVD0iMWYiKXtjb25zdCBsPXRoaXMuZ2wsaD1sLmdldFVuaWZvcm1Mb2NhdGlvbih4LHYpO2xldCBmO2NvbnN0IGc9dGhpcztpZigvXnNhbXBsZXIvLnRlc3QoVCkpe2NvbnN0IE09eC5fc2FtcGxlck1hcCxBPXguX2JpbmRUZXh0dXJlcztPYmplY3QuZGVmaW5lUHJvcGVydHkoeC51bmlmb3Jtcyx2LHtnZXQoKXtyZXR1cm4gZn0sc2V0KEMpe2Y9Qztjb25zdCBiPU1bdl0hPW51bGw/TVt2XTpBLmxlbmd0aDtBW2JdPUMsdShsLEMsYiksTVt2XXx8KE1bdl09YixsLnVuaWZvcm0xaShoLGIpKSxnLm9wdGlvbnMuYXV0b1VwZGF0ZSYmZy51cGRhdGUoKX0sY29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITB9KX1lbHNle2NvbnN0IE09VC5pbmRleE9mKCJNYXRyaXgiKT09PTAsQT0hTSYmL3YkLy50ZXN0KFQpLEM9bFtgdW5pZm9ybSR7VH1gXS5iaW5kKGwpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh4LnVuaWZvcm1zLHYse2dldCgpe3JldHVybiBmfSxzZXQoYil7Zj1iLHR5cGVvZiBiPT0ibnVtYmVyIiYmKGI9W2JdKSxNP0MoaCwhMSxiKTpBP0MoaCxiKTpDKGgsLi4uYiksZy5vcHRpb25zLmF1dG9VcGRhdGUmJmcudXBkYXRlKCl9LGNvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwfSl9fV9kcmF3KCl7Y29uc3QgeD10aGlzLnByb2dyYW07eC5tZXNoRGF0YS5mb3JFYWNoKCh2LFQpPT57Y29uc3R7cG9zaXRpb25zOmwsY2VsbHM6aCxpbnN0YW5jZUNvdW50OmYsY2VsbHNDb3VudDpnLGF0dHJpYnV0ZXM6TSx1bmlmb3JtczpBLHRleHR1cmVDb29yZDpDLGVuYWJsZUJsZW5kOmJ9PXYsRT10aGlzLmdsO2xldCBMPXYubW9kZSE9bnVsbD92Lm1vZGU6RS5UUklBTkdMRVM7dHlwZW9mIEw9PSJzdHJpbmciJiYoTD1FW0xdKSxiP0UuZW5hYmxlKEUuQkxFTkQpOkUuZGlzYWJsZShFLkJMRU5EKSxFLmJpbmRCdWZmZXIoRS5BUlJBWV9CVUZGRVIseC5fYnVmZmVycy52ZXJ0aWNlc0J1ZmZlciksRS5idWZmZXJEYXRhKEUuQVJSQVlfQlVGRkVSLGwsRS5TVEFUSUNfRFJBVyksaCYmKEUuYmluZEJ1ZmZlcihFLkVMRU1FTlRfQVJSQVlfQlVGRkVSLHguX2J1ZmZlcnMuY2VsbHNCdWZmZXIpLEUuYnVmZmVyRGF0YShFLkVMRU1FTlRfQVJSQVlfQlVGRkVSLGgsRS5TVEFUSUNfRFJBVykpO2NvbnN0IEQ9W107TSYmT2JqZWN0LnZhbHVlcyhNKS5mb3JFYWNoKCh7bmFtZTpSLGRhdGE6QixkaXZpc29yOnp9KT0+e2lmKEUuYmluZEJ1ZmZlcihFLkFSUkFZX0JVRkZFUix4Ll9idWZmZXJzW1JdKSxFLmJ1ZmZlckRhdGEoRS5BUlJBWV9CVUZGRVIsQixFLlNUQVRJQ19EUkFXKSx6IT1udWxsKXtjb25zdCBLPUUuZ2V0QXR0cmliTG9jYXRpb24oeCxSKTtLPj0wJiYoRS5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShLKSxELnB1c2goSyksRS52ZXJ0ZXhBdHRyaWJEaXZpc29yP0UudmVydGV4QXR0cmliRGl2aXNvcihLLHopOnRoaXMuYWlhX2V4dCYmdGhpcy5haWFfZXh0LnZlcnRleEF0dHJpYkRpdmlzb3JBTkdMRShLLHopKX19KSxBJiZPYmplY3QuZW50cmllcyhBKS5mb3JFYWNoKChbUixCXSk9Pnt0aGlzLnVuaWZvcm1zW1JdPUJ9KTtsZXQgSTtpZighaCl7Y29uc3QgUj14Ll9kaW1lbnNpb247ST1sLmxlbmd0aC9SfWlmKHguX2VuYWJsZVRleHR1cmVzJiZ4Ll9idWZmZXJzLnRleENvb3JkQnVmZmVyKXtjb25zdCBSPUN8fGMobCx4Ll9kaW1lbnNpb24pO0UuYmluZEJ1ZmZlcihFLkFSUkFZX0JVRkZFUix4Ll9idWZmZXJzLnRleENvb3JkQnVmZmVyKSxFLmJ1ZmZlckRhdGEoRS5BUlJBWV9CVUZGRVIseS5GTE9BVChSKSxFLlNUQVRJQ19EUkFXKX1mIT1udWxsPyhoP0UuZHJhd0VsZW1lbnRzSW5zdGFuY2VkP0UuZHJhd0VsZW1lbnRzSW5zdGFuY2VkKEwsZyxFLlVOU0lHTkVEX1NIT1JULDAsZik6dGhpcy5haWFfZXh0JiZ0aGlzLmFpYV9leHQuZHJhd0VsZW1lbnRzSW5zdGFuY2VkQU5HTEUoTCxnLEUuVU5TSUdORURfU0hPUlQsMCxmKTpFLmRyYXdBcnJheXNJbnN0YW5jZWQ/RS5kcmF3QXJyYXlzSW5zdGFuY2VkKEwsMCxJLGYpOnRoaXMuYWlhX2V4dC5kcmF3QXJyYXlzSW5zdGFuY2VkQU5HTEUoTCwwLEksZiksRC5mb3JFYWNoKFI9PntFLnZlcnRleEF0dHJpYkRpdmlzb3I/RS52ZXJ0ZXhBdHRyaWJEaXZpc29yKFIsbnVsbCk6dGhpcy5haWFfZXh0JiZ0aGlzLmFpYV9leHQudmVydGV4QXR0cmliRGl2aXNvckFOR0xFKFIsbnVsbCl9KSk6aD9FLmRyYXdFbGVtZW50cyhMLGcsRS5VTlNJR05FRF9TSE9SVCwwKTpFLmRyYXdBcnJheXMoTCwwLEkpfSl9Z2V0IGlzV2ViR0wyKCl7cmV0dXJuIHR5cGVvZiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0PCJ1IiYmdGhpcy5nbCBpbnN0YW5jZW9mIFdlYkdMMlJlbmRlcmluZ0NvbnRleHR9Z2V0IGVuYWJsZVRleHR1cmVzKCl7cmV0dXJuIHRoaXMucHJvZ3JhbSYmdGhpcy5wcm9ncmFtLl9lbmFibGVUZXh0dXJlc31nZXQgdW5pZm9ybXMoKXtjb25zdCB4PXRoaXMucHJvZ3JhbTtpZigheHx8IXgudW5pZm9ybXMpdGhyb3cgRXJyb3IoIk5vIGF2YWxpYWJsZSBwcm9ncmFtLiIpO3JldHVybiB4LnVuaWZvcm1zfWRlbGV0ZVByb2dyYW0oeCl7Y29uc3Qgdj10aGlzLmdsO3RoaXMucHJvZ3JhbT09PXgmJih0aGlzLnN0YXJ0UmVuZGVyPSExLHRoaXMuX3JlbmRlckZyYW1lSUQmJihjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yZW5kZXJGcmFtZUlEKSxkZWxldGUgdGhpcy5fcmVuZGVyRnJhbWVJRCksdi51c2VQcm9ncmFtKG51bGwpKTtjb25zdCBUPXRoaXMucHJvZ3JhbXMuaW5kZXhPZih4KTtUPj0wJiZ0aGlzLnByb2dyYW1zLnNwbGljZShULDEpLG0odix4KSx2LmRlbGV0ZVByb2dyYW0oeCl9c2V0TWVzaERhdGEoeCl7QXJyYXkuaXNBcnJheSh4KXx8KHg9W3hdKTtjb25zdCB2PXRoaXMucHJvZ3JhbTt2Lm1lc2hEYXRhPXgubWFwKCh7bW9kZTpULHBvc2l0aW9uczpsLGluc3RhbmNlQ291bnQ6aCxjZWxsczpmLGNlbGxzQ291bnQ6ZyxhdHRyaWJ1dGVzOk0sdW5pZm9ybXM6QSx0ZXh0dXJlQ29vcmQ6QyxlbmFibGVCbGVuZDpifSk9Pntjb25zdCBFPXtwb3NpdGlvbnM6eS5GTE9BVChsKSx1bmlmb3JtczpBLGVuYWJsZUJsZW5kOiEhYix0ZXh0dXJlQ29vcmQ6eS5GTE9BVChDKX07aWYoZiYmKEUuY2VsbHM9eS5VU0hPUlQoZiksRS5jZWxsc0NvdW50PWd8fEUuY2VsbHMubGVuZ3RoKSxUIT1udWxsJiYoRS5tb2RlPVQpLGghPW51bGwpe2lmKCF0aGlzLmlzV2ViR0wyJiYhdGhpcy5haWFfZXh0KXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHVzZSBpbnN0YW5jZUNvdW50IGluIHRoaXMgcmVuZGVyaW5nIGNvbnRleHQsIHVzZSB3ZWJnbDIgY29udGV4dCBpbnN0ZWFkLiIpO0UuaW5zdGFuY2VDb3VudD1ofWlmKE0pe2NvbnN0IEw9e307T2JqZWN0LmVudHJpZXMoTSkuZm9yRWFjaCgoW0QsSV0pPT57aWYoIXYuX2F0dHJpYnV0ZVtEXSl2Ll9hdHRyaWJ1dGVbRF09Imlnbm9yZWQiO2Vsc2UgaWYodi5fYXR0cmlidXRlW0RdIT09Imlnbm9yZWQiKXtjb25zdHtuYW1lOlIsdHlwZTpCfT12Ll9hdHRyaWJ1dGVbRF07bGV0IHo9SS5kYXRhfHxJO2lmKEFycmF5LmlzQXJyYXkoeikmJih6PXlbQl0oeikpLExbRF09e25hbWU6UixkYXRhOnp9LEkuZGl2aXNvciE9bnVsbCl7aWYoIXRoaXMuaXNXZWJHTDImJiF0aGlzLmFpYV9leHQpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgdXNlIGRpdmlzb3IgaW4gdGhpcyByZW5kZXJpbmcgY29udGV4dCwgdXNlIHdlYmdsMiBjb250ZXh0IGluc3RlYWQuIik7TFtEXS5kaXZpc29yPUkuZGl2aXNvcn19fSksRS5hdHRyaWJ1dGVzPUx9cmV0dXJuIEV9KSx0aGlzLm9wdGlvbnMuYXV0b1VwZGF0ZSYmdGhpcy51cGRhdGUoKX1jcmVhdGVQcm9ncmFtKHgsdil7Y29uc3QgVD0vXlxzKnVuaWZvcm1ccytzYW1wbGVyL21nLnRlc3QoeCk7eD09bnVsbCYmKHg9YS5kZWZhdWx0KSx2PT1udWxsJiYodj1UP3MuZGVmYXVsdDpuLmRlZmF1bHQpO2NvbnN0IGw9dGhpcy5nbCxoPU9iamVjdChlLmNyZWF0ZVByb2dyYW0pKGwsdix4KTtoLnNoYWRlclRleHQ9e3ZlcnRleFNoYWRlcjp2LGZyYWdtZW50U2hhZGVyOnh9LGguX2J1ZmZlcnM9e30saC5fYXR0cmlidXRlPXt9LGgudW5pZm9ybXM9e30saC5fc2FtcGxlck1hcD17fSxoLl9iaW5kVGV4dHVyZXM9W107Y29uc3QgZj1uZXcgUmVnRXhwKGAoPzphdHRyaWJ1dGV8aW4pIHZlYyhcXGQpICR7dGhpcy5vcHRpb25zLnZlcnRleFBvc2l0aW9ufWAsImltIik7bGV0IGc9di5tYXRjaChmKTtnJiYoaC5fZGltZW5zaW9uPU51bWJlcihnWzFdKSk7Y29uc3QgTT1uZXcgUmVnRXhwKGAoPzphdHRyaWJ1dGV8aW4pIHZlYyhcXGQpICR7dGhpcy5vcHRpb25zLnZlcnRleFRleHR1cmVDb29yZH1gLCJpbSIpO2c9di5tYXRjaChNKSxnJiYoaC5fdGV4Q29vcmRTaXplPU51bWJlcihnWzFdKSk7Y29uc3QgQT0vXlxzKig/OmF0dHJpYnV0ZXxpbikgKFx3Kz8pKFxkKikgKFx3KykvZ2ltO2lmKGc9di5tYXRjaChBKSxnKWZvcihsZXQgRT0wO0U8Zy5sZW5ndGg7RSsrKXtjb25zdCBMPS9eXHMqKD86YXR0cmlidXRlfGluKSAoXHcrPykoXGQqKSAoXHcrKS9pbSxEPWdbRV0ubWF0Y2goTCk7aWYoRCYmRFszXSE9PXRoaXMub3B0aW9ucy52ZXJ0ZXhQb3NpdGlvbiYmRFszXSE9PXRoaXMub3B0aW9ucy52ZXJ0ZXhUZXh0dXJlQ29vcmQpe2xldFssSSxSLEJdPUQ7ST09PSJtYXQiJiYoUioqPTIpLGguX2J1ZmZlcnNbQl09bC5jcmVhdGVCdWZmZXIoKSxoLl9hdHRyaWJ1dGVbQl09e25hbWU6Qix0eXBlOkksc2l6ZTpOdW1iZXIoUil8fDF9fX1jb25zdCBDPS9eXHMqdW5pZm9ybVxzKyhcdyspXHMrKFx3KykoXFtcZCtcXSk/L21nO2c9di5tYXRjaChDKXx8W10sZz1nLmNvbmNhdCh4Lm1hdGNoKEMpfHxbXSksZy5mb3JFYWNoKEU9Pntjb25zdCBMPUUubWF0Y2goL15ccyp1bmlmb3JtXHMrKFx3KylccysoXHcrKShcW1xkK1xdKT8vKTtsZXRbRCxJLFJdPUwuc2xpY2UoMSk7RD1wW0RdLFI9ISFSLEQuaW5kZXhPZigiTWF0cml4IikhPT0wJiZSJiYoRCs9InYiKSx0aGlzLl9kZWNsYXJlVW5pZm9ybShoLEksRCl9KSxoLl9idWZmZXJzLnZlcnRpY2VzQnVmZmVyPWwuY3JlYXRlQnVmZmVyKCksaC5fYnVmZmVycy5jZWxsc0J1ZmZlcj1sLmNyZWF0ZUJ1ZmZlcigpO2NvbnN0IGI9bC5nZXRBdHRyaWJMb2NhdGlvbihoLHRoaXMub3B0aW9ucy52ZXJ0ZXhUZXh0dXJlQ29vcmQpO3JldHVybiBoLl9lbmFibGVUZXh0dXJlcz1iPj0wLGguX2VuYWJsZVRleHR1cmVzJiYoaC5fYnVmZmVycy50ZXhDb29yZEJ1ZmZlcj1sLmNyZWF0ZUJ1ZmZlcigpKSx0aGlzLnByb2dyYW1zLnB1c2goaCksaH11c2VQcm9ncmFtKHgsdj17fSl7dGhpcy5zdGFydFJlbmRlcj0hMSx0aGlzLl9yZW5kZXJGcmFtZUlEJiYoY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmVuZGVyRnJhbWVJRCksZGVsZXRlIHRoaXMuX3JlbmRlckZyYW1lSUQpO2NvbnN0IFQ9dGhpcy5nbDtULnVzZVByb2dyYW0oeCk7Y29uc3QgbD14Ll9kaW1lbnNpb247VC5iaW5kQnVmZmVyKFQuQVJSQVlfQlVGRkVSLHguX2J1ZmZlcnMudmVydGljZXNCdWZmZXIpO2NvbnN0IGg9VC5nZXRBdHRyaWJMb2NhdGlvbih4LHRoaXMub3B0aW9ucy52ZXJ0ZXhQb3NpdGlvbik7aWYoVC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGgsbCxULkZMT0FULCExLDAsMCksVC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShoKSx4Ll9lbmFibGVUZXh0dXJlcyl7VC5iaW5kQnVmZmVyKFQuQVJSQVlfQlVGRkVSLHguX2J1ZmZlcnMudGV4Q29vcmRCdWZmZXIpO2NvbnN0IGY9VC5nZXRBdHRyaWJMb2NhdGlvbih4LHRoaXMub3B0aW9ucy52ZXJ0ZXhUZXh0dXJlQ29vcmQpO1QudmVydGV4QXR0cmliUG9pbnRlcihmLHguX3RleENvb3JkU2l6ZXx8MixULkZMT0FULCExLDAsMCksVC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShmKX1pZihPYmplY3QuZW50cmllcyh4Ll9hdHRyaWJ1dGUpLmZvckVhY2goKFtmLGddKT0+e2lmKGchPT0iaWdub3JlZCIpe2NvbnN0IE09Zy5zaXplLEE9dltmXXx8e30sQz0hIUEubm9ybWFsaXplO2xldCBiPUEudHlwZXx8IkZMT0FUIjtjb25zdCBFPUEua2V5fHxmO2I9PT0iVUJZVEUiJiYoYj0iVU5TSUdORURfQllURSIpLGI9PT0iVVNIT1JUIiYmKGI9IlVOU0lHTkVEX1NIT1JUIiksZy50eXBlPWIsRSYmRSE9PWYmJih4Ll9hdHRyaWJ1dGVbRV09ZyksVC5iaW5kQnVmZmVyKFQuQVJSQVlfQlVGRkVSLHguX2J1ZmZlcnNbZl0pO2NvbnN0IEw9VC5nZXRBdHRyaWJMb2NhdGlvbih4LGYpO0w+PTAmJihULnZlcnRleEF0dHJpYlBvaW50ZXIoTCxNLFRbYl0sQywwLDApLFQuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoTCkpfX0pLCF4Lm1lc2hEYXRhKXtjb25zdCBmPVtbLTEsLTEsMCwxXS5zbGljZSgwLGwpLFsxLC0xLDAsMV0uc2xpY2UoMCxsKSxbMSwxLDAsMV0uc2xpY2UoMCxsKSxbLTEsMSwwLDFdLnNsaWNlKDAsbCldLGc9W1swLDEsM10sWzMsMSwyXV07dGhpcy5zZXRNZXNoRGF0YSh7cG9zaXRpb25zOmYsY2VsbHM6Z30pfXJldHVybiB4fWNvbXBpbGVTeW5jKHgsdil7eD14fHxhLmRlZmF1bHQ7Y29uc3QgVD17fTtmdW5jdGlvbiBsKE0pe009TS5yZXBsYWNlKC9eXHMqL21nLCIiKTtjb25zdCBBPVtdLEM9TS5tYXRjaCgvXiNwcmFnbWFccytpbmNsdWRlXHMrLiovbWcpO2lmKEMpe2ZvcihsZXQgYj0wO2I8Qy5sZW5ndGg7YisrKXtjb25zdCBMPUNbYl0ubWF0Y2goLyg/Ojx8IikoLiopKD86PnwiKS8pO2lmKEwpe2NvbnN0IEQ9TFswXS5pbmRleE9mKCI8Iik9PT0wPyJsaWIiOiJsaW5rIjtsZXQgST1MWzFdO2lmKEk9PT0iZ3JhcGgiJiYoST0iZ3JhcGhpY3MiKSxUW0ldKUEucHVzaChgLyogaW5jbHVkZWQgJHtJfSAqL2ApO2Vsc2UgaWYoVFtJXT0hMCxEPT09ImxpYiIpe2NvbnN0IFI9bChvW0ldKTtBLnB1c2goUil9ZWxzZSBpZihEPT09ImxpbmsiKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGxvYWQgZXh0ZXJuYWwgbGlua3Mgc3luY2hyb25vdXNseS4gVXNlIGNvbXBpbGUgaW5zdGVhZCBvZiBjb21waWxlU3luYy4iKX19QS5mb3JFYWNoKGI9PntNPU0ucmVwbGFjZSgvXiNwcmFnbWFccytpbmNsdWRlXHMrLiovbSxiKX0pfXJldHVybiBNfWNvbnN0IGg9bCh4KSxmPXY/bCh2KTpudWxsO3JldHVybiB0aGlzLmNyZWF0ZVByb2dyYW0oaCxmKX1hc3luYyBjb21waWxlKHgsdil7eD14fHxhLmRlZmF1bHQ7Y29uc3QgVD17fTthc3luYyBmdW5jdGlvbiBsKE0pe009TS5yZXBsYWNlKC9eXHMqL21nLCIiKTtjb25zdCBBPVtdLEM9TS5tYXRjaCgvXiNwcmFnbWFccytpbmNsdWRlXHMrLiovbWcpO2lmKEMpe2ZvcihsZXQgYj0wO2I8Qy5sZW5ndGg7YisrKXtjb25zdCBMPUNbYl0ubWF0Y2goLyg/Ojx8IikoLiopKD86PnwiKS8pO2lmKEwpe2NvbnN0IEQ9TFswXS5pbmRleE9mKCI8Iik9PT0wPyJsaWIiOiJsaW5rIjtsZXQgST1MWzFdO2lmKEk9PT0iZ3JhcGgiJiYoST0iZ3JhcGhpY3MiKSxUW0ldKUEucHVzaChgLyogaW5jbHVkZWQgJHtJfSAqL2ApO2Vsc2UgaWYoVFtJXT0hMCxEPT09ImxpYiIpe2NvbnN0IFI9YXdhaXQgbChvW0ldKTtBLnB1c2goUil9ZWxzZSBpZihEPT09ImxpbmsiKXtsZXQgUj1hd2FpdCB5LmZldGNoU2hhZGVyKEkpO1I9YXdhaXQgbChSKSxBLnB1c2goUil9fX1BLmZvckVhY2goYj0+e009TS5yZXBsYWNlKC9eI3ByYWdtYVxzK2luY2x1ZGVccysuKi9tLGIpfSl9cmV0dXJuIE19Y29uc3QgaD1hd2FpdCBsKHgpLGY9dj9hd2FpdCBsKHYpOm51bGw7cmV0dXJuIHRoaXMuY3JlYXRlUHJvZ3JhbShoLGYpfWFzeW5jIGxvYWQoeCx2PW51bGwpe3JldHVybiB4PWF3YWl0IHkuZmV0Y2hTaGFkZXIoeCksdiYmKHY9YXdhaXQgeS5mZXRjaFNoYWRlcih2KSksdGhpcy5jb21waWxlKHgsdil9Y3JlYXRlVGV4dHVyZSh4PW51bGwse3dyYXBTOnY9dGhpcy5nbC5DTEFNUF9UT19FREdFLHdyYXBUOlQ9dGhpcy5nbC5DTEFNUF9UT19FREdFLG1pbkZpbHRlcjpsPXRoaXMuZ2wuTElORUFSLG1hZ0ZpbHRlcjpoPXRoaXMuZ2wuTElORUFSfT17fSl7Y29uc3QgZj10aGlzLmdsLGc9QXJyYXkuaXNBcnJheSh4KT9mLlRFWFRVUkVfQ1VCRV9NQVA6Zi5URVhUVVJFXzJEO3RoaXMuX21heF90ZXh0dXJlX2ltYWdlX3VuaXRzPXRoaXMuX21heF90ZXh0dXJlX2ltYWdlX3VuaXRzfHxmLmdldFBhcmFtZXRlcihmLk1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTKSxmLmFjdGl2ZVRleHR1cmUoZi5URVhUVVJFMCt0aGlzLl9tYXhfdGV4dHVyZV9pbWFnZV91bml0cy0xKTtjb25zdCBNPWYuY3JlYXRlVGV4dHVyZSgpO2YuYmluZFRleHR1cmUoZyxNKSxmLnBpeGVsU3RvcmVpKGYuVU5QQUNLX0ZMSVBfWV9XRUJHTCwhMCk7Y29uc3R7d2lkdGg6QSxoZWlnaHQ6Q309dGhpcy5jYW52YXM7aWYoeClpZihnPT09Zi5URVhUVVJFX0NVQkVfTUFQKWZvcihsZXQgYj0wO2I8NjtiKyspZi50ZXhJbWFnZTJEKGYuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK2IsMCxmLlJHQkEsZi5SR0JBLGYuVU5TSUdORURfQllURSx4W2JdKTtlbHNlIGYudGV4SW1hZ2UyRChnLDAsZi5SR0JBLGYuUkdCQSxmLlVOU0lHTkVEX0JZVEUseCk7ZWxzZSBpZihnPT09Zi5URVhUVVJFX0NVQkVfTUFQKWZvcihsZXQgYj0wO2I8NjtiKyspdGhpcy5nbC50ZXhJbWFnZTJEKHRoaXMuZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK2IsMCxmLlJHQkEsQSxDLDAsZi5SR0JBLGYuVU5TSUdORURfQllURSxudWxsKTtlbHNlIGYudGV4SW1hZ2UyRChnLDAsZi5SR0JBLEEsQywwLGYuUkdCQSxmLlVOU0lHTkVEX0JZVEUsbnVsbCk7cmV0dXJuIGYudGV4UGFyYW1ldGVyaShnLGYuVEVYVFVSRV9NSU5fRklMVEVSLGwpLGYudGV4UGFyYW1ldGVyaShnLGYuVEVYVFVSRV9NQUdfRklMVEVSLGgpLGYudGV4UGFyYW1ldGVyaShnLGYuVEVYVFVSRV9XUkFQX1MsdiksZi50ZXhQYXJhbWV0ZXJpKGcsZi5URVhUVVJFX1dSQVBfVCxUKSxnPT09Zi5URVhUVVJFX0NVQkVfTUFQJiYoeC53aWR0aD14WzBdLndpZHRoLHguaGVpZ2h0PXhbMF0uaGVpZ2h0KSxmLmJpbmRUZXh0dXJlKGcsbnVsbCksTS5faW1nPXh8fHt3aWR0aDpBLGhlaWdodDpDfSxNLmRlbGV0ZT0oKT0+e3RoaXMuZGVsZXRlVGV4dHVyZShNKX0sTX1kZWxldGVUZXh0dXJlKHgpe2NvbnN0IHY9eC5faW1nO3RoaXMuZ2wuZGVsZXRlVGV4dHVyZSh4KSx0eXBlb2Ygdi5jbG9zZT09ImZ1bmN0aW9uIiYmdi5jbG9zZSgpfWFzeW5jIGxvYWRUZXh0dXJlKHgse3VzZUltYWdlQml0bWFwOnY9ITB9PXt9KXtjb25zdCBUPWF3YWl0IHkubG9hZEltYWdlKHgse3VzZUltYWdlQml0bWFwOnZ9KTtyZXR1cm4gdGhpcy5jcmVhdGVUZXh0dXJlKFQpfWNyZWF0ZUZCTyh7Y29sb3I6eD0xLGJsZW5kOnY9ITEsZGVwdGg6VD10aGlzLm9wdGlvbnMuZGVwdGghPT0hMSxzdGVuY2lsOmw9ISF0aGlzLm9wdGlvbnMuc3RlbmNpbH09e30pe2NvbnN0IGg9dGhpcy5nbCxmPWguY3JlYXRlRnJhbWVidWZmZXIoKTtoLmJpbmRGcmFtZWJ1ZmZlcihoLkZSQU1FQlVGRkVSLGYpO2NvbnN0IGc9W107Zm9yKGxldCBDPTA7Qzx4O0MrKyl7Y29uc3QgYj10aGlzLmNyZWF0ZVRleHR1cmUoKTtoLmZyYW1lYnVmZmVyVGV4dHVyZTJEKGguRlJBTUVCVUZGRVIsaC5DT0xPUl9BVFRBQ0hNRU5UMCtDLGguVEVYVFVSRV8yRCxiLDApLGcucHVzaChiKX1mLnRleHR1cmVzPWcsZi50ZXh0dXJlPWdbMF0sZi5ibGVuZD12O2NvbnN0e3dpZHRoOk0saGVpZ2h0OkF9PXRoaXMuY2FudmFzO3JldHVybiBUJiYhbCYmKGYuZGVwdGhCdWZmZXI9aC5jcmVhdGVSZW5kZXJidWZmZXIoKSxoLmJpbmRSZW5kZXJidWZmZXIoaC5SRU5ERVJCVUZGRVIsZi5kZXB0aEJ1ZmZlciksaC5yZW5kZXJidWZmZXJTdG9yYWdlKGguUkVOREVSQlVGRkVSLGguREVQVEhfQ09NUE9ORU5UMTYsTSxBKSxoLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKGguRlJBTUVCVUZGRVIsaC5ERVBUSF9BVFRBQ0hNRU5ULGguUkVOREVSQlVGRkVSLGYuZGVwdGhCdWZmZXIpKSxsJiYhVCYmKGYuc3RlbmNpbEJ1ZmZlcj1oLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLGguYmluZFJlbmRlcmJ1ZmZlcihoLlJFTkRFUkJVRkZFUixmLnN0ZW5jaWxCdWZmZXIpLGgucmVuZGVyYnVmZmVyU3RvcmFnZShoLlJFTkRFUkJVRkZFUixoLlNURU5DSUxfSU5ERVg4LE0sQSksaC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihoLkZSQU1FQlVGRkVSLGguU1RFTkNJTF9BVFRBQ0hNRU5ULGguUkVOREVSQlVGRkVSLGYuc3RlbmNpbEJ1ZmZlcikpLFQmJmwmJihmLmRlcHRoU3RlbmNpbEJ1ZmZlcj1oLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLGguYmluZFJlbmRlcmJ1ZmZlcihoLlJFTkRFUkJVRkZFUixmLmRlcHRoU3RlbmNpbEJ1ZmZlciksaC5yZW5kZXJidWZmZXJTdG9yYWdlKGguUkVOREVSQlVGRkVSLGguREVQVEhfU1RFTkNJTCxNLEEpLGguZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoaC5GUkFNRUJVRkZFUixoLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCxoLlJFTkRFUkJVRkZFUixmLmRlcHRoU3RlbmNpbEJ1ZmZlcikpLGguYmluZEZyYW1lYnVmZmVyKGguRlJBTUVCVUZGRVIsbnVsbCksZn1iaW5kRkJPKHg9bnVsbCl7dGhpcy5mYm89eH1yZW5kZXIoe2NsZWFyQnVmZmVyOng9ITB9PXt9KXt0aGlzLnN0YXJ0UmVuZGVyPSEwO2NvbnN0IHY9dGhpcy5nbDtsZXQgVD10aGlzLnByb2dyYW07VHx8KFQ9dGhpcy5jcmVhdGVQcm9ncmFtKCksdGhpcy51c2VQcm9ncmFtKFQpKSx0aGlzLmZibyYmdi5iaW5kRnJhbWVidWZmZXIodi5GUkFNRUJVRkZFUix0aGlzLmZibyk7Y29uc3QgbD10aGlzLm9wdGlvbnMuZGVwdGg7bCYmdi5lbmFibGUodi5ERVBUSF9URVNUKSx0aGlzLmdsLmNsZWFyKHRoaXMuZ2wuQ09MT1JfQlVGRkVSX0JJVHwobD90aGlzLmdsLkRFUFRIX0JVRkZFUl9CSVQ6MCl8KHRoaXMub3B0aW9ucy5zdGVuY2lsP3RoaXMuZ2wuU1RFTkNJTF9CVUZGRVJfQklUOjApKTtjb25zdCBoPXRoaXMuX3JlbmRlckZyYW1lSUQ7dGhpcy5fZHJhdygpLHRoaXMuZmJvJiZ2LmJpbmRGcmFtZWJ1ZmZlcih2LkZSQU1FQlVGRkVSLG51bGwpLHRoaXMuX3JlbmRlckZyYW1lSUQ9PT1oJiYodGhpcy5fcmVuZGVyRnJhbWVJRD1udWxsKX11cGRhdGUoKXt0aGlzLnN0YXJ0UmVuZGVyJiZ0aGlzLl9yZW5kZXJGcmFtZUlEPT1udWxsJiYodGhpcy5fcmVuZGVyRnJhbWVJRD1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5yZW5kZXIuYmluZCh0aGlzKSkpfX1pKHksImRlZmF1bHRPcHRpb25zIix7cHJlc2VydmVEcmF3aW5nQnVmZmVyOiEwLGF1dG9VcGRhdGU6ITAsdmVydGV4UG9zaXRpb246ImFfdmVydGV4UG9zaXRpb24iLHZlcnRleFRleHR1cmVDb29yZDoiYV92ZXJ0ZXhUZXh0dXJlQ29vcmQiLHdlYmdsMjohMX0pLGkoeSwiVUJZVEUiLHkuVU5TSUdORURfQllURSksaSh5LCJVU0hPUlQiLHkuVU5TSUdORURfU0hPUlQpLGkoeSwiZmV0Y2hTaGFkZXIiLGUuZmV0Y2hTaGFkZXIpLGkoeSwibG9hZEltYWdlIixlLmxvYWRJbWFnZSl9LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsInNldHVwV2ViR0wiLGZ1bmN0aW9uKCl7cmV0dXJuIG59KSx0LmQociwiY3JlYXRlUHJvZ3JhbSIsZnVuY3Rpb24oKXtyZXR1cm4gYX0pLHQuZChyLCJwb2ludHNUb0J1ZmZlciIsZnVuY3Rpb24oKXtyZXR1cm4gc30pLHQuZChyLCJsb2FkSW1hZ2UiLGZ1bmN0aW9uKCl7cmV0dXJuIG99KSx0LmQociwiZmV0Y2hTaGFkZXIiLGZ1bmN0aW9uKCl7cmV0dXJuIG19KSx0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7ZnVuY3Rpb24gZSh1LHApe2NvbnN0IHk9WyJ3ZWJnbCIsImV4cGVyaW1lbnRhbC13ZWJnbCIsIndlYmtpdC0zZCIsIm1vei13ZWJnbCJdO2xldCBPPW51bGw7Zm9yKGxldCB4PTA7eDx5Lmxlbmd0aDsrK3gpe3RyeXtPPXUuZ2V0Q29udGV4dCh5W3hdLHApfWNhdGNoe31pZihPKWJyZWFrfXJldHVybiBPfWZ1bmN0aW9uIG4odSxwKXtjb25zdCB5PWUodSxwKTtpZigheSl0aHJvdyBuZXcgRXJyb3IoIlNvcnJ5LCB5b3VyIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IFdlYkdMLiIpO3JldHVybiB5fWZ1bmN0aW9uIGEodSxwLHkpe2NvbnN0IE89dS5jcmVhdGVTaGFkZXIodS5WRVJURVhfU0hBREVSKTtpZih1LnNoYWRlclNvdXJjZShPLHApLHUuY29tcGlsZVNoYWRlcihPKSwhdS5nZXRTaGFkZXJQYXJhbWV0ZXIoTyx1LkNPTVBJTEVfU1RBVFVTKSl7Y29uc3QgVD1gVmVydGV4IHNoYWRlciBmYWlsZWQgdG8gY29tcGlsZS4gIFRoZSBlcnJvciBsb2cgaXM6JHt1LmdldFNoYWRlckluZm9Mb2coTyl9YDt0aHJvdyBuZXcgRXJyb3IoVCl9Y29uc3QgeD11LmNyZWF0ZVNoYWRlcih1LkZSQUdNRU5UX1NIQURFUik7aWYodS5zaGFkZXJTb3VyY2UoeCx5KSx1LmNvbXBpbGVTaGFkZXIoeCksIXUuZ2V0U2hhZGVyUGFyYW1ldGVyKHgsdS5DT01QSUxFX1NUQVRVUykpe2NvbnN0IFQ9YEZyYWdtZW50IHNoYWRlciBmYWlsZWQgdG8gY29tcGlsZS4gIFRoZSBlcnJvciBsb2cgaXM6JHt1LmdldFNoYWRlckluZm9Mb2coeCl9YDt0aHJvdyBuZXcgRXJyb3IoVCl9Y29uc3Qgdj11LmNyZWF0ZVByb2dyYW0oKTtpZih1LmF0dGFjaFNoYWRlcih2LE8pLHUuYXR0YWNoU2hhZGVyKHYseCksdS5saW5rUHJvZ3JhbSh2KSwhdS5nZXRQcm9ncmFtUGFyYW1ldGVyKHYsdS5MSU5LX1NUQVRVUykpe2NvbnN0IFQ9YFNoYWRlciBwcm9ncmFtIGZhaWxlZCB0byBsaW5rLiAgVGhlIGVycm9yIGxvZyBpczoke3UuZ2V0UHJvZ3JhbUluZm9Mb2codil9YDt0aHJvdyBuZXcgRXJyb3IoVCl9cmV0dXJuIHUuZGVsZXRlU2hhZGVyKE8pLHUuZGVsZXRlU2hhZGVyKHgpLHZ9ZnVuY3Rpb24gcyh1LHA9RmxvYXQzMkFycmF5LHk9bnVsbCl7aWYoeSYmISh5IGluc3RhbmNlb2YgcCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiV3JvbmcgYnVmZmVyIHR5cGUuIik7aWYodT09bnVsbHx8dSBpbnN0YW5jZW9mIHApcmV0dXJuIHU7aWYodVswXT09bnVsbHx8dVswXS5sZW5ndGg9PW51bGwpcmV0dXJuIHk/KHkuc2V0KHUsMCkseSk6bmV3IHAodSk7Y29uc3QgTz11WzBdLmxlbmd0aCx4PXUubGVuZ3RoO3l8fCh5PW5ldyBwKE8qeCkpO2xldCB2PTA7Zm9yKGxldCBUPTA7VDx4O1QrKylmb3IobGV0IGw9MDtsPE87bCsrKXlbdisrXT11W1RdW2xdO3JldHVybiB5fWNvbnN0IGk9e307ZnVuY3Rpb24gbyh1LHt1c2VJbWFnZUJpdG1hcDpwPSEwLGFsaWFzOnk9bnVsbH09e30pe2lmKCFpW3VdKXtpZih0eXBlb2YgSW1hZ2U9PSJmdW5jdGlvbiIpe2NvbnN0IE89bmV3IEltYWdlO3R5cGVvZiB1PT0ic3RyaW5nIiYmISh0eXBlb2YgbG9jYXRpb249PSJvYmplY3QiJiYvXmZpbGU6Ly50ZXN0KGxvY2F0aW9uLmhyZWYpKSYmIS9eZGF0YTovLnRlc3QodSkmJihPLmNyb3NzT3JpZ2luPSJhbm9ueW1vdXMiKSxpW3VdPW5ldyBQcm9taXNlKHg9PntPLm9ubG9hZD1mdW5jdGlvbigpe3AmJnR5cGVvZiBjcmVhdGVJbWFnZUJpdG1hcD09ImZ1bmN0aW9uIj9jcmVhdGVJbWFnZUJpdG1hcChPLHtpbWFnZU9yaWVudGF0aW9uOiJmbGlwWSJ9KS50aGVuKHY9PntpW3VdPXYseSYmKGlbeV09dikseCh2KX0pOihpW3VdPU8seSYmKGlbeV09TykseChPKSl9LE8uc3JjPXV9KSx5JiYoaVt5XT1pW3VdKX1lbHNlIGlmKHR5cGVvZiBmZXRjaD09ImZ1bmN0aW9uIilyZXR1cm4gZmV0Y2godSx7bWV0aG9kOiJHRVQiLG1vZGU6ImNvcnMiLGNhY2hlOiJkZWZhdWx0In0pLnRoZW4oTz0+Ty5ibG9iKCkpLnRoZW4oTz0+Y3JlYXRlSW1hZ2VCaXRtYXAoTyx7aW1hZ2VPcmllbnRhdGlvbjoiZmxpcFkifSkudGhlbih4PT4oaVt1XT14LHkmJihpW3ldPXgpLHgpKSl9cmV0dXJuIGlbdV19Y29uc3QgYz17fTthc3luYyBmdW5jdGlvbiBtKHUpe2lmKGNbdV0pcmV0dXJuIGNbdV07Y29uc3QgcD1hd2FpdCBmZXRjaCh1KTtpZihwLnN0YXR1cz49MjAwJiZwLnN0YXR1czwzMDApe2NvbnN0IHk9YXdhaXQgcC50ZXh0KCk7cmV0dXJuIGNbdV09eSx5fXRocm93IG5ldyBFcnJvcigiU2hhZGVyIGxvYWRlZCBlcnJvci4iKX19LGZ1bmN0aW9uKGQscix0KXt0LnIociksci5kZWZhdWx0PWBhdHRyaWJ1dGUgdmVjMyBhX3ZlcnRleFBvc2l0aW9uOwoKdm9pZCBtYWluKCkgewogIGdsX1BvaW50U2l6ZSA9IDEuMDsKICBnbF9Qb3NpdGlvbiA9IHZlYzQoYV92ZXJ0ZXhQb3NpdGlvbiwgMSk7Cn1gfSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHIuZGVmYXVsdD1gI2lmZGVmIEdMX0VTCnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwojZW5kaWYKCnZvaWQgbWFpbigpIHsKICBnbF9GcmFnQ29sb3IgPSB2ZWM0KDAuMCwgMC4wLCAwLjAsIDAuMSk7Cn1gfSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHIuZGVmYXVsdD1gYXR0cmlidXRlIHZlYzQgYV92ZXJ0ZXhQb3NpdGlvbjsKYXR0cmlidXRlIHZlYzIgYV92ZXJ0ZXhUZXh0dXJlQ29vcmQ7CnZhcnlpbmcgdmVjMiB2VGV4dHVyZUNvb3JkOwoKdm9pZCBtYWluKCkgewogIGdsX1BvaW50U2l6ZSA9IDEuMDsKICBnbF9Qb3NpdGlvbiA9IGFfdmVydGV4UG9zaXRpb247CiAgdlRleHR1cmVDb29yZCA9IGFfdmVydGV4VGV4dHVyZUNvb3JkOwp9YH0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gc30pO3ZhciBlPXQoMjEpLG49dCgyNSk7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2NvbnN0IGE9U3ltYm9sKCJ0cmFuc2Zvcm0iKTtjbGFzcyBze2NvbnN0cnVjdG9yKG8sYyl7dGhpcy5jb250ZXh0PW8uZ2V0Q29udGV4dCgiMmQiKSx0aGlzLm9wdGlvbnM9Yyx0aGlzW2FdPVsxLDAsMCwxLDAsMF19Y3JlYXRlVGV4dHVyZShvKXtyZXR1cm57X2ltZzpvfX1hc3luYyBsb2FkVGV4dHVyZShvKXtjb25zdCBjPWF3YWl0IGUuZGVmYXVsdC5sb2FkSW1hZ2Uobyx7dXNlSW1hZ2VCaXRtYXA6ITF9KTtyZXR1cm4gdGhpcy5jcmVhdGVUZXh0dXJlKGMpfWRlbGV0ZVRleHR1cmUobyl7cmV0dXJuIG99Y2xlYXIobyxjLG0sdSl7Y29uc3QgcD10aGlzLmNvbnRleHQ7bz1vfHwwLGM9Y3x8MCxtPW18fHAuY2FudmFzLndpZHRoLW8sdT11fHxwLmNhbnZhcy5oZWlnaHQtYyxwLmNsZWFyUmVjdChvLGMsbSx1KX1kcmF3TWVzaENsb3VkKG8se2NsZWFyOmM9ITF9PXt9KXtjb25zdCBtPVtdO2ZvcihsZXQgdT0wO3U8by5hbW91bnQ7dSsrKXtjb25zdCBwPW8uZ2V0VHJhbnNmb3JtKHUpO2xldCB5PW8uZ2V0VGV4dHVyZUZyYW1lKHUpO3kmJih5PXkuX2ltZyk7Y29uc3QgTz1vLmdldEZpbHRlcih1KSx7ZmlsbDp4LHN0cm9rZTp2fT1vLmdldENsb3VkUkdCQSh1KTttLnB1c2goe21lc2g6by5tZXNoLF9jbG91ZE9wdGlvbnM6W3gsdix5LHAsT119KX1vLmJlZm9yZVJlbmRlciYmby5iZWZvcmVSZW5kZXIodGhpcy5jb250ZXh0LG8pLHRoaXMuZHJhd01lc2hlcyhtLHtjbGVhcjpjLGhvb2s6ITF9KSxvLmFmdGVyUmVuZGVyJiZvLmFmdGVyUmVuZGVyKHRoaXMuY29udGV4dCxvKX1kcmF3TWVzaGVzKG8se2NsZWFyOmM9ITEsaG9vazptPSEwfT17fSl7Y29uc3QgdT10aGlzLmNvbnRleHQ7YyYmdS5jbGVhclJlY3QoMCwwLHUuY2FudmFzLndpZHRoLHUuY2FudmFzLmhlaWdodCk7bGV0IHA9bnVsbDtjb25zdHt3aWR0aDp5LGhlaWdodDpPfT11LmNhbnZhcyx4PW8ubGVuZ3RoO28uZm9yRWFjaCgodixUKT0+e2xldCBsLGgsZixnLE07bSYmdi5iZWZvcmVSZW5kZXImJnYuYmVmb3JlUmVuZGVyKHUsdiksdi5fY2xvdWRPcHRpb25zJiYoW2wsaCxmLGcsTV09di5fY2xvdWRPcHRpb25zLHY9di5tZXNoKTtsZXQgQT12LmZpbHRlcjtpZihNJiYoQT1BP2Ake0F9ICR7TX1gOk0pLEEmJiF0aGlzLmZpbHRlckJ1ZmZlciYmdGhpcy5maWx0ZXJCdWZmZXIhPT0hMSl7Y29uc3QgQz1lLmRlZmF1bHQuY3JlYXRlQ2FudmFzKHksTyk7Qz90aGlzLmZpbHRlckJ1ZmZlcj1DLmdldENvbnRleHQoIjJkIik6dGhpcy5maWx0ZXJCdWZmZXI9ITF9cCYmcCE9PUEmJihPYmplY3Qobi5hcHBseUZpbHRlcikodGhpcy5maWx0ZXJCdWZmZXIscCksdS5kcmF3SW1hZ2UodGhpcy5maWx0ZXJCdWZmZXIuY2FudmFzLDAsMCx5LE8pLHRoaXMuZmlsdGVyQnVmZmVyLmNsZWFyUmVjdCgwLDAseSxPKSxwPW51bGwpLEEmJnRoaXMuZmlsdGVyQnVmZmVyPyh0aGlzLmZpbHRlckJ1ZmZlci5zYXZlKCksdGhpcy5maWx0ZXJCdWZmZXIudHJhbnNmb3JtKC4uLnRoaXNbYV0pLE9iamVjdChuLmRyYXdNZXNoMkQpKHYsdGhpcy5maWx0ZXJCdWZmZXIsITEsbCxoLGYsZyksdGhpcy5maWx0ZXJCdWZmZXIucmVzdG9yZSgpLFQ9PT14LTE/KE9iamVjdChuLmFwcGx5RmlsdGVyKSh0aGlzLmZpbHRlckJ1ZmZlcixBKSx1LmRyYXdJbWFnZSh0aGlzLmZpbHRlckJ1ZmZlci5jYW52YXMsMCwwLHksTyksdGhpcy5maWx0ZXJCdWZmZXIuY2xlYXJSZWN0KDAsMCx5LE8pKTpwPUEpOih1LnNhdmUoKSx1LnRyYW5zZm9ybSguLi50aGlzW2FdKSxPYmplY3Qobi5kcmF3TWVzaDJEKSh2LHUsITEsbCxoLGYsZyksdS5yZXN0b3JlKCkpLG0mJnYuYWZ0ZXJSZW5kZXImJnYuYWZ0ZXJSZW5kZXIodSx2KX0pfXNldFRyYW5zZm9ybShvKXt0aGlzW2FdPW99fX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSwoZnVuY3Rpb24oZSl7dmFyIG49dCgxNCksYT10KDIzKSxzPXQoMjQpO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtjb25zdCBpPXt9O2Z1bmN0aW9uIG8oeSxPKXtjb25zdHtzdHlsZTp4LHZhcmlhbnQ6dix3ZWlnaHQ6VCxzdHJldGNoOmwsc2l6ZTpoLHB4TGluZUhlaWdodDpmLGZhbWlseTpnfT15O3JldHVybiBsPT09Im5vcm1hbCI/YCR7eH0gJHt2fSAke1R9ICR7aCpPfXB4LyR7ZipPfXB4ICR7Z31gOmAke3h9ICR7dn0gJHtUfSAke2x9ICR7aCpPfXB4LyR7ZipPfXB4ICR7Z31gfWZ1bmN0aW9uIGMoeSx7Zm9udDpPLGZpbGxDb2xvcjp4LHN0cm9rZUNvbG9yOnYsc3Ryb2tlV2lkdGg6VCxyYXRpbzpsPTEsdGV4dENhbnZhczpoLGNhY2hhYmxlOmY9ITF9KXtsZXQgZztpZihmKXtnPVt5LE8sU3RyaW5nKHgpLFN0cmluZyh2KSxTdHJpbmcoVCldLmpvaW4oIiMjIyIpO2NvbnN0IHo9aVtnXTtpZih6KXJldHVybiB6fWh8fChoPXUoMSwxKSk7Y29uc3QgTT1oLmdldENvbnRleHQoIjJkIik7TS5zYXZlKCksTS5mb250PU87bGV0e3dpZHRoOkF9PU0ubWVhc3VyZVRleHQoeSk7TS5yZXN0b3JlKCk7Y29uc3QgQz1PYmplY3QoYS5kZWZhdWx0KShPKSxiPU1hdGgubWF4KEMucHhMaW5lSGVpZ2h0LEMucHhIZWlnaHQqMS4xMyk7L2l0YWxpY3xvYmxpcXVlLy50ZXN0KE8pJiYoQSs9YipNYXRoLnRhbigxNSpNYXRoLlBJLzE4MCkpLCF4JiYhdiYmKHg9IiMwMDAiKTtjb25zdCBFPU0uY2FudmFzLEw9TWF0aC5jZWlsKEEpLEQ9TWF0aC5jZWlsKGIpO0Uud2lkdGg9TWF0aC5yb3VuZChMKmwpLEUuaGVpZ2h0PU1hdGgucm91bmQoRCpsKSxNLnNhdmUoKSxNLmZvbnQ9byhDLGwpLE0udGV4dEFsaWduPSJjZW50ZXIiLE0udGV4dEJhc2VsaW5lPSJtaWRkbGUiO2NvbnN0IEk9RS5oZWlnaHQqLjUrQy5weEhlaWdodCouMDUqbCxSPUUud2lkdGgqLjU7aWYoeCl7aWYoQXJyYXkuaXNBcnJheSh4KSl4PU9iamVjdChzLmRlZmF1bHQpKHgpO2Vsc2UgaWYoeC52ZWN0b3Ipe2xldCB6O2NvbnN0e3ZlY3RvcjpLLGNvbG9yczpRfT14O0subGVuZ3RoPT09Nj96PU0uY3JlYXRlUmFkaWFsR3JhZGllbnQoLi4uSyk6ej1NLmNyZWF0ZUxpbmVhckdyYWRpZW50KC4uLkspLFEuZm9yRWFjaCgoe29mZnNldDpfLGNvbG9yOmp9KT0+e3ouYWRkQ29sb3JTdG9wKF8sail9KSx4PXp9TS5maWxsU3R5bGU9eCxNLmZpbGxUZXh0KHksUixJKX1pZih2KXtpZihNLmxpbmVXaWR0aD1UKmwsQXJyYXkuaXNBcnJheSh2KSl2PU9iamVjdChzLmRlZmF1bHQpKHYpO2Vsc2UgaWYodi52ZWN0b3Ipe2xldCB6O2NvbnN0e3ZlY3RvcjpLLGNvbG9yczpRfT12O0subGVuZ3RoPT09Nj96PU0uY3JlYXRlUmFkaWFsR3JhZGllbnQoLi4uSyk6ej1NLmNyZWF0ZUxpbmVhckdyYWRpZW50KC4uLkspLFEuZm9yRWFjaCgoe29mZnNldDpfLGNvbG9yOmp9KT0+e3ouYWRkQ29sb3JTdG9wKF8sail9KSx2PXp9TS5zdHJva2VTdHlsZT12LE0uc3Ryb2tlVGV4dCh5LFIsSSl9TS5yZXN0b3JlKCk7Y29uc3QgQj17aW1hZ2U6aCxyZWN0OlswLDAsTCxEXX07cmV0dXJuIGYmJihpW2ddPUIpLEJ9bGV0IG09ITE7aWYodHlwZW9mIG5hdmlnYXRvcj09Im9iamVjdCImJnR5cGVvZiBuYXZpZ2F0b3IudXNlckFnZW50PT0ic3RyaW5nIil7Y29uc3QgeT1uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2Nocm9tZVwvKFxkKykvKTt5JiYobT1OdW1iZXIoeVsxXSk8NzApfWZ1bmN0aW9uIHUoeSxPLHg9e30pe2NvbnN0IHY9eC5vZmZzY3JlZW58fCFtJiZ4Lm9mZnNjcmVlbiE9PSExO2xldCBUO3JldHVybiB0eXBlb2YgZTwidSImJnR5cGVvZiBlLmNyZWF0ZUNhbnZhcz09ImZ1bmN0aW9uIj9UPWUuY3JlYXRlQ2FudmFzKHksTyx4KTp2JiZ0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzPT0iZnVuY3Rpb24iP1Q9bmV3IE9mZnNjcmVlbkNhbnZhcyh5LE8pOihUPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLFQud2lkdGg9eSxULmhlaWdodD1PKSxUfWNvbnN0IHA9e2NyZWF0ZUNhbnZhczp1LGNyZWF0ZVRleHQ6Yyxsb2FkSW1hZ2U6bi5kZWZhdWx0LmxvYWRJbWFnZX07ci5kZWZhdWx0PXB9KS5jYWxsKHRoaXMsdCgyMikpfSxmdW5jdGlvbihkLHIpe3ZhciB0O3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30oKTt0cnl7dD10fHxuZXcgRnVuY3Rpb24oInJldHVybiB0aGlzIikoKX1jYXRjaHt0eXBlb2Ygd2luZG93PT0ib2JqZWN0IiYmKHQ9d2luZG93KX1kLmV4cG9ydHM9dH0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4geH0pLHQoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtmdW5jdGlvbiBlKHYsVCl7aWYodHlwZW9mIHY9PSJzdHJpbmciKXtjb25zdCBmPXYudHJpbSgpLm1hdGNoKC9eKFtcZC5dKykocHh8cHR8cGN8aW58Y218bW18ZW18ZXh8cmVtfHF8dnd8dmh8dm1heHx2bWlufCUpJC8pO2Y/dj17c2l6ZTpwYXJzZUZsb2F0KGZbMV0pLHVuaXQ6ZlsyXX06dj17c2l6ZTpwYXJzZUludCh2LDEwKSx1bml0OiJweCJ9fWxldHtzaXplOmwsdW5pdDpofT12O2lmKGg9PT0icHQiKWwvPS43NTtlbHNlIGlmKGg9PT0icGMiKWwqPTE2O2Vsc2UgaWYoaD09PSJpbiIpbCo9OTY7ZWxzZSBpZihoPT09ImNtIilsKj05Ni8yLjU0O2Vsc2UgaWYoaD09PSJtbSIpbCo9OTYvMjUuNDtlbHNlIGlmKGg9PT0iZW0ifHxoPT09InJlbSJ8fGg9PT0iZXgiKXtpZighVCYmdHlwZW9mIGdldENvbXB1dGVkU3R5bGU9PSJmdW5jdGlvbiImJnR5cGVvZiBkb2N1bWVudDwidSIpe2NvbnN0IGY9Z2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmZvbnRTaXplO1Q9ZShmLDE2KX1sKj1ULGg9PT0iZXgiJiYobC89Mil9ZWxzZSBpZihoPT09InEiKWwqPTk2LzI1LjQvNDtlbHNlIGlmKGg9PT0idncifHxoPT09InZoIil7aWYodHlwZW9mIGRvY3VtZW50PCJ1Iil7Y29uc3QgZj1oPT09InZ3Ij9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg6ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDtsKj1mLzEwMH19ZWxzZSBpZigoaD09PSJ2bWF4Inx8aD09PSJ2bWluIikmJnR5cGVvZiBkb2N1bWVudDwidSIpe2NvbnN0IGY9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLGc9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDtoPT09InZtYXgiP2wqPU1hdGgubWF4KGYsZykvMTAwOmwqPU1hdGgubWluKGYsZykvMTAwfXJldHVybiBsfWNvbnN0IG49ImJvbGR8Ym9sZGVyfGxpZ2h0ZXJ8WzEtOV0wMCIsYT0iaXRhbGljfG9ibGlxdWUiLHM9InNtYWxsLWNhcHMiLGk9InVsdHJhLWNvbmRlbnNlZHxleHRyYS1jb25kZW5zZWR8Y29uZGVuc2VkfHNlbWktY29uZGVuc2VkfHNlbWktZXhwYW5kZWR8ZXhwYW5kZWR8ZXh0cmEtZXhwYW5kZWR8dWx0cmEtZXhwYW5kZWQiLG89InB4fHB0fHBjfGlufGNtfG1tfGVtfGV4fHJlbXxxfHZ3fHZofHZtYXh8dm1pbnwlIixjPWAnKFteJ10rKSd8IihbXiJdKykifChbXFx3LV18W+S4gC3pvqVdKStgLG09bmV3IFJlZ0V4cChgKCR7bn0pICtgLCJpIiksdT1uZXcgUmVnRXhwKGAoJHthfSkgK2AsImkiKSxwPW5ldyBSZWdFeHAoYCgke3N9KSArYCwiaSIpLHk9bmV3IFJlZ0V4cChgKCR7aX0pICtgLCJpIiksTz1uZXcgUmVnRXhwKCIoW1xcZFxcLl0rKSgiK28rIikoPzpcXC8oW1xcZFxcLl0rKSgiK28rIikpPyAqKCg/OiIrYysiKSggKiwgKig/OiIrYysiKSkqKSIpO2Z1bmN0aW9uIHgodixUKXtjb25zdCBsPU8uZXhlYyh2KTtpZighbClyZXR1cm47Y29uc3QgaD1wYXJzZUZsb2F0KGxbM10pLGY9e3dlaWdodDoibm9ybWFsIixzdHlsZToibm9ybWFsIixzdHJldGNoOiJub3JtYWwiLHZhcmlhbnQ6Im5vcm1hbCIsc2l6ZTpwYXJzZUZsb2F0KGxbMV0pLHVuaXQ6bFsyXSxsaW5lSGVpZ2h0Ok51bWJlci5pc0Zpbml0ZShoKT9oOnZvaWQgMCxsaW5lSGVpZ2h0VW5pdDpsWzRdLGZhbWlseTpsWzVdLnJlcGxhY2UoLyAqLCAqL2csIiwiKX0sZz12LnN1YnN0cmluZygwLGwuaW5kZXgpLE09bS5leGVjKGcpLEE9dS5leGVjKGcpLEM9cC5leGVjKGcpLGI9eS5leGVjKGcpO3JldHVybiBNJiYoZi53ZWlnaHQ9TVsxXSksQSYmKGYuc3R5bGU9QVsxXSksQyYmKGYudmFyaWFudD1DWzFdKSxiJiYoZi5zdHJldGNoPWJbMV0pLGYucHhIZWlnaHQ9ZSh7c2l6ZTpmLnNpemUsdW5pdDpmLnVuaXR9LFQpLGYucHhMaW5lSGVpZ2h0PWUoe3NpemU6Zi5saW5lSGVpZ2h0fHxmLnNpemUsdW5pdDpmLmxpbmVIZWlnaHRVbml0fHxmLnVuaXR9LFQpLGZ9fSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJkZWZhdWx0IixmdW5jdGlvbigpe3JldHVybiBlfSksdCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2Z1bmN0aW9uIGUobil7cmV0dXJuYHJnYmEoJHtuLm1hcCgoYSxzKT0+czwzP01hdGgucm91bmQoYSoyNTUpOmEpLmpvaW4oKX0pYH19LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImFwcGx5RmlsdGVyIixmdW5jdGlvbigpe3JldHVybiBpfSksdC5kKHIsImRyYXdNZXNoMkQiLGZ1bmN0aW9uKCl7cmV0dXJuIGN9KTt2YXIgZT10KDEpLG49dCgyNCksYT10KDIzKSxzPXQoMjYpO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtmdW5jdGlvbiBpKG0sdSl7Y29uc3QgcD1tLmNhbnZhczttLnNhdmUoKSxtLmZpbHRlcj11LG0uZHJhd0ltYWdlKHAsMCwwLHAud2lkdGgscC5oZWlnaHQpLG0ucmVzdG9yZSgpfWZ1bmN0aW9uIG8obSx1KXtjb25zdCBwPS9yZ2JhXCgoXGQrKSwoXGQrKSwoXGQrKSwoXGQrKVwpLzttPW0ubWF0Y2gocCkuc2xpY2UoMSw1KS5tYXAoTnVtYmVyKSx1PXUubWF0Y2gocCkuc2xpY2UoMSw1KS5tYXAoTnVtYmVyKTtjb25zdCB5PVtdLE89dVszXTtmb3IobGV0IHg9MDt4PDQ7eCsrKXlbeF09T2JqZWN0KHMubWl4KShtW3hdLHVbeF0sTyk7cmV0dXJuYHJnYmEoJHt5LmpvaW4oKX0pYH1mdW5jdGlvbiBjKG0sdSxwPSEwLHk9bnVsbCxPPW51bGwseD1udWxsLHY9bnVsbCl7dS5zYXZlKCk7bGV0IFQ9ITEsbD0hMTtpZih1Lmdsb2JhbEFscGhhPW0uZ2V0T3BhY2l0eSgpLG0uX3VwZGF0ZU1hdHJpeCYmbS50cmFuc2Zvcm1TY2FsZS9tLmNvbnRvdXJzLnNjYWxlPjEuNSYmbS5hY2N1cmF0ZShtLnRyYW5zZm9ybVNjYWxlKSxtLmxpbmVXaWR0aCl7bGV0IGc9bS5ncmFkaWVudCYmbS5ncmFkaWVudC5zdHJva2U7aWYoZyl7Y29uc3R7dmVjdG9yOk0sY29sb3JzOkF9PWc7aWYoTS5sZW5ndGg9PT02KWc9dS5jcmVhdGVSYWRpYWxHcmFkaWVudCguLi5NKTtlbHNlIGlmKE0ubGVuZ3RoPT09NClnPXUuY3JlYXRlTGluZWFyR3JhZGllbnQoLi4uTSk7ZWxzZSBpZihNLmxlbmd0aD09PTMpZz11LmNyZWF0ZUNpcmN1bGFyR3JhZGllbnQoLi4uTSk7ZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIHZlY3RvciBkaW1lbnNpb24uIik7QS5mb3JFYWNoKCh7b2Zmc2V0OkMsY29sb3I6Yn0pPT57bGV0IEU9T2JqZWN0KG4uZGVmYXVsdCkoYik7TyYmKEU9byhFLE8pKSxnLmFkZENvbG9yU3RvcChDLEUpfSksdS5zdHJva2VTdHlsZT1nLFQ9ITB9ZWxzZSBtLnN0cm9rZVN0eWxlJiYoTz91LnN0cm9rZVN0eWxlPW8obS5zdHJva2VTdHlsZSxPKTp1LnN0cm9rZVN0eWxlPW0uc3Ryb2tlU3R5bGUsVD0hMCl9VCYmKHUubGluZVdpZHRoPW0ubGluZVdpZHRoLHUubGluZUpvaW49bS5saW5lSm9pbix1LmxpbmVDYXA9bS5saW5lQ2FwLHUubWl0ZXJMaW1pdD1tLm1pdGVyTGltaXQsbS5saW5lRGFzaCYmKHUuc2V0TGluZURhc2gobS5saW5lRGFzaCksbS5saW5lRGFzaE9mZnNldCYmKHUubGluZURhc2hPZmZzZXQ9bS5saW5lRGFzaE9mZnNldCkpKTtsZXQgaD1tLmdyYWRpZW50JiZtLmdyYWRpZW50LmZpbGw7aWYoaCl7Y29uc3R7dmVjdG9yOmcsY29sb3JzOk19PWg7aWYoZy5sZW5ndGg9PT02KWg9dS5jcmVhdGVSYWRpYWxHcmFkaWVudCguLi5nKTtlbHNlIGlmKGcubGVuZ3RoPT09NCloPXUuY3JlYXRlTGluZWFyR3JhZGllbnQoLi4uZyk7ZWxzZSBpZihnLmxlbmd0aD09PTMpaD11LmNyZWF0ZUNpcmN1bGFyR3JhZGllbnQoLi4uZyk7ZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIHZlY3RvciBkaW1lbnNpb24uIik7TS5mb3JFYWNoKCh7b2Zmc2V0OkEsY29sb3I6Q30pPT57bGV0IGI9T2JqZWN0KG4uZGVmYXVsdCkoQyk7TyYmKGI9byhiLE8pKSxoLmFkZENvbG9yU3RvcChBLGIpfSksdS5maWxsU3R5bGU9aCxsPSEwfWVsc2UgbS5maWxsU3R5bGUmJih5P3UuZmlsbFN0eWxlPW8obS5maWxsU3R5bGUseSk6dS5maWxsU3R5bGU9bS5maWxsU3R5bGUsbD0hMCk7aWYodiYmdS50cmFuc2Zvcm0oLi4udiksdS50cmFuc2Zvcm0oLi4ubS50cmFuc2Zvcm1NYXRyaXgpLG0uY2xpcFBhdGgpe2NvbnN0IGc9bS5jbGlwUGF0aCxNPW5ldyBQYXRoMkQoZyk7dS5jbGlwKE0pfWNvbnN0IGY9bS5jb250b3Vycy5sZW5ndGg7aWYobS5jb250b3Vycy5mb3JFYWNoKChnLE0pPT57Y29uc3QgQT1nLmxlbmd0aCxDPUE+MSYmZS52ZWMyLmVxdWFscyhnWzBdLGdbQS0xXSksYj1NPT09Zi0xJiZtLnRleHR1cmU7aWYoZyYmQT4wKXtpZihsfHxUfHxiKXt1LmJlZ2luUGF0aCgpLHUubW92ZVRvKC4uLmdbMF0pO2ZvcihsZXQgRT0xO0U8QTtFKyspRT09PUEtMSYmQz91LmNsb3NlUGF0aCgpOnUubGluZVRvKC4uLmdbRV0pfWlmKGwmJnUuZmlsbChtLmZpbGxSdWxlKSxiKXt1LnNhdmUoKSx1LmNsaXAoKTtsZXR7aW1hZ2U6RSxvcHRpb25zOkx9PW0udGV4dHVyZTtpZih4JiYoRT14KSxMLnJlcGVhdCYmY29uc29sZS53YXJuKCJDb250ZXh0IDJEIG5vdCBzdXBwb3J0ZWQgaW1hZ2UgcmVwZWF0IHlldC4iKSxFLmZvbnQpe0wuc2NhbGUmJmNvbnNvbGUud2FybigiQ29udGV4dCAyRCBub3Qgc3VwcG9ydGVkIHRleHQgc2NhbGUgeWV0LiIpLEwuc3JjUmVjdCYmY29uc29sZS53YXJuKCJDb250ZXh0IDJEIG5vdCBzdXBwb3J0ZWQgdGV4dCBzcmNSZWN0IHlldC4iKTtsZXR7Zm9udDpELGZpbGxDb2xvcjpJLHN0cm9rZUNvbG9yOlIsc3Ryb2tlV2lkdGg6Qix0ZXh0Onp9PUU7IUkmJiFSJiYoST0iIzAwMCIpLEFycmF5LmlzQXJyYXkoSSkmJihJPU9iamVjdChuLmRlZmF1bHQpKEkpKSxBcnJheS5pc0FycmF5KFIpJiYoUj1PYmplY3Qobi5kZWZhdWx0KShSKSksdS5mb250PUQ7Y29uc3R7d2lkdGg6S309dS5tZWFzdXJlVGV4dCh6KSxRPU9iamVjdChhLmRlZmF1bHQpKEQpLF89TWF0aC5tYXgoUS5weExpbmVIZWlnaHQsUS5weEhlaWdodCoxLjEzKTt1LnRleHRBbGlnbj0iY2VudGVyIix1LnRleHRCYXNlbGluZT0ibWlkZGxlIjtjb25zdCBqPUwucmVjdCxHPWpbMF0rXyouNStRLnB4SGVpZ2h0Ki4wNixYPWpbMV0rSyouNTtqWzJdIT1udWxsJiZ1LnNjYWxlKGpbMl0vSyxqWzNdL18pLEkmJih1LmZpbGxTdHlsZT1JLHUuZmlsbFRleHQoeixYLEcpKSxSJiYodS5saW5lV2lkdGg9Qix1LnN0cm9rZVN0eWxlPVIsdS5zdHJva2VUZXh0KHosWCxHKSl9ZWxzZXtsZXQgRD1MLnJlY3Q7Y29uc3QgST1MLnNyY1JlY3Q7TC5zY2FsZSYmKEQ9WzAsMCx1LmNhbnZhcy53aWR0aCx1LmNhbnZhcy5oZWlnaHRdKSxMLnJvdGF0ZWQmJkQmJihEPVstRFsxXSxEWzBdLERbM10sRFsyXV0pLEkmJihEPUR8fFswLDAsSVsyXSxJWzNdXSksTC5yb3RhdGVkJiYodS50cmFuc2xhdGUoMCxEP0RbMl06RS53aWR0aCksdS5yb3RhdGUoLS41Kk1hdGguUEkpKSxJP3UuZHJhd0ltYWdlKEUsLi4uSSwuLi5EKTpEP3UuZHJhd0ltYWdlKEUsLi4uRCk6dS5kcmF3SW1hZ2UoRSwwLDApfXUucmVzdG9yZSgpfVQmJnUuc3Ryb2tlKCl9fSksdS5yZXN0b3JlKCkscCl7Y29uc3QgZz1tLmZpbHRlcjtnJiZpKHUsZyl9fX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiY2xhbXAiLGZ1bmN0aW9uKCl7cmV0dXJuIGV9KSx0LmQociwibWl4IixmdW5jdGlvbigpe3JldHVybiBufSksdC5kKHIsInRyYW5zZm9ybVBvaW50IixmdW5jdGlvbigpe3JldHVybiBhfSksdCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2Z1bmN0aW9uIGUocyxpLG8pe3JldHVybiBpPm8mJihbaSxvXT1bbyxpXSksczxpP2k6cz5vP286c31mdW5jdGlvbiBuKHMsaSxvKXtyZXR1cm4gcyooMS1vKStpKm99ZnVuY3Rpb24gYShzLGkpe2NvbnN0W28sY109cztyZXR1cm5bbyppWzBdK2MqaVsyXStpWzRdLG8qaVsxXStjKmlbM10raVs1XV19fSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJkZWZhdWx0IixmdW5jdGlvbigpe3JldHVybiBvfSk7dmFyIGU9dCgyOCksbj10KDI5KTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7ZnVuY3Rpb24gYShjLG0sdSl7Y29uc3QgcD1jLnVuaWZvcm1zfHx7fSx5PW0udW5pZm9ybXN8fHt9O2lmKHAudV90ZXhTYW1wbGVyJiZ5LnVfdGV4U2FtcGxlciYmcC51X3RleFNhbXBsZXIhPT15LnVfdGV4U2FtcGxlcilyZXR1cm4hMTtjb25zdCBPPU9iamVjdC5rZXlzKHApLHg9T2JqZWN0LmtleXMoeSksdj1PLmluZGV4T2YoInVfdGV4U2FtcGxlciIpLFQ9eC5pbmRleE9mKCJ1X3RleFNhbXBsZXIiKTtpZih2Pj0wJiZPLnNwbGljZSh2LDEpLFQ+PTAmJnguc3BsaWNlKFQsMSksTy5sZW5ndGghPT14Lmxlbmd0aClyZXR1cm4hMTtjb25zdCBsPU8uZXZlcnkoaD0+e2NvbnN0IGY9cFtoXSxnPXlbaF07aWYoZj09PWcpcmV0dXJuITA7aWYoZi5sZW5ndGgmJmcubGVuZ3RoJiZmLmxlbmd0aD09PWcubGVuZ3RoKXtmb3IobGV0IE09MDtNPGYubGVuZ3RoO00rKylpZihmW01dIT09Z1tNXSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX0pO2lmKGwpe2lmKHAudV90ZXhTYW1wbGVyJiYheS51X3RleFNhbXBsZXIpbS5zZXRUZXh0dXJlKHAudV90ZXhTYW1wbGVyLHtoaWRkZW46ITB9KTtlbHNlIGlmKCFwLnVfdGV4U2FtcGxlciYmeS51X3RleFNhbXBsZXIpZm9yKGxldCBoPTA7aDx1Lmxlbmd0aDtoKyspdVtoXS5zZXRUZXh0dXJlKHkudV90ZXhTYW1wbGVyLHtoaWRkZW46ITB9KX1yZXR1cm4gbH1jb25zdCBzPXt9O2Z1bmN0aW9uIGkoYyxtKXtpZihjLmxlbmd0aCl7Y29uc3QgdT1PYmplY3QoZS5kZWZhdWx0KShjLHMpO3JldHVybiB1LmVuYWJsZUJsZW5kPW0sY1swXS5maWx0ZXJDYW52YXMmJih1LmZpbHRlckNhbnZhcz0hMCksdS5wYWNrSW5kZXg9Y1swXS5wYWNrSW5kZXgsdS5wYWNrTGVuZ3RoPWMubGVuZ3RoLHUuYmVmb3JlUmVuZGVyPWNbMF0uYmVmb3JlUmVuZGVyLHUucGFzcz1jWzBdLnBhc3MsdS5hZnRlclJlbmRlcj1jW2MubGVuZ3RoLTFdLmFmdGVyUmVuZGVyLGMubGVuZ3RoPTAsdX19ZnVuY3Rpb24qbyhjLG0sdT0hMSl7Y29uc3QgcD1bXSx5PWMub3B0aW9ucy5idWZmZXJTaXplO2xldCBPPTAseD0hMTtmb3IobGV0IHY9MDt2PG0ubGVuZ3RoO3YrKyl7Y29uc3QgVD1tW3ZdO2lmKFQgaW5zdGFuY2VvZiBuLmRlZmF1bHQpcC5sZW5ndGgmJih5aWVsZCBpKHAseCkpLE89MCx4PSExLHlpZWxkIFQ7ZWxzZXtjb25zdCBsPVQubWVzaERhdGE7aWYobC5jbGlwUGF0aCYmIWwudW5pZm9ybXMudV9jbGlwU2FtcGxlcil7Y29uc3QgZj1jLmNyZWF0ZVRleHR1cmUobC5jbGlwUGF0aCk7bC51bmlmb3Jtcy51X2NsaXBTYW1wbGVyPWZ9bGV0IGg9MDtpZigoIXV8fCFULmNhbklnbm9yZSgpKSYmbCYmbC5wb3NpdGlvbnMubGVuZ3RoKXtULnBhY2tJbmRleD12O2NvbnN0IGY9VC5maWx0ZXJDYW52YXM7aWYoaD1sLnBvc2l0aW9ucy5sZW5ndGgsZnx8TytoPnkpcC5sZW5ndGgmJih5aWVsZCBpKHAseCkpLE89MCx4PSExO2Vsc2UgaWYoTyl7Y29uc3QgZz1wW3AubGVuZ3RoLTFdO2cmJihnLmZpbHRlckNhbnZhc3x8Zy5hZnRlclJlbmRlcnx8VC5iZWZvcmVSZW5kZXJ8fGcucGFzcy5sZW5ndGh8fFQucGFzcy5sZW5ndGh8fGcucHJvZ3JhbSE9PVQucHJvZ3JhbXx8IWEoZyxULHApKSYmKHlpZWxkIGkocCx4KSxPPTAseD0hMSl9cC5wdXNoKFQpLHg9eHx8VC5lbmFibGVCbGVuZCxPKz1ofXY9PT1tLmxlbmd0aC0xJiZwLmxlbmd0aCYmKHlpZWxkIGkocCx4KSl9fX19LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImRlZmF1bHQiLGZ1bmN0aW9uKCl7cmV0dXJuIGF9KSx0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7Y29uc3QgZT17VU5TSUdORURfQllURTpVaW50OEFycmF5LFVOU0lHTkVEX1NIT1JUOlVpbnQxNkFycmF5LEJZVEU6SW50OEFycmF5LFNIT1JUOkludDE2QXJyYXksRkxPQVQ6RmxvYXQzMkFycmF5fTtmdW5jdGlvbiBuKHMsaSl7bGV0IG89MCxjPTAsbT0wLHU9MCxwPTAseT0wLE89MDtjb25zdCB4PXNbMF0ucHJvZ3JhbTtmb3IobGV0IHY9MDt2PHMubGVuZ3RoO3YrKyl7Y29uc3QgVD1zW3ZdLm1lc2hEYXRhO2lmKFQpe08rPVQucG9zaXRpb25zLmxlbmd0aDtjb25zdCBsPVQucG9zaXRpb25zWzBdLmxlbmd0aDtvKz1ULnBvc2l0aW9ucy5sZW5ndGgqbCxjKz1ULmNlbGxzLmxlbmd0aCozLHkrPVQuYXR0cmlidXRlcy5hX2NvbG9yLmxlbmd0aCo0O2NvbnN0IGg9VC50ZXh0dXJlQ29vcmQ7aCYmKG0rPWgubGVuZ3RoKmhbMF0ubGVuZ3RoKTtjb25zdCBmPVQuYXR0cmlidXRlcy5hX3NvdXJjZVJlY3Q7ZiYmKHUrPWYubGVuZ3RoKjQpO2NvbnN0IGc9VC5hdHRyaWJ1dGVzLmFfY2xpcFVWO2cmJihwKz1nLmxlbmd0aCoyKX19aWYoKCFpLnBvc2l0aW9uc3x8aS5wb3NpdGlvbnMubGVuZ3RoPG8pJiYoaS5wb3NpdGlvbnM9bmV3IEZsb2F0MzJBcnJheShvKSksKCFpLmNlbGxzfHxpLmNlbGxzLmxlbmd0aDxjKSYmKGkuY2VsbHM9bmV3IFVpbnQxNkFycmF5KGMpKSxtJiYoIWkudGV4dHVyZUNvb3JkfHxpLnRleHR1cmVDb29yZC5sZW5ndGg8bSkmJihpLnRleHR1cmVDb29yZD1uZXcgRmxvYXQzMkFycmF5KG0pKSwoIWkuYV9jb2xvcnx8aS5hX2NvbG9yLmxlbmd0aDx5KSYmKGkuYV9jb2xvcj1uZXcgVWludDhBcnJheSh5KSksdSYmKCFpLmFfc291cmNlUmVjdHx8aS5hX3NvdXJjZVJlY3QubGVuZ3RoPHUpJiYoaS5hX3NvdXJjZVJlY3Q9bmV3IEZsb2F0MzJBcnJheSh1KSkscCYmKCFpLmFfY2xpcFVWfHxpLmFfY2xpcFVWLmxlbmd0aDxwKSYmKGkuYV9jbGlwVVY9bmV3IEZsb2F0MzJBcnJheShwKSkseCl7Y29uc3Qgdj1PYmplY3QuZW50cmllcyh4Ll9hdHRyaWJ1dGUpLFQ9eC5fYXR0cmliT3B0c3x8e307Zm9yKGxldCBsPTA7bDx2Lmxlbmd0aDtsKyspe2NvbnN0W2gsZl09dltsXTtpZihoIT09ImFfY29sb3IiJiZoIT09ImFfc291cmNlUmVjdCImJmYhPT0iaWdub3JlZCIpe2NvbnN0IGc9VFtoXT9UW2hdLnR5cGU6IkZMT0FUIixNPWVbZ10sQT1mLnNpemUqTzsoIWlbaF18fGlbaF0ubGVuZ3RoPEEpJiYoaVtoXT1uZXcgTShBKSl9fX1yZXR1cm4gaX1mdW5jdGlvbiBhKHMsaSl7bGV0IG89W10sYz1bXSxtPVtdLHU9W10scD1bXSx5PVtdLE89MCx4PTA7Y29uc3Qgdj1zWzBdP3NbMF0udW5pZm9ybXN8fHt9Ont9LFQ9c1swXT9zWzBdLnByb2dyYW06bnVsbDtpJiYobihzLGkpLGM9aS5jZWxscyxvPWkucG9zaXRpb25zLG09aS50ZXh0dXJlQ29vcmQsdT1pLmFfY29sb3IscD1pLmFfc291cmNlUmVjdCx5PWkuYV9jbGlwVVYpO2xldCBsPSExLGg9ITE7Y29uc3QgZj17fTtmb3IobGV0IE09MDtNPHMubGVuZ3RoO00rKyl7bGV0IEE9c1tNXTtpZihBKXtpZihBLm1lc2hEYXRhJiYoQT1BLm1lc2hEYXRhKSxpKXtjb25zdCBiPUEucG9zaXRpb25zO2ZvcihsZXQgRT0wO0U8Yi5sZW5ndGg7RSsrKXtjb25zdCBMPWJbRV0sRD0zKihPK0UpO2ZvcihsZXQgST0wO0k8TC5sZW5ndGg7SSsrKW9bRCtJXT1MW0ldfX1lbHNlIG8ucHVzaCguLi5BLnBvc2l0aW9ucyk7Y29uc3QgQz1BLmNlbGxzO2ZvcihsZXQgYj0wO2I8Qy5sZW5ndGg7YisrKXtjb25zdCBFPUNbYl07aWYoaSl7Y29uc3QgTD0zKih4K2IpO2NbTF09RVswXStPLGNbTCsxXT1FWzFdK08sY1tMKzJdPUVbMl0rT31lbHNlIGMucHVzaChbRVswXStPLEVbMV0rTyxFWzJdK09dKX1pZihpKXtjb25zdCBiPUEuYXR0cmlidXRlcy5hX2NvbG9yO2ZvcihsZXQgRT0wO0U8Yi5sZW5ndGg7RSsrKXtjb25zdCBMPWJbRV0sRD00KihPK0UpO3VbRF09TFswXSx1W0QrMV09TFsxXSx1W0QrMl09TFsyXSx1W0QrM109TFszXX19ZWxzZSB1LnB1c2goLi4uQS5hdHRyaWJ1dGVzLmFfY29sb3IpO2lmKEEuYXR0cmlidXRlcy5hX3NvdXJjZVJlY3QpaWYobD0hMCxpKXtjb25zdCBiPUEuYXR0cmlidXRlcy5hX3NvdXJjZVJlY3Q7Zm9yKGxldCBFPTA7RTxiLmxlbmd0aDtFKyspe2NvbnN0IEw9YltFXSxEPTQqKE8rRSk7cFtEXT1MWzBdLHBbRCsxXT1MWzFdLHBbRCsyXT1MWzJdLHBbRCszXT1MWzNdfX1lbHNlIHAucHVzaCguLi5BLmF0dHJpYnV0ZXMuYV9zb3VyY2VSZWN0KTtpZihBLmF0dHJpYnV0ZXMuYV9jbGlwVVYpaWYoaD0hMCxpKXtjb25zdCBiPUEuYXR0cmlidXRlcy5hX2NsaXBVVjtmb3IobGV0IEU9MDtFPGIubGVuZ3RoO0UrKyl7Y29uc3QgTD1iW0VdLEQ9MiooTytFKTt5W0RdPUxbMF0seVtEKzFdPUxbMV19fWVsc2UgeS5wdXNoKC4uLkEuYXR0cmlidXRlcy5hX2NsaXBVVik7aWYoQS50ZXh0dXJlQ29vcmQpaWYoaSl7Y29uc3QgYj1BLnRleHR1cmVDb29yZDtmb3IobGV0IEU9MDtFPGIubGVuZ3RoO0UrKyl7Y29uc3QgTD1iW0VdLEQ9MyooTytFKTtmb3IobGV0IEk9MDtJPEwubGVuZ3RoO0krKyltW0QrSV09TFtJXX19ZWxzZSBtLnB1c2goLi4uQS50ZXh0dXJlQ29vcmQpO2lmKFQpe2NvbnN0IGI9T2JqZWN0LmVudHJpZXMoVC5fYXR0cmlidXRlKTtmb3IobGV0IEU9MDtFPGIubGVuZ3RoO0UrKyl7Y29uc3RbTCxEXT1iW0VdO2lmKEwhPT0iYV9jb2xvciImJkwhPT0iYV9zb3VyY2VSZWN0IiYmRCE9PSJpZ25vcmVkIilpZihmW0xdPVtdLGkpe2ZbTF09aVtMXTtjb25zdCBJPUEuYXR0cmlidXRlc1tMXSxSPUlbMF0ubGVuZ3RoO2ZvcihsZXQgQj0wO0I8SS5sZW5ndGg7QisrKXtjb25zdCB6PUlbQl0sSz1SKihPK0IpO2ZvcihsZXQgUT0wO1E8ei5sZW5ndGg7USsrKWZbTF1bSytRXT16W1FdfX1lbHNlIGZbTF0ucHVzaCguLi5BLmF0dHJpYnV0ZXNbTF0pfX1PKz1BLnBvc2l0aW9ucy5sZW5ndGgseCs9QS5jZWxscy5sZW5ndGh9fWYuYV9jb2xvcj11LGwmJnAmJnAubGVuZ3RoPjAmJihmLmFfc291cmNlUmVjdD1wKTtjb25zdCBnPXtwb3NpdGlvbnM6byxjZWxsczpjLGF0dHJpYnV0ZXM6Zix1bmlmb3Jtczp2LGNlbGxzQ291bnQ6eCozLHByb2dyYW06VH07cmV0dXJuIG0mJm0ubGVuZ3RoJiYoZy50ZXh0dXJlQ29vcmQ9bSksaCYmeS5sZW5ndGg+MCYmKGYuYV9jbGlwVVY9eSksZ319LGZ1bmN0aW9uKGQscix0KXt0LnIocik7dmFyIGU9dCgxKSxuPXQoMzApLGE9dCgyNikscz10KDMxKTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7ZnVuY3Rpb24gaShmLGcpe3ZhciBNPU9iamVjdC5rZXlzKGYpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBBPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZik7ZyYmKEE9QS5maWx0ZXIoZnVuY3Rpb24oQyl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZixDKS5lbnVtZXJhYmxlfSkpLE0ucHVzaC5hcHBseShNLEEpfXJldHVybiBNfWZ1bmN0aW9uIG8oZil7Zm9yKHZhciBnPTE7Zzxhcmd1bWVudHMubGVuZ3RoO2crKyl7dmFyIE09YXJndW1lbnRzW2ddIT1udWxsP2FyZ3VtZW50c1tnXTp7fTtnJTI/aShPYmplY3QoTSksITApLmZvckVhY2goZnVuY3Rpb24oQSl7YyhmLEEsTVtBXSl9KTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyhmLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKE0pKTppKE9iamVjdChNKSkuZm9yRWFjaChmdW5jdGlvbihBKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZixBLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTSxBKSl9KX1yZXR1cm4gZn1mdW5jdGlvbiBjKGYsZyxNKXtyZXR1cm4gZyBpbiBmP09iamVjdC5kZWZpbmVQcm9wZXJ0eShmLGcse3ZhbHVlOk0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTpmW2ddPU0sZn1jb25zdCBtPVN5bWJvbCgibWVzaCIpLHU9U3ltYm9sKCJjb3VudCIpLHA9U3ltYm9sKCJibGVuZCIpLHk9U3ltYm9sKCJmaWx0ZXIiKSxPPVN5bWJvbCgidGV4dHVyZXMiKSx4PVN5bWJvbCgidGV4dHVyZU9wdGlvbnMiKSx2PVN5bWJvbCgiY2xvdWRDb2xvciIpLFQ9U3ltYm9sKCJjbG91ZEZpbHRlciIpLGw9U3ltYm9sKCJidWZmZXIiKTtmdW5jdGlvbiBoKGYsZz1udWxsKXtjb25zdCBNPW5ldyBGbG9hdDMyQXJyYXkoMypmKSxBPW5ldyBGbG9hdDMyQXJyYXkoMypmKSxDPW5ldyBGbG9hdDMyQXJyYXkoNCpmKSxiPW5ldyBGbG9hdDMyQXJyYXkoNCpmKSxFPW5ldyBGbG9hdDMyQXJyYXkoNCpmKSxMPW5ldyBGbG9hdDMyQXJyYXkoNCpmKSxEPW5ldyBGbG9hdDMyQXJyYXkoNCpmKSxJPW5ldyBVaW50OEFycmF5KGYpLFI9bmV3IFVpbnQ4QXJyYXkoNCpmKSxCPW5ldyBVaW50OEFycmF5KDQqZik7cmV0dXJuIGcmJihNLnNldChnLnRyYW5zZm9ybTAsMCksQS5zZXQoZy50cmFuc2Zvcm0xLDApLEMuc2V0KGcuY29sb3IwLDApLGIuc2V0KGcuY29sb3IxLDApLEUuc2V0KGcuY29sb3IyLDApLEwuc2V0KGcuY29sb3IzLDApLEQuc2V0KGcuY29sb3I0LDApLEkuc2V0KGcuZnJhbWVJbmRleCwwKSxSLnNldChnLmZpbGxDb2xvciwwKSxCLnNldChnLnN0cm9rZUNvbG9yLDApKSx7YnVmZmVyU2l6ZTpmLHRyYW5zZm9ybTA6TSx0cmFuc2Zvcm0xOkEsY29sb3IwOkMsY29sb3IxOmIsY29sb3IyOkUsY29sb3IzOkwsY29sb3I0OkQsZnJhbWVJbmRleDpJLGZpbGxDb2xvcjpSLHN0cm9rZUNvbG9yOkJ9fXIuZGVmYXVsdD1jbGFzc3tjb25zdHJ1Y3RvcihmLGc9MSx7YnVmZmVyOk09MWUzfT17fSl7TT1NYXRoLm1heChNLGcpLHRoaXNbdV09Zyx0aGlzW21dPWYsdGhpc1tsXT1oKE0pLHRoaXNbT109W10sdGhpc1t5XT1bXSx0aGlzW3ZdPSExLHRoaXNbVF09ITEsdGhpc1twXT0hMSx0aGlzLmluaXRCdWZmZXIoKX1pbml0QnVmZmVyKGY9MCl7Y29uc3QgZz10aGlzW3VdO2ZvcihsZXQgTT1mO008ZztNKyspdGhpc1tsXS50cmFuc2Zvcm0wLnNldChbMSwwLDBdLE0qMyksdGhpc1tsXS50cmFuc2Zvcm0xLnNldChbMCwxLDBdLE0qMyksdGhpc1tsXS5mcmFtZUluZGV4LnNldChbLTFdLE0pLHRoaXNbbF0uZmlsbENvbG9yLnNldChbMCwwLDAsMF0sTSo0KSx0aGlzW2xdLnN0cm9rZUNvbG9yLnNldChbMCwwLDAsMF0sTSo0KSx0aGlzLnNldENvbG9yVHJhbnNmb3JtKE0sbnVsbCl9Z2V0IGJ1ZmZlclNpemUoKXtyZXR1cm4gdGhpc1tsXS5idWZmZXJTaXplfWdldCBtZXNoKCl7cmV0dXJuIHRoaXNbbV19c2V0IG1lc2goZil7dGhpc1ttXT1mLHRoaXNbT10mJnRoaXMuc2V0VGV4dHVyZUZyYW1lcyh0aGlzW09dLHRoaXNbeF0pfWdldCBoYXNDbG91ZENvbG9yKCl7cmV0dXJuIHRoaXNbdl19Z2V0IGhhc0Nsb3VkRmlsdGVyKCl7cmV0dXJuIHRoaXNbVF19X2dldEZpbHRlcihmKXtyZXR1cm4gdGhpc1t5XVtmXT10aGlzW3ldW2ZdfHxbXSx0aGlzW3ldW2ZdfWdldEZpbHRlcihmKXtyZXR1cm4gdGhpcy5fZ2V0RmlsdGVyKGYpLmpvaW4oIiAiKX1nZXQgZW5hYmxlQmxlbmQoKXtyZXR1cm4gdGhpc1ttXS5lbmFibGVCbGVuZHx8dGhpc1twXX1jYW5JZ25vcmUoKXtyZXR1cm4gdGhpc1ttXS5jYW5JZ25vcmUoKX1kZWxldGUoZil7aWYoZj49dGhpc1t1XXx8ZjwwKXRocm93IG5ldyBFcnJvcigiT3V0IG9mIHJhbmdlLiIpO2NvbnN0e3RyYW5zZm9ybTA6Zyx0cmFuc2Zvcm0xOk0sY29sb3IwOkEsY29sb3IxOkMsY29sb3IyOmIsY29sb3IzOkUsY29sb3I0OkwsZnJhbWVJbmRleDpELGZpbGxDb2xvcjpJLHN0cm9rZUNvbG9yOlJ9PXRoaXNbbF07Zy5zZXQoZy5zdWJhcnJheSgzKihmKzEpKSwzKmYpLE0uc2V0KE0uc3ViYXJyYXkoMyooZisxKSksMypmKSxBLnNldChBLnN1YmFycmF5KDQqKGYrMSkpLDQqZiksQy5zZXQoQy5zdWJhcnJheSg0KihmKzEpKSw0KmYpLGIuc2V0KGIuc3ViYXJyYXkoNCooZisxKSksNCpmKSxFLnNldChFLnN1YmFycmF5KDQqKGYrMSkpLDQqZiksTC5zZXQoTC5zdWJhcnJheSg0KihmKzEpKSw0KmYpLEQuc2V0KEQuc3ViYXJyYXkoZisxKSxmKSxJLnNldChJLnN1YmFycmF5KDQqKGYrMSkpLDQqZiksUi5zZXQoUi5zdWJhcnJheSg0KihmKzEpKSw0KmYpO2Zvcihjb25zdCBCIGluIHRoaXNbeV0pQj09PWY/ZGVsZXRlIHRoaXNbeV1bQl06Qj5mJiYodGhpc1t5XVtCLTFdPXRoaXNbeV1bQl0sZGVsZXRlIHRoaXNbeV1bQl0pO3RoaXNbdV0tLX1zZXRDb2xvclRyYW5zZm9ybShmLGcpe2lmKGY+PXRoaXNbdV18fGY8MCl0aHJvdyBuZXcgRXJyb3IoIk91dCBvZiByYW5nZS4iKTtmKj00O2NvbnN0e2NvbG9yMDpNLGNvbG9yMTpBLGNvbG9yMjpDLGNvbG9yMzpiLGNvbG9yNDpFfT10aGlzW2xdO3JldHVybiBnIT1udWxsPyhNLnNldChbZ1swXSxnWzVdLGdbMTBdLGdbMTVdXSxmKSxBLnNldChbZ1sxXSxnWzZdLGdbMTFdLGdbMTZdXSxmKSxDLnNldChbZ1syXSxnWzddLGdbMTJdLGdbMTddXSxmKSxiLnNldChbZ1szXSxnWzhdLGdbMTNdLGdbMThdXSxmKSxFLnNldChbZ1s0XSxnWzldLGdbMTRdLGdbMTldXSxmKSx0aGlzW3BdPXRoaXNbcF18fGdbMThdPDEsdGhpc1tUXT0hMCk6KE0uc2V0KFsxLDAsMCwwXSxmKSxBLnNldChbMCwxLDAsMF0sZiksQy5zZXQoWzAsMCwxLDBdLGYpLGIuc2V0KFswLDAsMCwxXSxmKSxFLnNldChbMCwwLDAsMF0sZikpLHRoaXN9Z2V0Q29sb3JUcmFuc2Zvcm0oZil7aWYoZj49dGhpc1t1XXx8ZjwwKXRocm93IG5ldyBFcnJvcigiT3V0IG9mIHJhbmdlLiIpO2YqPTQ7Y29uc3R7Y29sb3IwOmcsY29sb3IxOk0sY29sb3IyOkEsY29sb3IzOkMsY29sb3I0OmJ9PXRoaXNbbF07cmV0dXJuW2dbZl0sTVtmXSxBW2ZdLENbZl0sYltmXSxnW2YrMV0sTVtmKzFdLEFbZisxXSxDW2YrMV0sYltmKzFdLGdbZisyXSxNW2YrMl0sQVtmKzJdLENbZisyXSxiW2YrMl0sZ1tmKzNdLE1bZiszXSxBW2YrM10sQ1tmKzNdLGJbZiszXV19dHJhbnNmb3JtQ29sb3IoZixnKXtsZXQgTT10aGlzLmdldENvbG9yVHJhbnNmb3JtKGYpO3JldHVybiBNPU9iamVjdChuLm11bHRpcGx5KShNLGcpLHRoaXMuc2V0Q29sb3JUcmFuc2Zvcm0oZixNKSx0aGlzfXNldEZpbGxDb2xvcihmLGcpe2lmKGY+PXRoaXNbdV18fGY8MCl0aHJvdyBuZXcgRXJyb3IoIk91dCBvZiByYW5nZS4iKTt0eXBlb2YgZz09InN0cmluZyImJihnPU9iamVjdChzLmRlZmF1bHQpKGcpKSxnWzNdPjAmJih0aGlzW3ZdPSEwKSx0aGlzW2xdLmZpbGxDb2xvci5zZXQoZy5tYXAoTT0+TWF0aC5yb3VuZCgyNTUqTSkpLDQqZil9c2V0U3Ryb2tlQ29sb3IoZixnKXtpZihmPj10aGlzW3VdfHxmPDApdGhyb3cgbmV3IEVycm9yKCJPdXQgb2YgcmFuZ2UuIik7dHlwZW9mIGc9PSJzdHJpbmciJiYoZz1PYmplY3Qocy5kZWZhdWx0KShnKSksZ1szXT4wJiYodGhpc1t2XT0hMCksdGhpc1tsXS5zdHJva2VDb2xvci5zZXQoZy5tYXAoTT0+TWF0aC5yb3VuZCgyNTUqTSkpLDQqZil9Z2V0Q2xvdWRSR0JBKGYpe2lmKGY+PXRoaXNbdV18fGY8MCl0aHJvdyBuZXcgRXJyb3IoIk91dCBvZiByYW5nZS4iKTtmKj00O2NvbnN0e2ZpbGxDb2xvcjpnLHN0cm9rZUNvbG9yOk19PXRoaXNbbF0sQT1bZ1tmXSxnW2YrMV0sZ1tmKzJdLGdbZiszXV0sQz1bTVtmXSxNW2YrMV0sTVtmKzJdLE1bZiszXV07cmV0dXJuIEFbM10vPTI1NSxDWzNdLz0yNTUse2ZpbGw6YHJnYmEoJHtBLmpvaW4oKX0pYCxzdHJva2U6YHJnYmEoJHtDLmpvaW4oKX0pYH19Z3JheXNjYWxlKGYsZyl7dGhpcy50cmFuc2Zvcm1Db2xvcihmLE9iamVjdChuLmdyYXlzY2FsZSkoZykpLHRoaXMuX2dldEZpbHRlcihmKS5wdXNoKGBncmF5c2NhbGUoJHsxMDAqZ30lKWApfWJyaWdodG5lc3MoZixnKXt0aGlzLnRyYW5zZm9ybUNvbG9yKGYsT2JqZWN0KG4uYnJpZ2h0bmVzcykoZykpLHRoaXMuX2dldEZpbHRlcihmKS5wdXNoKGBicmlnaHRuZXNzKCR7MTAwKmd9JSlgKX1zYXR1cmF0ZShmLGcpe3RoaXMudHJhbnNmb3JtQ29sb3IoZixPYmplY3Qobi5zYXR1cmF0ZSkoZykpLHRoaXMuX2dldEZpbHRlcihmKS5wdXNoKGBzYXR1cmF0ZSgkezEwMCpnfSUpYCl9Y29udHJhc3QoZixnKXt0aGlzLnRyYW5zZm9ybUNvbG9yKGYsT2JqZWN0KG4uY29udHJhc3QpKGcpKSx0aGlzLl9nZXRGaWx0ZXIoZikucHVzaChgY29udHJhc3QoJHsxMDAqZ30lKWApfWludmVydChmLGcpe3RoaXMudHJhbnNmb3JtQ29sb3IoZixPYmplY3Qobi5pbnZlcnQpKGcpKSx0aGlzLl9nZXRGaWx0ZXIoZikucHVzaChgaW52ZXJ0KCR7MTAwKmd9JSlgKX1zZXBpYShmLGcpe3RoaXMudHJhbnNmb3JtQ29sb3IoZixPYmplY3Qobi5zZXBpYSkoZykpLHRoaXMuX2dldEZpbHRlcihmKS5wdXNoKGBzZXBpYSgkezEwMCpnfSUpYCl9b3BhY2l0eShmLGcpe3RoaXMudHJhbnNmb3JtQ29sb3IoZixPYmplY3Qobi5vcGFjaXR5KShnKSksdGhpcy5fZ2V0RmlsdGVyKGYpLnB1c2goYG9wYWNpdHkoJHsxMDAqZ30lKWApfWh1ZVJvdGF0ZShmLGcpe3RoaXMudHJhbnNmb3JtQ29sb3IoZixPYmplY3Qobi5odWVSb3RhdGUpKGcpKSx0aGlzLl9nZXRGaWx0ZXIoZikucHVzaChgaHVlLXJvdGF0ZSgke2d9ZGVnKWApfXNldFRyYW5zZm9ybShmLGcpe2lmKGY+PXRoaXNbdV18fGY8MCl0aHJvdyBuZXcgRXJyb3IoIk91dCBvZiByYW5nZS4iKTtmKj0zLGc9PW51bGwmJihnPVsxLDAsMCwxLDAsMF0pO2NvbnN0e3RyYW5zZm9ybTA6TSx0cmFuc2Zvcm0xOkF9PXRoaXNbbF07cmV0dXJuIE0uc2V0KFtnWzBdLGdbMl0sZ1s0XV0sZiksQS5zZXQoW2dbMV0sZ1szXSxnWzVdXSxmKSx0aGlzfWdldFRyYW5zZm9ybShmKXtpZihmPj10aGlzW3VdfHxmPDApdGhyb3cgbmV3IEVycm9yKCJPdXQgb2YgcmFuZ2UuIik7Zio9Mztjb25zdHt0cmFuc2Zvcm0wOmcsdHJhbnNmb3JtMTpNfT10aGlzW2xdO3JldHVybltnW2ZdLE1bZl0sZ1tmKzFdLE1bZisxXSxnW2YrMl0sTVtmKzJdXX1nZXRUZXh0dXJlRnJhbWUoZil7cmV0dXJuIHRoaXNbT11bdGhpc1tsXS5mcmFtZUluZGV4W2ZdXX1zZXRUZXh0dXJlRnJhbWVzKGY9W10sZz17fSl7aWYoZi5sZW5ndGg+MTIpdGhyb3cgbmV3IEVycm9yKCJNYXggZnJhbWVzIGV4Y2VlZC4gQWxsb3cgMTIgZnJhbWVzLiIpO2YubGVuZ3RoJiZ0aGlzW21dLnNldFRleHR1cmUoZlswXSxnKSx0aGlzW09dPWYsdGhpc1t4XT1nfXNldEZyYW1lSW5kZXgoZixnKXtpZihmPj10aGlzW3VdfHxmPDApdGhyb3cgbmV3IEVycm9yKCJPdXQgb2YgcmFuZ2UuIik7Y29uc3QgTT10aGlzW09dLmxlbmd0aDtpZihNPD0wKXRocm93IG5ldyBFcnJvcigiTm8gZnJhbWVzIik7dGhpc1tsXS5mcmFtZUluZGV4W2ZdPWclTX1nZXQgYW1vdW50KCl7cmV0dXJuIHRoaXNbdV19c2V0IGFtb3VudChmKXtjb25zdCBnPXRoaXNbdV07ZiE9PWcmJihmPnRoaXNbbF0uYnVmZmVyU2l6ZSYmKHRoaXNbbF09aChNYXRoLm1heChmLHRoaXNbbF0uYnVmZmVyU2l6ZSsxZTMpLHRoaXNbbF0pKSx0aGlzW3VdPWYsZj5nJiZ0aGlzLmluaXRCdWZmZXIoZykpfWdldCBtZXNoRGF0YSgpe2NvbnN0e2F0dHJpYnV0ZXM6ZixjZWxsczpnLHBvc2l0aW9uczpNLHRleHR1cmVDb29yZDpBLHVuaWZvcm1zOkN9PXRoaXNbbV0ubWVzaERhdGEsYj10aGlzW09dLEU9e2F0dHJpYnV0ZXM6byh7fSxmKSxjZWxsczpnLHBvc2l0aW9uczpNLHRleHR1cmVDb29yZDpBLHVuaWZvcm1zOm8oe30sQyksaW5zdGFuY2VDb3VudDp0aGlzW3VdLGVuYWJsZUJsZW5kOnRoaXMuZW5hYmxlQmxlbmR9O2IubGVuZ3RoJiZiLmZvckVhY2goKEcsWCk9PntFLnVuaWZvcm1zW2B1X3RleEZyYW1lJHtYfWBdPUd9KTtjb25zdHt0cmFuc2Zvcm0wOkwsdHJhbnNmb3JtMTpELGNvbG9yMDpJLGNvbG9yMTpSLGNvbG9yMjpCLGNvbG9yMzp6LGNvbG9yNDpLLGZpbGxDb2xvcjpRLHN0cm9rZUNvbG9yOl8sZnJhbWVJbmRleDpqfT10aGlzW2xdO3JldHVybiB0aGlzW21dLnVuaWZvcm1zLnVfdGV4U2FtcGxlciYmKEUuYXR0cmlidXRlcy5hX2ZyYW1lSW5kZXg9e2RhdGE6aixkaXZpc29yOjF9KSxFLmF0dHJpYnV0ZXMuYV90cmFuc2Zvcm0wPXtkYXRhOkwsZGl2aXNvcjoxfSxFLmF0dHJpYnV0ZXMuYV90cmFuc2Zvcm0xPXtkYXRhOkQsZGl2aXNvcjoxfSxFLmF0dHJpYnV0ZXMuYV9jb2xvckNsb3VkMD17ZGF0YTpJLGRpdmlzb3I6MX0sRS5hdHRyaWJ1dGVzLmFfY29sb3JDbG91ZDE9e2RhdGE6UixkaXZpc29yOjF9LEUuYXR0cmlidXRlcy5hX2NvbG9yQ2xvdWQyPXtkYXRhOkIsZGl2aXNvcjoxfSxFLmF0dHJpYnV0ZXMuYV9jb2xvckNsb3VkMz17ZGF0YTp6LGRpdmlzb3I6MX0sRS5hdHRyaWJ1dGVzLmFfY29sb3JDbG91ZDQ9e2RhdGE6SyxkaXZpc29yOjF9LHRoaXMuaGFzQ2xvdWRDb2xvciYmKEUuYXR0cmlidXRlcy5hX2ZpbGxDbG91ZENvbG9yPXtkYXRhOlEsZGl2aXNvcjoxfSxFLmF0dHJpYnV0ZXMuYV9zdHJva2VDbG91ZENvbG9yPXtkYXRhOl8sZGl2aXNvcjoxfSksRX1zZXRQcm9ncmFtKGYpe3RoaXNbbV0uc2V0UHJvZ3JhbShmKX1nZXQgcHJvZ3JhbSgpe3JldHVybiB0aGlzW21dLnByb2dyYW19dHJhbnNmb3JtKGYsZyl7Y29uc3QgTT10aGlzLmdldFRyYW5zZm9ybShmKTtyZXR1cm4gZz1lLm1hdDJkLm11bHRpcGx5KEFycmF5Lm9mKDAsMCwwLDAsMCwwKSxNLGcpLHRoaXMuc2V0VHJhbnNmb3JtKGYsZyksdGhpc310cmFuc2xhdGUoZixbZyxNXSl7bGV0IEE9ZS5tYXQyZC5jcmVhdGUoKTtyZXR1cm4gQT1lLm1hdDJkLnRyYW5zbGF0ZShBcnJheS5vZigwLDAsMCwwLDAsMCksQSxbZyxNXSksdGhpcy50cmFuc2Zvcm0oZixBKX1yb3RhdGUoZixnLFtNLEFdPVswLDBdKXtsZXQgQz1lLm1hdDJkLmNyZWF0ZSgpO3JldHVybiBDPWUubWF0MmQudHJhbnNsYXRlKEFycmF5Lm9mKDAsMCwwLDAsMCwwKSxDLFtNLEFdKSxDPWUubWF0MmQucm90YXRlKEFycmF5Lm9mKDAsMCwwLDAsMCwwKSxDLGcpLEM9ZS5tYXQyZC50cmFuc2xhdGUoQXJyYXkub2YoMCwwLDAsMCwwLDApLEMsWy1NLC1BXSksdGhpcy50cmFuc2Zvcm0oZixDKX1zY2FsZShmLFtnLE09Z10sW0EsQ109WzAsMF0pe2xldCBiPWUubWF0MmQuY3JlYXRlKCk7cmV0dXJuIGI9ZS5tYXQyZC50cmFuc2xhdGUoQXJyYXkub2YoMCwwLDAsMCwwLDApLGIsW0EsQ10pLGI9ZS5tYXQyZC5zY2FsZShBcnJheS5vZigwLDAsMCwwLDAsMCksYixbZyxNXSksYj1lLm1hdDJkLnRyYW5zbGF0ZShBcnJheS5vZigwLDAsMCwwLDAsMCksYixbLUEsLUNdKSx0aGlzLnRyYW5zZm9ybShmLGIpfXNrZXcoZixbZyxNPWddLFtBLENdPVswLDBdKXtsZXQgYj1lLm1hdDJkLmNyZWF0ZSgpO3JldHVybiBiPWUubWF0MmQudHJhbnNsYXRlKEFycmF5Lm9mKDAsMCwwLDAsMCwwKSxiLFtBLENdKSxiPWUubWF0MmQubXVsdGlwbHkoQXJyYXkub2YoMCwwLDAsMCwwLDApLGIsZS5tYXQyZC5mcm9tVmFsdWVzKDEsTWF0aC50YW4oTSksTWF0aC50YW4oZyksMSwwLDApKSxiPWUubWF0MmQudHJhbnNsYXRlKEFycmF5Lm9mKDAsMCwwLDAsMCwwKSxiLFstQSwtQ10pLHRoaXMudHJhbnNmb3JtKGYsYil9aXNQb2ludENvbGxpc2lvbihmLFtnLE1dLEE9ImJvdGgiKXtjb25zdCBDPXRoaXMuZ2V0VHJhbnNmb3JtKGYpLGI9T2JqZWN0KGEudHJhbnNmb3JtUG9pbnQpKFtnLE1dLGUubWF0MmQuaW52ZXJ0KEFycmF5Lm9mKDAsMCwwLDAsMCwwKSxDKSk7cmV0dXJuIHRoaXNbbV0uaXNQb2ludENvbGxpc2lvbiguLi5iLEEpfWlzUG9pbnRJbkZpbGwoZixbZyxNXSl7cmV0dXJuIHRoaXMuaXNQb2ludENvbGxpc2lvbihmLFtnLE1dLCJmaWxsIil9aXNQb2ludEluU3Ryb2tlKGYsW2csTV0pe3JldHVybiB0aGlzLmlzUG9pbnRDb2xsaXNpb24oZixbZyxNXSwic3Ryb2tlIil9fX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwibXVsdGlwbHkiLGZ1bmN0aW9uKCl7cmV0dXJuIG59KSx0LmQociwiZ3JheXNjYWxlIixmdW5jdGlvbigpe3JldHVybiBhfSksdC5kKHIsImJyaWdodG5lc3MiLGZ1bmN0aW9uKCl7cmV0dXJuIHN9KSx0LmQociwic2F0dXJhdGUiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KSx0LmQociwiY29udHJhc3QiLGZ1bmN0aW9uKCl7cmV0dXJuIG99KSx0LmQociwiaW52ZXJ0IixmdW5jdGlvbigpe3JldHVybiBjfSksdC5kKHIsInNlcGlhIixmdW5jdGlvbigpe3JldHVybiBtfSksdC5kKHIsIm9wYWNpdHkiLGZ1bmN0aW9uKCl7cmV0dXJuIHV9KSx0LmQociwiaHVlUm90YXRlIixmdW5jdGlvbigpe3JldHVybiBwfSk7dmFyIGU9dCgyNik7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2Z1bmN0aW9uIG4oeSxPKXtjb25zdCB4PVtdLHY9eVswXSxUPXlbMV0sbD15WzJdLGg9eVszXSxmPXlbNF0sZz15WzVdLE09eVs2XSxBPXlbN10sQz15WzhdLGI9eVs5XSxFPXlbMTBdLEw9eVsxMV0sRD15WzEyXSxJPXlbMTNdLFI9eVsxNF0sQj15WzE1XSx6PXlbMTZdLEs9eVsxN10sUT15WzE4XSxfPXlbMTldO2xldCBqPU9bMF0sRz1PWzFdLFg9T1syXSxaPU9bM10sdHQ9T1s0XTtyZXR1cm4geFswXT1qKnYrRypnK1gqRStaKkIseFsxXT1qKlQrRypNK1gqTCtaKnoseFsyXT1qKmwrRypBK1gqRCtaKksseFszXT1qKmgrRypDK1gqSStaKlEseFs0XT1qKmYrRypiK1gqUitaKl8rdHQsaj1PWzVdLEc9T1s2XSxYPU9bN10sWj1PWzhdLHR0PU9bOV0seFs1XT1qKnYrRypnK1gqRStaKkIseFs2XT1qKlQrRypNK1gqTCtaKnoseFs3XT1qKmwrRypBK1gqRCtaKksseFs4XT1qKmgrRypDK1gqSStaKlEseFs5XT1qKmYrRypiK1gqUitaKl8rdHQsaj1PWzEwXSxHPU9bMTFdLFg9T1sxMl0sWj1PWzEzXSx0dD1PWzE0XSx4WzEwXT1qKnYrRypnK1gqRStaKkIseFsxMV09aipUK0cqTStYKkwrWip6LHhbMTJdPWoqbCtHKkErWCpEK1oqSyx4WzEzXT1qKmgrRypDK1gqSStaKlEseFsxNF09aipmK0cqYitYKlIrWipfK3R0LGo9T1sxNV0sRz1PWzE2XSxYPU9bMTddLFo9T1sxOF0sdHQ9T1sxOV0seFsxNV09aip2K0cqZytYKkUrWipCLHhbMTZdPWoqVCtHKk0rWCpMK1oqeix4WzE3XT1qKmwrRypBK1gqRCtaKksseFsxOF09aipoK0cqQytYKkkrWipRLHhbMTldPWoqZitHKmIrWCpSK1oqXyt0dCx4fWZ1bmN0aW9uIGEoeSl7eT1PYmplY3QoZS5jbGFtcCkoMCwxLHkpO2NvbnN0IE89LjIxMjYqeSx4PS43MTUyKnksdj0uMDcyMip5O3JldHVybltPKzEteSx4LHYsMCwwLE8seCsxLXksdiwwLDAsTyx4LHYrMS15LDAsMCwwLDAsMCwxLDBdfWZ1bmN0aW9uIHMoeSl7cmV0dXJuW3ksMCwwLDAsMCwwLHksMCwwLDAsMCwwLHksMCwwLDAsMCwwLDEsMF19ZnVuY3Rpb24gaSh5KXtjb25zdCBPPS4yMTI2KigxLXkpLHg9LjcxNTIqKDEteSksdj0uMDcyMiooMS15KTtyZXR1cm5bTyt5LHgsdiwwLDAsTyx4K3ksdiwwLDAsTyx4LHYreSwwLDAsMCwwLDAsMSwwXX1mdW5jdGlvbiBvKHkpe2NvbnN0IE89LjUqKDEteSk7cmV0dXJuW3ksMCwwLDAsTywwLHksMCwwLE8sMCwwLHksMCxPLDAsMCwwLDEsMF19ZnVuY3Rpb24gYyh5KXtjb25zdCBPPTEtMip5O3JldHVybltPLDAsMCwwLHksMCxPLDAsMCx5LDAsMCxPLDAseSwwLDAsMCwxLDBdfWZ1bmN0aW9uIG0oeSl7cmV0dXJuWzEtLjYwNyp5LC43NjkqeSwuMTg5KnksMCwwLC4zNDkqeSwxLS4zMTQqeSwuMTY4KnksMCwwLC4yNzIqeSwuNTM0KnksMS0uODY5KnksMCwwLDAsMCwwLDEsMF19ZnVuY3Rpb24gdSh5KXtyZXR1cm5bMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAseSwwXX1mdW5jdGlvbiBwKHkpe2NvbnN0IE89eS8xODAqTWF0aC5QSSx4PU1hdGguY29zKE8pLHY9TWF0aC5zaW4oTyksVD0uMjEyNixsPS43MTUyLGg9LjA3MjI7cmV0dXJuW1QreCooMS1UKSt2Ki1ULGwreCotbCt2Ki1sLGgreCotaCt2KigxLWgpLDAsMCxUK3gqLVQrdiouMTQzLGwreCooMS1sKSt2Ki4xNCxoK3gqLWgrdiotLjI4MywwLDAsVCt4Ki1UK3YqLSgxLVQpLGwreCotbCt2KmwsaCt4KigxLWgpK3YqaCwwLDAsMCwwLDAsMSwwXX19LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImRlZmF1bHQiLGZ1bmN0aW9uKCl7cmV0dXJuIGF9KTt2YXIgZT10KDMyKSxuPXQubihlKTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7ZnVuY3Rpb24gYShzKXtjb25zdCBpPW4oKShzKTtpZighaXx8IWkubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgY29sb3IgdmFsdWUuIik7cmV0dXJuW2lbMF0vMjU1LGlbMV0vMjU1LGlbMl0vMjU1LGlbM11dfX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoMzMpLG49dCgzNyksYT10KDM5KTtkLmV4cG9ydHM9ZnVuY3Rpb24oaSl7dmFyIG8sYz1lKGkpO3JldHVybiBjLnNwYWNlPyhvPUFycmF5KDMpLG9bMF09YShjLnZhbHVlc1swXSwwLDI1NSksb1sxXT1hKGMudmFsdWVzWzFdLDAsMjU1KSxvWzJdPWEoYy52YWx1ZXNbMl0sMCwyNTUpLGMuc3BhY2VbMF09PT0iaCImJihvPW4ucmdiKG8pKSxvLnB1c2goYShjLmFscGhhLDAsMSkpLG8pOltdfX0sZnVuY3Rpb24oZCxyLHQpeyhmdW5jdGlvbihlKXt2YXIgbj10KDM0KSxhPXQoMzUpLHM9dCgzNik7ZC5leHBvcnRzPW87dmFyIGk9e3JlZDowLG9yYW5nZTo2MCx5ZWxsb3c6MTIwLGdyZWVuOjE4MCxibHVlOjI0MCxwdXJwbGU6MzAwfTtmdW5jdGlvbiBvKGMpe3ZhciBtLHU9W10scD0xLHk7aWYodHlwZW9mIGM9PSJzdHJpbmciKWlmKG5bY10pdT1uW2NdLnNsaWNlKCkseT0icmdiIjtlbHNlIGlmKGM9PT0idHJhbnNwYXJlbnQiKXA9MCx5PSJyZ2IiLHU9WzAsMCwwXTtlbHNlIGlmKC9eI1tBLUZhLWYwLTldKyQvLnRlc3QoYykpe3ZhciBPPWMuc2xpY2UoMSkseD1PLmxlbmd0aCx2PXg8PTQ7cD0xLHY/KHU9W3BhcnNlSW50KE9bMF0rT1swXSwxNikscGFyc2VJbnQoT1sxXStPWzFdLDE2KSxwYXJzZUludChPWzJdK09bMl0sMTYpXSx4PT09NCYmKHA9cGFyc2VJbnQoT1szXStPWzNdLDE2KS8yNTUpKToodT1bcGFyc2VJbnQoT1swXStPWzFdLDE2KSxwYXJzZUludChPWzJdK09bM10sMTYpLHBhcnNlSW50KE9bNF0rT1s1XSwxNildLHg9PT04JiYocD1wYXJzZUludChPWzZdK09bN10sMTYpLzI1NSkpLHVbMF18fCh1WzBdPTApLHVbMV18fCh1WzFdPTApLHVbMl18fCh1WzJdPTApLHk9InJnYiJ9ZWxzZSBpZihtPS9eKCg/OnJnYnxoc1tsdmJdfGh3YnxjbXlrP3x4eVt6eV18Z3JheXxsYWJ8bGNodT92P3xbbHlddXZ8bG1zKWE/KVxzKlwoKFteXCldKilcKS8uZXhlYyhjKSl7dmFyIFQ9bVsxXSxsPVQ9PT0icmdiIixPPVQucmVwbGFjZSgvYSQvLCIiKTt5PU87dmFyIHg9Tz09PSJjbXlrIj80Ok89PT0iZ3JheSI/MTozO3U9bVsyXS50cmltKCkuc3BsaXQoL1xzKixccyovKS5tYXAoZnVuY3Rpb24oTSxBKXtpZigvJSQvLnRlc3QoTSkpcmV0dXJuIEE9PT14P3BhcnNlRmxvYXQoTSkvMTAwOk89PT0icmdiIj9wYXJzZUZsb2F0KE0pKjI1NS8xMDA6cGFyc2VGbG9hdChNKTtpZihPW0FdPT09ImgiKXtpZigvZGVnJC8udGVzdChNKSlyZXR1cm4gcGFyc2VGbG9hdChNKTtpZihpW01dIT09dm9pZCAwKXJldHVybiBpW01dfXJldHVybiBwYXJzZUZsb2F0KE0pfSksVD09PU8mJnUucHVzaCgxKSxwPWx8fHVbeF09PT12b2lkIDA/MTp1W3hdLHU9dS5zbGljZSgwLHgpfWVsc2UgYy5sZW5ndGg+MTAmJi9bMC05XSg/OlxzfFwvKS8udGVzdChjKSYmKHU9Yy5tYXRjaCgvKFswLTldKykvZykubWFwKGZ1bmN0aW9uKGYpe3JldHVybiBwYXJzZUZsb2F0KGYpfSkseT1jLm1hdGNoKC8oW2Etel0pL2lnKS5qb2luKCIiKS50b0xvd2VyQ2FzZSgpKTtlbHNlIGlmKCFpc05hTihjKSl5PSJyZ2IiLHU9W2M+Pj4xNiwoYyY2NTI4MCk+Pj44LGMmMjU1XTtlbHNlIGlmKGEoYykpe3ZhciBoPXMoYy5yLGMucmVkLGMuUixudWxsKTtoIT09bnVsbD8oeT0icmdiIix1PVtoLHMoYy5nLGMuZ3JlZW4sYy5HKSxzKGMuYixjLmJsdWUsYy5CKV0pOih5PSJoc2wiLHU9W3MoYy5oLGMuaHVlLGMuSCkscyhjLnMsYy5zYXR1cmF0aW9uLGMuUykscyhjLmwsYy5saWdodG5lc3MsYy5MLGMuYixjLmJyaWdodG5lc3MpXSkscD1zKGMuYSxjLmFscGhhLGMub3BhY2l0eSwxKSxjLm9wYWNpdHkhPW51bGwmJihwLz0xMDApfWVsc2UoQXJyYXkuaXNBcnJheShjKXx8ZS5BcnJheUJ1ZmZlciYmQXJyYXlCdWZmZXIuaXNWaWV3JiZBcnJheUJ1ZmZlci5pc1ZpZXcoYykpJiYodT1bY1swXSxjWzFdLGNbMl1dLHk9InJnYiIscD1jLmxlbmd0aD09PTQ/Y1szXToxKTtyZXR1cm57c3BhY2U6eSx2YWx1ZXM6dSxhbHBoYTpwfX19KS5jYWxsKHRoaXMsdCgyMikpfSxmdW5jdGlvbihkLHIsdCl7ZC5leHBvcnRzPXthbGljZWJsdWU6WzI0MCwyNDgsMjU1XSxhbnRpcXVld2hpdGU6WzI1MCwyMzUsMjE1XSxhcXVhOlswLDI1NSwyNTVdLGFxdWFtYXJpbmU6WzEyNywyNTUsMjEyXSxhenVyZTpbMjQwLDI1NSwyNTVdLGJlaWdlOlsyNDUsMjQ1LDIyMF0sYmlzcXVlOlsyNTUsMjI4LDE5Nl0sYmxhY2s6WzAsMCwwXSxibGFuY2hlZGFsbW9uZDpbMjU1LDIzNSwyMDVdLGJsdWU6WzAsMCwyNTVdLGJsdWV2aW9sZXQ6WzEzOCw0MywyMjZdLGJyb3duOlsxNjUsNDIsNDJdLGJ1cmx5d29vZDpbMjIyLDE4NCwxMzVdLGNhZGV0Ymx1ZTpbOTUsMTU4LDE2MF0sY2hhcnRyZXVzZTpbMTI3LDI1NSwwXSxjaG9jb2xhdGU6WzIxMCwxMDUsMzBdLGNvcmFsOlsyNTUsMTI3LDgwXSxjb3JuZmxvd2VyYmx1ZTpbMTAwLDE0OSwyMzddLGNvcm5zaWxrOlsyNTUsMjQ4LDIyMF0sY3JpbXNvbjpbMjIwLDIwLDYwXSxjeWFuOlswLDI1NSwyNTVdLGRhcmtibHVlOlswLDAsMTM5XSxkYXJrY3lhbjpbMCwxMzksMTM5XSxkYXJrZ29sZGVucm9kOlsxODQsMTM0LDExXSxkYXJrZ3JheTpbMTY5LDE2OSwxNjldLGRhcmtncmVlbjpbMCwxMDAsMF0sZGFya2dyZXk6WzE2OSwxNjksMTY5XSxkYXJra2hha2k6WzE4OSwxODMsMTA3XSxkYXJrbWFnZW50YTpbMTM5LDAsMTM5XSxkYXJrb2xpdmVncmVlbjpbODUsMTA3LDQ3XSxkYXJrb3JhbmdlOlsyNTUsMTQwLDBdLGRhcmtvcmNoaWQ6WzE1Myw1MCwyMDRdLGRhcmtyZWQ6WzEzOSwwLDBdLGRhcmtzYWxtb246WzIzMywxNTAsMTIyXSxkYXJrc2VhZ3JlZW46WzE0MywxODgsMTQzXSxkYXJrc2xhdGVibHVlOls3Miw2MSwxMzldLGRhcmtzbGF0ZWdyYXk6WzQ3LDc5LDc5XSxkYXJrc2xhdGVncmV5Ols0Nyw3OSw3OV0sZGFya3R1cnF1b2lzZTpbMCwyMDYsMjA5XSxkYXJrdmlvbGV0OlsxNDgsMCwyMTFdLGRlZXBwaW5rOlsyNTUsMjAsMTQ3XSxkZWVwc2t5Ymx1ZTpbMCwxOTEsMjU1XSxkaW1ncmF5OlsxMDUsMTA1LDEwNV0sZGltZ3JleTpbMTA1LDEwNSwxMDVdLGRvZGdlcmJsdWU6WzMwLDE0NCwyNTVdLGZpcmVicmljazpbMTc4LDM0LDM0XSxmbG9yYWx3aGl0ZTpbMjU1LDI1MCwyNDBdLGZvcmVzdGdyZWVuOlszNCwxMzksMzRdLGZ1Y2hzaWE6WzI1NSwwLDI1NV0sZ2FpbnNib3JvOlsyMjAsMjIwLDIyMF0sZ2hvc3R3aGl0ZTpbMjQ4LDI0OCwyNTVdLGdvbGQ6WzI1NSwyMTUsMF0sZ29sZGVucm9kOlsyMTgsMTY1LDMyXSxncmF5OlsxMjgsMTI4LDEyOF0sZ3JlZW46WzAsMTI4LDBdLGdyZWVueWVsbG93OlsxNzMsMjU1LDQ3XSxncmV5OlsxMjgsMTI4LDEyOF0saG9uZXlkZXc6WzI0MCwyNTUsMjQwXSxob3RwaW5rOlsyNTUsMTA1LDE4MF0saW5kaWFucmVkOlsyMDUsOTIsOTJdLGluZGlnbzpbNzUsMCwxMzBdLGl2b3J5OlsyNTUsMjU1LDI0MF0sa2hha2k6WzI0MCwyMzAsMTQwXSxsYXZlbmRlcjpbMjMwLDIzMCwyNTBdLGxhdmVuZGVyYmx1c2g6WzI1NSwyNDAsMjQ1XSxsYXduZ3JlZW46WzEyNCwyNTIsMF0sbGVtb25jaGlmZm9uOlsyNTUsMjUwLDIwNV0sbGlnaHRibHVlOlsxNzMsMjE2LDIzMF0sbGlnaHRjb3JhbDpbMjQwLDEyOCwxMjhdLGxpZ2h0Y3lhbjpbMjI0LDI1NSwyNTVdLGxpZ2h0Z29sZGVucm9keWVsbG93OlsyNTAsMjUwLDIxMF0sbGlnaHRncmF5OlsyMTEsMjExLDIxMV0sbGlnaHRncmVlbjpbMTQ0LDIzOCwxNDRdLGxpZ2h0Z3JleTpbMjExLDIxMSwyMTFdLGxpZ2h0cGluazpbMjU1LDE4MiwxOTNdLGxpZ2h0c2FsbW9uOlsyNTUsMTYwLDEyMl0sbGlnaHRzZWFncmVlbjpbMzIsMTc4LDE3MF0sbGlnaHRza3libHVlOlsxMzUsMjA2LDI1MF0sbGlnaHRzbGF0ZWdyYXk6WzExOSwxMzYsMTUzXSxsaWdodHNsYXRlZ3JleTpbMTE5LDEzNiwxNTNdLGxpZ2h0c3RlZWxibHVlOlsxNzYsMTk2LDIyMl0sbGlnaHR5ZWxsb3c6WzI1NSwyNTUsMjI0XSxsaW1lOlswLDI1NSwwXSxsaW1lZ3JlZW46WzUwLDIwNSw1MF0sbGluZW46WzI1MCwyNDAsMjMwXSxtYWdlbnRhOlsyNTUsMCwyNTVdLG1hcm9vbjpbMTI4LDAsMF0sbWVkaXVtYXF1YW1hcmluZTpbMTAyLDIwNSwxNzBdLG1lZGl1bWJsdWU6WzAsMCwyMDVdLG1lZGl1bW9yY2hpZDpbMTg2LDg1LDIxMV0sbWVkaXVtcHVycGxlOlsxNDcsMTEyLDIxOV0sbWVkaXVtc2VhZ3JlZW46WzYwLDE3OSwxMTNdLG1lZGl1bXNsYXRlYmx1ZTpbMTIzLDEwNCwyMzhdLG1lZGl1bXNwcmluZ2dyZWVuOlswLDI1MCwxNTRdLG1lZGl1bXR1cnF1b2lzZTpbNzIsMjA5LDIwNF0sbWVkaXVtdmlvbGV0cmVkOlsxOTksMjEsMTMzXSxtaWRuaWdodGJsdWU6WzI1LDI1LDExMl0sbWludGNyZWFtOlsyNDUsMjU1LDI1MF0sbWlzdHlyb3NlOlsyNTUsMjI4LDIyNV0sbW9jY2FzaW46WzI1NSwyMjgsMTgxXSxuYXZham93aGl0ZTpbMjU1LDIyMiwxNzNdLG5hdnk6WzAsMCwxMjhdLG9sZGxhY2U6WzI1MywyNDUsMjMwXSxvbGl2ZTpbMTI4LDEyOCwwXSxvbGl2ZWRyYWI6WzEwNywxNDIsMzVdLG9yYW5nZTpbMjU1LDE2NSwwXSxvcmFuZ2VyZWQ6WzI1NSw2OSwwXSxvcmNoaWQ6WzIxOCwxMTIsMjE0XSxwYWxlZ29sZGVucm9kOlsyMzgsMjMyLDE3MF0scGFsZWdyZWVuOlsxNTIsMjUxLDE1Ml0scGFsZXR1cnF1b2lzZTpbMTc1LDIzOCwyMzhdLHBhbGV2aW9sZXRyZWQ6WzIxOSwxMTIsMTQ3XSxwYXBheWF3aGlwOlsyNTUsMjM5LDIxM10scGVhY2hwdWZmOlsyNTUsMjE4LDE4NV0scGVydTpbMjA1LDEzMyw2M10scGluazpbMjU1LDE5MiwyMDNdLHBsdW06WzIyMSwxNjAsMjIxXSxwb3dkZXJibHVlOlsxNzYsMjI0LDIzMF0scHVycGxlOlsxMjgsMCwxMjhdLHJlYmVjY2FwdXJwbGU6WzEwMiw1MSwxNTNdLHJlZDpbMjU1LDAsMF0scm9zeWJyb3duOlsxODgsMTQzLDE0M10scm95YWxibHVlOls2NSwxMDUsMjI1XSxzYWRkbGVicm93bjpbMTM5LDY5LDE5XSxzYWxtb246WzI1MCwxMjgsMTE0XSxzYW5keWJyb3duOlsyNDQsMTY0LDk2XSxzZWFncmVlbjpbNDYsMTM5LDg3XSxzZWFzaGVsbDpbMjU1LDI0NSwyMzhdLHNpZW5uYTpbMTYwLDgyLDQ1XSxzaWx2ZXI6WzE5MiwxOTIsMTkyXSxza3libHVlOlsxMzUsMjA2LDIzNV0sc2xhdGVibHVlOlsxMDYsOTAsMjA1XSxzbGF0ZWdyYXk6WzExMiwxMjgsMTQ0XSxzbGF0ZWdyZXk6WzExMiwxMjgsMTQ0XSxzbm93OlsyNTUsMjUwLDI1MF0sc3ByaW5nZ3JlZW46WzAsMjU1LDEyN10sc3RlZWxibHVlOls3MCwxMzAsMTgwXSx0YW46WzIxMCwxODAsMTQwXSx0ZWFsOlswLDEyOCwxMjhdLHRoaXN0bGU6WzIxNiwxOTEsMjE2XSx0b21hdG86WzI1NSw5OSw3MV0sdHVycXVvaXNlOls2NCwyMjQsMjA4XSx2aW9sZXQ6WzIzOCwxMzAsMjM4XSx3aGVhdDpbMjQ1LDIyMiwxNzldLHdoaXRlOlsyNTUsMjU1LDI1NV0sd2hpdGVzbW9rZTpbMjQ1LDI0NSwyNDVdLHllbGxvdzpbMjU1LDI1NSwwXSx5ZWxsb3dncmVlbjpbMTU0LDIwNSw1MF19fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztkLmV4cG9ydHM9ZnVuY3Rpb24obil7dmFyIGE7cmV0dXJuIGUuY2FsbChuKT09PSJbb2JqZWN0IE9iamVjdF0iJiYoYT1PYmplY3QuZ2V0UHJvdG90eXBlT2YobiksYT09PW51bGx8fGE9PT1PYmplY3QuZ2V0UHJvdG90eXBlT2Yoe30pKX19LGZ1bmN0aW9uKGQscil7ZC5leHBvcnRzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDxhcmd1bWVudHMubGVuZ3RoO3QrKylpZihhcmd1bWVudHNbdF0hPT12b2lkIDApcmV0dXJuIGFyZ3VtZW50c1t0XX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDM4KTtkLmV4cG9ydHM9e25hbWU6ImhzbCIsbWluOlswLDAsMF0sbWF4OlszNjAsMTAwLDEwMF0sY2hhbm5lbDpbImh1ZSIsInNhdHVyYXRpb24iLCJsaWdodG5lc3MiXSxhbGlhczpbIkhTTCJdLHJnYjpmdW5jdGlvbihuKXt2YXIgYT1uWzBdLzM2MCxzPW5bMV0vMTAwLGk9blsyXS8xMDAsbyxjLG0sdSxwO2lmKHM9PT0wKXJldHVybiBwPWkqMjU1LFtwLHAscF07aTwuNT9jPWkqKDErcyk6Yz1pK3MtaSpzLG89MippLWMsdT1bMCwwLDBdO2Zvcih2YXIgeT0wO3k8Mzt5KyspbT1hKzEvMyotKHktMSksbTwwP20rKzptPjEmJm0tLSw2Km08MT9wPW8rKGMtbykqNiptOjIqbTwxP3A9YzozKm08Mj9wPW8rKGMtbykqKDIvMy1tKSo2OnA9byx1W3ldPXAqMjU1O3JldHVybiB1fX0sZS5oc2w9ZnVuY3Rpb24obil7dmFyIGE9blswXS8yNTUscz1uWzFdLzI1NSxpPW5bMl0vMjU1LG89TWF0aC5taW4oYSxzLGkpLGM9TWF0aC5tYXgoYSxzLGkpLG09Yy1vLHUscCx5O3JldHVybiBjPT09bz91PTA6YT09PWM/dT0ocy1pKS9tOnM9PT1jP3U9MisoaS1hKS9tOmk9PT1jJiYodT00KyhhLXMpL20pLHU9TWF0aC5taW4odSo2MCwzNjApLHU8MCYmKHUrPTM2MCkseT0obytjKS8yLGM9PT1vP3A9MDp5PD0uNT9wPW0vKGMrbyk6cD1tLygyLWMtbyksW3UscCoxMDAseSoxMDBdfX0sZnVuY3Rpb24oZCxyLHQpe2QuZXhwb3J0cz17bmFtZToicmdiIixtaW46WzAsMCwwXSxtYXg6WzI1NSwyNTUsMjU1XSxjaGFubmVsOlsicmVkIiwiZ3JlZW4iLCJibHVlIl0sYWxpYXM6WyJSR0IiXX19LGZ1bmN0aW9uKGQscil7ZC5leHBvcnRzPXQ7ZnVuY3Rpb24gdChlLG4sYSl7cmV0dXJuIG48YT9lPG4/bjplPmE/YTplOmU8YT9hOmU+bj9uOmV9fSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJkZWZhdWx0IixmdW5jdGlvbigpe3JldHVybiBofSk7dmFyIGU9dCg0MSksbj10Lm4oZSksYT10KDQyKSxzPXQubihhKSxpPXQoNDMpLG89dC5uKGkpLGM9dCg0NCksbT10KDQ2KSx1PXQubihtKSxwPXQoNTMpLHk9dCg1NSk7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2NvbnN0IE89U3ltYm9sKCJjb250b3VycyIpLHg9U3ltYm9sKCJwYXRoIiksdj1TeW1ib2woInNpbXBsaWZ5IiksVD1TeW1ib2woInNjYWxlIiksbD0yKk1hdGguUEk7Y2xhc3MgaHtjb25zdHJ1Y3RvcihnPXt9KXt0eXBlb2YgZz09InN0cmluZyImJihnPXtwYXRoOmd9KSxnLnBhdGg/dGhpc1t4XT1uKCkoZy5wYXRoKTp0aGlzW3hdPVtdLHRoaXNbT109bnVsbCx0aGlzW3ZdPWcuc2ltcGxpZnkhPW51bGw/Zy5zaW1wbGlmeTowLHRoaXNbVF09Zy5zY2FsZSE9bnVsbD9nLnNjYWxlOjJ9Z2V0IGNvbnRvdXJzKCl7bGV0IGc9bnVsbDtpZighdGhpc1tPXSYmdGhpc1t4XSl7Y29uc3QgTT1PYmplY3QoYy5kZWZhdWx0KShvKCkodGhpc1t4XSkpO3RoaXNbT109dSgpKE0sdGhpc1tUXSx0aGlzW3ZdKSx0aGlzW09dLnBhdGg9TSx0aGlzW09dLnNpbXBsaWZ5PXRoaXNbdl0sdGhpc1tPXS5zY2FsZT10aGlzW1RdfXJldHVybiB0aGlzW09dJiYoZz10aGlzW09dLm1hcChNPT5bLi4uTV0pLGcucGF0aD10aGlzW09dLnBhdGgsZy5zaW1wbGlmeT10aGlzW09dLnNpbXBsaWZ5LGcuc2NhbGU9dGhpc1tPXS5zY2FsZSksZ31nZXQgcGF0aCgpe3JldHVybiB0aGlzW3hdfWdldCBzaW1wbGlmeSgpe3JldHVybiB0aGlzW3ZdfWdldCBib3VuZGluZ0JveCgpe2NvbnN0IGc9dGhpcy5jb250b3VycztpZihnJiZnLmxlbmd0aCl7Y29uc3QgTT1nLnJlZHVjZSgoQSxDKT0+Wy4uLkEsLi4uQ10pO3JldHVybiBzKCkoTSl9cmV0dXJuW1swLDBdLFswLDBdXX1nZXQgYm91bmRpbmdDZW50ZXIoKXtjb25zdCBnPXRoaXMuYm91bmRpbmdCb3g7cmV0dXJuIGc/Wy41KihnWzBdWzBdK2dbMV1bMF0pLC41KihnWzBdWzFdK2dbMV1bMV0pXTpbMCwwXX1ub3JtYWxpemUoZz0wLE09MCl7Y29uc3QgQT1PYmplY3QoYy5kZWZhdWx0KShvKCkodGhpc1t4XSkpLm1hcCgoW0MsLi4uYl0pPT57Y29uc3QgRT1bQ107Zm9yKGxldCBMPTA7TDxiLmxlbmd0aDtMKz0yKXtjb25zdCBEPWJbTF0tZyxJPWJbTCsxXS1NO0UucHVzaChELEkpfXJldHVybiBFfSk7cmV0dXJuIHRoaXMuYmVnaW5QYXRoKCksdGhpc1t4XS5wdXNoKC4uLkEpLHRoaXN9Z2V0UG9pbnRBdExlbmd0aChnKXtyZXR1cm4gdGhpcy5jb250b3Vycz9PYmplY3QocC5nZXRQb2ludEF0TGVuZ3RoKSh0aGlzW09dLGcpOm51bGx9Z2V0VG90YWxMZW5ndGgoKXtyZXR1cm4gdGhpcy5jb250b3Vycz9PYmplY3QocC5nZXRUb3RhbExlbmd0aCkodGhpc1tPXSk6MH1hZGRQYXRoKGcpe3RoaXNbT109bnVsbCx0eXBlb2YgZz09InN0cmluZyImJihnPW4oKShnKSksdGhpc1t4XS5wdXNoKC4uLmcpfWJlZ2luUGF0aCgpe3RoaXNbeF09W10sdGhpc1tPXT1udWxsfWNsZWFyKCl7dGhpcy5iZWdpblBhdGgoKX1lbGxpcHNlKGcsTSxBLEMsYixFLEwsRD0wKXtpZihFKz1iLEwrPWIsQTw9MHx8Qzw9MHx8TD09PUUpcmV0dXJuO0w8RSYmKEw9RStsKyhMLUUpJWwpLEwtRT5sJiYoTD1FK2wpO2NvbnN0IEk9TC1FO0k+PWwmJihMLT0uMDAxKTtsZXQgUj10aGlzW3hdLmxlbmd0aD4wJiZJPGw/IkwiOiJNIjtjb25zdCBCPU9iamVjdCh5LmdldFBvaW50KShnLE0sQSxDLEUpLHo9T2JqZWN0KHkuZ2V0UG9pbnQpKGcsTSxBLEMsTCksSz0rIUQ7bGV0IFE9ST5NYXRoLlBJPzE6MDtEJiYoUT0xLVEpLFIrPUIuam9pbigiICIpLFIrPWBBJHtBfSAke0N9IDAgJHtRfSAke0t9ICR7ei5qb2luKCIgIil9YCxJPj1sJiYoUis9IloiKSx0aGlzLmFkZFBhdGgoUil9YXJjKGcsTSxBLEMsYixFPTApe3JldHVybiB0aGlzLmVsbGlwc2UoZyxNLEEsQSwwLEMsYixFKX1hcmNUbyhnLE0sQSxDLGIsRSxMKXt0aGlzW09dPW51bGwsdGhpc1t4XS5wdXNoKFsiQSIsZyxNLEEsQyxiLEUsTF0pfW1vdmVUbyhnLE0pe3RoaXNbT109bnVsbCx0aGlzW3hdLnB1c2goWyJNIixnLE1dKX1saW5lVG8oZyxNKXt0aGlzW09dPW51bGwsdGhpc1t4XS5wdXNoKFsiTCIsZyxNXSl9YmV6aWVyQ3VydmVUbyhnLE0sQSxDLGIsRSl7dGhpc1tPXT1udWxsLHRoaXNbeF0ucHVzaChbIkMiLGcsTSxBLEMsYixFXSl9cXVhZHJhdGljQ3VydmVUbyhnLE0sQSxDKXt0aGlzW09dPW51bGwsdGhpc1t4XS5wdXNoKFsiUSIsZyxNLEEsQ10pfXJlY3QoZyxNLEEsQyl7Y29uc3QgYj1gTSR7Z30gJHtNfUwke2crQX0gJHtNfUwke2crQX0gJHtNK0N9TCR7Z30gJHtNK0N9WmA7dGhpcy5hZGRQYXRoKGIpfWNsb3NlUGF0aCgpe3RoaXNbT109bnVsbDtsZXQgZz1bXTtjb25zdCBNPXRoaXNbeF0ubGVuZ3RoO00+MCYmKGc9dGhpc1t4XVtNLTFdKSxnWzBdIT09IloiJiZnWzBdIT09InoiJiZ0aGlzW3hdLnB1c2goWyJaIl0pfX19LGZ1bmN0aW9uKGQscil7ZC5leHBvcnRzPW47dmFyIHQ9e2E6NyxjOjYsaDoxLGw6MixtOjIscTo0LHM6NCx0OjIsdjoxLHo6MH0sZT0vKFthc3R2enFtaGxjXSkoW15hc3R2enFtaGxjXSopL2lnO2Z1bmN0aW9uIG4oaSl7dmFyIG89W107cmV0dXJuIGkucmVwbGFjZShlLGZ1bmN0aW9uKGMsbSx1KXt2YXIgcD1tLnRvTG93ZXJDYXNlKCk7Zm9yKHU9cyh1KSxwPT0ibSImJnUubGVuZ3RoPjImJihvLnB1c2goW21dLmNvbmNhdCh1LnNwbGljZSgwLDIpKSkscD0ibCIsbT1tPT0ibSI/ImwiOiJMIik7Oyl7aWYodS5sZW5ndGg9PXRbcF0pcmV0dXJuIHUudW5zaGlmdChtKSxvLnB1c2godSk7aWYodS5sZW5ndGg8dFtwXSl0aHJvdyBuZXcgRXJyb3IoIm1hbGZvcm1lZCBwYXRoIGRhdGEiKTtvLnB1c2goW21dLmNvbmNhdCh1LnNwbGljZSgwLHRbcF0pKSl9fSksb312YXIgYT0vLT9bMC05XSpcLj9bMC05XSsoPzplWy0rXT9cZCspPy9pZztmdW5jdGlvbiBzKGkpe3ZhciBvPWkubWF0Y2goYSk7cmV0dXJuIG8/by5tYXAoTnVtYmVyKTpbXX19LGZ1bmN0aW9uKGQscix0KXtkLmV4cG9ydHM9ZTtmdW5jdGlvbiBlKG4pe3ZhciBhPW4ubGVuZ3RoO2lmKGE9PT0wKXJldHVybltbXSxbXV07Zm9yKHZhciBzPW5bMF0ubGVuZ3RoLGk9blswXS5zbGljZSgpLG89blswXS5zbGljZSgpLGM9MTtjPGE7KytjKWZvcih2YXIgbT1uW2NdLHU9MDt1PHM7Kyt1KXt2YXIgcD1tW3VdO2lbdV09TWF0aC5taW4oaVt1XSxwKSxvW3VdPU1hdGgubWF4KG9bdV0scCl9cmV0dXJuW2ksb119fSxmdW5jdGlvbihkLHIpe2QuZXhwb3J0cz10O2Z1bmN0aW9uIHQoZSl7dmFyIG49MCxhPTAscz0wLGk9MDtyZXR1cm4gZS5tYXAoZnVuY3Rpb24obyl7bz1vLnNsaWNlKCk7dmFyIGM9b1swXSxtPWMudG9VcHBlckNhc2UoKTtpZihjIT1tKXN3aXRjaChvWzBdPW0sYyl7Y2FzZSJhIjpvWzZdKz1zLG9bN10rPWk7YnJlYWs7Y2FzZSJ2IjpvWzFdKz1pO2JyZWFrO2Nhc2UiaCI6b1sxXSs9czticmVhaztkZWZhdWx0OmZvcih2YXIgdT0xO3U8by5sZW5ndGg7KW9bdSsrXSs9cyxvW3UrK10rPWl9c3dpdGNoKG0pe2Nhc2UiWiI6cz1uLGk9YTticmVhaztjYXNlIkgiOnM9b1sxXTticmVhaztjYXNlIlYiOmk9b1sxXTticmVhaztjYXNlIk0iOnM9bj1vWzFdLGk9YT1vWzJdO2JyZWFrO2RlZmF1bHQ6cz1vW28ubGVuZ3RoLTJdLGk9b1tvLmxlbmd0aC0xXX1yZXR1cm4gb30pfX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gbn0pO3ZhciBlPXQoNDUpO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtmdW5jdGlvbiBuKGkpe2Zvcih2YXIgbyxjPVtdLG09MCx1PTAscD0wLHk9MCxPPW51bGwseD1udWxsLHY9MCxUPTAsbD0wLGg9aS5sZW5ndGg7bDxoO2wrKyl7dmFyIGY9aVtsXSxnPWZbMF07c3dpdGNoKGcpe2Nhc2UiTSI6cD1mWzFdLHk9ZlsyXTticmVhaztjYXNlIkEiOnZhciBNPU9iamVjdChlLmRlZmF1bHQpKHYsVCxmWzZdLGZbN10sZls0XSxmWzVdLGZbMV0sZlsyXSxmWzNdKTtpZighTS5sZW5ndGgpY29udGludWU7TT1NLm1hcChMPT57Y29uc3RbRCxJLFIsQix6LEssUSxfXT1MO3JldHVybnt4MTpSLHkxOkIseDI6eix5MjpLLHg6USx5Ol99fSk7Zm9yKHZhciBBPTAsQztBPE0ubGVuZ3RoO0ErKylDPU1bQV0sZj1bIkMiLEMueDEsQy55MSxDLngyLEMueTIsQy54LEMueV0sQTxNLmxlbmd0aC0xJiZjLnB1c2goZik7YnJlYWs7Y2FzZSJTIjp2YXIgYj12LEU9VDsobz09IkMifHxvPT0iUyIpJiYoYis9Yi1tLEUrPUUtdSksZj1bIkMiLGIsRSxmWzFdLGZbMl0sZlszXSxmWzRdXTticmVhaztjYXNlIlQiOm89PSJRInx8bz09IlQiPyhPPXYqMi1PLHg9VCoyLXgpOihPPXYseD1UKSxmPXModixULE8seCxmWzFdLGZbMl0pO2JyZWFrO2Nhc2UiUSI6Tz1mWzFdLHg9ZlsyXSxmPXModixULGZbMV0sZlsyXSxmWzNdLGZbNF0pO2JyZWFrO2Nhc2UiTCI6Zj1hKHYsVCxmWzFdLGZbMl0pO2JyZWFrO2Nhc2UiSCI6Zj1hKHYsVCxmWzFdLFQpO2JyZWFrO2Nhc2UiViI6Zj1hKHYsVCx2LGZbMV0pO2JyZWFrO2Nhc2UiWiI6Zj1hKHYsVCxwLHkpO2JyZWFrfW89Zyx2PWZbZi5sZW5ndGgtMl0sVD1mW2YubGVuZ3RoLTFdLGYubGVuZ3RoPjQ/KG09ZltmLmxlbmd0aC00XSx1PWZbZi5sZW5ndGgtM10pOihtPXYsdT1UKSxjLnB1c2goZil9cmV0dXJuIGN9ZnVuY3Rpb24gYShpLG8sYyxtKXtyZXR1cm5bIkMiLGksbyxjLG0sYyxtXX1mdW5jdGlvbiBzKGksbyxjLG0sdSxwKXtyZXR1cm5bIkMiLGkvMysyLzMqYyxvLzMrMi8zKm0sdS8zKzIvMypjLHAvMysyLzMqbSx1LHBdfX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pLHQoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtjb25zdCBlPU1hdGguUEkqMjtmdW5jdGlvbiBuKG8sYyxtLHUpe2NvbnN0IHA9byp1LWMqbTwwPy0xOjE7bGV0IHk9byptK2MqdTtyZXR1cm4geT4xJiYoeT0xKSx5PC0xJiYoeT0tMSkscCpNYXRoLmFjb3MoeSl9ZnVuY3Rpb24gYShvLGMsbSx1LHAseSxPLHgsdixUKXtjb25zdCBsPVQqKG8tbSkvMit2KihjLXUpLzIsaD0tdiooby1tKS8yK1QqKGMtdSkvMixmPU8qTyxnPXgqeCxNPWwqbCxBPWgqaDtsZXQgQz1mKmctZipBLWcqTTtDPDAmJihDPTApLEMvPWYqQStnKk0sQz1NYXRoLnNxcnQoQykqKHA9PT15Py0xOjEpO2NvbnN0IGI9QypPL3gqaCxFPUMqLXgvTypsLEw9VCpiLXYqRSsobyttKS8yLEQ9dipiK1QqRSsoYyt1KS8yLEk9KGwtYikvTyxSPShoLUUpL3gsQj0oLWwtYikvTyx6PSgtaC1FKS94LEs9bigxLDAsSSxSKTtsZXQgUT1uKEksUixCLHopO3JldHVybiB5PT09MCYmUT4wJiYoUS09ZSkseT09PTEmJlE8MCYmKFErPWUpLFtMLEQsSyxRXX1mdW5jdGlvbiBzKG8sYyl7Y29uc3QgbT0xLjMzMzMzMzMzMzMzMzMzMzMqTWF0aC50YW4oYy80KSx1PU1hdGguY29zKG8pLHA9TWF0aC5zaW4obykseT1NYXRoLmNvcyhvK2MpLE89TWF0aC5zaW4obytjKTtyZXR1cm5bdSxwLHUtcCptLHArdSptLHkrTyptLE8teSptLHksT119ZnVuY3Rpb24gaShvLGMsbSx1LHAseSxPLHgsdil7Y29uc3QgVD1NYXRoLnNpbih2KmUvMzYwKSxsPU1hdGguY29zKHYqZS8zNjApLGg9bCooby1tKS8yK1QqKGMtdSkvMixmPS1UKihvLW0pLzIrbCooYy11KS8yO2lmKGg9PT0wJiZmPT09MClyZXR1cm5bXTtpZihPPT09MHx8eD09PTApcmV0dXJuW107Tz1NYXRoLmFicyhPKSx4PU1hdGguYWJzKHgpO2NvbnN0IGc9aCpoLyhPKk8pK2YqZi8oeCp4KTtnPjEmJihPKj1NYXRoLnNxcnQoZykseCo9TWF0aC5zcXJ0KGcpKTtjb25zdCBNPWEobyxjLG0sdSxwLHksTyx4LFQsbCksQT1bXTtsZXQgQz1NWzJdLGI9TVszXTtjb25zdCBFPU1hdGgubWF4KE1hdGguY2VpbChNYXRoLmFicyhiKS8oZS80KSksMSk7Yi89RTtmb3IobGV0IEw9MDtMPEU7TCsrKUEucHVzaChzKEMsYikpLEMrPWI7cmV0dXJuIEEubWFwKEw9Pntmb3IobGV0IEQ9MDtEPEwubGVuZ3RoO0QrPTIpe2xldCBJPUxbRCswXSxSPUxbRCsxXTtJKj1PLFIqPXg7Y29uc3QgQj1sKkktVCpSLHo9VCpJK2wqUjtMW0QrMF09QitNWzBdLExbRCsxXT16K01bMV19cmV0dXJuIEx9KX19LGZ1bmN0aW9uKGQscix0KXt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7dmFyIGU9dCg0Nykse2NvcHk6bn09dCg0OSksYT10KDUwKTtmdW5jdGlvbiBzKHUscCx5KXtyZXR1cm4gdVswXT1wLHVbMV09eSx1fXZhciBpPVswLDBdLG89WzAsMF0sYz1bMCwwXTtmdW5jdGlvbiBtKHUscCx5LE8pe2UoeSxzKGksT1sxXSxPWzJdKSxzKG8sT1szXSxPWzRdKSxzKGMsT1s1XSxPWzZdKSxwLHUpfWQuZXhwb3J0cz1mdW5jdGlvbihwLHksTyl7dmFyIHg9W10sdj1bXSxUPVswLDBdO3JldHVybiBwLmZvckVhY2goZnVuY3Rpb24obCxoLGYpe2lmKGxbMF09PT0iTSIpbihULGwuc2xpY2UoMSkpLHYubGVuZ3RoPjAmJih4LnB1c2godiksdj1bXSk7ZWxzZSBpZihsWzBdPT09IkMiKW0odix5LFQsbCkscyhULGxbNV0sbFs2XSk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgdHlwZSBpbiBTVkc6ICIrbFswXSl9KSx2Lmxlbmd0aD4wJiZ4LnB1c2godikseC5tYXAoZnVuY3Rpb24obCl7cmV0dXJuIGEobCxPfHwwKX0pfX0sZnVuY3Rpb24oZCxyLHQpe2QuZXhwb3J0cz10KDQ4KSgpfSxmdW5jdGlvbihkLHIpe2Z1bmN0aW9uIHQobil7cmV0dXJuW25bMF0sblsxXV19ZnVuY3Rpb24gZShuLGEpe3JldHVybltuLGFdfWQuZXhwb3J0cz1mdW5jdGlvbihhKXthPWF8fHt9O3ZhciBzPXR5cGVvZiBhLnJlY3Vyc2lvbj09Im51bWJlciI/YS5yZWN1cnNpb246OCxpPXR5cGVvZiBhLmVwc2lsb249PSJudW1iZXIiP2EuZXBzaWxvbjoxMTkyMDkyOWUtMTQsbz10eXBlb2YgYS5wYXRoRXBzaWxvbj09Im51bWJlciI/YS5wYXRoRXBzaWxvbjoxLGM9dHlwZW9mIGEuYW5nbGVFcHNpbG9uPT0ibnVtYmVyIj9hLmFuZ2xlRXBzaWxvbjouMDEsbT1hLmFuZ2xlVG9sZXJhbmNlfHwwLHU9YS5jdXNwTGltaXR8fDA7cmV0dXJuIGZ1bmN0aW9uKHgsdixULGwsaCxmKXtmfHwoZj1bXSksaD10eXBlb2YgaD09Im51bWJlciI/aDoxO3ZhciBnPW8vaDtyZXR1cm4gZyo9ZyxwKHgsdixULGwsZixnKSxmfTtmdW5jdGlvbiBwKE8seCx2LFQsbCxoKXtsLnB1c2godChPKSk7dmFyIGY9T1swXSxnPU9bMV0sTT14WzBdLEE9eFsxXSxDPXZbMF0sYj12WzFdLEU9VFswXSxMPVRbMV07eShmLGcsTSxBLEMsYixFLEwsbCxoLDApLGwucHVzaCh0KFQpKX1mdW5jdGlvbiB5KE8seCx2LFQsbCxoLGYsZyxNLEEsQyl7aWYoIShDPnMpKXt2YXIgYj1NYXRoLlBJLEU9KE8rdikvMixMPSh4K1QpLzIsRD0oditsKS8yLEk9KFQraCkvMixSPShsK2YpLzIsQj0oaCtnKS8yLHo9KEUrRCkvMixLPShMK0kpLzIsUT0oRCtSKS8yLF89KEkrQikvMixqPSh6K1EpLzIsRz0oSytfKS8yO2lmKEM+MCl7dmFyIFg9Zi1PLFo9Zy14LHR0PU1hdGguYWJzKCh2LWYpKlotKFQtZykqWCksbnQ9TWF0aC5hYnMoKGwtZikqWi0oaC1nKSpYKSxxLGR0O2lmKHR0PmkmJm50Pmkpe2lmKCh0dCtudCkqKHR0K250KTw9QSooWCpYK1oqWikpe2lmKG08Yyl7TS5wdXNoKGUoaixHKSk7cmV0dXJufXZhciB1dD1NYXRoLmF0YW4yKGgtVCxsLXYpO2lmKHE9TWF0aC5hYnModXQtTWF0aC5hdGFuMihULXgsdi1PKSksZHQ9TWF0aC5hYnMoTWF0aC5hdGFuMihnLWgsZi1sKS11dCkscT49YiYmKHE9MipiLXEpLGR0Pj1iJiYoZHQ9MipiLWR0KSxxK2R0PG0pe00ucHVzaChlKGosRykpO3JldHVybn1pZih1IT09MCl7aWYocT51KXtNLnB1c2goZSh2LFQpKTtyZXR1cm59aWYoZHQ+dSl7TS5wdXNoKGUobCxoKSk7cmV0dXJufX19fWVsc2UgaWYodHQ+aSl7aWYodHQqdHQ8PUEqKFgqWCtaKlopKXtpZihtPGMpe00ucHVzaChlKGosRykpO3JldHVybn1pZihxPU1hdGguYWJzKE1hdGguYXRhbjIoaC1ULGwtdiktTWF0aC5hdGFuMihULXgsdi1PKSkscT49YiYmKHE9MipiLXEpLHE8bSl7TS5wdXNoKGUodixUKSksTS5wdXNoKGUobCxoKSk7cmV0dXJufWlmKHUhPT0wJiZxPnUpe00ucHVzaChlKHYsVCkpO3JldHVybn19fWVsc2UgaWYobnQ+aSl7aWYobnQqbnQ8PUEqKFgqWCtaKlopKXtpZihtPGMpe00ucHVzaChlKGosRykpO3JldHVybn1pZihxPU1hdGguYWJzKE1hdGguYXRhbjIoZy1oLGYtbCktTWF0aC5hdGFuMihoLVQsbC12KSkscT49YiYmKHE9MipiLXEpLHE8bSl7TS5wdXNoKGUodixUKSksTS5wdXNoKGUobCxoKSk7cmV0dXJufWlmKHUhPT0wJiZxPnUpe00ucHVzaChlKGwsaCkpO3JldHVybn19fWVsc2UgaWYoWD1qLShPK2YpLzIsWj1HLSh4K2cpLzIsWCpYK1oqWjw9QSl7TS5wdXNoKGUoaixHKSk7cmV0dXJufX15KE8seCxFLEwseixLLGosRyxNLEEsQysxKSx5KGosRyxRLF8sUixCLGYsZyxNLEEsQysxKX19fX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiY3JlYXRlIixmdW5jdGlvbigpe3JldHVybiBhfSksdC5kKHIsImNsb25lIixmdW5jdGlvbigpe3JldHVybiBufSksdC5kKHIsImNvcHkiLGZ1bmN0aW9uKCl7cmV0dXJuIHN9KSx0LmQociwic2NhbGVBbmRBZGQiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KSx0LmQociwiZG90IixmdW5jdGlvbigpe3JldHVybiBvfSksdC5kKHIsInJvdGF0ZSIsZnVuY3Rpb24oKXtyZXR1cm4gY30pLHQuZChyLCJjcm9zcyIsZnVuY3Rpb24oKXtyZXR1cm4gbX0pLHQuZChyLCJzdWIiLGZ1bmN0aW9uKCl7cmV0dXJuIHV9KSx0LmQociwiYWRkIixmdW5jdGlvbigpe3JldHVybiBwfSksdC5kKHIsImNvbXB1dGVNaXRlciIsZnVuY3Rpb24oKXtyZXR1cm4gdn0pLHQuZChyLCJub3JtYWwiLGZ1bmN0aW9uKCl7cmV0dXJuIFR9KSx0LmQociwiZGlyZWN0aW9uIixmdW5jdGlvbigpe3JldHVybiBsfSk7dmFyIGU9dCgxKTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7ZnVuY3Rpb24gbihoKXtyZXR1cm5baFswXSxoWzFdXX1mdW5jdGlvbiBhKCl7cmV0dXJuWzAsMF19Y29uc3Qgcz1lLnZlYzIuY29weSxpPWUudmVjMi5zY2FsZUFuZEFkZCxvPWUudmVjMi5kb3QsYz1lLnZlYzIucm90YXRlLG09ZS52ZWMyLmNyb3NzLHU9ZS52ZWMyLnN1YixwPWUudmVjMi5hZGQseT1lLnZlYzIubm9ybWFsaXplLE89ZS52ZWMyLnNldCx4PWEoKTtmdW5jdGlvbiB2KGgsZixnLE0sQSl7cChoLGcsTSkseShoLGgpLE8oZiwtaFsxXSxoWzBdKSxPKHgsLWdbMV0sZ1swXSk7Y29uc3QgQz1BL28oZix4KTtyZXR1cm4gTWF0aC5hYnMoQyl9ZnVuY3Rpb24gVChoLGYpe3JldHVybiBPKGgsLWZbMV0sZlswXSksaH1mdW5jdGlvbiBsKGgsZixnKXtyZXR1cm4gdShoLGYsZykseShoLGgpLGh9fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg1MSksbj10KDUyKTtkLmV4cG9ydHM9ZnVuY3Rpb24ocyxpKXtyZXR1cm4gcz1lKHMsaSkscz1uKHMsaSksc30sZC5leHBvcnRzLnJhZGlhbERpc3RhbmNlPWUsZC5leHBvcnRzLmRvdWdsYXNQZXVja2VyPW59LGZ1bmN0aW9uKGQscil7ZnVuY3Rpb24gdChlLG4pe3ZhciBhPWVbMF0tblswXSxzPWVbMV0tblsxXTtyZXR1cm4gYSphK3Mqc31kLmV4cG9ydHM9ZnVuY3Rpb24obixhKXtpZihuLmxlbmd0aDw9MSlyZXR1cm4gbjthPXR5cGVvZiBhPT0ibnVtYmVyIj9hOjE7Zm9yKHZhciBzPWEqYSxpPW5bMF0sbz1baV0sYyxtPTEsdT1uLmxlbmd0aDttPHU7bSsrKWM9blttXSx0KGMsaSk+cyYmKG8ucHVzaChjKSxpPWMpO3JldHVybiBpIT09YyYmby5wdXNoKGMpLG99fSxmdW5jdGlvbihkLHIpe2Z1bmN0aW9uIHQobixhLHMpe3ZhciBpPWFbMF0sbz1hWzFdLGM9c1swXS1pLG09c1sxXS1vO2lmKGMhPT0wfHxtIT09MCl7dmFyIHU9KChuWzBdLWkpKmMrKG5bMV0tbykqbSkvKGMqYyttKm0pO3U+MT8oaT1zWzBdLG89c1sxXSk6dT4wJiYoaSs9Yyp1LG8rPW0qdSl9cmV0dXJuIGM9blswXS1pLG09blsxXS1vLGMqYyttKm19ZnVuY3Rpb24gZShuLGEscyxpLG8pe2Zvcih2YXIgYz1pLG0sdT1hKzE7dTxzO3UrKyl7dmFyIHA9dChuW3VdLG5bYV0sbltzXSk7cD5jJiYobT11LGM9cCl9Yz5pJiYobS1hPjEmJmUobixhLG0saSxvKSxvLnB1c2goblttXSkscy1tPjEmJmUobixtLHMsaSxvKSl9ZC5leHBvcnRzPWZ1bmN0aW9uKGEscyl7aWYoYS5sZW5ndGg8PTEpcmV0dXJuIGE7cz10eXBlb2Ygcz09Im51bWJlciI/czoxO3ZhciBpPXMqcyxvPWEubGVuZ3RoLTEsYz1bYVswXV07cmV0dXJuIGUoYSwwLG8saSxjKSxjLnB1c2goYVtvXSksY319LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImdldFRvdGFsTGVuZ3RoIixmdW5jdGlvbigpe3JldHVybiBufSksdC5kKHIsImdldFBvaW50QXRMZW5ndGgiLGZ1bmN0aW9uKCl7cmV0dXJuIHN9KSx0LmQociwiZ2V0RGFzaENvbnRvdXJzIixmdW5jdGlvbigpe3JldHVybiBpfSk7dmFyIGU9dCg1NCk7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2Z1bmN0aW9uIG4obyl7aWYoby50b3RhbExlbmd0aCE9bnVsbClyZXR1cm4gby50b3RhbExlbmd0aDtsZXQgYz0wO3JldHVybiBvLmZvckVhY2gobT0+e2xldCB1PW1bMF07Zm9yKGxldCBwPTE7cDxtLmxlbmd0aDtwKyspe2NvbnN0IHk9bVtwXTtjKz1PYmplY3QoZS5kaXN0YW5jZSkodSx5KSx1PXl9fSksby50b3RhbExlbmd0aD1jLGN9ZnVuY3Rpb24gYShvLGMsbT0hMCl7aWYoYz1OdW1iZXIoYyksIU51bWJlci5pc0Zpbml0ZShjKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJGYWlsZWQgdG8gZXhlY3V0ZSAnZ2V0UG9pbnRBdExlbmd0aCcgb24gZmlndXJlOiBUaGUgcHJvdmlkZWQgZmxvYXQgdmFsdWUgaXMgbm9uLWZpbml0ZS4iKTtpZihjPD0wKXRocm93IG5ldyBUeXBlRXJyb3IoIkxlbmd0aCBtdXN0ID4gMCIpO2NvbnN0IHU9bihvKTtpZihjPj11KXtjb25zdCB5PW9bby5sZW5ndGgtMV0sTz15W3kubGVuZ3RoLTJdLHg9eVt5Lmxlbmd0aC0xXSx2PU1hdGguYXRhbjIoeFsxXS1PWzFdLHhbMF0tT1swXSk7cmV0dXJue2N1cnJlbnQ6by5tYXAoVD0+Wy4uLlRdKSxwb2ludDp7eDp4WzBdLHk6eFsxXSxhbmdsZTp2fX19Y29uc3QgcD1bXTtmb3IobGV0IHk9MDt5PG8ubGVuZ3RoO3krKyl7cFt5XT1bXTtjb25zdCBPPW9beV07bGV0IHg9T1swXTtmb3IobGV0IHY9MTt2PE8ubGVuZ3RoO3YrKyl7Y29uc3QgVD1PW3ZdLGw9T2JqZWN0KGUuZGlzdGFuY2UpKHgsVCk7aWYoYzxsKXtjb25zdCBoPWMvbCxmPU1hdGguYXRhbjIoVFsxXS14WzFdLFRbMF0teFswXSksZz17eDp4WzBdKigxLWgpK1RbMF0qaCx5OnhbMV0qKDEtaCkrVFsxXSpoLGFuZ2xlOmZ9O2lmKHBbeV0ucHVzaCh4KSxjPjAmJnBbeV0ucHVzaChbZy54LGcueV0pLCFtKXJldHVybntjdXJyZW50OnAscG9pbnQ6Z307Y29uc3QgTT1bXSxBPXk7Zm9yKDt5PG8ubGVuZ3RoO3krKyl7Zm9yKE1beS1BXT1bXSx5PT09QSYmTVswXS5wdXNoKFtnLngsZy55XSk7djxPLmxlbmd0aDt2KyspTVt5LUFdLnB1c2goT1t2XSk7dj0wfXJldHVybntjdXJyZW50OnAscG9pbnQ6ZyxyZXN0Ok19fWMtPWwscFt5XS5wdXNoKHgpLHg9VH19fWZ1bmN0aW9uIHMobyxjKXtpZihjPU51bWJlcihjKSwhTnVtYmVyLmlzRmluaXRlKGMpKXRocm93IG5ldyBUeXBlRXJyb3IoIkZhaWxlZCB0byBleGVjdXRlICdnZXRQb2ludEF0TGVuZ3RoJyBvbiBmaWd1cmU6IFRoZSBwcm92aWRlZCBmbG9hdCB2YWx1ZSBpcyBub24tZmluaXRlLiIpO2lmKG8ubGVuZ3RoPD0wKXJldHVybnt4OjAseTowLGFuZ2xlOjB9O2lmKGM8PTApe2NvbnN0IG09b1swXVswXSx1PW9bMF1bMV0scD1NYXRoLmF0YW4yKHVbMV0tbVsxXSx1WzBdLW1bMF0pO3JldHVybnt4Om1bMF0seTptWzFdLGFuZ2xlOnB9fXJldHVybiBhKG8sYywhMSkucG9pbnR9ZnVuY3Rpb24gaShvLGMsbSl7bGV0IHU9MCxwPWNbMF0seT1vO2NvbnN0IE89W10seD1jLmxlbmd0aDtpZihtPjApe2RvIG0tPWNbdSV4XSx1Kys7d2hpbGUobT4wKTttPDAmJihwPS1tLHUtLSl9ZWxzZSBpZihtPDApe3U9LTE7ZG8gbSs9Y1t1JXgreC0xXSx1LS07d2hpbGUobTwwKTttPj0wJiYodSsrLHA9Y1t1JXgreC0xXS1tKX1kb3tjb25zdCB2PWEoeSxwKTt5PXYucmVzdCwrK3UlMiYmTy5wdXNoKC4uLnYuY3VycmVudCk7bGV0IFQ9dSV4O1Q8MCYmKFQrPXgpLHA9Y1tUXX13aGlsZSh5KTtyZXR1cm4gT319LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsIm5vcm1hbGl6ZSIsZnVuY3Rpb24oKXtyZXR1cm4gZX0pLHQuZChyLCJkaXN0YW5jZSIsZnVuY3Rpb24oKXtyZXR1cm4gbn0pLHQoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtmdW5jdGlvbiBlKFthLHMsaV0sbyxjLG0pe3JldHVybiBhPWEqMi9vLTEscz0xLXMqMi9jLE51bWJlci5pc0Zpbml0ZShtKT8oaT1pKjIvbS0xLFthLHMsaV0pOlthLHNdfWZ1bmN0aW9uIG4oW2EscyxpPTBdLFtvLGMsbT0wXSl7cmV0dXJuIE1hdGguaHlwb3Qoby1hLGMtcyxtLWkpfX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZ2V0UG9pbnQiLGZ1bmN0aW9uKCl7cmV0dXJuIG59KSx0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7Y29uc3QgZT1NYXRoLlBJKjI7ZnVuY3Rpb24gbihhLHMsaSxvLGMpe2MlPWUsYzwwJiYoYys9ZSk7Y29uc3QgbT1NYXRoLnRhbihjKTtpZihNYXRoLmFicyhtKTwxZTUpe2NvbnN0IHU9cy1tKmEscD0xL2kqKjIrbSoqMi9vKioyO2xldCB5PS0xOyhjPD1NYXRoLlBJLzJ8fGM+MypNYXRoLlBJLzIpJiYoeT0xKTtjb25zdCBPPXkqTWF0aC5zcXJ0KDEvcCkrYSx4PW0qTyt1O3JldHVybltPLHhdfXJldHVybiBjPE1hdGguUEk/W2EscytvXTpbYSxzLW9dfX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gVn0pO3ZhciBlPXQoMSksbj10KDQyKSxhPXQubihuKSxzPXQoNTcpLGk9dCgyOCksbz10KDI0KSxjPXQoMzApLG09dCg1OSksdT10KDUzKSxwPXQoNjApLHk9dC5uKHApLE89dCg0NikseD10Lm4oTyksdj10KDMxKSxUPXQoNDApLGw9dCgyMSk7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2Z1bmN0aW9uIGgoSixOKXtpZihKPT1udWxsKXJldHVybnt9O3ZhciAkPWYoSixOKSxTLFA7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHc9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhKKTtmb3IoUD0wO1A8dy5sZW5ndGg7UCsrKVM9d1tQXSwhKE4uaW5kZXhPZihTKT49MCkmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChKLFMpJiYoJFtTXT1KW1NdKX1yZXR1cm4gJH1mdW5jdGlvbiBmKEosTil7aWYoSj09bnVsbClyZXR1cm57fTt2YXIgJD17fSxTPU9iamVjdC5rZXlzKEopLFAsdztmb3Iodz0wO3c8Uy5sZW5ndGg7dysrKVA9U1t3XSwhKE4uaW5kZXhPZihQKT49MCkmJigkW1BdPUpbUF0pO3JldHVybiAkfWNvbnN0IGc9U3ltYm9sKCJtZXNoIiksTT1TeW1ib2woImNvbnRvdXJzIiksQT1TeW1ib2woInN0cm9rZSIpLEM9U3ltYm9sKCJmaWxsIiksYj1TeW1ib2woInN0cm9rZUNvbG9yIiksRT1TeW1ib2woImZpbGxDb2xvciIpLEw9U3ltYm9sKCJ0cmFuc2Zvcm0iKSxEPVN5bWJvbCgiaW52ZXJ0VHJhbnNmb3JtIiksST1TeW1ib2woInVuaWZvcm1zIiksUj1TeW1ib2woInRleE9wdGlvbnMiKSxCPVN5bWJvbCgiYmxlbmQiKSx6PVN5bWJvbCgiYXBwbHlUZXh0dXJlIiksSz1TeW1ib2woImFwcGx5VHJhbnNmb3JtIiksUT1TeW1ib2woImFwcGx5R3JhZGllbnRUcmFuc2Zvcm0iKSxfPVN5bWJvbCgiYXBwbHlQcm9ncmFtIiksaj1TeW1ib2woImdyYWRpZW50IiksRz1TeW1ib2woImZpbHRlciIpLFg9U3ltYm9sKCJvcGFjaXR5IiksWj1TeW1ib2woInByb2dyYW0iKSx0dD1TeW1ib2woImF0dHJpYnV0ZXMiKSxudD1TeW1ib2woInBhc3MiKSxxPVN5bWJvbCgiY2xpcENvbnRleHQiKSxkdD1TeW1ib2woImFwcGx5Q2xpcFBhdGgiKTtmdW5jdGlvbiB1dChKLE4pe2NvbnN0WyQsU109W0pbMV1bMF0tSlswXVswXSxKWzFdWzFdLUpbMF1bMV1dLFA9W107Zm9yKGxldCB3PTA7dzxOLmxlbmd0aDt3Kyspe2NvbnN0IFU9Tlt3XSxIPVsoVVswXS1KWzBdWzBdKS8kLDEtKFVbMV0tSlswXVsxXSkvU107UC5wdXNoKEgpfXJldHVybiBQfWZ1bmN0aW9uIFcoW0osTl0sWyQsUyxQLHddLHtzY2FsZTpVfSl7cmV0dXJuIFV8fChKLz1QLE49MS1OL3csSi09JCxOKz1TKSxbSixOLDBdfWZ1bmN0aW9uIEYoSixOLCQpe2NvbnN0IFM9eCgpKEosTiwkKTtyZXR1cm4gUy5wYXRoPUosUy5zaW1wbGlmeT0kLFMuc2NhbGU9TixTfWNsYXNzIFZ7Y29uc3RydWN0b3IoTil7dGhpc1tBXT1udWxsLHRoaXNbQ109bnVsbCx0aGlzW0xdPVsxLDAsMCwxLDAsMF0sdGhpc1tYXT0xLHRoaXNbSV09e30sdGhpc1tHXT1bXSx0aGlzW0JdPW51bGwsdGhpc1tSXT17fSx0aGlzLmNvbnRvdXJzPU4uY29udG91cnMsdGhpc1taXT1udWxsLHRoaXNbdHRdPXt9LHRoaXNbbnRdPVtdfWdldCBjb250b3Vycygpe3JldHVybiB0aGlzW01dfXNldCBjb250b3VycyhOKXt0aGlzW2ddPW51bGwsdGhpc1tNXT1OO2NvbnN0ICQ9Ti5zY2FsZTt0aGlzLnRyYW5zZm9ybVNjYWxlLyQ+MS41JiZ0aGlzLmFjY3VyYXRlKHRoaXMudHJhbnNmb3JtU2NhbGUpfXNldFByb2dyYW0oTil7dGhpc1taXT1OLHRoaXNbZ10mJnRoaXNbX10oTil9Z2V0IHByb2dyYW0oKXtyZXR1cm4gdGhpc1taXX1zZXRBdHRyaWJ1dGUoTiwkKXskPT1udWxsP2RlbGV0ZSB0aGlzW3R0XVtOXTp0aGlzW3R0XVtOXT0kfWdldE9wYWNpdHkoKXtyZXR1cm4gdGhpc1tYXX1zZXRPcGFjaXR5KE4pe2lmKE48MHx8Tj4xKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgb3BhY2l0eSB2YWx1ZS4iKTt0aGlzW2ddJiZ0aGlzW2ddLnBvc2l0aW9ucy5mb3JFYWNoKCQ9PnskWzJdPTEvJFsyXT4wP046LU59KSx0aGlzW1hdPU59c2V0Q2xpcFBhdGgoTil7dGhpcy5jbGlwUGF0aD1OLHRoaXNbSV0udV9jbGlwU2FtcGxlciYmdGhpc1tJXS51X2NsaXBTYW1wbGVyLmRlbGV0ZSgpLHRoaXMuc2V0VW5pZm9ybXMoe3VfY2xpcFNhbXBsZXI6bnVsbH0pLHRoaXNbZ10mJmRlbGV0ZSB0aGlzW2ddLmF0dHJpYnV0ZXMuYV9jbGlwVVYsTiYmdGhpc1tnXSYmdGhpc1tkdF0oKX1bZHRdKCl7aWYodGhpcy5jbGlwUGF0aCl7dGhpc1txXXx8KHRoaXNbcV09bC5kZWZhdWx0LmNyZWF0ZUNhbnZhcygxLDEpKTtjb25zdFtbTiwkXSxbUyxQXV09dGhpcy5ib3VuZGluZ0JveDtTJiZQJiYodGhpc1txXS53aWR0aD1TLU4sdGhpc1txXS5oZWlnaHQ9UC0kKTtjb25zdCB3PXRoaXNbcV0uZ2V0Q29udGV4dCgiMmQiKSxVPW5ldyBQYXRoMkQodGhpcy5jbGlwUGF0aCk7dy5jbGVhclJlY3QoMCwwLHRoaXNbcV0ud2lkdGgsdGhpc1txXS5oZWlnaHQpLHcuc2F2ZSgpLHcudHJhbnNsYXRlKC1OLC0kKSx3LmZpbGxTdHlsZT0id2hpdGUiLHcuZmlsbChVKSx3LnJlc3RvcmUoKSx0aGlzW2ddLmNsaXBQYXRoPXRoaXNbcV07Y29uc3QgSD11dCh0aGlzLmJvdW5kaW5nQm94LHRoaXNbZ10ucG9zaXRpb24wKTt0aGlzW2ddLmF0dHJpYnV0ZXMuYV9jbGlwVVY9SH19Z2V0UG9pbnRBdExlbmd0aChOKXtyZXR1cm4gT2JqZWN0KHUuZ2V0UG9pbnRBdExlbmd0aCkodGhpc1tNXSxOKX1nZXRUb3RhbExlbmd0aCgpe3JldHVybiBPYmplY3QodS5nZXRUb3RhbExlbmd0aCkodGhpc1tNXSl9Z2V0IGJsZW5kKCl7cmV0dXJuIHRoaXNbQl09PW51bGw/ImF1dG8iOnRoaXNbQl19c2V0IGJsZW5kKE4pe3RoaXNbQl09Tix0aGlzW2ddJiYodGhpc1tnXS5lbmFibGVCbGVuZD10aGlzLmVuYWJsZUJsZW5kKX1nZXQgYm91bmRpbmdCb3goKXtpZih0aGlzW2ddJiZ0aGlzW2ddLmJvdW5kaW5nQm94KXJldHVybiB0aGlzW2ddLmJvdW5kaW5nQm94O2NvbnN0IE49dGhpcy5tZXNoRGF0YTtpZihOKXtjb25zdCAkPU4ucG9zaXRpb24wO2lmKCQubGVuZ3RoKU4uYm91bmRpbmdCb3g9YSgpKCQpO2Vsc2UgcmV0dXJuW1swLDBdLFswLDBdXTtyZXR1cm4gTi5ib3VuZGluZ0JveH1yZXR1cm5bWzAsMF0sWzAsMF1dfWdldCBib3VuZGluZ0NlbnRlcigpe2NvbnN0IE49dGhpcy5ib3VuZGluZ0JveDtyZXR1cm4gTj9bLjUqKE5bMF1bMF0rTlsxXVswXSksLjUqKE5bMF1bMV0rTlsxXVsxXSldOlswLDBdfWdldCBmaWxsUnVsZSgpe3JldHVybiB0aGlzW0NdP3RoaXNbQ10ucnVsZToibm9uemVybyJ9Z2V0IGxpbmVXaWR0aCgpe3JldHVybiB0aGlzW0FdP3RoaXNbQV0ubGluZVdpZHRoOjB9Z2V0IGxpbmVDYXAoKXtyZXR1cm4gdGhpc1tBXT90aGlzW0FdLmxpbmVDYXA6IiJ9Z2V0IGxpbmVKb2luKCl7cmV0dXJuIHRoaXNbQV0/dGhpc1tBXS5saW5lSm9pbjoiIn1nZXQgbWl0ZXJMaW1pdCgpe3JldHVybiB0aGlzW0FdP3RoaXNbQV0ubWl0ZXJMaW1pdDowfWdldCBzdHJva2VTdHlsZSgpe3JldHVybiB0aGlzW2JdJiZ0aGlzW2JdWzNdIT09MD9PYmplY3Qoby5kZWZhdWx0KSh0aGlzW2JdKToiIn1nZXQgbGluZURhc2goKXtyZXR1cm4gdGhpc1tBXT90aGlzW0FdLmxpbmVEYXNoOm51bGx9Z2V0IGxpbmVEYXNoT2Zmc2V0KCl7cmV0dXJuIHRoaXNbQV0/dGhpc1tBXS5saW5lRGFzaE9mZnNldDowfWdldCBmaWxsU3R5bGUoKXtyZXR1cm4gdGhpc1tFXSYmdGhpc1tFXVszXSE9PTA/T2JqZWN0KG8uZGVmYXVsdCkodGhpc1tFXSk6IiJ9Z2V0IGdyYWRpZW50KCl7cmV0dXJuIHRoaXNbal19Z2V0IHRleHR1cmUoKXtyZXR1cm4gdGhpc1tJXS51X3RleFNhbXBsZXI/e2ltYWdlOnRoaXNbSV0udV90ZXhTYW1wbGVyLl9pbWcsb3B0aW9uczp0aGlzW1JdfTpudWxsfWdldCBlbmFibGVCbGVuZCgpe3JldHVybiB0aGlzW0JdPT09ITB8fHRoaXNbQl09PT0hMT90aGlzW0JdOnRoaXNbWF08MXx8dGhpc1tiXSE9bnVsbCYmdGhpc1tiXVszXTwxfHx0aGlzW0VdIT1udWxsJiZ0aGlzW0VdWzNdPDF8fHRoaXNbSV0udV9jb2xvck1hdHJpeCE9bnVsbCYmdGhpc1tJXS51X2NvbG9yTWF0cml4WzE4XTwxfHx0aGlzW0ldLnVfcmFkaWFsR3JhZGllbnRWZWN0b3IhPW51bGx8fHRoaXMuYmVmb3JlUmVuZGVyfHx0aGlzLmFmdGVyUmVuZGVyfWdldCBmaWx0ZXJDYW52YXMoKXtyZXR1cm4vYmx1cnxkcm9wLXNoYWRvd3x1cmwvLnRlc3QodGhpcy5maWx0ZXIpfWdldCBmaWx0ZXIoKXtyZXR1cm4gdGhpc1tHXS5qb2luKCIgIil9Z2V0IHRyYW5zZm9ybU1hdHJpeCgpe3JldHVybiB0aGlzW0xdfWdldCBpbnZlcnRNYXRyaXgoKXtpZighdGhpc1tEXSl7Y29uc3QgTj1lLm1hdDJkLmludmVydChBcnJheS5vZigwLDAsMCwwLDAsMCksdGhpc1tMXSk7dGhpc1tEXT1OfXJldHVybiB0aGlzW0RdfWdldCB0cmFuc2Zvcm1TY2FsZSgpe2NvbnN0IE49dGhpc1tMXTtyZXR1cm4gTWF0aC5tYXgoTWF0aC5oeXBvdChOWzBdLE5bMV0pLE1hdGguaHlwb3QoTlsyXSxOWzNdKSl9Z2V0IHVuaWZvcm1zKCl7cmV0dXJuIHRoaXNbSV19Z2V0IHBhc3MoKXtyZXR1cm4gdGhpc1tudF19W19dKE4pe2NvbnN0ICQ9dGhpc1t0dF0sUz10aGlzW2ddLnBvc2l0aW9uMCxQPU9iamVjdC5lbnRyaWVzKE4uX2F0dHJpYnV0ZSk7Zm9yKGxldCB3PTA7dzxQLmxlbmd0aDt3Kyspe2NvbnN0W1UsSF09UFt3XTtpZihVIT09ImFfY29sb3IiJiZVIT09ImFfc291cmNlUmVjdCImJkghPT0iaWdub3JlZCIpe2NvbnN0IFk9JFtVXTtpZihVPT09InV2IiYmIVkpe2NvbnN0IGs9dGhpc1tnXS5ib3VuZGluZ0JveHx8YSgpKFMpO3RoaXNbZ10uYXR0cmlidXRlc1tVXT11dChrLFMpfWVsc2V7dGhpc1tnXS5hdHRyaWJ1dGVzW1VdPVtdO2ZvcihsZXQgaz0wO2s8Uy5sZW5ndGg7aysrKXtjb25zdCBydD1TW2tdO3RoaXNbZ10uYXR0cmlidXRlc1tVXS5wdXNoKFk/WShydCx3LFMpOkFycmF5KEguc2l6ZSkuZmlsbCgwKSl9fX19fWdldCBtZXNoRGF0YSgpe2lmKHRoaXMuX3VwZGF0ZU1hdHJpeCYmdGhpcy50cmFuc2Zvcm1TY2FsZS90aGlzLmNvbnRvdXJzLnNjYWxlPjEuNSYmdGhpcy5hY2N1cmF0ZSh0aGlzLnRyYW5zZm9ybVNjYWxlKSwhdGhpc1tnXSl7IXRoaXNbQ10mJiF0aGlzW0FdJiZ0aGlzLnNldEZpbGwoKTtjb25zdCBOPXRoaXNbTV0sJD17fTtpZihOJiZOLmxlbmd0aCl7aWYodGhpc1tDXSl0cnl7Y29uc3Qgdz15KCkoTix0aGlzW0NdKTt3LnBvc2l0aW9ucz13LnBvc2l0aW9ucy5tYXAoVT0+KFUucHVzaCh0aGlzW1hdKSxVKSksdy5hdHRyaWJ1dGVzPXthX2NvbG9yOkFycmF5LmZyb20oe2xlbmd0aDp3LnBvc2l0aW9ucy5sZW5ndGh9KS5tYXAoKCk9PnRoaXNbRV0ubWFwKFU9Pk1hdGgucm91bmQoMjU1KlUpKSl9LCQuZmlsbD13fWNhdGNoe31pZih0aGlzW0FdKXtjb25zdCB3PXRoaXNbQV0ubGluZURhc2g7bGV0IFU9TjtpZih3KXtjb25zdCBZPXRoaXNbQV0ubGluZURhc2hPZmZzZXQ7VT1PYmplY3QodS5nZXREYXNoQ29udG91cnMpKE4sdyxZKX1jb25zdCBIPVUubWFwKChZLGspPT57Y29uc3QgcnQ9WS5sZW5ndGg+MSYmZS52ZWMyLmVxdWFscyhZWzBdLFlbWS5sZW5ndGgtMV0pLGl0PXRoaXNbQV0uYnVpbGQoWSxydCk7cmV0dXJuIHkoKShbaXRdKX0pO0guZm9yRWFjaChZPT57WS5wb3NpdGlvbnM9WS5wb3NpdGlvbnMubWFwKGs9PihrLnB1c2goLXRoaXNbWF0pLGspKSxZLmF0dHJpYnV0ZXM9e2FfY29sb3I6QXJyYXkuZnJvbSh7bGVuZ3RoOlkucG9zaXRpb25zLmxlbmd0aH0pLm1hcCgoKT0+dGhpc1tiXS5tYXAoaz0+TWF0aC5yb3VuZCgyNTUqaykpKX19KSwkLnN0cm9rZT1PYmplY3QoaS5kZWZhdWx0KShIKX19Y29uc3QgUz1PYmplY3QoaS5kZWZhdWx0KShbJC5maWxsLCQuc3Ryb2tlXSk7Uy5maWxsUG9pbnRDb3VudD0kLmZpbGw/JC5maWxsLnBvc2l0aW9ucy5sZW5ndGg6MCxTLmVuYWJsZUJsZW5kPXRoaXMuZW5hYmxlQmxlbmQsUy5wb3NpdGlvbjA9Uy5wb3NpdGlvbnMubWFwKChbdyxVLEhdKT0+W3csVSxIXSksUy51bmlmb3Jtcz10aGlzW0ldLHRoaXNbZ109Uyx0aGlzW0ldLnVfdGV4U2FtcGxlciYmdGhpc1t6XShTLHRoaXNbUl0pO2NvbnN0IFA9dGhpc1tMXTtPYmplY3QobS5pc1VuaXRUcmFuc2Zvcm0pKFApfHwodGhpc1tLXShTLFApLHRoaXNbSV0udV9yYWRpYWxHcmFkaWVudFZlY3RvciYmdGhpc1tRXSgpKSx0aGlzLmNsaXBQYXRoJiZ0aGlzW2R0XSgpLHRoaXNbWl0mJnRoaXNbX10odGhpc1taXSl9cmV0dXJuIHRoaXMuX3VwZGF0ZU1hdHJpeCYmKHRoaXNbZ10ubWF0cml4PXRoaXNbTF0sdGhpc1tLXSh0aGlzW2ddLHRoaXNbTF0pLHRoaXNbSV0udV9yYWRpYWxHcmFkaWVudFZlY3RvciYmdGhpc1tRXSgpKSx0aGlzW2ddfVtLXShOLCQpe2NvbnN0e3Bvc2l0aW9uczpTLHBvc2l0aW9uMDpQfT1OO2ZvcihsZXQgdz0wO3c8Uy5sZW5ndGg7dysrKXtjb25zdFtVLEhdPVBbd10sWT1TW3ddO1lbMF09VSokWzBdK0gqJFsyXSskWzRdLFlbMV09VSokWzFdK0gqJFszXSskWzVdfXRoaXMuX3VwZGF0ZU1hdHJpeD0hMX1bUV0oKXtjb25zdCBOPXRoaXNbTF0sJD1bLi4udGhpcy5fcmFkaWFsR3JhZGllbnRWZWN0b3JdO2lmKCQpe2NvbnN0W1MsUCwsdyxVXT0kOyRbMF09UypOWzBdK1AqTlsyXStOWzRdLCRbMV09UypOWzFdK1AqTlszXStOWzVdLCRbM109dypOWzBdK1UqTlsyXStOWzRdLCRbNF09dypOWzFdK1UqTlszXStOWzVdLHRoaXNbSV0udV9yYWRpYWxHcmFkaWVudFZlY3Rvcj0kfX1bel0oTiwkKXtmdW5jdGlvbiBTKGsscnQpe3JldHVybiBrPT1udWxsJiZydD09bnVsbD8hMDprPT1udWxsfHxydD09bnVsbD8hMTprWzBdPT09cnRbMF0mJmtbMV09PT1ydFsxXSYma1syXT09PXJ0WzJdJiZrWzNdPT09cnRbM119Y29uc3QgUD10aGlzW0ldLnVfdGV4U2FtcGxlcjtpZighUClyZXR1cm47Y29uc3R7d2lkdGg6dyxoZWlnaHQ6VX09UC5faW1nLEg9JC5zcmNSZWN0O2xldCBZPSQucmVjdHx8WzAsMF07aWYoJC5yb3RhdGVkJiYoWT1bLVlbMV0sWVswXSxZWzNdLFlbMl1dKSxZWzJdPT1udWxsJiYoWVsyXT1IP0hbMl06dyksWVszXT09bnVsbCYmKFlbM109SD9IWzNdOlUpLCQuaGlkZGVuKU4udGV4dHVyZUNvb3JkPU4ucG9zaXRpb25zLm1hcCgoKT0+Wy0xLC0xLC0xXSk7ZWxzZSBpZighTi50ZXh0dXJlQ29vcmR8fCFTKHRoaXNbUl0ucmVjdCwkLnJlY3QpfHx0aGlzW1JdLmhpZGRlbiE9PSQuaGlkZGVufHx0aGlzW1JdLnJvdGF0ZWQhPT0kLnJvdGF0ZWQpe2xldCBrPW51bGw7JC5yb3RhdGVkJiYoaz1lLm1hdDJkLnJvdGF0ZShBcnJheS5vZigwLDAsMCwwLDAsMCksZS5tYXQyZC5mcm9tVmFsdWVzKDEsMCwwLDEsMCwwKSwuNSpNYXRoLlBJKSxrPWUubWF0MmQudHJhbnNsYXRlKEFycmF5Lm9mKDAsMCwwLDAsMCwwKSxrLFswLC1ZWzJdXSkpLE4udGV4dHVyZUNvb3JkPU4ucG9zaXRpb24wLm1hcCgoW3J0LGl0LGN0XSk9PntpZigxL2N0PjApe2lmKCQucm90YXRlZCl7Y29uc3QgYXQ9cnQqa1swXStpdCprWzJdK2tbNF0sb3Q9cnQqa1sxXStpdCprWzNdK2tbNV07W3J0LGl0XT1bYXQsb3RdfWNvbnN0IGh0PVcoW3J0LGl0XSxbWVswXS9ZWzJdLFlbMV0vWVszXSxZWzJdLFlbM11dLCQpO3JldHVybiAkLnJlcGVhdCYmKGh0WzJdPTEpLGh0fXJldHVyblstMSwtMSwtMV19KX1pZihIKXtjb25zdCBrPVtIWzBdL3csSFsxXS9VLEhbMl0vdyxIWzNdL1VdO04uYXR0cmlidXRlcy5hX3NvdXJjZVJlY3Q9Ti5wb3NpdGlvbnMubWFwKCgpPT5bLi4ua10pfWVsc2UgTi5hdHRyaWJ1dGVzLmFfc291cmNlUmVjdD1OLnBvc2l0aW9ucy5tYXAoKCk9PlswLDAsMCwwXSl9YWNjdXJhdGUoTil7aWYoIXRoaXMuY29udG91cnMpcmV0dXJuO2lmKHRoaXMuY29udG91cnMucGF0aCl7Y29uc3QgUz10aGlzLmNvbnRvdXJzLnNpbXBsaWZ5LFA9Rih0aGlzLmNvbnRvdXJzLnBhdGgsMipOLFMpO3RoaXNbZ109bnVsbCx0aGlzW01dPVB9fWNhbklnbm9yZSgpe2NvbnN0IE49dGhpc1tBXT09bnVsbHx8dGhpc1tBXS5saW5lV2lkdGg9PT0wfHx0aGlzW2JdWzNdPT09MCwkPXRoaXNbQ109PW51bGx8fHRoaXNbRV1bM109PT0wLFM9dGhpc1tJXS51X3JhZGlhbEdyYWRpZW50VmVjdG9yPT1udWxsLFA9dGhpc1tJXS51X3RleFNhbXBsZXI9PW51bGw7cmV0dXJuIHRoaXNbWF09PT0wfHx0aGlzW1pdPT1udWxsJiZOJiYkJiZTJiZQJiYhdGhpcy5iZWZvcmVSZW5kZXImJiF0aGlzLmFmdGVyUmVuZGVyfXNldFN0cm9rZSh7dGhpY2tuZXNzOk49MSxjYXA6JD0iYnV0dCIsam9pbjpTPSJtaXRlciIsbWl0ZXJMaW1pdDpQPTEwLGNvbG9yOnc9WzAsMCwwLDBdLGxpbmVEYXNoOlU9bnVsbCxsaW5lRGFzaE9mZnNldDpIPTAscm91bmRTZWdtZW50czpZPTIwfT17fSl7cmV0dXJuIHRoaXNbZ109bnVsbCx0aGlzW0FdPW5ldyBzLmRlZmF1bHQoe2xpbmVXaWR0aDpOLGxpbmVDYXA6JCxsaW5lSm9pbjpTLG1pdGVyTGltaXQ6UCxyb3VuZFNlZ21lbnRzOll9KSx0eXBlb2Ygdz09InN0cmluZyImJih3PU9iamVjdCh2LmRlZmF1bHQpKHcpKSx0aGlzW2JdPXcsdGhpc1tBXS5saW5lRGFzaD1VLHRoaXNbQV0ubGluZURhc2hPZmZzZXQ9SCx0aGlzfXNldEZpbGwoe3J1bGU6Tj10aGlzLmZpbGxSdWxlLGNvbG9yOiQ9WzAsMCwwLDBdfT17fSl7cmV0dXJuIHRoaXNbZ109bnVsbCx0aGlzW0NdPXtydWxlOk59LHR5cGVvZiAkPT0ic3RyaW5nIiYmKCQ9T2JqZWN0KHYuZGVmYXVsdCkoJCkpLHRoaXNbRV09JCx0aGlzfXNldFRleHR1cmUoTiwkPXt9KXtpZihOJiZOLmltYWdlKXtjb25zdHtpbWFnZTpTLHJlY3Q6UH09TjtpZihOPVMsJC5yZWN0KWZvcihsZXQgdz0wO3c8JC5yZWN0Lmxlbmd0aDt3KyspUFt3XT0kLnJlY3Rbd107JC5yZWN0PVB9cmV0dXJuIHRoaXNbQ118fHRoaXMuc2V0RmlsbCgpLHRoaXMuc2V0VW5pZm9ybXMoe3VfdGV4U2FtcGxlcjpOfSksdGhpc1tnXSYmdGhpc1t6XSh0aGlzW2ddLCQpLHRoaXNbUl09JCx0aGlzfXNldENpcmN1bGFyR3JhZGllbnQoe3ZlY3RvcjpOLGNvbG9yczokLHR5cGU6Uz0iZmlsbCJ9PXt9KXtpZihOLmxlbmd0aCE9PTMpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBsaW5lYXJHcmFkaWVudC4iKTt0aGlzLnNldEdyYWRpZW50KHt2ZWN0b3I6Tixjb2xvcnM6JCx0eXBlOlN9KX1zZXRMaW5lYXJHcmFkaWVudCh7dmVjdG9yOk4sY29sb3JzOiQsdHlwZTpTPSJmaWxsIn09e30pe2lmKE4ubGVuZ3RoIT09NCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGxpbmVhckdyYWRpZW50LiIpO3RoaXMuc2V0R3JhZGllbnQoe3ZlY3RvcjpOLGNvbG9yczokLHR5cGU6U30pfXNldFJhZGlhbEdyYWRpZW50KHt2ZWN0b3I6Tixjb2xvcnM6JCx0eXBlOlM9ImZpbGwifT17fSl7aWYoTi5sZW5ndGghPT02KXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgcmFkaWFsR3JhZGllbnQuIik7dGhpcy5zZXRHcmFkaWVudCh7dmVjdG9yOk4sY29sb3JzOiQsdHlwZTpTfSl9c2V0R3JhZGllbnQoe3ZlY3RvcjpOLGNvbG9yczokLHR5cGU6Uz0iZmlsbCJ9PXt9KXskPSQubWFwKCh7b2Zmc2V0OlUsY29sb3I6SH0pPT4odHlwZW9mIEg9PSJzdHJpbmciJiYoSD1PYmplY3Qodi5kZWZhdWx0KShIKSkse29mZnNldDpVLGNvbG9yOkh9KSksdGhpc1tqXT10aGlzW2pdfHx7fSx0aGlzW2pdW1NdPXt2ZWN0b3I6Tixjb2xvcnM6JH0sJC5zb3J0KChVLEgpPT5VLm9mZnNldC1ILm9mZnNldCk7Y29uc3QgUD1bXTskLmZvckVhY2goKHtvZmZzZXQ6VSxjb2xvcjpIfSk9PntQLnB1c2goVSwuLi5IKX0pO2xldCB3O2lmKE4ubGVuZ3RoPT09ND93PVtOWzBdLE5bMV0sMCxOWzJdLE5bM10sMF06dz1bLi4uTl0sUC5sZW5ndGg8NDAmJlAucHVzaCgtMSksUC5sZW5ndGg+NDApdGhyb3cgbmV3IEVycm9yKCJUb28gbWFueSBjb2xvcnMsIHNob3VsZCBiZSBsZXNzIHRoYW4gOCBjb2xvcnMiKTtyZXR1cm4gdGhpcy5fcmFkaWFsR3JhZGllbnRWZWN0b3I9dyx0aGlzW0ldLnVfY29sb3JTdGVwcz1QLFM9PT0iZmlsbCI/dGhpc1tJXS51X2dyYWRpZW50VHlwZT0xOnRoaXNbSV0udV9ncmFkaWVudFR5cGU9MCx0aGlzW1FdKCksdGhpc31zZXRVbmlmb3JtcyhOPXt9KXtyZXR1cm4gT2JqZWN0LmFzc2lnbih0aGlzW0ldLE4pLHRoaXN9c2V0VHJhbnNmb3JtKC4uLk4pe2NvbnN0ICQ9dGhpc1tMXTtyZXR1cm4gZS5tYXQyZC5lcXVhbHMoTiwkKXx8KHRoaXNbTF09TixkZWxldGUgdGhpc1tEXSx0aGlzLl91cGRhdGVNYXRyaXg9ITApLHRoaXN9dHJhbnNmb3JtKC4uLk4pe2NvbnN0ICQ9dGhpc1tMXTtyZXR1cm4gdGhpc1tMXT1lLm1hdDJkLm11bHRpcGx5KEFycmF5Lm9mKDAsMCwwLDAsMCwwKSwkLE4pLGRlbGV0ZSB0aGlzW0RdLHRoaXMuX3VwZGF0ZU1hdHJpeD0hMCx0aGlzfXRyYW5zbGF0ZShOLCQpe2xldCBTPWUubWF0MmQuY3JlYXRlKCk7cmV0dXJuIFM9ZS5tYXQyZC50cmFuc2xhdGUoQXJyYXkub2YoMCwwLDAsMCwwLDApLFMsW04sJF0pLHRoaXMudHJhbnNmb3JtKC4uLlMpfXJvdGF0ZShOLFskLFNdPVswLDBdKXtsZXQgUD1lLm1hdDJkLmNyZWF0ZSgpO3JldHVybiBQPWUubWF0MmQudHJhbnNsYXRlKEFycmF5Lm9mKDAsMCwwLDAsMCwwKSxQLFskLFNdKSxQPWUubWF0MmQucm90YXRlKEFycmF5Lm9mKDAsMCwwLDAsMCwwKSxQLE4pLFA9ZS5tYXQyZC50cmFuc2xhdGUoQXJyYXkub2YoMCwwLDAsMCwwLDApLFAsWy0kLC1TXSksdGhpcy50cmFuc2Zvcm0oLi4uUCl9c2NhbGUoTiwkPU4sW1MsUF09WzAsMF0pe2xldCB3PWUubWF0MmQuY3JlYXRlKCk7cmV0dXJuIHc9ZS5tYXQyZC50cmFuc2xhdGUoQXJyYXkub2YoMCwwLDAsMCwwLDApLHcsW1MsUF0pLHc9ZS5tYXQyZC5zY2FsZShBcnJheS5vZigwLDAsMCwwLDAsMCksdyxbTiwkXSksdz1lLm1hdDJkLnRyYW5zbGF0ZShBcnJheS5vZigwLDAsMCwwLDAsMCksdyxbLVMsLVBdKSx0aGlzLnRyYW5zZm9ybSguLi53KX1za2V3KE4sJD1OLFtTLFBdPVswLDBdKXtsZXQgdz1lLm1hdDJkLmNyZWF0ZSgpO3JldHVybiB3PWUubWF0MmQudHJhbnNsYXRlKEFycmF5Lm9mKDAsMCwwLDAsMCwwKSx3LFtTLFBdKSx3PWUubWF0MmQubXVsdGlwbHkoQXJyYXkub2YoMCwwLDAsMCwwLDApLHcsZS5tYXQyZC5mcm9tVmFsdWVzKDEsTWF0aC50YW4oJCksTWF0aC50YW4oTiksMSwwLDApKSx3PWUubWF0MmQudHJhbnNsYXRlKEFycmF5Lm9mKDAsMCwwLDAsMCwwKSx3LFstUywtUF0pLHRoaXMudHJhbnNmb3JtKC4uLncpfWNsZWFyRmlsdGVyKCl7cmV0dXJuIHRoaXMuc2V0Q29sb3JUcmFuc2Zvcm0obnVsbCksdGhpc1tHXS5sZW5ndGg9MCx0aGlzfXNldENvbG9yVHJhbnNmb3JtKC4uLk4pe3JldHVybiBOWzBdPT09bnVsbD90aGlzLnNldFVuaWZvcm1zKHt1X2ZpbHRlckZsYWc6MCx1X2NvbG9yTWF0cml4OjB9KTp0aGlzLnNldFVuaWZvcm1zKHt1X2ZpbHRlckZsYWc6MSx1X2NvbG9yTWF0cml4Ok59KSx0aGlzfXRyYW5zZm9ybUNvbG9yKC4uLk4pe2xldCAkPXRoaXMudW5pZm9ybXMudV9jb2xvck1hdHJpeDtyZXR1cm4gJD8kPU9iamVjdChjLm11bHRpcGx5KSgkLE4pOiQ9Tix0aGlzLnNldENvbG9yVHJhbnNmb3JtKC4uLiQpLHRoaXN9Ymx1cihOKXtyZXR1cm4gdGhpc1tHXS5wdXNoKGBibHVyKCR7Tn1weClgKSx0aGlzfWJyaWdodG5lc3MoTj0xKXtyZXR1cm4gdGhpc1tHXS5wdXNoKGBicmlnaHRuZXNzKCR7MTAwKk59JSlgKSx0aGlzLnRyYW5zZm9ybUNvbG9yKC4uLk9iamVjdChjLmJyaWdodG5lc3MpKE4pKX1jb250cmFzdChOPTEpe3JldHVybiB0aGlzW0ddLnB1c2goYGNvbnRyYXN0KCR7MTAwKk59JSlgKSx0aGlzLnRyYW5zZm9ybUNvbG9yKC4uLk9iamVjdChjLmNvbnRyYXN0KShOKSl9ZHJvcFNoYWRvdyhOLCQsUz0wLFA9WzAsMCwwLDFdKXtyZXR1cm4gQXJyYXkuaXNBcnJheShQKSYmKFA9T2JqZWN0KG8uZGVmYXVsdCkoUCkpLHRoaXNbR10ucHVzaChgZHJvcC1zaGFkb3coJHtOfXB4ICR7JH1weCAke1N9cHggJHtQfSlgKSx0aGlzfWdyYXlzY2FsZShOPTEpe3JldHVybiB0aGlzW0ddLnB1c2goYGdyYXlzY2FsZSgkezEwMCpOfSUpYCksdGhpcy50cmFuc2Zvcm1Db2xvciguLi5PYmplY3QoYy5ncmF5c2NhbGUpKE4pKX1odWVSb3RhdGUoTj0wKXtyZXR1cm4gdGhpc1tHXS5wdXNoKGBodWUtcm90YXRlKCR7Tn1kZWcpYCksdGhpcy50cmFuc2Zvcm1Db2xvciguLi5PYmplY3QoYy5odWVSb3RhdGUpKE4pKX1pbnZlcnQoTj0xKXtyZXR1cm4gdGhpc1tHXS5wdXNoKGBpbnZlcnQoJHsxMDAqTn0lKWApLHRoaXMudHJhbnNmb3JtQ29sb3IoLi4uT2JqZWN0KGMuaW52ZXJ0KShOKSl9b3BhY2l0eShOPTEpe3JldHVybiB0aGlzW0ddLnB1c2goYG9wYWNpdHkoJHsxMDAqTn0lKWApLHRoaXMudHJhbnNmb3JtQ29sb3IoLi4uT2JqZWN0KGMub3BhY2l0eSkoTikpfXNhdHVyYXRlKE49MSl7cmV0dXJuIHRoaXNbR10ucHVzaChgc2F0dXJhdGUoJHsxMDAqTn0lKWApLHRoaXMudHJhbnNmb3JtQ29sb3IoLi4uT2JqZWN0KGMuc2F0dXJhdGUpKE4pKX1zZXBpYShOPTEpe3JldHVybiB0aGlzW0ddLnB1c2goYHNlcGlhKCR7MTAwKk59JSlgKSx0aGlzLnRyYW5zZm9ybUNvbG9yKC4uLk9iamVjdChjLnNlcGlhKShOKSl9dXJsKE4pe3JldHVybiB0aGlzW0ddLnB1c2goYHVybCgke059KWApLHRoaXN9aXNQb2ludENvbGxpc2lvbihOLCQsUz0iYm90aCIpe2NvbnN0IFA9dGhpcy5tZXNoRGF0YSx7cG9zaXRpb25zOncsY2VsbHM6VX09UCxIPXRoaXMuaW52ZXJ0TWF0cml4LFk9SFswXSpOK0hbMl0qJCtIWzRdLGs9SFsxXSpOK0hbM10qJCtIWzVdLHJ0PXRoaXMuYm91bmRpbmdCb3g7aWYoWTxydFswXVswXXx8WT5ydFsxXVswXXx8azxydFswXVsxXXx8az5ydFsxXVsxXSlyZXR1cm4hMTtmdW5jdGlvbiBpdChbY3QsaHRdLFthdCxvdF0sW2Z0LG10XSl7Y29uc3QgdnQ9ZnQtYXQscHQ9bXQtb3QseHQ9KChjdC1hdCkqdnQrKGh0LW90KSpwdCkvKHZ0KioyK3B0KioyKTtyZXR1cm4geHQ+PTAmJnh0PD0xfWZvcihsZXQgY3Q9MDtjdDxVLmxlbmd0aDtjdCsrKXtjb25zdCBodD1VW2N0XTtpZihTPT09ImZpbGwiJiZodFswXT49UC5maWxsUG9pbnRDb3VudClicmVhaztpZihTPT09InN0cm9rZSImJmh0WzBdPFAuZmlsbFBvaW50Q291bnQpY29udGludWU7Y29uc3RbW2F0LG90XSxbZnQsbXRdLFt2dCxwdF1dPWh0Lm1hcChQdD0+d1tQdF0pLHh0PU1hdGguc2lnbigoTi1hdCkqKG10LW90KS0oZnQtYXQpKigkLW90KSk7aWYoeHQ9PT0wJiZpdChbTiwkXSxbYXQsb3RdLFtmdCxtdF0pKXJldHVybiEwO2NvbnN0IFJ0PU1hdGguc2lnbigoTi1mdCkqKHB0LW10KS0odnQtZnQpKigkLW10KSk7aWYoUnQ9PT0wJiZpdChbTiwkXSxbZnQsbXRdLFt2dCxwdF0pKXJldHVybiEwO2NvbnN0IEV0PU1hdGguc2lnbigoTi12dCkqKG90LXB0KS0oYXQtdnQpKigkLXB0KSk7aWYoRXQ9PT0wJiZpdChbTiwkXSxbdnQscHRdLFthdCxvdF0pfHx4dD09PTEmJlJ0PT09MSYmRXQ9PT0xfHx4dD09PS0xJiZSdD09PS0xJiZFdD09PS0xKXJldHVybiEwfXJldHVybiExfWlzUG9pbnRJbkZpbGwoTiwkKXtyZXR1cm4gdGhpcy5pc1BvaW50Q29sbGlzaW9uKE4sJCwiZmlsbCIpfWlzUG9pbnRJblN0cm9rZShOLCQpe3JldHVybiB0aGlzLmlzUG9pbnRDb2xsaXNpb24oTiwkLCJzdHJva2UiKX1hZGRQYXNzKE4sJD17fSl7bGV0e3dpZHRoOlMsaGVpZ2h0OlB9PSQsdz1oKCQsWyJ3aWR0aCIsImhlaWdodCJdKTtjb25zdCBVPW5ldyBULmRlZmF1bHQ7VS5yZWN0KDAsMCxTLFApO2NvbnN0IEg9bmV3IFYoVSx7d2lkdGg6UyxoZWlnaHQ6UH0pO0guc2V0VW5pZm9ybXModyksSC5zZXRQcm9ncmFtKE4pLHRoaXNbbnRdLnB1c2goSCl9fX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKTt2YXIgZT10KDU4KTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSksci5kZWZhdWx0PWUuU3Ryb2tlfSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJTdHJva2UiLGZ1bmN0aW9uKCl7cmV0dXJuIG19KTt2YXIgZT10KDQ5KTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7Y29uc3Qgbj1PYmplY3QoZS5jcmVhdGUpKCksYT1PYmplY3QoZS5jcmVhdGUpKCkscz1PYmplY3QoZS5jcmVhdGUpKCksaT1PYmplY3QoZS5jcmVhdGUpKCksbz1PYmplY3QoZS5jcmVhdGUpKCksYz0xZTIwO2NsYXNzIG17Y29uc3RydWN0b3Ioe2xpbmVXaWR0aDp4PTEsbGluZUpvaW46dj0ibWl0ZXIiLG1pdGVyTGltaXQ6VD0xMCxsaW5lQ2FwOmw9ImJ1dHQiLHJvdW5kU2VnbWVudHM6aD0yMH09e30pe3RoaXMubGluZVdpZHRoPXgsdGhpcy5saW5lSm9pbj12LHRoaXMubWl0ZXJMaW1pdD1ULHRoaXMubGluZUNhcD1sLHRoaXMucm91bmRTZWdtZW50cz1oLHRoaXMuX25vcm1hbD1udWxsfWJ1aWxkKHgsdj0hMSl7bGV0IFQ9eC5sZW5ndGg7aWYoeD1bLi4ueF0sVDwyKXJldHVybiB4O3YmJigoeFswXVswXSE9PXhbVC0xXVswXXx8eFswXVsxXSE9PXhbVC0xXVsxXSkmJngucHVzaChbLi4ueFswXV0pLHgucHVzaChbLi4ueFsxXV0pKSxUPXgubGVuZ3RoLHRoaXMuX25vcm1hbD1udWxsO2NvbnN0IGw9e2xlZnQ6W10scmlnaHQ6W119LGg9dGhpcy5saW5lV2lkdGgvMixmPXRoaXMubGluZUNhcDtpZighdiYmZj09PSJzcXVhcmUiKXtPYmplY3QoZS5kaXJlY3Rpb24pKGEseFswXSx4WzFdKSxPYmplY3QoZS5zY2FsZUFuZEFkZCkoeFswXSx4WzBdLGEsaCk7Y29uc3QgTT14Lmxlbmd0aC0xO09iamVjdChlLmRpcmVjdGlvbikoYSx4W01dLHhbTS0xXSksT2JqZWN0KGUuc2NhbGVBbmRBZGQpKHhbTV0seFtNXSxhLGgpfWZvcihsZXQgTT0xO008VDtNKyspe2NvbnN0IEE9eFtNLTFdLEM9eFtNXSxiPXhbTSsxXTt0aGlzLl9zZWcobCxBLEMsYixoLHYpfXJldHVybiF2JiZmPT09InJvdW5kIiYmeShsLHRoaXMucm91bmRTZWdtZW50cyksWy4uLmwubGVmdCwuLi5sLnJpZ2h0LnJldmVyc2UoKV19X3NlZyh4LHYsVCxsLGgsZil7Y29uc3QgZz10aGlzLmxpbmVKb2luPT09ImJldmVsIixNPXRoaXMubGluZUpvaW49PT0icm91bmQiO2lmKE9iamVjdChlLmRpcmVjdGlvbikoYSxULHYpLHRoaXMuX25vcm1hbHx8KHRoaXMuX25vcm1hbD1PYmplY3QoZS5jcmVhdGUpKCksT2JqZWN0KGUubm9ybWFsKSh0aGlzLl9ub3JtYWwsYSkpLHgubGVmdC5sZW5ndGh8fHAoeCx2LHRoaXMuX25vcm1hbCxoKSwhbClPYmplY3QoZS5ub3JtYWwpKHRoaXMuX25vcm1hbCxhKSxmP3AoeCx2LHRoaXMuX25vcm1hbCxoKTpwKHgsVCx0aGlzLl9ub3JtYWwsaCk7ZWxzZXtPYmplY3QoZS5kaXJlY3Rpb24pKHMsbCxUKTtsZXQgQT1PYmplY3QoZS5jb21wdXRlTWl0ZXIpKGksbyxhLHMsaCk7QT1NYXRoLm1pbihBLGMpO2NvbnN0IEM9T2JqZWN0KGUuZG90KShpLHRoaXMuX25vcm1hbCk8MD8tMToxO2xldCBiPWd8fE07aWYoIWImJnRoaXMubGluZUpvaW49PT0ibWl0ZXIiJiZBL2g+dGhpcy5taXRlckxpbWl0JiYoYj0hMCksYil7T2JqZWN0KGUuc2NhbGVBbmRBZGQpKG4sVCx0aGlzLl9ub3JtYWwsLWgqQyksdSh4LG4sQyk7bGV0IEU9MS8wO3YmJihFPU1hdGgubWluKEUsTWF0aC5oeXBvdChUWzBdLXZbMF0sVFsxXS12WzFdKSkpLGwmJihFPU1hdGgubWluKEUsTWF0aC5oeXBvdChsWzBdLVRbMF0sbFsxXS1UWzFdKSkpO2NvbnN0IEw9TWF0aC5tYXgoaCxNYXRoLm1pbihBLEUpKTtpZihPYmplY3QoZS5zY2FsZUFuZEFkZCkobixULG8sTCpDKSx1KHgsbiwtQyksbClpZihPYmplY3QoZS5ub3JtYWwpKG4scyksT2JqZWN0KGUuY29weSkodGhpcy5fbm9ybWFsLG4pLE9iamVjdChlLnNjYWxlQW5kQWRkKShuLFQsbiwtaCpDKSxNKXtjb25zdCBEPU9iamVjdChlLmNsb25lKShuKSxJPUM+MD94LmxlZnRbeC5sZWZ0Lmxlbmd0aC0xXTp4LnJpZ2h0W3gucmlnaHQubGVuZ3RoLTFdLFI9T2JqZWN0KGUuY2xvbmUpKFQpLEI9T2JqZWN0KGUuc3ViKShPYmplY3QoZS5jcmVhdGUpKCksSSxSKSx6PU9iamVjdChlLnN1YikoT2JqZWN0KGUuY3JlYXRlKSgpLEQsUiksSz1NYXRoLlBJL3RoaXMucm91bmRTZWdtZW50cztmb3IobGV0IFE9MDtRPHRoaXMucm91bmRTZWdtZW50cyYmKE9iamVjdChlLnJvdGF0ZSkoQixCLFswLDBdLEMqSyksTWF0aC5zaWduKE9iamVjdChlLmNyb3NzKShuLEIseilbMl0pPT09Qyk7USsrKU9iamVjdChlLmFkZCkobixCLFIpLHUoeCxuLEMpO3UoeCxELEMpfWVsc2UgdSh4LG4sQyl9ZWxzZSBwKHgsVCxvLEEpLE9iamVjdChlLmNvcHkpKHRoaXMuX25vcm1hbCxvKX19fWZ1bmN0aW9uIHUoTyx4LHYpe3Y+MD9PLmxlZnQucHVzaChPYmplY3QoZS5jbG9uZSkoeCkpOk8ucmlnaHQucHVzaChPYmplY3QoZS5jbG9uZSkoeCkpfWZ1bmN0aW9uIHAoTyx4LHYsVCxsPS0xKXtPYmplY3QoZS5zY2FsZUFuZEFkZCkobix4LHYsLVQpLHUoTyxuLC1sKSxPYmplY3QoZS5zY2FsZUFuZEFkZCkobix4LHYsVCksdShPLG4sbCl9ZnVuY3Rpb24geSh7bGVmdDpPLHJpZ2h0Onh9LHYpe2NvbnN0IFQ9T2JqZWN0KGUuY3JlYXRlKSgpLGw9T2JqZWN0KGUuY3JlYXRlKSgpO2xldCBoPU9bMF0sZj14WzBdLGc9Wy41KihoWzBdK2ZbMF0pLC41KihoWzFdK2ZbMV0pXTtPYmplY3QoZS5zdWIpKGwsaCxnKTtmb3IobGV0IE09MTtNPD12O00rKyl7Y29uc3QgQT0tMSpNYXRoLlBJKk0vdjtPYmplY3QoZS5yb3RhdGUpKFQsbCxbMCwwXSxBKSxPYmplY3QoZS5hZGQpKG4sZyxUKSxPLnVuc2hpZnQoT2JqZWN0KGUuY2xvbmUpKG4pKX1oPXhbeC5sZW5ndGgtMV0sZj1PW08ubGVuZ3RoLTFdLGc9Wy41KihoWzBdK2ZbMF0pLC41KihoWzFdK2ZbMV0pXSxPYmplY3QoZS5zdWIpKGwsaCxnKTtmb3IobGV0IE09MTtNPD12O00rKyl7Y29uc3QgQT0tMSpNYXRoLlBJKk0vdjtPYmplY3QoZS5yb3RhdGUpKFQsbCxbMCwwXSxBKSxPYmplY3QoZS5hZGQpKG4sZyxUKSx4LnB1c2goT2JqZWN0KGUuY2xvbmUpKG4pKX19fSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJpc1VuaXRUcmFuc2Zvcm0iLGZ1bmN0aW9uKCl7cmV0dXJuIGV9KSx0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7ZnVuY3Rpb24gZShuKXtyZXR1cm4gblswXT09PTEmJm5bMV09PT0wJiZuWzJdPT09MCYmblszXT09PTEmJm5bNF09PT0wJiZuWzVdPT09MH19LGZ1bmN0aW9uKGQscix0KXt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7dmFyIGU9dCg2MSksbj10KDYyKTtkLmV4cG9ydHM9ZnVuY3Rpb24oYSxzKXtpZihzPXN8fHt9LGE9YS5maWx0ZXIoZnVuY3Rpb24odil7cmV0dXJuIHYubGVuZ3RoPjJ9KSxhLmxlbmd0aD09PTApcmV0dXJue3Bvc2l0aW9uczpbXSxjZWxsczpbXX07dHlwZW9mIHMudmVydGV4U2l6ZSE9Im51bWJlciImJihzLnZlcnRleFNpemU9YVswXVswXS5sZW5ndGgpLGE9YS5tYXAoZnVuY3Rpb24odil7cmV0dXJuIHYucmVkdWNlKGZ1bmN0aW9uKFQsbCl7cmV0dXJuIFQuY29uY2F0KGwpfSl9KTtjb25zdCBpPXMucnVsZT09PSJldmVub2RkIj9lLldJTkRJTkdfT0REOmUuV0lORElOR19OT05aRVJPO2Zvcih2YXIgbz1lLnRlc3NlbGF0ZShuKHtjb250b3VyczphLHdpbmRpbmdSdWxlOmksZWxlbWVudFR5cGU6ZS5QT0xZR09OUyxwb2x5U2l6ZTozLHZlcnRleFNpemU6Mn0scykpLGM9W10sbT0wO208by52ZXJ0aWNlcy5sZW5ndGg7bSs9cy52ZXJ0ZXhTaXplKXt2YXIgdT1vLnZlcnRpY2VzLnNsaWNlKG0sbStzLnZlcnRleFNpemUpO2MucHVzaCh1KX12YXIgcD1bXTtmb3IobT0wO208by5lbGVtZW50cy5sZW5ndGg7bSs9Myl7dmFyIHk9by5lbGVtZW50c1ttXSxPPW8uZWxlbWVudHNbbSsxXSx4PW8uZWxlbWVudHNbbSsyXTtwLnB1c2goW3ksTyx4XSl9cmV0dXJue3Bvc2l0aW9uczpjLGNlbGxzOnB9fX0sZnVuY3Rpb24oZCxyLHQpe3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTt2YXIgZT17fSxuPXt9O2QuZXhwb3J0cz1lLGUuV0lORElOR19PREQ9MCxlLldJTkRJTkdfTk9OWkVSTz0xLGUuV0lORElOR19QT1NJVElWRT0yLGUuV0lORElOR19ORUdBVElWRT0zLGUuV0lORElOR19BQlNfR0VRX1RXTz00LGUuUE9MWUdPTlM9MCxlLkNPTk5FQ1RFRF9QT0xZR09OUz0xLGUuQk9VTkRBUllfQ09OVE9VUlM9MixlLnRlc3NlbGF0ZT1mdW5jdGlvbihsKXtmb3IodmFyIGg9bC5kZWJ1Z3x8ITEsZj1uZXcgVCxnPTA7ZzxsLmNvbnRvdXJzLmxlbmd0aDtnKyspZi5hZGRDb250b3VyKGwudmVydGV4U2l6ZXx8MixsLmNvbnRvdXJzW2ddKTtyZXR1cm4gZi50ZXNzZWxhdGUobC53aW5kaW5nUnVsZXx8ZS5XSU5ESU5HX09ERCxsLmVsZW1lbnRUeXBlfHxlLlBPTFlHT05TLGwucG9seVNpemV8fDMsbC52ZXJ0ZXhTaXplfHwyLGwubm9ybWFsfHxbMCwwLDFdKSx7dmVydGljZXM6Zi52ZXJ0aWNlcyx2ZXJ0ZXhJbmRpY2VzOmYudmVydGV4SW5kaWNlcyx2ZXJ0ZXhDb3VudDpmLnZlcnRleENvdW50LGVsZW1lbnRzOmYuZWxlbWVudHMsZWxlbWVudENvdW50OmYuZWxlbWVudENvdW50LG1lc2g6aD9mLm1lc2g6dm9pZCAwfX07dmFyIGE9ZnVuY3Rpb24obCl7aWYoIWwpdGhyb3ciQXNzZXJ0aW9uIEZhaWxlZCEifTtmdW5jdGlvbiBzKCl7dGhpcy5uZXh0PW51bGwsdGhpcy5wcmV2PW51bGwsdGhpcy5hbkVkZ2U9bnVsbCx0aGlzLmNvb3Jkcz1bMCwwLDBdLHRoaXMucz0wLHRoaXMudD0wLHRoaXMucHFIYW5kbGU9MCx0aGlzLm49MCx0aGlzLmlkeD0wfWZ1bmN0aW9uIGkoKXt0aGlzLm5leHQ9bnVsbCx0aGlzLnByZXY9bnVsbCx0aGlzLmFuRWRnZT1udWxsLHRoaXMudHJhaWw9bnVsbCx0aGlzLm49MCx0aGlzLm1hcmtlZD0hMSx0aGlzLmluc2lkZT0hMX1mdW5jdGlvbiBvKGwpe3RoaXMubmV4dD1udWxsLHRoaXMuU3ltPW51bGwsdGhpcy5PbmV4dD1udWxsLHRoaXMuTG5leHQ9bnVsbCx0aGlzLk9yZz1udWxsLHRoaXMuTGZhY2U9bnVsbCx0aGlzLmFjdGl2ZVJlZ2lvbj1udWxsLHRoaXMud2luZGluZz0wLHRoaXMuc2lkZT1sfW8ucHJvdG90eXBlPXtnZXQgUmZhY2UoKXtyZXR1cm4gdGhpcy5TeW0uTGZhY2V9LHNldCBSZmFjZShsKXt0aGlzLlN5bS5MZmFjZT1sfSxnZXQgRHN0KCl7cmV0dXJuIHRoaXMuU3ltLk9yZ30sc2V0IERzdChsKXt0aGlzLlN5bS5Pcmc9bH0sZ2V0IE9wcmV2KCl7cmV0dXJuIHRoaXMuU3ltLkxuZXh0fSxzZXQgT3ByZXYobCl7dGhpcy5TeW0uTG5leHQ9bH0sZ2V0IExwcmV2KCl7cmV0dXJuIHRoaXMuT25leHQuU3ltfSxzZXQgTHByZXYobCl7dGhpcy5PbmV4dC5TeW09bH0sZ2V0IERwcmV2KCl7cmV0dXJuIHRoaXMuTG5leHQuU3ltfSxzZXQgRHByZXYobCl7dGhpcy5MbmV4dC5TeW09bH0sZ2V0IFJwcmV2KCl7cmV0dXJuIHRoaXMuU3ltLk9uZXh0fSxzZXQgUnByZXYobCl7dGhpcy5TeW0uT25leHQ9bH0sZ2V0IERuZXh0KCl7cmV0dXJuIHRoaXMuU3ltLk9uZXh0LlN5bX0sc2V0IERuZXh0KGwpe3RoaXMuU3ltLk9uZXh0LlN5bT1sfSxnZXQgUm5leHQoKXtyZXR1cm4gdGhpcy5TeW0uTG5leHQuU3ltfSxzZXQgUm5leHQobCl7dGhpcy5TeW0uTG5leHQuU3ltPWx9fTtmdW5jdGlvbiBjKCl7dmFyIGw9bmV3IHMsaD1uZXcgaSxmPW5ldyBvKDApLGc9bmV3IG8oMSk7bC5uZXh0PWwucHJldj1sLGwuYW5FZGdlPW51bGwsaC5uZXh0PWgucHJldj1oLGguYW5FZGdlPW51bGwsaC50cmFpbD1udWxsLGgubWFya2VkPSExLGguaW5zaWRlPSExLGYubmV4dD1mLGYuU3ltPWcsZi5PbmV4dD1udWxsLGYuTG5leHQ9bnVsbCxmLk9yZz1udWxsLGYuTGZhY2U9bnVsbCxmLndpbmRpbmc9MCxmLmFjdGl2ZVJlZ2lvbj1udWxsLGcubmV4dD1nLGcuU3ltPWYsZy5PbmV4dD1udWxsLGcuTG5leHQ9bnVsbCxnLk9yZz1udWxsLGcuTGZhY2U9bnVsbCxnLndpbmRpbmc9MCxnLmFjdGl2ZVJlZ2lvbj1udWxsLHRoaXMudkhlYWQ9bCx0aGlzLmZIZWFkPWgsdGhpcy5lSGVhZD1mLHRoaXMuZUhlYWRTeW09Z31jLnByb3RvdHlwZT17bWFrZUVkZ2VfOmZ1bmN0aW9uKGwpe3ZhciBoPW5ldyBvKDApLGY9bmV3IG8oMSk7bC5TeW0uc2lkZTxsLnNpZGUmJihsPWwuU3ltKTt2YXIgZz1sLlN5bS5uZXh0O3JldHVybiBmLm5leHQ9ZyxnLlN5bS5uZXh0PWgsaC5uZXh0PWwsbC5TeW0ubmV4dD1mLGguU3ltPWYsaC5PbmV4dD1oLGguTG5leHQ9ZixoLk9yZz1udWxsLGguTGZhY2U9bnVsbCxoLndpbmRpbmc9MCxoLmFjdGl2ZVJlZ2lvbj1udWxsLGYuU3ltPWgsZi5PbmV4dD1mLGYuTG5leHQ9aCxmLk9yZz1udWxsLGYuTGZhY2U9bnVsbCxmLndpbmRpbmc9MCxmLmFjdGl2ZVJlZ2lvbj1udWxsLGh9LHNwbGljZV86ZnVuY3Rpb24obCxoKXt2YXIgZj1sLk9uZXh0LGc9aC5PbmV4dDtmLlN5bS5MbmV4dD1oLGcuU3ltLkxuZXh0PWwsbC5PbmV4dD1nLGguT25leHQ9Zn0sbWFrZVZlcnRleF86ZnVuY3Rpb24obCxoLGYpe3ZhciBnPWw7YShnIT09bnVsbCk7dmFyIE09Zi5wcmV2O2cucHJldj1NLE0ubmV4dD1nLGcubmV4dD1mLGYucHJldj1nLGcuYW5FZGdlPWg7dmFyIEE9aDtkbyBBLk9yZz1nLEE9QS5PbmV4dDt3aGlsZShBIT09aCl9LG1ha2VGYWNlXzpmdW5jdGlvbihsLGgsZil7dmFyIGc9bDthKGchPT1udWxsKTt2YXIgTT1mLnByZXY7Zy5wcmV2PU0sTS5uZXh0PWcsZy5uZXh0PWYsZi5wcmV2PWcsZy5hbkVkZ2U9aCxnLnRyYWlsPW51bGwsZy5tYXJrZWQ9ITEsZy5pbnNpZGU9Zi5pbnNpZGU7dmFyIEE9aDtkbyBBLkxmYWNlPWcsQT1BLkxuZXh0O3doaWxlKEEhPT1oKX0sa2lsbEVkZ2VfOmZ1bmN0aW9uKGwpe2wuU3ltLnNpZGU8bC5zaWRlJiYobD1sLlN5bSk7dmFyIGg9bC5uZXh0LGY9bC5TeW0ubmV4dDtoLlN5bS5uZXh0PWYsZi5TeW0ubmV4dD1ofSxraWxsVmVydGV4XzpmdW5jdGlvbihsLGgpe3ZhciBmPWwuYW5FZGdlLGc9ZjtkbyBnLk9yZz1oLGc9Zy5PbmV4dDt3aGlsZShnIT09Zik7dmFyIE09bC5wcmV2LEE9bC5uZXh0O0EucHJldj1NLE0ubmV4dD1BfSxraWxsRmFjZV86ZnVuY3Rpb24obCxoKXt2YXIgZj1sLmFuRWRnZSxnPWY7ZG8gZy5MZmFjZT1oLGc9Zy5MbmV4dDt3aGlsZShnIT09Zik7dmFyIE09bC5wcmV2LEE9bC5uZXh0O0EucHJldj1NLE0ubmV4dD1BfSxtYWtlRWRnZTpmdW5jdGlvbigpe3ZhciBsPW5ldyBzLGg9bmV3IHMsZj1uZXcgaSxnPXRoaXMubWFrZUVkZ2VfKHRoaXMuZUhlYWQpO3JldHVybiB0aGlzLm1ha2VWZXJ0ZXhfKGwsZyx0aGlzLnZIZWFkKSx0aGlzLm1ha2VWZXJ0ZXhfKGgsZy5TeW0sdGhpcy52SGVhZCksdGhpcy5tYWtlRmFjZV8oZixnLHRoaXMuZkhlYWQpLGd9LHNwbGljZTpmdW5jdGlvbihsLGgpe3ZhciBmPSExLGc9ITE7aWYobCE9PWgpe2lmKGguT3JnIT09bC5PcmcmJihnPSEwLHRoaXMua2lsbFZlcnRleF8oaC5PcmcsbC5PcmcpKSxoLkxmYWNlIT09bC5MZmFjZSYmKGY9ITAsdGhpcy5raWxsRmFjZV8oaC5MZmFjZSxsLkxmYWNlKSksdGhpcy5zcGxpY2VfKGgsbCksIWcpe3ZhciBNPW5ldyBzO3RoaXMubWFrZVZlcnRleF8oTSxoLGwuT3JnKSxsLk9yZy5hbkVkZ2U9bH1pZighZil7dmFyIEE9bmV3IGk7dGhpcy5tYWtlRmFjZV8oQSxoLGwuTGZhY2UpLGwuTGZhY2UuYW5FZGdlPWx9fX0sZGVsZXRlOmZ1bmN0aW9uKGwpe3ZhciBoPWwuU3ltLGY9ITE7aWYobC5MZmFjZSE9PWwuUmZhY2UmJihmPSEwLHRoaXMua2lsbEZhY2VfKGwuTGZhY2UsbC5SZmFjZSkpLGwuT25leHQ9PT1sKXRoaXMua2lsbFZlcnRleF8obC5PcmcsbnVsbCk7ZWxzZSBpZihsLlJmYWNlLmFuRWRnZT1sLk9wcmV2LGwuT3JnLmFuRWRnZT1sLk9uZXh0LHRoaXMuc3BsaWNlXyhsLGwuT3ByZXYpLCFmKXt2YXIgZz1uZXcgaTt0aGlzLm1ha2VGYWNlXyhnLGwsbC5MZmFjZSl9aC5PbmV4dD09PWg/KHRoaXMua2lsbFZlcnRleF8oaC5PcmcsbnVsbCksdGhpcy5raWxsRmFjZV8oaC5MZmFjZSxudWxsKSk6KGwuTGZhY2UuYW5FZGdlPWguT3ByZXYsaC5PcmcuYW5FZGdlPWguT25leHQsdGhpcy5zcGxpY2VfKGgsaC5PcHJldikpLHRoaXMua2lsbEVkZ2VfKGwpfSxhZGRFZGdlVmVydGV4OmZ1bmN0aW9uKGwpe3ZhciBoPXRoaXMubWFrZUVkZ2VfKGwpLGY9aC5TeW07dGhpcy5zcGxpY2VfKGgsbC5MbmV4dCksaC5Pcmc9bC5Ec3Q7dmFyIGc9bmV3IHM7cmV0dXJuIHRoaXMubWFrZVZlcnRleF8oZyxmLGguT3JnKSxoLkxmYWNlPWYuTGZhY2U9bC5MZmFjZSxofSxzcGxpdEVkZ2U6ZnVuY3Rpb24obCxoKXt2YXIgZj10aGlzLmFkZEVkZ2VWZXJ0ZXgobCksZz1mLlN5bTtyZXR1cm4gdGhpcy5zcGxpY2VfKGwuU3ltLGwuU3ltLk9wcmV2KSx0aGlzLnNwbGljZV8obC5TeW0sZyksbC5Ec3Q9Zy5PcmcsZy5Ec3QuYW5FZGdlPWcuU3ltLGcuUmZhY2U9bC5SZmFjZSxnLndpbmRpbmc9bC53aW5kaW5nLGcuU3ltLndpbmRpbmc9bC5TeW0ud2luZGluZyxnfSxjb25uZWN0OmZ1bmN0aW9uKGwsaCl7dmFyIGY9ITEsZz10aGlzLm1ha2VFZGdlXyhsKSxNPWcuU3ltO2lmKGguTGZhY2UhPT1sLkxmYWNlJiYoZj0hMCx0aGlzLmtpbGxGYWNlXyhoLkxmYWNlLGwuTGZhY2UpKSx0aGlzLnNwbGljZV8oZyxsLkxuZXh0KSx0aGlzLnNwbGljZV8oTSxoKSxnLk9yZz1sLkRzdCxNLk9yZz1oLk9yZyxnLkxmYWNlPU0uTGZhY2U9bC5MZmFjZSxsLkxmYWNlLmFuRWRnZT1NLCFmKXt2YXIgQT1uZXcgaTt0aGlzLm1ha2VGYWNlXyhBLGcsbC5MZmFjZSl9cmV0dXJuIGd9LHphcEZhY2U6ZnVuY3Rpb24obCl7dmFyIGg9bC5hbkVkZ2UsZixnLE0sQSxDO2c9aC5MbmV4dDtkbyBmPWcsZz1mLkxuZXh0LGYuTGZhY2U9bnVsbCxmLlJmYWNlPT09bnVsbCYmKGYuT25leHQ9PT1mP3RoaXMua2lsbFZlcnRleF8oZi5PcmcsbnVsbCk6KGYuT3JnLmFuRWRnZT1mLk9uZXh0LHRoaXMuc3BsaWNlXyhmLGYuT3ByZXYpKSxNPWYuU3ltLE0uT25leHQ9PT1NP3RoaXMua2lsbFZlcnRleF8oTS5PcmcsbnVsbCk6KE0uT3JnLmFuRWRnZT1NLk9uZXh0LHRoaXMuc3BsaWNlXyhNLE0uT3ByZXYpKSx0aGlzLmtpbGxFZGdlXyhmKSk7d2hpbGUoZiE9aCk7QT1sLnByZXYsQz1sLm5leHQsQy5wcmV2PUEsQS5uZXh0PUN9LGNvdW50RmFjZVZlcnRzXzpmdW5jdGlvbihsKXt2YXIgaD1sLmFuRWRnZSxmPTA7ZG8gZisrLGg9aC5MbmV4dDt3aGlsZShoIT09bC5hbkVkZ2UpO3JldHVybiBmfSxtZXJnZUNvbnZleEZhY2VzOmZ1bmN0aW9uKGwpe3ZhciBoLGYsZyxNLEEsQyxiO2ZvcihoPXRoaXMuZkhlYWQubmV4dDtoIT09dGhpcy5mSGVhZDtoPWgubmV4dClpZihoLmluc2lkZSlmb3IoZj1oLmFuRWRnZSxBPWYuT3JnO2c9Zi5MbmV4dCxNPWYuU3ltLE0mJk0uTGZhY2UmJk0uTGZhY2UuaW5zaWRlJiYoQz10aGlzLmNvdW50RmFjZVZlcnRzXyhoKSxiPXRoaXMuY291bnRGYWNlVmVydHNfKE0uTGZhY2UpLEMrYi0yPD1sJiZuLnZlcnRDQ1coZi5McHJldi5PcmcsZi5PcmcsTS5MbmV4dC5MbmV4dC5PcmcpJiZuLnZlcnRDQ1coTS5McHJldi5PcmcsTS5PcmcsZi5MbmV4dC5MbmV4dC5PcmcpJiYoZz1NLkxuZXh0LHRoaXMuZGVsZXRlKE0pLGY9bnVsbCxNPW51bGwpKSwhKGYmJmYuTG5leHQuT3JnPT09QSk7KWY9ZztyZXR1cm4hMH0sY2hlY2s6ZnVuY3Rpb24oKXt2YXIgbD10aGlzLmZIZWFkLGg9dGhpcy52SGVhZCxmPXRoaXMuZUhlYWQsZyxNLEEsQyxiLEU7Zm9yKE09bCxNPWw7KGc9TS5uZXh0KSE9PWw7TT1nKXthKGcucHJldj09PU0pLGI9Zy5hbkVkZ2U7ZG8gYShiLlN5bSE9PWIpLGEoYi5TeW0uU3ltPT09YiksYShiLkxuZXh0Lk9uZXh0LlN5bT09PWIpLGEoYi5PbmV4dC5TeW0uTG5leHQ9PT1iKSxhKGIuTGZhY2U9PT1nKSxiPWIuTG5leHQ7d2hpbGUoYiE9PWcuYW5FZGdlKX1mb3IoYShnLnByZXY9PT1NJiZnLmFuRWRnZT09PW51bGwpLEM9aCxDPWg7KEE9Qy5uZXh0KSE9PWg7Qz1BKXthKEEucHJldj09PUMpLGI9QS5hbkVkZ2U7ZG8gYShiLlN5bSE9PWIpLGEoYi5TeW0uU3ltPT09YiksYShiLkxuZXh0Lk9uZXh0LlN5bT09PWIpLGEoYi5PbmV4dC5TeW0uTG5leHQ9PT1iKSxhKGIuT3JnPT09QSksYj1iLk9uZXh0O3doaWxlKGIhPT1BLmFuRWRnZSl9Zm9yKGEoQS5wcmV2PT09QyYmQS5hbkVkZ2U9PT1udWxsKSxFPWYsRT1mOyhiPUUubmV4dCkhPT1mO0U9YilhKGIuU3ltLm5leHQ9PT1FLlN5bSksYShiLlN5bSE9PWIpLGEoYi5TeW0uU3ltPT09YiksYShiLk9yZyE9PW51bGwpLGEoYi5Ec3QhPT1udWxsKSxhKGIuTG5leHQuT25leHQuU3ltPT09YiksYShiLk9uZXh0LlN5bS5MbmV4dD09PWIpO2EoYi5TeW0ubmV4dD09PUUuU3ltJiZiLlN5bT09PXRoaXMuZUhlYWRTeW0mJmIuU3ltLlN5bT09PWImJmIuT3JnPT09bnVsbCYmYi5Ec3Q9PT1udWxsJiZiLkxmYWNlPT09bnVsbCYmYi5SZmFjZT09PW51bGwpfX0sbi52ZXJ0RXE9ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5zPT09aC5zJiZsLnQ9PT1oLnR9LG4udmVydExlcT1mdW5jdGlvbihsLGgpe3JldHVybiBsLnM8aC5zfHxsLnM9PT1oLnMmJmwudDw9aC50fSxuLnRyYW5zTGVxPWZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwudDxoLnR8fGwudD09PWgudCYmbC5zPD1oLnN9LG4uZWRnZUdvZXNMZWZ0PWZ1bmN0aW9uKGwpe3JldHVybiBuLnZlcnRMZXEobC5Ec3QsbC5PcmcpfSxuLmVkZ2VHb2VzUmlnaHQ9ZnVuY3Rpb24obCl7cmV0dXJuIG4udmVydExlcShsLk9yZyxsLkRzdCl9LG4udmVydEwxZGlzdD1mdW5jdGlvbihsLGgpe3JldHVybiBNYXRoLmFicyhsLnMtaC5zKStNYXRoLmFicyhsLnQtaC50KX0sbi5lZGdlRXZhbD1mdW5jdGlvbihsLGgsZil7YShuLnZlcnRMZXEobCxoKSYmbi52ZXJ0TGVxKGgsZikpO3ZhciBnPWgucy1sLnMsTT1mLnMtaC5zO3JldHVybiBnK00+MD9nPE0/aC50LWwudCsobC50LWYudCkqKGcvKGcrTSkpOmgudC1mLnQrKGYudC1sLnQpKihNLyhnK00pKTowfSxuLmVkZ2VTaWduPWZ1bmN0aW9uKGwsaCxmKXthKG4udmVydExlcShsLGgpJiZuLnZlcnRMZXEoaCxmKSk7dmFyIGc9aC5zLWwucyxNPWYucy1oLnM7cmV0dXJuIGcrTT4wPyhoLnQtZi50KSpnKyhoLnQtbC50KSpNOjB9LG4udHJhbnNFdmFsPWZ1bmN0aW9uKGwsaCxmKXthKG4udHJhbnNMZXEobCxoKSYmbi50cmFuc0xlcShoLGYpKTt2YXIgZz1oLnQtbC50LE09Zi50LWgudDtyZXR1cm4gZytNPjA/ZzxNP2gucy1sLnMrKGwucy1mLnMpKihnLyhnK00pKTpoLnMtZi5zKyhmLnMtbC5zKSooTS8oZytNKSk6MH0sbi50cmFuc1NpZ249ZnVuY3Rpb24obCxoLGYpe2Eobi50cmFuc0xlcShsLGgpJiZuLnRyYW5zTGVxKGgsZikpO3ZhciBnPWgudC1sLnQsTT1mLnQtaC50O3JldHVybiBnK00+MD8oaC5zLWYucykqZysoaC5zLWwucykqTTowfSxuLnZlcnRDQ1c9ZnVuY3Rpb24obCxoLGYpe3JldHVybiBsLnMqKGgudC1mLnQpK2gucyooZi50LWwudCkrZi5zKihsLnQtaC50KT49MH0sbi5pbnRlcnBvbGF0ZT1mdW5jdGlvbihsLGgsZixnKXtyZXR1cm4gbD1sPDA/MDpsLGY9ZjwwPzA6ZixsPD1mP2Y9PT0wPyhoK2cpLzI6aCsoZy1oKSoobC8obCtmKSk6ZysoaC1nKSooZi8obCtmKSl9LG4uaW50ZXJzZWN0PWZ1bmN0aW9uKGwsaCxmLGcsTSl7dmFyIEEsQyxiO24udmVydExlcShsLGgpfHwoYj1sLGw9aCxoPWIpLG4udmVydExlcShmLGcpfHwoYj1mLGY9ZyxnPWIpLG4udmVydExlcShsLGYpfHwoYj1sLGw9ZixmPWIsYj1oLGg9ZyxnPWIpLG4udmVydExlcShmLGgpP24udmVydExlcShoLGcpPyhBPW4uZWRnZUV2YWwobCxmLGgpLEM9bi5lZGdlRXZhbChmLGgsZyksQStDPDAmJihBPS1BLEM9LUMpLE0ucz1uLmludGVycG9sYXRlKEEsZi5zLEMsaC5zKSk6KEE9bi5lZGdlU2lnbihsLGYsaCksQz0tbi5lZGdlU2lnbihsLGcsaCksQStDPDAmJihBPS1BLEM9LUMpLE0ucz1uLmludGVycG9sYXRlKEEsZi5zLEMsZy5zKSk6TS5zPShmLnMraC5zKS8yLG4udHJhbnNMZXEobCxoKXx8KGI9bCxsPWgsaD1iKSxuLnRyYW5zTGVxKGYsZyl8fChiPWYsZj1nLGc9Yiksbi50cmFuc0xlcShsLGYpfHwoYj1sLGw9ZixmPWIsYj1oLGg9ZyxnPWIpLG4udHJhbnNMZXEoZixoKT9uLnRyYW5zTGVxKGgsZyk/KEE9bi50cmFuc0V2YWwobCxmLGgpLEM9bi50cmFuc0V2YWwoZixoLGcpLEErQzwwJiYoQT0tQSxDPS1DKSxNLnQ9bi5pbnRlcnBvbGF0ZShBLGYudCxDLGgudCkpOihBPW4udHJhbnNTaWduKGwsZixoKSxDPS1uLnRyYW5zU2lnbihsLGcsaCksQStDPDAmJihBPS1BLEM9LUMpLE0udD1uLmludGVycG9sYXRlKEEsZi50LEMsZy50KSk6TS50PShmLnQraC50KS8yfTtmdW5jdGlvbiBtKCl7dGhpcy5rZXk9bnVsbCx0aGlzLm5leHQ9bnVsbCx0aGlzLnByZXY9bnVsbH1mdW5jdGlvbiB1KGwsaCl7dGhpcy5oZWFkPW5ldyBtLHRoaXMuaGVhZC5uZXh0PXRoaXMuaGVhZCx0aGlzLmhlYWQucHJldj10aGlzLmhlYWQsdGhpcy5mcmFtZT1sLHRoaXMubGVxPWh9dS5wcm90b3R5cGU9e21pbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhlYWQubmV4dH0sbWF4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGVhZC5wcmV2fSxpbnNlcnQ6ZnVuY3Rpb24obCl7cmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKHRoaXMuaGVhZCxsKX0sc2VhcmNoOmZ1bmN0aW9uKGwpe3ZhciBoPXRoaXMuaGVhZDtkbyBoPWgubmV4dDt3aGlsZShoLmtleSE9PW51bGwmJiF0aGlzLmxlcSh0aGlzLmZyYW1lLGwsaC5rZXkpKTtyZXR1cm4gaH0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKGwsaCl7ZG8gbD1sLnByZXY7d2hpbGUobC5rZXkhPT1udWxsJiYhdGhpcy5sZXEodGhpcy5mcmFtZSxsLmtleSxoKSk7dmFyIGY9bmV3IG07cmV0dXJuIGYua2V5PWgsZi5uZXh0PWwubmV4dCxsLm5leHQucHJldj1mLGYucHJldj1sLGwubmV4dD1mLGZ9LGRlbGV0ZTpmdW5jdGlvbihsKXtsLm5leHQucHJldj1sLnByZXYsbC5wcmV2Lm5leHQ9bC5uZXh0fX07ZnVuY3Rpb24gcCgpe3RoaXMuaGFuZGxlPW51bGx9ZnVuY3Rpb24geSgpe3RoaXMua2V5PW51bGwsdGhpcy5ub2RlPW51bGx9ZnVuY3Rpb24gTyhsLGgpe3RoaXMuc2l6ZT0wLHRoaXMubWF4PWwsdGhpcy5ub2Rlcz1bXSx0aGlzLm5vZGVzLmxlbmd0aD1sKzE7dmFyIGY7Zm9yKGY9MDtmPHRoaXMubm9kZXMubGVuZ3RoO2YrKyl0aGlzLm5vZGVzW2ZdPW5ldyBwO2Zvcih0aGlzLmhhbmRsZXM9W10sdGhpcy5oYW5kbGVzLmxlbmd0aD1sKzEsZj0wO2Y8dGhpcy5oYW5kbGVzLmxlbmd0aDtmKyspdGhpcy5oYW5kbGVzW2ZdPW5ldyB5O3RoaXMuaW5pdGlhbGl6ZWQ9ITEsdGhpcy5mcmVlTGlzdD0wLHRoaXMubGVxPWgsdGhpcy5ub2Rlc1sxXS5oYW5kbGU9MSx0aGlzLmhhbmRsZXNbMV0ua2V5PW51bGx9Ty5wcm90b3R5cGU9e2Zsb2F0RG93bl86ZnVuY3Rpb24obCl7dmFyIGg9dGhpcy5ub2RlcyxmPXRoaXMuaGFuZGxlcyxnLE0sQTtmb3IoZz1oW2xdLmhhbmRsZTs7KXtpZihBPWw8PDEsQTx0aGlzLnNpemUmJnRoaXMubGVxKGZbaFtBKzFdLmhhbmRsZV0ua2V5LGZbaFtBXS5oYW5kbGVdLmtleSkmJisrQSxhKEE8PXRoaXMubWF4KSxNPWhbQV0uaGFuZGxlLEE+dGhpcy5zaXplfHx0aGlzLmxlcShmW2ddLmtleSxmW01dLmtleSkpe2hbbF0uaGFuZGxlPWcsZltnXS5ub2RlPWw7YnJlYWt9aFtsXS5oYW5kbGU9TSxmW01dLm5vZGU9bCxsPUF9fSxmbG9hdFVwXzpmdW5jdGlvbihsKXt2YXIgaD10aGlzLm5vZGVzLGY9dGhpcy5oYW5kbGVzLGcsTSxBO2ZvcihnPWhbbF0uaGFuZGxlOzspe2lmKEE9bD4+MSxNPWhbQV0uaGFuZGxlLEE9PT0wfHx0aGlzLmxlcShmW01dLmtleSxmW2ddLmtleSkpe2hbbF0uaGFuZGxlPWcsZltnXS5ub2RlPWw7YnJlYWt9aFtsXS5oYW5kbGU9TSxmW01dLm5vZGU9bCxsPUF9fSxpbml0OmZ1bmN0aW9uKCl7Zm9yKHZhciBsPXRoaXMuc2l6ZTtsPj0xOy0tbCl0aGlzLmZsb2F0RG93bl8obCk7dGhpcy5pbml0aWFsaXplZD0hMH0sbWluOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGFuZGxlc1t0aGlzLm5vZGVzWzFdLmhhbmRsZV0ua2V5fSxpbnNlcnQ6ZnVuY3Rpb24obCl7dmFyIGgsZjtpZihoPSsrdGhpcy5zaXplLGgqMj50aGlzLm1heCl7dGhpcy5tYXgqPTI7dmFyIGcsTTtmb3IoTT10aGlzLm5vZGVzLmxlbmd0aCx0aGlzLm5vZGVzLmxlbmd0aD10aGlzLm1heCsxLGc9TTtnPHRoaXMubm9kZXMubGVuZ3RoO2crKyl0aGlzLm5vZGVzW2ddPW5ldyBwO2ZvcihNPXRoaXMuaGFuZGxlcy5sZW5ndGgsdGhpcy5oYW5kbGVzLmxlbmd0aD10aGlzLm1heCsxLGc9TTtnPHRoaXMuaGFuZGxlcy5sZW5ndGg7ZysrKXRoaXMuaGFuZGxlc1tnXT1uZXcgeX1yZXR1cm4gdGhpcy5mcmVlTGlzdD09PTA/Zj1oOihmPXRoaXMuZnJlZUxpc3QsdGhpcy5mcmVlTGlzdD10aGlzLmhhbmRsZXNbZl0ubm9kZSksdGhpcy5ub2Rlc1toXS5oYW5kbGU9Zix0aGlzLmhhbmRsZXNbZl0ubm9kZT1oLHRoaXMuaGFuZGxlc1tmXS5rZXk9bCx0aGlzLmluaXRpYWxpemVkJiZ0aGlzLmZsb2F0VXBfKGgpLGZ9LGV4dHJhY3RNaW46ZnVuY3Rpb24oKXt2YXIgbD10aGlzLm5vZGVzLGg9dGhpcy5oYW5kbGVzLGY9bFsxXS5oYW5kbGUsZz1oW2ZdLmtleTtyZXR1cm4gdGhpcy5zaXplPjAmJihsWzFdLmhhbmRsZT1sW3RoaXMuc2l6ZV0uaGFuZGxlLGhbbFsxXS5oYW5kbGVdLm5vZGU9MSxoW2ZdLmtleT1udWxsLGhbZl0ubm9kZT10aGlzLmZyZWVMaXN0LHRoaXMuZnJlZUxpc3Q9ZiwtLXRoaXMuc2l6ZSx0aGlzLnNpemU+MCYmdGhpcy5mbG9hdERvd25fKDEpKSxnfSxkZWxldGU6ZnVuY3Rpb24obCl7dmFyIGg9dGhpcy5ub2RlcyxmPXRoaXMuaGFuZGxlcyxnO2EobD49MSYmbDw9dGhpcy5tYXgmJmZbbF0ua2V5IT09bnVsbCksZz1mW2xdLm5vZGUsaFtnXS5oYW5kbGU9aFt0aGlzLnNpemVdLmhhbmRsZSxmW2hbZ10uaGFuZGxlXS5ub2RlPWcsLS10aGlzLnNpemUsZzw9dGhpcy5zaXplJiYoZzw9MXx8dGhpcy5sZXEoZltoW2c+PjFdLmhhbmRsZV0ua2V5LGZbaFtnXS5oYW5kbGVdLmtleSk/dGhpcy5mbG9hdERvd25fKGcpOnRoaXMuZmxvYXRVcF8oZykpLGZbbF0ua2V5PW51bGwsZltsXS5ub2RlPXRoaXMuZnJlZUxpc3QsdGhpcy5mcmVlTGlzdD1sfX07ZnVuY3Rpb24geCgpe3RoaXMuZVVwPW51bGwsdGhpcy5ub2RlVXA9bnVsbCx0aGlzLndpbmRpbmdOdW1iZXI9MCx0aGlzLmluc2lkZT0hMSx0aGlzLnNlbnRpbmVsPSExLHRoaXMuZGlydHk9ITEsdGhpcy5maXhVcHBlckVkZ2U9ITF9dmFyIHY9e307di5yZWdpb25CZWxvdz1mdW5jdGlvbihsKXtyZXR1cm4gbC5ub2RlVXAucHJldi5rZXl9LHYucmVnaW9uQWJvdmU9ZnVuY3Rpb24obCl7cmV0dXJuIGwubm9kZVVwLm5leHQua2V5fSx2LmRlYnVnRXZlbnQ9ZnVuY3Rpb24obCl7fSx2LmFkZFdpbmRpbmc9ZnVuY3Rpb24obCxoKXtsLndpbmRpbmcrPWgud2luZGluZyxsLlN5bS53aW5kaW5nKz1oLlN5bS53aW5kaW5nfSx2LmVkZ2VMZXE9ZnVuY3Rpb24obCxoLGYpe3ZhciBnPWwuZXZlbnQsQyxiLE09aC5lVXAsQT1mLmVVcDtpZihNLkRzdD09PWcpcmV0dXJuIEEuRHN0PT09Zz9uLnZlcnRMZXEoTS5PcmcsQS5PcmcpP24uZWRnZVNpZ24oQS5Ec3QsTS5PcmcsQS5PcmcpPD0wOm4uZWRnZVNpZ24oTS5Ec3QsQS5PcmcsTS5PcmcpPj0wOm4uZWRnZVNpZ24oQS5Ec3QsZyxBLk9yZyk8PTA7aWYoQS5Ec3Q9PT1nKXJldHVybiBuLmVkZ2VTaWduKE0uRHN0LGcsTS5PcmcpPj0wO3ZhciBDPW4uZWRnZUV2YWwoTS5Ec3QsZyxNLk9yZyksYj1uLmVkZ2VFdmFsKEEuRHN0LGcsQS5PcmcpO3JldHVybiBDPj1ifSx2LmRlbGV0ZVJlZ2lvbj1mdW5jdGlvbihsLGgpe2guZml4VXBwZXJFZGdlJiZhKGguZVVwLndpbmRpbmc9PT0wKSxoLmVVcC5hY3RpdmVSZWdpb249bnVsbCxsLmRpY3QuZGVsZXRlKGgubm9kZVVwKX0sdi5maXhVcHBlckVkZ2U9ZnVuY3Rpb24obCxoLGYpe2EoaC5maXhVcHBlckVkZ2UpLGwubWVzaC5kZWxldGUoaC5lVXApLGguZml4VXBwZXJFZGdlPSExLGguZVVwPWYsZi5hY3RpdmVSZWdpb249aH0sdi50b3BMZWZ0UmVnaW9uPWZ1bmN0aW9uKGwsaCl7dmFyIGY9aC5lVXAuT3JnLGc7ZG8gaD12LnJlZ2lvbkFib3ZlKGgpO3doaWxlKGguZVVwLk9yZz09PWYpO2lmKGguZml4VXBwZXJFZGdlKXtpZihnPWwubWVzaC5jb25uZWN0KHYucmVnaW9uQmVsb3coaCkuZVVwLlN5bSxoLmVVcC5MbmV4dCksZz09PW51bGwpcmV0dXJuIG51bGw7di5maXhVcHBlckVkZ2UobCxoLGcpLGg9di5yZWdpb25BYm92ZShoKX1yZXR1cm4gaH0sdi50b3BSaWdodFJlZ2lvbj1mdW5jdGlvbihsKXt2YXIgaD1sLmVVcC5Ec3Q7ZG8gbD12LnJlZ2lvbkFib3ZlKGwpO3doaWxlKGwuZVVwLkRzdD09PWgpO3JldHVybiBsfSx2LmFkZFJlZ2lvbkJlbG93PWZ1bmN0aW9uKGwsaCxmKXt2YXIgZz1uZXcgeDtyZXR1cm4gZy5lVXA9ZixnLm5vZGVVcD1sLmRpY3QuaW5zZXJ0QmVmb3JlKGgubm9kZVVwLGcpLGcuZml4VXBwZXJFZGdlPSExLGcuc2VudGluZWw9ITEsZy5kaXJ0eT0hMSxmLmFjdGl2ZVJlZ2lvbj1nLGd9LHYuaXNXaW5kaW5nSW5zaWRlPWZ1bmN0aW9uKGwsaCl7c3dpdGNoKGwud2luZGluZ1J1bGUpe2Nhc2UgZS5XSU5ESU5HX09ERDpyZXR1cm4oaCYxKSE9PTA7Y2FzZSBlLldJTkRJTkdfTk9OWkVSTzpyZXR1cm4gaCE9PTA7Y2FzZSBlLldJTkRJTkdfUE9TSVRJVkU6cmV0dXJuIGg+MDtjYXNlIGUuV0lORElOR19ORUdBVElWRTpyZXR1cm4gaDwwO2Nhc2UgZS5XSU5ESU5HX0FCU19HRVFfVFdPOnJldHVybiBoPj0yfHxoPD0tMn1yZXR1cm4gYSghMSksITF9LHYuY29tcHV0ZVdpbmRpbmc9ZnVuY3Rpb24obCxoKXtoLndpbmRpbmdOdW1iZXI9di5yZWdpb25BYm92ZShoKS53aW5kaW5nTnVtYmVyK2guZVVwLndpbmRpbmcsaC5pbnNpZGU9di5pc1dpbmRpbmdJbnNpZGUobCxoLndpbmRpbmdOdW1iZXIpfSx2LmZpbmlzaFJlZ2lvbj1mdW5jdGlvbihsLGgpe3ZhciBmPWguZVVwLGc9Zi5MZmFjZTtnLmluc2lkZT1oLmluc2lkZSxnLmFuRWRnZT1mLHYuZGVsZXRlUmVnaW9uKGwsaCl9LHYuZmluaXNoTGVmdFJlZ2lvbnM9ZnVuY3Rpb24obCxoLGYpe2Zvcih2YXIgZyxDLE09bnVsbCxBPWgsQz1oLmVVcDtBIT09Zjspe2lmKEEuZml4VXBwZXJFZGdlPSExLE09di5yZWdpb25CZWxvdyhBKSxnPU0uZVVwLGcuT3JnIT1DLk9yZyl7aWYoIU0uZml4VXBwZXJFZGdlKXt2LmZpbmlzaFJlZ2lvbihsLEEpO2JyZWFrfWc9bC5tZXNoLmNvbm5lY3QoQy5McHJldixnLlN5bSksdi5maXhVcHBlckVkZ2UobCxNLGcpfUMuT25leHQhPT1nJiYobC5tZXNoLnNwbGljZShnLk9wcmV2LGcpLGwubWVzaC5zcGxpY2UoQyxnKSksdi5maW5pc2hSZWdpb24obCxBKSxDPU0uZVVwLEE9TX1yZXR1cm4gQ30sdi5hZGRSaWdodEVkZ2VzPWZ1bmN0aW9uKGwsaCxmLGcsTSxBKXt2YXIgQyxiLEUsTCxEPSEwO0U9ZjtkbyBhKG4udmVydExlcShFLk9yZyxFLkRzdCkpLHYuYWRkUmVnaW9uQmVsb3cobCxoLEUuU3ltKSxFPUUuT25leHQ7d2hpbGUoRSE9PWcpO2ZvcihNPT09bnVsbCYmKE09di5yZWdpb25CZWxvdyhoKS5lVXAuUnByZXYpLGI9aCxMPU07Qz12LnJlZ2lvbkJlbG93KGIpLEU9Qy5lVXAuU3ltLEUuT3JnPT09TC5Pcmc7KUUuT25leHQhPT1MJiYobC5tZXNoLnNwbGljZShFLk9wcmV2LEUpLGwubWVzaC5zcGxpY2UoTC5PcHJldixFKSksQy53aW5kaW5nTnVtYmVyPWIud2luZGluZ051bWJlci1FLndpbmRpbmcsQy5pbnNpZGU9di5pc1dpbmRpbmdJbnNpZGUobCxDLndpbmRpbmdOdW1iZXIpLGIuZGlydHk9ITAsIUQmJnYuY2hlY2tGb3JSaWdodFNwbGljZShsLGIpJiYodi5hZGRXaW5kaW5nKEUsTCksdi5kZWxldGVSZWdpb24obCxiKSxsLm1lc2guZGVsZXRlKEwpKSxEPSExLGI9QyxMPUU7Yi5kaXJ0eT0hMCxhKGIud2luZGluZ051bWJlci1FLndpbmRpbmc9PT1DLndpbmRpbmdOdW1iZXIpLEEmJnYud2Fsa0RpcnR5UmVnaW9ucyhsLGIpfSx2LnNwbGljZU1lcmdlVmVydGljZXM9ZnVuY3Rpb24obCxoLGYpe2wubWVzaC5zcGxpY2UoaCxmKX0sdi52ZXJ0ZXhXZWlnaHRzPWZ1bmN0aW9uKGwsaCxmKXt2YXIgZz1uLnZlcnRMMWRpc3QoaCxsKSxNPW4udmVydEwxZGlzdChmLGwpLEE9LjUqTS8oZytNKSxDPS41KmcvKGcrTSk7bC5jb29yZHNbMF0rPUEqaC5jb29yZHNbMF0rQypmLmNvb3Jkc1swXSxsLmNvb3Jkc1sxXSs9QSpoLmNvb3Jkc1sxXStDKmYuY29vcmRzWzFdLGwuY29vcmRzWzJdKz1BKmguY29vcmRzWzJdK0MqZi5jb29yZHNbMl19LHYuZ2V0SW50ZXJzZWN0RGF0YT1mdW5jdGlvbihsLGgsZixnLE0sQSl7aC5jb29yZHNbMF09aC5jb29yZHNbMV09aC5jb29yZHNbMl09MCxoLmlkeD0tMSx2LnZlcnRleFdlaWdodHMoaCxmLGcpLHYudmVydGV4V2VpZ2h0cyhoLE0sQSl9LHYuY2hlY2tGb3JSaWdodFNwbGljZT1mdW5jdGlvbihsLGgpe3ZhciBmPXYucmVnaW9uQmVsb3coaCksZz1oLmVVcCxNPWYuZVVwO2lmKG4udmVydExlcShnLk9yZyxNLk9yZykpe2lmKG4uZWRnZVNpZ24oTS5Ec3QsZy5PcmcsTS5PcmcpPjApcmV0dXJuITE7bi52ZXJ0RXEoZy5PcmcsTS5PcmcpP2cuT3JnIT09TS5PcmcmJihsLnBxLmRlbGV0ZShnLk9yZy5wcUhhbmRsZSksdi5zcGxpY2VNZXJnZVZlcnRpY2VzKGwsTS5PcHJldixnKSk6KGwubWVzaC5zcGxpdEVkZ2UoTS5TeW0pLGwubWVzaC5zcGxpY2UoZyxNLk9wcmV2KSxoLmRpcnR5PWYuZGlydHk9ITApfWVsc2V7aWYobi5lZGdlU2lnbihnLkRzdCxNLk9yZyxnLk9yZyk8MClyZXR1cm4hMTt2LnJlZ2lvbkFib3ZlKGgpLmRpcnR5PWguZGlydHk9ITAsbC5tZXNoLnNwbGl0RWRnZShnLlN5bSksbC5tZXNoLnNwbGljZShNLk9wcmV2LGcpfXJldHVybiEwfSx2LmNoZWNrRm9yTGVmdFNwbGljZT1mdW5jdGlvbihsLGgpe3ZhciBmPXYucmVnaW9uQmVsb3coaCksZz1oLmVVcCxNPWYuZVVwLEE7aWYoYSghbi52ZXJ0RXEoZy5Ec3QsTS5Ec3QpKSxuLnZlcnRMZXEoZy5Ec3QsTS5Ec3QpKXtpZihuLmVkZ2VTaWduKGcuRHN0LE0uRHN0LGcuT3JnKTwwKXJldHVybiExO3YucmVnaW9uQWJvdmUoaCkuZGlydHk9aC5kaXJ0eT0hMCxBPWwubWVzaC5zcGxpdEVkZ2UoZyksbC5tZXNoLnNwbGljZShNLlN5bSxBKSxBLkxmYWNlLmluc2lkZT1oLmluc2lkZX1lbHNle2lmKG4uZWRnZVNpZ24oTS5Ec3QsZy5Ec3QsTS5PcmcpPjApcmV0dXJuITE7aC5kaXJ0eT1mLmRpcnR5PSEwLEE9bC5tZXNoLnNwbGl0RWRnZShNKSxsLm1lc2guc3BsaWNlKGcuTG5leHQsTS5TeW0pLEEuUmZhY2UuaW5zaWRlPWguaW5zaWRlfXJldHVybiEwfSx2LmNoZWNrRm9ySW50ZXJzZWN0PWZ1bmN0aW9uKGwsaCl7dmFyIGY9di5yZWdpb25CZWxvdyhoKSxnPWguZVVwLE09Zi5lVXAsQT1nLk9yZyxDPU0uT3JnLGI9Zy5Ec3QsRT1NLkRzdCxMLEQsST1uZXcgcyxSLEI7aWYoYSghbi52ZXJ0RXEoRSxiKSksYShuLmVkZ2VTaWduKGIsbC5ldmVudCxBKTw9MCksYShuLmVkZ2VTaWduKEUsbC5ldmVudCxDKT49MCksYShBIT09bC5ldmVudCYmQyE9PWwuZXZlbnQpLGEoIWguZml4VXBwZXJFZGdlJiYhZi5maXhVcHBlckVkZ2UpLEE9PT1DfHwoTD1NYXRoLm1pbihBLnQsYi50KSxEPU1hdGgubWF4KEMudCxFLnQpLEw+RCkpcmV0dXJuITE7aWYobi52ZXJ0TGVxKEEsQykpe2lmKG4uZWRnZVNpZ24oRSxBLEMpPjApcmV0dXJuITF9ZWxzZSBpZihuLmVkZ2VTaWduKGIsQyxBKTwwKXJldHVybiExO3JldHVybiB2LmRlYnVnRXZlbnQobCksbi5pbnRlcnNlY3QoYixBLEUsQyxJKSxhKE1hdGgubWluKEEudCxiLnQpPD1JLnQpLGEoSS50PD1NYXRoLm1heChDLnQsRS50KSksYShNYXRoLm1pbihFLnMsYi5zKTw9SS5zKSxhKEkuczw9TWF0aC5tYXgoQy5zLEEucykpLG4udmVydExlcShJLGwuZXZlbnQpJiYoSS5zPWwuZXZlbnQucyxJLnQ9bC5ldmVudC50KSxSPW4udmVydExlcShBLEMpP0E6QyxuLnZlcnRMZXEoUixJKSYmKEkucz1SLnMsSS50PVIudCksbi52ZXJ0RXEoSSxBKXx8bi52ZXJ0RXEoSSxDKT8odi5jaGVja0ZvclJpZ2h0U3BsaWNlKGwsaCksITEpOiFuLnZlcnRFcShiLGwuZXZlbnQpJiZuLmVkZ2VTaWduKGIsbC5ldmVudCxJKT49MHx8IW4udmVydEVxKEUsbC5ldmVudCkmJm4uZWRnZVNpZ24oRSxsLmV2ZW50LEkpPD0wP0U9PT1sLmV2ZW50PyhsLm1lc2guc3BsaXRFZGdlKGcuU3ltKSxsLm1lc2guc3BsaWNlKE0uU3ltLGcpLGg9di50b3BMZWZ0UmVnaW9uKGwsaCksZz12LnJlZ2lvbkJlbG93KGgpLmVVcCx2LmZpbmlzaExlZnRSZWdpb25zKGwsdi5yZWdpb25CZWxvdyhoKSxmKSx2LmFkZFJpZ2h0RWRnZXMobCxoLGcuT3ByZXYsZyxnLCEwKSwhMCk6Yj09PWwuZXZlbnQ/KGwubWVzaC5zcGxpdEVkZ2UoTS5TeW0pLGwubWVzaC5zcGxpY2UoZy5MbmV4dCxNLk9wcmV2KSxmPWgsaD12LnRvcFJpZ2h0UmVnaW9uKGgpLEI9di5yZWdpb25CZWxvdyhoKS5lVXAuUnByZXYsZi5lVXA9TS5PcHJldixNPXYuZmluaXNoTGVmdFJlZ2lvbnMobCxmLG51bGwpLHYuYWRkUmlnaHRFZGdlcyhsLGgsTS5PbmV4dCxnLlJwcmV2LEIsITApLCEwKToobi5lZGdlU2lnbihiLGwuZXZlbnQsSSk+PTAmJih2LnJlZ2lvbkFib3ZlKGgpLmRpcnR5PWguZGlydHk9ITAsbC5tZXNoLnNwbGl0RWRnZShnLlN5bSksZy5Pcmcucz1sLmV2ZW50LnMsZy5PcmcudD1sLmV2ZW50LnQpLG4uZWRnZVNpZ24oRSxsLmV2ZW50LEkpPD0wJiYoaC5kaXJ0eT1mLmRpcnR5PSEwLGwubWVzaC5zcGxpdEVkZ2UoTS5TeW0pLE0uT3JnLnM9bC5ldmVudC5zLE0uT3JnLnQ9bC5ldmVudC50KSwhMSk6KGwubWVzaC5zcGxpdEVkZ2UoZy5TeW0pLGwubWVzaC5zcGxpdEVkZ2UoTS5TeW0pLGwubWVzaC5zcGxpY2UoTS5PcHJldixnKSxnLk9yZy5zPUkucyxnLk9yZy50PUkudCxnLk9yZy5wcUhhbmRsZT1sLnBxLmluc2VydChnLk9yZyksdi5nZXRJbnRlcnNlY3REYXRhKGwsZy5PcmcsQSxiLEMsRSksdi5yZWdpb25BYm92ZShoKS5kaXJ0eT1oLmRpcnR5PWYuZGlydHk9ITAsITEpfSx2LndhbGtEaXJ0eVJlZ2lvbnM9ZnVuY3Rpb24obCxoKXtmb3IodmFyIGY9di5yZWdpb25CZWxvdyhoKSxnLE07Oyl7Zm9yKDtmLmRpcnR5OyloPWYsZj12LnJlZ2lvbkJlbG93KGYpO2lmKCFoLmRpcnR5JiYoZj1oLGg9di5yZWdpb25BYm92ZShoKSxoPT09bnVsbHx8IWguZGlydHkpKXJldHVybjtpZihoLmRpcnR5PSExLGc9aC5lVXAsTT1mLmVVcCxnLkRzdCE9PU0uRHN0JiZ2LmNoZWNrRm9yTGVmdFNwbGljZShsLGgpJiYoZi5maXhVcHBlckVkZ2U/KHYuZGVsZXRlUmVnaW9uKGwsZiksbC5tZXNoLmRlbGV0ZShNKSxmPXYucmVnaW9uQmVsb3coaCksTT1mLmVVcCk6aC5maXhVcHBlckVkZ2UmJih2LmRlbGV0ZVJlZ2lvbihsLGgpLGwubWVzaC5kZWxldGUoZyksaD12LnJlZ2lvbkFib3ZlKGYpLGc9aC5lVXApKSxnLk9yZyE9PU0uT3JnKWlmKGcuRHN0IT09TS5Ec3QmJiFoLmZpeFVwcGVyRWRnZSYmIWYuZml4VXBwZXJFZGdlJiYoZy5Ec3Q9PT1sLmV2ZW50fHxNLkRzdD09PWwuZXZlbnQpKXtpZih2LmNoZWNrRm9ySW50ZXJzZWN0KGwsaCkpcmV0dXJufWVsc2Ugdi5jaGVja0ZvclJpZ2h0U3BsaWNlKGwsaCk7Zy5Pcmc9PT1NLk9yZyYmZy5Ec3Q9PT1NLkRzdCYmKHYuYWRkV2luZGluZyhNLGcpLHYuZGVsZXRlUmVnaW9uKGwsaCksbC5tZXNoLmRlbGV0ZShnKSxoPXYucmVnaW9uQWJvdmUoZikpfX0sdi5jb25uZWN0UmlnaHRWZXJ0ZXg9ZnVuY3Rpb24obCxoLGYpe3ZhciBnLE09Zi5PbmV4dCxBPXYucmVnaW9uQmVsb3coaCksQz1oLmVVcCxiPUEuZVVwLEU9ITE7aWYoQy5Ec3QhPT1iLkRzdCYmdi5jaGVja0ZvckludGVyc2VjdChsLGgpLG4udmVydEVxKEMuT3JnLGwuZXZlbnQpJiYobC5tZXNoLnNwbGljZShNLk9wcmV2LEMpLGg9di50b3BMZWZ0UmVnaW9uKGwsaCksTT12LnJlZ2lvbkJlbG93KGgpLmVVcCx2LmZpbmlzaExlZnRSZWdpb25zKGwsdi5yZWdpb25CZWxvdyhoKSxBKSxFPSEwKSxuLnZlcnRFcShiLk9yZyxsLmV2ZW50KSYmKGwubWVzaC5zcGxpY2UoZixiLk9wcmV2KSxmPXYuZmluaXNoTGVmdFJlZ2lvbnMobCxBLG51bGwpLEU9ITApLEUpe3YuYWRkUmlnaHRFZGdlcyhsLGgsZi5PbmV4dCxNLE0sITApO3JldHVybn1uLnZlcnRMZXEoYi5PcmcsQy5PcmcpP2c9Yi5PcHJldjpnPUMsZz1sLm1lc2guY29ubmVjdChmLkxwcmV2LGcpLHYuYWRkUmlnaHRFZGdlcyhsLGgsZyxnLk9uZXh0LGcuT25leHQsITEpLGcuU3ltLmFjdGl2ZVJlZ2lvbi5maXhVcHBlckVkZ2U9ITAsdi53YWxrRGlydHlSZWdpb25zKGwsaCl9LHYuY29ubmVjdExlZnREZWdlbmVyYXRlPWZ1bmN0aW9uKGwsaCxmKXt2YXIgZyxNLEEsQyxiO2lmKGc9aC5lVXAsbi52ZXJ0RXEoZy5PcmcsZikpe2EoITEpLHYuc3BsaWNlTWVyZ2VWZXJ0aWNlcyhsLGcsZi5hbkVkZ2UpO3JldHVybn1pZighbi52ZXJ0RXEoZy5Ec3QsZikpe2wubWVzaC5zcGxpdEVkZ2UoZy5TeW0pLGguZml4VXBwZXJFZGdlJiYobC5tZXNoLmRlbGV0ZShnLk9uZXh0KSxoLmZpeFVwcGVyRWRnZT0hMSksbC5tZXNoLnNwbGljZShmLmFuRWRnZSxnKSx2LnN3ZWVwRXZlbnQobCxmKTtyZXR1cm59YSghMSksaD12LnRvcFJpZ2h0UmVnaW9uKGgpLGI9di5yZWdpb25CZWxvdyhoKSxBPWIuZVVwLlN5bSxNPUM9QS5PbmV4dCxiLmZpeFVwcGVyRWRnZSYmKGEoTSE9PUEpLHYuZGVsZXRlUmVnaW9uKGwsYiksbC5tZXNoLmRlbGV0ZShBKSxBPU0uT3ByZXYpLGwubWVzaC5zcGxpY2UoZi5hbkVkZ2UsQSksbi5lZGdlR29lc0xlZnQoTSl8fChNPW51bGwpLHYuYWRkUmlnaHRFZGdlcyhsLGgsQS5PbmV4dCxDLE0sITApfSx2LmNvbm5lY3RMZWZ0VmVydGV4PWZ1bmN0aW9uKGwsaCl7dmFyIGYsZyxNLEEsQyxiLEU9bmV3IHg7aWYoRS5lVXA9aC5hbkVkZ2UuU3ltLGY9bC5kaWN0LnNlYXJjaChFKS5rZXksZz12LnJlZ2lvbkJlbG93KGYpLCEhZyl7aWYoQT1mLmVVcCxDPWcuZVVwLG4uZWRnZVNpZ24oQS5Ec3QsaCxBLk9yZyk9PT0wKXt2LmNvbm5lY3RMZWZ0RGVnZW5lcmF0ZShsLGYsaCk7cmV0dXJufWlmKE09bi52ZXJ0TGVxKEMuRHN0LEEuRHN0KT9mOmcsZi5pbnNpZGV8fE0uZml4VXBwZXJFZGdlKXtpZihNPT09ZiliPWwubWVzaC5jb25uZWN0KGguYW5FZGdlLlN5bSxBLkxuZXh0KTtlbHNle3ZhciBMPWwubWVzaC5jb25uZWN0KEMuRG5leHQsaC5hbkVkZ2UpO2I9TC5TeW19TS5maXhVcHBlckVkZ2U/di5maXhVcHBlckVkZ2UobCxNLGIpOnYuY29tcHV0ZVdpbmRpbmcobCx2LmFkZFJlZ2lvbkJlbG93KGwsZixiKSksdi5zd2VlcEV2ZW50KGwsaCl9ZWxzZSB2LmFkZFJpZ2h0RWRnZXMobCxmLGguYW5FZGdlLGguYW5FZGdlLG51bGwsITApfX0sdi5zd2VlcEV2ZW50PWZ1bmN0aW9uKGwsaCl7bC5ldmVudD1oLHYuZGVidWdFdmVudChsKTtmb3IodmFyIGY9aC5hbkVkZ2U7Zi5hY3RpdmVSZWdpb249PT1udWxsOylpZihmPWYuT25leHQsZj09PWguYW5FZGdlKXt2LmNvbm5lY3RMZWZ0VmVydGV4KGwsaCk7cmV0dXJufXZhciBnPXYudG9wTGVmdFJlZ2lvbihsLGYuYWN0aXZlUmVnaW9uKTthKGchPT1udWxsKTt2YXIgTT12LnJlZ2lvbkJlbG93KGcpLEE9TS5lVXAsQz12LmZpbmlzaExlZnRSZWdpb25zKGwsTSxudWxsKTtDLk9uZXh0PT09QT92LmNvbm5lY3RSaWdodFZlcnRleChsLGcsQyk6di5hZGRSaWdodEVkZ2VzKGwsZyxDLk9uZXh0LEEsQSwhMCl9LHYuYWRkU2VudGluZWw9ZnVuY3Rpb24obCxoLGYsZyl7dmFyIE09bmV3IHgsQT1sLm1lc2gubWFrZUVkZ2UoKTtBLk9yZy5zPWYsQS5PcmcudD1nLEEuRHN0LnM9aCxBLkRzdC50PWcsbC5ldmVudD1BLkRzdCxNLmVVcD1BLE0ud2luZGluZ051bWJlcj0wLE0uaW5zaWRlPSExLE0uZml4VXBwZXJFZGdlPSExLE0uc2VudGluZWw9ITAsTS5kaXJ0eT0hMSxNLm5vZGVVcD1sLmRpY3QuaW5zZXJ0KE0pfSx2LmluaXRFZGdlRGljdD1mdW5jdGlvbihsKXtsLmRpY3Q9bmV3IHUobCx2LmVkZ2VMZXEpO3ZhciBoPWwuYm1heFswXS1sLmJtaW5bMF0sZj1sLmJtYXhbMV0tbC5ibWluWzFdLGc9bC5ibWluWzBdLWgsTT1sLmJtYXhbMF0raCxBPWwuYm1pblsxXS1mLEM9bC5ibWF4WzFdK2Y7di5hZGRTZW50aW5lbChsLGcsTSxBKSx2LmFkZFNlbnRpbmVsKGwsZyxNLEMpfSx2LmRvbmVFZGdlRGljdD1mdW5jdGlvbihsKXtmb3IodmFyIGgsZj0wOyhoPWwuZGljdC5taW4oKS5rZXkpIT09bnVsbDspaC5zZW50aW5lbHx8KGEoaC5maXhVcHBlckVkZ2UpLGEoKytmPT09MSkpLGEoaC53aW5kaW5nTnVtYmVyPT09MCksdi5kZWxldGVSZWdpb24obCxoKX0sdi5yZW1vdmVEZWdlbmVyYXRlRWRnZXM9ZnVuY3Rpb24obCl7dmFyIGgsZixnLE09bC5tZXNoLmVIZWFkO2ZvcihoPU0ubmV4dDtoIT09TTtoPWYpZj1oLm5leHQsZz1oLkxuZXh0LG4udmVydEVxKGguT3JnLGguRHN0KSYmaC5MbmV4dC5MbmV4dCE9PWgmJih2LnNwbGljZU1lcmdlVmVydGljZXMobCxnLGgpLGwubWVzaC5kZWxldGUoaCksaD1nLGc9aC5MbmV4dCksZy5MbmV4dD09PWgmJihnIT09aCYmKChnPT09Znx8Zz09PWYuU3ltKSYmKGY9Zi5uZXh0KSxsLm1lc2guZGVsZXRlKGcpKSwoaD09PWZ8fGg9PT1mLlN5bSkmJihmPWYubmV4dCksbC5tZXNoLmRlbGV0ZShoKSl9LHYuaW5pdFByaW9yaXR5UT1mdW5jdGlvbihsKXt2YXIgaCxmLGcsTT0wO2ZvcihnPWwubWVzaC52SGVhZCxmPWcubmV4dDtmIT09ZztmPWYubmV4dClNKys7Zm9yKE0rPTgsaD1sLnBxPW5ldyBPKE0sbi52ZXJ0TGVxKSxnPWwubWVzaC52SGVhZCxmPWcubmV4dDtmIT09ZztmPWYubmV4dClmLnBxSGFuZGxlPWguaW5zZXJ0KGYpO3JldHVybiBmIT09Zz8hMTooaC5pbml0KCksITApfSx2LmRvbmVQcmlvcml0eVE9ZnVuY3Rpb24obCl7bC5wcT1udWxsfSx2LnJlbW92ZURlZ2VuZXJhdGVGYWNlcz1mdW5jdGlvbihsLGgpe3ZhciBmLGcsTTtmb3IoZj1oLmZIZWFkLm5leHQ7ZiE9PWguZkhlYWQ7Zj1nKWc9Zi5uZXh0LE09Zi5hbkVkZ2UsYShNLkxuZXh0IT09TSksTS5MbmV4dC5MbmV4dD09PU0mJih2LmFkZFdpbmRpbmcoTS5PbmV4dCxNKSxsLm1lc2guZGVsZXRlKE0pKTtyZXR1cm4hMH0sdi5jb21wdXRlSW50ZXJpb3I9ZnVuY3Rpb24obCl7dmFyIGgsZjtpZih2LnJlbW92ZURlZ2VuZXJhdGVFZGdlcyhsKSwhdi5pbml0UHJpb3JpdHlRKGwpKXJldHVybiExO2Zvcih2LmluaXRFZGdlRGljdChsKTsoaD1sLnBxLmV4dHJhY3RNaW4oKSkhPT1udWxsOyl7Zm9yKDtmPWwucHEubWluKCksIShmPT09bnVsbHx8IW4udmVydEVxKGYsaCkpOylmPWwucHEuZXh0cmFjdE1pbigpLHYuc3BsaWNlTWVyZ2VWZXJ0aWNlcyhsLGguYW5FZGdlLGYuYW5FZGdlKTt2LnN3ZWVwRXZlbnQobCxoKX1yZXR1cm4gbC5ldmVudD1sLmRpY3QubWluKCkua2V5LmVVcC5Pcmcsdi5kZWJ1Z0V2ZW50KGwpLHYuZG9uZUVkZ2VEaWN0KGwpLHYuZG9uZVByaW9yaXR5UShsKSx2LnJlbW92ZURlZ2VuZXJhdGVGYWNlcyhsLGwubWVzaCk/KGwubWVzaC5jaGVjaygpLCEwKTohMX07ZnVuY3Rpb24gVCgpe3RoaXMubWVzaD1udWxsLHRoaXMubm9ybWFsPVswLDAsMF0sdGhpcy5zVW5pdD1bMCwwLDBdLHRoaXMudFVuaXQ9WzAsMCwwXSx0aGlzLmJtaW49WzAsMF0sdGhpcy5ibWF4PVswLDBdLHRoaXMud2luZGluZ1J1bGU9ZS5XSU5ESU5HX09ERCx0aGlzLmRpY3Q9bnVsbCx0aGlzLnBxPW51bGwsdGhpcy5ldmVudD1udWxsLHRoaXMudmVydGV4SW5kZXhDb3VudGVyPTAsdGhpcy52ZXJ0aWNlcz1bXSx0aGlzLnZlcnRleEluZGljZXM9W10sdGhpcy52ZXJ0ZXhDb3VudD0wLHRoaXMuZWxlbWVudHM9W10sdGhpcy5lbGVtZW50Q291bnQ9MH1ULnByb3RvdHlwZT17ZG90XzpmdW5jdGlvbihsLGgpe3JldHVybiBsWzBdKmhbMF0rbFsxXSpoWzFdK2xbMl0qaFsyXX0sbm9ybWFsaXplXzpmdW5jdGlvbihsKXt2YXIgaD1sWzBdKmxbMF0rbFsxXSpsWzFdK2xbMl0qbFsyXTthKGg+MCksaD1NYXRoLnNxcnQoaCksbFswXS89aCxsWzFdLz1oLGxbMl0vPWh9LGxvbmdBeGlzXzpmdW5jdGlvbihsKXt2YXIgaD0wO3JldHVybiBNYXRoLmFicyhsWzFdKT5NYXRoLmFicyhsWzBdKSYmKGg9MSksTWF0aC5hYnMobFsyXSk+TWF0aC5hYnMobFtoXSkmJihoPTIpLGh9LGNvbXB1dGVOb3JtYWxfOmZ1bmN0aW9uKGwpe3ZhciBoLGYsZyxNLEEsQyxiPVswLDAsMF0sRT1bMCwwLDBdLEw9WzAsMCwwXSxEPVswLDAsMF0sST1bMCwwLDBdLFI9W251bGwsbnVsbCxudWxsXSxCPVtudWxsLG51bGwsbnVsbF0sej10aGlzLm1lc2gudkhlYWQsSztmb3IoaD16Lm5leHQsSz0wO0s8MzsrK0spTT1oLmNvb3Jkc1tLXSxFW0tdPU0sQltLXT1oLGJbS109TSxSW0tdPWg7Zm9yKGg9ei5uZXh0O2ghPT16O2g9aC5uZXh0KWZvcihLPTA7SzwzOysrSylNPWguY29vcmRzW0tdLE08RVtLXSYmKEVbS109TSxCW0tdPWgpLE0+YltLXSYmKGJbS109TSxSW0tdPWgpO2lmKEs9MCxiWzFdLUVbMV0+YlswXS1FWzBdJiYoSz0xKSxiWzJdLUVbMl0+YltLXS1FW0tdJiYoSz0yKSxFW0tdPj1iW0tdKXtsWzBdPTAsbFsxXT0wLGxbMl09MTtyZXR1cm59Zm9yKEM9MCxmPUJbS10sZz1SW0tdLExbMF09Zi5jb29yZHNbMF0tZy5jb29yZHNbMF0sTFsxXT1mLmNvb3Jkc1sxXS1nLmNvb3Jkc1sxXSxMWzJdPWYuY29vcmRzWzJdLWcuY29vcmRzWzJdLGg9ei5uZXh0O2ghPT16O2g9aC5uZXh0KURbMF09aC5jb29yZHNbMF0tZy5jb29yZHNbMF0sRFsxXT1oLmNvb3Jkc1sxXS1nLmNvb3Jkc1sxXSxEWzJdPWguY29vcmRzWzJdLWcuY29vcmRzWzJdLElbMF09TFsxXSpEWzJdLUxbMl0qRFsxXSxJWzFdPUxbMl0qRFswXS1MWzBdKkRbMl0sSVsyXT1MWzBdKkRbMV0tTFsxXSpEWzBdLEE9SVswXSpJWzBdK0lbMV0qSVsxXStJWzJdKklbMl0sQT5DJiYoQz1BLGxbMF09SVswXSxsWzFdPUlbMV0sbFsyXT1JWzJdKTtDPD0wJiYobFswXT1sWzFdPWxbMl09MCxsW3RoaXMubG9uZ0F4aXNfKEwpXT0xKX0sY2hlY2tPcmllbnRhdGlvbl86ZnVuY3Rpb24oKXt2YXIgbCxoLGY9dGhpcy5tZXNoLmZIZWFkLGcsTT10aGlzLm1lc2gudkhlYWQsQTtmb3IobD0wLGg9Zi5uZXh0O2ghPT1mO2g9aC5uZXh0KWlmKEE9aC5hbkVkZ2UsIShBLndpbmRpbmc8PTApKWRvIGwrPShBLk9yZy5zLUEuRHN0LnMpKihBLk9yZy50K0EuRHN0LnQpLEE9QS5MbmV4dDt3aGlsZShBIT09aC5hbkVkZ2UpO2lmKGw8MCl7Zm9yKGc9TS5uZXh0O2chPT1NO2c9Zy5uZXh0KWcudD0tZy50O3RoaXMudFVuaXRbMF09LXRoaXMudFVuaXRbMF0sdGhpcy50VW5pdFsxXT0tdGhpcy50VW5pdFsxXSx0aGlzLnRVbml0WzJdPS10aGlzLnRVbml0WzJdfX0scHJvamVjdFBvbHlnb25fOmZ1bmN0aW9uKCl7dmFyIGwsaD10aGlzLm1lc2gudkhlYWQsZj1bMCwwLDBdLGcsTSxBLEMsYj0hMTtmb3IoZlswXT10aGlzLm5vcm1hbFswXSxmWzFdPXRoaXMubm9ybWFsWzFdLGZbMl09dGhpcy5ub3JtYWxbMl0sZlswXT09PTAmJmZbMV09PT0wJiZmWzJdPT09MCYmKHRoaXMuY29tcHV0ZU5vcm1hbF8oZiksYj0hMCksZz10aGlzLnNVbml0LE09dGhpcy50VW5pdCxBPXRoaXMubG9uZ0F4aXNfKGYpLGdbQV09MCxnWyhBKzEpJTNdPTEsZ1soQSsyKSUzXT0wLE1bQV09MCxNWyhBKzEpJTNdPTAsTVsoQSsyKSUzXT1mW0FdPjA/MTotMSxsPWgubmV4dDtsIT09aDtsPWwubmV4dClsLnM9dGhpcy5kb3RfKGwuY29vcmRzLGcpLGwudD10aGlzLmRvdF8obC5jb29yZHMsTSk7Zm9yKGImJnRoaXMuY2hlY2tPcmllbnRhdGlvbl8oKSxDPSEwLGw9aC5uZXh0O2whPT1oO2w9bC5uZXh0KUM/KHRoaXMuYm1pblswXT10aGlzLmJtYXhbMF09bC5zLHRoaXMuYm1pblsxXT10aGlzLmJtYXhbMV09bC50LEM9ITEpOihsLnM8dGhpcy5ibWluWzBdJiYodGhpcy5ibWluWzBdPWwucyksbC5zPnRoaXMuYm1heFswXSYmKHRoaXMuYm1heFswXT1sLnMpLGwudDx0aGlzLmJtaW5bMV0mJih0aGlzLmJtaW5bMV09bC50KSxsLnQ+dGhpcy5ibWF4WzFdJiYodGhpcy5ibWF4WzFdPWwudCkpfSxhZGRXaW5kaW5nXzpmdW5jdGlvbihsLGgpe2wud2luZGluZys9aC53aW5kaW5nLGwuU3ltLndpbmRpbmcrPWguU3ltLndpbmRpbmd9LHRlc3NlbGxhdGVNb25vUmVnaW9uXzpmdW5jdGlvbihsLGgpe3ZhciBmLGc7Zm9yKGY9aC5hbkVkZ2UsYShmLkxuZXh0IT09ZiYmZi5MbmV4dC5MbmV4dCE9PWYpO24udmVydExlcShmLkRzdCxmLk9yZyk7Zj1mLkxwcmV2KTtmb3IoO24udmVydExlcShmLk9yZyxmLkRzdCk7Zj1mLkxuZXh0KTtmb3IoZz1mLkxwcmV2O2YuTG5leHQhPT1nOylpZihuLnZlcnRMZXEoZi5Ec3QsZy5PcmcpKXtmb3IoO2cuTG5leHQhPT1mJiYobi5lZGdlR29lc0xlZnQoZy5MbmV4dCl8fG4uZWRnZVNpZ24oZy5PcmcsZy5Ec3QsZy5MbmV4dC5Ec3QpPD0wKTspe3ZhciBNPWwuY29ubmVjdChnLkxuZXh0LGcpO2c9TS5TeW19Zz1nLkxwcmV2fWVsc2V7Zm9yKDtnLkxuZXh0IT09ZiYmKG4uZWRnZUdvZXNSaWdodChmLkxwcmV2KXx8bi5lZGdlU2lnbihmLkRzdCxmLk9yZyxmLkxwcmV2Lk9yZyk+PTApOyl7dmFyIE09bC5jb25uZWN0KGYsZi5McHJldik7Zj1NLlN5bX1mPWYuTG5leHR9Zm9yKGEoZy5MbmV4dCE9PWYpO2cuTG5leHQuTG5leHQhPT1mOyl7dmFyIE09bC5jb25uZWN0KGcuTG5leHQsZyk7Zz1NLlN5bX1yZXR1cm4hMH0sdGVzc2VsbGF0ZUludGVyaW9yXzpmdW5jdGlvbihsKXt2YXIgaCxmO2ZvcihoPWwuZkhlYWQubmV4dDtoIT09bC5mSGVhZDtoPWYpaWYoZj1oLm5leHQsaC5pbnNpZGUmJiF0aGlzLnRlc3NlbGxhdGVNb25vUmVnaW9uXyhsLGgpKXJldHVybiExO3JldHVybiEwfSxkaXNjYXJkRXh0ZXJpb3JfOmZ1bmN0aW9uKGwpe3ZhciBoLGY7Zm9yKGg9bC5mSGVhZC5uZXh0O2ghPT1sLmZIZWFkO2g9ZilmPWgubmV4dCxoLmluc2lkZXx8bC56YXBGYWNlKGgpfSxzZXRXaW5kaW5nTnVtYmVyXzpmdW5jdGlvbihsLGgsZil7dmFyIGcsTTtmb3IoZz1sLmVIZWFkLm5leHQ7ZyE9PWwuZUhlYWQ7Zz1NKU09Zy5uZXh0LGcuUmZhY2UuaW5zaWRlIT09Zy5MZmFjZS5pbnNpZGU/Zy53aW5kaW5nPWcuTGZhY2UuaW5zaWRlP2g6LWg6Zj9sLmRlbGV0ZShnKTpnLndpbmRpbmc9MH0sZ2V0TmVpZ2hib3VyRmFjZV86ZnVuY3Rpb24obCl7cmV0dXJuIWwuUmZhY2V8fCFsLlJmYWNlLmluc2lkZT8tMTpsLlJmYWNlLm59LG91dHB1dFBvbHltZXNoXzpmdW5jdGlvbihsLGgsZixnKXt2YXIgTSxBLEMsYj0wLEU9MCxMLEQ7Zm9yKGY+MyYmbC5tZXJnZUNvbnZleEZhY2VzKGYpLE09bC52SGVhZC5uZXh0O00hPT1sLnZIZWFkO009TS5uZXh0KU0ubj0tMTtmb3IoQT1sLmZIZWFkLm5leHQ7QSE9PWwuZkhlYWQ7QT1BLm5leHQpaWYoQS5uPS0xLCEhQS5pbnNpZGUpe0M9QS5hbkVkZ2UsTD0wO2RvIE09Qy5PcmcsTS5uPT09LTEmJihNLm49RSxFKyspLEwrKyxDPUMuTG5leHQ7d2hpbGUoQyE9PUEuYW5FZGdlKTthKEw8PWYpLEEubj1iLCsrYn1mb3IodGhpcy5lbGVtZW50Q291bnQ9YixoPT09ZS5DT05ORUNURURfUE9MWUdPTlMmJihiKj0yKSx0aGlzLmVsZW1lbnRzPVtdLHRoaXMuZWxlbWVudHMubGVuZ3RoPWIqZix0aGlzLnZlcnRleENvdW50PUUsdGhpcy52ZXJ0aWNlcz1bXSx0aGlzLnZlcnRpY2VzLmxlbmd0aD1FKmcsdGhpcy52ZXJ0ZXhJbmRpY2VzPVtdLHRoaXMudmVydGV4SW5kaWNlcy5sZW5ndGg9RSxNPWwudkhlYWQubmV4dDtNIT09bC52SGVhZDtNPU0ubmV4dClpZihNLm4hPT0tMSl7dmFyIEk9TS5uKmc7dGhpcy52ZXJ0aWNlc1tJKzBdPU0uY29vcmRzWzBdLHRoaXMudmVydGljZXNbSSsxXT1NLmNvb3Jkc1sxXSxnPjImJih0aGlzLnZlcnRpY2VzW0krMl09TS5jb29yZHNbMl0pLHRoaXMudmVydGV4SW5kaWNlc1tNLm5dPU0uaWR4fXZhciBSPTA7Zm9yKEE9bC5mSGVhZC5uZXh0O0EhPT1sLmZIZWFkO0E9QS5uZXh0KWlmKEEuaW5zaWRlKXtDPUEuYW5FZGdlLEw9MDtkbyBNPUMuT3JnLHRoaXMuZWxlbWVudHNbUisrXT1NLm4sTCsrLEM9Qy5MbmV4dDt3aGlsZShDIT09QS5hbkVkZ2UpO2ZvcihEPUw7RDxmOysrRCl0aGlzLmVsZW1lbnRzW1IrK109LTE7aWYoaD09PWUuQ09OTkVDVEVEX1BPTFlHT05TKXtDPUEuYW5FZGdlO2RvIHRoaXMuZWxlbWVudHNbUisrXT10aGlzLmdldE5laWdoYm91ckZhY2VfKEMpLEM9Qy5MbmV4dDt3aGlsZShDIT09QS5hbkVkZ2UpO2ZvcihEPUw7RDxmOysrRCl0aGlzLmVsZW1lbnRzW1IrK109LTF9fX0sb3V0cHV0Q29udG91cnNfOmZ1bmN0aW9uKGwsaCl7dmFyIGYsZyxNLEE9MCxDPTA7Zm9yKHRoaXMudmVydGV4Q291bnQ9MCx0aGlzLmVsZW1lbnRDb3VudD0wLGY9bC5mSGVhZC5uZXh0O2YhPT1sLmZIZWFkO2Y9Zi5uZXh0KWlmKGYuaW5zaWRlKXtNPWc9Zi5hbkVkZ2U7ZG8gdGhpcy52ZXJ0ZXhDb3VudCsrLGc9Zy5MbmV4dDt3aGlsZShnIT09TSk7dGhpcy5lbGVtZW50Q291bnQrK310aGlzLmVsZW1lbnRzPVtdLHRoaXMuZWxlbWVudHMubGVuZ3RoPXRoaXMuZWxlbWVudENvdW50KjIsdGhpcy52ZXJ0aWNlcz1bXSx0aGlzLnZlcnRpY2VzLmxlbmd0aD10aGlzLnZlcnRleENvdW50KmgsdGhpcy52ZXJ0ZXhJbmRpY2VzPVtdLHRoaXMudmVydGV4SW5kaWNlcy5sZW5ndGg9dGhpcy52ZXJ0ZXhDb3VudDt2YXIgYj0wLEU9MCxMPTA7Zm9yKEE9MCxmPWwuZkhlYWQubmV4dDtmIT09bC5mSGVhZDtmPWYubmV4dClpZihmLmluc2lkZSl7Qz0wLE09Zz1mLmFuRWRnZTtkbyB0aGlzLnZlcnRpY2VzW2IrK109Zy5PcmcuY29vcmRzWzBdLHRoaXMudmVydGljZXNbYisrXT1nLk9yZy5jb29yZHNbMV0saD4yJiYodGhpcy52ZXJ0aWNlc1tiKytdPWcuT3JnLmNvb3Jkc1syXSksdGhpcy52ZXJ0ZXhJbmRpY2VzW0UrK109Zy5PcmcuaWR4LEMrKyxnPWcuTG5leHQ7d2hpbGUoZyE9PU0pO3RoaXMuZWxlbWVudHNbTCsrXT1BLHRoaXMuZWxlbWVudHNbTCsrXT1DLEErPUN9fSxhZGRDb250b3VyOmZ1bmN0aW9uKGwsaCl7dmFyIGYsZztmb3IodGhpcy5tZXNoPT09bnVsbCYmKHRoaXMubWVzaD1uZXcgYyksbDwyJiYobD0yKSxsPjMmJihsPTMpLGY9bnVsbCxnPTA7ZzxoLmxlbmd0aDtnKz1sKWY9PT1udWxsPyhmPXRoaXMubWVzaC5tYWtlRWRnZSgpLHRoaXMubWVzaC5zcGxpY2UoZixmLlN5bSkpOih0aGlzLm1lc2guc3BsaXRFZGdlKGYpLGY9Zi5MbmV4dCksZi5PcmcuY29vcmRzWzBdPWhbZyswXSxmLk9yZy5jb29yZHNbMV09aFtnKzFdLGw+Mj9mLk9yZy5jb29yZHNbMl09aFtnKzJdOmYuT3JnLmNvb3Jkc1syXT0wLGYuT3JnLmlkeD10aGlzLnZlcnRleEluZGV4Q291bnRlcisrLGYud2luZGluZz0xLGYuU3ltLndpbmRpbmc9LTF9LHRlc3NlbGF0ZTpmdW5jdGlvbihsLGgsZixnLE0pe2lmKHRoaXMudmVydGljZXM9W10sdGhpcy5lbGVtZW50cz1bXSx0aGlzLnZlcnRleEluZGljZXM9W10sdGhpcy52ZXJ0ZXhJbmRleENvdW50ZXI9MCxNJiYodGhpcy5ub3JtYWxbMF09TVswXSx0aGlzLm5vcm1hbFsxXT1NWzFdLHRoaXMubm9ybWFsWzJdPU1bMl0pLHRoaXMud2luZGluZ1J1bGU9bCxnPDImJihnPTIpLGc+MyYmKGc9MyksIXRoaXMubWVzaClyZXR1cm4hMTt0aGlzLnByb2plY3RQb2x5Z29uXygpLHYuY29tcHV0ZUludGVyaW9yKHRoaXMpO3ZhciBBPXRoaXMubWVzaDtyZXR1cm4gaD09PWUuQk9VTkRBUllfQ09OVE9VUlM/dGhpcy5zZXRXaW5kaW5nTnVtYmVyXyhBLDEsITApOnRoaXMudGVzc2VsbGF0ZUludGVyaW9yXyhBKSxBLmNoZWNrKCksaD09PWUuQk9VTkRBUllfQ09OVE9VUlM/dGhpcy5vdXRwdXRDb250b3Vyc18oQSxnKTp0aGlzLm91dHB1dFBvbHltZXNoXyhBLGgsZixnKSwhMH19fSxmdW5jdGlvbihkLHIpe2QuZXhwb3J0cz1lO3ZhciB0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gZSgpe2Zvcih2YXIgbj17fSxhPTA7YTxhcmd1bWVudHMubGVuZ3RoO2ErKyl7dmFyIHM9YXJndW1lbnRzW2FdO2Zvcih2YXIgaSBpbiBzKXQuY2FsbChzLGkpJiYobltpXT1zW2ldKX1yZXR1cm4gbn19LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImNyZWF0ZVNoYWRlcnMiLGZ1bmN0aW9uKCl7cmV0dXJuIG99KSx0LmQociwiYXBwbHlTaGFkZXIiLGZ1bmN0aW9uKCl7cmV0dXJuIGN9KSx0LmQociwiY3JlYXRlQ2xvdWRTaGFkZXJzIixmdW5jdGlvbigpe3JldHVybiB1fSksdC5kKHIsImFwcGx5Q2xvdWRTaGFkZXIiLGZ1bmN0aW9uKCl7cmV0dXJuIHB9KTt2YXIgZT10KDY0KSxuPXQoNjUpLGE9dCg2Nikscz10KDY3KTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7Y29uc3QgaT1TeW1ib2woInNoYWRlcnMiKTtmdW5jdGlvbiBvKHkpe3lbaV09W107Zm9yKGxldCBPPTA7TzwxNjtPKyspe2NvbnN0IHg9W10sdj0hIShPJjEpLFQ9ISEoTyYyKSxsPSEhKE8mNCksaD0hIShPJjgpO3YmJngucHVzaCgiI2RlZmluZSBURVhUVVJFIDEiKSxUJiZ4LnB1c2goIiNkZWZpbmUgRklMVEVSIDEiKSxsJiZ4LnB1c2goIiNkZWZpbmUgR1JBRElFTlQgMSIpLGgmJngucHVzaCgiI2RlZmluZSBDTElQUEFUSCAxIik7Y29uc3QgZj1gJHt4LmpvaW4oYApgKX0KYCxnPVtdO3YmJmcucHVzaCgidW5pZm9ybSBzYW1wbGVyMkQgdV90ZXhTYW1wbGVyOyIpLGgmJmcucHVzaCgidW5pZm9ybSBzYW1wbGVyMkQgdV9jbGlwU2FtcGxlcjsiKSx5W2ldW09dPVtmK2cuam9pbihgCmApK24uZGVmYXVsdCxmK2UuZGVmYXVsdF19fWZ1bmN0aW9uIGMoeSx7aGFzVGV4dHVyZTpPPSExLGhhc0ZpbHRlcjp4PSExLGhhc0dyYWRpZW50OnY9ITEsaGFzQ2xpcFBhdGg6VD0hMX09e30pe2NvbnN0IGw9T3x4PDwxfHY8PDJ8VDw8MztsZXQgaD15W2ldW2xdO0FycmF5LmlzQXJyYXkoaCkmJihoPXkuY3JlYXRlUHJvZ3JhbSguLi5oKSx5W2ldW2xdPWgpLHkucHJvZ3JhbSE9PWgmJnkudXNlUHJvZ3JhbShoLHthX2NvbG9yOnt0eXBlOiJVTlNJR05FRF9CWVRFIixub3JtYWxpemU6ITB9fSl9Y29uc3QgbT1bXTtmdW5jdGlvbiB1KHkpe2ZvcihsZXQgTz0wO088NjQ7TysrKXtjb25zdCB4PVtdLHY9ISEoTyYxKSxUPSEhKE8mMiksbD0hIShPJjQpLGg9ISEoTyY4KSxmPSEhKE8mMTYpLGc9ISEoTyYzMik7diYmeC5wdXNoKCIjZGVmaW5lIFRFWFRVUkUgMSIpLFQmJngucHVzaCgiI2RlZmluZSBGSUxURVIgMSIpLGwmJngucHVzaCgiI2RlZmluZSBHUkFESUVOVCAxIiksaCYmeC5wdXNoKCIjZGVmaW5lIENMT1VEQ09MT1IgMSIpLGYmJngucHVzaCgiI2RlZmluZSBDTE9VREZJTFRFUiAxIiksZyYmeC5wdXNoKCIjZGVmaW5lIENMSVBQQVRIIDEiKTtjb25zdCBNPWAke3guam9pbihgCmApfQpgLEE9W107aWYodil7QS5wdXNoKCJ1bmlmb3JtIHNhbXBsZXIyRCB1X3RleFNhbXBsZXI7Iik7Zm9yKGxldCBDPTA7QzwxMjtDKyspQS5wdXNoKGB1bmlmb3JtIHNhbXBsZXIyRCB1X3RleEZyYW1lJHtDfTtgKX1nJiZBLnB1c2goInVuaWZvcm0gc2FtcGxlcjJEIHVfY2xpcFNhbXBsZXI7IiksbVtPXT1bTStBLmpvaW4oYApgKStzLmRlZmF1bHQsTSthLmRlZmF1bHRdfX1mdW5jdGlvbiBwKHkse2hhc1RleHR1cmU6Tz0hMSxoYXNGaWx0ZXI6eD0hMSxoYXNHcmFkaWVudDp2PSExLGhhc0Nsb3VkQ29sb3I6VD0hMSxoYXNDbG91ZEZpbHRlcjpsPSExLGhhc0NsaXBQYXRoOmg9ITF9PXt9KXtjb25zdCBmPU98eDw8MXx2PDwyfFQ8PDN8bDw8NHxoPDw1O2xldCBnPW1bZl07QXJyYXkuaXNBcnJheShnKSYmKGc9eS5jcmVhdGVQcm9ncmFtKC4uLmcpLG1bZl09ZykseS5wcm9ncmFtIT09ZyYmeS51c2VQcm9ncmFtKGcse2FfY29sb3I6e3R5cGU6IlVOU0lHTkVEX0JZVEUiLG5vcm1hbGl6ZTohMH0sYV9maWxsQ2xvdWRDb2xvcjp7dHlwZToiVU5TSUdORURfQllURSIsbm9ybWFsaXplOiEwfSxhX3N0cm9rZUNsb3VkQ29sb3I6e3R5cGU6IlVOU0lHTkVEX0JZVEUiLG5vcm1hbGl6ZTohMH0sYV9mcmFtZUluZGV4Ont0eXBlOiJVTlNJR05FRF9CWVRFIixub3JtYWxpemU6ITF9fSl9fSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHIuZGVmYXVsdD1gYXR0cmlidXRlIHZlYzMgYV92ZXJ0ZXhQb3NpdGlvbjsKYXR0cmlidXRlIHZlYzQgYV9jb2xvcjsKdmFyeWluZyB2ZWM0IHZDb2xvcjsKdmFyeWluZyBmbG9hdCBmbGFnQmFja2dyb3VuZDsKdW5pZm9ybSB2ZWMyIHVfcmVzb2x1dGlvbjsKdW5pZm9ybSBtYXQzIHZpZXdNYXRyaXg7CnVuaWZvcm0gbWF0MyBwcm9qZWN0aW9uTWF0cml4OwoKI2lmZGVmIFRFWFRVUkUKYXR0cmlidXRlIHZlYzMgYV92ZXJ0ZXhUZXh0dXJlQ29vcmQ7CnZhcnlpbmcgdmVjMyB2VGV4dHVyZUNvb3JkOwphdHRyaWJ1dGUgdmVjNCBhX3NvdXJjZVJlY3Q7CnZhcnlpbmcgdmVjNCB2U291cmNlUmVjdDsKI2VuZGlmCgojaWZkZWYgQ0xJUFBBVEgKYXR0cmlidXRlIHZlYzIgYV9jbGlwVVY7CnZhcnlpbmcgdmVjMiB2Q2xpcFVWOwojZW5kaWYKCiNpZmRlZiBHUkFESUVOVAp1bmlmb3JtIGZsb2F0IHVfcmFkaWFsR3JhZGllbnRWZWN0b3JbNl07CnZhcnlpbmcgdmVjMyB2R3JhZGllbnRWZWN0b3IxOwp2YXJ5aW5nIHZlYzMgdkdyYWRpZW50VmVjdG9yMjsKI2VuZGlmCgp2b2lkIG1haW4oKSB7CiAgZ2xfUG9pbnRTaXplID0gMS4wOwoKICB2ZWMzIHBvcyA9IHByb2plY3Rpb25NYXRyaXggKiB2aWV3TWF0cml4ICogdmVjMyhhX3ZlcnRleFBvc2l0aW9uLnh5LCAxLjApOwogIGdsX1Bvc2l0aW9uID0gdmVjNChwb3MueHksIDEuMCwgMS4wKTsKCiNpZmRlZiBHUkFESUVOVAogIHZlYzMgdmcxID0gdmlld01hdHJpeCAqIHZlYzModV9yYWRpYWxHcmFkaWVudFZlY3RvclswXSwgdV9yYWRpYWxHcmFkaWVudFZlY3RvclsxXSwgMS4wKTsKICB2ZWMzIHZnMiA9IHZpZXdNYXRyaXggKiB2ZWMzKHVfcmFkaWFsR3JhZGllbnRWZWN0b3JbM10sIHVfcmFkaWFsR3JhZGllbnRWZWN0b3JbNF0sIDEuMCk7CiAgZmxvYXQgaCA9IHVfcmVzb2x1dGlvbi55OwogIHZnMS55ID0gaCAtIHZnMS55OwogIHZnMi55ID0gaCAtIHZnMi55OwogIHZHcmFkaWVudFZlY3RvcjEgPSB2ZWMzKHZnMS54eSwgdV9yYWRpYWxHcmFkaWVudFZlY3RvclsyXSk7CiAgdkdyYWRpZW50VmVjdG9yMiA9IHZlYzModmcyLnh5LCB1X3JhZGlhbEdyYWRpZW50VmVjdG9yWzVdKTsKI2VuZGlmCiAgCiAgZmxhZ0JhY2tncm91bmQgPSBhX3ZlcnRleFBvc2l0aW9uLno7CiAgdkNvbG9yID0gYV9jb2xvcjsKCiNpZmRlZiBURVhUVVJFCiAgdlRleHR1cmVDb29yZCA9IGFfdmVydGV4VGV4dHVyZUNvb3JkOwogIHZTb3VyY2VSZWN0ID0gYV9zb3VyY2VSZWN0OwojZW5kaWYKCiNpZmRlZiBDTElQUEFUSAogIHZDbGlwVVYgPSBhX2NsaXBVVjsKI2VuZGlmCn1gfSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHIuZGVmYXVsdD1gcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7Cgp2YXJ5aW5nIHZlYzQgdkNvbG9yOwp2YXJ5aW5nIGZsb2F0IGZsYWdCYWNrZ3JvdW5kOwoKI2lmZGVmIFRFWFRVUkUKdmFyeWluZyB2ZWMzIHZUZXh0dXJlQ29vcmQ7CnZhcnlpbmcgdmVjNCB2U291cmNlUmVjdDsKI2VuZGlmCgojaWZkZWYgQ0xJUFBBVEgKdmFyeWluZyB2ZWMyIHZDbGlwVVY7CiNlbmRpZgoKI2lmZGVmIEZJTFRFUgp1bmlmb3JtIGludCB1X2ZpbHRlckZsYWc7CnVuaWZvcm0gZmxvYXQgdV9jb2xvck1hdHJpeFsyMF07CiNlbmRpZgoKI2lmZGVmIEdSQURJRU5UCnZhcnlpbmcgdmVjMyB2R3JhZGllbnRWZWN0b3IxOwp2YXJ5aW5nIHZlYzMgdkdyYWRpZW50VmVjdG9yMjsKdW5pZm9ybSBmbG9hdCB1X2NvbG9yU3RlcHNbNDBdOwp1bmlmb3JtIGludCB1X2dyYWRpZW50VHlwZTsKLy8gdW5pZm9ybSBmbG9hdCB1X3JhZGlhbEdyYWRpZW50VmVjdG9yWzZdOwoKdm9pZCBncmFkaWVudChpbm91dCB2ZWM0IGNvbG9yLCB2ZWMzIGd2MSwgdmVjMyBndjIsIGZsb2F0IGNvbG9yU3RlcHNbNDBdKSB7CiAgZmxvYXQgdDsKICAvLyBjZW50ZXIgY2lyY2xlIHJhZGl1cwogIGZsb2F0IGNyID0gZ3YxLno7CiAgLy8gZm9jYWwgY2lyY2xlIHJhZGl1cwogIGZsb2F0IGZyID0gZ3YyLno7CgogIGlmKGNyID4gMC4wIHx8IGZyID4gMC4wKSB7CiAgICAvLyByYWRpYWwgZ3JhZGllbnQKICAgIHZlYzIgY2VudGVyID0gZ3YxLnh5OwogICAgdmVjMiBmb2NhbCA9IGd2Mi54eTsKICAgIGZsb2F0IHggPSBmb2NhbC54IC0gZ2xfRnJhZ0Nvb3JkLng7CiAgICBmbG9hdCB5ID0gZm9jYWwueSAtIGdsX0ZyYWdDb29yZC55OwogICAgZmxvYXQgZHggPSBmb2NhbC54IC0gY2VudGVyLng7CiAgICBmbG9hdCBkeSA9IGZvY2FsLnkgLSBjZW50ZXIueTsKICAgIGZsb2F0IGRyID0gY3IgLSBmcjsKICAgIGZsb2F0IGEgPSBkeCAqIGR4ICsgZHkgKiBkeSAtIGRyICogZHI7CiAgICBmbG9hdCBiID0gLTIuMCAqICh5ICogZHkgKyB4ICogZHggKyBmciAqIGRyKTsKICAgIGZsb2F0IGMgPSB4ICogeCArIHkgKiB5IC0gZnIgKiBmcjsKICAgIHQgPSAxLjAgLSAwLjUgKiAoMS4wIC8gYSkgKiAoLWIgKyBzcXJ0KGIgKiBiIC0gNC4wICogYSAqIGMpKTsKICB9IGVsc2UgewogICAgLy8gbGluZWFyIGdyYWRpZW50CiAgICB2ZWMyIHYxID0gZ2xfRnJhZ0Nvb3JkLnh5IC0gZ3YxLnh5OwogICAgdmVjMiB2MiA9IGd2Mi54eSAtIGd2MS54eTsKICAgIHQgPSAodjEueCAqIHYyLnggKyB2MS55ICogdjIueSkgLyAodjIueCAqIHYyLnggKyB2Mi55ICogdjIueSk7CiAgfQoKICB2ZWM0IGNvbG9yc1s4XTsKICBjb2xvcnNbMF0gPSB2ZWM0KGNvbG9yU3RlcHNbMV0sIGNvbG9yU3RlcHNbMl0sIGNvbG9yU3RlcHNbM10sIGNvbG9yU3RlcHNbNF0pOwogIGNvbG9yc1sxXSA9IHZlYzQoY29sb3JTdGVwc1s2XSwgY29sb3JTdGVwc1s3XSwgY29sb3JTdGVwc1s4XSwgY29sb3JTdGVwc1s5XSk7CiAgY29sb3JzWzJdID0gdmVjNChjb2xvclN0ZXBzWzExXSwgY29sb3JTdGVwc1sxMl0sIGNvbG9yU3RlcHNbMTNdLCBjb2xvclN0ZXBzWzE0XSk7CiAgY29sb3JzWzNdID0gdmVjNChjb2xvclN0ZXBzWzE2XSwgY29sb3JTdGVwc1sxN10sIGNvbG9yU3RlcHNbMThdLCBjb2xvclN0ZXBzWzE5XSk7CiAgY29sb3JzWzRdID0gdmVjNChjb2xvclN0ZXBzWzIxXSwgY29sb3JTdGVwc1syMl0sIGNvbG9yU3RlcHNbMjNdLCBjb2xvclN0ZXBzWzI0XSk7CiAgY29sb3JzWzVdID0gdmVjNChjb2xvclN0ZXBzWzI2XSwgY29sb3JTdGVwc1syN10sIGNvbG9yU3RlcHNbMjhdLCBjb2xvclN0ZXBzWzI5XSk7CiAgY29sb3JzWzZdID0gdmVjNChjb2xvclN0ZXBzWzMxXSwgY29sb3JTdGVwc1szMl0sIGNvbG9yU3RlcHNbMzNdLCBjb2xvclN0ZXBzWzM0XSk7CiAgY29sb3JzWzddID0gdmVjNChjb2xvclN0ZXBzWzM2XSwgY29sb3JTdGVwc1szN10sIGNvbG9yU3RlcHNbMzhdLCBjb2xvclN0ZXBzWzM5XSk7CiAgCiAgZmxvYXQgc3RlcHNbOF07CiAgc3RlcHNbMF0gPSBjb2xvclN0ZXBzWzBdOwogIHN0ZXBzWzFdID0gY29sb3JTdGVwc1s1XTsKICBzdGVwc1syXSA9IGNvbG9yU3RlcHNbMTBdOwogIHN0ZXBzWzNdID0gY29sb3JTdGVwc1sxNV07CiAgc3RlcHNbNF0gPSBjb2xvclN0ZXBzWzIwXTsKICBzdGVwc1s1XSA9IGNvbG9yU3RlcHNbMjVdOwogIHN0ZXBzWzZdID0gY29sb3JTdGVwc1szMF07CiAgc3RlcHNbN10gPSBjb2xvclN0ZXBzWzM1XTsKCiAgY29sb3IgPSBjb2xvcnNbMF07CiAgZm9yIChpbnQgaSA9IDE7IGkgPCA4OyBpKyspIHsKICAgIGlmIChzdGVwc1tpXSA8IDAuMCB8fCBzdGVwc1tpXSA+IDEuMCkgewogICAgICBicmVhazsKICAgIH0KICAgIGlmKHN0ZXBzW2ldID09IHN0ZXBzW2kgLSAxXSkgewogICAgICBjb2xvciA9IGNvbG9yc1tpXTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbG9yID0gbWl4KGNvbG9yLCBjb2xvcnNbaV0sIGNsYW1wKCh0IC0gc3RlcHNbaSAtIDFdKSAvIChzdGVwc1tpXSAtIHN0ZXBzW2kgLSAxXSksIDAuMCwgMS4wKSk7CiAgICB9CiAgICBpZiAoc3RlcHNbaV0gPj0gdCkgewogICAgICBicmVhazsKICAgIH0KICB9Cn0KI2VuZGlmCgojaWZkZWYgRklMVEVSCnZvaWQgdHJhbnNmb3JtQ29sb3IoaW5vdXQgdmVjNCBjb2xvciwgaW4gZmxvYXQgY29sb3JNYXRyaXhbMjBdKSB7CiAgZmxvYXQgciA9IGNvbG9yLnIsIGcgPSBjb2xvci5nLCBiID0gY29sb3IuYiwgYSA9IGNvbG9yLmE7CiAgY29sb3JbMF0gPSBjb2xvck1hdHJpeFswXSAqIHIgKyBjb2xvck1hdHJpeFsxXSAqIGcgKyBjb2xvck1hdHJpeFsyXSAqIGIgKyBjb2xvck1hdHJpeFszXSAqIGEgKyBjb2xvck1hdHJpeFs0XTsKICBjb2xvclsxXSA9IGNvbG9yTWF0cml4WzVdICogciArIGNvbG9yTWF0cml4WzZdICogZyArIGNvbG9yTWF0cml4WzddICogYiArIGNvbG9yTWF0cml4WzhdICogYSArIGNvbG9yTWF0cml4WzldOwogIGNvbG9yWzJdID0gY29sb3JNYXRyaXhbMTBdICogciArIGNvbG9yTWF0cml4WzExXSAqIGcgKyBjb2xvck1hdHJpeFsxMl0gKiBiICsgY29sb3JNYXRyaXhbMTNdICogYSArIGNvbG9yTWF0cml4WzE0XTsKICBjb2xvclszXSA9IGNvbG9yTWF0cml4WzE1XSAqIHIgKyBjb2xvck1hdHJpeFsxNl0gKiBnICsgY29sb3JNYXRyaXhbMTddICogYiArIGNvbG9yTWF0cml4WzE4XSAqIGEgKyBjb2xvck1hdHJpeFsxOV07Cn0KI2VuZGlmCgp2b2lkIG1haW4oKSB7CiAgdmVjNCBjb2xvciA9IHZDb2xvcjsKICBmbG9hdCBvcGFjaXR5ID0gYWJzKGZsYWdCYWNrZ3JvdW5kKTsKCiNpZmRlZiBHUkFESUVOVAogIGlmKHVfZ3JhZGllbnRUeXBlID4gMCAmJiBmbGFnQmFja2dyb3VuZCA+IDAuMCB8fCB1X2dyYWRpZW50VHlwZSA9PSAwICYmIGZsYWdCYWNrZ3JvdW5kIDw9IDAuMCkgewogICAgZ3JhZGllbnQoY29sb3IsIHZHcmFkaWVudFZlY3RvcjEsIHZHcmFkaWVudFZlY3RvcjIsIHVfY29sb3JTdGVwcyk7CiAgfQojZW5kaWYKCiAgaWYob3BhY2l0eSA8IDEuMCkgewogICAgY29sb3IuYSAqPSBvcGFjaXR5OwogIH0KCiNpZmRlZiBURVhUVVJFCiAgaWYoZmxhZ0JhY2tncm91bmQgPiAwLjApIHsKICAgIHZlYzMgdGV4Q29vcmQgPSB2VGV4dHVyZUNvb3JkOwoKICAgIGlmKHRleENvb3JkLnogPT0gMS4wKSB7CiAgICAgIHRleENvb3JkID0gZnJhY3QodGV4Q29vcmQpOwogICAgfQoKICAgIGlmKHRleENvb3JkLnggPD0gMS4wICYmIHRleENvb3JkLnggPj0gMC4wCiAgICAgICYmIHRleENvb3JkLnkgPD0gMS4wICYmIHRleENvb3JkLnkgPj0gMC4wKSB7CiAgICAgIGlmKHZTb3VyY2VSZWN0LnogPiAwLjApIHsKICAgICAgICB0ZXhDb29yZC54ID0gdlNvdXJjZVJlY3QueCArIHRleENvb3JkLnggKiB2U291cmNlUmVjdC56OwogICAgICAgIHRleENvb3JkLnkgPSAxLjAgLSAodlNvdXJjZVJlY3QueSArICgxLjAgLSB0ZXhDb29yZC55KSAqIHZTb3VyY2VSZWN0LncpOwogICAgICB9CiAgICAgIHZlYzQgdGV4Q29sb3IgPSB0ZXh0dXJlMkQodV90ZXhTYW1wbGVyLCB0ZXhDb29yZC54eSk7CiAgICAgIGZsb2F0IGFscGhhID0gdGV4Q29sb3IuYTsKICAgICAgaWYob3BhY2l0eSA8IDEuMCkgewogICAgICAgIHRleENvbG9yLmEgKj0gb3BhY2l0eTsKICAgICAgICBhbHBoYSAqPSBtaXgoMC40NjUsIDEuMCwgb3BhY2l0eSk7CiAgICAgIH0KICAgICAgLy8gY29sb3IgPSBtaXgoY29sb3IsIHRleENvbG9yLCB0ZXhDb2xvci5hKTsKICAgICAgY29sb3IucmdiID0gbWl4KGNvbG9yLnJnYiwgdGV4Q29sb3IucmdiLCBhbHBoYSk7CiAgICAgIC8vIGNvbG9yLnJnYiA9IG1peCh0ZXhDb2xvci5yZ2IsIGNvbG9yLnJnYiwgY29sb3IuYSk7CiAgICAgIGNvbG9yLnJnYiA9IG1peCh0ZXhDb2xvci5yZ2IsIGNvbG9yLnJnYiwgY2xhbXAoY29sb3IuYSAvIG1heCgwLjAwMDEsIHRleENvbG9yLmEpLCAwLjAsIDEuMCkpOwogICAgICBjb2xvci5hID0gdGV4Q29sb3IuYSArICgxLjAgLSB0ZXhDb2xvci5hKSAqIGNvbG9yLmE7CiAgICB9CiAgfQojZW5kaWYKCiNpZmRlZiBGSUxURVIKICBpZih1X2ZpbHRlckZsYWcgPiAwKSB7CiAgICB0cmFuc2Zvcm1Db2xvcihjb2xvciwgdV9jb2xvck1hdHJpeCk7CiAgfQojZW5kaWYKCiNpZmRlZiBDTElQUEFUSAogIGZsb2F0IGNsaXAgPSB0ZXh0dXJlMkQodV9jbGlwU2FtcGxlciwgdkNsaXBVVikucjsKICBjb2xvciAqPSBjbGlwOwojZW5kaWYKCiAgZ2xfRnJhZ0NvbG9yID0gY29sb3I7Cn1gfSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHIuZGVmYXVsdD1gYXR0cmlidXRlIHZlYzMgYV92ZXJ0ZXhQb3NpdGlvbjsKYXR0cmlidXRlIHZlYzQgYV9jb2xvcjsKdmFyeWluZyB2ZWM0IHZDb2xvcjsKdmFyeWluZyBmbG9hdCBmbGFnQmFja2dyb3VuZDsKYXR0cmlidXRlIHZlYzMgYV90cmFuc2Zvcm0wOwphdHRyaWJ1dGUgdmVjMyBhX3RyYW5zZm9ybTE7CnVuaWZvcm0gdmVjMiB1X3Jlc29sdXRpb247CnVuaWZvcm0gbWF0MyB2aWV3TWF0cml4Owp1bmlmb3JtIG1hdDMgcHJvamVjdGlvbk1hdHJpeDsKCiNpZmRlZiBURVhUVVJFCmF0dHJpYnV0ZSB2ZWMzIGFfdmVydGV4VGV4dHVyZUNvb3JkOwp2YXJ5aW5nIHZlYzMgdlRleHR1cmVDb29yZDsKYXR0cmlidXRlIGZsb2F0IGFfZnJhbWVJbmRleDsKdmFyeWluZyBmbG9hdCBmcmFtZUluZGV4OwphdHRyaWJ1dGUgdmVjNCBhX3NvdXJjZVJlY3Q7CnZhcnlpbmcgdmVjNCB2U291cmNlUmVjdDsKI2VuZGlmCgojaWZkZWYgQ0xJUFBBVEgKYXR0cmlidXRlIHZlYzIgYV9jbGlwVVY7CnZhcnlpbmcgdmVjMiB2Q2xpcFVWOwojZW5kaWYKCiNpZmRlZiBDTE9VREZJTFRFUgphdHRyaWJ1dGUgdmVjNCBhX2NvbG9yQ2xvdWQwOwphdHRyaWJ1dGUgdmVjNCBhX2NvbG9yQ2xvdWQxOwphdHRyaWJ1dGUgdmVjNCBhX2NvbG9yQ2xvdWQyOwphdHRyaWJ1dGUgdmVjNCBhX2NvbG9yQ2xvdWQzOwphdHRyaWJ1dGUgdmVjNCBhX2NvbG9yQ2xvdWQ0Owp2YXJ5aW5nIHZlYzQgY29sb3JDbG91ZDA7CnZhcnlpbmcgdmVjNCBjb2xvckNsb3VkMTsKdmFyeWluZyB2ZWM0IGNvbG9yQ2xvdWQyOwp2YXJ5aW5nIHZlYzQgY29sb3JDbG91ZDM7CnZhcnlpbmcgdmVjNCBjb2xvckNsb3VkNDsKI2VuZGlmCgojaWZkZWYgQ0xPVURDT0xPUgphdHRyaWJ1dGUgdmVjNCBhX2ZpbGxDbG91ZENvbG9yOwphdHRyaWJ1dGUgdmVjNCBhX3N0cm9rZUNsb3VkQ29sb3I7CiNlbmRpZgoKI2lmZGVmIEdSQURJRU5UCnVuaWZvcm0gZmxvYXQgdV9yYWRpYWxHcmFkaWVudFZlY3Rvcls2XTsKdmFyeWluZyB2ZWMzIHZHcmFkaWVudFZlY3RvcjE7CnZhcnlpbmcgdmVjMyB2R3JhZGllbnRWZWN0b3IyOwojZW5kaWYKCnZvaWQgbWFpbigpIHsKICBnbF9Qb2ludFNpemUgPSAxLjA7CgogIG1hdDMgbW9kZWxNYXRyaXggPSBtYXQzKAogICAgYV90cmFuc2Zvcm0wLngsIGFfdHJhbnNmb3JtMS54LCAwLCAKICAgIGFfdHJhbnNmb3JtMC55LCBhX3RyYW5zZm9ybTEueSwgMCwKICAgIGFfdHJhbnNmb3JtMC56LCBhX3RyYW5zZm9ybTEueiwgMQogICk7CgogIHZlYzMgcG9zID0gcHJvamVjdGlvbk1hdHJpeCAqIHZpZXdNYXRyaXggKiBtb2RlbE1hdHJpeCAqIHZlYzMoYV92ZXJ0ZXhQb3NpdGlvbi54eSwgMS4wKTsKICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zLnh5LCAxLjAsIDEuMCk7CgojaWZkZWYgR1JBRElFTlQKICB2ZWMzIHZnMSA9IHZpZXdNYXRyaXggKiB2ZWMzKHVfcmFkaWFsR3JhZGllbnRWZWN0b3JbMF0sIHVfcmFkaWFsR3JhZGllbnRWZWN0b3JbMV0sIDEuMCk7CiAgdmVjMyB2ZzIgPSB2aWV3TWF0cml4ICogdmVjMyh1X3JhZGlhbEdyYWRpZW50VmVjdG9yWzNdLCB1X3JhZGlhbEdyYWRpZW50VmVjdG9yWzRdLCAxLjApOwogIGZsb2F0IGggPSB1X3Jlc29sdXRpb24ueTsKICB2ZzEueSA9IGggLSB2ZzEueTsKICB2ZzIueSA9IGggLSB2ZzIueTsKICB2R3JhZGllbnRWZWN0b3IxID0gdmVjMyh2ZzEueHksIHVfcmFkaWFsR3JhZGllbnRWZWN0b3JbMl0pOwogIHZHcmFkaWVudFZlY3RvcjIgPSB2ZWMzKHZnMi54eSwgdV9yYWRpYWxHcmFkaWVudFZlY3Rvcls1XSk7CiNlbmRpZgogIAogIGZsYWdCYWNrZ3JvdW5kID0gYV92ZXJ0ZXhQb3NpdGlvbi56OwoKI2lmZGVmIENMT1VEQ09MT1IKICBpZihmbGFnQmFja2dyb3VuZCA+IDAuMCkgewogICAgdkNvbG9yID0gbWl4KGFfY29sb3IsIGFfZmlsbENsb3VkQ29sb3IsIGFfZmlsbENsb3VkQ29sb3IuYSk7CiAgfSBlbHNlIHsKICAgIHZDb2xvciA9IG1peChhX2NvbG9yLCBhX3N0cm9rZUNsb3VkQ29sb3IsIGFfc3Ryb2tlQ2xvdWRDb2xvci5hKTsKICB9CiNlbHNlCiAgdkNvbG9yID0gYV9jb2xvcjsKI2VuZGlmCgojaWZkZWYgVEVYVFVSRQogIHZUZXh0dXJlQ29vcmQgPSBhX3ZlcnRleFRleHR1cmVDb29yZDsKICBmcmFtZUluZGV4ID0gYV9mcmFtZUluZGV4OwogIHZTb3VyY2VSZWN0ID0gYV9zb3VyY2VSZWN0OwojZW5kaWYKCiNpZmRlZiBDTElQUEFUSAogIHZDbGlwVVYgPSBhX2NsaXBVVjsKI2VuZGlmCgojaWZkZWYgQ0xPVURGSUxURVIKICBjb2xvckNsb3VkMCA9IGFfY29sb3JDbG91ZDA7CiAgY29sb3JDbG91ZDEgPSBhX2NvbG9yQ2xvdWQxOwogIGNvbG9yQ2xvdWQyID0gYV9jb2xvckNsb3VkMjsKICBjb2xvckNsb3VkMyA9IGFfY29sb3JDbG91ZDM7CiAgY29sb3JDbG91ZDQgPSBhX2NvbG9yQ2xvdWQ0OwojZW5kaWYKfWB9LGZ1bmN0aW9uKGQscix0KXt0LnIociksci5kZWZhdWx0PWBwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKCnZhcnlpbmcgdmVjNCB2Q29sb3I7CnZhcnlpbmcgZmxvYXQgZmxhZ0JhY2tncm91bmQ7CgojaWZkZWYgVEVYVFVSRQp2YXJ5aW5nIGZsb2F0IGZyYW1lSW5kZXg7CnZhcnlpbmcgdmVjMyB2VGV4dHVyZUNvb3JkOwp2YXJ5aW5nIHZlYzQgdlNvdXJjZVJlY3Q7CiNlbmRpZgoKI2lmZGVmIENMSVBQQVRICnZhcnlpbmcgdmVjMiB2Q2xpcFVWOwojZW5kaWYKCiNpZmRlZiBGSUxURVIKdW5pZm9ybSBpbnQgdV9maWx0ZXJGbGFnOwp1bmlmb3JtIGZsb2F0IHVfY29sb3JNYXRyaXhbMjBdOwojZW5kaWYKCiNpZmRlZiBDTE9VREZJTFRFUgp2YXJ5aW5nIHZlYzQgY29sb3JDbG91ZDA7CnZhcnlpbmcgdmVjNCBjb2xvckNsb3VkMTsKdmFyeWluZyB2ZWM0IGNvbG9yQ2xvdWQyOwp2YXJ5aW5nIHZlYzQgY29sb3JDbG91ZDM7CnZhcnlpbmcgdmVjNCBjb2xvckNsb3VkNDsKI2VuZGlmCgojaWZkZWYgR1JBRElFTlQKdmFyeWluZyB2ZWMzIHZHcmFkaWVudFZlY3RvcjE7CnZhcnlpbmcgdmVjMyB2R3JhZGllbnRWZWN0b3IyOwp1bmlmb3JtIGZsb2F0IHVfY29sb3JTdGVwc1s0MF07CnVuaWZvcm0gaW50IHVfZ3JhZGllbnRUeXBlOwoKdm9pZCBncmFkaWVudChpbm91dCB2ZWM0IGNvbG9yLCB2ZWMzIGd2MSwgdmVjMyBndjIsIGZsb2F0IGNvbG9yU3RlcHNbNDBdKSB7CiAgZmxvYXQgdDsKICAvLyBjZW50ZXIgY2lyY2xlIHJhZGl1cwogIGZsb2F0IGNyID0gZ3YxLno7CiAgLy8gZm9jYWwgY2lyY2xlIHJhZGl1cwogIGZsb2F0IGZyID0gZ3YyLno7CgogIGlmKGNyID4gMC4wIHx8IGZyID4gMC4wKSB7CiAgICAvLyByYWRpYWwgZ3JhZGllbnQKICAgIHZlYzIgY2VudGVyID0gZ3YxLnh5OwogICAgdmVjMiBmb2NhbCA9IGd2Mi54eTsKICAgIGZsb2F0IHggPSBmb2NhbC54IC0gZ2xfRnJhZ0Nvb3JkLng7CiAgICBmbG9hdCB5ID0gZm9jYWwueSAtIGdsX0ZyYWdDb29yZC55OwogICAgZmxvYXQgZHggPSBmb2NhbC54IC0gY2VudGVyLng7CiAgICBmbG9hdCBkeSA9IGZvY2FsLnkgLSBjZW50ZXIueTsKICAgIGZsb2F0IGRyID0gY3IgLSBmcjsKICAgIGZsb2F0IGEgPSBkeCAqIGR4ICsgZHkgKiBkeSAtIGRyICogZHI7CiAgICBmbG9hdCBiID0gLTIuMCAqICh5ICogZHkgKyB4ICogZHggKyBmciAqIGRyKTsKICAgIGZsb2F0IGMgPSB4ICogeCArIHkgKiB5IC0gZnIgKiBmcjsKICAgIHQgPSAxLjAgLSAwLjUgKiAoMS4wIC8gYSkgKiAoLWIgKyBzcXJ0KGIgKiBiIC0gNC4wICogYSAqIGMpKTsKICB9IGVsc2UgewogICAgLy8gbGluZWFyIGdyYWRpZW50CiAgICB2ZWMyIHYxID0gZ2xfRnJhZ0Nvb3JkLnh5IC0gZ3YxLnh5OwogICAgdmVjMiB2MiA9IGd2Mi54eSAtIGd2MS54eTsKICAgIHQgPSAodjEueCAqIHYyLnggKyB2MS55ICogdjIueSkgLyAodjIueCAqIHYyLnggKyB2Mi55ICogdjIueSk7CiAgfQoKICB2ZWM0IGNvbG9yc1s4XTsKICBjb2xvcnNbMF0gPSB2ZWM0KGNvbG9yU3RlcHNbMV0sIGNvbG9yU3RlcHNbMl0sIGNvbG9yU3RlcHNbM10sIGNvbG9yU3RlcHNbNF0pOwogIGNvbG9yc1sxXSA9IHZlYzQoY29sb3JTdGVwc1s2XSwgY29sb3JTdGVwc1s3XSwgY29sb3JTdGVwc1s4XSwgY29sb3JTdGVwc1s5XSk7CiAgY29sb3JzWzJdID0gdmVjNChjb2xvclN0ZXBzWzExXSwgY29sb3JTdGVwc1sxMl0sIGNvbG9yU3RlcHNbMTNdLCBjb2xvclN0ZXBzWzE0XSk7CiAgY29sb3JzWzNdID0gdmVjNChjb2xvclN0ZXBzWzE2XSwgY29sb3JTdGVwc1sxN10sIGNvbG9yU3RlcHNbMThdLCBjb2xvclN0ZXBzWzE5XSk7CiAgY29sb3JzWzRdID0gdmVjNChjb2xvclN0ZXBzWzIxXSwgY29sb3JTdGVwc1syMl0sIGNvbG9yU3RlcHNbMjNdLCBjb2xvclN0ZXBzWzI0XSk7CiAgY29sb3JzWzVdID0gdmVjNChjb2xvclN0ZXBzWzI2XSwgY29sb3JTdGVwc1syN10sIGNvbG9yU3RlcHNbMjhdLCBjb2xvclN0ZXBzWzI5XSk7CiAgY29sb3JzWzZdID0gdmVjNChjb2xvclN0ZXBzWzMxXSwgY29sb3JTdGVwc1szMl0sIGNvbG9yU3RlcHNbMzNdLCBjb2xvclN0ZXBzWzM0XSk7CiAgY29sb3JzWzddID0gdmVjNChjb2xvclN0ZXBzWzM2XSwgY29sb3JTdGVwc1szN10sIGNvbG9yU3RlcHNbMzhdLCBjb2xvclN0ZXBzWzM5XSk7CiAgCiAgZmxvYXQgc3RlcHNbOF07CiAgc3RlcHNbMF0gPSBjb2xvclN0ZXBzWzBdOwogIHN0ZXBzWzFdID0gY29sb3JTdGVwc1s1XTsKICBzdGVwc1syXSA9IGNvbG9yU3RlcHNbMTBdOwogIHN0ZXBzWzNdID0gY29sb3JTdGVwc1sxNV07CiAgc3RlcHNbNF0gPSBjb2xvclN0ZXBzWzIwXTsKICBzdGVwc1s1XSA9IGNvbG9yU3RlcHNbMjVdOwogIHN0ZXBzWzZdID0gY29sb3JTdGVwc1szMF07CiAgc3RlcHNbN10gPSBjb2xvclN0ZXBzWzM1XTsKCiAgY29sb3IgPSBjb2xvcnNbMF07CiAgZm9yIChpbnQgaSA9IDE7IGkgPCA4OyBpKyspIHsKICAgIGlmIChzdGVwc1tpXSA8IDAuMCB8fCBzdGVwc1tpXSA+IDEuMCkgewogICAgICBicmVhazsKICAgIH0KICAgIGlmKHN0ZXBzW2ldID09IHN0ZXBzW2kgLSAxXSkgewogICAgICBjb2xvciA9IGNvbG9yc1tpXTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbG9yID0gbWl4KGNvbG9yLCBjb2xvcnNbaV0sIGNsYW1wKCh0IC0gc3RlcHNbaSAtIDFdKSAvIChzdGVwc1tpXSAtIHN0ZXBzW2kgLSAxXSksIDAuMCwgMS4wKSk7CiAgICB9CiAgICBpZiAoc3RlcHNbaV0gPj0gdCkgewogICAgICBicmVhazsKICAgIH0KICB9Cn0KI2VuZGlmCgp2b2lkIHRyYW5zZm9ybUNvbG9yKGlub3V0IHZlYzQgY29sb3IsIGluIGZsb2F0IGNvbG9yTWF0cml4WzIwXSkgewogIGZsb2F0IHIgPSBjb2xvci5yLCBnID0gY29sb3IuZywgYiA9IGNvbG9yLmIsIGEgPSBjb2xvci5hOwogIGNvbG9yWzBdID0gY29sb3JNYXRyaXhbMF0gKiByICsgY29sb3JNYXRyaXhbMV0gKiBnICsgY29sb3JNYXRyaXhbMl0gKiBiICsgY29sb3JNYXRyaXhbM10gKiBhICsgY29sb3JNYXRyaXhbNF07CiAgY29sb3JbMV0gPSBjb2xvck1hdHJpeFs1XSAqIHIgKyBjb2xvck1hdHJpeFs2XSAqIGcgKyBjb2xvck1hdHJpeFs3XSAqIGIgKyBjb2xvck1hdHJpeFs4XSAqIGEgKyBjb2xvck1hdHJpeFs5XTsKICBjb2xvclsyXSA9IGNvbG9yTWF0cml4WzEwXSAqIHIgKyBjb2xvck1hdHJpeFsxMV0gKiBnICsgY29sb3JNYXRyaXhbMTJdICogYiArIGNvbG9yTWF0cml4WzEzXSAqIGEgKyBjb2xvck1hdHJpeFsxNF07CiAgY29sb3JbM10gPSBjb2xvck1hdHJpeFsxNV0gKiByICsgY29sb3JNYXRyaXhbMTZdICogZyArIGNvbG9yTWF0cml4WzE3XSAqIGIgKyBjb2xvck1hdHJpeFsxOF0gKiBhICsgY29sb3JNYXRyaXhbMTldOwp9CgojaWZkZWYgQ0xPVURGSUxURVIKdm9pZCBidWlsZENsb3VkQ29sb3IoaW5vdXQgZmxvYXQgY29sb3JDbG91ZE1hdHJpeFsyMF0pIHsKICBjb2xvckNsb3VkTWF0cml4WzBdID0gY29sb3JDbG91ZDBbMF07CiAgY29sb3JDbG91ZE1hdHJpeFsxXSA9IGNvbG9yQ2xvdWQxWzBdOwogIGNvbG9yQ2xvdWRNYXRyaXhbMl0gPSBjb2xvckNsb3VkMlswXTsKICBjb2xvckNsb3VkTWF0cml4WzNdID0gY29sb3JDbG91ZDNbMF07CiAgY29sb3JDbG91ZE1hdHJpeFs0XSA9IGNvbG9yQ2xvdWQ0WzBdOwoKICBjb2xvckNsb3VkTWF0cml4WzVdID0gY29sb3JDbG91ZDBbMV07CiAgY29sb3JDbG91ZE1hdHJpeFs2XSA9IGNvbG9yQ2xvdWQxWzFdOwogIGNvbG9yQ2xvdWRNYXRyaXhbN10gPSBjb2xvckNsb3VkMlsxXTsKICBjb2xvckNsb3VkTWF0cml4WzhdID0gY29sb3JDbG91ZDNbMV07CiAgY29sb3JDbG91ZE1hdHJpeFs5XSA9IGNvbG9yQ2xvdWQ0WzFdOwoKICBjb2xvckNsb3VkTWF0cml4WzEwXSA9IGNvbG9yQ2xvdWQwWzJdOwogIGNvbG9yQ2xvdWRNYXRyaXhbMTFdID0gY29sb3JDbG91ZDFbMl07CiAgY29sb3JDbG91ZE1hdHJpeFsxMl0gPSBjb2xvckNsb3VkMlsyXTsKICBjb2xvckNsb3VkTWF0cml4WzEzXSA9IGNvbG9yQ2xvdWQzWzJdOwogIGNvbG9yQ2xvdWRNYXRyaXhbMTRdID0gY29sb3JDbG91ZDRbMl07CgogIGNvbG9yQ2xvdWRNYXRyaXhbMTVdID0gY29sb3JDbG91ZDBbM107CiAgY29sb3JDbG91ZE1hdHJpeFsxNl0gPSBjb2xvckNsb3VkMVszXTsKICBjb2xvckNsb3VkTWF0cml4WzE3XSA9IGNvbG9yQ2xvdWQyWzNdOwogIGNvbG9yQ2xvdWRNYXRyaXhbMThdID0gY29sb3JDbG91ZDNbM107CiAgY29sb3JDbG91ZE1hdHJpeFsxOV0gPSBjb2xvckNsb3VkNFszXTsKfQojZW5kaWYKCnZvaWQgbWFpbigpIHsKICB2ZWM0IGNvbG9yID0gdkNvbG9yOwogIGZsb2F0IG9wYWNpdHkgPSBhYnMoZmxhZ0JhY2tncm91bmQpOwoKI2lmZGVmIEdSQURJRU5UCiAgaWYodV9ncmFkaWVudFR5cGUgPiAwICYmIGZsYWdCYWNrZ3JvdW5kID4gMC4wIHx8IHVfZ3JhZGllbnRUeXBlID09IDAgJiYgZmxhZ0JhY2tncm91bmQgPD0gMC4wKSB7CiAgICBncmFkaWVudChjb2xvciwgdkdyYWRpZW50VmVjdG9yMSwgdkdyYWRpZW50VmVjdG9yMiwgdV9jb2xvclN0ZXBzKTsKICB9CiNlbmRpZgoKICBpZihvcGFjaXR5IDwgMS4wKSB7CiAgICBjb2xvci5hICo9IG9wYWNpdHk7CiAgfQoKI2lmZGVmIFRFWFRVUkUKICBpZihmbGFnQmFja2dyb3VuZCA+IDAuMCkgewogICAgdmVjMyB0ZXhDb29yZCA9IHZUZXh0dXJlQ29vcmQ7CgogICAgaWYodGV4Q29vcmQueiA9PSAxLjApIHsKICAgICAgdGV4Q29vcmQgPSBmcmFjdCh0ZXhDb29yZCk7CiAgICB9CgogICAgaWYodGV4Q29vcmQueCA8PSAxLjAgJiYgdGV4Q29vcmQueCA+PSAwLjAKICAgICAgJiYgdGV4Q29vcmQueSA8PSAxLjAgJiYgdGV4Q29vcmQueSA+PSAwLjApIHsKICAgICAgaWYodlNvdXJjZVJlY3QueiA+IDAuMCkgewogICAgICAgIHRleENvb3JkLnggPSB2U291cmNlUmVjdC54ICsgdGV4Q29vcmQueCAqIHZTb3VyY2VSZWN0Lno7CiAgICAgICAgdGV4Q29vcmQueSA9IDEuMCAtICh2U291cmNlUmVjdC55ICsgKDEuMCAtIHRleENvb3JkLnkpICogdlNvdXJjZVJlY3Qudyk7CiAgICAgIH0KICAgICAgaWYoZnJhbWVJbmRleCA8IDAuMCkgewogICAgICAgIHZlYzQgdGV4Q29sb3IgPSB0ZXh0dXJlMkQodV90ZXhTYW1wbGVyLCB0ZXhDb29yZC54eSk7CiAgICAgICAgY29sb3IgPSBtaXgoY29sb3IsIHRleENvbG9yLCB0ZXhDb2xvci5hKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbnQgaW5kZXggPSBpbnQoZmxvb3IoY2xhbXAoMC4wLCAxMS4wLCBmcmFtZUluZGV4KSkpOwogICAgICAgIHZlYzQgdGV4Q29sb3I7CiAgICAgICAgaWYoaW5kZXggPT0gMCkgdGV4Q29sb3IgPSB0ZXh0dXJlMkQodV90ZXhGcmFtZTAsIHRleENvb3JkLnh5KTsKICAgICAgICBlbHNlIGlmKGluZGV4ID09IDEpIHRleENvbG9yID0gdGV4dHVyZTJEKHVfdGV4RnJhbWUxLCB0ZXhDb29yZC54eSk7CiAgICAgICAgZWxzZSBpZihpbmRleCA9PSAyKSB0ZXhDb2xvciA9IHRleHR1cmUyRCh1X3RleEZyYW1lMiwgdGV4Q29vcmQueHkpOwogICAgICAgIGVsc2UgaWYoaW5kZXggPT0gMykgdGV4Q29sb3IgPSB0ZXh0dXJlMkQodV90ZXhGcmFtZTMsIHRleENvb3JkLnh5KTsKICAgICAgICBlbHNlIGlmKGluZGV4ID09IDQpIHRleENvbG9yID0gdGV4dHVyZTJEKHVfdGV4RnJhbWU0LCB0ZXhDb29yZC54eSk7CiAgICAgICAgZWxzZSBpZihpbmRleCA9PSA1KSB0ZXhDb2xvciA9IHRleHR1cmUyRCh1X3RleEZyYW1lNSwgdGV4Q29vcmQueHkpOwogICAgICAgIGVsc2UgaWYoaW5kZXggPT0gNikgdGV4Q29sb3IgPSB0ZXh0dXJlMkQodV90ZXhGcmFtZTYsIHRleENvb3JkLnh5KTsKICAgICAgICBlbHNlIGlmKGluZGV4ID09IDcpIHRleENvbG9yID0gdGV4dHVyZTJEKHVfdGV4RnJhbWU3LCB0ZXhDb29yZC54eSk7CiAgICAgICAgZWxzZSBpZihpbmRleCA9PSA4KSB0ZXhDb2xvciA9IHRleHR1cmUyRCh1X3RleEZyYW1lOCwgdGV4Q29vcmQueHkpOwogICAgICAgIGVsc2UgaWYoaW5kZXggPT0gOSkgdGV4Q29sb3IgPSB0ZXh0dXJlMkQodV90ZXhGcmFtZTksIHRleENvb3JkLnh5KTsKICAgICAgICBlbHNlIGlmKGluZGV4ID09IDEwKSB0ZXhDb2xvciA9IHRleHR1cmUyRCh1X3RleEZyYW1lMTAsIHRleENvb3JkLnh5KTsKICAgICAgICBlbHNlIHRleENvbG9yID0gdGV4dHVyZTJEKHVfdGV4RnJhbWUxMSwgdGV4Q29vcmQueHkpOwogICAgICAgIGZsb2F0IGFscGhhID0gdGV4Q29sb3IuYTsKICAgICAgICBpZihvcGFjaXR5IDwgMS4wKSB7CiAgICAgICAgICB0ZXhDb2xvci5hICo9IG9wYWNpdHk7CiAgICAgICAgICBhbHBoYSAqPSBtaXgoMC40NjUsIDEuMCwgb3BhY2l0eSk7CiAgICAgICAgfQogICAgICAgIC8vIGNvbG9yID0gbWl4KGNvbG9yLCB0ZXhDb2xvciwgdGV4Q29sb3IuYSk7CiAgICAgICAgY29sb3IucmdiID0gbWl4KGNvbG9yLnJnYiwgdGV4Q29sb3IucmdiLCBhbHBoYSk7CiAgICAgICAgLy8gY29sb3IucmdiID0gbWl4KHRleENvbG9yLnJnYiwgY29sb3IucmdiLCBjb2xvci5hKTsKICAgICAgICBjb2xvci5yZ2IgPSBtaXgodGV4Q29sb3IucmdiLCBjb2xvci5yZ2IsIGNsYW1wKGNvbG9yLmEgLyBtYXgoMC4wMDAxLCB0ZXhDb2xvci5hKSwgMC4wLCAxLjApKTsKICAgICAgICBjb2xvci5hID0gdGV4Q29sb3IuYSArICgxLjAgLSB0ZXhDb2xvci5hKSAqIGNvbG9yLmE7CiAgICAgIH0KICAgIH0KICB9CiNlbmRpZgoKI2lmZGVmIEZJTFRFUgogIGlmKHVfZmlsdGVyRmxhZyA+IDApIHsKICAgIHRyYW5zZm9ybUNvbG9yKGNvbG9yLCB1X2NvbG9yTWF0cml4KTsKICB9CiNlbmRpZgoKI2lmZGVmIENMT1VERklMVEVSCiAgZmxvYXQgY29sb3JDbG91ZE1hdHJpeFsyMF07CiAgYnVpbGRDbG91ZENvbG9yKGNvbG9yQ2xvdWRNYXRyaXgpOwogIHRyYW5zZm9ybUNvbG9yKGNvbG9yLCBjb2xvckNsb3VkTWF0cml4KTsKI2VuZGlmCgojaWZkZWYgQ0xJUFBBVEgKICBmbG9hdCBjbGlwID0gdGV4dHVyZTJEKHVfY2xpcFNhbXBsZXIsIHZDbGlwVVYpLnI7CiAgY29sb3IgKj0gY2xpcDsKI2VuZGlmCgogIGdsX0ZyYWdDb2xvciA9IGNvbG9yOwp9YH0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSwoZnVuY3Rpb24oZSxuKXt0LmQociwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIixmdW5jdGlvbigpe3JldHVybiBzfSksdC5kKHIsImNhbmNlbEFuaW1hdGlvbkZyYW1lIixmdW5jdGlvbigpe3JldHVybiBpfSksdCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2Z1bmN0aW9uIGEoKXtpZih0eXBlb2YgcGVyZm9ybWFuY2U8InUiJiZwZXJmb3JtYW5jZS5ub3cpcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpO2lmKHR5cGVvZiBlPCJ1IiYmZS5ocnRpbWUpe2NvbnN0W28sY109ZS5ocnRpbWUoKTtyZXR1cm4gbyoxZTMrYyoxZS02fXJldHVybiBEYXRlLm5vdz9EYXRlLm5vdygpOm5ldyBEYXRlKCkuZ2V0VGltZSgpfWxldCBzLGk7dHlwZW9mIG48InUiJiZ0eXBlb2Ygbi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9PSJmdW5jdGlvbiI/KHM9bi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUsaT1uLmNhbmNlbEFuaW1hdGlvbkZyYW1lKToocz1mdW5jdGlvbihvKXtyZXR1cm4gc2V0VGltZW91dCgoKT0+e28oYSgpKX0sMTYpfSxpPWZ1bmN0aW9uKG8pe3JldHVybiBjbGVhclRpbWVvdXQobyl9KX0pLmNhbGwodGhpcyx0KDY5KSx0KDIyKSl9LGZ1bmN0aW9uKGQscil7dmFyIHQ9ZC5leHBvcnRzPXt9LGUsbjtmdW5jdGlvbiBhKCl7dGhyb3cgbmV3IEVycm9yKCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9ZnVuY3Rpb24gcygpe3Rocm93IG5ldyBFcnJvcigiY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9KGZ1bmN0aW9uKCl7dHJ5e3R5cGVvZiBzZXRUaW1lb3V0PT0iZnVuY3Rpb24iP2U9c2V0VGltZW91dDplPWF9Y2F0Y2h7ZT1hfXRyeXt0eXBlb2YgY2xlYXJUaW1lb3V0PT0iZnVuY3Rpb24iP249Y2xlYXJUaW1lb3V0Om49c31jYXRjaHtuPXN9fSkoKTtmdW5jdGlvbiBpKFQpe2lmKGU9PT1zZXRUaW1lb3V0KXJldHVybiBzZXRUaW1lb3V0KFQsMCk7aWYoKGU9PT1hfHwhZSkmJnNldFRpbWVvdXQpcmV0dXJuIGU9c2V0VGltZW91dCxzZXRUaW1lb3V0KFQsMCk7dHJ5e3JldHVybiBlKFQsMCl9Y2F0Y2h7dHJ5e3JldHVybiBlLmNhbGwobnVsbCxULDApfWNhdGNoe3JldHVybiBlLmNhbGwodGhpcyxULDApfX19ZnVuY3Rpb24gbyhUKXtpZihuPT09Y2xlYXJUaW1lb3V0KXJldHVybiBjbGVhclRpbWVvdXQoVCk7aWYoKG49PT1zfHwhbikmJmNsZWFyVGltZW91dClyZXR1cm4gbj1jbGVhclRpbWVvdXQsY2xlYXJUaW1lb3V0KFQpO3RyeXtyZXR1cm4gbihUKX1jYXRjaHt0cnl7cmV0dXJuIG4uY2FsbChudWxsLFQpfWNhdGNoe3JldHVybiBuLmNhbGwodGhpcyxUKX19fXZhciBjPVtdLG09ITEsdSxwPS0xO2Z1bmN0aW9uIHkoKXshbXx8IXV8fChtPSExLHUubGVuZ3RoP2M9dS5jb25jYXQoYyk6cD0tMSxjLmxlbmd0aCYmTygpKX1mdW5jdGlvbiBPKCl7aWYoIW0pe3ZhciBUPWkoeSk7bT0hMDtmb3IodmFyIGw9Yy5sZW5ndGg7bDspe2Zvcih1PWMsYz1bXTsrK3A8bDspdSYmdVtwXS5ydW4oKTtwPS0xLGw9Yy5sZW5ndGh9dT1udWxsLG09ITEsbyhUKX19dC5uZXh0VGljaz1mdW5jdGlvbihUKXt2YXIgbD1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZihhcmd1bWVudHMubGVuZ3RoPjEpZm9yKHZhciBoPTE7aDxhcmd1bWVudHMubGVuZ3RoO2grKylsW2gtMV09YXJndW1lbnRzW2hdO2MucHVzaChuZXcgeChULGwpKSxjLmxlbmd0aD09PTEmJiFtJiZpKE8pfTtmdW5jdGlvbiB4KFQsbCl7dGhpcy5mdW49VCx0aGlzLmFycmF5PWx9eC5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX0sdC50aXRsZT0iYnJvd3NlciIsdC5icm93c2VyPSEwLHQuZW52PXt9LHQuYXJndj1bXSx0LnZlcnNpb249IiIsdC52ZXJzaW9ucz17fTtmdW5jdGlvbiB2KCl7fXQub249dix0LmFkZExpc3RlbmVyPXYsdC5vbmNlPXYsdC5vZmY9dix0LnJlbW92ZUxpc3RlbmVyPXYsdC5yZW1vdmVBbGxMaXN0ZW5lcnM9dix0LmVtaXQ9dix0LnByZXBlbmRMaXN0ZW5lcj12LHQucHJlcGVuZE9uY2VMaXN0ZW5lcj12LHQubGlzdGVuZXJzPWZ1bmN0aW9uKFQpe3JldHVybltdfSx0LmJpbmRpbmc9ZnVuY3Rpb24oVCl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCIpfSx0LmN3ZD1mdW5jdGlvbigpe3JldHVybiIvIn0sdC5jaGRpcj1mdW5jdGlvbihUKXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCIpfSx0LnVtYXNrPWZ1bmN0aW9uKCl7cmV0dXJuIDB9fSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJkZWZhdWx0IixmdW5jdGlvbigpe3JldHVybiBDfSk7dmFyIGU9dCgxKSxuPXQoNzEpLGE9dCg3Mykscz10KDIxMyksaT10KDIxNCksbz10KDIxNSksYz10KDIxNik7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2Z1bmN0aW9uIG0oYixFKXt2YXIgTD1PYmplY3Qua2V5cyhiKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgRD1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGIpO0UmJihEPUQuZmlsdGVyKGZ1bmN0aW9uKEkpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGIsSSkuZW51bWVyYWJsZX0pKSxMLnB1c2guYXBwbHkoTCxEKX1yZXR1cm4gTH1mdW5jdGlvbiB1KGIpe2Zvcih2YXIgRT0xO0U8YXJndW1lbnRzLmxlbmd0aDtFKyspe3ZhciBMPWFyZ3VtZW50c1tFXSE9bnVsbD9hcmd1bWVudHNbRV06e307RSUyP20oT2JqZWN0KEwpLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKEQpe3AoYixELExbRF0pfSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYixPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhMKSk6bShPYmplY3QoTCkpLmZvckVhY2goZnVuY3Rpb24oRCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGIsRCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEwsRCkpfSl9cmV0dXJuIGJ9ZnVuY3Rpb24gcChiLEUsTCl7cmV0dXJuIEUgaW4gYj9PYmplY3QuZGVmaW5lUHJvcGVydHkoYixFLHt2YWx1ZTpMLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6YltFXT1MLGJ9Y29uc3QgeT1TeW1ib2wuZm9yKCJzcHJpdGVqc19jaGFuZ2VkQXR0cnMiKSxPPVN5bWJvbC5mb3IoInNwcml0ZWpzX2F0dHJpYnV0ZXMiKSx4PVN5bWJvbCgicmVzb2x1dGlvbiIpLHY9U3ltYm9sKCJhbmltYXRpb25zIiksVD1TeW1ib2woImV2ZW50TGlzdGVuZXJzIiksbD1TeW1ib2woImNhcHR1cmVFdmVudExpc3RlbmVycyIpLGg9U3ltYm9sKCJmaWx0ZXJzIiksZj1TeW1ib2woImRpc3BsYXkiKSxnPVN5bWJvbCgicHJvZ3JhbSIpLE09U3ltYm9sKCJzaGFkZXJBdHRycyIpLEE9U3ltYm9sKCJ1bmlmb3JtcyIpO2NsYXNzIEN7Y29uc3RydWN0b3IoRT17fSl7dGhpcy5hdHRyaWJ1dGVzPW5ldyB0aGlzLmNvbnN0cnVjdG9yLkF0dHIodGhpcyksdGhpc1t4XT17d2lkdGg6MzAwLGhlaWdodDoxNTB9LE9iamVjdC5hc3NpZ24odGhpcy5hdHRyaWJ1dGVzLEUpLHRoaXNbdl09bmV3IFNldCx0aGlzW1RdPXt9LHRoaXNbbF09e319Z2V0IGFuY2VzdG9ycygpe2xldCBFPXRoaXMucGFyZW50O2NvbnN0IEw9W107Zm9yKDtFOylMLnB1c2goRSksRT1FLnBhcmVudDtyZXR1cm4gTH1nZXQgYW5pbWF0aW9ucygpe3JldHVybiB0aGlzW3ZdfWdldCBmaWx0ZXJzKCl7cmV0dXJuIHRoaXNbaF18fHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5maWx0ZXJzfWdldCBpc1Zpc2libGUoKXtyZXR1cm4hMX1nZXQgbGF5ZXIoKXtyZXR1cm4gdGhpcy5wYXJlbnQ/dGhpcy5wYXJlbnQubGF5ZXI6bnVsbH1nZXQgbG9jYWxNYXRyaXgoKXtjb25zdCBFPXRoaXMudHJhbnNmb3JtTWF0cml4LHt4OkwseTpEfT10aGlzLmF0dHJpYnV0ZXM7cmV0dXJuIEVbNF0rPUwsRVs1XSs9RCxFfWdldCBvcGFjaXR5KCl7bGV0IEU9dGhpcy5hdHRyaWJ1dGVzLm9wYWNpdHk7cmV0dXJuIHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5vcGFjaXR5IT1udWxsJiYoRSo9dGhpcy5wYXJlbnQub3BhY2l0eSksRX1nZXQgcGFyZW50Tm9kZSgpe3JldHVybiB0aGlzLnBhcmVudH1nZXQgbmV4dFNpYmxpbmcoKXtyZXR1cm4gdGhpcy5nZXROb2RlTmVhckJ5KDEpfWdldCBwcmV2aW91c1NpYmxpbmcoKXtyZXR1cm4gdGhpcy5nZXROb2RlTmVhckJ5KC0xKX1nZXQgcHJvZ3JhbSgpe3JldHVybiB0aGlzW2ddfWdldCByZW5kZXJlcigpe3JldHVybiB0aGlzLnBhcmVudD90aGlzLnBhcmVudC5yZW5kZXJlcjpudWxsfWdldCByZW5kZXJNYXRyaXgoKXtpZih0aGlzLl9fY2FjaGVSZW5kZXJNYXRyaXgpcmV0dXJuIHRoaXMuX19jYWNoZVJlbmRlck1hdHJpeDtsZXQgRT10aGlzLmxvY2FsTWF0cml4O2NvbnN0IEw9dGhpcy5wYXJlbnQ7aWYoTCl7Y29uc3QgRD1MLl9fY2FjaGVSZW5kZXJNYXRyaXh8fEwucmVuZGVyTWF0cml4O0QmJihFPWUubWF0MmQubXVsdGlwbHkoQXJyYXkub2YoMCwwLDAsMCwwLDApLEQsRSkpfXJldHVybiBFfWdldCB3b3JsZFNjYWxpbmcoKXtjb25zdCBFPXRoaXMucmVuZGVyTWF0cml4O3JldHVybltNYXRoLmh5cG90KEVbMF0sRVsxXSksTWF0aC5oeXBvdChFWzJdLEVbM10pXX1nZXQgd29ybGRSb3RhdGlvbigpe2NvbnN0IEU9dGhpcy5yZW5kZXJNYXRyaXg7cmV0dXJuIE1hdGguYXRhbjIoRVsxXSxFWzNdKX1nZXQgd29ybGRQb3NpdGlvbigpe2NvbnN0IEU9dGhpcy5yZW5kZXJNYXRyaXg7cmV0dXJuW0VbNF0sRVs1XV19Z2V0IHVuaWZvcm1zKCl7cmV0dXJuIHRoaXNbQV19Z2V0IGNsYXNzTmFtZSgpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXMuY2xhc3NOYW1lfXNldCBjbGFzc05hbWUoRSl7dGhpcy5hdHRyaWJ1dGVzLmNsYXNzTmFtZT1FfWdldCBpZCgpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXMuaWR9c2V0IGlkKEUpe3RoaXMuYXR0cmlidXRlcy5pZD1FfWdldCBuYW1lKCl7cmV0dXJuIHRoaXMuYXR0cmlidXRlcy5uYW1lfXNldCBuYW1lKEUpe3RoaXMuYXR0cmlidXRlcy5uYW1lPUV9Z2V0IHpJbmRleCgpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXMuekluZGV4fXNldCB6SW5kZXgoRSl7dGhpcy5hdHRyaWJ1dGVzLnpJbmRleD1FfWdldCBtZXNoKCl7cmV0dXJuIG51bGx9Z2V0IHNoYWRlckF0dHJzKCl7cmV0dXJuIHRoaXNbTV18fHt9fWFjdGl2YXRlQW5pbWF0aW9ucygpe2NvbnN0IEU9dGhpcy5sYXllcjtpZihFKXtjb25zdCBMPXRoaXNbdl07TC5mb3JFYWNoKEk9PntJLmJhc2VUaW1lbGluZT1FLnRpbWVsaW5lLEkucGxheSgpLEkuZmluaXNoZWQudGhlbigoKT0+e0wuZGVsZXRlKEkpfSl9KTtjb25zdCBEPXRoaXMuY2hpbGRyZW47RCYmRC5mb3JFYWNoKEk9PntJLmFjdGl2YXRlQW5pbWF0aW9ucyYmSS5hY3RpdmF0ZUFuaW1hdGlvbnMoKX0pfX1hZGRFdmVudExpc3RlbmVyKEUsTCxEPXt9KXtFPT09Im1vdXNld2hlZWwiJiYoRT0id2hlZWwiKSx0eXBlb2YgRD09ImJvb2xlYW4iJiYoRD17Y2FwdHVyZTpEfSk7Y29uc3R7Y2FwdHVyZTpJLG9uY2U6Un09RCxCPUk/bDpUO3JldHVybiB0aGlzW0JdW0VdPXRoaXNbQl1bRV18fFtdLHRoaXNbQl1bRV0ucHVzaCh7bGlzdGVuZXI6TCxvbmNlOlJ9KSx0aGlzfWFuaW1hdGUoRSxMKXtjb25zdCBEPW5ldyBhLmRlZmF1bHQodGhpcyxFLEwpO3JldHVybiB0aGlzLmVmZmVjdHMmJkQuYXBwbHlFZmZlY3RzKHRoaXMuZWZmZWN0cyksdGhpcy5sYXllciYmKEQuYmFzZVRpbWVsaW5lPXRoaXMubGF5ZXIudGltZWxpbmUsRC5wbGF5KCksRC5maW5pc2hlZC50aGVuKCgpPT57dGhpc1t2XS5kZWxldGUoRCl9KSksdGhpc1t2XS5hZGQoRCksRH1hdHRyKC4uLkUpe2lmKEUubGVuZ3RoPT09MClyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW09dO2lmKEUubGVuZ3RoPjEpe2xldFtMLERdPUU7cmV0dXJuIHR5cGVvZiBEPT0iZnVuY3Rpb24iJiYoRD1EKHRoaXMuYXR0cihMKSkpLHRoaXMuc2V0QXR0cmlidXRlKEwsRCksdGhpc31yZXR1cm4gdHlwZW9mIEVbMF09PSJzdHJpbmciP3RoaXMuZ2V0QXR0cmlidXRlKEVbMF0pOihPYmplY3QuYXNzaWduKHRoaXMuYXR0cmlidXRlcyxFWzBdKSx0aGlzKX1jbG9uZU5vZGUoKXtjb25zdCBFPW5ldyB0aGlzLmNvbnN0cnVjdG9yLEw9dGhpcy5hdHRyaWJ1dGVzW3ldO3JldHVybiBFLmF0dHIoTCksRX1jb25uZWN0KEUsTCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInBhcmVudCIse3ZhbHVlOkUsd3JpdGFibGU6ITEsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInpPcmRlciIse3ZhbHVlOkwsd3JpdGFibGU6ITEsY29uZmlndXJhYmxlOiEwfSksRS50aW1lbGluZSYmdGhpcy5hY3RpdmF0ZUFuaW1hdGlvbnMoKSx0aGlzLnNldFJlc29sdXRpb24oRS5nZXRSZXNvbHV0aW9uKCkpLHRoaXMuZm9yY2VVcGRhdGUoKSx0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImFwcGVuZCIsZGV0YWlsOntwYXJlbnQ6RSx6T3JkZXI6TH19KX1jb250YWlucyhFKXtmb3IoO0UmJnRoaXMhPT1FOylFPUUucGFyZW50O3JldHVybiEhRX1kZWFjdGl2YXRlQW5pbWF0aW9ucygpe3RoaXNbdl0uZm9yRWFjaChMPT5MLmNhbmNlbCgpKTtjb25zdCBFPXRoaXMuY2hpbGRyZW47RSYmRS5mb3JFYWNoKEw9PntMLmRlYWN0aXZhdGVBbmltYXRpb25zJiZMLmRlYWN0aXZhdGVBbmltYXRpb25zKCl9KX1kaXNjb25uZWN0KCl7Y29uc3R7cGFyZW50OkUsek9yZGVyOkx9PXRoaXM7ZGVsZXRlIHRoaXMucGFyZW50LGRlbGV0ZSB0aGlzLnpPcmRlcix0aGlzLmRlYWN0aXZhdGVBbmltYXRpb25zKCksdGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJyZW1vdmUiLGRldGFpbDp7cGFyZW50OkUsek9yZGVyOkx9fSksRSYmRS5mb3JjZVVwZGF0ZSgpfWRpc3BhdGNoRXZlbnQoRSl7RSBpbnN0YW5jZW9mIGkuZGVmYXVsdHx8KEU9bmV3IGkuZGVmYXVsdChFKSksRS50YXJnZXQ9dGhpcztsZXQgTD1FLnR5cGU7TD09PSJtb3VzZXdoZWVsIiYmKEw9IndoZWVsIik7Y29uc3QgRD1bdGhpc107bGV0IEk9dGhpcy5wYXJlbnQ7Zm9yKDtFLmJ1YmJsZXMmJkk7KUQucHVzaChJKSxJPUkucGFyZW50O2ZvcihsZXQgUj1ELmxlbmd0aC0xO1I+PTA7Ui0tKXtjb25zdCBCPURbUl0sej1CW2xdJiZCW2xdW0xdO2lmKHomJnoubGVuZ3RoJiYoRS5jdXJyZW50VGFyZ2V0PUIsei5mb3JFYWNoKCh7bGlzdGVuZXI6SyxvbmNlOlF9KT0+e0suY2FsbCh0aGlzLEUpLFEmJkQucmVtb3ZlRXZlbnRMaXN0ZW5lcihLKX0pLGRlbGV0ZSBFLmN1cnJlbnRUYXJnZXQpLCFFLmJ1YmJsZXMmJkUuY2FuY2VsQnViYmxlKWJyZWFrfWlmKCFFLmNhbmNlbEJ1YmJsZSlmb3IobGV0IFI9MDtSPEQubGVuZ3RoO1IrKyl7Y29uc3QgQj1EW1JdLHo9QltUXSYmQltUXVtMXTtpZih6JiZ6Lmxlbmd0aCYmKEUuY3VycmVudFRhcmdldD1CLHouZm9yRWFjaCgoe2xpc3RlbmVyOkssb25jZTpRfSk9PntLLmNhbGwodGhpcyxFKSxRJiZELnJlbW92ZUV2ZW50TGlzdGVuZXIoSyl9KSxkZWxldGUgRS5jdXJyZW50VGFyZ2V0KSwhRS5idWJibGVzfHxFLmNhbmNlbEJ1YmJsZSlicmVha319ZGlzcGF0Y2hQb2ludGVyRXZlbnQoRSl7Y29uc3R7bGF5ZXJYOkwsbGF5ZXJZOkR9PUU7cmV0dXJuIHRoaXMuaXNQb2ludENvbGxpc2lvbihMLEQpPyh0aGlzLmRpc3BhdGNoRXZlbnQoRSksITApOiExfWRyYXcoRT1bXSl7Y29uc3QgTD10aGlzLm1lc2g7aWYoTCl7aWYoT2JqZWN0KG8uYXBwbHlGaWx0ZXJzKShMLHRoaXMuZmlsdGVycyksRS5wdXNoKEwpLHRoaXNbZ10pe0wuc2V0UHJvZ3JhbSh0aGlzW2ddKTtjb25zdCBEPXRoaXNbTV07RCYmT2JqZWN0LmVudHJpZXMoRCkuZm9yRWFjaCgoW1IsQl0pPT57TC5zZXRBdHRyaWJ1dGUoUixCKX0pO2NvbnN0IEk9dGhpc1tBXTtpZih0aGlzW0FdKXtjb25zdCBSPXt9O09iamVjdC5lbnRyaWVzKEkpLmZvckVhY2goKFtCLHpdKT0+e3R5cGVvZiB6PT0iZnVuY3Rpb24iJiYoej16KHRoaXMsQikpLFJbQl09en0pLEwuc2V0VW5pZm9ybXMoUil9fU9iamVjdChjLmRlZmF1bHQpKHRoaXMsTCl9cmV0dXJuIEV9Zm9yY2VVcGRhdGUoKXt0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuZm9yY2VVcGRhdGUoKX1nZXRBdHRyaWJ1dGUoRSl7cmV0dXJuIHRoaXMuYXR0cmlidXRlc1tFXX1nZXRMaXN0ZW5lcnMoRSx7Y2FwdHVyZTpMPSExfT17fSl7cmV0dXJuWy4uLnRoaXNbTD9sOlRdW0VdfHxbXV19Z2V0Tm9kZU5lYXJCeShFPTEpe2lmKCF0aGlzLnBhcmVudClyZXR1cm4gbnVsbDtpZihFPT09MClyZXR1cm4gdGhpcztjb25zdCBMPXRoaXMucGFyZW50LmNoaWxkcmVuLEQ9TC5pbmRleE9mKHRoaXMpO3JldHVybiBMW0QrRV19Z2V0V29ybGRQb3NpdGlvbihFLEwpe2NvbnN0IEQ9dGhpcy5yZW5kZXJNYXRyaXgsST1FKkRbMF0rTCpEWzJdK0RbNF0sUj1FKkRbMV0rTCpEWzNdK0RbNV07cmV0dXJuW0ksUl19Z2V0T2Zmc2V0UG9zaXRpb24oRSxMKXtjb25zdCBEPWUubWF0MmQuaW52ZXJ0KEFycmF5Lm9mKDAsMCwwLDAsMCwwKSx0aGlzLnJlbmRlck1hdHJpeCksST1FKkRbMF0rTCpEWzJdK0RbNF0sUj1FKkRbMV0rTCpEWzNdK0RbNV07cmV0dXJuW0ksUl19Z2V0UmVzb2x1dGlvbigpe3JldHVybiB1KHt9LHRoaXNbeF0pfWlzUG9pbnRDb2xsaXNpb24oRSxMKXtpZighdGhpcy5tZXNoKXJldHVybiExO2NvbnN0IEQ9dGhpcy5hdHRyaWJ1dGVzLnBvaW50ZXJFdmVudHM7aWYoRD09PSJub25lInx8RCE9PSJhbGwiJiYhdGhpcy5pc1Zpc2libGUpcmV0dXJuITE7bGV0IEk9ImJvdGgiO3JldHVybiBEPT09InZpc2libGVGaWxsIiYmKEk9ImZpbGwiKSxEPT09InZpc2libGVTdHJva2UiJiYoST0ic3Ryb2tlIiksdGhpcy5tZXNoLmlzUG9pbnRDb2xsaXNpb24oRSxMLEkpfW9uUHJvcGVydHlDaGFuZ2UoRSxMLEQpe0UhPT0iaWQiJiZFIT09Im5hbWUiJiZFIT09ImNsYXNzTmFtZSImJkUhPT0icG9pbnRlckV2ZW50cyImJkUhPT0icGFzc0V2ZW50cyImJnRoaXMuZm9yY2VVcGRhdGUoKSxFPT09ImZpbHRlciImJih0aGlzW2hdPU9iamVjdChvLnBhcnNlRmlsdGVyU3RyaW5nKShMKSksRT09PSJ6SW5kZXgiJiZ0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucmVvcmRlcigpfXNldEF0dHJpYnV0ZShFLEwpe0U9PT0iYXR0cnMiJiZ0aGlzLmF0dHIoTCksdGhpcy5hdHRyaWJ1dGVzW0VdPUx9c2V0TW91c2VDYXB0dXJlKCl7dGhpcy5sYXllciYmKHRoaXMubGF5ZXIuX19tb3VzZUNhcHR1cmVkVGFyZ2V0PXRoaXMpfXNldFByb2dyYW0oRSl7dGhpc1tnXT1FLHRoaXMuZm9yY2VVcGRhdGUoKX1zZXRTaGFkZXJBdHRyaWJ1dGUoRSxMKXt0aGlzW01dPXRoaXNbTV18fHt9LHRoaXNbTV1bRV09TCx0aGlzLmZvcmNlVXBkYXRlKCl9c2V0VW5pZm9ybXMoRSl7dGhpc1tBXT10aGlzW0FdfHx7fSxPYmplY3QuYXNzaWduKHRoaXNbQV0sRSksdGhpcy5mb3JjZVVwZGF0ZSgpfXNldFJlc29sdXRpb24oe3dpZHRoOkUsaGVpZ2h0Okx9KXtjb25zdHt3aWR0aDpELGhlaWdodDpJfT10aGlzW3hdOyhEIT09RXx8SSE9PUwpJiYodGhpc1t4XT17d2lkdGg6RSxoZWlnaHQ6TH0sdGhpcy5mb3JjZVVwZGF0ZSgpLHRoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToicmVzb2x1dGlvbmNoYW5nZSIsZGV0YWlsOnt3aWR0aDpFLGhlaWdodDpMfX0pKX1zaG93KCl7dGhpcy5hdHRyaWJ1dGVzLmRpc3BsYXk9PT0ibm9uZSImJih0aGlzLmF0dHJpYnV0ZXMuZGlzcGxheT10aGlzW2ZdfHwiIil9aGlkZSgpe3RoaXMuYXR0cmlidXRlcy5kaXNwbGF5IT09Im5vbmUiJiYodGhpc1tmXT10aGlzLmF0dHJpYnV0ZXMuZGlzcGxheSx0aGlzLmF0dHJpYnV0ZXMuZGlzcGxheT0ibm9uZSIpfXJlbGVhc2VNb3VzZUNhcHR1cmUoKXt0aGlzLmxheWVyJiZ0aGlzLmxheWVyLl9fbW91c2VDYXB0dXJlZFRhcmdldD09PXRoaXMmJih0aGlzLmxheWVyLl9fbW91c2VDYXB0dXJlZFRhcmdldD1udWxsKX1yZW1vdmUoKXtyZXR1cm4gdGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJlbW92ZUNoaWxkPyh0aGlzLnBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKSwhMCk6ITF9cmVtb3ZlQWxsTGlzdGVuZXJzKEUsTD17fSl7dHlwZW9mIEw9PSJib29sZWFuIiYmKEw9e2NhcHR1cmU6TH0pO2NvbnN0IEk9TC5jYXB0dXJlP2w6VDtyZXR1cm4gdGhpc1tJXVtFXSYmKHRoaXNbSV1bRV09W10pLHRoaXN9cmVtb3ZlQXR0cmlidXRlKEUpe3RoaXMuc2V0QXR0cmlidXRlKEUsbnVsbCl9cmVtb3ZlRXZlbnRMaXN0ZW5lcihFLEwsRD17fSl7dHlwZW9mIEQ9PSJib29sZWFuIiYmKEQ9e2NhcHR1cmU6RH0pO2NvbnN0IFI9RC5jYXB0dXJlP2w6VDtpZih0aGlzW1JdW0VdKXtjb25zdCBCPXRoaXNbUl1bRV07aWYoQilmb3IobGV0IHo9MDt6PEIubGVuZ3RoO3orKyl7Y29uc3R7bGlzdGVuZXI6S309Qlt6XTtpZihLPT09TCl7dGhpc1tSXVtFXS5zcGxpY2UoeiwxKTticmVha319fXJldHVybiB0aGlzfXRyYW5zaXRpb24oRSxMPSJsaW5lYXIiKXtjb25zdCBEPXRoaXMsST1TeW1ib2woImFuaW1hdGlvbiIpO0w9THx8ImxpbmVhciI7bGV0IFI9MDtyZXR1cm4gdHlwZW9mIEU9PSJvYmplY3QiJiYoUj1FLmRlbGF5fHwwLEU9RS5kdXJhdGlvbikse1tJXTpudWxsLGNhbmNlbChCPSExKXtjb25zdCB6PXRoaXNbSV07eiYmei5jYW5jZWwoQil9LGVuZCgpe2NvbnN0IEI9dGhpc1tJXTtCJiYoQi5wbGF5U3RhdGU9PT0icnVubmluZyJ8fEIucGxheVN0YXRlPT09InBlbmRpbmciKSYmQi5maW5pc2goKX0scmV2ZXJzZSgpe2NvbnN0IEI9dGhpc1tJXTtpZihCKWlmKEIucGxheVN0YXRlPT09InJ1bm5pbmcifHxCLnBsYXlTdGF0ZT09PSJwZW5kaW5nIilCLnBsYXliYWNrUmF0ZT0tQi5wbGF5YmFja1JhdGU7ZWxzZXtjb25zdCB6PUIudGltaW5nLmRpcmVjdGlvbjtCLnRpbWluZy5kaXJlY3Rpb249ej09PSJyZXZlcnNlIj8ibm9ybWFsIjoicmV2ZXJzZSIsQi5wbGF5KCl9cmV0dXJuIEIuZmluaXNoZWR9LGF0dHIoQix6KXtyZXR1cm4gdGhpcy5lbmQoKSx0eXBlb2YgQj09InN0cmluZyImJihCPXtbQl06en0pLE9iamVjdC5lbnRyaWVzKEIpLmZvckVhY2goKFtLLFFdKT0+e3R5cGVvZiBRPT0iZnVuY3Rpb24iJiYoQltLXT1RKEQuYXR0cihLKSkpfSksdGhpc1tJXT1ELmFuaW1hdGUoW0JdLHtkdXJhdGlvbjpFKjFlMyxkZWxheTpSKjFlMyxmaWxsOiJmb3J3YXJkcyIsZWFzaW5nOkx9KSx0aGlzW0ldLmZpbmlzaGVkfX19dXBkYXRlQ29udG91cnMoKXt9fXAoQywiQXR0ciIsbi5kZWZhdWx0KSxzLmRlZmF1bHQucmVnaXN0ZXJOb2RlKEMsIm5vZGUiKX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gQ30pO3ZhciBlPXQoMSksbj10KDEyKSxhPXQoNzIpO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtjb25zdCBzPVN5bWJvbC5mb3IoInNwcml0ZWpzX3NldEF0dHJpYnV0ZURlZmF1bHQiKSxpPVN5bWJvbC5mb3IoInNwcml0ZWpzX2RlY2xhcmVBbGlhcyIpLG89U3ltYm9sLmZvcigic3ByaXRlanNfc2V0QXR0cmlidXRlIiksYz1TeW1ib2wuZm9yKCJzcHJpdGVqc19nZXRBdHRyaWJ1dGUiKSxtPVN5bWJvbC5mb3IoInNwcml0ZWpzX2F0dHJpYnV0ZXMiKSx1PVN5bWJvbC5mb3IoInNwcml0ZWpzX2NoYW5nZWRBdHRycyIpLHA9U3ltYm9sKCJzdWJqZWN0IikseT1TeW1ib2woImF0dHIiKSxPPVN5bWJvbCgiZGVmYXVsdCIpLHg9U3ltYm9sKCJhbGlhcyIpO2Z1bmN0aW9uIHYoYixbRSxMXSl7bGV0IEQ9ZS5tYXQyZC5mcm9tVmFsdWVzKDEsMCwwLDEsMCwwKTtyZXR1cm5bLi4uYl0uZm9yRWFjaCgoW0ksUl0pPT57aWYoKEV8fEwpJiYoRD1lLm1hdDJkLnRyYW5zbGF0ZShBcnJheS5vZigwLDAsMCwwLDAsMCksRCxbRSxMXSkpLEk9PT0ibWF0cml4IilEPWUubWF0MmQubXVsdGlwbHkoRCxELFIpO2Vsc2UgaWYoST09PSJvZmZzZXRUcmFuc2xhdGUiKURbNF0rPVJbMF0sRFs1XSs9UlsxXTtlbHNlIGlmKEk9PT0ib2Zmc2V0Um90YXRlIilEPWUubWF0MmQucm90YXRlKEFycmF5Lm9mKDAsMCwwLDAsMCwwKSxELFIpO2Vsc2UgaWYoST09PSJza2V3Iil7Y29uc3RbQix6XT1SO0Q9ZS5tYXQyZC5tdWx0aXBseShELEQsZS5tYXQyZC5mcm9tVmFsdWVzKDEsTWF0aC50YW4oeiksTWF0aC50YW4oQiksMSwwLDApKX1lbHNlIGUubWF0MmRbSV0oRCxELFIpOyhFfHxMKSYmKEQ9ZS5tYXQyZC50cmFuc2xhdGUoQXJyYXkub2YoMCwwLDAsMCwwLDApLEQsWy1FLC1MXSkpfSksRH1jb25zdCBUPVN5bWJvbCgidHJhbnNmb3JtTWF0cml4IiksbD1TeW1ib2woInRyYW5zZm9ybXMiKSxoPVN5bWJvbCgiY2hhbmdlZEF0dHJzIiksZj1TeW1ib2woImxhc3RDaGFuZ2VkQXR0ciIpLGc9U3ltYm9sKCJvZmZzZXRGaWd1cmUiKTtmdW5jdGlvbiBNKGIsRSxMKXtjb25zdCBEPWJbeV1bRV07aWYoYltvXShFLEwsITEpfHxiW2ZdIT09RSl7Y29uc3QgUj1iW2xdO1IuaGFzKEUpJiZSLmRlbGV0ZShFKSxMJiYoRT09PSJyb3RhdGUiJiYoTD1NYXRoLlBJKkwvMTgwKSxFPT09InNjYWxlIiYmKEw9TC5tYXAoQj0+TWF0aC5hYnMoQik+MWUtNT9COjEvQj4wPzFlLTU6LTFlLTUpKSxSLnNldChFLEwpKSxiW1RdPW51bGwsYltwXS5vblByb3BlcnR5Q2hhbmdlKEUsTCxELGIpfX1mdW5jdGlvbiBBKGIpe2NvbnN0IEU9YltnXSxMPWIub2Zmc2V0RGlzdGFuY2UqRS5nZXRUb3RhbExlbmd0aCgpLEQ9RS5nZXRQb2ludEF0TGVuZ3RoKEwpO2lmKEQpe2NvbnN0IEk9YltsXTtsZXQgUj1iLm9mZnNldFJvdGF0ZTtSPT09ImF1dG8iP1I9RC5hbmdsZTpSPT09InJldmVyc2UiP1I9TWF0aC5QSStELmFuZ2xlOlI9TWF0aC5QSSpSLzE4MCxJLnNldCgib2Zmc2V0Um90YXRlIixSKSxJLnNldCgib2Zmc2V0VHJhbnNsYXRlIixbRC54LEQueV0pLGJbVF09bnVsbH19Y2xhc3MgQ3tzdGF0aWMgc2V0RGVmYXVsdChFLC4uLkwpe3JldHVybiBFW3NdKC4uLkwpfXN0YXRpYyBkZWNsYXJlQWxpYXMoRSwuLi5MKXtyZXR1cm4gRVtpXSguLi5MKX1zdGF0aWMgc2V0QXR0cmlidXRlKEUsLi4uTCl7cmV0dXJuIEVbb10oLi4uTCl9c3RhdGljIGdldEF0dHJpYnV0ZShFLC4uLkwpe3JldHVybiBFW2NdKC4uLkwpfXN0YXRpYyBnZXRBdHRyaWJ1dGVzKEUpe3JldHVybiBFW21dfXN0YXRpYyBnZXRDaGFuZ2VkQXR0cmlidXRlcyhFKXtyZXR1cm4gRVt1XX1jb25zdHJ1Y3RvcihFKXt0aGlzW3BdPUUsdGhpc1t5XT17fSx0aGlzW1RdPWUubWF0MmQuZnJvbVZhbHVlcygxLDAsMCwxLDAsMCksdGhpc1tsXT1uZXcgTWFwLHRoaXNbT109e30sdGhpc1t4XT1bXSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRSwidHJhbnNmb3JtTWF0cml4Iix7Z2V0OigpPT4odGhpc1tUXXx8KHRoaXNbVF09dih0aGlzW2xdLHRoaXMudHJhbnNmb3JtT3JpZ2luKSksWy4uLnRoaXNbVF1dKX0pLHRoaXNbc10oe2lkOiIiLG5hbWU6IiIsY2xhc3NOYW1lOiIiLHg6MCx5OjAsdHJhbnNmb3JtT3JpZ2luOlswLDBdLHRyYW5zZm9ybToiIix0cmFuc2xhdGU6WzAsMF0scm90YXRlOjAsc2NhbGU6WzEsMV0sc2tldzpbMCwwXSxvcGFjaXR5OjEsekluZGV4OjAsb2Zmc2V0UGF0aDp2b2lkIDAsb2Zmc2V0RGlzdGFuY2U6MCxvZmZzZXRSb3RhdGU6ImF1dG8iLHBvaW50ZXJFdmVudHM6InZpc2libGUiLGZpbHRlcjoibm9uZSIsZGlzcGxheToiIn0pLHRoaXNbaV0oImNsYXNzIiwicG9zIiksdGhpc1toXT1uZXcgU2V0LHRoaXNbZ109bmV3IG4uRmlndXJlMkQoe3NjYWxlOjUsc2ltcGxpZnk6MH0pfWdldFt1XSgpe2NvbnN0IEU9e307cmV0dXJuWy4uLnRoaXNbaF1dLmZvckVhY2goTD0+e0VbTF09dGhpc1t5XVtMXX0pLEV9Z2V0W21dKCl7Y29uc3QgRT1PYmplY3QuYXNzaWduKHt9LHRoaXNbeV0pO2ZvcihsZXQgTD0wO0w8dGhpc1t4XS5sZW5ndGg7TCsrKXtjb25zdCBEPXRoaXNbeF1bTF07RVtEXT10aGlzW0RdfXJldHVybiBFfVtzXShFKXtPYmplY3QuYXNzaWduKHRoaXNbT10sRSksT2JqZWN0LmFzc2lnbih0aGlzW3ldLEUpfVtpXSguLi5FKXt0aGlzW3hdLnB1c2goLi4uRSl9W29dKEUsTCxEPSEwKXtjb25zdCBJPXRoaXNbeV1bRV0sUj10aGlzW3BdO3JldHVybiBMPT1udWxsJiYoTD10aGlzW09dW0VdKSxPYmplY3QoYS5jb21wYXJlVmFsdWUpKEksTCk/ITE6KHRoaXNbeV1bRV09TCx0aGlzW2hdLmhhcyhFKSYmdGhpc1toXS5kZWxldGUoRSksdGhpc1toXS5hZGQoRSksdGhpc1tmXT1FLEQmJlIub25Qcm9wZXJ0eUNoYW5nZShFLEwsSSx0aGlzKSwhMCl9W2NdKEUpe3JldHVybiB0aGlzW3ldW0VdfXNldCBpZChFKXt0aGlzW29dKCJpZCIsRSl9Z2V0IGlkKCl7cmV0dXJuIHRoaXNbY10oImlkIil9c2V0IG5hbWUoRSl7dGhpc1tvXSgibmFtZSIsRSl9Z2V0IG5hbWUoKXtyZXR1cm4gdGhpc1tjXSgibmFtZSIpfXNldCBjbGFzc05hbWUoRSl7dGhpc1tvXSgiY2xhc3NOYW1lIixFKX1nZXQgY2xhc3NOYW1lKCl7cmV0dXJuIHRoaXNbY10oImNsYXNzTmFtZSIpfXNldCBjbGFzcyhFKXt0aGlzLmNsYXNzTmFtZT1FfWdldCBjbGFzcygpe3JldHVybiB0aGlzLmNsYXNzTmFtZX1nZXQgeCgpe3JldHVybiB0aGlzW2NdKCJ4Iil9c2V0IHgoRSl7dGhpc1tvXSgieCIsT2JqZWN0KGEudG9OdW1iZXIpKEUpKX1nZXQgeSgpe3JldHVybiB0aGlzW2NdKCJ5Iil9c2V0IHkoRSl7dGhpc1tvXSgieSIsT2JqZWN0KGEudG9OdW1iZXIpKEUpKX1nZXQgcG9zKCl7cmV0dXJuW3RoaXMueCx0aGlzLnldfXNldCBwb3MoRSl7RT1PYmplY3QoYS50b0FycmF5KShFKSxBcnJheS5pc0FycmF5KEUpfHwoRT1bRSxFXSksdGhpcy54PUVbMF0sdGhpcy55PUVbMV19Z2V0IHRyYW5zZm9ybSgpe3JldHVybiB0aGlzW2NdKCJ0cmFuc2Zvcm0iKX1zZXQgdHJhbnNmb3JtKEUpe2xldCBMPW51bGw7aWYoQXJyYXkuaXNBcnJheShFKSYmKEw9RSxFPWBtYXRyaXgoJHtFLm1hcChhLnRvTnVtYmVyKS5qb2luKCl9KWApLHR5cGVvZiBFPT0ic3RyaW5nIilFPUUucmVwbGFjZSgvXHMqLFxzKi9nLCIsIik7ZWxzZSBpZihFIT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgdHJhbnNmb3JtIHZhbHVlLiIpO2NvbnN0IEQ9dGhpc1t5XS50cmFuc2Zvcm07aWYodGhpc1tvXSgidHJhbnNmb3JtIixFLCExKSl7Y29uc3QgST10aGlzW2xdO2lmKEkuaGFzKCJtYXRyaXgiKSYmSS5kZWxldGUoIm1hdHJpeCIpLEwpSS5zZXQoIm1hdHJpeCIsTCk7ZWxzZSBpZihFKXtjb25zdCBSPUUubWF0Y2goLyhtYXRyaXh8dHJhbnNsYXRlfHJvdGF0ZXxzY2FsZXxza2V3KVwoW14oKV0rXCkvZyk7aWYoUil7bGV0IEI9ZS5tYXQyZC5mcm9tVmFsdWVzKDEsMCwwLDEsMCwwKTtmb3IobGV0IHo9MDt6PFIubGVuZ3RoO3orKyl7Y29uc3QgUT1SW3pdLm1hdGNoKC9eKG1hdHJpeHx0cmFuc2xhdGV8cm90YXRlfHNjYWxlfHNrZXcpXCgoW14oKV0rKVwpLyk7aWYoUSl7bGV0WyxfLGpdPVE7Xz09PSJyb3RhdGUiP2o9TWF0aC5QSSpwYXJzZUZsb2F0KGopLzE4MDpqPWoudHJpbSgpLnNwbGl0KC9bXHMsXSsvKS5tYXAoRz0+T2JqZWN0KGEudG9OdW1iZXIpKEcpKSxfPT09Im1hdHJpeCI/Qj1lLm1hdDJkLm11bHRpcGx5KEIsQixqKTpfPT09InNrZXciP0I9ZS5tYXQyZC5tdWx0aXBseShCLEIsZS5tYXQyZC5mcm9tVmFsdWVzKDEsTWF0aC50YW4oalsxXSksTWF0aC50YW4oalswXSksMSwwLDApKTplLm1hdDJkW19dKEIsQixqKSxJLnNldCgibWF0cml4IixCKX19fWVsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCB0cmFuc2Zvcm0gdmFsdWUuIil9dGhpc1tUXT1udWxsLHRoaXNbcF0ub25Qcm9wZXJ0eUNoYW5nZSgidHJhbnNmb3JtIixFLEQsdGhpcyl9fWdldCB0cmFuc2Zvcm1PcmlnaW4oKXtyZXR1cm4gdGhpc1tjXSgidHJhbnNmb3JtT3JpZ2luIil9c2V0IHRyYW5zZm9ybU9yaWdpbihFKXtFPU9iamVjdChhLnRvQXJyYXkpKEUsITApLEUhPW51bGwmJiFBcnJheS5pc0FycmF5KEUpJiYoRT1bRSxFXSksdGhpc1tvXSgidHJhbnNmb3JtT3JpZ2luIixFKSYmKHRoaXNbVF09bnVsbCl9Z2V0IHJvdGF0ZSgpe3JldHVybiB0aGlzW2NdKCJyb3RhdGUiKX1zZXQgcm90YXRlKEUpe00odGhpcywicm90YXRlIixFKX1nZXQgdHJhbnNsYXRlKCl7cmV0dXJuIHRoaXNbY10oInRyYW5zbGF0ZSIpfXNldCB0cmFuc2xhdGUoRSl7RT1PYmplY3QoYS50b0FycmF5KShFLCEwKSxFIT1udWxsJiYhQXJyYXkuaXNBcnJheShFKSYmKEU9W0UsRV0pLE0odGhpcywidHJhbnNsYXRlIixFKX1nZXQgc2NhbGUoKXtyZXR1cm4gdGhpc1tjXSgic2NhbGUiKX1zZXQgc2NhbGUoRSl7RT1PYmplY3QoYS50b0FycmF5KShFLCEwKSxFIT1udWxsJiYhQXJyYXkuaXNBcnJheShFKSYmKEU9W0UsRV0pLE0odGhpcywic2NhbGUiLEUpfWdldCBza2V3KCl7cmV0dXJuIHRoaXNbY10oInNrZXciKX1zZXQgc2tldyhFKXtFPU9iamVjdChhLnRvQXJyYXkpKEUsITApLEUhPW51bGwmJiFBcnJheS5pc0FycmF5KEUpJiYoRT1bRSxFXSksTSh0aGlzLCJza2V3IixFKX1nZXQgb3BhY2l0eSgpe3JldHVybiB0aGlzW2NdKCJvcGFjaXR5Iil9c2V0IG9wYWNpdHkoRSl7RSE9bnVsbCYmKEU9TnVtYmVyKEUpKSx0aGlzW29dKCJvcGFjaXR5IixFKX1nZXQgekluZGV4KCl7cmV0dXJuIHRoaXNbY10oInpJbmRleCIpfXNldCB6SW5kZXgoRSl7RSE9bnVsbCYmKEU9TnVtYmVyKEUpKSx0aGlzW29dKCJ6SW5kZXgiLEUpfWdldCBvZmZzZXRQYXRoKCl7cmV0dXJuIHRoaXNbY10oIm9mZnNldFBhdGgiKX1zZXQgb2Zmc2V0UGF0aChFKXt0aGlzW29dKCJvZmZzZXRQYXRoIixFKSYmKHRoaXNbZ10uYmVnaW5QYXRoKCksRSE9bnVsbCYmdGhpc1tnXS5hZGRQYXRoKEUpLEEodGhpcykpfWdldCBvZmZzZXREaXN0YW5jZSgpe3JldHVybiB0aGlzW2NdKCJvZmZzZXREaXN0YW5jZSIpfXNldCBvZmZzZXREaXN0YW5jZShFKXt0aGlzW29dKCJvZmZzZXREaXN0YW5jZSIsT2JqZWN0KGEudG9OdW1iZXIpKEUpKSYmQSh0aGlzKX1nZXQgb2Zmc2V0Um90YXRlKCl7cmV0dXJuIHRoaXNbY10oIm9mZnNldFJvdGF0ZSIpfXNldCBvZmZzZXRSb3RhdGUoRSl7dGhpc1tvXSgib2Zmc2V0Um90YXRlIixFKSxBKHRoaXMpfWdldCBwb2ludGVyRXZlbnRzKCl7cmV0dXJuIHRoaXNbY10oInBvaW50ZXJFdmVudHMiKX1zZXQgcG9pbnRlckV2ZW50cyhFKXtpZihFIT1udWxsJiZFIT09Im5vbmUiJiZFIT09InZpc2libGUiJiZFIT09InZpc2libGVGaWxsIiYmRSE9PSJ2aXNpYmxlU3Ryb2tlIiYmRSE9PSJhbGwiKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgcG9pbnRlckV2ZW50cyB0eXBlLiIpO3RoaXNbb10oInBvaW50ZXJFdmVudHMiLEUpfWdldCBmaWx0ZXIoKXtyZXR1cm4gdGhpc1tjXSgiZmlsdGVyIil9c2V0IGZpbHRlcihFKXt0aGlzW29dKCJmaWx0ZXIiLEUpfWdldCBkaXNwbGF5KCl7cmV0dXJuIHRoaXNbY10oImRpc3BsYXkiKX1zZXQgZGlzcGxheShFKXt0aGlzW29dKCJkaXNwbGF5IixFKX1zZXQgb2Zmc2V0KEUpe319fSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJzaXplVG9QaXhlbCIsZnVuY3Rpb24oKXtyZXR1cm4gZX0pLHQuZChyLCJ0b1N0cmluZyIsZnVuY3Rpb24oKXtyZXR1cm4gbn0pLHQuZChyLCJ0b051bWJlciIsZnVuY3Rpb24oKXtyZXR1cm4gYX0pLHQuZChyLCJ0b0FycmF5IixmdW5jdGlvbigpe3JldHVybiBzfSksdC5kKHIsImNvbXBhcmVWYWx1ZSIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pLHQoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtmdW5jdGlvbiBlKG8sYyl7Y29uc3QgbT1vLnRyaW0oKS5tYXRjaCgvXihbXGQuXSspKHB4fHB0fHBjfGlufGNtfG1tfGVtfGV4fHJlbXxxfHZ3fHZofHZtYXh8dm1pbikkLyk7bT9vPXtzaXplOnBhcnNlRmxvYXQobVsxXSksdW5pdDptWzJdfTpvPXtzaXplOnBhcnNlRmxvYXQobyksdW5pdDoicHgifTtsZXR7c2l6ZTp1LHVuaXQ6cH09bztpZihwPT09InB0Iil1Lz0uNzU7ZWxzZSBpZihwPT09InBjIil1Kj0xNjtlbHNlIGlmKHA9PT0iaW4iKXUqPTk2O2Vsc2UgaWYocD09PSJjbSIpdSo9OTYvMi41NDtlbHNlIGlmKHA9PT0ibW0iKXUqPTk2LzI1LjQ7ZWxzZSBpZihwPT09ImVtInx8cD09PSJyZW0ifHxwPT09ImV4Iil7aWYoIWMmJnR5cGVvZiBnZXRDb21wdXRlZFN0eWxlPT0iZnVuY3Rpb24iJiZ0eXBlb2YgZG9jdW1lbnQ8InUiKXtjb25zdCB5PWdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5mb250U2l6ZTt5P2M9ZSh5LDE2KTpjPTE2fXUqPWMscD09PSJleCImJih1Lz0yKX1lbHNlIGlmKHA9PT0icSIpdSo9OTYvMjUuNC80O2Vsc2UgaWYocD09PSJ2dyJ8fHA9PT0idmgiKXtpZih0eXBlb2YgZG9jdW1lbnQ8InUiKXtjb25zdCB5PXA9PT0idnciP3dpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg6d2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O3UqPXkvMTAwfX1lbHNlIGlmKChwPT09InZtYXgifHxwPT09InZtaW4iKSYmdHlwZW9mIGRvY3VtZW50PCJ1Iil7Y29uc3QgeT13aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLE89d2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O3A9PT0idm1heCI/dSo9TWF0aC5tYXgoeSxPKS8xMDA6dSo9TWF0aC5taW4oeSxPKS8xMDB9cmV0dXJuIHV9ZnVuY3Rpb24gbihvKXtyZXR1cm4gbz09bnVsbD9vOlN0cmluZyhvKX1mdW5jdGlvbiBhKG8pe2lmKG89PW51bGwpcmV0dXJuIG87aWYodHlwZW9mIG89PSJzdHJpbmciJiYobz1lKG8pKSwhTnVtYmVyLmlzRmluaXRlKG8pKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgdmFsdWUiKTtyZXR1cm4gb31mdW5jdGlvbiBzKG8sYz0hMSl7cmV0dXJuIG89PT0iIj9udWxsOih0eXBlb2Ygbz09InN0cmluZyImJihvPW8uc3BsaXQoL1tccyxdKy9nKSksQXJyYXkuaXNBcnJheShvKSYmKGMmJihvPW8ubWFwKGEpKSxvLmxlbmd0aD09PTEpP29bMF06byl9ZnVuY3Rpb24gaShvLGMpe2lmKEFycmF5LmlzQXJyYXkobykmJkFycmF5LmlzQXJyYXkoYykpe2lmKG8ubGVuZ3RoIT09Yy5sZW5ndGgpcmV0dXJuITE7Zm9yKGxldCBtPTA7bTxvLmxlbmd0aDttKyspaWYob1ttXSE9PWNbbV0pcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuIG89PW51bGwmJmM9PW51bGx8fG89PT1jfX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gcH0pO3ZhciBlPXQoNzQpLG49dCgzMiksYT10Lm4obikscz10KDY4KSxpPXQoNzIpO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtmdW5jdGlvbiBvKCl7cmV0dXJuIG89T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oeSl7Zm9yKHZhciBPPTE7Tzxhcmd1bWVudHMubGVuZ3RoO08rKyl7dmFyIHg9YXJndW1lbnRzW09dO2Zvcih2YXIgdiBpbiB4KU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LHYpJiYoeVt2XT14W3ZdKX1yZXR1cm4geX0sby5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gYyh5KXtpZih0eXBlb2YgeT09InN0cmluZyIpe2lmKHk9eS50cmltKCksL15bMC05Ll0rJSQvLnRlc3QoeSkpcmV0dXJuIHBhcnNlRmxvYXQoeSkvMTAwO2lmKC9eKFtcZC5dKykocHh8cHR8cGN8aW58Y218bW18ZW18ZXh8cmVtfHF8dnd8dmh8dm1heHx2bWluKSQvLnRlc3QoeSkpcmV0dXJuIE9iamVjdChpLnNpemVUb1BpeGVsKSh5KX1yZXR1cm4geX1mdW5jdGlvbiBtKHksTyx4LHYsVCl7cmV0dXJuIHR5cGVvZiB5PT0ic3RyaW5nIiYmKHk9YSgpKHkpKSx0eXBlb2YgTz09InN0cmluZyImJihPPWEoKShPKSksZS5FZmZlY3RzLmRlZmF1bHQoeSxPLHgsdixUKX1mdW5jdGlvbiB1KHksTyx4LHYsVCl7cmV0dXJuIGUuRWZmZWN0cy5kZWZhdWx0KHksTyx4LHYsVCl9ZS5FZmZlY3RzLmRlZmF1bHQ9ZnVuY3Rpb24oeSxPLHgsdixUKXtyZXR1cm4gQXJyYXkuaXNBcnJheSh5KSYmQXJyYXkuaXNBcnJheShPKT95Lm1hcCgobCxoKT0+bCsoeC12KS8oVC12KSooT1toXS1sKSk6dHlwZW9mIHk9PSJudW1iZXIiJiZ0eXBlb2YgTz09Im51bWJlciI/eSsoeC12KS8oVC12KSooTy15KTp4LXY+VC14P086eX0sZS5FZmZlY3RzLmZpbGxDb2xvcj1tLGUuRWZmZWN0cy5zdHJva2VDb2xvcj1tLGUuRWZmZWN0cy5iZ2NvbG9yPW0sZS5FZmZlY3RzLmJvcmRlckNvbG9yPW0sZS5FZmZlY3RzLnRleHQ9dTtjbGFzcyBwIGV4dGVuZHMgZS5BbmltYXRvcntjb25zdHJ1Y3RvcihPLHgsdil7Y29uc3QgVD1PLmF0dHIoKTtPYmplY3QuZW50cmllcyhUKS5mb3JFYWNoKChbbCxoXSk9PntUW2xdPWUuRWZmZWN0c1tsXT9oOmMoaCl9KSx4PXgubWFwKGw9PntsZXQgaD1vKHt9LGwpO2NvbnN0IGY9e307cmV0dXJuIE9iamVjdC5lbnRyaWVzKGgpLmZvckVhY2goKFtnLE1dKT0+e2ZbZ109ZS5FZmZlY3RzW2ddP006YyhNKX0pLGZ9KSxzdXBlcihULHgsdiksdGhpcy50YXJnZXQ9Tyx0aGlzLnNldHRlcj1mdW5jdGlvbihsLGgpe2guYXR0cihsKX19Z2V0IHBsYXlTdGF0ZSgpe3JldHVybiB0aGlzLnRhcmdldC5wYXJlbnQ/c3VwZXIucGxheVN0YXRlOiJpZGxlIn1nZXQgZmluaXNoZWQoKXtyZXR1cm4gc3VwZXIuZmluaXNoZWQudGhlbigoKT0+e2NvbnN0IE89dGhpcztyZXR1cm4gbmV3IFByb21pc2UoeD0+e2Z1bmN0aW9uIHYoKXtPLnNldHRlcihPLmZyYW1lLE8udGFyZ2V0KTtjb25zdCBUPU8ucGxheVN0YXRlO1Q9PT0iZmluaXNoZWQifHxUPT09ImlkbGUiPyhPYmplY3Qocy5jYW5jZWxBbmltYXRpb25GcmFtZSkoTy5yZXF1ZXN0SWQpLHgoKSk6T2JqZWN0KHMucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSh2KX12KCl9KX0pfWZpbmlzaCgpe3N1cGVyLmZpbmlzaCgpLE9iamVjdChzLmNhbmNlbEFuaW1hdGlvbkZyYW1lKSh0aGlzLnJlcXVlc3RJZCksdGhpcy5zZXR0ZXIodGhpcy5mcmFtZSx0aGlzLnRhcmdldCl9cGxheSgpe2lmKCF0aGlzLnRhcmdldC5wYXJlbnR8fHRoaXMucGxheVN0YXRlPT09InJ1bm5pbmciKXJldHVybjtzdXBlci5wbGF5KCksdGhpcy5zZXR0ZXIodGhpcy5mcmFtZSx0aGlzLnRhcmdldCk7Y29uc3QgTz10aGlzO3RoaXMucmVhZHkudGhlbigoKT0+e08uc2V0dGVyKE8uZnJhbWUsTy50YXJnZXQpLE8ucmVxdWVzdElkPU9iamVjdChzLnJlcXVlc3RBbmltYXRpb25GcmFtZSkoZnVuY3Rpb24geCgpe2NvbnN0IHY9Ty50YXJnZXQ7aWYodHlwZW9mIGRvY3VtZW50PCJ1IiYmZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50JiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29udGFpbnMmJnYubGF5ZXImJnYubGF5ZXIuY2FudmFzJiYhZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zKHYubGF5ZXIuY2FudmFzKSl7Ty5jYW5jZWwoKTtyZXR1cm59Y29uc3QgVD1PLnBsYXlTdGF0ZTtPLnNldHRlcihPLmZyYW1lLE8udGFyZ2V0KSxUIT09ImlkbGUiJiYoVD09PSJydW5uaW5nIj9PLnJlcXVlc3RJZD1PYmplY3Qocy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUpKHgpOihUPT09InBhdXNlZCJ8fFQ9PT0icGVuZGluZyImJk8udGltZWxpbmUuY3VycmVudFRpbWU8MCkmJk8ucmVhZHkudGhlbigoKT0+e08uc2V0dGVyKE8uZnJhbWUsTy50YXJnZXQpLE8ucmVxdWVzdElkPU9iamVjdChzLnJlcXVlc3RBbmltYXRpb25GcmFtZSkoeCl9KSl9KX0pfWNhbmNlbChPPSExKXtPYmplY3Qocy5jYW5jZWxBbmltYXRpb25GcmFtZSkodGhpcy5yZXF1ZXN0SWQpLE8/KHRoaXMuc2V0dGVyKHRoaXMuZnJhbWUsdGhpcy50YXJnZXQpLHN1cGVyLmNhbmNlbCgpKTooc3VwZXIuY2FuY2VsKCksdGhpcy5zZXR0ZXIodGhpcy5mcmFtZSx0aGlzLnRhcmdldCkpfX19LGZ1bmN0aW9uKGQscix0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksci5UaW1lbGluZT1yLkVmZmVjdHM9ci5FYXNpbmdzPXIuQW5pbWF0b3I9dm9pZCAwO3ZhciBlPXQoNzUpLG49bShlKSxhPXQoMTg3KSxzPW0oYSksaT10KDE4OCksbz10KDE5MCksYz1tKG8pO2Z1bmN0aW9uIG0odSl7cmV0dXJuIHUmJnUuX19lc01vZHVsZT91OntkZWZhdWx0OnV9fXIuQW5pbWF0b3I9Yy5kZWZhdWx0LHIuRWFzaW5ncz1pLkVhc2luZ3Msci5FZmZlY3RzPXMuZGVmYXVsdCxyLlRpbWVsaW5lPW4uZGVmYXVsdH0sZnVuY3Rpb24oZCxyLHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZT10KDc2KSxuPWwoZSksYT10KDEzMykscz1sKGEpLGk9dCgxNDEpLG89bChpKSxjPXQoMTY0KSxtPWwoYyksdT10KDE3MCkscD1sKHUpLHk9dCgxNzEpLE89bCh5KSx4PXQoMTc1KSx2PWwoeCksVD10KDE4Nik7ZnVuY3Rpb24gbChEKXtyZXR1cm4gRCYmRC5fX2VzTW9kdWxlP0Q6e2RlZmF1bHQ6RH19dmFyIGg9KDAsVC5jcmVhdGVOb3dUaW1lKSgpLGY9e29yaWdpblRpbWU6MCxwbGF5YmFja1JhdGU6MX0sZz0oMCx2LmRlZmF1bHQpKCJ0aW1lTWFyayIpLE09KDAsdi5kZWZhdWx0KSgicGxheWJhY2tSYXRlIiksQT0oMCx2LmRlZmF1bHQpKCJ0aW1lcnMiKSxDPSgwLHYuZGVmYXVsdCkoIm9yaWdpblRpbWUiKSxiPSgwLHYuZGVmYXVsdCkoInNldFRpbWVyIiksRT0oMCx2LmRlZmF1bHQpKCJwYXJlbnQiKSxMPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gRChJLFIpeygwLHAuZGVmYXVsdCkodGhpcyxEKSxJIGluc3RhbmNlb2YgRCYmKFI9SSxJPXt9KSxJPSgwLG0uZGVmYXVsdCkoe30sZixJKSxSJiYodGhpc1tFXT1SKTt2YXIgQj1JLm5vd3RpbWV8fGg7aWYoUilPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiZ2xvYmFsVGltZSIse2dldDpmdW5jdGlvbigpe3JldHVybiBSLmN1cnJlbnRUaW1lfX0pO2Vsc2V7dmFyIHo9QigpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJnbG9iYWxUaW1lIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEIoKS16fX0pfXRoaXNbZ109W3tnbG9iYWxUaW1lOnRoaXMuZ2xvYmFsVGltZSxsb2NhbFRpbWU6LUkub3JpZ2luVGltZSxlbnRyb3B5Oi1JLm9yaWdpblRpbWUscGxheWJhY2tSYXRlOkkucGxheWJhY2tSYXRlLGdsb2JhbEVudHJvcHk6MH1dLHRoaXNbRV0mJih0aGlzW2ddWzBdLmdsb2JhbEVudHJvcHk9dGhpc1tFXS5lbnRyb3B5KSx0aGlzW0NdPUkub3JpZ2luVGltZSx0aGlzW01dPUkucGxheWJhY2tSYXRlLHRoaXNbQV09bmV3IG8uZGVmYXVsdH1yZXR1cm4oMCxPLmRlZmF1bHQpKEQsW3trZXk6Im1hcmtUaW1lIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBSPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dm9pZCAwP2FyZ3VtZW50c1swXTp7fSxCPVIudGltZSx6PUI9PT12b2lkIDA/dGhpcy5jdXJyZW50VGltZTpCLEs9Ui5lbnRyb3B5LFE9Sz09PXZvaWQgMD90aGlzLmVudHJvcHk6SyxfPVIucGxheWJhY2tSYXRlLGo9Xz09PXZvaWQgMD90aGlzLnBsYXliYWNrUmF0ZTpfLEc9e2dsb2JhbFRpbWU6dGhpcy5nbG9iYWxUaW1lLGxvY2FsVGltZTp6LGVudHJvcHk6USxwbGF5YmFja1JhdGU6aixnbG9iYWxFbnRyb3B5OnRoaXMuZ2xvYmFsRW50cm9weX07dGhpc1tnXS5wdXNoKEcpfX0se2tleToiZm9yayIsdmFsdWU6ZnVuY3Rpb24oUil7cmV0dXJuIG5ldyBEKFIsdGhpcyl9fSx7a2V5OiJzZWVrR2xvYmFsVGltZSIsdmFsdWU6ZnVuY3Rpb24oUil7dmFyIEI9dGhpcy5zZWVrVGltZU1hcmsoUiksej10aGlzW2ddW0JdLEs9ei5lbnRyb3B5LFE9ei5wbGF5YmFja1JhdGUsXz16Lmdsb2JhbFRpbWU7cmV0dXJuIF8rKFItSykvTWF0aC5hYnMoUSl9fSx7a2V5OiJzZWVrTG9jYWxUaW1lIix2YWx1ZTpmdW5jdGlvbihSKXt2YXIgQj10aGlzLnNlZWtUaW1lTWFyayhSKSx6PXRoaXNbZ11bQl0sSz16LmxvY2FsVGltZSxRPXouZW50cm9weSxfPXoucGxheWJhY2tSYXRlO3JldHVybiBfPjA/SysoUi1RKTpLLShSLVEpfX0se2tleToic2Vla1RpbWVNYXJrIix2YWx1ZTpmdW5jdGlvbihSKXt2YXIgQj10aGlzW2ddLHo9MCxLPUIubGVuZ3RoLTE7aWYoUjw9Qlt6XS5lbnRyb3B5KXJldHVybiB6O2lmKFI+PUJbS10uZW50cm9weSlyZXR1cm4gSztmb3IodmFyIFE9TWF0aC5mbG9vcigoeitLKS8yKTtRPnomJlE8Szspe2lmKFI9PT1CW1FdLmVudHJvcHkpcmV0dXJuIFE7UjxCW1FdLmVudHJvcHk/Sz1ROlI+QltRXS5lbnRyb3B5JiYoej1RKSxRPU1hdGguZmxvb3IoKHorSykvMil9cmV0dXJuIHp9fSx7a2V5OiJ1cGRhdGVUaW1lcnMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIFI9dGhpcyxCPVtdLmNvbmNhdCgoMCxzLmRlZmF1bHQpKHRoaXNbQV0pKTtCLmZvckVhY2goZnVuY3Rpb24oeil7dmFyIEs9KDAsbi5kZWZhdWx0KSh6LDIpLFE9S1swXSxfPUtbMV07UltiXShfLmhhbmRsZXIsXy50aW1lLFEpfSl9fSx7a2V5OiJjbGVhclRpbWVvdXQiLHZhbHVlOmZ1bmN0aW9uKEkpe2Z1bmN0aW9uIFIoQil7cmV0dXJuIEkuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBSLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIEkudG9TdHJpbmcoKX0sUn0oZnVuY3Rpb24oSSl7dmFyIFI9dGhpc1tBXS5nZXQoSSk7UiYmUi50aW1lcklEIT1udWxsJiYodGhpc1tFXT90aGlzW0VdLmNsZWFyVGltZW91dChSLnRpbWVySUQpOmNsZWFyVGltZW91dChSLnRpbWVySUQpKSx0aGlzW0FdLmRlbGV0ZShJKX0pfSx7a2V5OiJjbGVhckludGVydmFsIix2YWx1ZTpmdW5jdGlvbihSKXtyZXR1cm4gdGhpcy5jbGVhclRpbWVvdXQoUil9fSx7a2V5OiJjbGVhciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgUj10aGlzLEI9dGhpc1tBXTtbXS5jb25jYXQoKDAscy5kZWZhdWx0KShCLmtleXMoKSkpLmZvckVhY2goZnVuY3Rpb24oeil7Ui5jbGVhclRpbWVvdXQoeil9KX19LHtrZXk6InNldFRpbWVvdXQiLHZhbHVlOmZ1bmN0aW9uKFIpe3ZhciBCPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTp7ZGVsYXk6MH07cmV0dXJuIHRoaXNbYl0oUixCKX19LHtrZXk6InNldEludGVydmFsIix2YWx1ZTpmdW5jdGlvbihSKXt2YXIgQj1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06e2RlbGF5OjB9LHo9dGhpcyxLPXRoaXNbYl0oZnVuY3Rpb24gUSgpe3pbYl0oUSxCLEspLFIoKX0sQik7cmV0dXJuIEt9fSx7a2V5OmIsdmFsdWU6ZnVuY3Rpb24oUixCKXt2YXIgej10aGlzLEs9YXJndW1lbnRzLmxlbmd0aD4yJiZhcmd1bWVudHNbMl0hPT12b2lkIDA/YXJndW1lbnRzWzJdOigwLHYuZGVmYXVsdCkoInRpbWVySUQiKTtCPSgwLFQuZm9ybWF0RGVsYXkpKEIpO3ZhciBRPXRoaXNbQV0uZ2V0KEspLF89dm9pZCAwLGo9bnVsbCxHPXZvaWQgMCxYPXZvaWQgMDtRPyh0aGlzLmNsZWFyVGltZW91dChLKSxCLmlzRW50cm9weT9fPShCLmRlbGF5LSh0aGlzLmVudHJvcHktUS5zdGFydEVudHJvcHkpKS9NYXRoLmFicyh0aGlzLnBsYXliYWNrUmF0ZSk6Xz0oQi5kZWxheS0odGhpcy5jdXJyZW50VGltZS1RLnN0YXJ0VGltZSkpL3RoaXMucGxheWJhY2tSYXRlLEc9US5zdGFydFRpbWUsWD1RLnN0YXJ0RW50cm9weSk6KF89Qi5kZWxheS8oQi5pc0VudHJvcHk/TWF0aC5hYnModGhpcy5wbGF5YmFja1JhdGUpOnRoaXMucGxheWJhY2tSYXRlKSxHPXRoaXMuY3VycmVudFRpbWUsWD10aGlzLmVudHJvcHkpO3ZhciBaPXRoaXNbRV0sdHQ9Wj9aLnNldFRpbWVvdXQuYmluZChaKTpzZXRUaW1lb3V0LG50PUIuaGVhZGluZztyZXR1cm4hWiYmbnQ9PT0hMSYmXzwwJiYoXz0xLzApLChpc0Zpbml0ZShfKXx8WikmJihfPU1hdGguY2VpbChfKSx0dCE9PXNldFRpbWVvdXQmJihfPXtkZWxheTpfLGhlYWRpbmc6bnR9KSxqPXR0KGZ1bmN0aW9uKCl7eltBXS5kZWxldGUoSyksUigpfSxfKSksdGhpc1tBXS5zZXQoSyx7dGltZXJJRDpqLGhhbmRsZXI6Uix0aW1lOkIsc3RhcnRUaW1lOkcsc3RhcnRFbnRyb3B5Olh9KSxLfX0se2tleToicGFyZW50IixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tFXX19LHtrZXk6Imxhc3RUaW1lTWFyayIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbZ11bdGhpc1tnXS5sZW5ndGgtMV19fSx7a2V5OiJjdXJyZW50VGltZSIsZ2V0OmZ1bmN0aW9uKCl7dmFyIFI9dGhpcy5sYXN0VGltZU1hcmssQj1SLmxvY2FsVGltZSx6PVIuZ2xvYmFsVGltZTtyZXR1cm4gQisodGhpcy5nbG9iYWxUaW1lLXopKnRoaXMucGxheWJhY2tSYXRlfSxzZXQ6ZnVuY3Rpb24oUil7dmFyIEI9dGhpcyx6PXRoaXMuY3VycmVudFRpbWUsSz1SLFE9dGhpc1tBXTt0aGlzLm1hcmtUaW1lKHt0aW1lOlJ9KSxbXS5jb25jYXQoKDAscy5kZWZhdWx0KShRKSkuZm9yRWFjaChmdW5jdGlvbihfKXt2YXIgaj0oMCxuLmRlZmF1bHQpKF8sMiksRz1qWzBdLFg9alsxXTtpZihRLmhhcyhHKSl7dmFyIFo9WC50aW1lLHR0PVouaXNFbnRyb3B5LG50PVouZGVsYXkscT1aLmhlYWRpbmcsZHQ9WC5oYW5kbGVyLHV0PVguc3RhcnRUaW1lO2lmKHR0KW50PT09MCYmKGR0KCksQi5jbGVhclRpbWVvdXQoRykpO2Vsc2V7dmFyIFc9dXQrbnQ7KG50PT09MHx8cSE9PSExJiYoSy16KSpudDw9MHx8ejw9VyYmVzw9S3x8ej49VyYmVz49SykmJihkdCgpLEIuY2xlYXJUaW1lb3V0KEcpKX19fSksdGhpcy51cGRhdGVUaW1lcnMoKX19LHtrZXk6ImVudHJvcHkiLGdldDpmdW5jdGlvbigpe3ZhciBSPXRoaXMubGFzdFRpbWVNYXJrLEI9Ui5lbnRyb3B5LHo9Ui5nbG9iYWxFbnRyb3B5O3JldHVybiBCK01hdGguYWJzKCh0aGlzLmdsb2JhbEVudHJvcHkteikqdGhpcy5wbGF5YmFja1JhdGUpfSxzZXQ6ZnVuY3Rpb24oUil7aWYodGhpcy5lbnRyb3B5PlIpe3ZhciBCPXRoaXMuc2Vla1RpbWVNYXJrKFIpO3RoaXNbZ10ubGVuZ3RoPUIrMX10aGlzLm1hcmtUaW1lKHtlbnRyb3B5OlJ9KSx0aGlzLnVwZGF0ZVRpbWVycygpfX0se2tleToiZ2xvYmFsRW50cm9weSIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbRV0/dGhpc1tFXS5lbnRyb3B5OnRoaXMuZ2xvYmFsVGltZX19LHtrZXk6InBsYXliYWNrUmF0ZSIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbTV19LHNldDpmdW5jdGlvbihSKXtSIT09dGhpcy5wbGF5YmFja1JhdGUmJih0aGlzLm1hcmtUaW1lKHtwbGF5YmFja1JhdGU6Un0pLHRoaXNbTV09Uix0aGlzLnVwZGF0ZVRpbWVycygpKX19LHtrZXk6InBhdXNlZCIsZ2V0OmZ1bmN0aW9uKCl7aWYodGhpcy5wbGF5YmFja1JhdGU9PT0wKXJldHVybiEwO2Zvcih2YXIgUj10aGlzLnBhcmVudDtSOyl7aWYoUi5wbGF5YmFja1JhdGU9PT0wKXJldHVybiEwO1I9Ui5wYXJlbnR9cmV0dXJuITF9fV0pLER9KCk7ci5kZWZhdWx0PUx9LGZ1bmN0aW9uKGQscix0KXtyLl9fZXNNb2R1bGU9ITA7dmFyIGU9dCg3Nyksbj1pKGUpLGE9dCgxMjkpLHM9aShhKTtmdW5jdGlvbiBpKG8pe3JldHVybiBvJiZvLl9fZXNNb2R1bGU/bzp7ZGVmYXVsdDpvfX1yLmRlZmF1bHQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBvKGMsbSl7dmFyIHU9W10scD0hMCx5PSExLE89dm9pZCAwO3RyeXtmb3IodmFyIHg9KDAscy5kZWZhdWx0KShjKSx2OyEocD0odj14Lm5leHQoKSkuZG9uZSkmJih1LnB1c2godi52YWx1ZSksIShtJiZ1Lmxlbmd0aD09PW0pKTtwPSEwKTt9Y2F0Y2goVCl7eT0hMCxPPVR9ZmluYWxseXt0cnl7IXAmJngucmV0dXJuJiZ4LnJldHVybigpfWZpbmFsbHl7aWYoeSl0aHJvdyBPfX1yZXR1cm4gdX1yZXR1cm4gZnVuY3Rpb24oYyxtKXtpZihBcnJheS5pc0FycmF5KGMpKXJldHVybiBjO2lmKCgwLG4uZGVmYXVsdCkoT2JqZWN0KGMpKSlyZXR1cm4gbyhjLG0pO3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UiKX19KCl9LGZ1bmN0aW9uKGQscix0KXtkLmV4cG9ydHM9e2RlZmF1bHQ6dCg3OCksX19lc01vZHVsZTohMH19LGZ1bmN0aW9uKGQscix0KXt0KDc5KSx0KDEyNSksZC5leHBvcnRzPXQoMTI3KX0sZnVuY3Rpb24oZCxyLHQpe3QoODApO2Zvcih2YXIgZT10KDkxKSxuPXQoOTUpLGE9dCg4Mykscz10KDEyMikoInRvU3RyaW5nVGFnIiksaT0iQ1NTUnVsZUxpc3QsQ1NTU3R5bGVEZWNsYXJhdGlvbixDU1NWYWx1ZUxpc3QsQ2xpZW50UmVjdExpc3QsRE9NUmVjdExpc3QsRE9NU3RyaW5nTGlzdCxET01Ub2tlbkxpc3QsRGF0YVRyYW5zZmVySXRlbUxpc3QsRmlsZUxpc3QsSFRNTEFsbENvbGxlY3Rpb24sSFRNTENvbGxlY3Rpb24sSFRNTEZvcm1FbGVtZW50LEhUTUxTZWxlY3RFbGVtZW50LE1lZGlhTGlzdCxNaW1lVHlwZUFycmF5LE5hbWVkTm9kZU1hcCxOb2RlTGlzdCxQYWludFJlcXVlc3RMaXN0LFBsdWdpbixQbHVnaW5BcnJheSxTVkdMZW5ndGhMaXN0LFNWR051bWJlckxpc3QsU1ZHUGF0aFNlZ0xpc3QsU1ZHUG9pbnRMaXN0LFNWR1N0cmluZ0xpc3QsU1ZHVHJhbnNmb3JtTGlzdCxTb3VyY2VCdWZmZXJMaXN0LFN0eWxlU2hlZXRMaXN0LFRleHRUcmFja0N1ZUxpc3QsVGV4dFRyYWNrTGlzdCxUb3VjaExpc3QiLnNwbGl0KCIsIiksbz0wO288aS5sZW5ndGg7bysrKXt2YXIgYz1pW29dLG09ZVtjXSx1PW0mJm0ucHJvdG90eXBlO3UmJiF1W3NdJiZuKHUscyxjKSxhW2NdPWEuQXJyYXl9fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg4MSksbj10KDgyKSxhPXQoODMpLHM9dCg4NCk7ZC5leHBvcnRzPXQoODgpKEFycmF5LCJBcnJheSIsZnVuY3Rpb24oaSxvKXt0aGlzLl90PXMoaSksdGhpcy5faT0wLHRoaXMuX2s9b30sZnVuY3Rpb24oKXt2YXIgaT10aGlzLl90LG89dGhpcy5fayxjPXRoaXMuX2krKztyZXR1cm4haXx8Yz49aS5sZW5ndGg/KHRoaXMuX3Q9dm9pZCAwLG4oMSkpOm89PSJrZXlzIj9uKDAsYyk6bz09InZhbHVlcyI/bigwLGlbY10pOm4oMCxbYyxpW2NdXSl9LCJ2YWx1ZXMiKSxhLkFyZ3VtZW50cz1hLkFycmF5LGUoImtleXMiKSxlKCJ2YWx1ZXMiKSxlKCJlbnRyaWVzIil9LGZ1bmN0aW9uKGQscil7ZC5leHBvcnRzPWZ1bmN0aW9uKCl7fX0sZnVuY3Rpb24oZCxyKXtkLmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm57dmFsdWU6ZSxkb25lOiEhdH19fSxmdW5jdGlvbihkLHIpe2QuZXhwb3J0cz17fX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoODUpLG49dCg4Nyk7ZC5leHBvcnRzPWZ1bmN0aW9uKGEpe3JldHVybiBlKG4oYSkpfX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoODYpO2QuZXhwb3J0cz1PYmplY3QoInoiKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKT9PYmplY3Q6ZnVuY3Rpb24obil7cmV0dXJuIGUobik9PSJTdHJpbmciP24uc3BsaXQoIiIpOk9iamVjdChuKX19LGZ1bmN0aW9uKGQscil7dmFyIHQ9e30udG9TdHJpbmc7ZC5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiB0LmNhbGwoZSkuc2xpY2UoOCwtMSl9fSxmdW5jdGlvbihkLHIpe2QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZih0PT1udWxsKXRocm93IFR5cGVFcnJvcigiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gICIrdCk7cmV0dXJuIHR9fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg4OSksbj10KDkwKSxhPXQoMTA2KSxzPXQoOTUpLGk9dCg4Myksbz10KDEwNyksYz10KDEyMSksbT10KDEyMyksdT10KDEyMikoIml0ZXJhdG9yIikscD0hKFtdLmtleXMmJiJuZXh0ImluW10ua2V5cygpKSx5PSJAQGl0ZXJhdG9yIixPPSJrZXlzIix4PSJ2YWx1ZXMiLHY9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307ZC5leHBvcnRzPWZ1bmN0aW9uKFQsbCxoLGYsZyxNLEEpe28oaCxsLGYpO3ZhciBDPWZ1bmN0aW9uKGope2lmKCFwJiZqIGluIEQpcmV0dXJuIERbal07c3dpdGNoKGope2Nhc2UgTzpyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGgodGhpcyxqKX07Y2FzZSB4OnJldHVybiBmdW5jdGlvbigpe3JldHVybiBuZXcgaCh0aGlzLGopfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGgodGhpcyxqKX19LGI9bCsiIEl0ZXJhdG9yIixFPWc9PXgsTD0hMSxEPVQucHJvdG90eXBlLEk9RFt1XXx8RFt5XXx8ZyYmRFtnXSxSPUl8fEMoZyksQj1nP0U/QygiZW50cmllcyIpOlI6dm9pZCAwLHo9bD09IkFycmF5IiYmRC5lbnRyaWVzfHxJLEssUSxfO2lmKHomJihfPW0oei5jYWxsKG5ldyBUKSksXyE9PU9iamVjdC5wcm90b3R5cGUmJl8ubmV4dCYmKGMoXyxiLCEwKSwhZSYmdHlwZW9mIF9bdV0hPSJmdW5jdGlvbiImJnMoXyx1LHYpKSksRSYmSSYmSS5uYW1lIT09eCYmKEw9ITAsUj1mdW5jdGlvbigpe3JldHVybiBJLmNhbGwodGhpcyl9KSwoIWV8fEEpJiYocHx8THx8IURbdV0pJiZzKEQsdSxSKSxpW2xdPVIsaVtiXT12LGcpaWYoSz17dmFsdWVzOkU/UjpDKHgpLGtleXM6TT9SOkMoTyksZW50cmllczpCfSxBKWZvcihRIGluIEspUSBpbiBEfHxhKEQsUSxLW1FdKTtlbHNlIG4obi5QK24uRioocHx8TCksbCxLKTtyZXR1cm4gS319LGZ1bmN0aW9uKGQscil7ZC5leHBvcnRzPSEwfSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5MSksbj10KDkyKSxhPXQoOTMpLHM9dCg5NSksaT10KDEwNSksbz0icHJvdG90eXBlIixjPWZ1bmN0aW9uKG0sdSxwKXt2YXIgeT1tJmMuRixPPW0mYy5HLHg9bSZjLlMsdj1tJmMuUCxUPW0mYy5CLGw9bSZjLlcsaD1PP246blt1XXx8KG5bdV09e30pLGY9aFtvXSxnPU8/ZTp4P2VbdV06KGVbdV18fHt9KVtvXSxNLEEsQztPJiYocD11KTtmb3IoTSBpbiBwKUE9IXkmJmcmJmdbTV0hPT12b2lkIDAsIShBJiZpKGgsTSkpJiYoQz1BP2dbTV06cFtNXSxoW01dPU8mJnR5cGVvZiBnW01dIT0iZnVuY3Rpb24iP3BbTV06VCYmQT9hKEMsZSk6bCYmZ1tNXT09Qz9mdW5jdGlvbihiKXt2YXIgRT1mdW5jdGlvbihMLEQsSSl7aWYodGhpcyBpbnN0YW5jZW9mIGIpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIG5ldyBiO2Nhc2UgMTpyZXR1cm4gbmV3IGIoTCk7Y2FzZSAyOnJldHVybiBuZXcgYihMLEQpfXJldHVybiBuZXcgYihMLEQsSSl9cmV0dXJuIGIuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtyZXR1cm4gRVtvXT1iW29dLEV9KEMpOnYmJnR5cGVvZiBDPT0iZnVuY3Rpb24iP2EoRnVuY3Rpb24uY2FsbCxDKTpDLHYmJigoaC52aXJ0dWFsfHwoaC52aXJ0dWFsPXt9KSlbTV09QyxtJmMuUiYmZiYmIWZbTV0mJnMoZixNLEMpKSl9O2MuRj0xLGMuRz0yLGMuUz00LGMuUD04LGMuQj0xNixjLlc9MzIsYy5VPTY0LGMuUj0xMjgsZC5leHBvcnRzPWN9LGZ1bmN0aW9uKGQscil7dmFyIHQ9ZC5leHBvcnRzPXR5cGVvZiB3aW5kb3c8InUiJiZ3aW5kb3cuTWF0aD09TWF0aD93aW5kb3c6dHlwZW9mIHNlbGY8InUiJiZzZWxmLk1hdGg9PU1hdGg/c2VsZjpGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpO3R5cGVvZiBfX2c9PSJudW1iZXIiJiYoX19nPXQpfSxmdW5jdGlvbihkLHIpe3ZhciB0PWQuZXhwb3J0cz17dmVyc2lvbjoiMi42LjExIn07dHlwZW9mIF9fZT09Im51bWJlciImJihfX2U9dCl9LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDk0KTtkLmV4cG9ydHM9ZnVuY3Rpb24obixhLHMpe2lmKGUobiksYT09PXZvaWQgMClyZXR1cm4gbjtzd2l0Y2gocyl7Y2FzZSAxOnJldHVybiBmdW5jdGlvbihpKXtyZXR1cm4gbi5jYWxsKGEsaSl9O2Nhc2UgMjpyZXR1cm4gZnVuY3Rpb24oaSxvKXtyZXR1cm4gbi5jYWxsKGEsaSxvKX07Y2FzZSAzOnJldHVybiBmdW5jdGlvbihpLG8sYyl7cmV0dXJuIG4uY2FsbChhLGksbyxjKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG4uYXBwbHkoYSxhcmd1bWVudHMpfX19LGZ1bmN0aW9uKGQscil7ZC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0iZnVuY3Rpb24iKXRocm93IFR5cGVFcnJvcih0KyIgaXMgbm90IGEgZnVuY3Rpb24hIik7cmV0dXJuIHR9fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5Niksbj10KDEwNCk7ZC5leHBvcnRzPXQoMTAwKT9mdW5jdGlvbihhLHMsaSl7cmV0dXJuIGUuZihhLHMsbigxLGkpKX06ZnVuY3Rpb24oYSxzLGkpe3JldHVybiBhW3NdPWksYX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDk3KSxuPXQoOTkpLGE9dCgxMDMpLHM9T2JqZWN0LmRlZmluZVByb3BlcnR5O3IuZj10KDEwMCk/T2JqZWN0LmRlZmluZVByb3BlcnR5OmZ1bmN0aW9uKG8sYyxtKXtpZihlKG8pLGM9YShjLCEwKSxlKG0pLG4pdHJ5e3JldHVybiBzKG8sYyxtKX1jYXRjaHt9aWYoImdldCJpbiBtfHwic2V0ImluIG0pdGhyb3cgVHlwZUVycm9yKCJBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCEiKTtyZXR1cm4idmFsdWUiaW4gbSYmKG9bY109bS52YWx1ZSksb319LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDk4KTtkLmV4cG9ydHM9ZnVuY3Rpb24obil7aWYoIWUobikpdGhyb3cgVHlwZUVycm9yKG4rIiBpcyBub3QgYW4gb2JqZWN0ISIpO3JldHVybiBufX0sZnVuY3Rpb24oZCxyKXtkLmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0PT0ib2JqZWN0Ij90IT09bnVsbDp0eXBlb2YgdD09ImZ1bmN0aW9uIn19LGZ1bmN0aW9uKGQscix0KXtkLmV4cG9ydHM9IXQoMTAwKSYmIXQoMTAxKShmdW5jdGlvbigpe3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodCgxMDIpKCJkaXYiKSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmEhPTd9KX0sZnVuY3Rpb24oZCxyLHQpe2QuZXhwb3J0cz0hdCgxMDEpKGZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmEhPTd9KX0sZnVuY3Rpb24oZCxyKXtkLmV4cG9ydHM9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiEhdCgpfWNhdGNoe3JldHVybiEwfX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDk4KSxuPXQoOTEpLmRvY3VtZW50LGE9ZShuKSYmZShuLmNyZWF0ZUVsZW1lbnQpO2QuZXhwb3J0cz1mdW5jdGlvbihzKXtyZXR1cm4gYT9uLmNyZWF0ZUVsZW1lbnQocyk6e319fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5OCk7ZC5leHBvcnRzPWZ1bmN0aW9uKG4sYSl7aWYoIWUobikpcmV0dXJuIG47dmFyIHMsaTtpZihhJiZ0eXBlb2Yocz1uLnRvU3RyaW5nKT09ImZ1bmN0aW9uIiYmIWUoaT1zLmNhbGwobikpfHx0eXBlb2Yocz1uLnZhbHVlT2YpPT0iZnVuY3Rpb24iJiYhZShpPXMuY2FsbChuKSl8fCFhJiZ0eXBlb2Yocz1uLnRvU3RyaW5nKT09ImZ1bmN0aW9uIiYmIWUoaT1zLmNhbGwobikpKXJldHVybiBpO3Rocm93IFR5cGVFcnJvcigiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlIil9fSxmdW5jdGlvbihkLHIpe2QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybntlbnVtZXJhYmxlOiEodCYxKSxjb25maWd1cmFibGU6ISh0JjIpLHdyaXRhYmxlOiEodCY0KSx2YWx1ZTplfX19LGZ1bmN0aW9uKGQscil7dmFyIHQ9e30uaGFzT3duUHJvcGVydHk7ZC5leHBvcnRzPWZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuY2FsbChlLG4pfX0sZnVuY3Rpb24oZCxyLHQpe2QuZXhwb3J0cz10KDk1KX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoMTA4KSxuPXQoMTA0KSxhPXQoMTIxKSxzPXt9O3QoOTUpKHMsdCgxMjIpKCJpdGVyYXRvciIpLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxkLmV4cG9ydHM9ZnVuY3Rpb24oaSxvLGMpe2kucHJvdG90eXBlPWUocyx7bmV4dDpuKDEsYyl9KSxhKGksbysiIEl0ZXJhdG9yIil9fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5Nyksbj10KDEwOSksYT10KDExOSkscz10KDExNikoIklFX1BST1RPIiksaT1mdW5jdGlvbigpe30sbz0icHJvdG90eXBlIixjPWZ1bmN0aW9uKCl7dmFyIG09dCgxMDIpKCJpZnJhbWUiKSx1PWEubGVuZ3RoLHA9IjwiLHk9Ij4iLE87Zm9yKG0uc3R5bGUuZGlzcGxheT0ibm9uZSIsdCgxMjApLmFwcGVuZENoaWxkKG0pLG0uc3JjPSJqYXZhc2NyaXB0OiIsTz1tLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQsTy5vcGVuKCksTy53cml0ZShwKyJzY3JpcHQiK3krImRvY3VtZW50LkY9T2JqZWN0IitwKyIvc2NyaXB0Iit5KSxPLmNsb3NlKCksYz1PLkY7dS0tOylkZWxldGUgY1tvXVthW3VdXTtyZXR1cm4gYygpfTtkLmV4cG9ydHM9T2JqZWN0LmNyZWF0ZXx8ZnVuY3Rpb24odSxwKXt2YXIgeTtyZXR1cm4gdSE9PW51bGw/KGlbb109ZSh1KSx5PW5ldyBpLGlbb109bnVsbCx5W3NdPXUpOnk9YygpLHA9PT12b2lkIDA/eTpuKHkscCl9fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5Niksbj10KDk3KSxhPXQoMTEwKTtkLmV4cG9ydHM9dCgxMDApP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzOmZ1bmN0aW9uKGksbyl7bihpKTtmb3IodmFyIGM9YShvKSxtPWMubGVuZ3RoLHU9MCxwO20+dTspZS5mKGkscD1jW3UrK10sb1twXSk7cmV0dXJuIGl9fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCgxMTEpLG49dCgxMTkpO2QuZXhwb3J0cz1PYmplY3Qua2V5c3x8ZnVuY3Rpb24ocyl7cmV0dXJuIGUocyxuKX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDEwNSksbj10KDg0KSxhPXQoMTEyKSghMSkscz10KDExNikoIklFX1BST1RPIik7ZC5leHBvcnRzPWZ1bmN0aW9uKGksbyl7dmFyIGM9bihpKSxtPTAsdT1bXSxwO2ZvcihwIGluIGMpcCE9cyYmZShjLHApJiZ1LnB1c2gocCk7Zm9yKDtvLmxlbmd0aD5tOyllKGMscD1vW20rK10pJiYofmEodSxwKXx8dS5wdXNoKHApKTtyZXR1cm4gdX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDg0KSxuPXQoMTEzKSxhPXQoMTE1KTtkLmV4cG9ydHM9ZnVuY3Rpb24ocyl7cmV0dXJuIGZ1bmN0aW9uKGksbyxjKXt2YXIgbT1lKGkpLHU9bihtLmxlbmd0aCkscD1hKGMsdSkseTtpZihzJiZvIT1vKXtmb3IoO3U+cDspaWYoeT1tW3ArK10seSE9eSlyZXR1cm4hMH1lbHNlIGZvcig7dT5wO3ArKylpZigoc3x8cCBpbiBtKSYmbVtwXT09PW8pcmV0dXJuIHN8fHB8fDA7cmV0dXJuIXMmJi0xfX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDExNCksbj1NYXRoLm1pbjtkLmV4cG9ydHM9ZnVuY3Rpb24oYSl7cmV0dXJuIGE+MD9uKGUoYSksOTAwNzE5OTI1NDc0MDk5MSk6MH19LGZ1bmN0aW9uKGQscil7dmFyIHQ9TWF0aC5jZWlsLGU9TWF0aC5mbG9vcjtkLmV4cG9ydHM9ZnVuY3Rpb24obil7cmV0dXJuIGlzTmFOKG49K24pPzA6KG4+MD9lOnQpKG4pfX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoMTE0KSxuPU1hdGgubWF4LGE9TWF0aC5taW47ZC5leHBvcnRzPWZ1bmN0aW9uKHMsaSl7cmV0dXJuIHM9ZShzKSxzPDA/bihzK2ksMCk6YShzLGkpfX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoMTE3KSgia2V5cyIpLG49dCgxMTgpO2QuZXhwb3J0cz1mdW5jdGlvbihhKXtyZXR1cm4gZVthXXx8KGVbYV09bihhKSl9fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5Miksbj10KDkxKSxhPSJfX2NvcmUtanNfc2hhcmVkX18iLHM9blthXXx8KG5bYV09e30pOyhkLmV4cG9ydHM9ZnVuY3Rpb24oaSxvKXtyZXR1cm4gc1tpXXx8KHNbaV09byE9PXZvaWQgMD9vOnt9KX0pKCJ2ZXJzaW9ucyIsW10pLnB1c2goe3ZlcnNpb246ZS52ZXJzaW9uLG1vZGU6dCg4OSk/InB1cmUiOiJnbG9iYWwiLGNvcHlyaWdodDoiwqkgMjAxOSBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KSJ9KX0sZnVuY3Rpb24oZCxyKXt2YXIgdD0wLGU9TWF0aC5yYW5kb20oKTtkLmV4cG9ydHM9ZnVuY3Rpb24obil7cmV0dXJuIlN5bWJvbCgiLmNvbmNhdChuPT09dm9pZCAwPyIiOm4sIilfIiwoKyt0K2UpLnRvU3RyaW5nKDM2KSl9fSxmdW5jdGlvbihkLHIpe2QuZXhwb3J0cz0iY29uc3RydWN0b3IsaGFzT3duUHJvcGVydHksaXNQcm90b3R5cGVPZixwcm9wZXJ0eUlzRW51bWVyYWJsZSx0b0xvY2FsZVN0cmluZyx0b1N0cmluZyx2YWx1ZU9mIi5zcGxpdCgiLCIpfSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5MSkuZG9jdW1lbnQ7ZC5leHBvcnRzPWUmJmUuZG9jdW1lbnRFbGVtZW50fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5NikuZixuPXQoMTA1KSxhPXQoMTIyKSgidG9TdHJpbmdUYWciKTtkLmV4cG9ydHM9ZnVuY3Rpb24ocyxpLG8pe3MmJiFuKHM9bz9zOnMucHJvdG90eXBlLGEpJiZlKHMsYSx7Y29uZmlndXJhYmxlOiEwLHZhbHVlOml9KX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDExNykoIndrcyIpLG49dCgxMTgpLGE9dCg5MSkuU3ltYm9sLHM9dHlwZW9mIGE9PSJmdW5jdGlvbiIsaT1kLmV4cG9ydHM9ZnVuY3Rpb24obyl7cmV0dXJuIGVbb118fChlW29dPXMmJmFbb118fChzP2E6bikoIlN5bWJvbC4iK28pKX07aS5zdG9yZT1lfSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCgxMDUpLG49dCgxMjQpLGE9dCgxMTYpKCJJRV9QUk9UTyIpLHM9T2JqZWN0LnByb3RvdHlwZTtkLmV4cG9ydHM9T2JqZWN0LmdldFByb3RvdHlwZU9mfHxmdW5jdGlvbihpKXtyZXR1cm4gaT1uKGkpLGUoaSxhKT9pW2FdOnR5cGVvZiBpLmNvbnN0cnVjdG9yPT0iZnVuY3Rpb24iJiZpIGluc3RhbmNlb2YgaS5jb25zdHJ1Y3Rvcj9pLmNvbnN0cnVjdG9yLnByb3RvdHlwZTppIGluc3RhbmNlb2YgT2JqZWN0P3M6bnVsbH19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDg3KTtkLmV4cG9ydHM9ZnVuY3Rpb24obil7cmV0dXJuIE9iamVjdChlKG4pKX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDEyNikoITApO3QoODgpKFN0cmluZywiU3RyaW5nIixmdW5jdGlvbihuKXt0aGlzLl90PVN0cmluZyhuKSx0aGlzLl9pPTB9LGZ1bmN0aW9uKCl7dmFyIG49dGhpcy5fdCxhPXRoaXMuX2kscztyZXR1cm4gYT49bi5sZW5ndGg/e3ZhbHVlOnZvaWQgMCxkb25lOiEwfToocz1lKG4sYSksdGhpcy5faSs9cy5sZW5ndGgse3ZhbHVlOnMsZG9uZTohMX0pfSl9LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDExNCksbj10KDg3KTtkLmV4cG9ydHM9ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKHMsaSl7dmFyIG89U3RyaW5nKG4ocykpLGM9ZShpKSxtPW8ubGVuZ3RoLHUscDtyZXR1cm4gYzwwfHxjPj1tP2E/IiI6dm9pZCAwOih1PW8uY2hhckNvZGVBdChjKSx1PDU1Mjk2fHx1PjU2MzE5fHxjKzE9PT1tfHwocD1vLmNoYXJDb2RlQXQoYysxKSk8NTYzMjB8fHA+NTczNDM/YT9vLmNoYXJBdChjKTp1OmE/by5zbGljZShjLGMrMik6KHUtNTUyOTY8PDEwKSsocC01NjMyMCkrNjU1MzYpfX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDEyOCksbj10KDEyMikoIml0ZXJhdG9yIiksYT10KDgzKTtkLmV4cG9ydHM9dCg5MikuaXNJdGVyYWJsZT1mdW5jdGlvbihzKXt2YXIgaT1PYmplY3Qocyk7cmV0dXJuIGlbbl0hPT12b2lkIDB8fCJAQGl0ZXJhdG9yImluIGl8fGEuaGFzT3duUHJvcGVydHkoZShpKSl9fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg4Niksbj10KDEyMikoInRvU3RyaW5nVGFnIiksYT1lKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk9PSJBcmd1bWVudHMiLHM9ZnVuY3Rpb24oaSxvKXt0cnl7cmV0dXJuIGlbb119Y2F0Y2h7fX07ZC5leHBvcnRzPWZ1bmN0aW9uKGkpe3ZhciBvLGMsbTtyZXR1cm4gaT09PXZvaWQgMD8iVW5kZWZpbmVkIjppPT09bnVsbD8iTnVsbCI6dHlwZW9mKGM9cyhvPU9iamVjdChpKSxuKSk9PSJzdHJpbmciP2M6YT9lKG8pOihtPWUobykpPT0iT2JqZWN0IiYmdHlwZW9mIG8uY2FsbGVlPT0iZnVuY3Rpb24iPyJBcmd1bWVudHMiOm19fSxmdW5jdGlvbihkLHIsdCl7ZC5leHBvcnRzPXtkZWZhdWx0OnQoMTMwKSxfX2VzTW9kdWxlOiEwfX0sZnVuY3Rpb24oZCxyLHQpe3QoNzkpLHQoMTI1KSxkLmV4cG9ydHM9dCgxMzEpfSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5Nyksbj10KDEzMik7ZC5leHBvcnRzPXQoOTIpLmdldEl0ZXJhdG9yPWZ1bmN0aW9uKGEpe3ZhciBzPW4oYSk7aWYodHlwZW9mIHMhPSJmdW5jdGlvbiIpdGhyb3cgVHlwZUVycm9yKGErIiBpcyBub3QgaXRlcmFibGUhIik7cmV0dXJuIGUocy5jYWxsKGEpKX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDEyOCksbj10KDEyMikoIml0ZXJhdG9yIiksYT10KDgzKTtkLmV4cG9ydHM9dCg5MikuZ2V0SXRlcmF0b3JNZXRob2Q9ZnVuY3Rpb24ocyl7aWYocyE9bnVsbClyZXR1cm4gc1tuXXx8c1siQEBpdGVyYXRvciJdfHxhW2UocyldfX0sZnVuY3Rpb24oZCxyLHQpe3IuX19lc01vZHVsZT0hMDt2YXIgZT10KDEzNCksbj1hKGUpO2Z1bmN0aW9uIGEocyl7cmV0dXJuIHMmJnMuX19lc01vZHVsZT9zOntkZWZhdWx0OnN9fXIuZGVmYXVsdD1mdW5jdGlvbihzKXtpZihBcnJheS5pc0FycmF5KHMpKXtmb3IodmFyIGk9MCxvPUFycmF5KHMubGVuZ3RoKTtpPHMubGVuZ3RoO2krKylvW2ldPXNbaV07cmV0dXJuIG99ZWxzZSByZXR1cm4oMCxuLmRlZmF1bHQpKHMpfX0sZnVuY3Rpb24oZCxyLHQpe2QuZXhwb3J0cz17ZGVmYXVsdDp0KDEzNSksX19lc01vZHVsZTohMH19LGZ1bmN0aW9uKGQscix0KXt0KDEyNSksdCgxMzYpLGQuZXhwb3J0cz10KDkyKS5BcnJheS5mcm9tfSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5Myksbj10KDkwKSxhPXQoMTI0KSxzPXQoMTM3KSxpPXQoMTM4KSxvPXQoMTEzKSxjPXQoMTM5KSxtPXQoMTMyKTtuKG4uUytuLkYqIXQoMTQwKShmdW5jdGlvbih1KXtBcnJheS5mcm9tKHUpfSksIkFycmF5Iix7ZnJvbTpmdW5jdGlvbihwKXt2YXIgeT1hKHApLE89dHlwZW9mIHRoaXM9PSJmdW5jdGlvbiI/dGhpczpBcnJheSx4PWFyZ3VtZW50cy5sZW5ndGgsdj14PjE/YXJndW1lbnRzWzFdOnZvaWQgMCxUPXYhPT12b2lkIDAsbD0wLGg9bSh5KSxmLGcsTSxBO2lmKFQmJih2PWUodix4PjI/YXJndW1lbnRzWzJdOnZvaWQgMCwyKSksaCE9bnVsbCYmIShPPT1BcnJheSYmaShoKSkpZm9yKEE9aC5jYWxsKHkpLGc9bmV3IE87IShNPUEubmV4dCgpKS5kb25lO2wrKyljKGcsbCxUP3MoQSx2LFtNLnZhbHVlLGxdLCEwKTpNLnZhbHVlKTtlbHNlIGZvcihmPW8oeS5sZW5ndGgpLGc9bmV3IE8oZik7Zj5sO2wrKyljKGcsbCxUP3YoeVtsXSxsKTp5W2xdKTtyZXR1cm4gZy5sZW5ndGg9bCxnfX0pfSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5Nyk7ZC5leHBvcnRzPWZ1bmN0aW9uKG4sYSxzLGkpe3RyeXtyZXR1cm4gaT9hKGUocylbMF0sc1sxXSk6YShzKX1jYXRjaChjKXt2YXIgbz1uLnJldHVybjt0aHJvdyBvIT09dm9pZCAwJiZlKG8uY2FsbChuKSksY319fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg4Myksbj10KDEyMikoIml0ZXJhdG9yIiksYT1BcnJheS5wcm90b3R5cGU7ZC5leHBvcnRzPWZ1bmN0aW9uKHMpe3JldHVybiBzIT09dm9pZCAwJiYoZS5BcnJheT09PXN8fGFbbl09PT1zKX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDk2KSxuPXQoMTA0KTtkLmV4cG9ydHM9ZnVuY3Rpb24oYSxzLGkpe3MgaW4gYT9lLmYoYSxzLG4oMCxpKSk6YVtzXT1pfX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoMTIyKSgiaXRlcmF0b3IiKSxuPSExO3RyeXt2YXIgYT1bN11bZV0oKTthLnJldHVybj1mdW5jdGlvbigpe249ITB9LEFycmF5LmZyb20oYSxmdW5jdGlvbigpe3Rocm93IDJ9KX1jYXRjaHt9ZC5leHBvcnRzPWZ1bmN0aW9uKHMsaSl7aWYoIWkmJiFuKXJldHVybiExO3ZhciBvPSExO3RyeXt2YXIgYz1bN10sbT1jW2VdKCk7bS5uZXh0PWZ1bmN0aW9uKCl7cmV0dXJue2RvbmU6bz0hMH19LGNbZV09ZnVuY3Rpb24oKXtyZXR1cm4gbX0scyhjKX1jYXRjaHt9cmV0dXJuIG99fSxmdW5jdGlvbihkLHIsdCl7ZC5leHBvcnRzPXtkZWZhdWx0OnQoMTQyKSxfX2VzTW9kdWxlOiEwfX0sZnVuY3Rpb24oZCxyLHQpe3QoMTQzKSx0KDEyNSksdCg3OSksdCgxNDQpLHQoMTU3KSx0KDE2MCksdCgxNjIpLGQuZXhwb3J0cz10KDkyKS5NYXB9LGZ1bmN0aW9uKGQscil7fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCgxNDUpLG49dCgxNTEpLGE9Ik1hcCI7ZC5leHBvcnRzPXQoMTUyKShhLGZ1bmN0aW9uKHMpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBzKHRoaXMsYXJndW1lbnRzLmxlbmd0aD4wP2FyZ3VtZW50c1swXTp2b2lkIDApfX0se2dldDpmdW5jdGlvbihpKXt2YXIgbz1lLmdldEVudHJ5KG4odGhpcyxhKSxpKTtyZXR1cm4gbyYmby52fSxzZXQ6ZnVuY3Rpb24oaSxvKXtyZXR1cm4gZS5kZWYobih0aGlzLGEpLGk9PT0wPzA6aSxvKX19LGUsITApfSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5NikuZixuPXQoMTA4KSxhPXQoMTQ2KSxzPXQoOTMpLGk9dCgxNDcpLG89dCgxNDgpLGM9dCg4OCksbT10KDgyKSx1PXQoMTQ5KSxwPXQoMTAwKSx5PXQoMTUwKS5mYXN0S2V5LE89dCgxNTEpLHg9cD8iX3MiOiJzaXplIix2PWZ1bmN0aW9uKFQsbCl7dmFyIGg9eShsKSxmO2lmKGghPT0iRiIpcmV0dXJuIFQuX2lbaF07Zm9yKGY9VC5fZjtmO2Y9Zi5uKWlmKGYuaz09bClyZXR1cm4gZn07ZC5leHBvcnRzPXtnZXRDb25zdHJ1Y3RvcjpmdW5jdGlvbihULGwsaCxmKXt2YXIgZz1UKGZ1bmN0aW9uKE0sQSl7aShNLGcsbCwiX2kiKSxNLl90PWwsTS5faT1uKG51bGwpLE0uX2Y9dm9pZCAwLE0uX2w9dm9pZCAwLE1beF09MCxBIT1udWxsJiZvKEEsaCxNW2ZdLE0pfSk7cmV0dXJuIGEoZy5wcm90b3R5cGUse2NsZWFyOmZ1bmN0aW9uKCl7Zm9yKHZhciBBPU8odGhpcyxsKSxDPUEuX2ksYj1BLl9mO2I7Yj1iLm4pYi5yPSEwLGIucCYmKGIucD1iLnAubj12b2lkIDApLGRlbGV0ZSBDW2IuaV07QS5fZj1BLl9sPXZvaWQgMCxBW3hdPTB9LGRlbGV0ZTpmdW5jdGlvbihNKXt2YXIgQT1PKHRoaXMsbCksQz12KEEsTSk7aWYoQyl7dmFyIGI9Qy5uLEU9Qy5wO2RlbGV0ZSBBLl9pW0MuaV0sQy5yPSEwLEUmJihFLm49YiksYiYmKGIucD1FKSxBLl9mPT1DJiYoQS5fZj1iKSxBLl9sPT1DJiYoQS5fbD1FKSxBW3hdLS19cmV0dXJuISFDfSxmb3JFYWNoOmZ1bmN0aW9uKEEpe08odGhpcyxsKTtmb3IodmFyIEM9cyhBLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLDMpLGI7Yj1iP2Iubjp0aGlzLl9mOylmb3IoQyhiLnYsYi5rLHRoaXMpO2ImJmIucjspYj1iLnB9LGhhczpmdW5jdGlvbihBKXtyZXR1cm4hIXYoTyh0aGlzLGwpLEEpfX0pLHAmJmUoZy5wcm90b3R5cGUsInNpemUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gTyh0aGlzLGwpW3hdfX0pLGd9LGRlZjpmdW5jdGlvbihULGwsaCl7dmFyIGY9dihULGwpLGcsTTtyZXR1cm4gZj9mLnY9aDooVC5fbD1mPXtpOk09eShsLCEwKSxrOmwsdjpoLHA6Zz1ULl9sLG46dm9pZCAwLHI6ITF9LFQuX2Z8fChULl9mPWYpLGcmJihnLm49ZiksVFt4XSsrLE0hPT0iRiImJihULl9pW01dPWYpKSxUfSxnZXRFbnRyeTp2LHNldFN0cm9uZzpmdW5jdGlvbihULGwsaCl7YyhULGwsZnVuY3Rpb24oZixnKXt0aGlzLl90PU8oZixsKSx0aGlzLl9rPWcsdGhpcy5fbD12b2lkIDB9LGZ1bmN0aW9uKCl7Zm9yKHZhciBmPXRoaXMsZz1mLl9rLE09Zi5fbDtNJiZNLnI7KU09TS5wO3JldHVybiFmLl90fHwhKGYuX2w9TT1NP00ubjpmLl90Ll9mKT8oZi5fdD12b2lkIDAsbSgxKSk6Zz09ImtleXMiP20oMCxNLmspOmc9PSJ2YWx1ZXMiP20oMCxNLnYpOm0oMCxbTS5rLE0udl0pfSxoPyJlbnRyaWVzIjoidmFsdWVzIiwhaCwhMCksdShsKX19fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5NSk7ZC5leHBvcnRzPWZ1bmN0aW9uKG4sYSxzKXtmb3IodmFyIGkgaW4gYSlzJiZuW2ldP25baV09YVtpXTplKG4saSxhW2ldKTtyZXR1cm4gbn19LGZ1bmN0aW9uKGQscil7ZC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLGEpe2lmKCEodCBpbnN0YW5jZW9mIGUpfHxhIT09dm9pZCAwJiZhIGluIHQpdGhyb3cgVHlwZUVycm9yKG4rIjogaW5jb3JyZWN0IGludm9jYXRpb24hIik7cmV0dXJuIHR9fSxmdW5jdGlvbihkLHUsdCl7dmFyIGU9dCg5Myksbj10KDEzNyksYT10KDEzOCkscz10KDk3KSxpPXQoMTEzKSxvPXQoMTMyKSxjPXt9LG09e30sdT1kLmV4cG9ydHM9ZnVuY3Rpb24ocCx5LE8seCx2KXt2YXIgVD12P2Z1bmN0aW9uKCl7cmV0dXJuIHB9Om8ocCksbD1lKE8seCx5PzI6MSksaD0wLGYsZyxNLEE7aWYodHlwZW9mIFQhPSJmdW5jdGlvbiIpdGhyb3cgVHlwZUVycm9yKHArIiBpcyBub3QgaXRlcmFibGUhIik7aWYoYShUKSl7Zm9yKGY9aShwLmxlbmd0aCk7Zj5oO2grKylpZihBPXk/bChzKGc9cFtoXSlbMF0sZ1sxXSk6bChwW2hdKSxBPT09Y3x8QT09PW0pcmV0dXJuIEF9ZWxzZSBmb3IoTT1ULmNhbGwocCk7IShnPU0ubmV4dCgpKS5kb25lOylpZihBPW4oTSxsLGcudmFsdWUseSksQT09PWN8fEE9PT1tKXJldHVybiBBfTt1LkJSRUFLPWMsdS5SRVRVUk49bX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoOTEpLG49dCg5MiksYT10KDk2KSxzPXQoMTAwKSxpPXQoMTIyKSgic3BlY2llcyIpO2QuZXhwb3J0cz1mdW5jdGlvbihvKXt2YXIgYz10eXBlb2YgbltvXT09ImZ1bmN0aW9uIj9uW29dOmVbb107cyYmYyYmIWNbaV0mJmEuZihjLGkse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc319KX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDExOCkoIm1ldGEiKSxuPXQoOTgpLGE9dCgxMDUpLHM9dCg5NikuZixpPTAsbz1PYmplY3QuaXNFeHRlbnNpYmxlfHxmdW5jdGlvbigpe3JldHVybiEwfSxjPSF0KDEwMSkoZnVuY3Rpb24oKXtyZXR1cm4gbyhPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKX0pLG09ZnVuY3Rpb24oeCl7cyh4LGUse3ZhbHVlOntpOiJPIisgKytpLHc6e319fSl9LHU9ZnVuY3Rpb24oeCx2KXtpZighbih4KSlyZXR1cm4gdHlwZW9mIHg9PSJzeW1ib2wiP3g6KHR5cGVvZiB4PT0ic3RyaW5nIj8iUyI6IlAiKSt4O2lmKCFhKHgsZSkpe2lmKCFvKHgpKXJldHVybiJGIjtpZighdilyZXR1cm4iRSI7bSh4KX1yZXR1cm4geFtlXS5pfSxwPWZ1bmN0aW9uKHgsdil7aWYoIWEoeCxlKSl7aWYoIW8oeCkpcmV0dXJuITA7aWYoIXYpcmV0dXJuITE7bSh4KX1yZXR1cm4geFtlXS53fSx5PWZ1bmN0aW9uKHgpe3JldHVybiBjJiZPLk5FRUQmJm8oeCkmJiFhKHgsZSkmJm0oeCkseH0sTz1kLmV4cG9ydHM9e0tFWTplLE5FRUQ6ITEsZmFzdEtleTp1LGdldFdlYWs6cCxvbkZyZWV6ZTp5fX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoOTgpO2QuZXhwb3J0cz1mdW5jdGlvbihuLGEpe2lmKCFlKG4pfHxuLl90IT09YSl0aHJvdyBUeXBlRXJyb3IoIkluY29tcGF0aWJsZSByZWNlaXZlciwgIithKyIgcmVxdWlyZWQhIik7cmV0dXJuIG59fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5MSksbj10KDkwKSxhPXQoMTUwKSxzPXQoMTAxKSxpPXQoOTUpLG89dCgxNDYpLGM9dCgxNDgpLG09dCgxNDcpLHU9dCg5OCkscD10KDEyMSkseT10KDk2KS5mLE89dCgxNTMpKDApLHg9dCgxMDApO2QuZXhwb3J0cz1mdW5jdGlvbih2LFQsbCxoLGYsZyl7dmFyIE09ZVt2XSxBPU0sQz1mPyJzZXQiOiJhZGQiLGI9QSYmQS5wcm90b3R5cGUsRT17fTtyZXR1cm4heHx8dHlwZW9mIEEhPSJmdW5jdGlvbiJ8fCEoZ3x8Yi5mb3JFYWNoJiYhcyhmdW5jdGlvbigpe25ldyBBKCkuZW50cmllcygpLm5leHQoKX0pKT8oQT1oLmdldENvbnN0cnVjdG9yKFQsdixmLEMpLG8oQS5wcm90b3R5cGUsbCksYS5ORUVEPSEwKTooQT1UKGZ1bmN0aW9uKEwsRCl7bShMLEEsdiwiX2MiKSxMLl9jPW5ldyBNLEQhPW51bGwmJmMoRCxmLExbQ10sTCl9KSxPKCJhZGQsY2xlYXIsZGVsZXRlLGZvckVhY2gsZ2V0LGhhcyxzZXQsa2V5cyx2YWx1ZXMsZW50cmllcyx0b0pTT04iLnNwbGl0KCIsIiksZnVuY3Rpb24oTCl7dmFyIEQ9TD09ImFkZCJ8fEw9PSJzZXQiO0wgaW4gYiYmIShnJiZMPT0iY2xlYXIiKSYmaShBLnByb3RvdHlwZSxMLGZ1bmN0aW9uKEksUil7aWYobSh0aGlzLEEsTCksIUQmJmcmJiF1KEkpKXJldHVybiBMPT0iZ2V0Ij92b2lkIDA6ITE7dmFyIEI9dGhpcy5fY1tMXShJPT09MD8wOkksUik7cmV0dXJuIEQ/dGhpczpCfSl9KSxnfHx5KEEucHJvdG90eXBlLCJzaXplIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Muc2l6ZX19KSkscChBLHYpLEVbdl09QSxuKG4uRytuLlcrbi5GLEUpLGd8fGguc2V0U3Ryb25nKEEsdixmKSxBfX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoOTMpLG49dCg4NSksYT10KDEyNCkscz10KDExMyksaT10KDE1NCk7ZC5leHBvcnRzPWZ1bmN0aW9uKG8sYyl7dmFyIG09bz09MSx1PW89PTIscD1vPT0zLHk9bz09NCxPPW89PTYseD1vPT01fHxPLHY9Y3x8aTtyZXR1cm4gZnVuY3Rpb24oVCxsLGgpe2Zvcih2YXIgZj1hKFQpLGc9bihmKSxNPWUobCxoLDMpLEE9cyhnLmxlbmd0aCksQz0wLGI9bT92KFQsQSk6dT92KFQsMCk6dm9pZCAwLEUsTDtBPkM7QysrKWlmKCh4fHxDIGluIGcpJiYoRT1nW0NdLEw9TShFLEMsZiksbykpe2lmKG0pYltDXT1MO2Vsc2UgaWYoTClzd2l0Y2gobyl7Y2FzZSAzOnJldHVybiEwO2Nhc2UgNTpyZXR1cm4gRTtjYXNlIDY6cmV0dXJuIEM7Y2FzZSAyOmIucHVzaChFKX1lbHNlIGlmKHkpcmV0dXJuITF9cmV0dXJuIE8/LTE6cHx8eT95OmJ9fX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoMTU1KTtkLmV4cG9ydHM9ZnVuY3Rpb24obixhKXtyZXR1cm4gbmV3KGUobikpKGEpfX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoOTgpLG49dCgxNTYpLGE9dCgxMjIpKCJzcGVjaWVzIik7ZC5leHBvcnRzPWZ1bmN0aW9uKHMpe3ZhciBpO3JldHVybiBuKHMpJiYoaT1zLmNvbnN0cnVjdG9yLHR5cGVvZiBpPT0iZnVuY3Rpb24iJiYoaT09PUFycmF5fHxuKGkucHJvdG90eXBlKSkmJihpPXZvaWQgMCksZShpKSYmKGk9aVthXSxpPT09bnVsbCYmKGk9dm9pZCAwKSkpLGk9PT12b2lkIDA/QXJyYXk6aX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDg2KTtkLmV4cG9ydHM9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGUoYSk9PSJBcnJheSJ9fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5MCk7ZShlLlArZS5SLCJNYXAiLHt0b0pTT046dCgxNTgpKCJNYXAiKX0pfSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCgxMjgpLG49dCgxNTkpO2QuZXhwb3J0cz1mdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oKXtpZihlKHRoaXMpIT1hKXRocm93IFR5cGVFcnJvcihhKyIjdG9KU09OIGlzbid0IGdlbmVyaWMiKTtyZXR1cm4gbih0aGlzKX19fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCgxNDgpO2QuZXhwb3J0cz1mdW5jdGlvbihuLGEpe3ZhciBzPVtdO3JldHVybiBlKG4sITEscy5wdXNoLHMsYSksc319LGZ1bmN0aW9uKGQscix0KXt0KDE2MSkoIk1hcCIpfSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5MCk7ZC5leHBvcnRzPWZ1bmN0aW9uKG4pe2UoZS5TLG4se29mOmZ1bmN0aW9uKCl7Zm9yKHZhciBzPWFyZ3VtZW50cy5sZW5ndGgsaT1uZXcgQXJyYXkocyk7cy0tOylpW3NdPWFyZ3VtZW50c1tzXTtyZXR1cm4gbmV3IHRoaXMoaSl9fSl9fSxmdW5jdGlvbihkLHIsdCl7dCgxNjMpKCJNYXAiKX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoOTApLG49dCg5NCksYT10KDkzKSxzPXQoMTQ4KTtkLmV4cG9ydHM9ZnVuY3Rpb24oaSl7ZShlLlMsaSx7ZnJvbTpmdW5jdGlvbihjKXt2YXIgbT1hcmd1bWVudHNbMV0sdSxwLHksTztyZXR1cm4gbih0aGlzKSx1PW0hPT12b2lkIDAsdSYmbihtKSxjPT1udWxsP25ldyB0aGlzOihwPVtdLHU/KHk9MCxPPWEobSxhcmd1bWVudHNbMl0sMikscyhjLCExLGZ1bmN0aW9uKHgpe3AucHVzaChPKHgseSsrKSl9KSk6cyhjLCExLHAucHVzaCxwKSxuZXcgdGhpcyhwKSl9fSl9fSxmdW5jdGlvbihkLHIsdCl7ZC5leHBvcnRzPXtkZWZhdWx0OnQoMTY1KSxfX2VzTW9kdWxlOiEwfX0sZnVuY3Rpb24oZCxyLHQpe3QoMTY2KSxkLmV4cG9ydHM9dCg5MikuT2JqZWN0LmFzc2lnbn0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoOTApO2UoZS5TK2UuRiwiT2JqZWN0Iix7YXNzaWduOnQoMTY3KX0pfSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCgxMDApLG49dCgxMTApLGE9dCgxNjgpLHM9dCgxNjkpLGk9dCgxMjQpLG89dCg4NSksYz1PYmplY3QuYXNzaWduO2QuZXhwb3J0cz0hY3x8dCgxMDEpKGZ1bmN0aW9uKCl7dmFyIG09e30sdT17fSxwPVN5bWJvbCgpLHk9ImFiY2RlZmdoaWprbG1ub3BxcnN0IjtyZXR1cm4gbVtwXT03LHkuc3BsaXQoIiIpLmZvckVhY2goZnVuY3Rpb24oTyl7dVtPXT1PfSksYyh7fSxtKVtwXSE9N3x8T2JqZWN0LmtleXMoYyh7fSx1KSkuam9pbigiIikhPXl9KT9mdW5jdGlvbih1LHApe2Zvcih2YXIgeT1pKHUpLE89YXJndW1lbnRzLmxlbmd0aCx4PTEsdj1hLmYsVD1zLmY7Tz54Oylmb3IodmFyIGw9byhhcmd1bWVudHNbeCsrXSksaD12P24obCkuY29uY2F0KHYobCkpOm4obCksZj1oLmxlbmd0aCxnPTAsTTtmPmc7KU09aFtnKytdLCghZXx8VC5jYWxsKGwsTSkpJiYoeVtNXT1sW01dKTtyZXR1cm4geX06Y30sZnVuY3Rpb24oZCxyKXtyLmY9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sc30sZnVuY3Rpb24oZCxyKXtyLmY9e30ucHJvcGVydHlJc0VudW1lcmFibGV9LGZ1bmN0aW9uKGQscix0KXtyLl9fZXNNb2R1bGU9ITAsci5kZWZhdWx0PWZ1bmN0aW9uKGUsbil7aWYoIShlIGluc3RhbmNlb2YgbikpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9fSxmdW5jdGlvbihkLHIsdCl7ci5fX2VzTW9kdWxlPSEwO3ZhciBlPXQoMTcyKSxuPWEoZSk7ZnVuY3Rpb24gYShzKXtyZXR1cm4gcyYmcy5fX2VzTW9kdWxlP3M6e2RlZmF1bHQ6c319ci5kZWZhdWx0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcyhpLG8pe2Zvcih2YXIgYz0wO2M8by5sZW5ndGg7YysrKXt2YXIgbT1vW2NdO20uZW51bWVyYWJsZT1tLmVudW1lcmFibGV8fCExLG0uY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBtJiYobS53cml0YWJsZT0hMCksKDAsbi5kZWZhdWx0KShpLG0ua2V5LG0pfX1yZXR1cm4gZnVuY3Rpb24oaSxvLGMpe3JldHVybiBvJiZzKGkucHJvdG90eXBlLG8pLGMmJnMoaSxjKSxpfX0oKX0sZnVuY3Rpb24oZCxyLHQpe2QuZXhwb3J0cz17ZGVmYXVsdDp0KDE3MyksX19lc01vZHVsZTohMH19LGZ1bmN0aW9uKGQscix0KXt0KDE3NCk7dmFyIGU9dCg5MikuT2JqZWN0O2QuZXhwb3J0cz1mdW5jdGlvbihhLHMsaSl7cmV0dXJuIGUuZGVmaW5lUHJvcGVydHkoYSxzLGkpfX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoOTApO2UoZS5TK2UuRiohdCgxMDApLCJPYmplY3QiLHtkZWZpbmVQcm9wZXJ0eTp0KDk2KS5mfSl9LGZ1bmN0aW9uKGQscix0KXtkLmV4cG9ydHM9e2RlZmF1bHQ6dCgxNzYpLF9fZXNNb2R1bGU6ITB9fSxmdW5jdGlvbihkLHIsdCl7dCgxNzcpLHQoMTQzKSx0KDE4NCksdCgxODUpLGQuZXhwb3J0cz10KDkyKS5TeW1ib2x9LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDkxKSxuPXQoMTA1KSxhPXQoMTAwKSxzPXQoOTApLGk9dCgxMDYpLG89dCgxNTApLktFWSxjPXQoMTAxKSxtPXQoMTE3KSx1PXQoMTIxKSxwPXQoMTE4KSx5PXQoMTIyKSxPPXQoMTc4KSx4PXQoMTc5KSx2PXQoMTgwKSxUPXQoMTU2KSxsPXQoOTcpLGg9dCg5OCksZj10KDEyNCksZz10KDg0KSxNPXQoMTAzKSxBPXQoMTA0KSxDPXQoMTA4KSxiPXQoMTgxKSxFPXQoMTgzKSxMPXQoMTY4KSxEPXQoOTYpLEk9dCgxMTApLFI9RS5mLEI9RC5mLHo9Yi5mLEs9ZS5TeW1ib2wsUT1lLkpTT04sXz1RJiZRLnN0cmluZ2lmeSxqPSJwcm90b3R5cGUiLEc9eSgiX2hpZGRlbiIpLFg9eSgidG9QcmltaXRpdmUiKSxaPXt9LnByb3BlcnR5SXNFbnVtZXJhYmxlLHR0PW0oInN5bWJvbC1yZWdpc3RyeSIpLG50PW0oInN5bWJvbHMiKSxxPW0oIm9wLXN5bWJvbHMiKSxkdD1PYmplY3Rbal0sdXQ9dHlwZW9mIEs9PSJmdW5jdGlvbiImJiEhTC5mLFc9ZS5RT2JqZWN0LEY9IVd8fCFXW2pdfHwhV1tqXS5maW5kQ2hpbGQsVj1hJiZjKGZ1bmN0aW9uKCl7cmV0dXJuIEMoQih7fSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiBCKHRoaXMsImEiLHt2YWx1ZTo3fSkuYX19KSkuYSE9N30pP2Z1bmN0aW9uKGF0LG90LGZ0KXt2YXIgbXQ9UihkdCxvdCk7bXQmJmRlbGV0ZSBkdFtvdF0sQihhdCxvdCxmdCksbXQmJmF0IT09ZHQmJkIoZHQsb3QsbXQpfTpCLEo9ZnVuY3Rpb24oYXQpe3ZhciBvdD1udFthdF09QyhLW2pdKTtyZXR1cm4gb3QuX2s9YXQsb3R9LE49dXQmJnR5cGVvZiBLLml0ZXJhdG9yPT0ic3ltYm9sIj9mdW5jdGlvbihhdCl7cmV0dXJuIHR5cGVvZiBhdD09InN5bWJvbCJ9OmZ1bmN0aW9uKGF0KXtyZXR1cm4gYXQgaW5zdGFuY2VvZiBLfSwkPWZ1bmN0aW9uKG90LGZ0LG10KXtyZXR1cm4gb3Q9PT1kdCYmJChxLGZ0LG10KSxsKG90KSxmdD1NKGZ0LCEwKSxsKG10KSxuKG50LGZ0KT8obXQuZW51bWVyYWJsZT8obihvdCxHKSYmb3RbR11bZnRdJiYob3RbR11bZnRdPSExKSxtdD1DKG10LHtlbnVtZXJhYmxlOkEoMCwhMSl9KSk6KG4ob3QsRyl8fEIob3QsRyxBKDEse30pKSxvdFtHXVtmdF09ITApLFYob3QsZnQsbXQpKTpCKG90LGZ0LG10KX0sUz1mdW5jdGlvbihvdCxmdCl7bChvdCk7Zm9yKHZhciBtdD12KGZ0PWcoZnQpKSx2dD0wLHB0PW10Lmxlbmd0aCx4dDtwdD52dDspJChvdCx4dD1tdFt2dCsrXSxmdFt4dF0pO3JldHVybiBvdH0sUD1mdW5jdGlvbihvdCxmdCl7cmV0dXJuIGZ0PT09dm9pZCAwP0Mob3QpOlMoQyhvdCksZnQpfSx3PWZ1bmN0aW9uKG90KXt2YXIgZnQ9Wi5jYWxsKHRoaXMsb3Q9TShvdCwhMCkpO3JldHVybiB0aGlzPT09ZHQmJm4obnQsb3QpJiYhbihxLG90KT8hMTpmdHx8IW4odGhpcyxvdCl8fCFuKG50LG90KXx8bih0aGlzLEcpJiZ0aGlzW0ddW290XT9mdDohMH0sVT1mdW5jdGlvbihvdCxmdCl7aWYob3Q9ZyhvdCksZnQ9TShmdCwhMCksIShvdD09PWR0JiZuKG50LGZ0KSYmIW4ocSxmdCkpKXt2YXIgbXQ9UihvdCxmdCk7cmV0dXJuIG10JiZuKG50LGZ0KSYmIShuKG90LEcpJiZvdFtHXVtmdF0pJiYobXQuZW51bWVyYWJsZT0hMCksbXR9fSxIPWZ1bmN0aW9uKG90KXtmb3IodmFyIGZ0PXooZyhvdCkpLG10PVtdLHZ0PTAscHQ7ZnQubGVuZ3RoPnZ0OykhbihudCxwdD1mdFt2dCsrXSkmJnB0IT1HJiZwdCE9byYmbXQucHVzaChwdCk7cmV0dXJuIG10fSxZPWZ1bmN0aW9uKG90KXtmb3IodmFyIGZ0PW90PT09ZHQsbXQ9eihmdD9xOmcob3QpKSx2dD1bXSxwdD0wLHh0O210Lmxlbmd0aD5wdDspbihudCx4dD1tdFtwdCsrXSkmJighZnR8fG4oZHQseHQpKSYmdnQucHVzaChudFt4dF0pO3JldHVybiB2dH07dXR8fChLPWZ1bmN0aW9uKCl7aWYodGhpcyBpbnN0YW5jZW9mIEspdGhyb3cgVHlwZUVycm9yKCJTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3IhIik7dmFyIG90PXAoYXJndW1lbnRzLmxlbmd0aD4wP2FyZ3VtZW50c1swXTp2b2lkIDApLGZ0PWZ1bmN0aW9uKG10KXt0aGlzPT09ZHQmJmZ0LmNhbGwocSxtdCksbih0aGlzLEcpJiZuKHRoaXNbR10sb3QpJiYodGhpc1tHXVtvdF09ITEpLFYodGhpcyxvdCxBKDEsbXQpKX07cmV0dXJuIGEmJkYmJlYoZHQsb3Qse2NvbmZpZ3VyYWJsZTohMCxzZXQ6ZnR9KSxKKG90KX0saShLW2pdLCJ0b1N0cmluZyIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fa30pLEUuZj1VLEQuZj0kLHQoMTgyKS5mPWIuZj1ILHQoMTY5KS5mPXcsTC5mPVksYSYmIXQoODkpJiZpKGR0LCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsdywhMCksTy5mPWZ1bmN0aW9uKGF0KXtyZXR1cm4gSih5KGF0KSl9KSxzKHMuRytzLlcrcy5GKiF1dCx7U3ltYm9sOkt9KTtmb3IodmFyIGs9Imhhc0luc3RhbmNlLGlzQ29uY2F0U3ByZWFkYWJsZSxpdGVyYXRvcixtYXRjaCxyZXBsYWNlLHNlYXJjaCxzcGVjaWVzLHNwbGl0LHRvUHJpbWl0aXZlLHRvU3RyaW5nVGFnLHVuc2NvcGFibGVzIi5zcGxpdCgiLCIpLHJ0PTA7ay5sZW5ndGg+cnQ7KXkoa1tydCsrXSk7Zm9yKHZhciBpdD1JKHkuc3RvcmUpLGN0PTA7aXQubGVuZ3RoPmN0Oyl4KGl0W2N0KytdKTtzKHMuUytzLkYqIXV0LCJTeW1ib2wiLHtmb3I6ZnVuY3Rpb24oYXQpe3JldHVybiBuKHR0LGF0Kz0iIik/dHRbYXRdOnR0W2F0XT1LKGF0KX0sa2V5Rm9yOmZ1bmN0aW9uKG90KXtpZighTihvdCkpdGhyb3cgVHlwZUVycm9yKG90KyIgaXMgbm90IGEgc3ltYm9sISIpO2Zvcih2YXIgZnQgaW4gdHQpaWYodHRbZnRdPT09b3QpcmV0dXJuIGZ0fSx1c2VTZXR0ZXI6ZnVuY3Rpb24oKXtGPSEwfSx1c2VTaW1wbGU6ZnVuY3Rpb24oKXtGPSExfX0pLHMocy5TK3MuRiohdXQsIk9iamVjdCIse2NyZWF0ZTpQLGRlZmluZVByb3BlcnR5OiQsZGVmaW5lUHJvcGVydGllczpTLGdldE93blByb3BlcnR5RGVzY3JpcHRvcjpVLGdldE93blByb3BlcnR5TmFtZXM6SCxnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6WX0pO3ZhciBodD1jKGZ1bmN0aW9uKCl7TC5mKDEpfSk7cyhzLlMrcy5GKmh0LCJPYmplY3QiLHtnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ZnVuY3Rpb24ob3Qpe3JldHVybiBMLmYoZihvdCkpfX0pLFEmJnMocy5TK3MuRiooIXV0fHxjKGZ1bmN0aW9uKCl7dmFyIGF0PUsoKTtyZXR1cm4gXyhbYXRdKSE9IltudWxsXSJ8fF8oe2E6YXR9KSE9Int9Inx8XyhPYmplY3QoYXQpKSE9Int9In0pKSwiSlNPTiIse3N0cmluZ2lmeTpmdW5jdGlvbihvdCl7Zm9yKHZhciBmdD1bb3RdLG10PTEsdnQscHQ7YXJndW1lbnRzLmxlbmd0aD5tdDspZnQucHVzaChhcmd1bWVudHNbbXQrK10pO2lmKHB0PXZ0PWZ0WzFdLCEoIWgodnQpJiZvdD09PXZvaWQgMHx8TihvdCkpKXJldHVybiBUKHZ0KXx8KHZ0PWZ1bmN0aW9uKHh0LFJ0KXtpZih0eXBlb2YgcHQ9PSJmdW5jdGlvbiImJihSdD1wdC5jYWxsKHRoaXMseHQsUnQpKSwhTihSdCkpcmV0dXJuIFJ0fSksZnRbMV09dnQsXy5hcHBseShRLGZ0KX19KSxLW2pdW1hdfHx0KDk1KShLW2pdLFgsS1tqXS52YWx1ZU9mKSx1KEssIlN5bWJvbCIpLHUoTWF0aCwiTWF0aCIsITApLHUoZS5KU09OLCJKU09OIiwhMCl9LGZ1bmN0aW9uKGQscix0KXtyLmY9dCgxMjIpfSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5MSksbj10KDkyKSxhPXQoODkpLHM9dCgxNzgpLGk9dCg5NikuZjtkLmV4cG9ydHM9ZnVuY3Rpb24obyl7dmFyIGM9bi5TeW1ib2x8fChuLlN5bWJvbD1hP3t9OmUuU3ltYm9sfHx7fSk7by5jaGFyQXQoMCkhPSJfIiYmIShvIGluIGMpJiZpKGMsbyx7dmFsdWU6cy5mKG8pfSl9fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCgxMTApLG49dCgxNjgpLGE9dCgxNjkpO2QuZXhwb3J0cz1mdW5jdGlvbihzKXt2YXIgaT1lKHMpLG89bi5mO2lmKG8pZm9yKHZhciBjPW8ocyksbT1hLmYsdT0wLHA7Yy5sZW5ndGg+dTspbS5jYWxsKHMscD1jW3UrK10pJiZpLnB1c2gocCk7cmV0dXJuIGl9fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg4NCksbj10KDE4MikuZixhPXt9LnRvU3RyaW5nLHM9dHlwZW9mIHdpbmRvdz09Im9iamVjdCImJndpbmRvdyYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM/T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KTpbXSxpPWZ1bmN0aW9uKG8pe3RyeXtyZXR1cm4gbihvKX1jYXRjaHtyZXR1cm4gcy5zbGljZSgpfX07ZC5leHBvcnRzLmY9ZnVuY3Rpb24oYyl7cmV0dXJuIHMmJmEuY2FsbChjKT09IltvYmplY3QgV2luZG93XSI/aShjKTpuKGUoYykpfX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoMTExKSxuPXQoMTE5KS5jb25jYXQoImxlbmd0aCIsInByb3RvdHlwZSIpO3IuZj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc3x8ZnVuY3Rpb24ocyl7cmV0dXJuIGUocyxuKX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDE2OSksbj10KDEwNCksYT10KDg0KSxzPXQoMTAzKSxpPXQoMTA1KSxvPXQoOTkpLGM9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtyLmY9dCgxMDApP2M6ZnVuY3Rpb24odSxwKXtpZih1PWEodSkscD1zKHAsITApLG8pdHJ5e3JldHVybiBjKHUscCl9Y2F0Y2h7fWlmKGkodSxwKSlyZXR1cm4gbighZS5mLmNhbGwodSxwKSx1W3BdKX19LGZ1bmN0aW9uKGQscix0KXt0KDE3OSkoImFzeW5jSXRlcmF0b3IiKX0sZnVuY3Rpb24oZCxyLHQpe3QoMTc5KSgib2JzZXJ2YWJsZSIpfSxmdW5jdGlvbihkLHIsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHIuY3JlYXRlTm93VGltZT1lLHIuZm9ybWF0RGVsYXk9bjtmdW5jdGlvbiBlKCl7dmFyIGE9bnVsbDtyZXR1cm4gRGF0ZS5ub3c/YT1EYXRlLm5vdzphPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpfSxhfWZ1bmN0aW9uIG4oYSl7cmV0dXJuIHR5cGVvZiBhPT0ibnVtYmVyIj9hPXtkZWxheTphfToiZW50cm9weSJpbiBhJiYoYT17ZGVsYXk6YS5lbnRyb3B5LGlzRW50cm9weTohMH0pLGF9fSxmdW5jdGlvbihkLHIsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHIuZGVmYXVsdD17ZGVmYXVsdDpmdW5jdGlvbihuLGEscyxpLG8pe3JldHVybiB0eXBlb2Ygbj09Im51bWJlciImJnR5cGVvZiBhPT0ibnVtYmVyIj9uKyhzLWkpLyhvLWkpKihhLW4pOnMtaT5vLXM/YTpufX19LGZ1bmN0aW9uKGQscix0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksci5wYXJzZUVhc2luZz1yLkVhc2luZ3M9dm9pZCAwO3ZhciBlPXQoNzYpLG49YyhlKSxhPXQoMTMzKSxzPWMoYSksaT10KDE0MSksbz1jKGkpO2Z1bmN0aW9uIGMoVCl7cmV0dXJuIFQmJlQuX19lc01vZHVsZT9UOntkZWZhdWx0OlR9fXZhciBtPXQoMTg5KSx1PW5ldyBvLmRlZmF1bHQ7ZnVuY3Rpb24gcCgpe2Zvcih2YXIgVD1hcmd1bWVudHMubGVuZ3RoLGw9QXJyYXkoVCksaD0wO2g8VDtoKyspbFtoXT1hcmd1bWVudHNbaF07dmFyIGY9dS5nZXQobCk7cmV0dXJuIGZ8fChmPW0uYXBwbHkodm9pZCAwLGwpLHUuc2V0KGwsZiksZil9ZnVuY3Rpb24geShUKXt2YXIgbD1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ImVuZCI7cmV0dXJuIGZ1bmN0aW9uKGgsZil7Zm9yKHZhciBnPTE7ZzxmLmxlbmd0aDtnKyspe3ZhciBNPWZbZ10ub2Zmc2V0O2lmKGg8PU0pe3ZhciBBPWZbZy0xXS5vZmZzZXQsQz1NLGI9KGgtQSkvKEMtQSksRT0xL1QsTD1iL0U7cmV0dXJuIGw9PT0iZW5kIj9MPU1hdGguZmxvb3IoTCk6TD1NYXRoLmNlaWwoTCksRSpMKihDLUEpK0F9fXJldHVybiAwfX1mdW5jdGlvbiBPKFQpe3ZhciBsPS9eY3ViaWMtYmV6aWVyXCgoLiopXCkvLGg9VC5tYXRjaChsKTtpZihoKXt2YXIgZj1oWzFdLnRyaW0oKTtyZXR1cm4gZj1mLnNwbGl0KCIsIikubWFwKGZ1bmN0aW9uKEUpe3JldHVybiBwYXJzZUZsb2F0KEUudHJpbSgpKX0pLHAuYXBwbHkodm9pZCAwLCgwLHMuZGVmYXVsdCkoZikpfWlmKGw9L15zdGVwc1woKC4qKVwpLyxoPVQubWF0Y2gobCksaCl7dmFyIGc9aFsxXS50cmltKCk7Zz1nLnNwbGl0KCIsIikubWFwKGZ1bmN0aW9uKEUpe3JldHVybiBFLnRyaW0oKX0pO3ZhciBNPWcsQT0oMCxuLmRlZmF1bHQpKE0sMiksQz1BWzBdLGI9QVsxXTtyZXR1cm4geShwYXJzZUludChDLDEwKSxiKX1yZXR1cm4gVH12YXIgeD17bGluZWFyOmZ1bmN0aW9uKGwpe3JldHVybiBsfSxlYXNlOnAoLjI1LC4xLC4yNSwxKSwiZWFzZS1pbiI6cCguNDIsMCwxLDEpLCJlYXNlLW91dCI6cCgwLDAsLjU4LDEpLCJlYXNlLWluLW91dCI6cCguNDIsMCwuNTgsMSksInN0ZXAtc3RhcnQiOnkoMSwic3RhcnQiKSwic3RlcC1lbmQiOnkoMSwiZW5kIil9O2Z1bmN0aW9uIHYoVCl7cmV0dXJuIHR5cGVvZiBUPT0ic3RyaW5nIj94W1RdP1Q9eFtUXTpUPU8oVCk6VC50eXBlPT09ImN1YmljLWJlemllciI/VD1wLmFwcGx5KHZvaWQgMCwoMCxzLmRlZmF1bHQpKFQudmFsdWUpKTpULnR5cGU9PT0ic3RlcHMiJiYoVD15KFQuc3RlcCxULnBvcykpLFR9ci5FYXNpbmdzPXgsci5wYXJzZUVhc2luZz12fSxmdW5jdGlvbihkLHIpe3ZhciB0PTQsZT0uMDAxLG49MWUtNyxhPTEwLHM9MTEsaT0xLyhzLTEpLG89dHlwZW9mIEZsb2F0MzJBcnJheT09ImZ1bmN0aW9uIjtmdW5jdGlvbiBjKFQsbCl7cmV0dXJuIDEtMypsKzMqVH1mdW5jdGlvbiBtKFQsbCl7cmV0dXJuIDMqbC02KlR9ZnVuY3Rpb24gdShUKXtyZXR1cm4gMypUfWZ1bmN0aW9uIHAoVCxsLGgpe3JldHVybigoYyhsLGgpKlQrbShsLGgpKSpUK3UobCkpKlR9ZnVuY3Rpb24geShULGwsaCl7cmV0dXJuIDMqYyhsLGgpKlQqVCsyKm0obCxoKSpUK3UobCl9ZnVuY3Rpb24gTyhULGwsaCxmLGcpe3ZhciBNLEEsQz0wO2RvIEE9bCsoaC1sKS8yLE09cChBLGYsZyktVCxNPjA/aD1BOmw9QTt3aGlsZShNYXRoLmFicyhNKT5uJiYrK0M8YSk7cmV0dXJuIEF9ZnVuY3Rpb24geChULGwsaCxmKXtmb3IodmFyIGc9MDtnPHQ7KytnKXt2YXIgTT15KGwsaCxmKTtpZihNPT09MClyZXR1cm4gbDt2YXIgQT1wKGwsaCxmKS1UO2wtPUEvTX1yZXR1cm4gbH1mdW5jdGlvbiB2KFQpe3JldHVybiBUfWQuZXhwb3J0cz1mdW5jdGlvbihsLGgsZixnKXtpZighKDA8PWwmJmw8PTEmJjA8PWYmJmY8PTEpKXRocm93IG5ldyBFcnJvcigiYmV6aWVyIHggdmFsdWVzIG11c3QgYmUgaW4gWzAsIDFdIHJhbmdlIik7aWYobD09PWgmJmY9PT1nKXJldHVybiB2O2Zvcih2YXIgTT1vP25ldyBGbG9hdDMyQXJyYXkocyk6bmV3IEFycmF5KHMpLEE9MDtBPHM7KytBKU1bQV09cChBKmksbCxmKTtmdW5jdGlvbiBDKGIpe2Zvcih2YXIgRT0wLEw9MSxEPXMtMTtMIT09RCYmTVtMXTw9YjsrK0wpRSs9aTstLUw7dmFyIEk9KGItTVtMXSkvKE1bTCsxXS1NW0xdKSxSPUUrSSppLEI9eShSLGwsZik7cmV0dXJuIEI+PWU/eChiLFIsbCxmKTpCPT09MD9SOk8oYixFLEUraSxsLGYpfXJldHVybiBmdW5jdGlvbihFKXtyZXR1cm4gRT09PTA/MDpFPT09MT8xOnAoQyhFKSxoLGcpfX19LGZ1bmN0aW9uKGQscix0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGU9dCgxOTEpLG49aChlKSxhPXQoMjA0KSxzPWgoYSksaT10KDE2NCksbz1oKGkpLGM9dCgxNzApLG09aChjKSx1PXQoMTcxKSxwPWgodSkseT10KDE3NSksTz1oKHkpLHg9dCg3NSksdj1oKHgpLFQ9dCgyMDgpLGw9dCgxODgpO2Z1bmN0aW9uIGgoQil7cmV0dXJuIEImJkIuX19lc01vZHVsZT9COntkZWZhdWx0OkJ9fXZhciBmPSgwLE8uZGVmYXVsdCkoInRpbWluZyIpLGc9KDAsTy5kZWZhdWx0KSgia2V5ZnJhbWVzIiksTT0oMCxPLmRlZmF1bHQpKCJpbml0U3RhdGUiKSxBPSgwLE8uZGVmYXVsdCkoInJlYWR5RGVmZXIiKSxDPSgwLE8uZGVmYXVsdCkoImZpbmlzaGVkRGVmZXIiKSxiPSgwLE8uZGVmYXVsdCkoImVmZmVjdHMiKSxFPSgwLE8uZGVmYXVsdCkoImFjdGl2ZVJlYWR5VGltZXIiKSxMPSgwLE8uZGVmYXVsdCkoImFjdGl2ZUZpbmlzaFRpbWVyIiksRD0oMCxPLmRlZmF1bHQpKCJyZW1vdmVEZWZlciIpLEk9e2RlbGF5OjAsZW5kRGVsYXk6MCxmaWxsOiJhdXRvIixpdGVyYXRpb25zOjEscGxheWJhY2tSYXRlOjEsZGlyZWN0aW9uOiJub3JtYWwiLGVhc2luZzoibGluZWFyIixlZmZlY3Q6bnVsbH0sUj1mdW5jdGlvbigpe2Z1bmN0aW9uIEIoeixLLFEpe3ZhciBfPXRoaXM7aWYoKDAsbS5kZWZhdWx0KSh0aGlzLEIpLEFycmF5LmlzQXJyYXkoeikpe3ZhciBqPVt6WzBdLHosS107ej1qWzBdLEs9alsxXSxRPWpbMl19dHlwZW9mIFE9PSJudW1iZXIiJiYoUT17ZHVyYXRpb246UX0pLHRoaXNbZl09KDAsby5kZWZhdWx0KSh7fSxJLFEpLHRoaXNbZl0uZWFzaW5nPSgwLGwucGFyc2VFYXNpbmcpKHRoaXNbZl0uZWFzaW5nKSx0aGlzW2ddPSgwLFQuY2FsY3VsYXRlRnJhbWVzT2Zmc2V0KShLKTt2YXIgRz10aGlzW2ddW3RoaXNbZ10ubGVuZ3RoLTFdO3RoaXNbTV09e30sKDAscy5kZWZhdWx0KShHKS5mb3JFYWNoKGZ1bmN0aW9uKFgpe09iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh6LFgpJiZYIT09ImVhc2luZyImJlghPT0ib2Zmc2V0IiYmKF9bTV1bWF09eltYXSl9KSx0aGlzW2ddPXRoaXNbZ10ubWFwKGZ1bmN0aW9uKFgpe3JldHVybigwLG8uZGVmYXVsdCkoe30sX1tNXSxYKX0pLHRoaXNbZ11bMF0ub2Zmc2V0IT09MCYmdGhpc1tnXS51bnNoaWZ0KCgwLG8uZGVmYXVsdCkoe30sdGhpc1tNXSx7b2Zmc2V0OjB9KSksRy5vZmZzZXQ8MSYmdGhpc1tnXS5wdXNoKCgwLG8uZGVmYXVsdCkoe30sRyx7b2Zmc2V0OjF9KSksdGhpc1tiXT17fSx0aGlzLnRpbWVsaW5lPW51bGx9cmV0dXJuKDAscC5kZWZhdWx0KShCLFt7a2V5OiJwYXVzZSIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnRpbWVsaW5lLnBsYXliYWNrUmF0ZT0wfX0se2tleTpFLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIEs9dGhpczt0aGlzW0FdJiYhdGhpc1tBXS50aW1lcklEJiYodGhpcy50aW1lbGluZS5jdXJyZW50VGltZTwwP3RoaXNbQV0udGltZXJJRD10aGlzLnRpbWVsaW5lLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtLW0FdLnJlc29sdmUoKSxkZWxldGUgS1tBXX0se2RlbGF5Oi10aGlzLnRpbWVsaW5lLmN1cnJlbnRUaW1lLGhlYWRpbmc6ITF9KTp0aGlzW0FdLnRpbWVySUQ9dGhpcy50aW1lbGluZS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7S1tBXS5yZXNvbHZlKCksZGVsZXRlIEtbQV19LHtkZWxheTowLGlzRW50cm9weTohMH0pKX19LHtrZXk6TCx2YWx1ZTpmdW5jdGlvbigpe3ZhciBLPXRoaXMsUT10aGlzW2ZdLF89US5kdXJhdGlvbixqPVEuaXRlcmF0aW9ucyxHPVEuZW5kRGVsYXksWD1NYXRoLmNlaWwoXypqK0ctdGhpcy50aW1lbGluZS5jdXJyZW50VGltZSkrMTt0aGlzW0NdJiYhdGhpc1tDXS50aW1lcklEJiYodGhpc1tDXS50aW1lcklEPXRoaXMudGltZWxpbmUuc2V0VGltZW91dChmdW5jdGlvbigpe0tbQ10ucmVzb2x2ZSgpLEtbRF0oQSksS1tEXShDKX0se2RlbGF5OlgsaGVhZGluZzohMX0pLHRoaXNbQ10ucmV2ZXJzZVRpbWVySUQ9dGhpcy50aW1lbGluZS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7S1tDXS5yZXNvbHZlKCksS1tEXShBKSxLW0RdKEMpLEsudGltZWxpbmU9bnVsbH0se2RlbGF5Oi10aGlzW2ZdLmRlbGF5LTEsaGVhZGluZzohMX0pKX19LHtrZXk6InBsYXkiLHZhbHVlOmZ1bmN0aW9uKCl7aWYodGhpcy5wbGF5U3RhdGU9PT0iZmluaXNoZWQiJiZ0aGlzLmNhbmNlbCgpLHRoaXMucGxheVN0YXRlPT09ImlkbGUiKXtpZih0aGlzLnBsYXliYWNrUmF0ZTw9MClyZXR1cm47dmFyIEs9dGhpc1tmXSxRPUsuZGVsYXksXz1LLnBsYXliYWNrUmF0ZSxqPUsudGltZWxpbmU7dGhpcy50aW1lbGluZT1uZXcgdi5kZWZhdWx0KHtvcmlnaW5UaW1lOlEscGxheWJhY2tSYXRlOl99LGopLHRoaXNbRV0oKSx0aGlzW0xdKCl9ZWxzZSB0aGlzLnBsYXlTdGF0ZT09PSJwYXVzZWQiJiYodGhpcy50aW1lbGluZS5wbGF5YmFja1JhdGU9dGhpcy5wbGF5YmFja1JhdGUsdGhpc1tFXSgpKX19LHtrZXk6RCx2YWx1ZTpmdW5jdGlvbihLKXt2YXIgUT10aGlzW0tdLF89dGhpcy50aW1lbGluZTtRJiZfJiYoXy5jbGVhclRpbWVvdXQoUS50aW1lcklEKSxRLnJldmVyc2VUaW1lcklEJiZfLmNsZWFyVGltZW91dChRLnJldmVyc2VUaW1lcklEKSksZGVsZXRlIHRoaXNbS119fSx7a2V5OiJjYW5jZWwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpc1tEXShBKSx0aGlzW0RdKEMpLHRoaXMudGltZWxpbmU9bnVsbH19LHtrZXk6ImZpbmlzaCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnRpbWVsaW5lJiYodGhpcy50aW1lbGluZS5jdXJyZW50VGltZT0xLzAvdGhpcy5wbGF5YmFja1JhdGUpLHRoaXNbRF0oQSksdGhpc1tEXShDKX19LHtrZXk6ImFwcGx5RWZmZWN0cyIsdmFsdWU6ZnVuY3Rpb24oSyl7cmV0dXJuKDAsby5kZWZhdWx0KSh0aGlzW2JdLEspfX0se2tleToicGxheWJhY2tSYXRlIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tmXS5wbGF5YmFja1JhdGV9LHNldDpmdW5jdGlvbihLKXt0aGlzLnRpbWVsaW5lJiYodGhpcy50aW1lbGluZS5wbGF5YmFja1JhdGU9SyksdGhpc1tmXS5wbGF5YmFja1JhdGU9S319LHtrZXk6InBsYXlTdGF0ZSIsZ2V0OmZ1bmN0aW9uKCl7dmFyIEs9dGhpcy50aW1lbGluZSxRPXRoaXNbZl0sXz1RLml0ZXJhdGlvbnMsaj1RLmR1cmF0aW9uLEc9US5lbmREZWxheSxYPSJydW5uaW5nIjtpZihLPT1udWxsKVg9ImlkbGUiO2Vsc2UgaWYoSy5wYXVzZWQpWD0icGF1c2VkIjtlbHNlIGlmKEsuY3VycmVudFRpbWU8MClYPSJwZW5kaW5nIjtlbHNle3ZhciBaPUsuY3VycmVudFRpbWUtXypqO1o+MCYmWjxHP1g9InBlbmRpbmciOlo+PUcmJihYPSJmaW5pc2hlZCIpfXJldHVybiBYfX0se2tleToicHJvZ3Jlc3MiLGdldDpmdW5jdGlvbigpe2lmKCF0aGlzLnRpbWVsaW5lKXJldHVybiAwO3ZhciBLPXRoaXNbZl0sUT1LLmR1cmF0aW9uLF89Sy5pdGVyYXRpb25zLGo9dGhpcy50aW1lbGluZSxHPXRoaXMucGxheVN0YXRlLFg9dm9pZCAwO2lmKEc9PT0iaWRsZSIpWD0wO2Vsc2UgaWYoRz09PSJwYXVzZWQiJiZqLmN1cnJlbnRUaW1lPDApWD0wO2Vsc2UgaWYoRz09PSJwZW5kaW5nIilpZihqLmN1cnJlbnRUaW1lPDApWD0wO2Vsc2V7dmFyIFo9ai5zZWVrTG9jYWxUaW1lKF8qUSk7WD0oMCxULnBlcmlvZGljaXR5KShaLFEpWzFdL1F9ZWxzZShHPT09InJ1bm5pbmcifHxHPT09InBhdXNlZCIpJiYoWD0oMCxULnBlcmlvZGljaXR5KShqLmN1cnJlbnRUaW1lLFEpWzFdL1EpO3JldHVybiBHPT09ImZpbmlzaGVkIiYmKFg9KDAsVC5wZXJpb2RpY2l0eSkoXywxKVsxXSksWH19LHtrZXk6ImZyYW1lIixnZXQ6ZnVuY3Rpb24oKXt2YXIgSz10aGlzLnBsYXlTdGF0ZSxRPXRoaXNbTV0sXz10aGlzW2ZdLmZpbGw7aWYoSz09PSJpZGxlIilyZXR1cm4gUTt2YXIgaj10aGlzLnRpbWVsaW5lLmN1cnJlbnRUaW1lLEc9dGhpc1tnXS5zbGljZSgwKSxYPSgwLFQuZ2V0UHJvZ3Jlc3MpKHRoaXMudGltZWxpbmUsdGhpc1tmXSx0aGlzLnByb2dyZXNzKSxaPVgucCx0dD1YLmludmVydGVkLG50PVE7cmV0dXJuIGo8MCYmSz09PSJwZW5kaW5nIj8oXz09PSJiYWNrd2FyZHMifHxfPT09ImJvdGgiKSYmKG50PXR0P0dbRy5sZW5ndGgtMV06R1swXSk6KEshPT0icGVuZGluZyImJkshPT0iZmluaXNoZWQifHxfPT09ImZvcndhcmRzInx8Xz09PSJib3RoIikmJihudD0oMCxULmdldEN1cnJlbnRGcmFtZSkodGhpc1tmXSxHLHRoaXNbYl0sWikpLG50fX0se2tleToidGltaW5nIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tmXX19LHtrZXk6ImVmZmVjdHMiLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzW2JdfX0se2tleToiYmFzZVRpbWVsaW5lIixzZXQ6ZnVuY3Rpb24oSyl7dGhpc1tmXS50aW1lbGluZT1LfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tmXS50aW1lbGluZX19LHtrZXk6InJlYWR5IixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tBXT90aGlzW0FdLnByb21pc2U6dGhpcy50aW1lbGluZSYmdGhpcy50aW1lbGluZS5jdXJyZW50VGltZT49MCYmdGhpcy5wbGF5U3RhdGUhPT0icGF1c2VkIj9uLmRlZmF1bHQucmVzb2x2ZSgpOih0aGlzW0FdPSgwLFQuZGVmZXIpKCksdGhpcy50aW1lbGluZSYmdGhpc1tFXSgpLHRoaXNbQV0/dGhpc1tBXS5wcm9taXNlOm4uZGVmYXVsdC5yZXNvbHZlKCkpfX0se2tleToiZmluaXNoZWQiLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXlTdGF0ZT09PSJmaW5pc2hlZCI/bi5kZWZhdWx0LnJlc29sdmUoKToodGhpc1tDXXx8KHRoaXNbQ109KDAsVC5kZWZlcikoKSx0aGlzLnRpbWVsaW5lJiZ0aGlzW0xdKCkpLHRoaXNbQ10ucHJvbWlzZSl9fV0pLEJ9KCk7ci5kZWZhdWx0PVJ9LGZ1bmN0aW9uKGQscix0KXtkLmV4cG9ydHM9e2RlZmF1bHQ6dCgxOTIpLF9fZXNNb2R1bGU6ITB9fSxmdW5jdGlvbihkLHIsdCl7dCgxNDMpLHQoMTI1KSx0KDc5KSx0KDE5MyksdCgyMDIpLHQoMjAzKSxkLmV4cG9ydHM9dCg5MikuUHJvbWlzZX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoODkpLG49dCg5MSksYT10KDkzKSxzPXQoMTI4KSxpPXQoOTApLG89dCg5OCksYz10KDk0KSxtPXQoMTQ3KSx1PXQoMTQ4KSxwPXQoMTk0KSx5PXQoMTk1KS5zZXQsTz10KDE5NykoKSx4PXQoMTk4KSx2PXQoMTk5KSxUPXQoMjAwKSxsPXQoMjAxKSxoPSJQcm9taXNlIixmPW4uVHlwZUVycm9yLGc9bi5wcm9jZXNzLE09ZyYmZy52ZXJzaW9ucyxBPU0mJk0udjh8fCIiLEM9bltoXSxiPXMoZyk9PSJwcm9jZXNzIixFPWZ1bmN0aW9uKCl7fSxMLEQsSSxSLEI9RD14LmYsej0hIWZ1bmN0aW9uKCl7dHJ5e3ZhciB0dD1DLnJlc29sdmUoMSksbnQ9KHR0LmNvbnN0cnVjdG9yPXt9KVt0KDEyMikoInNwZWNpZXMiKV09ZnVuY3Rpb24ocSl7cShFLEUpfTtyZXR1cm4oYnx8dHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudD09ImZ1bmN0aW9uIikmJnR0LnRoZW4oRSlpbnN0YW5jZW9mIG50JiZBLmluZGV4T2YoIjYuNiIpIT09MCYmVC5pbmRleE9mKCJDaHJvbWUvNjYiKT09PS0xfWNhdGNoe319KCksSz1mdW5jdGlvbih0dCl7dmFyIG50O3JldHVybiBvKHR0KSYmdHlwZW9mKG50PXR0LnRoZW4pPT0iZnVuY3Rpb24iP250OiExfSxRPWZ1bmN0aW9uKHR0LG50KXtpZighdHQuX24pe3R0Ll9uPSEwO3ZhciBxPXR0Ll9jO08oZnVuY3Rpb24oKXtmb3IodmFyIGR0PXR0Ll92LHV0PXR0Ll9zPT0xLFc9MCxGPWZ1bmN0aW9uKFYpe3ZhciBKPXV0P1Yub2s6Vi5mYWlsLE49Vi5yZXNvbHZlLCQ9Vi5yZWplY3QsUz1WLmRvbWFpbixQLHcsVTt0cnl7Sj8odXR8fCh0dC5faD09MiYmRyh0dCksdHQuX2g9MSksSj09PSEwP1A9ZHQ6KFMmJlMuZW50ZXIoKSxQPUooZHQpLFMmJihTLmV4aXQoKSxVPSEwKSksUD09PVYucHJvbWlzZT8kKGYoIlByb21pc2UtY2hhaW4gY3ljbGUiKSk6KHc9SyhQKSk/dy5jYWxsKFAsTiwkKTpOKFApKTokKGR0KX1jYXRjaChIKXtTJiYhVSYmUy5leGl0KCksJChIKX19O3EubGVuZ3RoPlc7KUYocVtXKytdKTt0dC5fYz1bXSx0dC5fbj0hMSxudCYmIXR0Ll9oJiZfKHR0KX0pfX0sXz1mdW5jdGlvbih0dCl7eS5jYWxsKG4sZnVuY3Rpb24oKXt2YXIgbnQ9dHQuX3YscT1qKHR0KSxkdCx1dCxXO2lmKHEmJihkdD12KGZ1bmN0aW9uKCl7Yj9nLmVtaXQoInVuaGFuZGxlZFJlamVjdGlvbiIsbnQsdHQpOih1dD1uLm9udW5oYW5kbGVkcmVqZWN0aW9uKT91dCh7cHJvbWlzZTp0dCxyZWFzb246bnR9KTooVz1uLmNvbnNvbGUpJiZXLmVycm9yJiZXLmVycm9yKCJVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24iLG50KX0pLHR0Ll9oPWJ8fGoodHQpPzI6MSksdHQuX2E9dm9pZCAwLHEmJmR0LmUpdGhyb3cgZHQudn0pfSxqPWZ1bmN0aW9uKHR0KXtyZXR1cm4gdHQuX2ghPT0xJiYodHQuX2F8fHR0Ll9jKS5sZW5ndGg9PT0wfSxHPWZ1bmN0aW9uKHR0KXt5LmNhbGwobixmdW5jdGlvbigpe3ZhciBudDtiP2cuZW1pdCgicmVqZWN0aW9uSGFuZGxlZCIsdHQpOihudD1uLm9ucmVqZWN0aW9uaGFuZGxlZCkmJm50KHtwcm9taXNlOnR0LHJlYXNvbjp0dC5fdn0pfSl9LFg9ZnVuY3Rpb24odHQpe3ZhciBudD10aGlzO250Ll9kfHwobnQuX2Q9ITAsbnQ9bnQuX3d8fG50LG50Ll92PXR0LG50Ll9zPTIsbnQuX2F8fChudC5fYT1udC5fYy5zbGljZSgpKSxRKG50LCEwKSl9LFo9ZnVuY3Rpb24odHQpe3ZhciBudD10aGlzLHE7aWYoIW50Ll9kKXtudC5fZD0hMCxudD1udC5fd3x8bnQ7dHJ5e2lmKG50PT09dHQpdGhyb3cgZigiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGYiKTsocT1LKHR0KSk/TyhmdW5jdGlvbigpe3ZhciBkdD17X3c6bnQsX2Q6ITF9O3RyeXtxLmNhbGwodHQsYShaLGR0LDEpLGEoWCxkdCwxKSl9Y2F0Y2godXQpe1guY2FsbChkdCx1dCl9fSk6KG50Ll92PXR0LG50Ll9zPTEsUShudCwhMSkpfWNhdGNoKGR0KXtYLmNhbGwoe193Om50LF9kOiExfSxkdCl9fX07enx8KEM9ZnVuY3Rpb24obnQpe20odGhpcyxDLGgsIl9oIiksYyhudCksTC5jYWxsKHRoaXMpO3RyeXtudChhKFosdGhpcywxKSxhKFgsdGhpcywxKSl9Y2F0Y2gocSl7WC5jYWxsKHRoaXMscSl9fSxMPWZ1bmN0aW9uKG50KXt0aGlzLl9jPVtdLHRoaXMuX2E9dm9pZCAwLHRoaXMuX3M9MCx0aGlzLl9kPSExLHRoaXMuX3Y9dm9pZCAwLHRoaXMuX2g9MCx0aGlzLl9uPSExfSxMLnByb3RvdHlwZT10KDE0NikoQy5wcm90b3R5cGUse3RoZW46ZnVuY3Rpb24obnQscSl7dmFyIGR0PUIocCh0aGlzLEMpKTtyZXR1cm4gZHQub2s9dHlwZW9mIG50PT0iZnVuY3Rpb24iP250OiEwLGR0LmZhaWw9dHlwZW9mIHE9PSJmdW5jdGlvbiImJnEsZHQuZG9tYWluPWI/Zy5kb21haW46dm9pZCAwLHRoaXMuX2MucHVzaChkdCksdGhpcy5fYSYmdGhpcy5fYS5wdXNoKGR0KSx0aGlzLl9zJiZRKHRoaXMsITEpLGR0LnByb21pc2V9LGNhdGNoOmZ1bmN0aW9uKHR0KXtyZXR1cm4gdGhpcy50aGVuKHZvaWQgMCx0dCl9fSksST1mdW5jdGlvbigpe3ZhciB0dD1uZXcgTDt0aGlzLnByb21pc2U9dHQsdGhpcy5yZXNvbHZlPWEoWix0dCwxKSx0aGlzLnJlamVjdD1hKFgsdHQsMSl9LHguZj1CPWZ1bmN0aW9uKHR0KXtyZXR1cm4gdHQ9PT1DfHx0dD09PVI/bmV3IEkodHQpOkQodHQpfSksaShpLkcraS5XK2kuRioheix7UHJvbWlzZTpDfSksdCgxMjEpKEMsaCksdCgxNDkpKGgpLFI9dCg5MilbaF0saShpLlMraS5GKiF6LGgse3JlamVjdDpmdW5jdGlvbihudCl7dmFyIHE9Qih0aGlzKSxkdD1xLnJlamVjdDtyZXR1cm4gZHQobnQpLHEucHJvbWlzZX19KSxpKGkuUytpLkYqKGV8fCF6KSxoLHtyZXNvbHZlOmZ1bmN0aW9uKG50KXtyZXR1cm4gbChlJiZ0aGlzPT09Uj9DOnRoaXMsbnQpfX0pLGkoaS5TK2kuRiohKHomJnQoMTQwKShmdW5jdGlvbih0dCl7Qy5hbGwodHQpLmNhdGNoKEUpfSkpLGgse2FsbDpmdW5jdGlvbihudCl7dmFyIHE9dGhpcyxkdD1CKHEpLHV0PWR0LnJlc29sdmUsVz1kdC5yZWplY3QsRj12KGZ1bmN0aW9uKCl7dmFyIFY9W10sSj0wLE49MTt1KG50LCExLGZ1bmN0aW9uKCQpe3ZhciBTPUorKyxQPSExO1YucHVzaCh2b2lkIDApLE4rKyxxLnJlc29sdmUoJCkudGhlbihmdW5jdGlvbih3KXtQfHwoUD0hMCxWW1NdPXcsLS1OfHx1dChWKSl9LFcpfSksLS1OfHx1dChWKX0pO3JldHVybiBGLmUmJlcoRi52KSxkdC5wcm9taXNlfSxyYWNlOmZ1bmN0aW9uKG50KXt2YXIgcT10aGlzLGR0PUIocSksdXQ9ZHQucmVqZWN0LFc9dihmdW5jdGlvbigpe3UobnQsITEsZnVuY3Rpb24oRil7cS5yZXNvbHZlKEYpLnRoZW4oZHQucmVzb2x2ZSx1dCl9KX0pO3JldHVybiBXLmUmJnV0KFcudiksZHQucHJvbWlzZX19KX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoOTcpLG49dCg5NCksYT10KDEyMikoInNwZWNpZXMiKTtkLmV4cG9ydHM9ZnVuY3Rpb24ocyxpKXt2YXIgbz1lKHMpLmNvbnN0cnVjdG9yLGM7cmV0dXJuIG89PT12b2lkIDB8fChjPWUobylbYV0pPT1udWxsP2k6bihjKX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDkzKSxuPXQoMTk2KSxhPXQoMTIwKSxzPXQoMTAyKSxpPXQoOTEpLG89aS5wcm9jZXNzLGM9aS5zZXRJbW1lZGlhdGUsbT1pLmNsZWFySW1tZWRpYXRlLHU9aS5NZXNzYWdlQ2hhbm5lbCxwPWkuRGlzcGF0Y2gseT0wLE89e30seD0ib25yZWFkeXN0YXRlY2hhbmdlIix2LFQsbCxoPWZ1bmN0aW9uKCl7dmFyIGc9K3RoaXM7aWYoTy5oYXNPd25Qcm9wZXJ0eShnKSl7dmFyIE09T1tnXTtkZWxldGUgT1tnXSxNKCl9fSxmPWZ1bmN0aW9uKGcpe2guY2FsbChnLmRhdGEpfTsoIWN8fCFtKSYmKGM9ZnVuY3Rpb24oTSl7Zm9yKHZhciBBPVtdLEM9MTthcmd1bWVudHMubGVuZ3RoPkM7KUEucHVzaChhcmd1bWVudHNbQysrXSk7cmV0dXJuIE9bKyt5XT1mdW5jdGlvbigpe24odHlwZW9mIE09PSJmdW5jdGlvbiI/TTpGdW5jdGlvbihNKSxBKX0sdih5KSx5fSxtPWZ1bmN0aW9uKE0pe2RlbGV0ZSBPW01dfSx0KDg2KShvKT09InByb2Nlc3MiP3Y9ZnVuY3Rpb24oZyl7by5uZXh0VGljayhlKGgsZywxKSl9OnAmJnAubm93P3Y9ZnVuY3Rpb24oZyl7cC5ub3coZShoLGcsMSkpfTp1PyhUPW5ldyB1LGw9VC5wb3J0MixULnBvcnQxLm9ubWVzc2FnZT1mLHY9ZShsLnBvc3RNZXNzYWdlLGwsMSkpOmkuYWRkRXZlbnRMaXN0ZW5lciYmdHlwZW9mIHBvc3RNZXNzYWdlPT0iZnVuY3Rpb24iJiYhaS5pbXBvcnRTY3JpcHRzPyh2PWZ1bmN0aW9uKGcpe2kucG9zdE1lc3NhZ2UoZysiIiwiKiIpfSxpLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGYsITEpKTp4IGluIHMoInNjcmlwdCIpP3Y9ZnVuY3Rpb24oZyl7YS5hcHBlbmRDaGlsZChzKCJzY3JpcHQiKSlbeF09ZnVuY3Rpb24oKXthLnJlbW92ZUNoaWxkKHRoaXMpLGguY2FsbChnKX19OnY9ZnVuY3Rpb24oZyl7c2V0VGltZW91dChlKGgsZywxKSwwKX0pLGQuZXhwb3J0cz17c2V0OmMsY2xlYXI6bX19LGZ1bmN0aW9uKGQscil7ZC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgYT1uPT09dm9pZCAwO3N3aXRjaChlLmxlbmd0aCl7Y2FzZSAwOnJldHVybiBhP3QoKTp0LmNhbGwobik7Y2FzZSAxOnJldHVybiBhP3QoZVswXSk6dC5jYWxsKG4sZVswXSk7Y2FzZSAyOnJldHVybiBhP3QoZVswXSxlWzFdKTp0LmNhbGwobixlWzBdLGVbMV0pO2Nhc2UgMzpyZXR1cm4gYT90KGVbMF0sZVsxXSxlWzJdKTp0LmNhbGwobixlWzBdLGVbMV0sZVsyXSk7Y2FzZSA0OnJldHVybiBhP3QoZVswXSxlWzFdLGVbMl0sZVszXSk6dC5jYWxsKG4sZVswXSxlWzFdLGVbMl0sZVszXSl9cmV0dXJuIHQuYXBwbHkobixlKX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDkxKSxuPXQoMTk1KS5zZXQsYT1lLk11dGF0aW9uT2JzZXJ2ZXJ8fGUuV2ViS2l0TXV0YXRpb25PYnNlcnZlcixzPWUucHJvY2VzcyxpPWUuUHJvbWlzZSxvPXQoODYpKHMpPT0icHJvY2VzcyI7ZC5leHBvcnRzPWZ1bmN0aW9uKCl7dmFyIGMsbSx1LHA9ZnVuY3Rpb24oKXt2YXIgdixUO2ZvcihvJiYodj1zLmRvbWFpbikmJnYuZXhpdCgpO2M7KXtUPWMuZm4sYz1jLm5leHQ7dHJ5e1QoKX1jYXRjaChsKXt0aHJvdyBjP3UoKTptPXZvaWQgMCxsfX1tPXZvaWQgMCx2JiZ2LmVudGVyKCl9O2lmKG8pdT1mdW5jdGlvbigpe3MubmV4dFRpY2socCl9O2Vsc2UgaWYoYSYmIShlLm5hdmlnYXRvciYmZS5uYXZpZ2F0b3Iuc3RhbmRhbG9uZSkpe3ZhciB5PSEwLE89ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiIpO25ldyBhKHApLm9ic2VydmUoTyx7Y2hhcmFjdGVyRGF0YTohMH0pLHU9ZnVuY3Rpb24oKXtPLmRhdGE9eT0heX19ZWxzZSBpZihpJiZpLnJlc29sdmUpe3ZhciB4PWkucmVzb2x2ZSh2b2lkIDApO3U9ZnVuY3Rpb24oKXt4LnRoZW4ocCl9fWVsc2UgdT1mdW5jdGlvbigpe24uY2FsbChlLHApfTtyZXR1cm4gZnVuY3Rpb24odil7dmFyIFQ9e2ZuOnYsbmV4dDp2b2lkIDB9O20mJihtLm5leHQ9VCksY3x8KGM9VCx1KCkpLG09VH19fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5NCk7ZnVuY3Rpb24gbihhKXt2YXIgcyxpO3RoaXMucHJvbWlzZT1uZXcgYShmdW5jdGlvbihvLGMpe2lmKHMhPT12b2lkIDB8fGkhPT12b2lkIDApdGhyb3cgVHlwZUVycm9yKCJCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvciIpO3M9byxpPWN9KSx0aGlzLnJlc29sdmU9ZShzKSx0aGlzLnJlamVjdD1lKGkpfWQuZXhwb3J0cy5mPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgbihhKX19LGZ1bmN0aW9uKGQscil7ZC5leHBvcnRzPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm57ZTohMSx2OnQoKX19Y2F0Y2goZSl7cmV0dXJue2U6ITAsdjplfX19fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5MSksbj1lLm5hdmlnYXRvcjtkLmV4cG9ydHM9biYmbi51c2VyQWdlbnR8fCIifSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5Nyksbj10KDk4KSxhPXQoMTk4KTtkLmV4cG9ydHM9ZnVuY3Rpb24ocyxpKXtpZihlKHMpLG4oaSkmJmkuY29uc3RydWN0b3I9PT1zKXJldHVybiBpO3ZhciBvPWEuZihzKSxjPW8ucmVzb2x2ZTtyZXR1cm4gYyhpKSxvLnByb21pc2V9fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCg5MCksbj10KDkyKSxhPXQoOTEpLHM9dCgxOTQpLGk9dCgyMDEpO2UoZS5QK2UuUiwiUHJvbWlzZSIse2ZpbmFsbHk6ZnVuY3Rpb24obyl7dmFyIGM9cyh0aGlzLG4uUHJvbWlzZXx8YS5Qcm9taXNlKSxtPXR5cGVvZiBvPT0iZnVuY3Rpb24iO3JldHVybiB0aGlzLnRoZW4obT9mdW5jdGlvbih1KXtyZXR1cm4gaShjLG8oKSkudGhlbihmdW5jdGlvbigpe3JldHVybiB1fSl9Om8sbT9mdW5jdGlvbih1KXtyZXR1cm4gaShjLG8oKSkudGhlbihmdW5jdGlvbigpe3Rocm93IHV9KX06byl9fSl9LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDkwKSxuPXQoMTk4KSxhPXQoMTk5KTtlKGUuUywiUHJvbWlzZSIse3RyeTpmdW5jdGlvbihzKXt2YXIgaT1uLmYodGhpcyksbz1hKHMpO3JldHVybihvLmU/aS5yZWplY3Q6aS5yZXNvbHZlKShvLnYpLGkucHJvbWlzZX19KX0sZnVuY3Rpb24oZCxyLHQpe2QuZXhwb3J0cz17ZGVmYXVsdDp0KDIwNSksX19lc01vZHVsZTohMH19LGZ1bmN0aW9uKGQscix0KXt0KDIwNiksZC5leHBvcnRzPXQoOTIpLk9iamVjdC5rZXlzfSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCgxMjQpLG49dCgxMTApO3QoMjA3KSgia2V5cyIsZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24ocyl7cmV0dXJuIG4oZShzKSl9fSl9LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDkwKSxuPXQoOTIpLGE9dCgxMDEpO2QuZXhwb3J0cz1mdW5jdGlvbihzLGkpe3ZhciBvPShuLk9iamVjdHx8e30pW3NdfHxPYmplY3Rbc10sYz17fTtjW3NdPWkobyksZShlLlMrZS5GKmEoZnVuY3Rpb24oKXtvKDEpfSksIk9iamVjdCIsYyl9fSxmdW5jdGlvbihkLHIsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBlPXQoNzYpLG49TyhlKSxhPXQoMjA5KSxzPU8oYSksaT10KDE2NCksbz1PKGkpLGM9dCgxOTEpLG09TyhjKTtyLmRlZmVyPXgsci5wZXJpb2RpY2l0eT12LHIuY2FsY3VsYXRlRnJhbWVzT2Zmc2V0PVQsci5nZXRQcm9ncmVzcz1sLHIuZ2V0Q3VycmVudEZyYW1lPWY7dmFyIHU9dCgxODgpLHA9dCgxODcpLHk9TyhwKTtmdW5jdGlvbiBPKGcpe3JldHVybiBnJiZnLl9fZXNNb2R1bGU/Zzp7ZGVmYXVsdDpnfX1mdW5jdGlvbiB4KCl7dmFyIGc9e307cmV0dXJuIGcucHJvbWlzZT1uZXcgbS5kZWZhdWx0KGZ1bmN0aW9uKE0sQSl7Zy5yZXNvbHZlPU0sZy5yZWplY3Q9QX0pLGd9ZnVuY3Rpb24gdihnLE0pe3ZhciBBPU1hdGguZmxvb3IoZy9NKSxDPWctQSpNO3JldHVybiBDPT09MCYmQT4wJiYoQz1NLEEtLSksW0EsQ119ZnVuY3Rpb24gVChnKXtnPWcuc2xpY2UoMCk7dmFyIE09Z1swXSxBPWdbZy5sZW5ndGgtMV07QS5vZmZzZXQ9QS5vZmZzZXR8fDEsTS5vZmZzZXQ9TS5vZmZzZXR8fDA7Zm9yKHZhciBDPTAsYj0tMSxFPTA7RTxnLmxlbmd0aDtFKyspe3ZhciBMPWdbRV07aWYoTC5vZmZzZXQhPW51bGwpe3ZhciBEPUUtYjtpZihEPjEpZm9yKHZhciBJPShMLm9mZnNldC1DKS9ELFI9MDtSPEQtMTtSKyspZ1tiK1IrMV0ub2Zmc2V0PUMrSSooUisxKTtDPUwub2Zmc2V0LGI9RX1pZihMLmVhc2luZyE9bnVsbCYmKEwuZWFzaW5nPSgwLHUucGFyc2VFYXNpbmcpKEwuZWFzaW5nKSksRT4wKXt2YXIgQj1nW0VdLmVhc2luZyE9bnVsbDtnW0VdPSgwLG8uZGVmYXVsdCkoe30sZ1tFLTFdLGdbRV0pLEJ8fGRlbGV0ZSBnW0VdLmVhc2luZ319cmV0dXJuIGd9ZnVuY3Rpb24gbChnLE0sQSl7dmFyIEM9Zy5jdXJyZW50VGltZSxiPU0uZGlyZWN0aW9uLEU9TS5kdXJhdGlvbixMPSExO2lmKGI9PT0icmV2ZXJzZSIpQT0xLUEsTD0hMDtlbHNlIGlmKGI9PT0iYWx0ZXJuYXRlInx8Yj09PSJhbHRlcm5hdGUtcmV2ZXJzZSIpe3ZhciBEPU1hdGguZmxvb3IoQy9FKTtBPT09MSYmRC0tLEQlMl5iPT09ImFsdGVybmF0ZS1yZXZlcnNlIiYmKEE9MS1BLEw9ITApfXJldHVybntwOkEsaW52ZXJ0ZWQ6TH19ZnVuY3Rpb24gaChnLE0sQSxDKXt2YXIgYj17fTtyZXR1cm4oMCxzLmRlZmF1bHQpKE0pLmZvckVhY2goZnVuY3Rpb24oRSl7dmFyIEw9KDAsbi5kZWZhdWx0KShFLDIpLEQ9TFswXSxJPUxbMV07aWYoRCE9PSJvZmZzZXQiJiZEIT09ImVhc2luZyIpe3ZhciBSPUFbRF18fEEuZGVmYXVsdCxCPVIoZ1tEXSxJLEMsZy5vZmZzZXQsTS5vZmZzZXQpO0IhPW51bGwmJihiW0RdPUIpfX0pLGJ9ZnVuY3Rpb24gZihnLE0sQSxDKXt2YXIgYj1nLmVhc2luZyxFPWcuZWZmZWN0O0V8fChBPSgwLG8uZGVmYXVsdCkoe30seS5kZWZhdWx0LEEpKTt2YXIgTD17fTtDPWIoQyxNKTtmb3IodmFyIEQ9MTtEPE0ubGVuZ3RoO0QrKyl7dmFyIEk9TVtEXSxSPUkub2Zmc2V0O2lmKFI+PUN8fEQ9PT1NLmxlbmd0aC0xKXt2YXIgQj1NW0QtMV0sej1CLm9mZnNldCxLPUIuZWFzaW5nLFE9QztpZihLKXt2YXIgXz1SLXo7UT1LKChDLXopL18pKl8ren1FP0w9RShCLEksUSx6LFIpOkw9aChCLEksQSxRKTticmVha319cmV0dXJuIEx9fSxmdW5jdGlvbihkLHIsdCl7ZC5leHBvcnRzPXtkZWZhdWx0OnQoMjEwKSxfX2VzTW9kdWxlOiEwfX0sZnVuY3Rpb24oZCxyLHQpe3QoMjExKSxkLmV4cG9ydHM9dCg5MikuT2JqZWN0LmVudHJpZXN9LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDkwKSxuPXQoMjEyKSghMCk7ZShlLlMsIk9iamVjdCIse2VudHJpZXM6ZnVuY3Rpb24ocyl7cmV0dXJuIG4ocyl9fSl9LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDEwMCksbj10KDExMCksYT10KDg0KSxzPXQoMTY5KS5mO2QuZXhwb3J0cz1mdW5jdGlvbihpKXtyZXR1cm4gZnVuY3Rpb24obyl7Zm9yKHZhciBjPWEobyksbT1uKGMpLHU9bS5sZW5ndGgscD0wLHk9W10sTzt1PnA7KU89bVtwKytdLCghZXx8cy5jYWxsKGMsTykpJiZ5LnB1c2goaT9bTyxjW09dXTpjW09dKTtyZXR1cm4geX19fSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtjb25zdCBlPW5ldyBNYXA7ZnVuY3Rpb24gbihzLGk9e30sbz1bXSl7cz1zLnRvTG93ZXJDYXNlKCk7Y29uc3QgYz1lLmdldChzKTtpZighYyl0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIG5vZGU6ICR7c31gKTtjb25zdCBtPW5ldyBjKGkpO3JldHVybiBvLmZvckVhY2godT0+e20uYXBwZW5kQ2hpbGQodSl9KSxtfWNvbnN0IGE9e3JlZ2lzdGVyTm9kZShzLGksbz0xMDApe2lmKGk9aS50b0xvd2VyQ2FzZSgpLGUuaGFzKGkpKXRocm93IG5ldyBUeXBlRXJyb3IoYENhbm5vdCByZWdpc3Rlck5vZGUsICR7aX0gaGFzIGJlZW4gdGFrZW4uYCk7ZS5zZXQoaSxzKSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhzLnByb3RvdHlwZSx7bm9kZVR5cGU6e3ZhbHVlOm99LHRhZ05hbWU6e3ZhbHVlOmkudG9VcHBlckNhc2UoKX0sbm9kZU5hbWU6e3ZhbHVlOml9LG93bmVyRG9jdW1lbnQ6e3ZhbHVlOmF9LG5hbWVzcGFjZVVSSTp7dmFsdWU6YGh0dHA6Ly9zcHJpdGVqcy5jb20vJHtpfWB9fSl9LGNyZWF0ZUVsZW1lbnQ6bixjcmVhdGVFbGVtZW50TlMocyxpKXtyZXR1cm4gbihpKX0saXNTcHJpdGVOb2RlKHMpe3JldHVybiBlLmhhcyhzLnRvTG93ZXJDYXNlKCkpfX07ci5kZWZhdWx0PWF9LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImRlZmF1bHQiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KSx0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7Y29uc3QgZT1TeW1ib2woInR5cGUiKSxuPVN5bWJvbCgiYnViYmxlcyIpLGE9U3ltYm9sKCJvcmlnaW5hbEV2ZW50Iikscz1TeW1ib2woImRldGFpbCIpO2NsYXNzIGl7Y29uc3RydWN0b3IoYyx7YnViYmxlczptPW51bGx9PXt9KXtpZih0eXBlb2YgYz09InN0cmluZyI/KHRoaXNbZV09Yyx0aGlzW25dPSEhbSk6KHRoaXNbZV09Yy50eXBlLHRoaXNbYV09Yyx0aGlzW25dPW0hPW51bGw/ISFtOiEhYy5idWJibGVzLGMuZGV0YWlsJiYodGhpc1tzXT1jLmRldGFpbCkpLCF0aGlzW2VdKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgZXZlbnQgdHlwZS4iKTt0aGlzLmNhbmNlbEJ1YmJsZT0hMX1zZXRPcmlnaW5hbEV2ZW50KGMpe3RoaXNbYV09Y31nZXQgb3JpZ2luYWxFdmVudCgpe3JldHVybiB0aGlzW2FdfWdldCB0eXBlKCl7cmV0dXJuIHRoaXNbZV19Z2V0IGJ1YmJsZXMoKXtyZXR1cm4gdGhpc1tuXX1nZXQgZGV0YWlsKCl7cmV0dXJuIHRoaXNbc119c3RvcFByb3BhZ2F0aW9uKCl7dGhpcy5jYW5jZWxCdWJibGU9ITB9fX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwicGFyc2VGaWx0ZXJTdHJpbmciLGZ1bmN0aW9uKCl7cmV0dXJuIG59KSx0LmQociwiYXBwbHlGaWx0ZXJzIixmdW5jdGlvbigpe3JldHVybiBhfSk7dmFyIGU9dCg3Mik7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2Z1bmN0aW9uIG4ocyl7aWYocz1zLnRyaW0oKSwhc3x8cz09PSJub25lIilyZXR1cm4gbnVsbDtjb25zdCBpPS9eKD86KHVybHxibHVyfGJyaWdodG5lc3N8Y29udHJhc3R8ZHJvcC1zaGFkb3d8Z3JheXNjYWxlfGh1ZS1yb3RhdGV8aW52ZXJ0fG9wYWNpdHl8c2F0dXJhdGV8c2VwaWEpXCgoW14oKV0qKD86XCguKlwpKSpbXigpXSopXCkpKyQvaSxvPXMubWF0Y2goLyg/Oih1cmx8Ymx1cnxicmlnaHRuZXNzfGNvbnRyYXN0fGRyb3Atc2hhZG93fGdyYXlzY2FsZXxodWUtcm90YXRlfGludmVydHxvcGFjaXR5fHNhdHVyYXRlfHNlcGlhKVwoKFteKCldKig/OlwoLipcKSkqW14oKV0qKVwpKSs/L2lnKSxjPVtdO3JldHVybiBvJiZvLmZvckVhY2gobT0+e2NvbnN0IHU9bS5tYXRjaChpKTtpZighdSl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGZpdGxlciBzdHJpbmcuIik7bGV0WyxwLHldPXU7cD1wLnRvTG93ZXJDYXNlKCkseT15LnRyaW0oKS5tYXRjaCgvKFteKCApXSt8KFteKCApXStcKC4qXCkpKSg/PVxzfCQpL2cpLm1hcCgoTyx4KT0+e2xldCB2O3JldHVybiBwPT09InVybCJ8fHA9PT0iZHJvcC1zaGFkb3ciJiZ4PT09Mz92PU86dj1PYmplY3QoZS50b051bWJlcikoTyksLyUkLy50ZXN0KE8pJiYodi89MTAwKSx2fSksYy5wdXNoKHt0eXBlOnAsYXJnczp5fSl9KSxjfWZ1bmN0aW9uIGEocyxpKXtzLmNsZWFyRmlsdGVyKCksaSYmaS5mb3JFYWNoKCh7dHlwZTpvLGFyZ3M6Y30pPT57bGV0IG09bzttPT09ImRyb3Atc2hhZG93Ij9tPSJkcm9wU2hhZG93IjptPT09Imh1ZS1yb3RhdGUiJiYobT0iaHVlUm90YXRlIiksc1ttXSguLi5jKX0pfX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gZX0pLHQoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtmdW5jdGlvbiBlKG4sYSl7aWYoIWEpcmV0dXJuO2NvbnN0IHM9bi5nZXRMaXN0ZW5lcnMoImJlZm9yZXJlbmRlciIpLGk9bi5nZXRMaXN0ZW5lcnMoImFmdGVycmVuZGVyIik7cy5sZW5ndGgmJiFhLmJlZm9yZVJlbmRlcj9hLmJlZm9yZVJlbmRlcj1vPT57bi5kaXNwYXRjaEV2ZW50KHt0eXBlOiJiZWZvcmVyZW5kZXIiLGRldGFpbDp7Y29udGV4dDpvfX0pfTpzLmxlbmd0aHx8KGEuYmVmb3JlUmVuZGVyPW51bGwpLGkubGVuZ3RoJiYhYS5hZnRlclJlbmRlcj9hLmFmdGVyUmVuZGVyPW89PntuLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImFmdGVycmVuZGVyIixkZXRhaWw6e2NvbnRleHQ6b319KX06aS5sZW5ndGh8fChhLmFmdGVyUmVuZGVyPW51bGwpfX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gY30pO3ZhciBlPXQoMTIpLG49dCgyMTgpLGE9dCg3MCkscz10KDIxMyk7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2NvbnN0IGk9U3ltYm9sKCJhbW91bnQiKSxvPVN5bWJvbCgibWVzaENsb3VkIik7Y2xhc3MgYyBleHRlbmRzIGEuZGVmYXVsdHtjb25zdHJ1Y3Rvcih1LHA9MSl7c3VwZXIoKSx0aGlzLm1lc2hOb2RlPXUsdS5jb25uZWN0KHRoaXMpLHRoaXNbaV09cCx0aGlzW29dPW51bGx9Z2V0IG1lc2hDbG91ZCgpe2NvbnN0IHU9dGhpcy5tZXNoTm9kZSxwPXRoaXNbaV07cmV0dXJuIXRoaXNbb10mJnUubWVzaCYmKHRoaXNbb109bmV3IGUuTWVzaENsb3VkKHUubWVzaCxwKSksdGhpc1tvXX1nZXQgaXNWaXNpYmxlKCl7cmV0dXJuISF0aGlzLm1lc2hOb2RlJiZ0aGlzLm1lc2hOb2RlLmlzVmlzaWJsZX1nZXQgYW1vdW50KCl7cmV0dXJuIHRoaXNbaV19c2V0IGFtb3VudCh1KXt0aGlzW2ldPXUsdGhpc1tvXSYmKHRoaXNbb10uYW1vdW50PXUpfWJyaWdodG5lc3ModSxwKXt0aGlzLm1lc2hDbG91ZCYmKHRoaXMubWVzaENsb3VkLmJyaWdodG5lc3ModSxwKSx0aGlzLmZvcmNlVXBkYXRlKCkpfWNvbnRyYXN0KHUscCl7dGhpcy5tZXNoQ2xvdWQmJih0aGlzLm1lc2hDbG91ZC5jb250cmFzdCh1LHApLHRoaXMuZm9yY2VVcGRhdGUoKSl9ZGVsZXRlKHUpe3RoaXMubWVzaENsb3VkJiYodGhpcy5tZXNoQ2xvdWQuZGVsZXRlKHUpLHRoaXNbaV0tLSx0aGlzLmZvcmNlVXBkYXRlKCkpfWRyYXcodT1bXSl7aWYoc3VwZXIuZHJhdyh1KSx0aGlzLm1lc2hDbG91ZCl7aWYodGhpcy5wcm9ncmFtKXt0aGlzLm1lc2hDbG91ZC5zZXRQcm9ncmFtKHRoaXMucHJvZ3JhbSk7Y29uc3QgcD10aGlzLnNoYWRlckF0dHJzO3AmJk9iamVjdC5lbnRyaWVzKHApLmZvckVhY2goKFtPLHhdKT0+e3RoaXMubWVzaENsb3VkLm1lc2guc2V0QXR0cmlidXRlKE8seCl9KTtjb25zdCB5PXRoaXMudW5pZm9ybXM7aWYodGhpcy51bmlmb3Jtcyl7Y29uc3QgTz17fTtPYmplY3QuZW50cmllcyh5KS5mb3JFYWNoKChbeCx2XSk9Pnt0eXBlb2Ygdj09ImZ1bmN0aW9uIiYmKHY9dih0aGlzLHgpKSxPW3hdPXZ9KSx0aGlzLm1lc2hDbG91ZC5tZXNoLnNldFVuaWZvcm1zKE8pfX10aGlzLm1lc2hOb2RlLnRleHR1cmVJbWFnZSYmT2JqZWN0KG4uZHJhd1RleHR1cmUpKHRoaXMubWVzaE5vZGUsdGhpcy5tZXNoTm9kZS5tZXNoKSx1LnB1c2godGhpcy5tZXNoQ2xvdWQpfXJldHVybiB1fWdldFRyYW5zZm9ybSh1KXtpZih0aGlzLm1lc2hDbG91ZClyZXR1cm4gdGhpcy5tZXNoQ2xvdWQuZ2V0VHJhbnNmb3JtKHUpfWdyYXlzY2FsZSh1LHApe3RoaXMubWVzaENsb3VkJiYodGhpcy5tZXNoQ2xvdWQuZ3JheXNjYWxlKHUscCksdGhpcy5mb3JjZVVwZGF0ZSgpKX1odWVSb3RhdGUodSxwKXt0aGlzLm1lc2hDbG91ZCYmKHRoaXMubWVzaENsb3VkLmh1ZVJvdGF0ZSh1LHApLHRoaXMuZm9yY2VVcGRhdGUoKSl9aW52ZXJ0KHUscCl7dGhpcy5tZXNoQ2xvdWQmJih0aGlzLm1lc2hDbG91ZC5pbnZlcnQodSxwKSx0aGlzLmZvcmNlVXBkYXRlKCkpfWlzUG9pbnRDb2xsaXNpb24odSxwKXtpZighdGhpcy5tZXNoQ2xvdWQpcmV0dXJuITE7Y29uc3QgeT10aGlzLmF0dHJpYnV0ZXMucG9pbnRlckV2ZW50cztpZih5PT09Im5vbmUifHx5IT09ImFsbCImJiF0aGlzLmlzVmlzaWJsZSlyZXR1cm4hMTtsZXQgTz0iYm90aCI7eT09PSJ2aXNpYmxlRmlsbCImJihPPSJmaWxsIikseT09PSJ2aXNpYmxlU3Ryb2tlIiYmKE89InN0cm9rZSIpO2ZvcihsZXQgeD0wO3g8dGhpc1tpXTt4KyspaWYoIXRoaXMubWVzaENsb3VkLmlzUG9pbnRDb2xsaXNpb24oeCxbdSxwXSxPKSlyZXR1cm4hMTtyZXR1cm4hMH1zZXRPcGFjaXR5KHUscCl7dGhpcy5tZXNoQ2xvdWQmJih0aGlzLm1lc2hDbG91ZC5vcGFjaXR5KHUscCksdGhpcy5mb3JjZVVwZGF0ZSgpKX1yb3RhdGUodSxwLFt5LE9dPVswLDBdKXtjb25zdCB4PU1hdGguUEkqcC8xODA7aWYodGhpcy5tZXNoQ2xvdWQpe2NvbnN0e3g6dix5OlR9PXRoaXMubWVzaE5vZGUuYXR0cmlidXRlczt0aGlzLm1lc2hDbG91ZC5yb3RhdGUodSx4LFt5K3YsTytUXSksdGhpcy5mb3JjZVVwZGF0ZSgpfX1zYXR1cmF0ZSh1LHApe3RoaXMubWVzaENsb3VkJiYodGhpcy5tZXNoQ2xvdWQuc2F0dXJhdGUodSxwKSx0aGlzLmZvcmNlVXBkYXRlKCkpfXNjYWxlKHUsW3AseT1wXSxbTyx4XT1bMCwwXSl7aWYodGhpcy5tZXNoQ2xvdWQpe2NvbnN0e3g6dix5OlR9PXRoaXMubWVzaE5vZGUuYXR0cmlidXRlcyxsPTFlLTU7TWF0aC5hYnMocCk8bCYmKHA9MS9wPjA/bDotbCksTWF0aC5hYnMoeSk8bCYmKHk9MS95PjA/bDotbCksdGhpcy5tZXNoQ2xvdWQuc2NhbGUodSxbcCx5XSxbTyt2LHgrVF0pLHRoaXMuZm9yY2VVcGRhdGUoKX19c2V0Q29sb3JUcmFuc2Zvcm0odSxwKXt0aGlzLm1lc2hDbG91ZCYmKHRoaXMubWVzaENsb3VkLnNldENvbG9yVHJhbnNmb3JtKHUscCksdGhpcy5mb3JjZVVwZGF0ZSgpKX1zZXRGaWxsQ29sb3IodSxwKXt0aGlzLm1lc2hDbG91ZCYmKEFycmF5LmlzQXJyYXkocCkmJihwPVsuLi5wXSxwWzBdLz0yNTUscFsxXS89MjU1LHBbMl0vPTI1NSksdGhpcy5tZXNoQ2xvdWQuc2V0RmlsbENvbG9yKHUscCksdGhpcy5mb3JjZVVwZGF0ZSgpKX1zZXBpYSh1LHApe3RoaXMubWVzaENsb3VkJiYodGhpcy5tZXNoQ2xvdWQuc2VwaWEodSxwKSx0aGlzLmZvcmNlVXBkYXRlKCkpfXNldFJlc29sdXRpb24oe3dpZHRoOnUsaGVpZ2h0OnB9KXtzdXBlci5zZXRSZXNvbHV0aW9uKHt3aWR0aDp1LGhlaWdodDpwfSksdGhpcy5tZXNoTm9kZS5zZXRSZXNvbHV0aW9uKHt3aWR0aDp1LGhlaWdodDpwfSl9c2V0U3Ryb2tlQ29sb3IodSxwKXt0aGlzLm1lc2hDbG91ZCYmKEFycmF5LmlzQXJyYXkocCkmJihwPVsuLi5wXSxwWzBdLz0yNTUscFsxXS89MjU1LHBbMl0vPTI1NSksdGhpcy5tZXNoQ2xvdWQuc2V0U3Ryb2tlQ29sb3IodSxwKSx0aGlzLmZvcmNlVXBkYXRlKCkpfXNldFRyYW5zZm9ybSh1LHApe3RoaXMubWVzaENsb3VkJiYodGhpcy5tZXNoQ2xvdWQuc2V0VHJhbnNmb3JtKHUscCksdGhpcy5mb3JjZVVwZGF0ZSgpKX1za2V3KHUsW3AseT1wXSxbTyx4XT1bMCwwXSl7aWYodGhpcy5tZXNoQ2xvdWQpe2NvbnN0e3g6dix5OlR9PXRoaXMubWVzaE5vZGUuYXR0cmlidXRlczt0aGlzLm1lc2hDbG91ZC5za2V3KHUsW3AseV0sW08rdix4K1RdKSx0aGlzLmZvcmNlVXBkYXRlKCl9fXRyYW5zZm9ybSh1LHApe3RoaXMubWVzaENsb3VkJiYodGhpcy5tZXNoQ2xvdWQudHJhbnNmb3JtKHUscCksdGhpcy5mb3JjZVVwZGF0ZSgpKX10cmFuc2Zvcm1Db2xvcih1LHApe3RoaXMubWVzaENsb3VkJiYodGhpcy5tZXNoQ2xvdWQudHJhbnNmb3JtQ29sb3IodSxwKSx0aGlzLmZvcmNlVXBkYXRlKCkpfXRyYW5zbGF0ZSh1LFtwLHldKXt0aGlzLm1lc2hDbG91ZCYmKHRoaXMubWVzaENsb3VkLnRyYW5zbGF0ZSh1LFtwLHldKSx0aGlzLmZvcmNlVXBkYXRlKCkpfXVwZGF0ZU1lc2goKXt0aGlzW29dJiYodGhpc1tvXS5tZXNoPXRoaXMubWVzaE5vZGUubWVzaCx0aGlzLmZvcmNlVXBkYXRlKCkpfX1zLmRlZmF1bHQucmVnaXN0ZXJOb2RlKGMsImNsb3VkIil9LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImxvYWRUZXh0dXJlIixmdW5jdGlvbigpe3JldHVybiBzfSksdC5kKHIsImFwcGx5VGV4dHVyZSIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pLHQuZChyLCJjcmVhdGVUZXh0dXJlIixmdW5jdGlvbigpe3JldHVybiBjfSksdC5kKHIsImRlbGV0ZVRleHR1cmUiLGZ1bmN0aW9uKCl7cmV0dXJuIG19KSx0LmQociwiZHJhd1RleHR1cmUiLGZ1bmN0aW9uKCl7cmV0dXJuIHB9KSx0LmQociwibG9hZEZyYW1lcyIsZnVuY3Rpb24oKXtyZXR1cm4geX0pO3ZhciBlPXQoMTIpLG49dCg3Mik7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2NvbnN0IGE9e307ZnVuY3Rpb24gcyhPLHgpe2lmKGFbT10pcmV0dXJuIGFbT107Y29uc3Qgdj1lLkVOVi5sb2FkSW1hZ2UoTyx7YWxpYXM6eCx1c2VJbWFnZUJpdG1hcDohMX0pO3JldHVybiB2Pz9PfWFzeW5jIGZ1bmN0aW9uIGkoTyx4LHYpe2xldCBUPXg7aWYodHlwZW9mIHg9PSJzdHJpbmciJiYoVD1zKHgpKSxUJiZ0eXBlb2YgVC50aGVuPT0iZnVuY3Rpb24iJiYoVD1hd2FpdCBUKSx4PT09Ty5hdHRyaWJ1dGVzLnRleHR1cmUpe1QmJlQuaW1hZ2UmJihULnNvdXJjZVJlY3QmJihPLmF0dHJpYnV0ZXMuc291cmNlUmVjdD1ULnNvdXJjZVJlY3QpLE8udGV4dHVyZUltYWdlUm90YXRlZD0hIVQucm90YXRlZCxUPVQuaW1hZ2UpO2NvbnN0e3dpZHRoOmwsaGVpZ2h0OmgsdGV4dHVyZVJlY3Q6Zn09Ty5hdHRyaWJ1dGVzLGc9Ty50ZXh0dXJlSW1hZ2U7Ty50ZXh0dXJlSW1hZ2U9VCx2JiZnIT09VCYmIWYmJihsPT1udWxsfHxoPT1udWxsKSYmTy51cGRhdGVDb250b3VycygpLE8uZm9yY2VVcGRhdGUoKX1yZXR1cm4gVH1jb25zdCBvPVN5bWJvbCgidGV4dHVyZU1hcCIpO2Z1bmN0aW9uIGMoTyx4KXtpZih4W29dPXhbb118fG5ldyBNYXAseFtvXS5oYXMoTykpcmV0dXJuIHhbb10uZ2V0KE8pO2NvbnN0IHY9eC5jcmVhdGVUZXh0dXJlKE8pO3JldHVybiEvXmJsb2I6Ly50ZXN0KE8uc3JjKSYmdHlwZW9mIE8uZ2V0Q29udGV4dCE9ImZ1bmN0aW9uIiYmeFtvXS5zZXQoTyx2KSx2fWZ1bmN0aW9uIG0oTyx4KXtpZih4W29dJiZ4W29dLmhhcyhPKSl7Y29uc3Qgdj14W29dLmdldChPKTtyZXR1cm4geC5kZWxldGVUZXh0dXJlKHYpLHhbb10uZGVsZXRlKE8pLCEwfXJldHVybiExfWNvbnN0IHU9U3ltYm9sKCJ0ZXh0dXJlQ29udGV4dCIpO2Z1bmN0aW9uIHAoTyx4KXtjb25zdCB2PU8udGV4dHVyZUltYWdlIGluc3RhbmNlb2YgU3RyaW5nP1N0cmluZyhPLnRleHR1cmVJbWFnZSk6Ty50ZXh0dXJlSW1hZ2UsVD1PLnRleHR1cmVJbWFnZVJvdGF0ZWQsbD14LnRleHR1cmUsaD1PLnJlbmRlcmVyO2lmKHYpe2NvbnN0IGY9Ty5vcmlnaW5hbENvbnRlbnRSZWN0O2xldCBnPU8uYXR0cmlidXRlcy50ZXh0dXJlUmVjdDtjb25zdCBNPU8uYXR0cmlidXRlcy50ZXh0dXJlUmVwZWF0LEE9Ty5hdHRyaWJ1dGVzLnNvdXJjZVJlY3Q7aWYoIWx8fE9bdV0mJk9bdV0hPT1ofHxsLmltYWdlIT09dnx8bC5vcHRpb25zLnJlcGVhdCE9PU18fCFPYmplY3Qobi5jb21wYXJlVmFsdWUpKGwub3B0aW9ucy5yZWN0LGcpfHwhT2JqZWN0KG4uY29tcGFyZVZhbHVlKShsLm9wdGlvbnMuc3JjUmVjdCxBKSl7Y29uc3QgQz1jKHYsaCk7Zz8oZ1swXSs9ZlswXSxnWzFdKz1mWzFdKTpnPWY7bGV0IGI9bnVsbDtsJiYhaFtvXS5oYXMobC5pbWFnZSkmJighbC5vcHRpb25zfHwhbC5vcHRpb25zLmhpZGRlbikmJihiPXgudW5pZm9ybXMudV90ZXhTYW1wbGVyKSx4LnNldFRleHR1cmUoQyx7cmVjdDpnLHJlcGVhdDpNLHNyY1JlY3Q6QSxyb3RhdGVkOlR9KSxiJiZiLmRlbGV0ZSYmYi5kZWxldGUoKSxPW3VdPWh9fWVsc2UgaWYobCl7bGV0IGY9bnVsbDshaFtvXS5oYXMobC5pbWFnZSkmJighbC5vcHRpb25zfHwhbC5vcHRpb25zLmhpZGRlbikmJihmPXgudW5pZm9ybXMudV90ZXhTYW1wbGVyKSx4LnNldFRleHR1cmUobnVsbCksZiYmZi5kZWxldGUmJmYuZGVsZXRlKCl9fWFzeW5jIGZ1bmN0aW9uIHkoTyx4KXt0eXBlb2YgeD09InN0cmluZyImJih4PWF3YWl0KGF3YWl0IGZldGNoKHgse21ldGhvZDoiR0VUIixtb2RlOiJjb3JzIixjYWNoZToiZGVmYXVsdCJ9KSkuanNvbigpKTtjb25zdCB2PWF3YWl0IHMoTyksVD14LmZyYW1lcztyZXR1cm4gT2JqZWN0LmVudHJpZXMoVCkuZm9yRWFjaCgoW2wsaF0pPT57Y29uc3R7eDpmLHk6Zyx3Ok0saDpBfT1oLmZyYW1lO2xldCBDPVtmLGcsTSxBXTtjb25zdCBiPWgucm90YXRlZDtiJiYoQz1bQ1swXSxDWzFdLENbM10sQ1syXV0pLGFbbF09e2ltYWdlOnYsc291cmNlUmVjdDpDLHJvdGF0ZWQ6Yn19KSx2fX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4geX0pO3ZhciBlPXQoMSksbj10KDEyKSxhPXQoNzApLHM9dCgyMjApLGk9dCgyMjEpLG89dCgyMjIpLGM9dCgyMTMpLG09dCgyMjMpO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtmdW5jdGlvbiB1KE8seCx2KXtyZXR1cm4geCBpbiBPP09iamVjdC5kZWZpbmVQcm9wZXJ0eShPLHgse3ZhbHVlOnYsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTpPW3hdPXYsT31jb25zdCBwPVN5bWJvbCgibWVzaCIpO2NsYXNzIHkgZXh0ZW5kcyBhLmRlZmF1bHR7Y29uc3RydWN0b3IoeD17fSl7c3VwZXIoeCl9Z2V0IGJvcmRlclNpemUoKXtjb25zdHtwYWRkaW5nVG9wOngscGFkZGluZ1JpZ2h0OnYscGFkZGluZ0JvdHRvbTpULHBhZGRpbmdMZWZ0OmwsYm9yZGVyV2lkdGg6aH09dGhpcy5hdHRyaWJ1dGVzLFtmLGddPXRoaXMuY29udGVudFNpemU7cmV0dXJuW2wrZit2K2gseCtnK1QraF19Z2V0IGNsaWVudFNpemUoKXtjb25zdHtwYWRkaW5nVG9wOngscGFkZGluZ1JpZ2h0OnYscGFkZGluZ0JvdHRvbTpULHBhZGRpbmdMZWZ0Omx9PXRoaXMuYXR0cmlidXRlcyxbaCxmXT10aGlzLmNvbnRlbnRTaXplO3JldHVybltsK2grdix4K2YrVF19Z2V0IGNvbnRlbnRTaXplKCl7bGV0e3dpZHRoOngsaGVpZ2h0OnYsYm94U2l6aW5nOlQscGFkZGluZ1RvcDpsLHBhZGRpbmdSaWdodDpoLHBhZGRpbmdCb3R0b206ZixwYWRkaW5nTGVmdDpnfT10aGlzLmF0dHJpYnV0ZXM7aWYoeD14fHwwLHY9dnx8MCxUPT09ImJvcmRlci1ib3giKXtjb25zdCBNPTIqdGhpcy5hdHRyaWJ1dGVzLmJvcmRlcldpZHRoO3gtPU0raCtnLHYtPU0rbCtmLHg9TWF0aC5tYXgoMCx4KSx2PU1hdGgubWF4KDAsdil9cmV0dXJuW3gsdl19Z2V0IGhhc0JvcmRlcigpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXMuYm9yZGVyV2lkdGg+MH1nZXQgaXNWaXNpYmxlKCl7Y29uc3RbeCx2XT10aGlzLmJvcmRlclNpemU7cmV0dXJuIHg+MCYmdj4wfWdldCBtZXNoKCl7aWYodGhpcy5hdHRyaWJ1dGVzLmRpc3BsYXk9PT0ibm9uZSIpcmV0dXJuIG51bGw7Y29uc3QgeD10aGlzLmNsaWVudEJveDtpZih4KXtsZXQgdj10aGlzW3BdO2lmKHYpdi5ib3ghPT14JiYodi5jb250b3Vycz14LmNvbnRvdXJzLHYuYm94PXgpO2Vsc2V7dj1uZXcgbi5NZXNoMkQoeCksdi5ib3g9eDtjb25zdCBsPXRoaXMuYXR0cmlidXRlcy5iZ2NvbG9yO2lmKE9iamVjdChpLnNldEZpbGxDb2xvcikodix7Y29sb3I6bH0pLHRoaXMuaGFzQm9yZGVyKXtjb25zdHtib3JkZXJDb2xvcjpmLGJvcmRlcldpZHRoOmcsYm9yZGVyRGFzaDpNLGJvcmRlckRhc2hPZmZzZXQ6QX09dGhpcy5hdHRyaWJ1dGVzO09iamVjdChpLnNldFN0cm9rZUNvbG9yKSh2LHtjb2xvcjpmLGxpbmVXaWR0aDpnLGxpbmVEYXNoOk0sbGluZURhc2hPZmZzZXQ6QX0pfXRoaXNbcF09djtjb25zdCBoPXRoaXMuYXR0cmlidXRlcy5jbGlwUGF0aDtoJiZ0aGlzW3BdLnNldENsaXBQYXRoKGgpfWNvbnN0IFQ9dGhpcy5vcGFjaXR5O3JldHVybiB2LmdldE9wYWNpdHkoKSE9PVQmJnYuc2V0T3BhY2l0eShUKSx2LnNldFRyYW5zZm9ybSguLi50aGlzLnJlbmRlck1hdHJpeCksdn1yZXR1cm4gbnVsbH1nZXQgb2Zmc2V0U2l6ZSgpe2NvbnN0e3BhZGRpbmdUb3A6eCxwYWRkaW5nUmlnaHQ6dixwYWRkaW5nQm90dG9tOlQscGFkZGluZ0xlZnQ6bCxib3JkZXJXaWR0aDpofT10aGlzLmF0dHJpYnV0ZXMsW2YsZ109dGhpcy5jb250ZW50U2l6ZSxNPTIqaDtyZXR1cm5bbCtmK3YrTSx4K2crVCtNXX1nZXQgb3JpZ2luYWxDbGllbnRSZWN0KCl7aWYodGhpcy5tZXNoKXtjb25zdCB4PXRoaXMubWVzaC5ib3VuZGluZ0JveDtyZXR1cm5beFswXVswXSx4WzBdWzFdLHhbMV1bMF0teFswXVswXSx4WzFdWzFdLXhbMF1bMV1dfXJldHVyblswLDAsMCwwXX1nZXQgb3JpZ2luYWxDb250ZW50UmVjdCgpe2NvbnN0W3gsdixULGxdPXRoaXMub3JpZ2luYWxDbGllbnRSZWN0LGg9dGhpcy5hdHRyaWJ1dGVzLnBhZGRpbmc7cmV0dXJuW3graFswXSx2K2hbMV0sVC1oWzBdLWhbMl0sbC1oWzFdLWhbM11dfWdldEJvdW5kaW5nQ2xpZW50UmVjdCgpe2xldCB4PXRoaXMucmVuZGVyTWF0cml4O3RoaXMubGF5ZXImJnRoaXMubGF5ZXIubGF5ZXJUcmFuc2Zvcm1JbnZlcnQmJih4PWUubWF0MmQubXVsdGlwbHkoQXJyYXkub2YoMCwwLDAsMCwwLDApLHRoaXMubGF5ZXIudHJhbnNmb3JtTWF0cml4LHgpKTtsZXQgdj1udWxsO2lmKHRoaXMubWVzaCl7dj1bLi4udGhpcy5tZXNoLmJvdW5kaW5nQm94XTtjb25zdCBUPXRoaXMuYXR0cmlidXRlcy5ib3JkZXJXaWR0aDtUJiYodlswXT1bdlswXVswXS1ULHZbMF1bMV0tVF0sdlsxXT1bdlsxXVswXStULHZbMV1bMV0rVF0pfXJldHVybiBPYmplY3QobS5kZWZhdWx0KSh2LHgpfW9uUHJvcGVydHlDaGFuZ2UoeCx2LFQpe2lmKHN1cGVyLm9uUHJvcGVydHlDaGFuZ2UoeCx2LFQpLCh4PT09ImFuY2hvclgifHx4PT09ImFuY2hvclkifHx4PT09ImJveFNpemluZyJ8fHg9PT0id2lkdGgifHx4PT09ImhlaWdodCJ8fHg9PT0iYm9yZGVyV2lkdGgifHx4PT09InBhZGRpbmdMZWZ0Inx8eD09PSJwYWRkaW5nUmlnaHQifHx4PT09InBhZGRpbmdUb3AifHx4PT09InBhZGRpbmdCb3R0b20ifHwvXmJvcmRlcihUb3BMZWZ0fFRvcFJpZ2h0fEJvdHRvbVJpZ2h0fEJvdHRvbUxlZnQpUmFkaXVzJC8udGVzdCh4KSkmJnRoaXMudXBkYXRlQ29udG91cnMoKSx0aGlzW3BdJiZ4PT09ImNsaXBQYXRoIiYmdGhpc1twXS5zZXRDbGlwUGF0aCh2KSx0aGlzW3BdJiZ4PT09ImJnY29sb3IiJiZPYmplY3QoaS5zZXRGaWxsQ29sb3IpKHRoaXNbcF0se2NvbG9yOnZ9KSx0aGlzW3BdJiYoeD09PSJib3JkZXJDb2xvciJ8fHg9PT0iYm9yZGVyV2lkdGgifHx4PT09ImJvcmRlckRhc2gifHx4PT09ImJvcmRlckRhc2hPZmZzZXQiKSl7Y29uc3R7Ym9yZGVyQ29sb3I6bCxib3JkZXJXaWR0aDpoLGJvcmRlckRhc2g6Zixib3JkZXJEYXNoT2Zmc2V0Omd9PXRoaXMuYXR0cmlidXRlcztPYmplY3QoaS5zZXRTdHJva2VDb2xvcikodGhpc1twXSx7Y29sb3I6bCxsaW5lV2lkdGg6aCxsaW5lRGFzaDpoP2Y6MCxsaW5lRGFzaE9mZnNldDpnfSl9fXVwZGF0ZUNvbnRvdXJzKCl7Y29uc3R7YW5jaG9yWDp4LGFuY2hvclk6dixib3JkZXJXaWR0aDpULGJvcmRlclJhZGl1czpsfT10aGlzLmF0dHJpYnV0ZXMsW2gsZl09dGhpcy5ib3JkZXJTaXplLGc9dGhpcy5vZmZzZXRTaXplLE09LjUqVCxBPS14KmdbMF0rTSxDPS12KmdbMV0rTTt0aGlzLmNsaWVudEJveD1uZXcgbi5GaWd1cmUyRCxPYmplY3Qoby5jcmVhdGVSYWRpdXNCb3gpKHRoaXMuY2xpZW50Qm94LFtBLEMsaCxmXSxsKX19dSh5LCJBdHRyIixzLmRlZmF1bHQpLGMuZGVmYXVsdC5yZWdpc3Rlck5vZGUoeSwiYmxvY2siKX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gbX0pO3ZhciBlPXQoNzEpLG49dCg3MiksYT10KDIyMSk7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2NvbnN0IHM9U3ltYm9sLmZvcigic3ByaXRlanNfc2V0QXR0cmlidXRlIiksaT1TeW1ib2wuZm9yKCJzcHJpdGVqc19nZXRBdHRyaWJ1dGUiKSxvPVN5bWJvbC5mb3IoInNwcml0ZWpzX3NldEF0dHJpYnV0ZURlZmF1bHQiKSxjPVN5bWJvbC5mb3IoInNwcml0ZWpzX2RlY2xhcmVBbGlhcyIpO2NsYXNzIG0gZXh0ZW5kcyBlLmRlZmF1bHR7Y29uc3RydWN0b3IocCl7c3VwZXIocCksdGhpc1tvXSh7YW5jaG9yWDowLGFuY2hvclk6MCx3aWR0aDp2b2lkIDAsaGVpZ2h0OnZvaWQgMCxib3JkZXJXaWR0aDowLGJvcmRlckNvbG9yOiJyZ2JhKDAsMCwwLDEpIixib3JkZXJEYXNoOnZvaWQgMCxib3JkZXJEYXNoT2Zmc2V0OjAsYm9yZGVyVG9wTGVmdFJhZGl1czpbMCwwXSxib3JkZXJUb3BSaWdodFJhZGl1czpbMCwwXSxib3JkZXJCb3R0b21SaWdodFJhZGl1czpbMCwwXSxib3JkZXJCb3R0b21MZWZ0UmFkaXVzOlswLDBdLGJnY29sb3I6InJnYmEoMCwwLDAsMCkiLHBhZGRpbmdUb3A6MCxwYWRkaW5nUmlnaHQ6MCxwYWRkaW5nQm90dG9tOjAscGFkZGluZ0xlZnQ6MCxib3hTaXppbmc6ImNvbnRlbnQtYm94IixjbGlwUGF0aDp2b2lkIDB9KSx0aGlzW2NdKCJhbmNob3IiLCJzaXplIiwiYm9yZGVyIiwiYm9yZGVyUmFkaXVzIiwicGFkZGluZyIpfWdldCBhbmNob3JYKCl7cmV0dXJuIHRoaXNbaV0oImFuY2hvclgiKX1zZXQgYW5jaG9yWChwKXt0aGlzW3NdKCJhbmNob3JYIixPYmplY3Qobi50b051bWJlcikocCkpfWdldCBhbmNob3JZKCl7cmV0dXJuIHRoaXNbaV0oImFuY2hvclkiKX1zZXQgYW5jaG9yWShwKXt0aGlzW3NdKCJhbmNob3JZIixPYmplY3Qobi50b051bWJlcikocCkpfWdldCBhbmNob3IoKXtyZXR1cm5bdGhpcy5hbmNob3JYLHRoaXMuYW5jaG9yWV19c2V0IGFuY2hvcihwKXtwPU9iamVjdChuLnRvQXJyYXkpKHApLEFycmF5LmlzQXJyYXkocCl8fChwPVtwLHBdKSx0aGlzLmFuY2hvclg9cFswXSx0aGlzLmFuY2hvclk9cFsxXX1nZXQgd2lkdGgoKXtyZXR1cm4gdGhpc1tpXSgid2lkdGgiKX1zZXQgd2lkdGgocCl7dGhpc1tzXSgid2lkdGgiLE9iamVjdChuLnRvTnVtYmVyKShwKSl9Z2V0IGhlaWdodCgpe3JldHVybiB0aGlzW2ldKCJoZWlnaHQiKX1zZXQgaGVpZ2h0KHApe3RoaXNbc10oImhlaWdodCIsT2JqZWN0KG4udG9OdW1iZXIpKHApKX1nZXQgc2l6ZSgpe3JldHVyblt0aGlzLndpZHRoLHRoaXMuaGVpZ2h0XX1zZXQgc2l6ZShwKXtwPU9iamVjdChuLnRvQXJyYXkpKHApLEFycmF5LmlzQXJyYXkocCl8fChwPVtwLHBdKSx0aGlzLndpZHRoPXBbMF0sdGhpcy5oZWlnaHQ9cFsxXX1nZXQgYm9yZGVyV2lkdGgoKXtyZXR1cm4gdGhpc1tpXSgiYm9yZGVyV2lkdGgiKX1zZXQgYm9yZGVyV2lkdGgocCl7dGhpc1tzXSgiYm9yZGVyV2lkdGgiLE9iamVjdChuLnRvTnVtYmVyKShwKSl9Z2V0IGJvcmRlckNvbG9yKCl7cmV0dXJuIHRoaXNbaV0oImJvcmRlckNvbG9yIil9c2V0IGJvcmRlckNvbG9yKHApe3RoaXNbc10oImJvcmRlckNvbG9yIixPYmplY3QoYS5wYXJzZUNvbG9yKShwKSl9Z2V0IGJvcmRlcigpe3JldHVyblt0aGlzLmJvcmRlcldpZHRoLHRoaXMuYm9yZGVyQ29sb3JdfXNldCBib3JkZXIocCl7cD1PYmplY3Qobi50b0FycmF5KShwKSxBcnJheS5pc0FycmF5KHApfHwocD1bcF0pLHRoaXMuYm9yZGVyV2lkdGg9cFswXSxwWzFdIT1udWxsJiYodGhpcy5ib3JkZXJDb2xvcj1wWzFdKX1nZXQgYm9yZGVyRGFzaCgpe3JldHVybiB0aGlzW2ldKCJib3JkZXJEYXNoIil9c2V0IGJvcmRlckRhc2gocCl7cD1PYmplY3Qobi50b0FycmF5KShwLCEwKSxwIT1udWxsJiYhQXJyYXkuaXNBcnJheShwKSYmKHA9W3BdKSx0aGlzW3NdKCJib3JkZXJEYXNoIixwP3AubWFwKG4udG9OdW1iZXIpOm51bGwpfWdldCBib3JkZXJEYXNoT2Zmc2V0KCl7cmV0dXJuIHRoaXNbaV0oImJvcmRlckRhc2hPZmZzZXQiKX1zZXQgYm9yZGVyRGFzaE9mZnNldChwKXt0aGlzW3NdKCJib3JkZXJEYXNoT2Zmc2V0IixPYmplY3Qobi50b051bWJlcikocCkpfWdldCBib3JkZXJUb3BMZWZ0UmFkaXVzKCl7cmV0dXJuIHRoaXNbaV0oImJvcmRlclRvcExlZnRSYWRpdXMiKX1zZXQgYm9yZGVyVG9wTGVmdFJhZGl1cyhwKXtwPU9iamVjdChuLnRvQXJyYXkpKHAsITApLEFycmF5LmlzQXJyYXkocCl8fChwPVtwLHBdKSx0aGlzW3NdKCJib3JkZXJUb3BMZWZ0UmFkaXVzIixwLm1hcChuLnRvTnVtYmVyKSl9Z2V0IGJvcmRlclRvcFJpZ2h0UmFkaXVzKCl7cmV0dXJuIHRoaXNbaV0oImJvcmRlclRvcFJpZ2h0UmFkaXVzIil9c2V0IGJvcmRlclRvcFJpZ2h0UmFkaXVzKHApe3A9T2JqZWN0KG4udG9BcnJheSkocCwhMCksQXJyYXkuaXNBcnJheShwKXx8KHA9W3AscF0pLHRoaXNbc10oImJvcmRlclRvcFJpZ2h0UmFkaXVzIixwLm1hcChuLnRvTnVtYmVyKSl9Z2V0IGJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzKCl7cmV0dXJuIHRoaXNbaV0oImJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzIil9c2V0IGJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzKHApe3A9T2JqZWN0KG4udG9BcnJheSkocCwhMCksQXJyYXkuaXNBcnJheShwKXx8KHA9W3AscF0pLHRoaXNbc10oImJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzIixwLm1hcChuLnRvTnVtYmVyKSl9Z2V0IGJvcmRlckJvdHRvbUxlZnRSYWRpdXMoKXtyZXR1cm4gdGhpc1tpXSgiYm9yZGVyQm90dG9tTGVmdFJhZGl1cyIpfXNldCBib3JkZXJCb3R0b21MZWZ0UmFkaXVzKHApe3A9T2JqZWN0KG4udG9BcnJheSkocCwhMCksQXJyYXkuaXNBcnJheShwKXx8KHA9W3AscF0pLHRoaXNbc10oImJvcmRlckJvdHRvbUxlZnRSYWRpdXMiLHAubWFwKG4udG9OdW1iZXIpKX1nZXQgYm9yZGVyUmFkaXVzKCl7cmV0dXJuWy4uLnRoaXMuYm9yZGVyVG9wTGVmdFJhZGl1cywuLi50aGlzLmJvcmRlclRvcFJpZ2h0UmFkaXVzLC4uLnRoaXMuYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMsLi4udGhpcy5ib3JkZXJCb3R0b21MZWZ0UmFkaXVzXX1zZXQgYm9yZGVyUmFkaXVzKHApe2lmKHA9T2JqZWN0KG4udG9BcnJheSkocCksIUFycmF5LmlzQXJyYXkocCkpcD1BcnJheSg4KS5maWxsKHApO2Vsc2UgaWYocC5sZW5ndGg9PT0yKXA9W3BbMF0scFsxXSxwWzBdLHBbMV0scFswXSxwWzFdLHBbMF0scFsxXV07ZWxzZSBpZihwLmxlbmd0aD09PTQpcD1bcFswXSxwWzFdLHBbMl0scFszXSxwWzBdLHBbMV0scFsyXSxwWzNdXTtlbHNlIGlmKHAubGVuZ3RoPT09NilwPVtwWzBdLHBbMV0scFsyXSxwWzNdLHBbNF0scFs1XSxwWzJdLHBbM11dO2Vsc2UgaWYocC5sZW5ndGghPT04KXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYm9yZGVyUmFkaXVzIHZhbHVlLiIpO3RoaXMuYm9yZGVyVG9wTGVmdFJhZGl1cz1bcFswXSxwWzFdXSx0aGlzLmJvcmRlclRvcFJpZ2h0UmFkaXVzPVtwWzJdLHBbM11dLHRoaXMuYm9yZGVyQm90dG9tUmlnaHRSYWRpdXM9W3BbNF0scFs1XV0sdGhpcy5ib3JkZXJCb3R0b21MZWZ0UmFkaXVzPVtwWzZdLHBbN11dfWdldCBiZ2NvbG9yKCl7cmV0dXJuIHRoaXNbaV0oImJnY29sb3IiKX1zZXQgYmdjb2xvcihwKXt0aGlzW3NdKCJiZ2NvbG9yIixPYmplY3QoYS5wYXJzZUNvbG9yKShwKSl9Z2V0IHBhZGRpbmdUb3AoKXtyZXR1cm4gdGhpc1tpXSgicGFkZGluZ1RvcCIpfXNldCBwYWRkaW5nVG9wKHApe3RoaXNbc10oInBhZGRpbmdUb3AiLE9iamVjdChuLnRvTnVtYmVyKShwKSl9Z2V0IHBhZGRpbmdSaWdodCgpe3JldHVybiB0aGlzW2ldKCJwYWRkaW5nUmlnaHQiKX1zZXQgcGFkZGluZ1JpZ2h0KHApe3RoaXNbc10oInBhZGRpbmdSaWdodCIsT2JqZWN0KG4udG9OdW1iZXIpKHApKX1nZXQgcGFkZGluZ0JvdHRvbSgpe3JldHVybiB0aGlzW2ldKCJwYWRkaW5nQm90dG9tIil9c2V0IHBhZGRpbmdCb3R0b20ocCl7dGhpc1tzXSgicGFkZGluZ0JvdHRvbSIsT2JqZWN0KG4udG9OdW1iZXIpKHApKX1nZXQgcGFkZGluZ0xlZnQoKXtyZXR1cm4gdGhpc1tpXSgicGFkZGluZ0xlZnQiKX1zZXQgcGFkZGluZ0xlZnQocCl7dGhpc1tzXSgicGFkZGluZ0xlZnQiLE9iamVjdChuLnRvTnVtYmVyKShwKSl9Z2V0IHBhZGRpbmcoKXtyZXR1cm5bdGhpcy5wYWRkaW5nVG9wLHRoaXMucGFkZGluZ1JpZ2h0LHRoaXMucGFkZGluZ0JvdHRvbSx0aGlzLnBhZGRpbmdMZWZ0XX1zZXQgcGFkZGluZyhwKXtwPU9iamVjdChuLnRvQXJyYXkpKHApLEFycmF5LmlzQXJyYXkocCk/cC5sZW5ndGg9PT0yP3A9W3BbMF0scFsxXSxwWzBdLHBbMV1dOnAubGVuZ3RoPT09MyYmKHA9W3BbMF0scFsxXSxwWzJdLHBbMV1dKTpwPVtwLHAscCxwXSx0aGlzLnBhZGRpbmdUb3A9cFswXSx0aGlzLnBhZGRpbmdSaWdodD1wWzFdLHRoaXMucGFkZGluZ0JvdHRvbT1wWzJdLHRoaXMucGFkZGluZ0xlZnQ9cFszXX1nZXQgY2xpcFBhdGgoKXtyZXR1cm4gdGhpc1tpXSgiY2xpcFBhdGgiKX1zZXQgY2xpcFBhdGgocCl7dGhpc1tzXSgiY2xpcFBhdGgiLHApfWdldCBib3hTaXppbmcoKXtyZXR1cm4gdGhpc1tpXSgiYm94U2l6aW5nIil9c2V0IGJveFNpemluZyhwKXtpZihwIT1udWxsJiZwIT09ImJvcmRlci1ib3giJiZwIT09ImNvbnRlbnQtYm94Iil0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGJveFNpemluZyB0eXBlLiIpO3RoaXNbc10oImJveFNpemluZyIscCl9fX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiR3JhZGllbnQiLGZ1bmN0aW9uKCl7cmV0dXJuIGF9KSx0LmQociwiaXNUcmFuc3BhcmVudCIsZnVuY3Rpb24oKXtyZXR1cm4gc30pLHQuZChyLCJwYXJzZUNvbG9yIixmdW5jdGlvbigpe3JldHVybiBpfSksdC5kKHIsInNldEZpbGxDb2xvciIsZnVuY3Rpb24oKXtyZXR1cm4gY30pLHQuZChyLCJzZXRTdHJva2VDb2xvciIsZnVuY3Rpb24oKXtyZXR1cm4gbX0pLHQuZChyLCJDb2xvciIsZnVuY3Rpb24oKXtyZXR1cm4gdX0pO3ZhciBlPXQoMzIpLG49dC5uKGUpO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtjbGFzcyBhe2NvbnN0cnVjdG9yKHt2ZWN0b3I6eSxjb2xvcnM6T30pe2lmKCFBcnJheS5pc0FycmF5KHkpfHx5Lmxlbmd0aCE9PTQmJnkubGVuZ3RoIT09NiYmeS5sZW5ndGghPT0zKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgZ3JhZGllbnQiKTt0aGlzLnZlY3Rvcj15LHRoaXMuY29sb3JzPU8ubWFwKCh7b2Zmc2V0OngsY29sb3I6dn0pPT4oe29mZnNldDp4LGNvbG9yOmkodil9KSl9dG9TdHJpbmcoKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoe3ZlY3Rvcjp0aGlzLnZlY3Rvcixjb2xvcnM6dGhpcy5jb2xvcnN9KX19ZnVuY3Rpb24gcyhwKXtyZXR1cm4gcCBpbnN0YW5jZW9mIGE/ITE6cD09bnVsbD8hMDpuKCkocClbM109PT0wfWZ1bmN0aW9uIGkocCl7aWYocD09bnVsbHx8KHB8fChwPSJ0cmFuc3BhcmVudCIpLHAgaW5zdGFuY2VvZiBhKSlyZXR1cm4gcDtjb25zdCB5PW4oKShwKTtpZigheXx8IXkubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgY29sb3IgdmFsdWUuIik7cmV0dXJuYHJnYmEoJHt5LmpvaW4oKX0pYH1mdW5jdGlvbiBvKHAseSxPKXtjb25zdCB4PXAuYm91bmRpbmdCb3hbMF07aWYoTy52ZWN0b3Ipe2xldHt2ZWN0b3I6dixjb2xvcnM6VH09Tzt2Lmxlbmd0aD09PTQ/KHY9W3ZbMF0reFswXSx2WzFdK3hbMV0sdlsyXSt4WzBdLHZbM10reFsxXV0scC5zZXRMaW5lYXJHcmFkaWVudCh7dmVjdG9yOnYsY29sb3JzOlQsdHlwZTp5fSkpOnYubGVuZ3RoPT09Mz8odj1bdlswXSt4WzBdLHZbMV0reFsxXSx2WzJdXSxwLnNldENpcmN1bGFyR3JhZGllbnQoe3ZlY3Rvcjp2LGNvbG9yczpULHR5cGU6eX0pKToodj1bdlswXSt4WzBdLHZbMV0reFsxXSx2WzJdLHZbM10reFswXSx2WzRdK3hbMV0sdls1XV0scC5zZXRSYWRpYWxHcmFkaWVudCh7dmVjdG9yOnYsY29sb3JzOlQsdHlwZTp5fSkpfWVsc2UgcC5ncmFkaWVudCYmcC5ncmFkaWVudFt5XSYmKGRlbGV0ZSBwLmdyYWRpZW50W3ldLGRlbGV0ZSBwLnVuaWZvcm1zLnVfcmFkaWFsR3JhZGllbnRWZWN0b3IpfWZ1bmN0aW9uIGMocCx7Y29sb3I6eSxydWxlOk89Im5vbnplcm8ifSl7cmV0dXJuIG8ocCwiZmlsbCIseSkseS52ZWN0b3J8fHAuc2V0RmlsbCh7Y29sb3I6eSxydWxlOk99KSxwfWZ1bmN0aW9uIG0ocCx7Y29sb3I6eSxsaW5lV2lkdGg6TyxsaW5lQ2FwOngsbGluZUpvaW46dixsaW5lRGFzaDpULGxpbmVEYXNoT2Zmc2V0OmwsbWl0ZXJMaW1pdDpoLHJvdW5kU2VnbWVudHM6Zn0pe28ocCwic3Ryb2tlIix5KSx5LnZlY3RvciYmKHk9WzAsMCwwLDFdKSxwLnNldFN0cm9rZSh7Y29sb3I6eSx0aGlja25lc3M6TyxjYXA6eCxqb2luOnYsbWl0ZXJMaW1pdDpoLGxpbmVEYXNoOlQsbGluZURhc2hPZmZzZXQ6bCxyb3VuZFNlZ21lbnRzOmZ9KX1jbGFzcyB1IGV4dGVuZHMgQXJyYXl7Y29uc3RydWN0b3IoeT0wLE89MCx4PTAsdj0wKXtyZXR1cm4gQXJyYXkuaXNBcnJheSh5KSYmKFt5LE8seCx2XT15KSx0eXBlb2YgeT09InN0cmluZyImJihbeSxPLHgsdl09bigpKHkpLHkvPTI1NSxPLz0yNTUseC89MjU1KSxzdXBlcih5LE8seCx2KSx0aGlzfWdldCByKCl7cmV0dXJuIE1hdGgucm91bmQodGhpc1swXSoyNTUpfXNldCByKHkpe3RoaXNbMF09eS8yNTV9Z2V0IGcoKXtyZXR1cm4gTWF0aC5yb3VuZCh0aGlzWzFdKjI1NSl9c2V0IGcoeSl7dGhpc1sxXT15LzI1NX1nZXQgYigpe3JldHVybiBNYXRoLnJvdW5kKHRoaXNbMl0qMjU1KX1zZXQgYih5KXt0aGlzWzJdPXkvMjU1fWdldCBhKCl7cmV0dXJuIHRoaXNbM119c2V0IGEoeSl7dGhpc1szXT15fWdldCBoZXgoKXtjb25zdCB5PWAwJHt0aGlzLnIudG9TdHJpbmcoMTYpfWAuc2xpY2UoLTIpLE89YDAke3RoaXMuZy50b1N0cmluZygxNil9YC5zbGljZSgtMikseD1gMCR7dGhpcy5iLnRvU3RyaW5nKDE2KX1gLnNsaWNlKC0yKTtsZXQgdjtyZXR1cm4gdGhpcy5hPDEmJih2PU1hdGgucm91bmQodGhpc1szXSoyNTUpLHY9YDAke3YudG9TdHJpbmcoMTYpfWAuc2xpY2UoLTIpKSxgIyR7eX0ke099JHt4fSR7dnx8IiJ9YH1nZXQgcmdiYSgpe3JldHVybmByZ2JhKCR7dGhpcy5yfSwke3RoaXMuZ30sJHt0aGlzLmJ9LCR7dGhpcy5hfSlgfWZyb21Db2xvcih5KXtyZXR1cm4gdHlwZW9mIHk9PSJzdHJpbmciJiYoeT1uKCkoeSkseVswXS89MjU1LHlbMV0vPTI1NSx5WzJdLz0yNTUpLHRoaXNbMF09eVswXSx0aGlzWzFdPXlbMV0sdGhpc1syXT15WzJdLHRoaXNbM109eVszXSx0aGlzfX19LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImNyZWF0ZVJhZGl1c0JveCIsZnVuY3Rpb24oKXtyZXR1cm4gbn0pLHQoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtmdW5jdGlvbiBlKGEscyxpLG8sYyxtPSJsZWZ0VG9wIil7Y29uc3QgdT0uNTUyMjg0OCxwPW8vMip1LHk9Yy8yKnUsTz1zK28seD1pK2Msdj1zK28vMixUPWkrYy8yO209PT0ibGVmdFRvcCI/KGEubW92ZVRvKHMsVCksYS5iZXppZXJDdXJ2ZVRvKHMsVC15LHYtcCxpLHYsaSkpOm09PT0icmlnaHRUb3AiP2EuYmV6aWVyQ3VydmVUbyh2K3AsaSxPLFQteSxPLFQpOm09PT0icmlnaHRCb3R0b20iP2EuYmV6aWVyQ3VydmVUbyhPLFQreSx2K3AseCx2LHgpOm09PT0ibGVmdEJvdHRvbSImJmEuYmV6aWVyQ3VydmVUbyh2LXAseCxzLFQreSxzLFQpfWZ1bmN0aW9uIG4oYSxbcyxpLG8sY10sbSl7aWYoIW18fEFycmF5LmlzQXJyYXkobSkmJm0uZXZlcnkodT0+dT09PTApKWEuYmVnaW5QYXRoKCksYS5yZWN0KHMsaSxvLGMpO2Vsc2V7dHlwZW9mIG09PSJudW1iZXIiJiYobT1BcnJheSg4KS5maWxsKG0pKTtjb25zdFt1LHAseSxPLHgsdixULGxdPW0ubWFwKChoLGYpPT5mJTI/TWF0aC5taW4oaCxjLzIpOk1hdGgubWluKGgsby8yKSk7YS5iZWdpblBhdGgoKSxhLm1vdmVUbyhzLGkrcCksZShhLHMsaSx1KjIscCoyLCJsZWZ0VG9wIiksYS5saW5lVG8ocytvLXksaSksZShhLHMrby15KjIsaSx5KjIsTyoyLCJyaWdodFRvcCIpLGEubGluZVRvKHMrbyxpK2MtdiksZShhLHMrby14KjIsaStjLXYqMix4KjIsdioyLCJyaWdodEJvdHRvbSIpLGEubGluZVRvKHMrVCxpK2MpLGUoYSxzLGkrYy1sKjIsVCoyLGwqMiwibGVmdEJvdHRvbSIpLGEuY2xvc2VQYXRoKCl9cmV0dXJuIGF9fSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KSxyLmRlZmF1bHQ9ZnVuY3Rpb24oZSxuKXtpZighZSlyZXR1cm57eDowLHk6MCx3aWR0aDowLGhlaWdodDowLGxlZnQ6MCx0b3A6MCxyaWdodDowLGJvdHRvbTowfTtjb25zdFtbYSxzXSxbaSxvXV09ZSxjPWEqblswXStzKm5bMl0rbls0XSxtPWEqblsxXStzKm5bM10rbls1XSx1PWkqblswXStzKm5bMl0rbls0XSxwPWkqblsxXStzKm5bM10rbls1XSx5PWkqblswXStvKm5bMl0rbls0XSxPPWkqblsxXStvKm5bM10rbls1XSx4PWEqblswXStvKm5bMl0rbls0XSx2PWEqblsxXStvKm5bM10rbls1XSxUPU1hdGgubWluKGMsdSx5LHgpLGw9TWF0aC5taW4obSxwLE8sdiksaD1NYXRoLm1heChjLHUseSx4KSxmPU1hdGgubWF4KG0scCxPLHYpO3JldHVybnt4OlQseTpsLHdpZHRoOmgtVCxoZWlnaHQ6Zi1sLGxlZnQ6VCx0b3A6bCxyaWdodDpoLGJvdHRvbTpmfX19LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImRlZmF1bHQiLGZ1bmN0aW9uKCl7cmV0dXJuIGN9KTt2YXIgZT10KDIxOCksbj10KDIxOSksYT10KDIyNSkscz10KDIxMyk7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2Z1bmN0aW9uIGkobSx1LHApe3JldHVybiB1IGluIG0/T2JqZWN0LmRlZmluZVByb3BlcnR5KG0sdSx7dmFsdWU6cCxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOm1bdV09cCxtfWNvbnN0IG89U3ltYm9sKCJ0ZXh0dXJlVGFzayIpO2NsYXNzIGMgZXh0ZW5kcyBuLmRlZmF1bHR7Y29uc3RydWN0b3IodT17fSl7dHlwZW9mIHU9PSJzdHJpbmciJiYodT17dGV4dHVyZTp1fSksc3VwZXIodSl9Z2V0IGNvbnRlbnRTaXplKCl7bGV0W3UscF09c3VwZXIuY29udGVudFNpemU7Y29uc3R7d2lkdGg6eSxoZWlnaHQ6T309dGhpcy5hdHRyaWJ1dGVzO2lmKHk9PW51bGx8fE89PW51bGwpe2NvbnN0IHg9dGhpcy50ZXh0dXJlSW1hZ2Usdj10aGlzLmF0dHJpYnV0ZXMudGV4dHVyZVJlY3QsVD10aGlzLmF0dHJpYnV0ZXMuc291cmNlUmVjdDtpZih2KXk9PW51bGwmJih1PXZbMF0rdlsyXSksTz09bnVsbCYmKHA9dlsxXSt2WzNdKTtlbHNlIGlmKFQpe2NvbnN0IGw9dGhpcy5sYXllcj90aGlzLmxheWVyLmRpc3BsYXlSYXRpbzoxO3k9PW51bGwmJih1PVRbMl0vbCksTz09bnVsbCYmKHA9VFszXS9sKX1lbHNlIGlmKHgpe2NvbnN0IGw9dGhpcy5sYXllcj90aGlzLmxheWVyLmRpc3BsYXlSYXRpbzoxO3k9PW51bGwmJih1PXgud2lkdGgvbCksTz09bnVsbCYmKHA9eC5oZWlnaHQvbCl9fXJldHVyblt1LHBdfWdldCB0ZXh0dXJlSW1hZ2VSZWFkeSgpe3JldHVybiB0aGlzW29dfHxQcm9taXNlLnJlc29sdmUoKX1kcmF3KHU9W10pe3N1cGVyLmRyYXcodSk7Y29uc3QgcD10aGlzLm1lc2g7cmV0dXJuIHAmJk9iamVjdChlLmRyYXdUZXh0dXJlKSh0aGlzLHApLHV9b25Qcm9wZXJ0eUNoYW5nZSh1LHAseSl7aWYoc3VwZXIub25Qcm9wZXJ0eUNoYW5nZSh1LHAseSksdT09PSJ0ZXh0dXJlIiYmKHRoaXNbb109T2JqZWN0KGUuYXBwbHlUZXh0dXJlKSh0aGlzLHAsITApKSx1PT09InRleHR1cmVSZWN0Iil7Y29uc3R7d2lkdGg6TyxoZWlnaHQ6eH09dGhpcy5hdHRyaWJ1dGVzOyhPPT1udWxsfHx4PT1udWxsKSYmdGhpcy51cGRhdGVDb250b3VycygpfX19aShjLCJBdHRyIixhLmRlZmF1bHQpLHMuZGVmYXVsdC5yZWdpc3Rlck5vZGUoYywic3ByaXRlIil9LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImRlZmF1bHQiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KTt2YXIgZT10KDIyMCk7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2NvbnN0IG49U3ltYm9sLmZvcigic3ByaXRlanNfc2V0QXR0cmlidXRlRGVmYXVsdCIpLGE9U3ltYm9sLmZvcigic3ByaXRlanNfc2V0QXR0cmlidXRlIikscz1TeW1ib2wuZm9yKCJzcHJpdGVqc19nZXRBdHRyaWJ1dGUiKTtjbGFzcyBpIGV4dGVuZHMgZS5kZWZhdWx0e2NvbnN0cnVjdG9yKGMpe3N1cGVyKGMpLHRoaXNbbl0oe3RleHR1cmU6dm9pZCAwLHRleHR1cmVSZWN0OnZvaWQgMCx0ZXh0dXJlUmVwZWF0OiExLHNvdXJjZVJlY3Q6dm9pZCAwfSl9Z2V0IHRleHR1cmUoKXtyZXR1cm4gdGhpc1tzXSgidGV4dHVyZSIpfXNldCB0ZXh0dXJlKGMpe3RoaXNbYV0oInRleHR1cmUiLGMpfWdldCB0ZXh0dXJlUmVjdCgpe3JldHVybiB0aGlzW3NdKCJ0ZXh0dXJlUmVjdCIpfXNldCB0ZXh0dXJlUmVjdChjKXt0aGlzW2FdKCJ0ZXh0dXJlUmVjdCIsYyl9Z2V0IHNvdXJjZVJlY3QoKXtyZXR1cm4gdGhpc1tzXSgic291cmNlUmVjdCIpfXNldCBzb3VyY2VSZWN0KGMpe3RoaXNbYV0oInNvdXJjZVJlY3QiLGMpfWdldCB0ZXh0dXJlUmVwZWF0KCl7cmV0dXJuIHRoaXNbc10oInRleHR1cmVSZXBlYXQiKX1zZXQgdGV4dHVyZVJlcGVhdChjKXt0aGlzW2FdKCJ0ZXh0dXJlUmVwZWF0IiwhIWMpfX19LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImRlZmF1bHQiLGZ1bmN0aW9uKCl7cmV0dXJuIE99KTt2YXIgZT10KDEyKSxuPXQoMjI3KSxhPXQubihuKSxzPXQoNzApLGk9dCgyMjgpLG89dCgyMjEpLGM9dCgyMTgpLG09dCgyMTMpLHU9dCgyMjMpO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtmdW5jdGlvbiBwKHgsdixUKXtyZXR1cm4gdiBpbiB4P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh4LHYse3ZhbHVlOlQsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp4W3ZdPVQseH1jb25zdCB5PVN5bWJvbCgibWVzaCIpO2NsYXNzIE8gZXh0ZW5kcyBzLmRlZmF1bHR7Y29uc3RydWN0b3Iodj17fSl7dHlwZW9mIHY9PSJzdHJpbmciJiYodj17ZDp2fSksc3VwZXIodiksdGhpcy5lZmZlY3RzPXtkKFQsbCxoLGYsZyl7Y29uc3QgTT0oaC1mKS8oZy1mKTtpZihNPD0wKXJldHVybiBUO2lmKE0+PTEpcmV0dXJuIGw7Y29uc3QgQT1hLmEuX3ByZXByb2Nlc3NpbmcoYS5hLnBhdGgyc2hhcGVzKFQpLGEuYS5wYXRoMnNoYXBlcyhsKSksQz1hLmEuX2xlcnAoLi4uQSxNKVswXTtyZXR1cm4gQy5yZWR1Y2UoKEUsTCk9PmAke0V9JHtMLnNsaWNlKDIpLmpvaW4oIiAiKX0gYCxgTSR7Q1swXVswXX0gJHtDWzBdWzFdfUNgKS50cmltKCl9fX1nZXQgaXNWaXNpYmxlKCl7cmV0dXJuISF0aGlzLmR9Z2V0IG1lc2goKXtpZih0aGlzLmF0dHJpYnV0ZXMuZGlzcGxheT09PSJub25lIilyZXR1cm4gbnVsbDtjb25zdCB2PXRoaXMucGF0aDtpZih2KXtsZXQgVD10aGlzW3ldO2lmKFQpVC5wYXRoIT09diYmKFQuY29udG91cnM9di5jb250b3VycyxULnBhdGg9dik7ZWxzZXtUPW5ldyBlLk1lc2gyRCh0aGlzLnBhdGgpLFQucGF0aD12O2NvbnN0IGg9dGhpcy5hdHRyaWJ1dGVzLmZpbGxDb2xvcixmPXRoaXMuYXR0cmlidXRlcy5maWxsUnVsZTtoJiZPYmplY3Qoby5zZXRGaWxsQ29sb3IpKFQse2NvbG9yOmgscnVsZTpmfSk7Y29uc3QgZz10aGlzLmF0dHJpYnV0ZXMubGluZVdpZHRoLE09dGhpcy5hdHRyaWJ1dGVzLnN0cm9rZUNvbG9yO2lmKE0mJmc+MCl7Y29uc3R7bGluZUNhcDpDLGxpbmVKb2luOmIsbWl0ZXJMaW1pdDpFLGxpbmVEYXNoOkwsbGluZURhc2hPZmZzZXQ6RCxyb3VuZFNlZ21lbnRzOkl9PXRoaXMuYXR0cmlidXRlcztPYmplY3Qoby5zZXRTdHJva2VDb2xvcikoVCx7Y29sb3I6TSxsaW5lV2lkdGg6ZyxsaW5lQ2FwOkMsbGluZUpvaW46YixtaXRlckxpbWl0OkUsbGluZURhc2g6TCxsaW5lRGFzaE9mZnNldDpELHJvdW5kU2VnbWVudHM6SX0pfXRoaXNbeV09VDtjb25zdCBBPXRoaXMuYXR0cmlidXRlcy5jbGlwUGF0aDtBJiZ0aGlzW3ldLnNldENsaXBQYXRoKEEpfWNvbnN0IGw9dGhpcy5vcGFjaXR5O3JldHVybiBULmdldE9wYWNpdHkoKSE9PWwmJlQuc2V0T3BhY2l0eShsKSxULnNldFRyYW5zZm9ybSguLi50aGlzLnJlbmRlck1hdHJpeCksVH1yZXR1cm4gbnVsbH1nZXQgb3JpZ2luYWxDb250ZW50UmVjdCgpe2lmKHRoaXMucGF0aCl7Y29uc3Qgdj10aGlzLnBhdGguYm91bmRpbmdCb3g7cmV0dXJuW3ZbMF1bMF0sdlswXVsxXSx2WzFdWzBdLXZbMF1bMF0sdlsxXVsxXS12WzBdWzFdXX1yZXR1cm5bMCwwLDAsMF19Z2V0IG9yaWdpbmFsQ2xpZW50UmVjdCgpe2lmKHRoaXMubWVzaCl7Y29uc3Qgdj10aGlzLm1lc2guYm91bmRpbmdCb3g7cmV0dXJuW3ZbMF1bMF0sdlswXVsxXSx2WzFdWzBdLXZbMF1bMF0sdlsxXVsxXS12WzBdWzFdXX1yZXR1cm5bMCwwLDAsMF19Z2V0IG9yaWdpbmFsQ2xpZW50Q2VudGVyKCl7cmV0dXJuIHRoaXMubWVzaD90aGlzLm1lc2guYm91bmRpbmdDZW50ZXI6WzAsMF19c2V0IGQodil7dGhpcy5hdHRyaWJ1dGVzLmQ9dn1nZXQgZCgpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXMuZH1kcmF3KHY9W10pe3N1cGVyLmRyYXcodik7Y29uc3QgVD10aGlzLm1lc2g7cmV0dXJuIFQmJk9iamVjdChjLmRyYXdUZXh0dXJlKSh0aGlzLFQpLHZ9Z2V0Qm91bmRpbmdDbGllbnRSZWN0KCl7bGV0IHY9bnVsbDtyZXR1cm4gdGhpcy5tZXNoJiYodj10aGlzLm1lc2guYm91bmRpbmdCb3gpLE9iamVjdCh1LmRlZmF1bHQpKHYsdGhpcy5yZW5kZXJNYXRyaXgpfWdldFBhdGhMZW5ndGgoKXtyZXR1cm4gdGhpcy5tZXNoP3RoaXMubWVzaC5nZXRUb3RhbExlbmd0aCgpOjB9Z2V0UG9pbnRBdExlbmd0aCh2KXtpZih0aGlzLm1lc2gpe2NvbnN0IFQ9dGhpcy5tZXNoLmdldFBvaW50QXRMZW5ndGgodik7aWYoVClyZXR1cm5bVC54LFQueV19cmV0dXJuWzAsMF19b25Qcm9wZXJ0eUNoYW5nZSh2LFQsbCl7aWYoc3VwZXIub25Qcm9wZXJ0eUNoYW5nZSh2LFQsbCksKHY9PT0iZCJ8fHY9PT0ibm9ybWFsaXplIikmJnRoaXMudXBkYXRlQ29udG91cnMoKSx0aGlzW3ldJiYodj09PSJmaWxsQ29sb3IifHx2PT09ImZpbGxSdWxlIikpe2NvbnN0e2ZpbGxDb2xvcjpoLGZpbGxSdWxlOmZ9PXRoaXMuYXR0cmlidXRlcztPYmplY3Qoby5zZXRGaWxsQ29sb3IpKHRoaXNbeV0se2NvbG9yOmgscnVsZTpmfSl9aWYodGhpc1t5XSYmKHY9PT0ic3Ryb2tlQ29sb3IifHx2PT09ImxpbmVXaWR0aCJ8fHY9PT0ibGluZUNhcCJ8fHY9PT0ibGluZUpvaW4ifHx2PT09ImxpbmVEYXNoInx8dj09PSJsaW5lRGFzaE9mZnNldCJ8fHY9PT0icm91bmRTZWdtZW50cyIpKXtjb25zdHtzdHJva2VDb2xvcjpoLGxpbmVXaWR0aDpmfT10aGlzLmF0dHJpYnV0ZXM7aWYoaCYmZj4wKXtjb25zdHtsaW5lQ2FwOmcsbGluZUpvaW46TSxsaW5lRGFzaDpBLGxpbmVEYXNoT2Zmc2V0OkMsbWl0ZXJMaW1pdDpiLHJvdW5kU2VnbWVudHM6RX09dGhpcy5hdHRyaWJ1dGVzO09iamVjdChvLnNldFN0cm9rZUNvbG9yKSh0aGlzW3ldLHtjb2xvcjpoLGxpbmVDYXA6ZyxsaW5lSm9pbjpNLGxpbmVXaWR0aDpmLGxpbmVEYXNoOkEsbGluZURhc2hPZmZzZXQ6QyxtaXRlckxpbWl0OmIscm91bmRTZWdtZW50czpFfSl9fXRoaXNbeV0mJnY9PT0iY2xpcFBhdGgiJiZ0aGlzW3ldLnNldENsaXBQYXRoKFQpLHY9PT0idGV4dHVyZSImJk9iamVjdChjLmFwcGx5VGV4dHVyZSkodGhpcyxUKX11cGRhdGVDb250b3Vycygpe3RoaXMucGF0aD1uZXcgZS5GaWd1cmUyRCx0aGlzLnBhdGguYWRkUGF0aCh0aGlzLmF0dHJpYnV0ZXMuZCksdGhpcy5hdHRyaWJ1dGVzLm5vcm1hbGl6ZSYmdGhpcy5wYXRoLm5vcm1hbGl6ZSguLi50aGlzLnBhdGguYm91bmRpbmdDZW50ZXIpfX1wKE8sIkF0dHIiLGkuZGVmYXVsdCksbS5kZWZhdWx0LnJlZ2lzdGVyTm9kZShPLCJwYXRoIil9LGZ1bmN0aW9uKGQscix0KXsoZnVuY3Rpb24oZSxuKXtkLmV4cG9ydHM9bigpfSkodGhpcyxmdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gTChELEkpe3ZhciBSPVtdLEI9ITAsej0hMSxLPXZvaWQgMDt0cnl7Zm9yKHZhciBRPURbU3ltYm9sLml0ZXJhdG9yXSgpLF87IShCPShfPVEubmV4dCgpKS5kb25lKSYmKFIucHVzaChfLnZhbHVlKSwhKEkmJlIubGVuZ3RoPT09SSkpO0I9ITApO31jYXRjaChqKXt6PSEwLEs9an1maW5hbGx5e3RyeXshQiYmUS5yZXR1cm4mJlEucmV0dXJuKCl9ZmluYWxseXtpZih6KXRocm93IEt9fXJldHVybiBSfXJldHVybiBmdW5jdGlvbihELEkpe2lmKEFycmF5LmlzQXJyYXkoRCkpcmV0dXJuIEQ7aWYoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChEKSlyZXR1cm4gTChELEkpO3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UiKX19KCksbj1NYXRoLlBJKjIsYT1mdW5jdGlvbihELEksUixCLHosSyxRKXt2YXIgXz1ELngsaj1ELnk7Xyo9SSxqKj1SO3ZhciBHPUIqXy16KmosWD16Kl8rQipqO3JldHVybnt4OkcrSyx5OlgrUX19LHM9ZnVuY3Rpb24oRCxJKXt2YXIgUj0xLjMzMzMzMzMzMzMzMzMzMzMqTWF0aC50YW4oSS80KSxCPU1hdGguY29zKEQpLHo9TWF0aC5zaW4oRCksSz1NYXRoLmNvcyhEK0kpLFE9TWF0aC5zaW4oRCtJKTtyZXR1cm5be3g6Qi16KlIseTp6K0IqUn0se3g6SytRKlIseTpRLUsqUn0se3g6Syx5OlF9XX0saT1mdW5jdGlvbihELEksUixCKXt2YXIgej1EKkItSSpSPDA/LTE6MSxLPU1hdGguc3FydChEKkQrSSpJKSxRPU1hdGguc3FydChEKkQrSSpJKSxfPUQqUitJKkIsaj1fLyhLKlEpO3JldHVybiBqPjEmJihqPTEpLGo8LTEmJihqPS0xKSx6Kk1hdGguYWNvcyhqKX0sbz1mdW5jdGlvbihELEksUixCLHosSyxRLF8saixHLFgsWil7dmFyIHR0PU1hdGgucG93KHosMiksbnQ9TWF0aC5wb3coSywyKSxxPU1hdGgucG93KFgsMiksZHQ9TWF0aC5wb3coWiwyKSx1dD10dCpudC10dCpkdC1udCpxO3V0PDAmJih1dD0wKSx1dC89dHQqZHQrbnQqcSx1dD1NYXRoLnNxcnQodXQpKihRPT09Xz8tMToxKTt2YXIgVz11dCp6L0sqWixGPXV0Ki1LL3oqWCxWPUcqVy1qKkYrKEQrUikvMixKPWoqVytHKkYrKEkrQikvMixOPShYLVcpL3osJD0oWi1GKS9LLFM9KC1YLVcpL3osUD0oLVotRikvSyx3PWkoMSwwLE4sJCksVT1pKE4sJCxTLFApO3JldHVybiBfPT09MCYmVT4wJiYoVS09biksXz09PTEmJlU8MCYmKFUrPW4pLFtWLEosdyxVXX0sYz1mdW5jdGlvbihEKXt2YXIgST1ELnB4LFI9RC5weSxCPUQuY3gsej1ELmN5LEs9RC5yeCxRPUQucnksXz1ELnhBeGlzUm90YXRpb24saj1fPT09dm9pZCAwPzA6XyxHPUQubGFyZ2VBcmNGbGFnLFg9Rz09PXZvaWQgMD8wOkcsWj1ELnN3ZWVwRmxhZyx0dD1aPT09dm9pZCAwPzA6WixudD1bXTtpZihLPT09MHx8UT09PTApcmV0dXJuW107dmFyIHE9TWF0aC5zaW4oaipuLzM2MCksZHQ9TWF0aC5jb3MoaipuLzM2MCksdXQ9ZHQqKEktQikvMitxKihSLXopLzIsVz0tcSooSS1CKS8yK2R0KihSLXopLzI7aWYodXQ9PT0wJiZXPT09MClyZXR1cm5bXTtLPU1hdGguYWJzKEspLFE9TWF0aC5hYnMoUSk7dmFyIEY9TWF0aC5wb3codXQsMikvTWF0aC5wb3coSywyKStNYXRoLnBvdyhXLDIpL01hdGgucG93KFEsMik7Rj4xJiYoSyo9TWF0aC5zcXJ0KEYpLFEqPU1hdGguc3FydChGKSk7dmFyIFY9byhJLFIsQix6LEssUSxYLHR0LHEsZHQsdXQsVyksSj1lKFYsNCksTj1KWzBdLCQ9SlsxXSxTPUpbMl0sUD1KWzNdLHc9TWF0aC5tYXgoTWF0aC5jZWlsKE1hdGguYWJzKFApLyhuLzQpKSwxKTtQLz13O2Zvcih2YXIgVT0wO1U8dztVKyspbnQucHVzaChzKFMsUCkpLFMrPVA7cmV0dXJuIG50Lm1hcChmdW5jdGlvbihIKXt2YXIgWT1hKEhbMF0sSyxRLGR0LHEsTiwkKSxrPVkueCxydD1ZLnksaXQ9YShIWzFdLEssUSxkdCxxLE4sJCksY3Q9aXQueCxodD1pdC55LGF0PWEoSFsyXSxLLFEsZHQscSxOLCQpLG90PWF0LngsZnQ9YXQueTtyZXR1cm57eDE6ayx5MTpydCx4MjpjdCx5MjpodCx4Om90LHk6ZnR9fSl9LG09e2E6NyxjOjYsaDoxLGw6MixtOjIscTo0LHM6NCx0OjIsdjoxLHo6MH0sdT0vKFthc3R2enFtaGxjXSkoW15hc3R2enFtaGxjXSopL2lnO2Z1bmN0aW9uIHAoTCl7dmFyIEQ9W107cmV0dXJuIEwucmVwbGFjZSh1LGZ1bmN0aW9uKEksUixCKXt2YXIgej1SLnRvTG93ZXJDYXNlKCk7Zm9yKEI9TyhCKSx6PT0ibSImJkIubGVuZ3RoPjImJihELnB1c2goW1JdLmNvbmNhdChCLnNwbGljZSgwLDIpKSksej0ibCIsUj1SPT0ibSI/ImwiOiJMIik7Oyl7aWYoQi5sZW5ndGg9PW1bel0pcmV0dXJuIEIudW5zaGlmdChSKSxELnB1c2goQik7aWYoQi5sZW5ndGg8bVt6XSl0aHJvdyBuZXcgRXJyb3IoIm1hbGZvcm1lZCBwYXRoIGRhdGEiKTtELnB1c2goW1JdLmNvbmNhdChCLnNwbGljZSgwLG1bel0pKSl9fSksRH12YXIgeT0vLT9bMC05XSpcLj9bMC05XSsoPzplWy0rXT9cZCspPy9pZztmdW5jdGlvbiBPKEwpe3ZhciBEPUwubWF0Y2goeSk7cmV0dXJuIEQ/RC5tYXAoTnVtYmVyKTpbXX1mdW5jdGlvbiB4KEwpe3ZhciBEPUxbMF1bMF0sST1MWzBdWzFdLFI9RCxCPUk7cmV0dXJuIEwuZm9yRWFjaChmdW5jdGlvbih6KXt2YXIgSz16WzBdLFE9elsyXSxfPXpbNF0saj16WzZdLEc9elsxXSxYPXpbM10sWj16WzVdLHR0PXpbN107RD1NYXRoLm1pbihELEssUSxfLGopLEk9TWF0aC5taW4oSSxHLFgsWix0dCksUj1NYXRoLm1heChSLEssUSxfLGopLEI9TWF0aC5tYXgoQixHLFgsWix0dCl9KSxbRCxJLFIsQl19ZnVuY3Rpb24gdihMLEQpe3JldHVybiBNYXRoLnNxcnQoTWF0aC5wb3coTFswXS1EWzBdLDIpK01hdGgucG93KExbMV0tRFsxXSwyKSkrTWF0aC5zcXJ0KE1hdGgucG93KExbMl0tRFsyXSwyKStNYXRoLnBvdyhMWzNdLURbM10sMikpfWZ1bmN0aW9uIFQoTCxEKXt2YXIgST1MWzBdLFI9TFsyXSxCPUxbNF0sej1MWzZdLEs9TFsxXSxRPUxbM10sXz1MWzVdLGo9TFs3XSxHPURbMF0sWD1EWzJdLFo9RFs0XSx0dD1EWzZdLG50PURbMV0scT1EWzNdLGR0PURbNV0sdXQ9RFs3XTtyZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KEctSSwyKStNYXRoLnBvdyhudC1LLDIpKStNYXRoLnNxcnQoTWF0aC5wb3coWC1SLDIpK01hdGgucG93KHEtUSwyKSkrTWF0aC5zcXJ0KE1hdGgucG93KFotQiwyKStNYXRoLnBvdyhkdC1fLDIpKStNYXRoLnNxcnQoTWF0aC5wb3codHQteiwyKStNYXRoLnBvdyh1dC1qLDIpKX1mdW5jdGlvbiBsKEwsRCl7dmFyIEk9ZihMLmxlbmd0aCksUj1bXTtJLmZvckVhY2goZnVuY3Rpb24oeil7dmFyIEs9MCxRPTA7ei5mb3JFYWNoKGZ1bmN0aW9uKF8pe0srPVQoTFtfXSxEW1ErK10pfSksUi5wdXNoKHtpbmRleDp6LGRpc3RhbmNlOkt9KX0pLFIuc29ydChmdW5jdGlvbih6LEspe3JldHVybiB6LmRpc3RhbmNlLUsuZGlzdGFuY2V9KTt2YXIgQj1bXTtyZXR1cm4gUlswXS5pbmRleC5mb3JFYWNoKGZ1bmN0aW9uKHope0IucHVzaChMW3pdKX0pLEJ9ZnVuY3Rpb24gaChMLEQpe3ZhciBJPWcoTC5sZW5ndGgpLFI9W107SS5mb3JFYWNoKGZ1bmN0aW9uKHope3ZhciBLPTA7ei5mb3JFYWNoKGZ1bmN0aW9uKFEpe0srPXYoeChMW1FdKSx4KERbUV0pKX0pLFIucHVzaCh7aW5kZXg6eixkaXN0YW5jZTpLfSl9KSxSLnNvcnQoZnVuY3Rpb24oeixLKXtyZXR1cm4gei5kaXN0YW5jZS1LLmRpc3RhbmNlfSk7dmFyIEI9W107cmV0dXJuIFJbMF0uaW5kZXguZm9yRWFjaChmdW5jdGlvbih6KXtCLnB1c2goTFt6XSl9KSxCfWZ1bmN0aW9uIGYoTCl7Zm9yKHZhciBEPVtdLEk9MDtJPEw7SSsrKXtmb3IodmFyIFI9W10sQj0wO0I8TDtCKyspe3ZhciB6PUIrSTt6PkwtMSYmKHotPUwpLFJbel09Qn1ELnB1c2goUil9cmV0dXJuIER9ZnVuY3Rpb24gZyhMKXtmb3IodmFyIEQ9W10sST0wO0k8TDtJKyspRC5wdXNoKEkpO3JldHVybiBNKEQpfWZ1bmN0aW9uIE0oTCl7dmFyIEQ9W10sST1bXTtmdW5jdGlvbiBSKEIpe3ZhciB6LEs7Zm9yKHo9MDt6PEIubGVuZ3RoO3orKylLPUIuc3BsaWNlKHosMSlbMF0sSS5wdXNoKEspLEIubGVuZ3RoPT0wJiZELnB1c2goSS5zbGljZSgpKSxSKEIpLEIuc3BsaWNlKHosMCxLKSxJLnBvcCgpO3JldHVybiBEfXJldHVybiBSKEwpfXZhciBBPXt9O0EucGFyc2VyPXAsQS5sZXJwQ3VydmU9ZnVuY3Rpb24oTCxELEkpe3JldHVybiBBLmxlcnBQb2ludHMoTFswXSxMWzFdLERbMF0sRFsxXSxJKS5jb25jYXQoQS5sZXJwUG9pbnRzKExbMl0sTFszXSxEWzJdLERbM10sSSkpLmNvbmNhdChBLmxlcnBQb2ludHMoTFs0XSxMWzVdLERbNF0sRFs1XSxJKSkuY29uY2F0KEEubGVycFBvaW50cyhMWzZdLExbN10sRFs2XSxEWzddLEkpKX0sQS5sZXJwUG9pbnRzPWZ1bmN0aW9uKEwsRCxJLFIsQil7cmV0dXJuW0wrKEktTCkqQixEKyhSLUQpKkJdfSxBLnEyYj1mdW5jdGlvbihMLEQsSSxSLEIseil7cmV0dXJuW0wsRCwoTCsyKkkpLzMsKEQrMipSKS8zLChCKzIqSSkvMywoeisyKlIpLzMsQix6XX0sQS5wYXRoMnNoYXBlcz1mdW5jdGlvbihMKXtmb3IodmFyIEQ9QS5wYXJzZXIoTCksST0wLFI9MCxCPTAsej1ELmxlbmd0aCxLPVtdLFE9bnVsbCxfPXZvaWQgMCxqPXZvaWQgMCxHPXZvaWQgMCxYPXZvaWQgMCxaPXZvaWQgMCx0dD12b2lkIDAsbnQ9dm9pZCAwO0I8ejtCKyspe3ZhciBxPURbQl0sZHQ9cVswXSx1dD1EW0ItMV07c3dpdGNoKGR0KXtjYXNlIm0iOlo9Sy5sZW5ndGgsS1taXT1bXSxRPUtbWl0sST1JK3FbMV0sUj1SK3FbMl07YnJlYWs7Y2FzZSJNIjpaPUsubGVuZ3RoLEtbWl09W10sUT1LW1pdLEk9cVsxXSxSPXFbMl07YnJlYWs7Y2FzZSJsIjpRLnB1c2goW0ksUixJLFIsSSxSLEkrcVsxXSxSK3FbMl1dKSxJKz1xWzFdLFIrPXFbMl07YnJlYWs7Y2FzZSJMIjpRLnB1c2goW0ksUixxWzFdLHFbMl0scVsxXSxxWzJdLHFbMV0scVsyXV0pLEk9cVsxXSxSPXFbMl07YnJlYWs7Y2FzZSJoIjpRLnB1c2goW0ksUixJLFIsSSxSLEkrcVsxXSxSXSksSSs9cVsxXTticmVhaztjYXNlIkgiOlEucHVzaChbSSxSLHFbMV0sUixxWzFdLFIscVsxXSxSXSksST1xWzFdO2JyZWFrO2Nhc2UidiI6US5wdXNoKFtJLFIsSSxSLEksUixJLFIrcVsxXV0pLFIrPXFbMV07YnJlYWs7Y2FzZSJWIjpRLnB1c2goW0ksUixJLHFbMV0sSSxxWzFdLEkscVsxXV0pLFI9cVsxXTticmVhaztjYXNlIkMiOlEucHVzaChbSSxSLHFbMV0scVsyXSxxWzNdLHFbNF0scVs1XSxxWzZdXSksST1xWzVdLFI9cVs2XTticmVhaztjYXNlIlMiOnV0WzBdPT09IkMifHx1dFswXT09PSJjIj9RLnB1c2goW0ksUixJK3V0WzVdLXV0WzNdLFIrdXRbNl0tdXRbNF0scVsxXSxxWzJdLHFbM10scVs0XV0pOih1dFswXT09PSJTInx8dXRbMF09PT0icyIpJiZRLnB1c2goW0ksUixJK3V0WzNdLXV0WzFdLFIrdXRbNF0tdXRbMl0scVsxXSxxWzJdLHFbM10scVs0XV0pLEk9cVszXSxSPXFbNF07YnJlYWs7Y2FzZSJjIjpRLnB1c2goW0ksUixJK3FbMV0sUitxWzJdLEkrcVszXSxSK3FbNF0sSStxWzVdLFIrcVs2XV0pLEk9SStxWzVdLFI9UitxWzZdO2JyZWFrO2Nhc2UicyI6dXRbMF09PT0iQyJ8fHV0WzBdPT09ImMiP1EucHVzaChbSSxSLEkrdXRbNV0tdXRbM10sUit1dFs2XS11dFs0XSxJK3FbMV0sUitxWzJdLEkrcVszXSxSK3FbNF1dKToodXRbMF09PT0iUyJ8fHV0WzBdPT09InMiKSYmUS5wdXNoKFtJLFIsSSt1dFszXS11dFsxXSxSK3V0WzRdLXV0WzJdLEkrcVsxXSxSK3FbMl0sSStxWzNdLFIrcVs0XV0pLEk9SStxWzNdLFI9UitxWzRdO2JyZWFrO2Nhc2UiYSI6dHQ9Yyh7cng6cVsxXSxyeTpxWzJdLHB4OkkscHk6Uix4QXhpc1JvdGF0aW9uOnFbM10sbGFyZ2VBcmNGbGFnOnFbNF0sc3dlZXBGbGFnOnFbNV0sY3g6SStxWzZdLGN5OlIrcVs3XX0pLG50PXR0W3R0Lmxlbmd0aC0xXSx0dC5mb3JFYWNoKGZ1bmN0aW9uKFcsRil7Rj09PTA/US5wdXNoKFtJLFIsVy54MSxXLnkxLFcueDIsVy55MixXLngsVy55XSk6US5wdXNoKFt0dFtGLTFdLngsdHRbRi0xXS55LFcueDEsVy55MSxXLngyLFcueTIsVy54LFcueV0pfSksST1udC54LFI9bnQueTticmVhaztjYXNlIkEiOnR0PWMoe3J4OnFbMV0scnk6cVsyXSxweDpJLHB5OlIseEF4aXNSb3RhdGlvbjpxWzNdLGxhcmdlQXJjRmxhZzpxWzRdLHN3ZWVwRmxhZzpxWzVdLGN4OnFbNl0sY3k6cVs3XX0pLG50PXR0W3R0Lmxlbmd0aC0xXSx0dC5mb3JFYWNoKGZ1bmN0aW9uKFcsRil7Rj09PTA/US5wdXNoKFtJLFIsVy54MSxXLnkxLFcueDIsVy55MixXLngsVy55XSk6US5wdXNoKFt0dFtGLTFdLngsdHRbRi0xXS55LFcueDEsVy55MSxXLngyLFcueTIsVy54LFcueV0pfSksST1udC54LFI9bnQueTticmVhaztjYXNlIlEiOlEucHVzaChBLnEyYihJLFIscVsxXSxxWzJdLHFbM10scVs0XSkpLEk9cVszXSxSPXFbNF07YnJlYWs7Y2FzZSJxIjpRLnB1c2goQS5xMmIoSSxSLEkrcVsxXSxSK3FbMl0scVszXStJLHFbNF0rUikpLEkrPXFbM10sUis9cVs0XTticmVhaztjYXNlIlQiOnV0WzBdPT09IlEifHx1dFswXT09PSJxIj8oRz1JK3V0WzNdLXV0WzFdLFg9Uit1dFs0XS11dFsyXSxRLnB1c2goQS5xMmIoSSxSLEcsWCxxWzFdLHFbMl0pKSk6KHV0WzBdPT09IlQifHx1dFswXT09PSJ0IikmJihRLnB1c2goQS5xMmIoSSxSLEkrSS1HLFIrUi1YLHFbMV0scVsyXSkpLEc9SStJLUcsWD1SK1ItWCksST1xWzFdLFI9cVsyXTticmVhaztjYXNlInQiOnV0WzBdPT09IlEifHx1dFswXT09PSJxIj8oRz1JK3V0WzNdLXV0WzFdLFg9Uit1dFs0XS11dFsyXSxRLnB1c2goQS5xMmIoSSxSLEcsWCxJK3FbMV0sUitxWzJdKSkpOih1dFswXT09PSJUInx8dXRbMF09PT0idCIpJiYoUS5wdXNoKEEucTJiKEksUixJK0ktRyxSK1ItWCxJK3FbMV0sUitxWzJdKSksRz1JK0ktRyxYPVIrUi1YKSxJKz1xWzFdLFIrPXFbMl07YnJlYWs7Y2FzZSJaIjpfPVFbMF1bMF0saj1RWzBdWzFdLFEucHVzaChbSSxSLF8saixfLGosXyxqXSk7YnJlYWs7Y2FzZSJ6IjpfPVFbMF1bMF0saj1RWzBdWzFdLFEucHVzaChbSSxSLF8saixfLGosXyxqXSk7YnJlYWt9fXJldHVybiBLfSxBLl91cEN1cnZlcz1mdW5jdGlvbihMLEQpe2Zvcih2YXIgST0wLFI9MCxCPUwubGVuZ3RoO0k8RDtJKyspTC5wdXNoKExbUl0uc2xpY2UoMCkpLFIrKyxSPkItMSYmKFItPUIpfTtmdW5jdGlvbiBDKEwsRCxJLFIsQix6LEssUSxfKXtyZXR1cm57bGVmdDpiKEwsRCxJLFIsQix6LEssUSxfKSxyaWdodDpiKEssUSxCLHosSSxSLEwsRCwxLV8sITApfX1mdW5jdGlvbiBiKEwsRCxJLFIsQix6LEssUSxfLGope3ZhciBHPShJLUwpKl8rTCxYPShSLUQpKl8rRCxaPShCLUkpKl8rSSx0dD0oei1SKSpfK1IsbnQ9KEstQikqXytCLHE9KFEteikqXyt6LGR0PShaLUcpKl8rRyx1dD0odHQtWCkqXytYLFc9KG50LVopKl8rWixGPShxLXR0KSpfK3R0LFY9KFctZHQpKl8rZHQsSj0oRi11dCkqXyt1dDtyZXR1cm4gaj9bVixKLGR0LHV0LEcsWCxMLERdOltMLEQsRyxYLGR0LHV0LFYsSl19QS5fc3BsaXRDdXJ2ZXM9ZnVuY3Rpb24oTCxEKXtmb3IodmFyIEk9MCxSPTA7STxEO0krKyl7dmFyIEI9TFtSXSx6PUMoQlswXSxCWzFdLEJbMl0sQlszXSxCWzRdLEJbNV0sQls2XSxCWzddLC41KTtMLnNwbGljZShSLDEpLEwuc3BsaWNlKFIsMCx6LmxlZnQsei5yaWdodCksUis9MixSPj1MLmxlbmd0aC0xJiYoUj0wKX19O2Z1bmN0aW9uIEUoTCxEKXtmb3IodmFyIEk9ZnVuY3Rpb24oeil7dmFyIEs9TFtMLmxlbmd0aC0xXSxRPVtdO0suZm9yRWFjaChmdW5jdGlvbihfKXtRLnB1c2goXy5zbGljZSgwKSl9KSxMLnB1c2goUSl9LFI9MDtSPEQ7UisrKUkoKX1yZXR1cm4gQS5sZXJwPWZ1bmN0aW9uKEwsRCxJKXtyZXR1cm4gQS5fbGVycChBLnBhdGgyc2hhcGVzKEwpLEEucGF0aDJzaGFwZXMoRCksSSl9LEEuTUlNX0NVUlZFU19DT1VOVD0xMDAsQS5fcHJlcHJvY2Vzc2luZz1mdW5jdGlvbihMLEQpe3ZhciBJPUwubGVuZ3RoLFI9RC5sZW5ndGgsQj1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEwpKSx6PUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoRCkpO3JldHVybiBJPlI/RSh6LEktUik6STxSJiZFKEIsUi1JKSxCPWgoQix6KSxCLmZvckVhY2goZnVuY3Rpb24oSyxRKXt2YXIgXz1LLmxlbmd0aCxqPXpbUV0ubGVuZ3RoO18+aj9fPEEuTUlNX0NVUlZFU19DT1VOVD8oQS5fc3BsaXRDdXJ2ZXMoSyxBLk1JTV9DVVJWRVNfQ09VTlQtXyksQS5fc3BsaXRDdXJ2ZXMoeltRXSxBLk1JTV9DVVJWRVNfQ09VTlQtaikpOkEuX3NwbGl0Q3VydmVzKHpbUV0sXy1qKTpfPGomJihqPEEuTUlNX0NVUlZFU19DT1VOVD8oQS5fc3BsaXRDdXJ2ZXMoSyxBLk1JTV9DVVJWRVNfQ09VTlQtXyksQS5fc3BsaXRDdXJ2ZXMoeltRXSxBLk1JTV9DVVJWRVNfQ09VTlQtaikpOkEuX3NwbGl0Q3VydmVzKEssai1fKSl9KSxCLmZvckVhY2goZnVuY3Rpb24oSyxRKXtCW1FdPWwoSyx6W1FdKX0pLFtCLHpdfSxBLl9sZXJwPWZ1bmN0aW9uKEwsRCxJKXt2YXIgUj1bXTtyZXR1cm4gTC5mb3JFYWNoKGZ1bmN0aW9uKEIseil7dmFyIEs9W107Qi5mb3JFYWNoKGZ1bmN0aW9uKFEsXyl7Sy5wdXNoKEEubGVycEN1cnZlKFEsRFt6XVtfXSxJKSl9KSxSLnB1c2goSyl9KSxSfSxBLmFuaW1hdGU9ZnVuY3Rpb24oTCl7dmFyIEQ9QS5wYXRoMnNoYXBlcyhMLmZyb20pLEk9QS5wYXRoMnNoYXBlcyhMLnRvKSxSPUEuX3ByZXByb2Nlc3NpbmcoRCxJKSxCPW5ldyBEYXRlLHo9TC5lbmR8fGZ1bmN0aW9uKCl7fSxLPUwucHJvZ3Jlc3N8fGZ1bmN0aW9uKCl7fSxRPUwuYmVnaW58fGZ1bmN0aW9uKCl7fSxfPUwuZWFzaW5nfHxmdW5jdGlvbih0dCl7cmV0dXJuIHR0fSxqPW51bGwsRz1udWxsLFg9TC50aW1lO1EoRCk7dmFyIFo9ZnVuY3Rpb24gdHQoKXt2YXIgbnQ9bmV3IERhdGUtQjtpZihudD49WCl7Rz1JLEsoRywxKSx6KEcpLGNhbmNlbEFuaW1hdGlvbkZyYW1lKGopO3JldHVybn12YXIgcT1fKG50L1gpO0c9QS5fbGVycChSWzBdLFJbMV0scSksSyhHLHEpLGo9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHR0KX07WigpfSxBfSl9LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImRlZmF1bHQiLGZ1bmN0aW9uKCl7cmV0dXJuIGN9KTt2YXIgZT10KDcxKSxuPXQoMjIxKSxhPXQoNzIpO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtjb25zdCBzPVN5bWJvbC5mb3IoInNwcml0ZWpzX3NldEF0dHJpYnV0ZURlZmF1bHQiKSxpPVN5bWJvbC5mb3IoInNwcml0ZWpzX3NldEF0dHJpYnV0ZSIpLG89U3ltYm9sLmZvcigic3ByaXRlanNfZ2V0QXR0cmlidXRlIik7Y2xhc3MgYyBleHRlbmRzIGUuZGVmYXVsdHtjb25zdHJ1Y3Rvcih1KXtzdXBlcih1KSx0aGlzW3NdKHtkOiIiLG5vcm1hbGl6ZTohMSxmaWxsQ29sb3I6dm9pZCAwLGZpbGxSdWxlOiJub256ZXJvIixzdHJva2VDb2xvcjp2b2lkIDAsbGluZVdpZHRoOjEsbGluZUpvaW46Im1pdGVyIixsaW5lQ2FwOiJidXR0Iixyb3VuZFNlZ21lbnRzOjIwLGxpbmVEYXNoOnZvaWQgMCxsaW5lRGFzaE9mZnNldDowLG1pdGVyTGltaXQ6MTAsdGV4dHVyZTp2b2lkIDAsdGV4dHVyZVJlY3Q6dm9pZCAwLHRleHR1cmVSZXBlYXQ6ITEsc291cmNlUmVjdDp2b2lkIDAsY2xpcFBhdGg6dm9pZCAwfSl9Z2V0IGQoKXtyZXR1cm4gdGhpc1tvXSgiZCIpfXNldCBkKHUpe3RoaXNbaV0oImQiLHUpfWdldCBub3JtYWxpemUoKXtyZXR1cm4gdGhpc1tvXSgibm9ybWFsaXplIil9c2V0IG5vcm1hbGl6ZSh1KXt0aGlzW2ldKCJub3JtYWxpemUiLCEhdSl9Z2V0IGZpbGxDb2xvcigpe3JldHVybiB0aGlzW29dKCJmaWxsQ29sb3IiKX1zZXQgZmlsbENvbG9yKHUpe3RoaXNbaV0oImZpbGxDb2xvciIsT2JqZWN0KG4ucGFyc2VDb2xvcikodSkpfWdldCBmaWxsUnVsZSgpe3JldHVybiB0aGlzW29dKCJmaWxsUnVsZSIpfXNldCBmaWxsUnVsZSh1KXtpZih1IT1udWxsJiZ1IT09Im5vbnplcm8iJiZ1IT09ImV2ZW5vZGQiKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgZmlsbCBydWxlLiIpO3RoaXNbaV0oImZpbGxSdWxlIix1KX1nZXQgc3Ryb2tlQ29sb3IoKXtyZXR1cm4gdGhpc1tvXSgic3Ryb2tlQ29sb3IiKX1zZXQgc3Ryb2tlQ29sb3IodSl7dGhpc1tpXSgic3Ryb2tlQ29sb3IiLE9iamVjdChuLnBhcnNlQ29sb3IpKHUpKX1nZXQgbGluZVdpZHRoKCl7cmV0dXJuIHRoaXNbb10oImxpbmVXaWR0aCIpfXNldCBsaW5lV2lkdGgodSl7dGhpc1tpXSgibGluZVdpZHRoIixPYmplY3QoYS50b051bWJlcikodSkpfWdldCBsaW5lSm9pbigpe3JldHVybiB0aGlzW29dKCJsaW5lSm9pbiIpfXNldCBsaW5lSm9pbih1KXtpZih1IT1udWxsJiZ1IT09Im1pdGVyIiYmdSE9PSJiZXZlbCImJnUhPT0icm91bmQiKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgbGluZUpvaW4gdHlwZS4iKTt0aGlzW2ldKCJsaW5lSm9pbiIsdSl9Z2V0IGxpbmVDYXAoKXtyZXR1cm4gdGhpc1tvXSgibGluZUNhcCIpfXNldCBsaW5lQ2FwKHUpe2lmKHUhPW51bGwmJnUhPT0iYnV0dCImJnUhPT0ic3F1YXJlIiYmdSE9PSJyb3VuZCIpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBsaW5lQ2FwIHR5cGUuIik7dGhpc1tpXSgibGluZUNhcCIsdSl9Z2V0IGxpbmVEYXNoKCl7cmV0dXJuIHRoaXNbb10oImxpbmVEYXNoIil9c2V0IGxpbmVEYXNoKHUpe3U9T2JqZWN0KGEudG9BcnJheSkodSwhMCksdSE9bnVsbCYmIUFycmF5LmlzQXJyYXkodSkmJih1PVt1XSksdGhpc1tpXSgibGluZURhc2giLHU/dS5tYXAoYS50b051bWJlcik6bnVsbCl9Z2V0IGxpbmVEYXNoT2Zmc2V0KCl7cmV0dXJuIHRoaXNbb10oImxpbmVEYXNoT2Zmc2V0Iil9c2V0IGxpbmVEYXNoT2Zmc2V0KHUpe3RoaXNbaV0oImxpbmVEYXNoT2Zmc2V0IixPYmplY3QoYS50b051bWJlcikodSkpfWdldCBtaXRlckxpbWl0KCl7cmV0dXJuIHRoaXNbb10oIm1pdGVyTGltaXQiKX1zZXQgbWl0ZXJMaW1pdCh1KXt0aGlzW2ldKCJtaXRlckxpbWl0IixPYmplY3QoYS50b051bWJlcikodSkpfWdldCByb3VuZFNlZ21lbnRzKCl7cmV0dXJuIHRoaXNbb10oInJvdW5kU2VnbWVudHMiKX1zZXQgcm91bmRTZWdtZW50cyh1KXt0aGlzW2ldKCJyb3VuZFNlZ21lbnRzIix1KX1nZXQgdGV4dHVyZSgpe3JldHVybiB0aGlzW29dKCJ0ZXh0dXJlIil9c2V0IHRleHR1cmUodSl7dGhpc1tpXSgidGV4dHVyZSIsdSl9Z2V0IHRleHR1cmVSZWN0KCl7cmV0dXJuIHRoaXNbb10oInRleHR1cmVSZWN0Iil9c2V0IHRleHR1cmVSZWN0KHUpe3RoaXNbaV0oInRleHR1cmVSZWN0Iix1KX1nZXQgc291cmNlUmVjdCgpe3JldHVybiB0aGlzW29dKCJzb3VyY2VSZWN0Iil9c2V0IHNvdXJjZVJlY3QodSl7dGhpc1tpXSgic291cmNlUmVjdCIsdSl9Z2V0IHRleHR1cmVSZXBlYXQoKXtyZXR1cm4gdGhpc1tvXSgidGV4dHVyZVJlcGVhdCIpfXNldCB0ZXh0dXJlUmVwZWF0KHUpe3RoaXNbaV0oInRleHR1cmVSZXBlYXQiLCEhdSl9Z2V0IGNsaXBQYXRoKCl7cmV0dXJuIHRoaXNbb10oImNsaXBQYXRoIil9c2V0IGNsaXBQYXRoKHUpe3RoaXNbaV0oImNsaXBQYXRoIix1KX19fSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJkZWZhdWx0IixmdW5jdGlvbigpe3JldHVybiBpfSk7dmFyIGU9dCgyMjYpLG49dCgyMTMpLGE9dCgyMzApO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtmdW5jdGlvbiBzKG8sYyxtKXtyZXR1cm4gYyBpbiBvP09iamVjdC5kZWZpbmVQcm9wZXJ0eShvLGMse3ZhbHVlOm0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTpvW2NdPW0sb31jbGFzcyBpIGV4dGVuZHMgZS5kZWZhdWx0e2dldCBpc1Zpc2libGUoKXtjb25zdHt3aWR0aDpjLGhlaWdodDptfT10aGlzLmF0dHJpYnV0ZXM7cmV0dXJuIGM+MCYmbT4wJiZzdXBlci5pc1Zpc2libGV9fXMoaSwiQXR0ciIsYS5kZWZhdWx0KSxuLmRlZmF1bHQucmVnaXN0ZXJOb2RlKGksInJlY3QiKX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gbX0pO3ZhciBlPXQoMjI4KSxuPXQoNzIpO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtjb25zdCBhPVN5bWJvbC5mb3IoInNwcml0ZWpzX3NldEF0dHJpYnV0ZURlZmF1bHQiKSxzPVN5bWJvbC5mb3IoInNwcml0ZWpzX3NldEF0dHJpYnV0ZSIpLGk9U3ltYm9sLmZvcigic3ByaXRlanNfZ2V0QXR0cmlidXRlIiksbz1TeW1ib2wuZm9yKCJzcHJpdGVqc19kZWNsYXJlQWxpYXMiKTtmdW5jdGlvbiBjKHUpe2NvbnN0e3dpZHRoOnAsaGVpZ2h0Onl9PXU7cmV0dXJuYE0wIDBMJHtwfSAwTCR7cH0gJHt5fUwwICR7eX1aYH1jbGFzcyBtIGV4dGVuZHMgZS5kZWZhdWx0e2NvbnN0cnVjdG9yKHApe3N1cGVyKHApLHRoaXNbYV0oe3dpZHRoOjAsaGVpZ2h0OjB9KSx0aGlzW29dKCJzaXplIil9Z2V0IGQoKXtyZXR1cm4gdGhpc1tpXSgiZCIpfXNldCBkKHApe31nZXQgd2lkdGgoKXtyZXR1cm4gdGhpc1tpXSgid2lkdGgiKX1zZXQgd2lkdGgocCl7aWYocD1PYmplY3Qobi50b051bWJlcikocCksdGhpc1tzXSgid2lkdGgiLHApKXtjb25zdCB5PWModGhpcyk7dGhpc1tzXSgiZCIseSl9fWdldCBoZWlnaHQoKXtyZXR1cm4gdGhpc1tpXSgiaGVpZ2h0Iil9c2V0IGhlaWdodChwKXtpZihwPU9iamVjdChuLnRvTnVtYmVyKShwKSx0aGlzW3NdKCJoZWlnaHQiLHApKXtjb25zdCB5PWModGhpcyk7dGhpc1tzXSgiZCIseSl9fWdldCBzaXplKCl7cmV0dXJuW3RoaXMud2lkdGgsdGhpcy5oZWlnaHRdfXNldCBzaXplKHApe3A9T2JqZWN0KG4udG9BcnJheSkocCksQXJyYXkuaXNBcnJheShwKXx8KHA9W3AscF0pLHRoaXMud2lkdGg9cFswXSx0aGlzLmhlaWdodD1wWzFdfX19LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImRlZmF1bHQiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KTt2YXIgZT10KDIzMiksbj10KDIxMyksYT10KDIzNSk7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2Z1bmN0aW9uIHMobyxjLG0pe3JldHVybiBjIGluIG8/T2JqZWN0LmRlZmluZVByb3BlcnR5KG8sYyx7dmFsdWU6bSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOm9bY109bSxvfWNsYXNzIGkgZXh0ZW5kcyBlLmRlZmF1bHR7Z2V0IGlzVmlzaWJsZSgpe2NvbnN0e3NpZGVzOmN9PXRoaXMuYXR0cmlidXRlcztyZXR1cm4gY1swXT4wJiZjWzFdPjAmJnN1cGVyLmlzVmlzaWJsZX19cyhpLCJBdHRyIixhLmRlZmF1bHQpLG4uZGVmYXVsdC5yZWdpc3Rlck5vZGUoaSwidHJpYW5nbGUiKX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pO3ZhciBlPXQoMjI2KSxuPXQoMjEzKSxhPXQoMjMzKTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7ZnVuY3Rpb24gcyhvLGMsbSl7cmV0dXJuIGMgaW4gbz9PYmplY3QuZGVmaW5lUHJvcGVydHkobyxjLHt2YWx1ZTptLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6b1tjXT1tLG99Y2xhc3MgaSBleHRlbmRzIGUuZGVmYXVsdHtnZXQgaXNWaXNpYmxlKCl7Y29uc3R7cG9pbnRzOmN9PXRoaXMuYXR0cmlidXRlcztyZXR1cm4gYy5sZW5ndGg+MCYmc3VwZXIuaXNWaXNpYmxlfX1zKGksIkF0dHIiLGEuZGVmYXVsdCksbi5kZWZhdWx0LnJlZ2lzdGVyTm9kZShpLCJwb2x5bGluZSIpfSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJkZWZhdWx0IixmdW5jdGlvbigpe3JldHVybiB1fSk7dmFyIGU9dCgyMjgpLG49dCg3MiksYT10KDIzNCk7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2NvbnN0IHM9U3ltYm9sLmZvcigic3ByaXRlanNfc2V0QXR0cmlidXRlRGVmYXVsdCIpLGk9U3ltYm9sLmZvcigic3ByaXRlanNfc2V0QXR0cmlidXRlIiksbz1TeW1ib2wuZm9yKCJzcHJpdGVqc19nZXRBdHRyaWJ1dGUiKSxjPVN5bWJvbC5mb3IoInNwcml0ZWpzX2RlY2xhcmVBbGlhcyIpO2Z1bmN0aW9uIG0ocCl7Y29uc3R7cG9pbnRzOnksc21vb3RoOk8sc21vb3RoUmFuZ2U6eCxjbG9zZTp2fT1wLFQ9W107Zm9yKGxldCBoPTA7aDx5Lmxlbmd0aDtoKz0yKVQucHVzaChbeVtoXSx5W2grMV1dKTtsZXQgbD0iIjtyZXR1cm4gTz9sPU9iamVjdChhLm1ha2VTbW9vdGhDdXJ2ZUxpbmUpKFQseCk6VC5sZW5ndGgmJihsPWBNJHtULm1hcChoPT5oLmpvaW4oIiAiKSkuam9pbigiTCIpfWApLGwmJnYmJihsKz0iWiIpLGx9Y2xhc3MgdSBleHRlbmRzIGUuZGVmYXVsdHtjb25zdHJ1Y3Rvcih5KXtzdXBlcih5KSx0aGlzW3NdKHtwb2ludHM6W10sc21vb3RoOiExLHNtb290aFJhbmdlOlswXSxjbG9zZVR5cGU6Im5vbmUifSksdGhpc1tjXSgiY2xvc2UiKX1nZXQgZCgpe3JldHVybiB0aGlzW29dKCJkIil9c2V0IGQoeSl7fWdldCBjbG9zZSgpe3JldHVybiB0aGlzLmNsb3NlVHlwZSE9PSJub25lIn1zZXQgY2xvc2UoeSl7eT15PyJub3JtYWwiOiJub25lIix0aGlzLmNsb3NlVHlwZT15fWdldCBjbG9zZVR5cGUoKXtyZXR1cm4gdGhpc1tvXSgiY2xvc2VUeXBlIil9c2V0IGNsb3NlVHlwZSh5KXtpZih5IT1udWxsJiZ5IT09Im5vbmUiJiZ5IT09Im5vcm1hbCIpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBjbG9zZVR5cGUgdHlwZS4iKTtpZih0aGlzW2ldKCJjbG9zZVR5cGUiLHkpKXtjb25zdCBPPW0odGhpcyk7dGhpc1tpXSgiZCIsTyl9fWdldCBzbW9vdGgoKXtyZXR1cm4gdGhpc1tvXSgic21vb3RoIil9c2V0IHNtb290aCh5KXtpZih0aGlzW2ldKCJzbW9vdGgiLHkpKXtjb25zdCBPPW0odGhpcyk7dGhpc1tpXSgiZCIsTyl9fWdldCBzbW9vdGhSYW5nZSgpe3JldHVybiB0aGlzW29dKCJzbW9vdGhSYW5nZSIpfXNldCBzbW9vdGhSYW5nZSh5KXtpZih5JiYhQXJyYXkuaXNBcnJheSh5KSYmKHk9W3ldKSx0aGlzW2ldKCJzbW9vdGhSYW5nZSIseSkmJnRoaXMuc21vb3RoKXtjb25zdCBPPW0odGhpcyk7dGhpc1tpXSgiZCIsTyl9fWdldCBwb2ludHMoKXtyZXR1cm4gdGhpc1tvXSgicG9pbnRzIil9c2V0IHBvaW50cyh5KXtpZih5PU9iamVjdChuLnRvQXJyYXkpKHkpLEFycmF5LmlzQXJyYXkoeSkmJih5PXkucmVkdWNlKChPLHgpPT5BcnJheS5pc0FycmF5KHgpP1suLi5PLC4uLngubWFwKHY9Pk9iamVjdChuLnRvTnVtYmVyKSh2KSldOlsuLi5PLE9iamVjdChuLnRvTnVtYmVyKSh4KV0sW10pKSx0aGlzW2ldKCJwb2ludHMiLHkpKXtjb25zdCBPPW0odGhpcyk7dGhpc1tpXSgiZCIsTyl9fX19LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsIm1ha2VTbW9vdGhDdXJ2ZUxpbmUiLGZ1bmN0aW9uKCl7cmV0dXJuIGV9KSx0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7ZnVuY3Rpb24gZShuLGE9WzBdKXtmdW5jdGlvbiBzKGMsbT0uMTY4LHU9LjE2OCl7bGV0IHAseSxPLHg7aWYoKG5bY10ueD09PW5bYysxXS54fHxuW2NdLnk9PT1uW2MrMV0ueSkmJihtPTAsdT0wKSxjPDE/KHA9blswXS54KyhuWzFdLngtblswXS54KSptLHk9blswXS55KyhuWzFdLnktblswXS55KSptKToocD1uW2NdLngrKG5bYysxXS54LW5bYy0xXS54KSptLHk9bltjXS55KyhuW2MrMV0ueS1uW2MtMV0ueSkqbSksYz5uLmxlbmd0aC0zKXtjb25zdCB2PW4ubGVuZ3RoLTE7Tz1uW3ZdLngtKG5bdl0ueC1uW3YtMV0ueCkqdSx4PW5bdl0ueS0oblt2XS55LW5bdi0xXS55KSp1fWVsc2UgTz1uW2MrMV0ueC0obltjKzJdLngtbltjXS54KSp1LHg9bltjKzFdLnktKG5bYysyXS55LW5bY10ueSkqdTtyZXR1cm5be3g6cCx5fSx7eDpPLHk6eH1dfW49bi5tYXAoKFtjLG1dKT0+KHt4OmMseTptfSkpO2xldCBpPSIiLG89MDtyZXR1cm4gbi5mb3JFYWNoKChjLG0pPT57aWYobT09PTApaSs9YE0ke2MueH0gJHtjLnl9YDtlbHNle2Zvcig7bT5hW29dOylvKys7aWYobyUyKXtjb25zdFt1LHBdPXMobS0xKTtpKz1gQyR7W3UueCx1LnkscC54LHAueSxjLngsYy55XS5qb2luKCIgIil9YH1lbHNlIGkrPWBMJHtjLnh9ICR7Yy55fWB9fSksaX19LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImRlZmF1bHQiLGZ1bmN0aW9uKCl7cmV0dXJuIGN9KTt2YXIgZT10KDIzMyksbj10KDcyKTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7Y29uc3QgYT1TeW1ib2wuZm9yKCJzcHJpdGVqc19zZXRBdHRyaWJ1dGVEZWZhdWx0Iikscz1TeW1ib2wuZm9yKCJzcHJpdGVqc19zZXRBdHRyaWJ1dGUiKSxpPVN5bWJvbC5mb3IoInNwcml0ZWpzX2dldEF0dHJpYnV0ZSIpO2Z1bmN0aW9uIG8obSl7Y29uc3RbdSxwXT1tLnNpZGVzO2xldCB5PW0uYW5nbGUlMzYwO3JldHVybiB5PDAmJih5Kz0zNjApLHk9TWF0aC5QSSp5LzE4MCxbMCwwLHUsMCxwKk1hdGguY29zKHkpLHAqTWF0aC5zaW4oeSldfWNsYXNzIGMgZXh0ZW5kcyBlLmRlZmF1bHR7Y29uc3RydWN0b3IodSl7c3VwZXIodSksdGhpc1thXSh7c2lkZXM6WzAsMF0sYW5nbGU6NjAsY2xvc2VUeXBlOiJub3JtYWwifSl9Z2V0IHBvaW50cygpe3JldHVybiBzdXBlci5wb2ludHN9c2V0IHBvaW50cyh1KXt9Z2V0IHNpZGVzKCl7cmV0dXJuIHRoaXNbaV0oInNpZGVzIil9c2V0IHNpZGVzKHUpe2lmKHU9T2JqZWN0KG4udG9BcnJheSkodSwhMCksdSE9bnVsbCYmIUFycmF5LmlzQXJyYXkodSkmJih1PVt1LHVdKSx0aGlzW3NdKCJzaWRlcyIsdSkpe2NvbnN0IHA9byh0aGlzKTtzdXBlci5wb2ludHM9cH19Z2V0IGFuZ2xlKCl7cmV0dXJuIHRoaXNbaV0oImFuZ2xlIil9c2V0IGFuZ2xlKHUpe2lmKHU9T2JqZWN0KG4udG9OdW1iZXIpKHUpLHRoaXNbc10oImFuZ2xlIix1KSl7Y29uc3QgcD1vKHRoaXMpO3N1cGVyLnBvaW50cz1wfX19fSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJkZWZhdWx0IixmdW5jdGlvbigpe3JldHVybiBpfSk7dmFyIGU9dCgyMzIpLG49dCgyMTMpLGE9dCgyMzcpO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtmdW5jdGlvbiBzKG8sYyxtKXtyZXR1cm4gYyBpbiBvP09iamVjdC5kZWZpbmVQcm9wZXJ0eShvLGMse3ZhbHVlOm0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTpvW2NdPW0sb31jbGFzcyBpIGV4dGVuZHMgZS5kZWZhdWx0e2dldCBpc1Zpc2libGUoKXtjb25zdHtzaWRlczpjfT10aGlzLmF0dHJpYnV0ZXM7cmV0dXJuIGNbMF0+MCYmY1sxXT4wJiZzdXBlci5pc1Zpc2libGV9fXMoaSwiQXR0ciIsYS5kZWZhdWx0KSxuLmRlZmF1bHQucmVnaXN0ZXJOb2RlKGksInBhcmFsbGVsIil9LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImRlZmF1bHQiLGZ1bmN0aW9uKCl7cmV0dXJuIGN9KTt2YXIgZT10KDIzMyksbj10KDcyKTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7Y29uc3QgYT1TeW1ib2wuZm9yKCJzcHJpdGVqc19zZXRBdHRyaWJ1dGVEZWZhdWx0Iikscz1TeW1ib2wuZm9yKCJzcHJpdGVqc19zZXRBdHRyaWJ1dGUiKSxpPVN5bWJvbC5mb3IoInNwcml0ZWpzX2dldEF0dHJpYnV0ZSIpO2Z1bmN0aW9uIG8obSl7Y29uc3RbdSxwXT1tLnNpZGVzO2xldCB5PW0uYW5nbGUlMzYwO3k8MCYmKHkrPTM2MCkseT1NYXRoLlBJKnkvMTgwO2NvbnN0IE89cCpNYXRoLmNvcyh5KSx4PXAqTWF0aC5zaW4oeSk7cmV0dXJuWzAsMCx1LDAsTyt1LHgsTyx4XX1jbGFzcyBjIGV4dGVuZHMgZS5kZWZhdWx0e2NvbnN0cnVjdG9yKHUpe3N1cGVyKHUpLHRoaXNbYV0oe3NpZGVzOlswLDBdLGFuZ2xlOjkwLGNsb3NlVHlwZToibm9ybWFsIn0pfWdldCBwb2ludHMoKXtyZXR1cm4gc3VwZXIucG9pbnRzfXNldCBwb2ludHModSl7fWdldCBzaWRlcygpe3JldHVybiB0aGlzW2ldKCJzaWRlcyIpfXNldCBzaWRlcyh1KXtpZih1PU9iamVjdChuLnRvQXJyYXkpKHUsITApLHUhPW51bGwmJiFBcnJheS5pc0FycmF5KHUpJiYodT1bdSx1XSksdGhpc1tzXSgic2lkZXMiLHUpKXtjb25zdCBwPW8odGhpcyk7c3VwZXIucG9pbnRzPXB9fWdldCBhbmdsZSgpe3JldHVybiB0aGlzW2ldKCJhbmdsZSIpfXNldCBhbmdsZSh1KXtpZih1PU9iamVjdChuLnRvTnVtYmVyKSh1KSx0aGlzW3NdKCJhbmdsZSIsdSkpe2NvbnN0IHA9byh0aGlzKTtzdXBlci5wb2ludHM9cH19fX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pO3ZhciBlPXQoMjMyKSxuPXQoMjEzKSxhPXQoMjM5KTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7ZnVuY3Rpb24gcyhvLGMsbSl7cmV0dXJuIGMgaW4gbz9PYmplY3QuZGVmaW5lUHJvcGVydHkobyxjLHt2YWx1ZTptLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6b1tjXT1tLG99Y2xhc3MgaSBleHRlbmRzIGUuZGVmYXVsdHt9cyhpLCJBdHRyIixhLmRlZmF1bHQpLG4uZGVmYXVsdC5yZWdpc3Rlck5vZGUoaSwicmVndWxhciIpfSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJkZWZhdWx0IixmdW5jdGlvbigpe3JldHVybiBjfSk7dmFyIGU9dCgyMzMpLG49dCg3Mik7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2NvbnN0IGE9U3ltYm9sLmZvcigic3ByaXRlanNfc2V0QXR0cmlidXRlRGVmYXVsdCIpLHM9U3ltYm9sLmZvcigic3ByaXRlanNfc2V0QXR0cmlidXRlIiksaT1TeW1ib2wuZm9yKCJzcHJpdGVqc19nZXRBdHRyaWJ1dGUiKTtmdW5jdGlvbiBvKG0pe2NvbnN0e2VkZ2VzOnUscmFkaXVzOnAsb2Zmc2V0QW5nbGU6eX09bSxPPU1hdGguUEkqeS8xODAtLjUqTWF0aC5QSTtpZih1PDN8fHA8PTApcmV0dXJuW107Y29uc3QgeD1bXTtmb3IobGV0IHY9MDt2PHU7disrKXtjb25zdCBUPXYqMipNYXRoLlBJL3UrTyxsPXAqTWF0aC5jb3MoVCksaD1wKk1hdGguc2luKFQpO3gucHVzaChsLGgpfXJldHVybiB4fWNsYXNzIGMgZXh0ZW5kcyBlLmRlZmF1bHR7Y29uc3RydWN0b3IodSl7c3VwZXIodSksdGhpc1thXSh7ZWRnZXM6MyxyYWRpdXM6MCxvZmZzZXRBbmdsZTowLGNsb3NlVHlwZToibm9ybWFsIn0pfWdldCBwb2ludHMoKXtyZXR1cm4gc3VwZXIucG9pbnRzfXNldCBwb2ludHModSl7fWdldCBlZGdlcygpe3JldHVybiB0aGlzW2ldKCJlZGdlcyIpfXNldCBlZGdlcyh1KXtpZih1PU9iamVjdChuLnRvTnVtYmVyKSh1KSx0aGlzW3NdKCJlZGdlcyIsdSkpe2NvbnN0IHA9byh0aGlzKTtzdXBlci5wb2ludHM9cH19Z2V0IHJhZGl1cygpe3JldHVybiB0aGlzW2ldKCJyYWRpdXMiKX1zZXQgcmFkaXVzKHUpe2lmKHU9T2JqZWN0KG4udG9OdW1iZXIpKHUpLHRoaXNbc10oInJhZGl1cyIsdSkpe2NvbnN0IHA9byh0aGlzKTtzdXBlci5wb2ludHM9cH19Z2V0IG9mZnNldEFuZ2xlKCl7cmV0dXJuIHRoaXNbaV0oIm9mZnNldEFuZ2xlIil9c2V0IG9mZnNldEFuZ2xlKHUpe2lmKHU9T2JqZWN0KG4udG9OdW1iZXIpKHUpLHRoaXNbc10oIm9mZnNldEFuZ2xlIix1KSl7Y29uc3QgcD1vKHRoaXMpO3N1cGVyLnBvaW50cz1wfX19fSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJkZWZhdWx0IixmdW5jdGlvbigpe3JldHVybiBpfSk7dmFyIGU9dCgyMzIpLG49dCgyMTMpLGE9dCgyNDEpO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtmdW5jdGlvbiBzKG8sYyxtKXtyZXR1cm4gYyBpbiBvP09iamVjdC5kZWZpbmVQcm9wZXJ0eShvLGMse3ZhbHVlOm0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTpvW2NdPW0sb31jbGFzcyBpIGV4dGVuZHMgZS5kZWZhdWx0e31zKGksIkF0dHIiLGEuZGVmYXVsdCksbi5kZWZhdWx0LnJlZ2lzdGVyTm9kZShpLCJzdGFyIil9LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImRlZmF1bHQiLGZ1bmN0aW9uKCl7cmV0dXJuIGN9KTt2YXIgZT10KDIzMyksbj10KDcyKTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7Y29uc3QgYT1TeW1ib2wuZm9yKCJzcHJpdGVqc19zZXRBdHRyaWJ1dGVEZWZhdWx0Iikscz1TeW1ib2wuZm9yKCJzcHJpdGVqc19zZXRBdHRyaWJ1dGUiKSxpPVN5bWJvbC5mb3IoInNwcml0ZWpzX2dldEF0dHJpYnV0ZSIpO2Z1bmN0aW9uIG8obSl7Y29uc3R7YW5nbGVzOnUsaW5uZXJSYWRpdXM6cCxvdXRlclJhZGl1czp5LG9mZnNldEFuZ2xlOk99PW0seD1NYXRoLlBJKk8vMTgwLS41Kk1hdGguUEk7aWYodTwzfHxwPD0wfHx5PD0wKXJldHVybltdO2NvbnN0IHY9W107Zm9yKGxldCBUPTA7VDx1KjI7VCsrKXtjb25zdCBsPVQqTWF0aC5QSS91K3gsaD1UJTI/cDp5LGY9aCpNYXRoLmNvcyhsKSxnPWgqTWF0aC5zaW4obCk7di5wdXNoKGYsZyl9cmV0dXJuIHZ9Y2xhc3MgYyBleHRlbmRzIGUuZGVmYXVsdHtjb25zdHJ1Y3Rvcih1KXtzdXBlcih1KSx0aGlzW2FdKHthbmdsZXM6NSxpbm5lclJhZGl1czowLG91dGVyUmFkaXVzOjAsb2Zmc2V0QW5nbGU6MCxjbG9zZVR5cGU6Im5vcm1hbCJ9KX1nZXQgcG9pbnRzKCl7cmV0dXJuIHN1cGVyLnBvaW50c31zZXQgcG9pbnRzKHUpe31nZXQgYW5nbGVzKCl7cmV0dXJuIHRoaXNbaV0oImFuZ2xlcyIpfXNldCBhbmdsZXModSl7aWYodT1PYmplY3Qobi50b051bWJlcikodSksdGhpc1tzXSgiYW5nbGVzIix1KSl7Y29uc3QgcD1vKHRoaXMpO3N1cGVyLnBvaW50cz1wfX1nZXQgaW5uZXJSYWRpdXMoKXtyZXR1cm4gdGhpc1tpXSgiaW5uZXJSYWRpdXMiKX1zZXQgaW5uZXJSYWRpdXModSl7aWYodT1PYmplY3Qobi50b051bWJlcikodSksdGhpc1tzXSgiaW5uZXJSYWRpdXMiLHUpKXtjb25zdCBwPW8odGhpcyk7c3VwZXIucG9pbnRzPXB9fWdldCBvdXRlclJhZGl1cygpe3JldHVybiB0aGlzW2ldKCJvdXRlclJhZGl1cyIpfXNldCBvdXRlclJhZGl1cyh1KXtpZih1PU9iamVjdChuLnRvTnVtYmVyKSh1KSx0aGlzW3NdKCJvdXRlclJhZGl1cyIsdSkpe2NvbnN0IHA9byh0aGlzKTtzdXBlci5wb2ludHM9cH19Z2V0IHJhZGl1cygpe3JldHVyblt0aGlzLmlubmVyUmFkaXVzLHRoaXMub3V0ZXJSYWRpdXNdfXNldCByYWRpdXModSl7dT1PYmplY3Qobi50b0FycmF5KSh1LCEwKSxBcnJheS5pc0FycmF5KHUpfHwodT1bdSx1XSksdGhpcy5pbm5lclJhZGl1cz11WzBdLHRoaXMub3V0ZXJSYWRpdXM9dVsxXX1nZXQgb2Zmc2V0QW5nbGUoKXtyZXR1cm4gdGhpc1tpXSgib2Zmc2V0QW5nbGUiKX1zZXQgb2Zmc2V0QW5nbGUodSl7aWYodT1PYmplY3Qobi50b051bWJlcikodSksdGhpc1tzXSgib2Zmc2V0QW5nbGUiLHUpKXtjb25zdCBwPW8odGhpcyk7c3VwZXIucG9pbnRzPXB9fX19LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImRlZmF1bHQiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KTt2YXIgZT10KDIyNiksbj10KDIxMyksYT10KDI0Myk7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2Z1bmN0aW9uIHMobyxjLG0pe3JldHVybiBjIGluIG8/T2JqZWN0LmRlZmluZVByb3BlcnR5KG8sYyx7dmFsdWU6bSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOm9bY109bSxvfWNsYXNzIGkgZXh0ZW5kcyBlLmRlZmF1bHR7Z2V0IGlzVmlzaWJsZSgpe2NvbnN0e3JhZGl1c1g6YyxyYWRpdXNZOm0sc3RhcnRBbmdsZTp1LGVuZEFuZ2xlOnB9PXRoaXMuYXR0cmlidXRlcztyZXR1cm4gYz4wJiZtPjAmJnUhPT1wJiZzdXBlci5pc1Zpc2libGV9fXMoaSwiQXR0ciIsYS5kZWZhdWx0KSxuLmRlZmF1bHQucmVnaXN0ZXJOb2RlKGksImVsbGlwc2UiKX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gdX0pO3ZhciBlPXQoMTIpLG49dCgyMjgpLGE9dCg3Mik7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2NvbnN0IHM9U3ltYm9sLmZvcigic3ByaXRlanNfc2V0QXR0cmlidXRlRGVmYXVsdCIpLGk9U3ltYm9sLmZvcigic3ByaXRlanNfc2V0QXR0cmlidXRlIiksbz1TeW1ib2wuZm9yKCJzcHJpdGVqc19nZXRBdHRyaWJ1dGUiKSxjPVN5bWJvbC5mb3IoInNwcml0ZWpzX2RlY2xhcmVBbGlhcyIpO2Z1bmN0aW9uIG0ocCl7Y29uc3R7cmFkaXVzWDp5LHJhZGl1c1k6TyxzdGFydEFuZ2xlOngsZW5kQW5nbGU6dixkaXJlY3Rpb246VCxjbG9zZVR5cGU6bH09cCxoPVQ9PT0iYW5pdGNsb2Nrd2lzZSIsZj1uZXcgZS5GaWd1cmUyRDtyZXR1cm4gbD09PSJzZWN0b3IiJiZmLm1vdmVUbygwLDApLGYuZWxsaXBzZSgwLDAseSxPLDAsTWF0aC5QSSp4LzE4MCxNYXRoLlBJKnYvMTgwLGgpLGwhPT0ibm9uZSImJmYuY2xvc2VQYXRoKCksZi5wYXRoLnJlZHVjZSgoQSxDKT0+QStDLmpvaW4oIiAiKSwiIil9Y2xhc3MgdSBleHRlbmRzIG4uZGVmYXVsdHtjb25zdHJ1Y3Rvcih5KXtzdXBlcih5KSx0aGlzW3NdKHtyYWRpdXNYOjAscmFkaXVzWTowLHN0YXJ0QW5nbGU6MCxlbmRBbmdsZTozNjAsZGlyZWN0aW9uOiJjbG9ja3dpc2UiLGNsb3NlVHlwZToibm9uZSJ9KSx0aGlzW2NdKCJyYWRpdXMiLCJhbmdsZSIpfWdldCBkKCl7cmV0dXJuIHRoaXNbb10oImQiKX1zZXQgZCh5KXt9Z2V0IHJhZGl1c1goKXtyZXR1cm4gdGhpc1tvXSgicmFkaXVzWCIpfXNldCByYWRpdXNYKHkpe2lmKHk9T2JqZWN0KGEudG9OdW1iZXIpKHkpLHRoaXNbaV0oInJhZGl1c1giLHkpKXtjb25zdCBPPW0odGhpcyk7dGhpc1tpXSgiZCIsTyl9fWdldCByYWRpdXNZKCl7cmV0dXJuIHRoaXNbb10oInJhZGl1c1kiKX1zZXQgcmFkaXVzWSh5KXtpZih5PU9iamVjdChhLnRvTnVtYmVyKSh5KSx0aGlzW2ldKCJyYWRpdXNZIix5KSl7Y29uc3QgTz1tKHRoaXMpO3RoaXNbaV0oImQiLE8pfX1nZXQgcmFkaXVzKCl7cmV0dXJuW3RoaXMucmFkaXVzWCx0aGlzLnJhZGl1c1ldfXNldCByYWRpdXMoeSl7eT1PYmplY3QoYS50b0FycmF5KSh5LCEwKSxBcnJheS5pc0FycmF5KHkpfHwoeT1beSx5XSksdGhpcy5yYWRpdXNYPXlbMF0sdGhpcy5yYWRpdXNZPXlbMV19Z2V0IGFuZ2xlKCl7cmV0dXJuW3RoaXMuc3RhcnRBbmdsZSx0aGlzLmVuZEFuZ2xlXX1zZXQgYW5nbGUoeSl7eT1PYmplY3QoYS50b0FycmF5KSh5KSxBcnJheS5pc0FycmF5KHkpfHwoeT1beSx5XSksdGhpcy5zdGFydEFuZ2xlPXlbMF0sdGhpcy5lbmRBbmdsZT15WzFdfWdldCBkaXJlY3Rpb24oKXtyZXR1cm4gdGhpc1tvXSgiZGlyZWN0aW9uIil9c2V0IGRpcmVjdGlvbih5KXtpZih5IT1udWxsJiZ5IT09ImNsb2Nrd2lzZSImJnkhPT0iYW50aWNsb2Nrd2lzZSIpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBkaXJlY3Rpb24gdHlwZS4iKTt0aGlzW2ldKCJkaXJlY3Rpb24iLHkpfWdldCBzdGFydEFuZ2xlKCl7cmV0dXJuIHRoaXNbb10oInN0YXJ0QW5nbGUiKX1zZXQgc3RhcnRBbmdsZSh5KXtpZih5PU9iamVjdChhLnRvTnVtYmVyKSh5KSx0aGlzW2ldKCJzdGFydEFuZ2xlIix5KSl7Y29uc3QgTz1tKHRoaXMpO3RoaXNbaV0oImQiLE8pfX1nZXQgZW5kQW5nbGUoKXtyZXR1cm4gdGhpc1tvXSgiZW5kQW5nbGUiKX1zZXQgZW5kQW5nbGUoeSl7aWYoeT1PYmplY3QoYS50b051bWJlcikoeSksdGhpc1tpXSgiZW5kQW5nbGUiLHkpKXtjb25zdCBPPW0odGhpcyk7dGhpc1tpXSgiZCIsTyl9fWdldCBjbG9zZVR5cGUoKXtyZXR1cm4gdGhpc1tvXSgiY2xvc2VUeXBlIil9c2V0IGNsb3NlVHlwZSh5KXtpZih5IT1udWxsJiZ5IT09Im5vbmUiJiZ5IT09InNlY3RvciImJnkhPT0ibm9ybWFsIil0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGNsb3NlVHlwZSB0eXBlLiIpO2lmKHRoaXNbaV0oImNsb3NlVHlwZSIseSkpe2NvbnN0IE89bSh0aGlzKTt0aGlzW2ldKCJkIixPKX19fX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gaX0pO3ZhciBlPXQoMjQyKSxuPXQoMjEzKSxhPXQoMjQ1KTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7ZnVuY3Rpb24gcyhvLGMsbSl7cmV0dXJuIGMgaW4gbz9PYmplY3QuZGVmaW5lUHJvcGVydHkobyxjLHt2YWx1ZTptLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6b1tjXT1tLG99Y2xhc3MgaSBleHRlbmRzIGUuZGVmYXVsdHt9cyhpLCJBdHRyIixhLmRlZmF1bHQpLG4uZGVmYXVsdC5yZWdpc3Rlck5vZGUoaSwiYXJjIil9LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImRlZmF1bHQiLGZ1bmN0aW9uKCl7cmV0dXJuIGF9KTt2YXIgZT10KDI0Myksbj10KDcyKTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7Y2xhc3MgYSBleHRlbmRzIGUuZGVmYXVsdHtnZXQgcmFkaXVzKCl7cmV0dXJuIHN1cGVyLnJhZGl1c1h9c2V0IHJhZGl1cyhpKXtpPU9iamVjdChuLnRvTnVtYmVyKShpKSxzdXBlci5yYWRpdXNYPWksc3VwZXIucmFkaXVzWT1pfX19LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImRlZmF1bHQiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KTt2YXIgZT10KDIyNiksbj10KDIxMyksYT10KDI0Nyk7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2Z1bmN0aW9uIHMobyxjLG0pe3JldHVybiBjIGluIG8/T2JqZWN0LmRlZmluZVByb3BlcnR5KG8sYyx7dmFsdWU6bSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOm9bY109bSxvfWNsYXNzIGkgZXh0ZW5kcyBlLmRlZmF1bHR7Z2V0IGlzVmlzaWJsZSgpe2NvbnN0e2lubmVyUmFkaXVzOmMsb3V0ZXJSYWRpdXM6bSxzdGFydEFuZ2xlOnUsZW5kQW5nbGU6cH09dGhpcy5hdHRyaWJ1dGVzO3JldHVybihjPjB8fG0+MCkmJnUhPT1wJiZzdXBlci5pc1Zpc2libGV9fXMoaSwiQXR0ciIsYS5kZWZhdWx0KSxuLmRlZmF1bHQucmVnaXN0ZXJOb2RlKGksInJpbmciKX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gdX0pO3ZhciBlPXQoMTIpLG49dCgyMjgpLGE9dCg3Mik7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2NvbnN0IHM9U3ltYm9sLmZvcigic3ByaXRlanNfc2V0QXR0cmlidXRlRGVmYXVsdCIpLGk9U3ltYm9sLmZvcigic3ByaXRlanNfc2V0QXR0cmlidXRlIiksbz1TeW1ib2wuZm9yKCJzcHJpdGVqc19nZXRBdHRyaWJ1dGUiKSxjPVN5bWJvbC5mb3IoInNwcml0ZWpzX2RlY2xhcmVBbGlhcyIpO2Z1bmN0aW9uIG0ocCl7bGV0e2lubmVyUmFkaXVzOnksb3V0ZXJSYWRpdXM6TyxzdGFydEFuZ2xlOngsZW5kQW5nbGU6dn09cDtjb25zdCBUPW5ldyBlLkZpZ3VyZTJEO2lmKHg9TWF0aC5QSSp4LzE4MCx2PU1hdGguUEkqdi8xODAseT5PJiYoW3ksT109W08seV0pLHk8PTAmJlQubW92ZVRvKDAsMCksVC5hcmMoMCwwLE8seCx2LCExKSx5PjApe2NvbnN0IGY9TWF0aC5QSSoyO3Y8eCYmKHY9eCtmKyh2LXgpJWYpLHYteD49ZiYmKHY9eCtmLTFlLTYpLFQuYXJjKDAsMCx5LHYseCwhMCl9cmV0dXJuIFQuY2xvc2VQYXRoKCksVC5wYXRoLnJlZHVjZSgoZixnKT0+ZitnLmpvaW4oIiAiKSwiIil9Y2xhc3MgdSBleHRlbmRzIG4uZGVmYXVsdHtjb25zdHJ1Y3Rvcih5KXtzdXBlcih5KSx0aGlzW3NdKHtpbm5lclJhZGl1czowLG91dGVyUmFkaXVzOjAsc3RhcnRBbmdsZTowLGVuZEFuZ2xlOjM2MH0pLHRoaXNbY10oInJhZGl1cyIsImFuZ2xlIil9Z2V0IGQoKXtyZXR1cm4gdGhpc1tvXSgiZCIpfXNldCBkKHkpe31nZXQgaW5uZXJSYWRpdXMoKXtyZXR1cm4gdGhpc1tvXSgiaW5uZXJSYWRpdXMiKX1zZXQgaW5uZXJSYWRpdXMoeSl7aWYoeT1PYmplY3QoYS50b051bWJlcikoeSksdGhpc1tpXSgiaW5uZXJSYWRpdXMiLHkpKXtjb25zdCBPPW0odGhpcyk7dGhpc1tpXSgiZCIsTyl9fWdldCBvdXRlclJhZGl1cygpe3JldHVybiB0aGlzW29dKCJvdXRlclJhZGl1cyIpfXNldCBvdXRlclJhZGl1cyh5KXtpZih5PU9iamVjdChhLnRvTnVtYmVyKSh5KSx0aGlzW2ldKCJvdXRlclJhZGl1cyIseSkpe2NvbnN0IE89bSh0aGlzKTt0aGlzW2ldKCJkIixPKX19Z2V0IHJhZGl1cygpe3JldHVyblt0aGlzLmlubmVyUmFkaXVzLHRoaXMub3V0ZXJSYWRpdXNdfXNldCByYWRpdXMoeSl7eT1PYmplY3QoYS50b0FycmF5KSh5LCEwKSxBcnJheS5pc0FycmF5KHkpfHwoeT1beSx5XSksdGhpcy5pbm5lclJhZGl1cz15WzBdLHRoaXMub3V0ZXJSYWRpdXM9eVsxXX1nZXQgc3RhcnRBbmdsZSgpe3JldHVybiB0aGlzW29dKCJzdGFydEFuZ2xlIil9c2V0IHN0YXJ0QW5nbGUoeSl7aWYoeT1PYmplY3QoYS50b051bWJlcikoeSksdGhpc1tpXSgic3RhcnRBbmdsZSIseSkpe2NvbnN0IE89bSh0aGlzKTt0aGlzW2ldKCJkIixPKX19Z2V0IGVuZEFuZ2xlKCl7cmV0dXJuIHRoaXNbb10oImVuZEFuZ2xlIil9c2V0IGVuZEFuZ2xlKHkpe2lmKHk9T2JqZWN0KGEudG9OdW1iZXIpKHkpLHRoaXNbaV0oImVuZEFuZ2xlIix5KSl7Y29uc3QgTz1tKHRoaXMpO3RoaXNbaV0oImQiLE8pfX1nZXQgYW5nbGUoKXtyZXR1cm5bdGhpcy5zdGFydEFuZ2xlLHRoaXMuZW5kQW5nbGVdfXNldCBhbmdsZSh5KXt5PU9iamVjdChhLnRvQXJyYXkpKHkpLEFycmF5LmlzQXJyYXkoeSl8fCh5PVt5LHldKSx0aGlzLnN0YXJ0QW5nbGU9eVswXSx0aGlzLmVuZEFuZ2xlPXlbMV19fX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gT30pO3ZhciBlPXQoMTIpLG49dCgyMTgpLGE9dCgyMTkpLHM9dCgyNDkpLGk9dCgyMTMpO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtmdW5jdGlvbiBvKHgsdixUKXtyZXR1cm4gdiBpbiB4P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh4LHYse3ZhbHVlOlQsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp4W3ZdPVQseH1jb25zdCBjPVN5bWJvbCgidGV4dEltYWdlIiksbT1TeW1ib2woInRleHRJbWFnZVRhc2siKSx1PVN5bWJvbCgidGV4dHVyZUNvbnRleHQiKSxwPVN5bWJvbCgidXBkYXRlVGV4dHVyZVJlY3QiKSx5PVN5bWJvbCgidGV4dENhbnZhcyIpO2NsYXNzIE8gZXh0ZW5kcyBhLmRlZmF1bHR7Y29uc3RydWN0b3Iodj17fSl7dHlwZW9mIHY9PSJzdHJpbmciJiYodj17dGV4dDp2fSksc3VwZXIodil9Z2V0IGNvbnRlbnRTaXplKCl7bGV0W3YsVF09c3VwZXIuY29udGVudFNpemU7Y29uc3R7d2lkdGg6bCxoZWlnaHQ6aH09dGhpcy5hdHRyaWJ1dGVzO2lmKGw9PW51bGx8fGg9PW51bGwpe2NvbnN0IGY9dGhpc1tjXTtmJiYobD09bnVsbCYmKHY9Zi5yZWN0WzJdKSxoPT1udWxsJiYoVD1mLnJlY3RbM10pKX1yZXR1cm5bdixUXX1nZXQgdGV4dCgpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXMudGV4dH1zZXQgdGV4dCh2KXt0aGlzLmF0dHJpYnV0ZXMudGV4dD12fWdldCB0ZXh0Q29udGVudCgpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXMudGV4dH1zZXQgdGV4dENvbnRlbnQodil7dGhpcy5hdHRyaWJ1dGVzLnRleHQ9dn1nZXQgdGV4dEltYWdlKCl7cmV0dXJuIHRoaXNbY118fHt9fWdldCB0ZXh0SW1hZ2VSZWFkeSgpe3JldHVybiB0aGlzW21dfHxQcm9taXNlLnJlc29sdmUoKX1kcmF3KHYpe3N1cGVyLmRyYXcodik7Y29uc3QgVD10aGlzLm1lc2g7aWYoVCl7Y29uc3QgbD10aGlzW2NdO2lmKGwpe2xldCBoPVQudGV4dHVyZTtpZighaHx8dGhpc1t1XSYmdGhpc1t1XSE9PXRoaXMucmVuZGVyZXJ8fGwubmVlZHNVcGRhdGU/KGwubmVlZHNVcGRhdGU9ITEsT2JqZWN0KG4uZGVsZXRlVGV4dHVyZSkobC5pbWFnZSx0aGlzLnJlbmRlcmVyKSxoPU9iamVjdChuLmNyZWF0ZVRleHR1cmUpKGwuaW1hZ2UsdGhpcy5yZW5kZXJlciksdGhpc1twXT0hMCk6aD1ULnVuaWZvcm1zLnVfdGV4U2FtcGxlcix0aGlzW3BdKXtjb25zdFtmLGddPWwucmVjdC5zbGljZSgyKSxbTSxBXT10aGlzLmNvbnRlbnRTaXplLEM9dGhpcy5hdHRyaWJ1dGVzLnRleHRBbGlnbixiPXRoaXMuYXR0cmlidXRlcy52ZXJ0aWNhbEFsaWduO2xldCBFPTA7Qz09PSJjZW50ZXIiP0U9KE0tZikvMjooQz09PSJyaWdodCJ8fEM9PT0iZW5kIikmJihFPU0tZik7Y29uc3QgTD10aGlzLmF0dHJpYnV0ZXMuZm9udFNpemUsRD10aGlzLmF0dHJpYnV0ZXMubGluZUhlaWdodDtsZXQgST0wO2I9PT0idG9wIj9JPShMLUQpLzI6Yj09PSJib3R0b20iJiYoST0oRC1MKS8yKTtjb25zdHtwYWRkaW5nTGVmdDpSLHBhZGRpbmdUb3A6Qn09dGhpcy5hdHRyaWJ1dGVzLHtib3JkZXJXaWR0aDp6fT10aGlzLmF0dHJpYnV0ZXM7RSs9Uit6LEkrPUIrejtjb25zdHthbmNob3JYOkssYW5jaG9yWTpRfT10aGlzLmF0dHJpYnV0ZXM7RS09dGhpcy5vZmZzZXRTaXplWzBdKkssSS09dGhpcy5vZmZzZXRTaXplWzFdKlEsVC5zZXRUZXh0dXJlKGgse3JlY3Q6W0UsSSxmLGddfSksdGhpc1twXT0hMSx0aGlzW3VdPXRoaXMucmVuZGVyZXJ9fX1yZXR1cm4gdn1vblByb3BlcnR5Q2hhbmdlKHYsVCxsKXt2PT09InRleHQifHx2PT09ImZvbnRTaXplInx8dj09PSJmb250RmFtaWx5Inx8dj09PSJmb250U3R5bGUifHx2PT09ImZvbnRWYXJpYW50Inx8dj09PSJmb250V2VpZ2h0Inx8dj09PSJmb250U3RyZXRjaCJ8fHY9PT0ibGluZUhlaWdodCJ8fHY9PT0ic3Ryb2tlQ29sb3IifHx2PT09ImZpbGxDb2xvciJ8fHY9PT0ic3Ryb2tlV2lkdGgiP3RoaXMudXBkYXRlVGV4dCgpOigodj09PSJ0ZXh0QWxpZ24ifHx2PT09InZlcnRpY2FsQWxpZ24iKSYmKHRoaXNbcF09ITApLHN1cGVyLm9uUHJvcGVydHlDaGFuZ2UodixULGwpKX11cGRhdGVDb250b3Vycygpe3N1cGVyLnVwZGF0ZUNvbnRvdXJzKCksdGhpc1twXT0hMH11cGRhdGVUZXh0KCl7dGhpc1ttXXx8KHRoaXNbbV09UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+e3RoaXNbbV09bnVsbDtjb25zdHt0ZXh0OnYsZm9udDpULGZpbGxDb2xvcjpsLHN0cm9rZUNvbG9yOmgsc3Ryb2tlV2lkdGg6Zn09dGhpcy5hdHRyaWJ1dGVzLGc9dGhpcy5sYXllcj90aGlzLmxheWVyLmRpc3BsYXlSYXRpbzoxO3JldHVybiB0aGlzW3ldPXRoaXNbeV18fGUuRU5WLmNyZWF0ZUNhbnZhcygxLDEpLHRoaXNbY109ZS5FTlYuY3JlYXRlVGV4dCh2LHtmb250OlQsZmlsbENvbG9yOmwsc3Ryb2tlQ29sb3I6aCxzdHJva2VXaWR0aDpmLHBhcnNlRm9udDplLnBhcnNlRm9udCxyYXRpbzpnLHRleHRDYW52YXM6dGhpc1t5XX0pLHRoaXNbY10ubmVlZHNVcGRhdGU9ITAsdGhpcy51cGRhdGVDb250b3VycygpLHRoaXMuZm9yY2VVcGRhdGUoKSx0aGlzW2NdfSkpfX1vKE8sIkF0dHIiLHMuZGVmYXVsdCksaS5kZWZhdWx0LnJlZ2lzdGVyTm9kZShPLCJsYWJlbCIpfSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJkZWZhdWx0IixmdW5jdGlvbigpe3JldHVybiB1fSk7dmFyIGU9dCgxMiksbj10KDcyKSxhPXQoMjIxKSxzPXQoMjIwKTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7Y29uc3QgaT1TeW1ib2wuZm9yKCJzcHJpdGVqc19zZXRBdHRyaWJ1dGVEZWZhdWx0Iiksbz1TeW1ib2wuZm9yKCJzcHJpdGVqc19zZXRBdHRyaWJ1dGUiKSxjPVN5bWJvbC5mb3IoInNwcml0ZWpzX2dldEF0dHJpYnV0ZSIpLG09U3ltYm9sLmZvcigic3ByaXRlanNfZGVjbGFyZUFsaWFzIik7Y2xhc3MgdSBleHRlbmRzIHMuZGVmYXVsdHtjb25zdHJ1Y3Rvcih5KXtzdXBlcih5KSx0aGlzW2ldKHt0ZXh0OiIiLGZvbnRTaXplOjE2LGZvbnRGYW1pbHk6IkhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmIixmb250U3R5bGU6Im5vcm1hbCIsZm9udFZhcmlhbnQ6Im5vcm1hbCIsZm9udFdlaWdodDoibm9ybWFsIixmb250U3RyZXRjaDoibm9ybWFsIixsaW5lSGVpZ2h0OiIiLHRleHRBbGlnbjoibGVmdCIsc3Ryb2tlQ29sb3I6dm9pZCAwLHN0cm9rZVdpZHRoOjEsZmlsbENvbG9yOnZvaWQgMCx2ZXJ0aWNhbEFsaWduOiJtaWRkbGUifSksdGhpc1ttXSgiZm9udCIpfWdldCB0ZXh0KCl7cmV0dXJuIHRoaXNbY10oInRleHQiKXx8IiAifXNldCB0ZXh0KHkpe3RoaXNbb10oInRleHQiLHkpfWdldCBmb250U2l6ZSgpe3JldHVybiB0aGlzW2NdKCJmb250U2l6ZSIpfXNldCBmb250U2l6ZSh5KXt0aGlzW29dKCJmb250U2l6ZSIsT2JqZWN0KG4udG9OdW1iZXIpKHkpKX1nZXQgZm9udEZhbWlseSgpe3JldHVybiB0aGlzW2NdKCJmb250RmFtaWx5Iil9c2V0IGZvbnRGYW1pbHkoeSl7dGhpc1tvXSgiZm9udEZhbWlseSIseSl9Z2V0IGZvbnRTdHlsZSgpe3JldHVybiB0aGlzW2NdKCJmb250U3R5bGUiKX1zZXQgZm9udFN0eWxlKHkpe3RoaXNbb10oImZvbnRTdHlsZSIseSl9Z2V0IGZvbnRWYXJpYW50KCl7cmV0dXJuIHRoaXNbY10oImZvbnRWYXJpYW50Iil9c2V0IGZvbnRWYXJpYW50KHkpe3RoaXNbb10oImZvbnRWYXJpYW50Iix5KX1nZXQgZm9udFdlaWdodCgpe3JldHVybiB0aGlzW2NdKCJmb250V2VpZ2h0Iil9c2V0IGZvbnRXZWlnaHQoeSl7dGhpc1tvXSgiZm9udFdlaWdodCIseSl9Z2V0IGZvbnRTdHJldGNoKCl7cmV0dXJuIHRoaXNbY10oImZvbnRTdHJldGNoIil9c2V0IGZvbnRTdHJldGNoKHkpe3RoaXNbb10oImZvbnRTdHJldGNoIix5KX1nZXQgbGluZUhlaWdodCgpe3JldHVybiB0aGlzW2NdKCJsaW5lSGVpZ2h0Iil8fHRoaXMuZm9udFNpemV9c2V0IGxpbmVIZWlnaHQoeSl7dGhpc1tvXSgibGluZUhlaWdodCIsT2JqZWN0KG4udG9OdW1iZXIpKHkpKX1nZXQgdGV4dEFsaWduKCl7cmV0dXJuIHRoaXNbY10oInRleHRBbGlnbiIpfXNldCB0ZXh0QWxpZ24oeSl7dGhpc1tvXSgidGV4dEFsaWduIix5KX1nZXQgc3Ryb2tlQ29sb3IoKXtyZXR1cm4gdGhpc1tjXSgic3Ryb2tlQ29sb3IiKX1zZXQgc3Ryb2tlQ29sb3IoeSl7dGhpc1tvXSgic3Ryb2tlQ29sb3IiLE9iamVjdChhLnBhcnNlQ29sb3IpKHkpKX1nZXQgc3Ryb2tlV2lkdGgoKXtyZXR1cm4gdGhpc1tjXSgic3Ryb2tlV2lkdGgiKX1zZXQgc3Ryb2tlV2lkdGgoeSl7dGhpc1tvXSgic3Ryb2tlV2lkdGgiLE9iamVjdChuLnRvTnVtYmVyKSh5KSl9Z2V0IHZlcnRpY2FsQWxpZ24oKXtyZXR1cm4gdGhpc1tjXSgidmVydGljYWxBbGlnbiIpfXNldCB2ZXJ0aWNhbEFsaWduKHkpe3RoaXNbb10oInZlcnRpY2FsQWxpZ24iLHkpfWdldCBmaWxsQ29sb3IoKXtyZXR1cm4gdGhpc1tjXSgiZmlsbENvbG9yIil9c2V0IGZpbGxDb2xvcih5KXt0aGlzW29dKCJmaWxsQ29sb3IiLE9iamVjdChhLnBhcnNlQ29sb3IpKHkpKX1nZXQgZm9udCgpe2NvbnN0e2ZvbnRTdHlsZTp5LGZvbnRWYXJpYW50Ok8sZm9udFdlaWdodDp4LGZvbnRTdHJldGNoOnYsZm9udFNpemU6VCxsaW5lSGVpZ2h0OmwsZm9udEZhbWlseTpofT10aGlzO3JldHVybmAke3l9ICR7T30gJHt4fSAke3Z9ICR7VH1weC8ke2x9cHggJHtofWB9c2V0IGZvbnQoeSl7aWYoeT09bnVsbCl0aGlzLmZvbnRTdHlsZT1udWxsLHRoaXMuZm9udFZhcmlhbnQ9bnVsbCx0aGlzLmZvbnRXZWlnaHQ9bnVsbCx0aGlzLmZvbnRTdHJldGNoPW51bGwsdGhpcy5mb250U2l6ZT1udWxsLHRoaXMubGluZUhlaWdodD1udWxsLHRoaXMuZm9udEZhbWlseT1udWxsO2Vsc2V7Y29uc3QgTz1PYmplY3QoZS5wYXJzZUZvbnQpKHkpO3RoaXMuZm9udFN0eWxlPU8uc3R5bGUsdGhpcy5mb250VmFyaWFudD1PLnZhcmlhbnQsdGhpcy5mb250V2VpZ2h0PU8ud2VpZ2h0LHRoaXMuZm9udFN0cmV0Y2g9Ty5zdHJldGNoLHRoaXMuZm9udFNpemU9T2JqZWN0KG4udG9OdW1iZXIpKGAke08uc2l6ZX0ke08udW5pdH1gKSxPLmxpbmVIZWlnaHQmJih0aGlzLmxpbmVIZWlnaHQ9Ty5weExpbmVIZWlnaHQpLHRoaXMuZm9udEZhbWlseT1PLmZhbWlseX19fX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4geX0pO3ZhciBlPXQoMTIpLG49dCgyMTkpLGE9dCgyNTEpLHM9dCgyMTMpLGk9dCgyNTIpO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtmdW5jdGlvbiBvKE8seCx2KXtyZXR1cm4geCBpbiBPP09iamVjdC5kZWZpbmVQcm9wZXJ0eShPLHgse3ZhbHVlOnYsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTpPW3hdPXYsT31jb25zdCBjPVN5bWJvbCgiek9yZGVyIiksbT1TeW1ib2woIm9yZGVyZWQiKSx1PVN5bWJvbCgiY2hpbGRyZW4iKSxwPVN5bWJvbCgic2VhbGVkIik7Y2xhc3MgeSBleHRlbmRzIG4uZGVmYXVsdHtjb25zdHJ1Y3Rvcih4PXt9KXtzdXBlcih4KSx0aGlzW3VdPVtdLHRoaXNbbV09bnVsbCx0aGlzW2NdPTB9Z2V0IGNoaWxkTm9kZXMoKXtyZXR1cm4gdGhpc1t1XX1nZXQgY2hpbGRyZW4oKXtyZXR1cm4gdGhpc1t1XX1nZXQgb3JkZXJlZENoaWxkcmVuKCl7cmV0dXJuIHRoaXNbbV18fCh0aGlzW21dPVsuLi50aGlzW3VdXSx0aGlzW21dLnNvcnQoKHgsdik9PnguekluZGV4LXYuekluZGV4fHx4LnpPcmRlci12LnpPcmRlcikpLHRoaXNbbV19YXBwZW5kKC4uLngpe3JldHVybiB4Lm1hcCh2PT50aGlzLmFwcGVuZENoaWxkKHYpKX1hcHBlbmRDaGlsZCh4KXtyZXR1cm4geC5yZW1vdmUoKSx0aGlzW3VdLnB1c2goeCkseC5jb25uZWN0KHRoaXMsdGhpc1tjXSsrKSx0aGlzW21dJiYodGhpc1ttXS5sZW5ndGgmJnguekluZGV4PHRoaXNbbV1bdGhpc1ttXS5sZW5ndGgtMV0uekluZGV4P3RoaXMucmVvcmRlcigpOnRoaXNbbV0ucHVzaCh4KSkseH1jbG9uZU5vZGUoeD0hMSl7Y29uc3Qgdj1zdXBlci5jbG9uZU5vZGUoKTtyZXR1cm4geCYmdGhpc1t1XS5mb3JFYWNoKFQ9Pntjb25zdCBsPVQuY2xvbmVOb2RlKHgpO3YuYXBwZW5kQ2hpbGQobCl9KSx2fWRpc3BhdGNoUG9pbnRlckV2ZW50KHgpe2NvbnN0IHY9dGhpcy5vcmRlcmVkQ2hpbGRyZW47Zm9yKGxldCBUPXYubGVuZ3RoLTE7VD49MDtULS0paWYodltUXS5kaXNwYXRjaFBvaW50ZXJFdmVudCh4KSlyZXR1cm4hMDtyZXR1cm4gc3VwZXIuZGlzcGF0Y2hQb2ludGVyRXZlbnQoeCl9ZHJhdyh4PVtdKXtpZih0aGlzLl9fY2FjaGVSZW5kZXJNYXRyaXg9dGhpcy5yZW5kZXJNYXRyaXgsc3VwZXIuZHJhdyh4KSwhdGhpc1twXSYmdGhpcy5hdHRyaWJ1dGVzLmRpc3BsYXkhPT0ibm9uZSIpe2NvbnN0IHY9dGhpcy5vcmRlcmVkQ2hpbGRyZW47Zm9yKGxldCBUPTA7VDx2Lmxlbmd0aDtUKyspdltUXS5kcmF3KHgpfXJldHVybiB0aGlzLl9fY2FjaGVSZW5kZXJNYXRyaXg9bnVsbCx4fWdldEVsZW1lbnRCeUlkKHgpe3JldHVybiBPYmplY3QoaS5xdWVyeVNlbGVjdG9yKShgIyR7eH1gLHRoaXMpfWdldEVsZW1lbnRzQnlDbGFzc05hbWUoeCl7cmV0dXJuIE9iamVjdChpLnF1ZXJ5U2VsZWN0b3JBbGwpKGAuJHt4fWAsdGhpcyl9Z2V0RWxlbWVudHNCeU5hbWUoeCl7cmV0dXJuIE9iamVjdChpLnF1ZXJ5U2VsZWN0b3JBbGwpKGBbbmFtZT0iJHt4fSJdYCx0aGlzKX1nZXRFbGVtZW50c0J5VGFnTmFtZSh4KXtyZXR1cm4gT2JqZWN0KGkucXVlcnlTZWxlY3RvckFsbCkoeCx0aGlzKX1pbnNlcnRCZWZvcmUoeCx2KXtpZih2PT1udWxsKXJldHVybiB0aGlzLmFwcGVuZENoaWxkKHgpO3gucmVtb3ZlKCk7Y29uc3QgVD10aGlzW3VdLmluZGV4T2Yodik7aWYoVDwwKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCByZWZlcmVuY2Ugbm9kZS4iKTtjb25zdCBsPXYuek9yZGVyO2ZvcihsZXQgaD1UO2g8dGhpc1t1XS5sZW5ndGg7aCsrKXtjb25zdCBmPXRoaXNbdV1baF0uek9yZGVyLGc9dGhpc1t1XVtoXTtkZWxldGUgZy56T3JkZXIsT2JqZWN0LmRlZmluZVByb3BlcnR5KGcsInpPcmRlciIse3ZhbHVlOmYrMSx3cml0YWJsZTohMSxjb25maWd1cmFibGU6ITB9KX1pZih0aGlzW3VdLnNwbGljZShULDAseCkseC5jb25uZWN0KHRoaXMsbCksdGhpc1ttXSlpZih4LnpJbmRleCE9PXYuekluZGV4KXRoaXMucmVvcmRlcigpO2Vsc2V7Y29uc3QgaD10aGlzW21dLmluZGV4T2Yodik7dGhpc1ttXS5zcGxpY2UoaCwwLHgpfXJldHVybiB4fXF1ZXJ5U2VsZWN0b3IoeCl7cmV0dXJuIE9iamVjdChpLnF1ZXJ5U2VsZWN0b3IpKHgsdGhpcyl9cXVlcnlTZWxlY3RvckFsbCh4KXtyZXR1cm4gT2JqZWN0KGkucXVlcnlTZWxlY3RvckFsbCkoeCx0aGlzKX1yZXBsYWNlQ2hpbGQoeCx2KXt4LnJlbW92ZSgpO2NvbnN0IFQ9dGhpc1t1XS5pbmRleE9mKHYpO2lmKFQ8MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgcmVmZXJlbmNlIG5vZGUuIik7aWYodGhpc1t1XVtUXT14LHguY29ubmVjdCh0aGlzLHYuek9yZGVyKSx0aGlzW21dKWlmKHguekluZGV4IT09di56SW5kZXgpdGhpcy5yZW9yZGVyKCk7ZWxzZXtjb25zdCBsPXRoaXNbbV0uaW5kZXhPZih2KTt0aGlzW21dW2xdPXh9cmV0dXJuIHYuZGlzY29ubmVjdCh0aGlzKSx4fXJlbW92ZUFsbENoaWxkcmVuKCl7Y29uc3QgeD10aGlzW3VdO2ZvcihsZXQgdj14Lmxlbmd0aC0xO3Y+PTA7di0tKXhbdl0ucmVtb3ZlKCl9cmVtb3ZlQ2hpbGQoeCl7Y29uc3Qgdj10aGlzW3VdLmluZGV4T2YoeCk7aWYodj49MCl7aWYodGhpc1t1XS5zcGxpY2UodiwxKSx0aGlzW21dKXtjb25zdCBUPXRoaXNbbV0uaW5kZXhPZih4KTt0aGlzW21dLnNwbGljZShULDEpfXJldHVybiB4LmRpc2Nvbm5lY3QodGhpcykseH1yZXR1cm4gbnVsbH1yZW9yZGVyKCl7dGhpc1ttXT1udWxsfXNlYWwoKXtmdW5jdGlvbiB4KGgsZil7Y29uc3QgZz1bXTtmb3IobGV0IE09MDtNPGgubGVuZ3RoO00rKyl7Y29uc3QgQT1bLi4uaFtNXV07Zm9yKGxldCBDPTE7QzxBLmxlbmd0aDtDKz0yKXtjb25zdCBiPUFbQ10sRT1BW0MrMV07QVtDXT1iKmZbMF0rRSpmWzJdK2ZbNF0sQVtDKzFdPWIqZlsxXStFKmZbM10rZls1XX1nLnB1c2goQSl9cmV0dXJuIGd9Y29uc3Qgdj10aGlzLm9yZGVyZWRDaGlsZHJlbixUPW5ldyBlLkZpZ3VyZTJELGw9dGhpcy5sb2NhbE1hdHJpeDtmb3IobGV0IGg9MDtoPHYubGVuZ3RoO2grKyl7bGV0IGY9dltoXTtpZihmIGluc3RhbmNlb2YgeSYmKGY9Zi5zZWFsKCkpLGYuY2xpZW50Qm94KXtsZXQgZz1mLmNsaWVudEJveC5jb250b3Vycy5wYXRoO2c9eChnLGYubG9jYWxNYXRyaXgpLFQuYWRkUGF0aChnKX1pZihmLnBhdGgpe2xldCBnPWYucGF0aC5jb250b3Vycy5wYXRoO2c9eChnLGYubG9jYWxNYXRyaXgpLFQuYWRkUGF0aChnKX19cmV0dXJuIHRoaXNbcF09ITAsdGhpcy5jbGllbnRCb3g9VCx7Y2xpZW50Qm94OlQsbG9jYWxNYXRyaXg6bH19c2V0UmVzb2x1dGlvbih7d2lkdGg6eCxoZWlnaHQ6dn0pe3N1cGVyLnNldFJlc29sdXRpb24oe3dpZHRoOngsaGVpZ2h0OnZ9KSx0aGlzW3VdLmZvckVhY2goVD0+e1Quc2V0UmVzb2x1dGlvbih7d2lkdGg6eCxoZWlnaHQ6dn0pfSl9dXBkYXRlQ29udG91cnMoKXt0aGlzW3BdfHxzdXBlci51cGRhdGVDb250b3VycygpfX1vKHksIkF0dHIiLGEuZGVmYXVsdCkscy5kZWZhdWx0LnJlZ2lzdGVyTm9kZSh5LCJncm91cCIpfSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJkZWZhdWx0IixmdW5jdGlvbigpe3JldHVybiBufSk7dmFyIGU9dCgyMjApO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtjbGFzcyBuIGV4dGVuZHMgZS5kZWZhdWx0e319LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsInF1ZXJ5U2VsZWN0b3JBbGwiLGZ1bmN0aW9uKCl7cmV0dXJuIHB9KSx0LmQociwicXVlcnlTZWxlY3RvciIsZnVuY3Rpb24oKXtyZXR1cm4geX0pLHQuZChyLCJpc01hdGNoZWQiLGZ1bmN0aW9uKCl7cmV0dXJuIE99KSx0LmQociwiY29tcGlsZSIsZnVuY3Rpb24oKXtyZXR1cm4geH0pO3ZhciBlPXQoMjIxKSxuPXQoMjEzKTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7Y29uc3QgYT10KDI1Myk7ZnVuY3Rpb24gcyh2KXtyZXR1cm4gdi5ub2RlVHlwZT09PTF8fG4uZGVmYXVsdC5pc1Nwcml0ZU5vZGUodi5ub2RlTmFtZSl9ZnVuY3Rpb24gaSh2KXtyZXR1cm4gQXJyYXkuZnJvbSh2LmNoaWxkTm9kZXN8fFtdKX1mdW5jdGlvbiBvKHYpe3JldHVybiBuLmRlZmF1bHQuaXNTcHJpdGVOb2RlKHYubm9kZU5hbWUpP3YucGFyZW50fHx2LmNhbnZhc3x8di5jb250YWluZXI6di5wYXJlbnRFbGVtZW50fWZ1bmN0aW9uIGModil7bGV0IFQ9di5sZW5ndGgsbCxoLGY7Zm9yKDstLVQ+LTE7KXtmb3IobD1oPXZbVF0sdltUXT1udWxsLGY9ITA7aDspe2lmKHYuaW5kZXhPZihoKT4tMSl7Zj0hMSx2LnNwbGljZShULDEpO2JyZWFrfWg9byhoKX1mJiYodltUXT1sKX1yZXR1cm4gdn1jb25zdCBtPXtpc1RhZzpzLGV4aXN0c09uZSh2LFQpe3JldHVybiBULnNvbWUobD0+cyhsKT92KGwpfHxtLmV4aXN0c09uZSh2LGkobCkpOiExKX0sZ2V0U2libGluZ3Modil7Y29uc3QgVD1vKHYpO3JldHVybiBUJiZpKFQpfSxnZXRDaGlsZHJlbjppLGdldFBhcmVudDpvLGdldEF0dHJpYnV0ZVZhbHVlKHYsVCl7aWYodi5ub2RlVHlwZT09PTEmJlQ9PT0iY2xhc3MifHxUPT09ImlkIilyZXR1cm4gdltUXTtpZih0aGlzLmhhc0F0dHJpYih2LFQpKXtsZXQgbD12LmF0dHJpYnV0ZXNbVF07cmV0dXJuIEFycmF5LmlzQXJyYXkobCkmJihsPWBbJHtsLmpvaW4oKX1dYCksU3RyaW5nKGwpfX0saGFzQXR0cmliKHYsVCl7cmV0dXJuIHYuYXR0cmlidXRlc1tUXSE9bnVsbH0scmVtb3ZlU3Vic2V0czpjLGdldE5hbWUodil7cmV0dXJuIHYudGFnTmFtZT92LnRhZ05hbWUudG9Mb3dlckNhc2UoKTpudWxsfSxmaW5kT25lOmZ1bmN0aW9uIHYoVCxsKXtsZXQgaD1udWxsO2ZvcihsZXQgZj0wLGc9bC5sZW5ndGg7ZjxnJiYhaDtmKyspaWYoVChsW2ZdKSloPWxbZl07ZWxzZXtjb25zdCBNPWkobFtmXSk7TSYmTS5sZW5ndGg+MCYmKGg9dihULE0pKX1yZXR1cm4gaH0sZmluZEFsbDpmdW5jdGlvbiB2KFQsbCl7bGV0IGg9W107Zm9yKGxldCBmPTAsZz1sLmxlbmd0aDtmPGc7ZisrKXtpZighcyhsW2ZdKSljb250aW51ZTtUKGxbZl0pJiZoLnB1c2gobFtmXSk7Y29uc3QgTT1pKGxbZl0pO00mJihoPWguY29uY2F0KHYoVCxNKSkpfXJldHVybiBofSxnZXRUZXh0OmZ1bmN0aW9uIHYoVCl7cmV0dXJuIEFycmF5LmlzQXJyYXkoVCk/VC5tYXAodikuam9pbigiIik6cyhUKT92KGkoVCkpOlQubm9kZVR5cGU9PT0zP1Qubm9kZVZhbHVlOm4uZGVmYXVsdC5pc1Nwcml0ZU5vZGUoVC5ub2RlTmFtZSk/VC50ZXh0OiIifX07ZnVuY3Rpb24gdSh2KXtpZih0eXBlb2YgdiE9InN0cmluZyIpcmV0dXJuIHY7bGV0IFQ9di5tYXRjaCgvXFsoYmdjb2xvcnxmaWxsQ29sb3J8c3Ryb2tlQ29sb3J8Y29sb3IpXHMqPVxzKlsnIl0/XHcrWyciXT9cXS9nKTtyZXR1cm4gVCYmKFQ9VC5tYXAobD0+e2NvbnN0IGg9bC5zbGljZSgxLC0xKS5zcGxpdCgiPSIpLGY9T2JqZWN0KGUucGFyc2VDb2xvcikoaFsxXS5yZXBsYWNlKC9bJyJdL2csIiIpKTtyZXR1cm5bbCxgWyR7aFswXX09IiR7Zn0iXWBdfSksVC5mb3JFYWNoKChbbCxoXSk9Pnt2PXYucmVwbGFjZShsLGgpfSkpLFQ9di5tYXRjaCgvXFtcdytccyo9XHMqWyciXVxbLis/XF1bJyJdXF0vZyksVCYmKFQ9VC5tYXAobD0+e2NvbnN0IGg9bC5zbGljZSgxLC0xKS5zcGxpdCgiPSIpLGY9aFsxXS5zbGljZSgyLC0yKS5zcGxpdCgvLC9nKS5tYXAoZz0+Zy50cmltKCkpO3JldHVybltsLGBbJHtoWzBdfT0iWyR7Zn1dIl1gXX0pLFQuZm9yRWFjaCgoW2wsaF0pPT57dj12LnJlcGxhY2UobCxoKX0pKSx2fWZ1bmN0aW9uIHAodixUKXtyZXR1cm4gYS5zZWxlY3RBbGwodSh2KSxULHthZGFwdGVyOm19KX1mdW5jdGlvbiB5KHYsVCl7cmV0dXJuIGEuc2VsZWN0T25lKHUodiksVCx7YWRhcHRlcjptfSl9ZnVuY3Rpb24gTyh2LFQpe3JldHVybiBhLmlzKHYsdShUKSx7YWRhcHRlcjptfSl9ZnVuY3Rpb24geCh2KXtyZXR1cm4gYS5jb21waWxlKHUodikse2FkYXB0ZXI6bX0pfX0sZnVuY3Rpb24oZCxyLHQpe2QuZXhwb3J0cz14O3ZhciBlPXQoMjU0KSxuPXQoMjczKS5mYWxzZUZ1bmMsYT10KDI3NCk7ZnVuY3Rpb24gcyh2KXtyZXR1cm4gZnVuY3Rpb24obCxoLGYpe3JldHVybiBoPWh8fHt9LGguYWRhcHRlcj1oLmFkYXB0ZXJ8fGUsdihsLGgsZil9fXZhciBpPXMoYSksbz1zKGEuY29tcGlsZVVuc2FmZSk7ZnVuY3Rpb24gYyh2KXtyZXR1cm4gZnVuY3Rpb24obCxoLGYpe3JldHVybiBmPWZ8fHt9LGYuYWRhcHRlcj1mLmFkYXB0ZXJ8fGUsdHlwZW9mIGwhPSJmdW5jdGlvbiImJihsPW8obCxmLGgpKSxsLnNob3VsZFRlc3ROZXh0U2libGluZ3MmJihoPXUoZiYmZi5jb250ZXh0fHxoLGYuYWRhcHRlcikpLEFycmF5LmlzQXJyYXkoaCk/aD1mLmFkYXB0ZXIucmVtb3ZlU3Vic2V0cyhoKTpoPWYuYWRhcHRlci5nZXRDaGlsZHJlbihoKSx2KGwsaCxmKX19ZnVuY3Rpb24gbSh2LFQpe3ZhciBsPVQuZ2V0U2libGluZ3Modik7aWYoIUFycmF5LmlzQXJyYXkobCkpcmV0dXJuW107Zm9yKGw9bC5zbGljZSgwKTtsLnNoaWZ0KCkhPT12Oyk7cmV0dXJuIGx9ZnVuY3Rpb24gdSh2LFQpe0FycmF5LmlzQXJyYXkodil8fCh2PVt2XSk7Zm9yKHZhciBsPXYuc2xpY2UoMCksaD0wLGY9di5sZW5ndGg7aDxmO2grKyl7dmFyIGc9bShsW2hdLFQpO2wucHVzaC5hcHBseShsLGcpfXJldHVybiBsfXZhciBwPWMoZnVuY3Rpb24oVCxsLGgpe3JldHVybiBUPT09bnx8IWx8fGwubGVuZ3RoPT09MD9bXTpoLmFkYXB0ZXIuZmluZEFsbChULGwpfSkseT1jKGZ1bmN0aW9uKFQsbCxoKXtyZXR1cm4gVD09PW58fCFsfHxsLmxlbmd0aD09PTA/bnVsbDpoLmFkYXB0ZXIuZmluZE9uZShULGwpfSk7ZnVuY3Rpb24gTyh2LFQsbCl7cmV0dXJuIGw9bHx8e30sbC5hZGFwdGVyPWwuYWRhcHRlcnx8ZSwodHlwZW9mIFQ9PSJmdW5jdGlvbiI/VDppKFQsbCkpKHYpfWZ1bmN0aW9uIHgodixULGwpe3JldHVybiBwKHYsVCxsKX14LmNvbXBpbGU9aSx4LmZpbHRlcnM9YS5Qc2V1ZG9zLmZpbHRlcnMseC5wc2V1ZG9zPWEuUHNldWRvcy5wc2V1ZG9zLHguc2VsZWN0QWxsPXAseC5zZWxlY3RPbmU9eSx4LmlzPU8seC5wYXJzZT1pLHguaXRlcmF0ZT1wLHguX2NvbXBpbGVVbnNhZmU9byx4Ll9jb21waWxlVG9rZW49YS5jb21waWxlVG9rZW59LGZ1bmN0aW9uKGQscix0KXt2YXIgZT1kLmV4cG9ydHM7W3QoMjU1KSx0KDI2OCksdCgyNjkpLHQoMjcwKSx0KDI3MSksdCgyNzIpXS5mb3JFYWNoKGZ1bmN0aW9uKG4pe09iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24oYSl7ZVthXT1uW2FdLmJpbmQoZSl9KX0pfSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCgyNTYpLG49dCgyNTcpLGE9ZS5pc1RhZztkLmV4cG9ydHM9e2dldElubmVySFRNTDpzLGdldE91dGVySFRNTDpuLGdldFRleHQ6aX07ZnVuY3Rpb24gcyhvLGMpe3JldHVybiBvLmNoaWxkcmVuP28uY2hpbGRyZW4ubWFwKGZ1bmN0aW9uKG0pe3JldHVybiBuKG0sYyl9KS5qb2luKCIiKToiIn1mdW5jdGlvbiBpKG8pe3JldHVybiBBcnJheS5pc0FycmF5KG8pP28ubWFwKGkpLmpvaW4oIiIpOmEobyk/by5uYW1lPT09ImJyIj9gCmA6aShvLmNoaWxkcmVuKTpvLnR5cGU9PT1lLkNEQVRBP2koby5jaGlsZHJlbik6by50eXBlPT09ZS5UZXh0P28uZGF0YToiIn19LGZ1bmN0aW9uKGQscil7ZC5leHBvcnRzPXtUZXh0OiJ0ZXh0IixEaXJlY3RpdmU6ImRpcmVjdGl2ZSIsQ29tbWVudDoiY29tbWVudCIsU2NyaXB0OiJzY3JpcHQiLFN0eWxlOiJzdHlsZSIsVGFnOiJ0YWciLENEQVRBOiJjZGF0YSIsRG9jdHlwZToiZG9jdHlwZSIsaXNUYWc6ZnVuY3Rpb24odCl7cmV0dXJuIHQudHlwZT09PSJ0YWcifHx0LnR5cGU9PT0ic2NyaXB0Inx8dC50eXBlPT09InN0eWxlIn19fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCgyNTgpLG49dCgyNTkpLGE9dCgyNjcpO2EuZWxlbWVudE5hbWVzLl9fcHJvdG9fXz1udWxsLGEuYXR0cmlidXRlTmFtZXMuX19wcm90b19fPW51bGw7dmFyIHM9e19fcHJvdG9fXzpudWxsLHN0eWxlOiEwLHNjcmlwdDohMCx4bXA6ITAsaWZyYW1lOiEwLG5vZW1iZWQ6ITAsbm9mcmFtZXM6ITAscGxhaW50ZXh0OiEwLG5vc2NyaXB0OiEwfTtmdW5jdGlvbiBpKHYsVCl7aWYodil7dmFyIGw9IiIsaDtmb3IodmFyIGYgaW4gdiloPXZbZl0sbCYmKGwrPSIgIiksVC54bWxNb2RlPT09ImZvcmVpZ24iJiYoZj1hLmF0dHJpYnV0ZU5hbWVzW2ZdfHxmKSxsKz1mLChoIT09bnVsbCYmaCE9PSIifHxULnhtbE1vZGUpJiYobCs9Jz0iJysoVC5kZWNvZGVFbnRpdGllcz9uLmVuY29kZVhNTChoKTpoLnJlcGxhY2UoL1wiL2csIiZxdW90OyIpKSsnIicpO3JldHVybiBsfX12YXIgbz17X19wcm90b19fOm51bGwsYXJlYTohMCxiYXNlOiEwLGJhc2Vmb250OiEwLGJyOiEwLGNvbDohMCxjb21tYW5kOiEwLGVtYmVkOiEwLGZyYW1lOiEwLGhyOiEwLGltZzohMCxpbnB1dDohMCxpc2luZGV4OiEwLGtleWdlbjohMCxsaW5rOiEwLG1ldGE6ITAscGFyYW06ITAsc291cmNlOiEwLHRyYWNrOiEwLHdicjohMH0sYz1kLmV4cG9ydHM9ZnVuY3Rpb24odixUKXshQXJyYXkuaXNBcnJheSh2KSYmIXYuY2hlZXJpbyYmKHY9W3ZdKSxUPVR8fHt9O2Zvcih2YXIgbD0iIixoPTA7aDx2Lmxlbmd0aDtoKyspe3ZhciBmPXZbaF07Zi50eXBlPT09InJvb3QiP2wrPWMoZi5jaGlsZHJlbixUKTplLmlzVGFnKGYpP2wrPXUoZixUKTpmLnR5cGU9PT1lLkRpcmVjdGl2ZT9sKz1wKGYpOmYudHlwZT09PWUuQ29tbWVudD9sKz14KGYpOmYudHlwZT09PWUuQ0RBVEE/bCs9TyhmKTpsKz15KGYsVCl9cmV0dXJuIGx9LG09WyJtaSIsIm1vIiwibW4iLCJtcyIsIm10ZXh0IiwiYW5ub3RhdGlvbi14bWwiLCJmb3JlaWduT2JqZWN0IiwiZGVzYyIsInRpdGxlIl07ZnVuY3Rpb24gdSh2LFQpe1QueG1sTW9kZT09PSJmb3JlaWduIiYmKHYubmFtZT1hLmVsZW1lbnROYW1lc1t2Lm5hbWVdfHx2Lm5hbWUsdi5wYXJlbnQmJm0uaW5kZXhPZih2LnBhcmVudC5uYW1lKT49MCYmKFQ9T2JqZWN0LmFzc2lnbih7fSxULHt4bWxNb2RlOiExfSkpKSwhVC54bWxNb2RlJiZbInN2ZyIsIm1hdGgiXS5pbmRleE9mKHYubmFtZSk+PTAmJihUPU9iamVjdC5hc3NpZ24oe30sVCx7eG1sTW9kZToiZm9yZWlnbiJ9KSk7dmFyIGw9IjwiK3YubmFtZSxoPWkodi5hdHRyaWJzLFQpO3JldHVybiBoJiYobCs9IiAiK2gpLFQueG1sTW9kZSYmKCF2LmNoaWxkcmVufHx2LmNoaWxkcmVuLmxlbmd0aD09PTApP2wrPSIvPiI6KGwrPSI+Iix2LmNoaWxkcmVuJiYobCs9Yyh2LmNoaWxkcmVuLFQpKSwoIW9bdi5uYW1lXXx8VC54bWxNb2RlKSYmKGwrPSI8LyIrdi5uYW1lKyI+IikpLGx9ZnVuY3Rpb24gcCh2KXtyZXR1cm4iPCIrdi5kYXRhKyI+In1mdW5jdGlvbiB5KHYsVCl7dmFyIGw9di5kYXRhfHwiIjtyZXR1cm4gVC5kZWNvZGVFbnRpdGllcyYmISh2LnBhcmVudCYmdi5wYXJlbnQubmFtZSBpbiBzKSYmKGw9bi5lbmNvZGVYTUwobCkpLGx9ZnVuY3Rpb24gTyh2KXtyZXR1cm4iPCFbQ0RBVEFbIit2LmNoaWxkcmVuWzBdLmRhdGErIl1dPiJ9ZnVuY3Rpb24geCh2KXtyZXR1cm4iPCEtLSIrdi5kYXRhKyItLT4ifX0sZnVuY3Rpb24oZCxyLHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtmdW5jdGlvbiBlKG4pe3JldHVybiBuLnR5cGU9PT0idGFnInx8bi50eXBlPT09InNjcmlwdCJ8fG4udHlwZT09PSJzdHlsZSJ9ci5pc1RhZz1lLHIuVGV4dD0idGV4dCIsci5EaXJlY3RpdmU9ImRpcmVjdGl2ZSIsci5Db21tZW50PSJjb21tZW50IixyLlNjcmlwdD0ic2NyaXB0IixyLlN0eWxlPSJzdHlsZSIsci5UYWc9InRhZyIsci5DREFUQT0iY2RhdGEiLHIuRG9jdHlwZT0iZG9jdHlwZSJ9LGZ1bmN0aW9uKGQscix0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksci5lbmNvZGU9ci5kZWNvZGVTdHJpY3Q9ci5kZWNvZGU9dm9pZCAwO3ZhciBlPXQoMjYwKSxuPXQoMjY2KTtmdW5jdGlvbiBhKG0sdSl7cmV0dXJuKCF1fHx1PD0wP2UuZGVjb2RlWE1MOmUuZGVjb2RlSFRNTCkobSl9ci5kZWNvZGU9YTtmdW5jdGlvbiBzKG0sdSl7cmV0dXJuKCF1fHx1PD0wP2UuZGVjb2RlWE1MOmUuZGVjb2RlSFRNTFN0cmljdCkobSl9ci5kZWNvZGVTdHJpY3Q9cztmdW5jdGlvbiBpKG0sdSl7cmV0dXJuKCF1fHx1PD0wP24uZW5jb2RlWE1MOm4uZW5jb2RlSFRNTCkobSl9ci5lbmNvZGU9aTt2YXIgbz10KDI2Nik7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsImVuY29kZVhNTCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG8uZW5jb2RlWE1MfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJlbmNvZGVIVE1MIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gby5lbmNvZGVIVE1MfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJlc2NhcGUiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBvLmVzY2FwZX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkociwiZW5jb2RlSFRNTDQiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBvLmVuY29kZUhUTUx9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsImVuY29kZUhUTUw1Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gby5lbmNvZGVIVE1MfX0pO3ZhciBjPXQoMjYwKTtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiZGVjb2RlWE1MIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYy5kZWNvZGVYTUx9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsImRlY29kZUhUTUwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBjLmRlY29kZUhUTUx9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsImRlY29kZUhUTUxTdHJpY3QiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBjLmRlY29kZUhUTUxTdHJpY3R9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsImRlY29kZUhUTUw0Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYy5kZWNvZGVIVE1MfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJkZWNvZGVIVE1MNSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGMuZGVjb2RlSFRNTH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkociwiZGVjb2RlSFRNTDRTdHJpY3QiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBjLmRlY29kZUhUTUxTdHJpY3R9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsImRlY29kZUhUTUw1U3RyaWN0Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYy5kZWNvZGVIVE1MU3RyaWN0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJkZWNvZGVYTUxTdHJpY3QiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBjLmRlY29kZVhNTH19KX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbih1KXtyZXR1cm4gdSYmdS5fX2VzTW9kdWxlP3U6e2RlZmF1bHQ6dX19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxyLmRlY29kZUhUTUw9ci5kZWNvZGVIVE1MU3RyaWN0PXIuZGVjb2RlWE1MPXZvaWQgMDt2YXIgbj1lKHQoMjYxKSksYT1lKHQoMjYyKSkscz1lKHQoMjYzKSksaT1lKHQoMjY0KSk7ci5kZWNvZGVYTUw9byhzLmRlZmF1bHQpLHIuZGVjb2RlSFRNTFN0cmljdD1vKG4uZGVmYXVsdCk7ZnVuY3Rpb24gbyh1KXt2YXIgcD1PYmplY3Qua2V5cyh1KS5qb2luKCJ8IikseT1tKHUpO3ArPSJ8I1t4WF1bXFxkYS1mQS1GXSt8I1xcZCsiO3ZhciBPPW5ldyBSZWdFeHAoIiYoPzoiK3ArIik7IiwiZyIpO3JldHVybiBmdW5jdGlvbih4KXtyZXR1cm4gU3RyaW5nKHgpLnJlcGxhY2UoTyx5KX19dmFyIGM9ZnVuY3Rpb24odSxwKXtyZXR1cm4gdTxwPzE6LTF9O3IuZGVjb2RlSFRNTD1mdW5jdGlvbigpe2Zvcih2YXIgdT1PYmplY3Qua2V5cyhhLmRlZmF1bHQpLnNvcnQoYykscD1PYmplY3Qua2V5cyhuLmRlZmF1bHQpLnNvcnQoYykseT0wLE89MDt5PHAubGVuZ3RoO3krKyl1W09dPT09cFt5XT8ocFt5XSs9Ijs/IixPKyspOnBbeV0rPSI7Ijt2YXIgeD1uZXcgUmVnRXhwKCImKD86IitwLmpvaW4oInwiKSsifCNbeFhdW1xcZGEtZkEtRl0rOz98I1xcZCs7PykiLCJnIiksdj1tKG4uZGVmYXVsdCk7ZnVuY3Rpb24gVChsKXtyZXR1cm4gbC5zdWJzdHIoLTEpIT09IjsiJiYobCs9IjsiKSx2KGwpfXJldHVybiBmdW5jdGlvbihsKXtyZXR1cm4gU3RyaW5nKGwpLnJlcGxhY2UoeCxUKX19KCk7ZnVuY3Rpb24gbSh1KXtyZXR1cm4gZnVuY3Rpb24oeSl7aWYoeS5jaGFyQXQoMSk9PT0iIyIpe3ZhciBPPXkuY2hhckF0KDIpO3JldHVybiBPPT09IlgifHxPPT09IngiP2kuZGVmYXVsdChwYXJzZUludCh5LnN1YnN0cigzKSwxNikpOmkuZGVmYXVsdChwYXJzZUludCh5LnN1YnN0cigyKSwxMCkpfXJldHVybiB1W3kuc2xpY2UoMSwtMSldfX19LGZ1bmN0aW9uKGQpe2QuZXhwb3J0cz1KU09OLnBhcnNlKCd7IkFhY3V0ZSI6IsOBIiwiYWFjdXRlIjoiw6EiLCJBYnJldmUiOiLEgiIsImFicmV2ZSI6IsSDIiwiYWMiOiLiiL4iLCJhY2QiOiLiiL8iLCJhY0UiOiLiiL7MsyIsIkFjaXJjIjoiw4IiLCJhY2lyYyI6IsOiIiwiYWN1dGUiOiLCtCIsIkFjeSI6ItCQIiwiYWN5Ijoi0LAiLCJBRWxpZyI6IsOGIiwiYWVsaWciOiLDpiIsImFmIjoi4oGhIiwiQWZyIjoi8J2UhCIsImFmciI6IvCdlJ4iLCJBZ3JhdmUiOiLDgCIsImFncmF2ZSI6IsOgIiwiYWxlZnN5bSI6IuKEtSIsImFsZXBoIjoi4oS1IiwiQWxwaGEiOiLOkSIsImFscGhhIjoizrEiLCJBbWFjciI6IsSAIiwiYW1hY3IiOiLEgSIsImFtYWxnIjoi4qi/IiwiYW1wIjoiJiIsIkFNUCI6IiYiLCJhbmRhbmQiOiLiqZUiLCJBbmQiOiLiqZMiLCJhbmQiOiLiiKciLCJhbmRkIjoi4qmcIiwiYW5kc2xvcGUiOiLiqZgiLCJhbmR2Ijoi4qmaIiwiYW5nIjoi4oigIiwiYW5nZSI6IuKmpCIsImFuZ2xlIjoi4oigIiwiYW5nbXNkYWEiOiLipqgiLCJhbmdtc2RhYiI6IuKmqSIsImFuZ21zZGFjIjoi4qaqIiwiYW5nbXNkYWQiOiLipqsiLCJhbmdtc2RhZSI6IuKmrCIsImFuZ21zZGFmIjoi4qatIiwiYW5nbXNkYWciOiLipq4iLCJhbmdtc2RhaCI6IuKmryIsImFuZ21zZCI6IuKIoSIsImFuZ3J0Ijoi4oifIiwiYW5ncnR2YiI6IuKKviIsImFuZ3J0dmJkIjoi4qadIiwiYW5nc3BoIjoi4oiiIiwiYW5nc3QiOiLDhSIsImFuZ3phcnIiOiLijbwiLCJBb2dvbiI6IsSEIiwiYW9nb24iOiLEhSIsIkFvcGYiOiLwnZS4IiwiYW9wZiI6IvCdlZIiLCJhcGFjaXIiOiLiqa8iLCJhcCI6IuKJiCIsImFwRSI6IuKpsCIsImFwZSI6IuKJiiIsImFwaWQiOiLiiYsiLCJhcG9zIjoiXCciLCJBcHBseUZ1bmN0aW9uIjoi4oGhIiwiYXBwcm94Ijoi4omIIiwiYXBwcm94ZXEiOiLiiYoiLCJBcmluZyI6IsOFIiwiYXJpbmciOiLDpSIsIkFzY3IiOiLwnZKcIiwiYXNjciI6IvCdkrYiLCJBc3NpZ24iOiLiiZQiLCJhc3QiOiIqIiwiYXN5bXAiOiLiiYgiLCJhc3ltcGVxIjoi4omNIiwiQXRpbGRlIjoiw4MiLCJhdGlsZGUiOiLDoyIsIkF1bWwiOiLDhCIsImF1bWwiOiLDpCIsImF3Y29uaW50Ijoi4oizIiwiYXdpbnQiOiLiqJEiLCJiYWNrY29uZyI6IuKJjCIsImJhY2tlcHNpbG9uIjoiz7YiLCJiYWNrcHJpbWUiOiLigLUiLCJiYWNrc2ltIjoi4oi9IiwiYmFja3NpbWVxIjoi4ouNIiwiQmFja3NsYXNoIjoi4oiWIiwiQmFydiI6IuKrpyIsImJhcnZlZSI6IuKKvSIsImJhcndlZCI6IuKMhSIsIkJhcndlZCI6IuKMhiIsImJhcndlZGdlIjoi4oyFIiwiYmJyayI6IuKOtSIsImJicmt0YnJrIjoi4o62IiwiYmNvbmciOiLiiYwiLCJCY3kiOiLQkSIsImJjeSI6ItCxIiwiYmRxdW8iOiLigJ4iLCJiZWNhdXMiOiLiiLUiLCJiZWNhdXNlIjoi4oi1IiwiQmVjYXVzZSI6IuKItSIsImJlbXB0eXYiOiLiprAiLCJiZXBzaSI6Is+2IiwiYmVybm91Ijoi4oSsIiwiQmVybm91bGxpcyI6IuKErCIsIkJldGEiOiLOkiIsImJldGEiOiLOsiIsImJldGgiOiLihLYiLCJiZXR3ZWVuIjoi4omsIiwiQmZyIjoi8J2UhSIsImJmciI6IvCdlJ8iLCJiaWdjYXAiOiLii4IiLCJiaWdjaXJjIjoi4pevIiwiYmlnY3VwIjoi4ouDIiwiYmlnb2RvdCI6IuKogCIsImJpZ29wbHVzIjoi4qiBIiwiYmlnb3RpbWVzIjoi4qiCIiwiYmlnc3FjdXAiOiLiqIYiLCJiaWdzdGFyIjoi4piFIiwiYmlndHJpYW5nbGVkb3duIjoi4pa9IiwiYmlndHJpYW5nbGV1cCI6IuKWsyIsImJpZ3VwbHVzIjoi4qiEIiwiYmlndmVlIjoi4ouBIiwiYmlnd2VkZ2UiOiLii4AiLCJia2Fyb3ciOiLipI0iLCJibGFja2xvemVuZ2UiOiLip6siLCJibGFja3NxdWFyZSI6IuKWqiIsImJsYWNrdHJpYW5nbGUiOiLilrQiLCJibGFja3RyaWFuZ2xlZG93biI6IuKWviIsImJsYWNrdHJpYW5nbGVsZWZ0Ijoi4peCIiwiYmxhY2t0cmlhbmdsZXJpZ2h0Ijoi4pa4IiwiYmxhbmsiOiLikKMiLCJibGsxMiI6IuKWkiIsImJsazE0Ijoi4paRIiwiYmxrMzQiOiLilpMiLCJibG9jayI6IuKWiCIsImJuZSI6Ij3ig6UiLCJibmVxdWl2Ijoi4omh4oOlIiwiYk5vdCI6IuKrrSIsImJub3QiOiLijJAiLCJCb3BmIjoi8J2UuSIsImJvcGYiOiLwnZWTIiwiYm90Ijoi4oqlIiwiYm90dG9tIjoi4oqlIiwiYm93dGllIjoi4ouIIiwiYm94Ym94Ijoi4qeJIiwiYm94ZGwiOiLilJAiLCJib3hkTCI6IuKVlSIsImJveERsIjoi4pWWIiwiYm94REwiOiLilZciLCJib3hkciI6IuKUjCIsImJveGRSIjoi4pWSIiwiYm94RHIiOiLilZMiLCJib3hEUiI6IuKVlCIsImJveGgiOiLilIAiLCJib3hIIjoi4pWQIiwiYm94aGQiOiLilKwiLCJib3hIZCI6IuKVpCIsImJveGhEIjoi4pWlIiwiYm94SEQiOiLilaYiLCJib3hodSI6IuKUtCIsImJveEh1Ijoi4pWnIiwiYm94aFUiOiLilagiLCJib3hIVSI6IuKVqSIsImJveG1pbnVzIjoi4oqfIiwiYm94cGx1cyI6IuKKniIsImJveHRpbWVzIjoi4oqgIiwiYm94dWwiOiLilJgiLCJib3h1TCI6IuKVmyIsImJveFVsIjoi4pWcIiwiYm94VUwiOiLilZ0iLCJib3h1ciI6IuKUlCIsImJveHVSIjoi4pWYIiwiYm94VXIiOiLilZkiLCJib3hVUiI6IuKVmiIsImJveHYiOiLilIIiLCJib3hWIjoi4pWRIiwiYm94dmgiOiLilLwiLCJib3h2SCI6IuKVqiIsImJveFZoIjoi4pWrIiwiYm94VkgiOiLilawiLCJib3h2bCI6IuKUpCIsImJveHZMIjoi4pWhIiwiYm94VmwiOiLilaIiLCJib3hWTCI6IuKVoyIsImJveHZyIjoi4pScIiwiYm94dlIiOiLilZ4iLCJib3hWciI6IuKVnyIsImJveFZSIjoi4pWgIiwiYnByaW1lIjoi4oC1IiwiYnJldmUiOiLLmCIsIkJyZXZlIjoiy5giLCJicnZiYXIiOiLCpiIsImJzY3IiOiLwnZK3IiwiQnNjciI6IuKErCIsImJzZW1pIjoi4oGPIiwiYnNpbSI6IuKIvSIsImJzaW1lIjoi4ouNIiwiYnNvbGIiOiLip4UiLCJic29sIjoiXFxcXCIsImJzb2xoc3ViIjoi4p+IIiwiYnVsbCI6IuKAoiIsImJ1bGxldCI6IuKAoiIsImJ1bXAiOiLiiY4iLCJidW1wRSI6IuKqriIsImJ1bXBlIjoi4omPIiwiQnVtcGVxIjoi4omOIiwiYnVtcGVxIjoi4omPIiwiQ2FjdXRlIjoixIYiLCJjYWN1dGUiOiLEhyIsImNhcGFuZCI6IuKphCIsImNhcGJyY3VwIjoi4qmJIiwiY2FwY2FwIjoi4qmLIiwiY2FwIjoi4oipIiwiQ2FwIjoi4ouSIiwiY2FwY3VwIjoi4qmHIiwiY2FwZG90Ijoi4qmAIiwiQ2FwaXRhbERpZmZlcmVudGlhbEQiOiLihYUiLCJjYXBzIjoi4oip77iAIiwiY2FyZXQiOiLigYEiLCJjYXJvbiI6IsuHIiwiQ2F5bGV5cyI6IuKErSIsImNjYXBzIjoi4qmNIiwiQ2Nhcm9uIjoixIwiLCJjY2Fyb24iOiLEjSIsIkNjZWRpbCI6IsOHIiwiY2NlZGlsIjoiw6ciLCJDY2lyYyI6IsSIIiwiY2NpcmMiOiLEiSIsIkNjb25pbnQiOiLiiLAiLCJjY3VwcyI6IuKpjCIsImNjdXBzc20iOiLiqZAiLCJDZG90IjoixIoiLCJjZG90IjoixIsiLCJjZWRpbCI6IsK4IiwiQ2VkaWxsYSI6IsK4IiwiY2VtcHR5diI6IuKmsiIsImNlbnQiOiLCoiIsImNlbnRlcmRvdCI6IsK3IiwiQ2VudGVyRG90IjoiwrciLCJjZnIiOiLwnZSgIiwiQ2ZyIjoi4oStIiwiQ0hjeSI6ItCnIiwiY2hjeSI6ItGHIiwiY2hlY2siOiLinJMiLCJjaGVja21hcmsiOiLinJMiLCJDaGkiOiLOpyIsImNoaSI6Is+HIiwiY2lyYyI6IsuGIiwiY2lyY2VxIjoi4omXIiwiY2lyY2xlYXJyb3dsZWZ0Ijoi4oa6IiwiY2lyY2xlYXJyb3dyaWdodCI6IuKGuyIsImNpcmNsZWRhc3QiOiLiipsiLCJjaXJjbGVkY2lyYyI6IuKKmiIsImNpcmNsZWRkYXNoIjoi4oqdIiwiQ2lyY2xlRG90Ijoi4oqZIiwiY2lyY2xlZFIiOiLCriIsImNpcmNsZWRTIjoi4pOIIiwiQ2lyY2xlTWludXMiOiLiipYiLCJDaXJjbGVQbHVzIjoi4oqVIiwiQ2lyY2xlVGltZXMiOiLiipciLCJjaXIiOiLil4siLCJjaXJFIjoi4qeDIiwiY2lyZSI6IuKJlyIsImNpcmZuaW50Ijoi4qiQIiwiY2lybWlkIjoi4quvIiwiY2lyc2NpciI6IuKngiIsIkNsb2Nrd2lzZUNvbnRvdXJJbnRlZ3JhbCI6IuKIsiIsIkNsb3NlQ3VybHlEb3VibGVRdW90ZSI6IuKAnSIsIkNsb3NlQ3VybHlRdW90ZSI6IuKAmSIsImNsdWJzIjoi4pmjIiwiY2x1YnN1aXQiOiLimaMiLCJjb2xvbiI6IjoiLCJDb2xvbiI6IuKItyIsIkNvbG9uZSI6IuKptCIsImNvbG9uZSI6IuKJlCIsImNvbG9uZXEiOiLiiZQiLCJjb21tYSI6IiwiLCJjb21tYXQiOiJAIiwiY29tcCI6IuKIgSIsImNvbXBmbiI6IuKImCIsImNvbXBsZW1lbnQiOiLiiIEiLCJjb21wbGV4ZXMiOiLihIIiLCJjb25nIjoi4omFIiwiY29uZ2RvdCI6IuKprSIsIkNvbmdydWVudCI6IuKJoSIsImNvbmludCI6IuKIriIsIkNvbmludCI6IuKIryIsIkNvbnRvdXJJbnRlZ3JhbCI6IuKIriIsImNvcGYiOiLwnZWUIiwiQ29wZiI6IuKEgiIsImNvcHJvZCI6IuKIkCIsIkNvcHJvZHVjdCI6IuKIkCIsImNvcHkiOiLCqSIsIkNPUFkiOiLCqSIsImNvcHlzciI6IuKElyIsIkNvdW50ZXJDbG9ja3dpc2VDb250b3VySW50ZWdyYWwiOiLiiLMiLCJjcmFyciI6IuKGtSIsImNyb3NzIjoi4pyXIiwiQ3Jvc3MiOiLiqK8iLCJDc2NyIjoi8J2SniIsImNzY3IiOiLwnZK4IiwiY3N1YiI6IuKrjyIsImNzdWJlIjoi4quRIiwiY3N1cCI6IuKrkCIsImNzdXBlIjoi4quSIiwiY3Rkb3QiOiLii68iLCJjdWRhcnJsIjoi4qS4IiwiY3VkYXJyciI6IuKktSIsImN1ZXByIjoi4oueIiwiY3Vlc2MiOiLii58iLCJjdWxhcnIiOiLihrYiLCJjdWxhcnJwIjoi4qS9IiwiY3VwYnJjYXAiOiLiqYgiLCJjdXBjYXAiOiLiqYYiLCJDdXBDYXAiOiLiiY0iLCJjdXAiOiLiiKoiLCJDdXAiOiLii5MiLCJjdXBjdXAiOiLiqYoiLCJjdXBkb3QiOiLiio0iLCJjdXBvciI6IuKphSIsImN1cHMiOiLiiKrvuIAiLCJjdXJhcnIiOiLihrciLCJjdXJhcnJtIjoi4qS8IiwiY3VybHllcXByZWMiOiLii54iLCJjdXJseWVxc3VjYyI6IuKLnyIsImN1cmx5dmVlIjoi4ouOIiwiY3VybHl3ZWRnZSI6IuKLjyIsImN1cnJlbiI6IsKkIiwiY3VydmVhcnJvd2xlZnQiOiLihrYiLCJjdXJ2ZWFycm93cmlnaHQiOiLihrciLCJjdXZlZSI6IuKLjiIsImN1d2VkIjoi4ouPIiwiY3djb25pbnQiOiLiiLIiLCJjd2ludCI6IuKIsSIsImN5bGN0eSI6IuKMrSIsImRhZ2dlciI6IuKAoCIsIkRhZ2dlciI6IuKAoSIsImRhbGV0aCI6IuKEuCIsImRhcnIiOiLihpMiLCJEYXJyIjoi4oahIiwiZEFyciI6IuKHkyIsImRhc2giOiLigJAiLCJEYXNodiI6IuKrpCIsImRhc2h2Ijoi4oqjIiwiZGJrYXJvdyI6IuKkjyIsImRibGFjIjoiy50iLCJEY2Fyb24iOiLEjiIsImRjYXJvbiI6IsSPIiwiRGN5Ijoi0JQiLCJkY3kiOiLQtCIsImRkYWdnZXIiOiLigKEiLCJkZGFyciI6IuKHiiIsIkREIjoi4oWFIiwiZGQiOiLihYYiLCJERG90cmFoZCI6IuKkkSIsImRkb3RzZXEiOiLiqbciLCJkZWciOiLCsCIsIkRlbCI6IuKIhyIsIkRlbHRhIjoizpQiLCJkZWx0YSI6Is60IiwiZGVtcHR5diI6IuKmsSIsImRmaXNodCI6IuKlvyIsIkRmciI6IvCdlIciLCJkZnIiOiLwnZShIiwiZEhhciI6IuKlpSIsImRoYXJsIjoi4oeDIiwiZGhhcnIiOiLih4IiLCJEaWFjcml0aWNhbEFjdXRlIjoiwrQiLCJEaWFjcml0aWNhbERvdCI6IsuZIiwiRGlhY3JpdGljYWxEb3VibGVBY3V0ZSI6IsudIiwiRGlhY3JpdGljYWxHcmF2ZSI6ImAiLCJEaWFjcml0aWNhbFRpbGRlIjoiy5wiLCJkaWFtIjoi4ouEIiwiZGlhbW9uZCI6IuKLhCIsIkRpYW1vbmQiOiLii4QiLCJkaWFtb25kc3VpdCI6IuKZpiIsImRpYW1zIjoi4pmmIiwiZGllIjoiwqgiLCJEaWZmZXJlbnRpYWxEIjoi4oWGIiwiZGlnYW1tYSI6Is+dIiwiZGlzaW4iOiLii7IiLCJkaXYiOiLDtyIsImRpdmlkZSI6IsO3IiwiZGl2aWRlb250aW1lcyI6IuKLhyIsImRpdm9ueCI6IuKLhyIsIkRKY3kiOiLQgiIsImRqY3kiOiLRkiIsImRsY29ybiI6IuKMniIsImRsY3JvcCI6IuKMjSIsImRvbGxhciI6IiQiLCJEb3BmIjoi8J2UuyIsImRvcGYiOiLwnZWVIiwiRG90IjoiwqgiLCJkb3QiOiLLmSIsIkRvdERvdCI6IuKDnCIsImRvdGVxIjoi4omQIiwiZG90ZXFkb3QiOiLiiZEiLCJEb3RFcXVhbCI6IuKJkCIsImRvdG1pbnVzIjoi4oi4IiwiZG90cGx1cyI6IuKIlCIsImRvdHNxdWFyZSI6IuKKoSIsImRvdWJsZWJhcndlZGdlIjoi4oyGIiwiRG91YmxlQ29udG91ckludGVncmFsIjoi4oivIiwiRG91YmxlRG90IjoiwqgiLCJEb3VibGVEb3duQXJyb3ciOiLih5MiLCJEb3VibGVMZWZ0QXJyb3ciOiLih5AiLCJEb3VibGVMZWZ0UmlnaHRBcnJvdyI6IuKHlCIsIkRvdWJsZUxlZnRUZWUiOiLiq6QiLCJEb3VibGVMb25nTGVmdEFycm93Ijoi4p+4IiwiRG91YmxlTG9uZ0xlZnRSaWdodEFycm93Ijoi4p+6IiwiRG91YmxlTG9uZ1JpZ2h0QXJyb3ciOiLin7kiLCJEb3VibGVSaWdodEFycm93Ijoi4oeSIiwiRG91YmxlUmlnaHRUZWUiOiLiiqgiLCJEb3VibGVVcEFycm93Ijoi4oeRIiwiRG91YmxlVXBEb3duQXJyb3ciOiLih5UiLCJEb3VibGVWZXJ0aWNhbEJhciI6IuKIpSIsIkRvd25BcnJvd0JhciI6IuKkkyIsImRvd25hcnJvdyI6IuKGkyIsIkRvd25BcnJvdyI6IuKGkyIsIkRvd25hcnJvdyI6IuKHkyIsIkRvd25BcnJvd1VwQXJyb3ciOiLih7UiLCJEb3duQnJldmUiOiLMkSIsImRvd25kb3duYXJyb3dzIjoi4oeKIiwiZG93bmhhcnBvb25sZWZ0Ijoi4oeDIiwiZG93bmhhcnBvb25yaWdodCI6IuKHgiIsIkRvd25MZWZ0UmlnaHRWZWN0b3IiOiLipZAiLCJEb3duTGVmdFRlZVZlY3RvciI6IuKlniIsIkRvd25MZWZ0VmVjdG9yQmFyIjoi4qWWIiwiRG93bkxlZnRWZWN0b3IiOiLihr0iLCJEb3duUmlnaHRUZWVWZWN0b3IiOiLipZ8iLCJEb3duUmlnaHRWZWN0b3JCYXIiOiLipZciLCJEb3duUmlnaHRWZWN0b3IiOiLih4EiLCJEb3duVGVlQXJyb3ciOiLihqciLCJEb3duVGVlIjoi4oqkIiwiZHJia2Fyb3ciOiLipJAiLCJkcmNvcm4iOiLijJ8iLCJkcmNyb3AiOiLijIwiLCJEc2NyIjoi8J2SnyIsImRzY3IiOiLwnZK5IiwiRFNjeSI6ItCFIiwiZHNjeSI6ItGVIiwiZHNvbCI6IuKntiIsIkRzdHJvayI6IsSQIiwiZHN0cm9rIjoixJEiLCJkdGRvdCI6IuKLsSIsImR0cmkiOiLilr8iLCJkdHJpZiI6IuKWviIsImR1YXJyIjoi4oe1IiwiZHVoYXIiOiLipa8iLCJkd2FuZ2xlIjoi4qamIiwiRFpjeSI6ItCPIiwiZHpjeSI6ItGfIiwiZHppZ3JhcnIiOiLin78iLCJFYWN1dGUiOiLDiSIsImVhY3V0ZSI6IsOpIiwiZWFzdGVyIjoi4qmuIiwiRWNhcm9uIjoixJoiLCJlY2Fyb24iOiLEmyIsIkVjaXJjIjoiw4oiLCJlY2lyYyI6IsOqIiwiZWNpciI6IuKJliIsImVjb2xvbiI6IuKJlSIsIkVjeSI6ItCtIiwiZWN5Ijoi0Y0iLCJlRERvdCI6IuKptyIsIkVkb3QiOiLEliIsImVkb3QiOiLElyIsImVEb3QiOiLiiZEiLCJlZSI6IuKFhyIsImVmRG90Ijoi4omSIiwiRWZyIjoi8J2UiCIsImVmciI6IvCdlKIiLCJlZyI6IuKqmiIsIkVncmF2ZSI6IsOIIiwiZWdyYXZlIjoiw6giLCJlZ3MiOiLiqpYiLCJlZ3Nkb3QiOiLiqpgiLCJlbCI6IuKqmSIsIkVsZW1lbnQiOiLiiIgiLCJlbGludGVycyI6IuKPpyIsImVsbCI6IuKEkyIsImVscyI6IuKqlSIsImVsc2RvdCI6IuKqlyIsIkVtYWNyIjoixJIiLCJlbWFjciI6IsSTIiwiZW1wdHkiOiLiiIUiLCJlbXB0eXNldCI6IuKIhSIsIkVtcHR5U21hbGxTcXVhcmUiOiLil7siLCJlbXB0eXYiOiLiiIUiLCJFbXB0eVZlcnlTbWFsbFNxdWFyZSI6IuKWqyIsImVtc3AxMyI6IuKAhCIsImVtc3AxNCI6IuKAhSIsImVtc3AiOiLigIMiLCJFTkciOiLFiiIsImVuZyI6IsWLIiwiZW5zcCI6IuKAgiIsIkVvZ29uIjoixJgiLCJlb2dvbiI6IsSZIiwiRW9wZiI6IvCdlLwiLCJlb3BmIjoi8J2VliIsImVwYXIiOiLii5UiLCJlcGFyc2wiOiLip6MiLCJlcGx1cyI6IuKpsSIsImVwc2kiOiLOtSIsIkVwc2lsb24iOiLOlSIsImVwc2lsb24iOiLOtSIsImVwc2l2Ijoiz7UiLCJlcWNpcmMiOiLiiZYiLCJlcWNvbG9uIjoi4omVIiwiZXFzaW0iOiLiiYIiLCJlcXNsYW50Z3RyIjoi4qqWIiwiZXFzbGFudGxlc3MiOiLiqpUiLCJFcXVhbCI6IuKptSIsImVxdWFscyI6Ij0iLCJFcXVhbFRpbGRlIjoi4omCIiwiZXF1ZXN0Ijoi4omfIiwiRXF1aWxpYnJpdW0iOiLih4wiLCJlcXVpdiI6IuKJoSIsImVxdWl2REQiOiLiqbgiLCJlcXZwYXJzbCI6IuKnpSIsImVyYXJyIjoi4qWxIiwiZXJEb3QiOiLiiZMiLCJlc2NyIjoi4oSvIiwiRXNjciI6IuKEsCIsImVzZG90Ijoi4omQIiwiRXNpbSI6IuKpsyIsImVzaW0iOiLiiYIiLCJFdGEiOiLOlyIsImV0YSI6Is63IiwiRVRIIjoiw5AiLCJldGgiOiLDsCIsIkV1bWwiOiLDiyIsImV1bWwiOiLDqyIsImV1cm8iOiLigqwiLCJleGNsIjoiISIsImV4aXN0Ijoi4oiDIiwiRXhpc3RzIjoi4oiDIiwiZXhwZWN0YXRpb24iOiLihLAiLCJleHBvbmVudGlhbGUiOiLihYciLCJFeHBvbmVudGlhbEUiOiLihYciLCJmYWxsaW5nZG90c2VxIjoi4omSIiwiRmN5Ijoi0KQiLCJmY3kiOiLRhCIsImZlbWFsZSI6IuKZgCIsImZmaWxpZyI6Iu+sgyIsImZmbGlnIjoi76yAIiwiZmZsbGlnIjoi76yEIiwiRmZyIjoi8J2UiSIsImZmciI6IvCdlKMiLCJmaWxpZyI6Iu+sgSIsIkZpbGxlZFNtYWxsU3F1YXJlIjoi4pe8IiwiRmlsbGVkVmVyeVNtYWxsU3F1YXJlIjoi4paqIiwiZmpsaWciOiJmaiIsImZsYXQiOiLima0iLCJmbGxpZyI6Iu+sgiIsImZsdG5zIjoi4paxIiwiZm5vZiI6IsaSIiwiRm9wZiI6IvCdlL0iLCJmb3BmIjoi8J2VlyIsImZvcmFsbCI6IuKIgCIsIkZvckFsbCI6IuKIgCIsImZvcmsiOiLii5QiLCJmb3JrdiI6IuKrmSIsIkZvdXJpZXJ0cmYiOiLihLEiLCJmcGFydGludCI6IuKojSIsImZyYWMxMiI6IsK9IiwiZnJhYzEzIjoi4oWTIiwiZnJhYzE0IjoiwrwiLCJmcmFjMTUiOiLihZUiLCJmcmFjMTYiOiLihZkiLCJmcmFjMTgiOiLihZsiLCJmcmFjMjMiOiLihZQiLCJmcmFjMjUiOiLihZYiLCJmcmFjMzQiOiLCviIsImZyYWMzNSI6IuKFlyIsImZyYWMzOCI6IuKFnCIsImZyYWM0NSI6IuKFmCIsImZyYWM1NiI6IuKFmiIsImZyYWM1OCI6IuKFnSIsImZyYWM3OCI6IuKFniIsImZyYXNsIjoi4oGEIiwiZnJvd24iOiLijKIiLCJmc2NyIjoi8J2SuyIsIkZzY3IiOiLihLEiLCJnYWN1dGUiOiLHtSIsIkdhbW1hIjoizpMiLCJnYW1tYSI6Is6zIiwiR2FtbWFkIjoiz5wiLCJnYW1tYWQiOiLPnSIsImdhcCI6IuKqhiIsIkdicmV2ZSI6IsSeIiwiZ2JyZXZlIjoixJ8iLCJHY2VkaWwiOiLEoiIsIkdjaXJjIjoixJwiLCJnY2lyYyI6IsSdIiwiR2N5Ijoi0JMiLCJnY3kiOiLQsyIsIkdkb3QiOiLEoCIsImdkb3QiOiLEoSIsImdlIjoi4omlIiwiZ0UiOiLiiaciLCJnRWwiOiLiqowiLCJnZWwiOiLii5siLCJnZXEiOiLiiaUiLCJnZXFxIjoi4omnIiwiZ2Vxc2xhbnQiOiLiqb4iLCJnZXNjYyI6IuKqqSIsImdlcyI6IuKpviIsImdlc2RvdCI6IuKqgCIsImdlc2RvdG8iOiLiqoIiLCJnZXNkb3RvbCI6IuKqhCIsImdlc2wiOiLii5vvuIAiLCJnZXNsZXMiOiLiqpQiLCJHZnIiOiLwnZSKIiwiZ2ZyIjoi8J2UpCIsImdnIjoi4omrIiwiR2ciOiLii5kiLCJnZ2ciOiLii5kiLCJnaW1lbCI6IuKEtyIsIkdKY3kiOiLQgyIsImdqY3kiOiLRkyIsImdsYSI6IuKqpSIsImdsIjoi4om3IiwiZ2xFIjoi4qqSIiwiZ2xqIjoi4qqkIiwiZ25hcCI6IuKqiiIsImduYXBwcm94Ijoi4qqKIiwiZ25lIjoi4qqIIiwiZ25FIjoi4ompIiwiZ25lcSI6IuKqiCIsImduZXFxIjoi4ompIiwiZ25zaW0iOiLii6ciLCJHb3BmIjoi8J2UviIsImdvcGYiOiLwnZWYIiwiZ3JhdmUiOiJgIiwiR3JlYXRlckVxdWFsIjoi4omlIiwiR3JlYXRlckVxdWFsTGVzcyI6IuKLmyIsIkdyZWF0ZXJGdWxsRXF1YWwiOiLiiaciLCJHcmVhdGVyR3JlYXRlciI6IuKqoiIsIkdyZWF0ZXJMZXNzIjoi4om3IiwiR3JlYXRlclNsYW50RXF1YWwiOiLiqb4iLCJHcmVhdGVyVGlsZGUiOiLiibMiLCJHc2NyIjoi8J2SoiIsImdzY3IiOiLihIoiLCJnc2ltIjoi4omzIiwiZ3NpbWUiOiLiqo4iLCJnc2ltbCI6IuKqkCIsImd0Y2MiOiLiqqciLCJndGNpciI6IuKpuiIsImd0IjoiPiIsIkdUIjoiPiIsIkd0Ijoi4omrIiwiZ3Rkb3QiOiLii5ciLCJndGxQYXIiOiLippUiLCJndHF1ZXN0Ijoi4qm8IiwiZ3RyYXBwcm94Ijoi4qqGIiwiZ3RyYXJyIjoi4qW4IiwiZ3RyZG90Ijoi4ouXIiwiZ3RyZXFsZXNzIjoi4oubIiwiZ3RyZXFxbGVzcyI6IuKqjCIsImd0cmxlc3MiOiLiibciLCJndHJzaW0iOiLiibMiLCJndmVydG5lcXEiOiLiianvuIAiLCJndm5FIjoi4omp77iAIiwiSGFjZWsiOiLLhyIsImhhaXJzcCI6IuKAiiIsImhhbGYiOiLCvSIsImhhbWlsdCI6IuKEiyIsIkhBUkRjeSI6ItCqIiwiaGFyZGN5Ijoi0YoiLCJoYXJyY2lyIjoi4qWIIiwiaGFyciI6IuKGlCIsImhBcnIiOiLih5QiLCJoYXJydyI6IuKGrSIsIkhhdCI6Il4iLCJoYmFyIjoi4oSPIiwiSGNpcmMiOiLEpCIsImhjaXJjIjoixKUiLCJoZWFydHMiOiLimaUiLCJoZWFydHN1aXQiOiLimaUiLCJoZWxsaXAiOiLigKYiLCJoZXJjb24iOiLiirkiLCJoZnIiOiLwnZSlIiwiSGZyIjoi4oSMIiwiSGlsYmVydFNwYWNlIjoi4oSLIiwiaGtzZWFyb3ciOiLipKUiLCJoa3N3YXJvdyI6IuKkpiIsImhvYXJyIjoi4oe/IiwiaG9tdGh0Ijoi4oi7IiwiaG9va2xlZnRhcnJvdyI6IuKGqSIsImhvb2tyaWdodGFycm93Ijoi4oaqIiwiaG9wZiI6IvCdlZkiLCJIb3BmIjoi4oSNIiwiaG9yYmFyIjoi4oCVIiwiSG9yaXpvbnRhbExpbmUiOiLilIAiLCJoc2NyIjoi8J2SvSIsIkhzY3IiOiLihIsiLCJoc2xhc2giOiLihI8iLCJIc3Ryb2siOiLEpiIsImhzdHJvayI6IsSnIiwiSHVtcERvd25IdW1wIjoi4omOIiwiSHVtcEVxdWFsIjoi4omPIiwiaHlidWxsIjoi4oGDIiwiaHlwaGVuIjoi4oCQIiwiSWFjdXRlIjoiw40iLCJpYWN1dGUiOiLDrSIsImljIjoi4oGjIiwiSWNpcmMiOiLDjiIsImljaXJjIjoiw64iLCJJY3kiOiLQmCIsImljeSI6ItC4IiwiSWRvdCI6IsSwIiwiSUVjeSI6ItCVIiwiaWVjeSI6ItC1IiwiaWV4Y2wiOiLCoSIsImlmZiI6IuKHlCIsImlmciI6IvCdlKYiLCJJZnIiOiLihJEiLCJJZ3JhdmUiOiLDjCIsImlncmF2ZSI6IsOsIiwiaWkiOiLihYgiLCJpaWlpbnQiOiLiqIwiLCJpaWludCI6IuKIrSIsImlpbmZpbiI6IuKnnCIsImlpb3RhIjoi4oSpIiwiSUpsaWciOiLEsiIsImlqbGlnIjoixLMiLCJJbWFjciI6IsSqIiwiaW1hY3IiOiLEqyIsImltYWdlIjoi4oSRIiwiSW1hZ2luYXJ5SSI6IuKFiCIsImltYWdsaW5lIjoi4oSQIiwiaW1hZ3BhcnQiOiLihJEiLCJpbWF0aCI6IsSxIiwiSW0iOiLihJEiLCJpbW9mIjoi4oq3IiwiaW1wZWQiOiLGtSIsIkltcGxpZXMiOiLih5IiLCJpbmNhcmUiOiLihIUiLCJpbiI6IuKIiCIsImluZmluIjoi4oieIiwiaW5maW50aWUiOiLip50iLCJpbm9kb3QiOiLEsSIsImludGNhbCI6IuKKuiIsImludCI6IuKIqyIsIkludCI6IuKIrCIsImludGVnZXJzIjoi4oSkIiwiSW50ZWdyYWwiOiLiiKsiLCJpbnRlcmNhbCI6IuKKuiIsIkludGVyc2VjdGlvbiI6IuKLgiIsImludGxhcmhrIjoi4qiXIiwiaW50cHJvZCI6IuKovCIsIkludmlzaWJsZUNvbW1hIjoi4oGjIiwiSW52aXNpYmxlVGltZXMiOiLigaIiLCJJT2N5Ijoi0IEiLCJpb2N5Ijoi0ZEiLCJJb2dvbiI6IsSuIiwiaW9nb24iOiLEryIsIklvcGYiOiLwnZWAIiwiaW9wZiI6IvCdlZoiLCJJb3RhIjoizpkiLCJpb3RhIjoizrkiLCJpcHJvZCI6IuKovCIsImlxdWVzdCI6IsK/IiwiaXNjciI6IvCdkr4iLCJJc2NyIjoi4oSQIiwiaXNpbiI6IuKIiCIsImlzaW5kb3QiOiLii7UiLCJpc2luRSI6IuKLuSIsImlzaW5zIjoi4ou0IiwiaXNpbnN2Ijoi4ouzIiwiaXNpbnYiOiLiiIgiLCJpdCI6IuKBoiIsIkl0aWxkZSI6IsSoIiwiaXRpbGRlIjoixKkiLCJJdWtjeSI6ItCGIiwiaXVrY3kiOiLRliIsIkl1bWwiOiLDjyIsIml1bWwiOiLDryIsIkpjaXJjIjoixLQiLCJqY2lyYyI6IsS1IiwiSmN5Ijoi0JkiLCJqY3kiOiLQuSIsIkpmciI6IvCdlI0iLCJqZnIiOiLwnZSnIiwiam1hdGgiOiLItyIsIkpvcGYiOiLwnZWBIiwiam9wZiI6IvCdlZsiLCJKc2NyIjoi8J2SpSIsImpzY3IiOiLwnZK/IiwiSnNlcmN5Ijoi0IgiLCJqc2VyY3kiOiLRmCIsIkp1a2N5Ijoi0IQiLCJqdWtjeSI6ItGUIiwiS2FwcGEiOiLOmiIsImthcHBhIjoizroiLCJrYXBwYXYiOiLPsCIsIktjZWRpbCI6IsS2Iiwia2NlZGlsIjoixLciLCJLY3kiOiLQmiIsImtjeSI6ItC6IiwiS2ZyIjoi8J2UjiIsImtmciI6IvCdlKgiLCJrZ3JlZW4iOiLEuCIsIktIY3kiOiLQpSIsImtoY3kiOiLRhSIsIktKY3kiOiLQjCIsImtqY3kiOiLRnCIsIktvcGYiOiLwnZWCIiwia29wZiI6IvCdlZwiLCJLc2NyIjoi8J2SpiIsImtzY3IiOiLwnZOAIiwibEFhcnIiOiLih5oiLCJMYWN1dGUiOiLEuSIsImxhY3V0ZSI6IsS6IiwibGFlbXB0eXYiOiLiprQiLCJsYWdyYW4iOiLihJIiLCJMYW1iZGEiOiLOmyIsImxhbWJkYSI6Is67IiwibGFuZyI6IuKfqCIsIkxhbmciOiLin6oiLCJsYW5nZCI6IuKmkSIsImxhbmdsZSI6IuKfqCIsImxhcCI6IuKqhSIsIkxhcGxhY2V0cmYiOiLihJIiLCJsYXF1byI6IsKrIiwibGFycmIiOiLih6QiLCJsYXJyYmZzIjoi4qSfIiwibGFyciI6IuKGkCIsIkxhcnIiOiLihp4iLCJsQXJyIjoi4oeQIiwibGFycmZzIjoi4qSdIiwibGFycmhrIjoi4oapIiwibGFycmxwIjoi4oarIiwibGFycnBsIjoi4qS5IiwibGFycnNpbSI6IuKlsyIsImxhcnJ0bCI6IuKGoiIsImxhdGFpbCI6IuKkmSIsImxBdGFpbCI6IuKkmyIsImxhdCI6IuKqqyIsImxhdGUiOiLiqq0iLCJsYXRlcyI6IuKqre+4gCIsImxiYXJyIjoi4qSMIiwibEJhcnIiOiLipI4iLCJsYmJyayI6IuKdsiIsImxicmFjZSI6InsiLCJsYnJhY2siOiJbIiwibGJya2UiOiLiposiLCJsYnJrc2xkIjoi4qaPIiwibGJya3NsdSI6IuKmjSIsIkxjYXJvbiI6IsS9IiwibGNhcm9uIjoixL4iLCJMY2VkaWwiOiLEuyIsImxjZWRpbCI6IsS8IiwibGNlaWwiOiLijIgiLCJsY3ViIjoieyIsIkxjeSI6ItCbIiwibGN5Ijoi0LsiLCJsZGNhIjoi4qS2IiwibGRxdW8iOiLigJwiLCJsZHF1b3IiOiLigJ4iLCJsZHJkaGFyIjoi4qWnIiwibGRydXNoYXIiOiLipYsiLCJsZHNoIjoi4oayIiwibGUiOiLiiaQiLCJsRSI6IuKJpiIsIkxlZnRBbmdsZUJyYWNrZXQiOiLin6giLCJMZWZ0QXJyb3dCYXIiOiLih6QiLCJsZWZ0YXJyb3ciOiLihpAiLCJMZWZ0QXJyb3ciOiLihpAiLCJMZWZ0YXJyb3ciOiLih5AiLCJMZWZ0QXJyb3dSaWdodEFycm93Ijoi4oeGIiwibGVmdGFycm93dGFpbCI6IuKGoiIsIkxlZnRDZWlsaW5nIjoi4oyIIiwiTGVmdERvdWJsZUJyYWNrZXQiOiLin6YiLCJMZWZ0RG93blRlZVZlY3RvciI6IuKloSIsIkxlZnREb3duVmVjdG9yQmFyIjoi4qWZIiwiTGVmdERvd25WZWN0b3IiOiLih4MiLCJMZWZ0Rmxvb3IiOiLijIoiLCJsZWZ0aGFycG9vbmRvd24iOiLihr0iLCJsZWZ0aGFycG9vbnVwIjoi4oa8IiwibGVmdGxlZnRhcnJvd3MiOiLih4ciLCJsZWZ0cmlnaHRhcnJvdyI6IuKGlCIsIkxlZnRSaWdodEFycm93Ijoi4oaUIiwiTGVmdHJpZ2h0YXJyb3ciOiLih5QiLCJsZWZ0cmlnaHRhcnJvd3MiOiLih4YiLCJsZWZ0cmlnaHRoYXJwb29ucyI6IuKHiyIsImxlZnRyaWdodHNxdWlnYXJyb3ciOiLihq0iLCJMZWZ0UmlnaHRWZWN0b3IiOiLipY4iLCJMZWZ0VGVlQXJyb3ciOiLihqQiLCJMZWZ0VGVlIjoi4oqjIiwiTGVmdFRlZVZlY3RvciI6IuKlmiIsImxlZnR0aHJlZXRpbWVzIjoi4ouLIiwiTGVmdFRyaWFuZ2xlQmFyIjoi4qePIiwiTGVmdFRyaWFuZ2xlIjoi4oqyIiwiTGVmdFRyaWFuZ2xlRXF1YWwiOiLiirQiLCJMZWZ0VXBEb3duVmVjdG9yIjoi4qWRIiwiTGVmdFVwVGVlVmVjdG9yIjoi4qWgIiwiTGVmdFVwVmVjdG9yQmFyIjoi4qWYIiwiTGVmdFVwVmVjdG9yIjoi4oa/IiwiTGVmdFZlY3RvckJhciI6IuKlkiIsIkxlZnRWZWN0b3IiOiLihrwiLCJsRWciOiLiqosiLCJsZWciOiLii5oiLCJsZXEiOiLiiaQiLCJsZXFxIjoi4ommIiwibGVxc2xhbnQiOiLiqb0iLCJsZXNjYyI6IuKqqCIsImxlcyI6IuKpvSIsImxlc2RvdCI6IuKpvyIsImxlc2RvdG8iOiLiqoEiLCJsZXNkb3RvciI6IuKqgyIsImxlc2ciOiLii5rvuIAiLCJsZXNnZXMiOiLiqpMiLCJsZXNzYXBwcm94Ijoi4qqFIiwibGVzc2RvdCI6IuKLliIsImxlc3NlcWd0ciI6IuKLmiIsImxlc3NlcXFndHIiOiLiqosiLCJMZXNzRXF1YWxHcmVhdGVyIjoi4ouaIiwiTGVzc0Z1bGxFcXVhbCI6IuKJpiIsIkxlc3NHcmVhdGVyIjoi4om2IiwibGVzc2d0ciI6IuKJtiIsIkxlc3NMZXNzIjoi4qqhIiwibGVzc3NpbSI6IuKJsiIsIkxlc3NTbGFudEVxdWFsIjoi4qm9IiwiTGVzc1RpbGRlIjoi4omyIiwibGZpc2h0Ijoi4qW8IiwibGZsb29yIjoi4oyKIiwiTGZyIjoi8J2UjyIsImxmciI6IvCdlKkiLCJsZyI6IuKJtiIsImxnRSI6IuKqkSIsImxIYXIiOiLipaIiLCJsaGFyZCI6IuKGvSIsImxoYXJ1Ijoi4oa8IiwibGhhcnVsIjoi4qWqIiwibGhibGsiOiLiloQiLCJMSmN5Ijoi0IkiLCJsamN5Ijoi0ZkiLCJsbGFyciI6IuKHhyIsImxsIjoi4omqIiwiTGwiOiLii5giLCJsbGNvcm5lciI6IuKMniIsIkxsZWZ0YXJyb3ciOiLih5oiLCJsbGhhcmQiOiLipasiLCJsbHRyaSI6IuKXuiIsIkxtaWRvdCI6IsS/IiwibG1pZG90IjoixYAiLCJsbW91c3RhY2hlIjoi4o6wIiwibG1vdXN0Ijoi4o6wIiwibG5hcCI6IuKqiSIsImxuYXBwcm94Ijoi4qqJIiwibG5lIjoi4qqHIiwibG5FIjoi4omoIiwibG5lcSI6IuKqhyIsImxuZXFxIjoi4omoIiwibG5zaW0iOiLii6YiLCJsb2FuZyI6IuKfrCIsImxvYXJyIjoi4oe9IiwibG9icmsiOiLin6YiLCJsb25nbGVmdGFycm93Ijoi4p+1IiwiTG9uZ0xlZnRBcnJvdyI6IuKftSIsIkxvbmdsZWZ0YXJyb3ciOiLin7giLCJsb25nbGVmdHJpZ2h0YXJyb3ciOiLin7ciLCJMb25nTGVmdFJpZ2h0QXJyb3ciOiLin7ciLCJMb25nbGVmdHJpZ2h0YXJyb3ciOiLin7oiLCJsb25nbWFwc3RvIjoi4p+8IiwibG9uZ3JpZ2h0YXJyb3ciOiLin7YiLCJMb25nUmlnaHRBcnJvdyI6IuKftiIsIkxvbmdyaWdodGFycm93Ijoi4p+5IiwibG9vcGFycm93bGVmdCI6IuKGqyIsImxvb3BhcnJvd3JpZ2h0Ijoi4oasIiwibG9wYXIiOiLipoUiLCJMb3BmIjoi8J2VgyIsImxvcGYiOiLwnZWdIiwibG9wbHVzIjoi4qitIiwibG90aW1lcyI6IuKotCIsImxvd2FzdCI6IuKIlyIsImxvd2JhciI6Il8iLCJMb3dlckxlZnRBcnJvdyI6IuKGmSIsIkxvd2VyUmlnaHRBcnJvdyI6IuKGmCIsImxveiI6IuKXiiIsImxvemVuZ2UiOiLil4oiLCJsb3pmIjoi4qerIiwibHBhciI6IigiLCJscGFybHQiOiLippMiLCJscmFyciI6IuKHhiIsImxyY29ybmVyIjoi4oyfIiwibHJoYXIiOiLih4siLCJscmhhcmQiOiLipa0iLCJscm0iOiLigI4iLCJscnRyaSI6IuKKvyIsImxzYXF1byI6IuKAuSIsImxzY3IiOiLwnZOBIiwiTHNjciI6IuKEkiIsImxzaCI6IuKGsCIsIkxzaCI6IuKGsCIsImxzaW0iOiLiibIiLCJsc2ltZSI6IuKqjSIsImxzaW1nIjoi4qqPIiwibHNxYiI6IlsiLCJsc3F1byI6IuKAmCIsImxzcXVvciI6IuKAmiIsIkxzdHJvayI6IsWBIiwibHN0cm9rIjoixYIiLCJsdGNjIjoi4qqmIiwibHRjaXIiOiLiqbkiLCJsdCI6IjwiLCJMVCI6IjwiLCJMdCI6IuKJqiIsImx0ZG90Ijoi4ouWIiwibHRocmVlIjoi4ouLIiwibHRpbWVzIjoi4ouJIiwibHRsYXJyIjoi4qW2IiwibHRxdWVzdCI6IuKpuyIsImx0cmkiOiLil4MiLCJsdHJpZSI6IuKKtCIsImx0cmlmIjoi4peCIiwibHRyUGFyIjoi4qaWIiwibHVyZHNoYXIiOiLipYoiLCJsdXJ1aGFyIjoi4qWmIiwibHZlcnRuZXFxIjoi4omo77iAIiwibHZuRSI6IuKJqO+4gCIsIm1hY3IiOiLCryIsIm1hbGUiOiLimYIiLCJtYWx0Ijoi4pygIiwibWFsdGVzZSI6IuKcoCIsIk1hcCI6IuKkhSIsIm1hcCI6IuKGpiIsIm1hcHN0byI6IuKGpiIsIm1hcHN0b2Rvd24iOiLihqciLCJtYXBzdG9sZWZ0Ijoi4oakIiwibWFwc3RvdXAiOiLihqUiLCJtYXJrZXIiOiLilq4iLCJtY29tbWEiOiLiqKkiLCJNY3kiOiLQnCIsIm1jeSI6ItC8IiwibWRhc2giOiLigJQiLCJtRERvdCI6IuKIuiIsIm1lYXN1cmVkYW5nbGUiOiLiiKEiLCJNZWRpdW1TcGFjZSI6IuKBnyIsIk1lbGxpbnRyZiI6IuKEsyIsIk1mciI6IvCdlJAiLCJtZnIiOiLwnZSqIiwibWhvIjoi4oSnIiwibWljcm8iOiLCtSIsIm1pZGFzdCI6IioiLCJtaWRjaXIiOiLiq7AiLCJtaWQiOiLiiKMiLCJtaWRkb3QiOiLCtyIsIm1pbnVzYiI6IuKKnyIsIm1pbnVzIjoi4oiSIiwibWludXNkIjoi4oi4IiwibWludXNkdSI6IuKoqiIsIk1pbnVzUGx1cyI6IuKIkyIsIm1sY3AiOiLiq5siLCJtbGRyIjoi4oCmIiwibW5wbHVzIjoi4oiTIiwibW9kZWxzIjoi4oqnIiwiTW9wZiI6IvCdlYQiLCJtb3BmIjoi8J2VniIsIm1wIjoi4oiTIiwibXNjciI6IvCdk4IiLCJNc2NyIjoi4oSzIiwibXN0cG9zIjoi4oi+IiwiTXUiOiLOnCIsIm11IjoizrwiLCJtdWx0aW1hcCI6IuKKuCIsIm11bWFwIjoi4oq4IiwibmFibGEiOiLiiIciLCJOYWN1dGUiOiLFgyIsIm5hY3V0ZSI6IsWEIiwibmFuZyI6IuKIoOKDkiIsIm5hcCI6IuKJiSIsIm5hcEUiOiLiqbDMuCIsIm5hcGlkIjoi4omLzLgiLCJuYXBvcyI6IsWJIiwibmFwcHJveCI6IuKJiSIsIm5hdHVyYWwiOiLima4iLCJuYXR1cmFscyI6IuKElSIsIm5hdHVyIjoi4pmuIiwibmJzcCI6IsKgIiwibmJ1bXAiOiLiiY7MuCIsIm5idW1wZSI6IuKJj8y4IiwibmNhcCI6IuKpgyIsIk5jYXJvbiI6IsWHIiwibmNhcm9uIjoixYgiLCJOY2VkaWwiOiLFhSIsIm5jZWRpbCI6IsWGIiwibmNvbmciOiLiiYciLCJuY29uZ2RvdCI6IuKprcy4IiwibmN1cCI6IuKpgiIsIk5jeSI6ItCdIiwibmN5Ijoi0L0iLCJuZGFzaCI6IuKAkyIsIm5lYXJoayI6IuKkpCIsIm5lYXJyIjoi4oaXIiwibmVBcnIiOiLih5ciLCJuZWFycm93Ijoi4oaXIiwibmUiOiLiiaAiLCJuZWRvdCI6IuKJkMy4IiwiTmVnYXRpdmVNZWRpdW1TcGFjZSI6IuKAiyIsIk5lZ2F0aXZlVGhpY2tTcGFjZSI6IuKAiyIsIk5lZ2F0aXZlVGhpblNwYWNlIjoi4oCLIiwiTmVnYXRpdmVWZXJ5VGhpblNwYWNlIjoi4oCLIiwibmVxdWl2Ijoi4omiIiwibmVzZWFyIjoi4qSoIiwibmVzaW0iOiLiiYLMuCIsIk5lc3RlZEdyZWF0ZXJHcmVhdGVyIjoi4omrIiwiTmVzdGVkTGVzc0xlc3MiOiLiiaoiLCJOZXdMaW5lIjoiXFxuIiwibmV4aXN0Ijoi4oiEIiwibmV4aXN0cyI6IuKIhCIsIk5mciI6IvCdlJEiLCJuZnIiOiLwnZSrIiwibmdFIjoi4omnzLgiLCJuZ2UiOiLiibEiLCJuZ2VxIjoi4omxIiwibmdlcXEiOiLiiafMuCIsIm5nZXFzbGFudCI6IuKpvsy4IiwibmdlcyI6IuKpvsy4IiwibkdnIjoi4ouZzLgiLCJuZ3NpbSI6IuKJtSIsIm5HdCI6IuKJq+KDkiIsIm5ndCI6IuKJryIsIm5ndHIiOiLiia8iLCJuR3R2Ijoi4omrzLgiLCJuaGFyciI6IuKGriIsIm5oQXJyIjoi4oeOIiwibmhwYXIiOiLiq7IiLCJuaSI6IuKIiyIsIm5pcyI6IuKLvCIsIm5pc2QiOiLii7oiLCJuaXYiOiLiiIsiLCJOSmN5Ijoi0IoiLCJuamN5Ijoi0ZoiLCJubGFyciI6IuKGmiIsIm5sQXJyIjoi4oeNIiwibmxkciI6IuKApSIsIm5sRSI6IuKJpsy4IiwibmxlIjoi4omwIiwibmxlZnRhcnJvdyI6IuKGmiIsIm5MZWZ0YXJyb3ciOiLih40iLCJubGVmdHJpZ2h0YXJyb3ciOiLihq4iLCJuTGVmdHJpZ2h0YXJyb3ciOiLih44iLCJubGVxIjoi4omwIiwibmxlcXEiOiLiiabMuCIsIm5sZXFzbGFudCI6IuKpvcy4IiwibmxlcyI6IuKpvcy4Iiwibmxlc3MiOiLiia4iLCJuTGwiOiLii5jMuCIsIm5sc2ltIjoi4om0Iiwibkx0Ijoi4omq4oOSIiwibmx0Ijoi4omuIiwibmx0cmkiOiLii6oiLCJubHRyaWUiOiLii6wiLCJuTHR2Ijoi4omqzLgiLCJubWlkIjoi4oikIiwiTm9CcmVhayI6IuKBoCIsIk5vbkJyZWFraW5nU3BhY2UiOiLCoCIsIm5vcGYiOiLwnZWfIiwiTm9wZiI6IuKElSIsIk5vdCI6IuKrrCIsIm5vdCI6IsKsIiwiTm90Q29uZ3J1ZW50Ijoi4omiIiwiTm90Q3VwQ2FwIjoi4omtIiwiTm90RG91YmxlVmVydGljYWxCYXIiOiLiiKYiLCJOb3RFbGVtZW50Ijoi4oiJIiwiTm90RXF1YWwiOiLiiaAiLCJOb3RFcXVhbFRpbGRlIjoi4omCzLgiLCJOb3RFeGlzdHMiOiLiiIQiLCJOb3RHcmVhdGVyIjoi4omvIiwiTm90R3JlYXRlckVxdWFsIjoi4omxIiwiTm90R3JlYXRlckZ1bGxFcXVhbCI6IuKJp8y4IiwiTm90R3JlYXRlckdyZWF0ZXIiOiLiiavMuCIsIk5vdEdyZWF0ZXJMZXNzIjoi4om5IiwiTm90R3JlYXRlclNsYW50RXF1YWwiOiLiqb7MuCIsIk5vdEdyZWF0ZXJUaWxkZSI6IuKJtSIsIk5vdEh1bXBEb3duSHVtcCI6IuKJjsy4IiwiTm90SHVtcEVxdWFsIjoi4omPzLgiLCJub3RpbiI6IuKIiSIsIm5vdGluZG90Ijoi4ou1zLgiLCJub3RpbkUiOiLii7nMuCIsIm5vdGludmEiOiLiiIkiLCJub3RpbnZiIjoi4ou3Iiwibm90aW52YyI6IuKLtiIsIk5vdExlZnRUcmlhbmdsZUJhciI6IuKnj8y4IiwiTm90TGVmdFRyaWFuZ2xlIjoi4ouqIiwiTm90TGVmdFRyaWFuZ2xlRXF1YWwiOiLii6wiLCJOb3RMZXNzIjoi4omuIiwiTm90TGVzc0VxdWFsIjoi4omwIiwiTm90TGVzc0dyZWF0ZXIiOiLiibgiLCJOb3RMZXNzTGVzcyI6IuKJqsy4IiwiTm90TGVzc1NsYW50RXF1YWwiOiLiqb3MuCIsIk5vdExlc3NUaWxkZSI6IuKJtCIsIk5vdE5lc3RlZEdyZWF0ZXJHcmVhdGVyIjoi4qqizLgiLCJOb3ROZXN0ZWRMZXNzTGVzcyI6IuKqocy4Iiwibm90bmkiOiLiiIwiLCJub3RuaXZhIjoi4oiMIiwibm90bml2YiI6IuKLviIsIm5vdG5pdmMiOiLii70iLCJOb3RQcmVjZWRlcyI6IuKKgCIsIk5vdFByZWNlZGVzRXF1YWwiOiLiqq/MuCIsIk5vdFByZWNlZGVzU2xhbnRFcXVhbCI6IuKLoCIsIk5vdFJldmVyc2VFbGVtZW50Ijoi4oiMIiwiTm90UmlnaHRUcmlhbmdsZUJhciI6IuKnkMy4IiwiTm90UmlnaHRUcmlhbmdsZSI6IuKLqyIsIk5vdFJpZ2h0VHJpYW5nbGVFcXVhbCI6IuKLrSIsIk5vdFNxdWFyZVN1YnNldCI6IuKKj8y4IiwiTm90U3F1YXJlU3Vic2V0RXF1YWwiOiLii6IiLCJOb3RTcXVhcmVTdXBlcnNldCI6IuKKkMy4IiwiTm90U3F1YXJlU3VwZXJzZXRFcXVhbCI6IuKLoyIsIk5vdFN1YnNldCI6IuKKguKDkiIsIk5vdFN1YnNldEVxdWFsIjoi4oqIIiwiTm90U3VjY2VlZHMiOiLiioEiLCJOb3RTdWNjZWVkc0VxdWFsIjoi4qqwzLgiLCJOb3RTdWNjZWVkc1NsYW50RXF1YWwiOiLii6EiLCJOb3RTdWNjZWVkc1RpbGRlIjoi4om/zLgiLCJOb3RTdXBlcnNldCI6IuKKg+KDkiIsIk5vdFN1cGVyc2V0RXF1YWwiOiLiiokiLCJOb3RUaWxkZSI6IuKJgSIsIk5vdFRpbGRlRXF1YWwiOiLiiYQiLCJOb3RUaWxkZUZ1bGxFcXVhbCI6IuKJhyIsIk5vdFRpbGRlVGlsZGUiOiLiiYkiLCJOb3RWZXJ0aWNhbEJhciI6IuKIpCIsIm5wYXJhbGxlbCI6IuKIpiIsIm5wYXIiOiLiiKYiLCJucGFyc2wiOiLiq73ig6UiLCJucGFydCI6IuKIgsy4IiwibnBvbGludCI6IuKolCIsIm5wciI6IuKKgCIsIm5wcmN1ZSI6IuKLoCIsIm5wcmVjIjoi4oqAIiwibnByZWNlcSI6IuKqr8y4IiwibnByZSI6IuKqr8y4IiwibnJhcnJjIjoi4qSzzLgiLCJucmFyciI6IuKGmyIsIm5yQXJyIjoi4oePIiwibnJhcnJ3Ijoi4oadzLgiLCJucmlnaHRhcnJvdyI6IuKGmyIsIm5SaWdodGFycm93Ijoi4oePIiwibnJ0cmkiOiLii6siLCJucnRyaWUiOiLii60iLCJuc2MiOiLiioEiLCJuc2NjdWUiOiLii6EiLCJuc2NlIjoi4qqwzLgiLCJOc2NyIjoi8J2SqSIsIm5zY3IiOiLwnZODIiwibnNob3J0bWlkIjoi4oikIiwibnNob3J0cGFyYWxsZWwiOiLiiKYiLCJuc2ltIjoi4omBIiwibnNpbWUiOiLiiYQiLCJuc2ltZXEiOiLiiYQiLCJuc21pZCI6IuKIpCIsIm5zcGFyIjoi4oimIiwibnNxc3ViZSI6IuKLoiIsIm5zcXN1cGUiOiLii6MiLCJuc3ViIjoi4oqEIiwibnN1YkUiOiLiq4XMuCIsIm5zdWJlIjoi4oqIIiwibnN1YnNldCI6IuKKguKDkiIsIm5zdWJzZXRlcSI6IuKKiCIsIm5zdWJzZXRlcXEiOiLiq4XMuCIsIm5zdWNjIjoi4oqBIiwibnN1Y2NlcSI6IuKqsMy4IiwibnN1cCI6IuKKhSIsIm5zdXBFIjoi4quGzLgiLCJuc3VwZSI6IuKKiSIsIm5zdXBzZXQiOiLiioPig5IiLCJuc3Vwc2V0ZXEiOiLiiokiLCJuc3Vwc2V0ZXFxIjoi4quGzLgiLCJudGdsIjoi4om5IiwiTnRpbGRlIjoiw5EiLCJudGlsZGUiOiLDsSIsIm50bGciOiLiibgiLCJudHJpYW5nbGVsZWZ0Ijoi4ouqIiwibnRyaWFuZ2xlbGVmdGVxIjoi4ousIiwibnRyaWFuZ2xlcmlnaHQiOiLii6siLCJudHJpYW5nbGVyaWdodGVxIjoi4outIiwiTnUiOiLOnSIsIm51Ijoizr0iLCJudW0iOiIjIiwibnVtZXJvIjoi4oSWIiwibnVtc3AiOiLigIciLCJudmFwIjoi4omN4oOSIiwibnZkYXNoIjoi4oqsIiwibnZEYXNoIjoi4oqtIiwiblZkYXNoIjoi4oquIiwiblZEYXNoIjoi4oqvIiwibnZnZSI6IuKJpeKDkiIsIm52Z3QiOiI+4oOSIiwibnZIYXJyIjoi4qSEIiwibnZpbmZpbiI6IuKnniIsIm52bEFyciI6IuKkgiIsIm52bGUiOiLiiaTig5IiLCJudmx0IjoiPOKDkiIsIm52bHRyaWUiOiLiirTig5IiLCJudnJBcnIiOiLipIMiLCJudnJ0cmllIjoi4oq14oOSIiwibnZzaW0iOiLiiLzig5IiLCJud2FyaGsiOiLipKMiLCJud2FyciI6IuKGliIsIm53QXJyIjoi4oeWIiwibndhcnJvdyI6IuKGliIsIm53bmVhciI6IuKkpyIsIk9hY3V0ZSI6IsOTIiwib2FjdXRlIjoiw7MiLCJvYXN0Ijoi4oqbIiwiT2NpcmMiOiLDlCIsIm9jaXJjIjoiw7QiLCJvY2lyIjoi4oqaIiwiT2N5Ijoi0J4iLCJvY3kiOiLQviIsIm9kYXNoIjoi4oqdIiwiT2RibGFjIjoixZAiLCJvZGJsYWMiOiLFkSIsIm9kaXYiOiLiqLgiLCJvZG90Ijoi4oqZIiwib2Rzb2xkIjoi4qa8IiwiT0VsaWciOiLFkiIsIm9lbGlnIjoixZMiLCJvZmNpciI6IuKmvyIsIk9mciI6IvCdlJIiLCJvZnIiOiLwnZSsIiwib2dvbiI6IsubIiwiT2dyYXZlIjoiw5IiLCJvZ3JhdmUiOiLDsiIsIm9ndCI6IuKngSIsIm9oYmFyIjoi4qa1Iiwib2htIjoizqkiLCJvaW50Ijoi4oiuIiwib2xhcnIiOiLihroiLCJvbGNpciI6IuKmviIsIm9sY3Jvc3MiOiLiprsiLCJvbGluZSI6IuKAviIsIm9sdCI6IuKngCIsIk9tYWNyIjoixYwiLCJvbWFjciI6IsWNIiwiT21lZ2EiOiLOqSIsIm9tZWdhIjoiz4kiLCJPbWljcm9uIjoizp8iLCJvbWljcm9uIjoizr8iLCJvbWlkIjoi4qa2Iiwib21pbnVzIjoi4oqWIiwiT29wZiI6IvCdlYYiLCJvb3BmIjoi8J2VoCIsIm9wYXIiOiLiprciLCJPcGVuQ3VybHlEb3VibGVRdW90ZSI6IuKAnCIsIk9wZW5DdXJseVF1b3RlIjoi4oCYIiwib3BlcnAiOiLiprkiLCJvcGx1cyI6IuKKlSIsIm9yYXJyIjoi4oa7IiwiT3IiOiLiqZQiLCJvciI6IuKIqCIsIm9yZCI6IuKpnSIsIm9yZGVyIjoi4oS0Iiwib3JkZXJvZiI6IuKEtCIsIm9yZGYiOiLCqiIsIm9yZG0iOiLCuiIsIm9yaWdvZiI6IuKKtiIsIm9yb3IiOiLiqZYiLCJvcnNsb3BlIjoi4qmXIiwib3J2Ijoi4qmbIiwib1MiOiLik4giLCJPc2NyIjoi8J2SqiIsIm9zY3IiOiLihLQiLCJPc2xhc2giOiLDmCIsIm9zbGFzaCI6IsO4Iiwib3NvbCI6IuKKmCIsIk90aWxkZSI6IsOVIiwib3RpbGRlIjoiw7UiLCJvdGltZXNhcyI6IuKotiIsIk90aW1lcyI6IuKotyIsIm90aW1lcyI6IuKKlyIsIk91bWwiOiLDliIsIm91bWwiOiLDtiIsIm92YmFyIjoi4oy9IiwiT3ZlckJhciI6IuKAviIsIk92ZXJCcmFjZSI6IuKPniIsIk92ZXJCcmFja2V0Ijoi4o60IiwiT3ZlclBhcmVudGhlc2lzIjoi4o+cIiwicGFyYSI6IsK2IiwicGFyYWxsZWwiOiLiiKUiLCJwYXIiOiLiiKUiLCJwYXJzaW0iOiLiq7MiLCJwYXJzbCI6IuKrvSIsInBhcnQiOiLiiIIiLCJQYXJ0aWFsRCI6IuKIgiIsIlBjeSI6ItCfIiwicGN5Ijoi0L8iLCJwZXJjbnQiOiIlIiwicGVyaW9kIjoiLiIsInBlcm1pbCI6IuKAsCIsInBlcnAiOiLiiqUiLCJwZXJ0ZW5rIjoi4oCxIiwiUGZyIjoi8J2UkyIsInBmciI6IvCdlK0iLCJQaGkiOiLOpiIsInBoaSI6Is+GIiwicGhpdiI6Is+VIiwicGhtbWF0Ijoi4oSzIiwicGhvbmUiOiLimI4iLCJQaSI6Is6gIiwicGkiOiLPgCIsInBpdGNoZm9yayI6IuKLlCIsInBpdiI6Is+WIiwicGxhbmNrIjoi4oSPIiwicGxhbmNraCI6IuKEjiIsInBsYW5rdiI6IuKEjyIsInBsdXNhY2lyIjoi4qijIiwicGx1c2IiOiLiip4iLCJwbHVzY2lyIjoi4qiiIiwicGx1cyI6IisiLCJwbHVzZG8iOiLiiJQiLCJwbHVzZHUiOiLiqKUiLCJwbHVzZSI6IuKpsiIsIlBsdXNNaW51cyI6IsKxIiwicGx1c21uIjoiwrEiLCJwbHVzc2ltIjoi4qimIiwicGx1c3R3byI6IuKopyIsInBtIjoiwrEiLCJQb2luY2FyZXBsYW5lIjoi4oSMIiwicG9pbnRpbnQiOiLiqJUiLCJwb3BmIjoi8J2VoSIsIlBvcGYiOiLihJkiLCJwb3VuZCI6IsKjIiwicHJhcCI6IuKqtyIsIlByIjoi4qq7IiwicHIiOiLiiboiLCJwcmN1ZSI6IuKJvCIsInByZWNhcHByb3giOiLiqrciLCJwcmVjIjoi4om6IiwicHJlY2N1cmx5ZXEiOiLiibwiLCJQcmVjZWRlcyI6IuKJuiIsIlByZWNlZGVzRXF1YWwiOiLiqq8iLCJQcmVjZWRlc1NsYW50RXF1YWwiOiLiibwiLCJQcmVjZWRlc1RpbGRlIjoi4om+IiwicHJlY2VxIjoi4qqvIiwicHJlY25hcHByb3giOiLiqrkiLCJwcmVjbmVxcSI6IuKqtSIsInByZWNuc2ltIjoi4ouoIiwicHJlIjoi4qqvIiwicHJFIjoi4qqzIiwicHJlY3NpbSI6IuKJviIsInByaW1lIjoi4oCyIiwiUHJpbWUiOiLigLMiLCJwcmltZXMiOiLihJkiLCJwcm5hcCI6IuKquSIsInBybkUiOiLiqrUiLCJwcm5zaW0iOiLii6giLCJwcm9kIjoi4oiPIiwiUHJvZHVjdCI6IuKIjyIsInByb2ZhbGFyIjoi4oyuIiwicHJvZmxpbmUiOiLijJIiLCJwcm9mc3VyZiI6IuKMkyIsInByb3AiOiLiiJ0iLCJQcm9wb3J0aW9uYWwiOiLiiJ0iLCJQcm9wb3J0aW9uIjoi4oi3IiwicHJvcHRvIjoi4oidIiwicHJzaW0iOiLiib4iLCJwcnVyZWwiOiLiirAiLCJQc2NyIjoi8J2SqyIsInBzY3IiOiLwnZOFIiwiUHNpIjoizqgiLCJwc2kiOiLPiCIsInB1bmNzcCI6IuKAiCIsIlFmciI6IvCdlJQiLCJxZnIiOiLwnZSuIiwicWludCI6IuKojCIsInFvcGYiOiLwnZWiIiwiUW9wZiI6IuKEmiIsInFwcmltZSI6IuKBlyIsIlFzY3IiOiLwnZKsIiwicXNjciI6IvCdk4YiLCJxdWF0ZXJuaW9ucyI6IuKEjSIsInF1YXRpbnQiOiLiqJYiLCJxdWVzdCI6Ij8iLCJxdWVzdGVxIjoi4omfIiwicXVvdCI6IlxcIiIsIlFVT1QiOiJcXCIiLCJyQWFyciI6IuKHmyIsInJhY2UiOiLiiL3MsSIsIlJhY3V0ZSI6IsWUIiwicmFjdXRlIjoixZUiLCJyYWRpYyI6IuKImiIsInJhZW1wdHl2Ijoi4qazIiwicmFuZyI6IuKfqSIsIlJhbmciOiLin6siLCJyYW5nZCI6IuKmkiIsInJhbmdlIjoi4qalIiwicmFuZ2xlIjoi4p+pIiwicmFxdW8iOiLCuyIsInJhcnJhcCI6IuKltSIsInJhcnJiIjoi4oelIiwicmFycmJmcyI6IuKkoCIsInJhcnJjIjoi4qSzIiwicmFyciI6IuKGkiIsIlJhcnIiOiLihqAiLCJyQXJyIjoi4oeSIiwicmFycmZzIjoi4qSeIiwicmFycmhrIjoi4oaqIiwicmFycmxwIjoi4oasIiwicmFycnBsIjoi4qWFIiwicmFycnNpbSI6IuKltCIsIlJhcnJ0bCI6IuKkliIsInJhcnJ0bCI6IuKGoyIsInJhcnJ3Ijoi4oadIiwicmF0YWlsIjoi4qSaIiwickF0YWlsIjoi4qScIiwicmF0aW8iOiLiiLYiLCJyYXRpb25hbHMiOiLihJoiLCJyYmFyciI6IuKkjSIsInJCYXJyIjoi4qSPIiwiUkJhcnIiOiLipJAiLCJyYmJyayI6IuKdsyIsInJicmFjZSI6In0iLCJyYnJhY2siOiJdIiwicmJya2UiOiLipowiLCJyYnJrc2xkIjoi4qaOIiwicmJya3NsdSI6IuKmkCIsIlJjYXJvbiI6IsWYIiwicmNhcm9uIjoixZkiLCJSY2VkaWwiOiLFliIsInJjZWRpbCI6IsWXIiwicmNlaWwiOiLijIkiLCJyY3ViIjoifSIsIlJjeSI6ItCgIiwicmN5Ijoi0YAiLCJyZGNhIjoi4qS3IiwicmRsZGhhciI6IuKlqSIsInJkcXVvIjoi4oCdIiwicmRxdW9yIjoi4oCdIiwicmRzaCI6IuKGsyIsInJlYWwiOiLihJwiLCJyZWFsaW5lIjoi4oSbIiwicmVhbHBhcnQiOiLihJwiLCJyZWFscyI6IuKEnSIsIlJlIjoi4oScIiwicmVjdCI6IuKWrSIsInJlZyI6IsKuIiwiUkVHIjoiwq4iLCJSZXZlcnNlRWxlbWVudCI6IuKIiyIsIlJldmVyc2VFcXVpbGlicml1bSI6IuKHiyIsIlJldmVyc2VVcEVxdWlsaWJyaXVtIjoi4qWvIiwicmZpc2h0Ijoi4qW9IiwicmZsb29yIjoi4oyLIiwicmZyIjoi8J2UryIsIlJmciI6IuKEnCIsInJIYXIiOiLipaQiLCJyaGFyZCI6IuKHgSIsInJoYXJ1Ijoi4oeAIiwicmhhcnVsIjoi4qWsIiwiUmhvIjoizqEiLCJyaG8iOiLPgSIsInJob3YiOiLPsSIsIlJpZ2h0QW5nbGVCcmFja2V0Ijoi4p+pIiwiUmlnaHRBcnJvd0JhciI6IuKHpSIsInJpZ2h0YXJyb3ciOiLihpIiLCJSaWdodEFycm93Ijoi4oaSIiwiUmlnaHRhcnJvdyI6IuKHkiIsIlJpZ2h0QXJyb3dMZWZ0QXJyb3ciOiLih4QiLCJyaWdodGFycm93dGFpbCI6IuKGoyIsIlJpZ2h0Q2VpbGluZyI6IuKMiSIsIlJpZ2h0RG91YmxlQnJhY2tldCI6IuKfpyIsIlJpZ2h0RG93blRlZVZlY3RvciI6IuKlnSIsIlJpZ2h0RG93blZlY3RvckJhciI6IuKllSIsIlJpZ2h0RG93blZlY3RvciI6IuKHgiIsIlJpZ2h0Rmxvb3IiOiLijIsiLCJyaWdodGhhcnBvb25kb3duIjoi4oeBIiwicmlnaHRoYXJwb29udXAiOiLih4AiLCJyaWdodGxlZnRhcnJvd3MiOiLih4QiLCJyaWdodGxlZnRoYXJwb29ucyI6IuKHjCIsInJpZ2h0cmlnaHRhcnJvd3MiOiLih4kiLCJyaWdodHNxdWlnYXJyb3ciOiLihp0iLCJSaWdodFRlZUFycm93Ijoi4oamIiwiUmlnaHRUZWUiOiLiiqIiLCJSaWdodFRlZVZlY3RvciI6IuKlmyIsInJpZ2h0dGhyZWV0aW1lcyI6IuKLjCIsIlJpZ2h0VHJpYW5nbGVCYXIiOiLip5AiLCJSaWdodFRyaWFuZ2xlIjoi4oqzIiwiUmlnaHRUcmlhbmdsZUVxdWFsIjoi4oq1IiwiUmlnaHRVcERvd25WZWN0b3IiOiLipY8iLCJSaWdodFVwVGVlVmVjdG9yIjoi4qWcIiwiUmlnaHRVcFZlY3RvckJhciI6IuKllCIsIlJpZ2h0VXBWZWN0b3IiOiLihr4iLCJSaWdodFZlY3RvckJhciI6IuKlkyIsIlJpZ2h0VmVjdG9yIjoi4oeAIiwicmluZyI6IsuaIiwicmlzaW5nZG90c2VxIjoi4omTIiwicmxhcnIiOiLih4QiLCJybGhhciI6IuKHjCIsInJsbSI6IuKAjyIsInJtb3VzdGFjaGUiOiLijrEiLCJybW91c3QiOiLijrEiLCJybm1pZCI6IuKrriIsInJvYW5nIjoi4p+tIiwicm9hcnIiOiLih74iLCJyb2JyayI6IuKfpyIsInJvcGFyIjoi4qaGIiwicm9wZiI6IvCdlaMiLCJSb3BmIjoi4oSdIiwicm9wbHVzIjoi4qiuIiwicm90aW1lcyI6IuKotSIsIlJvdW5kSW1wbGllcyI6IuKlsCIsInJwYXIiOiIpIiwicnBhcmd0Ijoi4qaUIiwicnBwb2xpbnQiOiLiqJIiLCJycmFyciI6IuKHiSIsIlJyaWdodGFycm93Ijoi4oebIiwicnNhcXVvIjoi4oC6IiwicnNjciI6IvCdk4ciLCJSc2NyIjoi4oSbIiwicnNoIjoi4oaxIiwiUnNoIjoi4oaxIiwicnNxYiI6Il0iLCJyc3F1byI6IuKAmSIsInJzcXVvciI6IuKAmSIsInJ0aHJlZSI6IuKLjCIsInJ0aW1lcyI6IuKLiiIsInJ0cmkiOiLilrkiLCJydHJpZSI6IuKKtSIsInJ0cmlmIjoi4pa4IiwicnRyaWx0cmkiOiLip44iLCJSdWxlRGVsYXllZCI6IuKntCIsInJ1bHVoYXIiOiLipagiLCJyeCI6IuKEniIsIlNhY3V0ZSI6IsWaIiwic2FjdXRlIjoixZsiLCJzYnF1byI6IuKAmiIsInNjYXAiOiLiqrgiLCJTY2Fyb24iOiLFoCIsInNjYXJvbiI6IsWhIiwiU2MiOiLiqrwiLCJzYyI6IuKJuyIsInNjY3VlIjoi4om9Iiwic2NlIjoi4qqwIiwic2NFIjoi4qq0IiwiU2NlZGlsIjoixZ4iLCJzY2VkaWwiOiLFnyIsIlNjaXJjIjoixZwiLCJzY2lyYyI6IsWdIiwic2NuYXAiOiLiqroiLCJzY25FIjoi4qq2Iiwic2Nuc2ltIjoi4oupIiwic2Nwb2xpbnQiOiLiqJMiLCJzY3NpbSI6IuKJvyIsIlNjeSI6ItChIiwic2N5Ijoi0YEiLCJzZG90YiI6IuKKoSIsInNkb3QiOiLii4UiLCJzZG90ZSI6IuKppiIsInNlYXJoayI6IuKkpSIsInNlYXJyIjoi4oaYIiwic2VBcnIiOiLih5giLCJzZWFycm93Ijoi4oaYIiwic2VjdCI6IsKnIiwic2VtaSI6IjsiLCJzZXN3YXIiOiLipKkiLCJzZXRtaW51cyI6IuKIliIsInNldG1uIjoi4oiWIiwic2V4dCI6IuKctiIsIlNmciI6IvCdlJYiLCJzZnIiOiLwnZSwIiwic2Zyb3duIjoi4oyiIiwic2hhcnAiOiLima8iLCJTSENIY3kiOiLQqSIsInNoY2hjeSI6ItGJIiwiU0hjeSI6ItCoIiwic2hjeSI6ItGIIiwiU2hvcnREb3duQXJyb3ciOiLihpMiLCJTaG9ydExlZnRBcnJvdyI6IuKGkCIsInNob3J0bWlkIjoi4oijIiwic2hvcnRwYXJhbGxlbCI6IuKIpSIsIlNob3J0UmlnaHRBcnJvdyI6IuKGkiIsIlNob3J0VXBBcnJvdyI6IuKGkSIsInNoeSI6IsKtIiwiU2lnbWEiOiLOoyIsInNpZ21hIjoiz4MiLCJzaWdtYWYiOiLPgiIsInNpZ21hdiI6Is+CIiwic2ltIjoi4oi8Iiwic2ltZG90Ijoi4qmqIiwic2ltZSI6IuKJgyIsInNpbWVxIjoi4omDIiwic2ltZyI6IuKqniIsInNpbWdFIjoi4qqgIiwic2ltbCI6IuKqnSIsInNpbWxFIjoi4qqfIiwic2ltbmUiOiLiiYYiLCJzaW1wbHVzIjoi4qikIiwic2ltcmFyciI6IuKlsiIsInNsYXJyIjoi4oaQIiwiU21hbGxDaXJjbGUiOiLiiJgiLCJzbWFsbHNldG1pbnVzIjoi4oiWIiwic21hc2hwIjoi4qizIiwic21lcGFyc2wiOiLip6QiLCJzbWlkIjoi4oijIiwic21pbGUiOiLijKMiLCJzbXQiOiLiqqoiLCJzbXRlIjoi4qqsIiwic210ZXMiOiLiqqzvuIAiLCJTT0ZUY3kiOiLQrCIsInNvZnRjeSI6ItGMIiwic29sYmFyIjoi4oy/Iiwic29sYiI6IuKnhCIsInNvbCI6Ii8iLCJTb3BmIjoi8J2ViiIsInNvcGYiOiLwnZWkIiwic3BhZGVzIjoi4pmgIiwic3BhZGVzdWl0Ijoi4pmgIiwic3BhciI6IuKIpSIsInNxY2FwIjoi4oqTIiwic3FjYXBzIjoi4oqT77iAIiwic3FjdXAiOiLiipQiLCJzcWN1cHMiOiLiipTvuIAiLCJTcXJ0Ijoi4oiaIiwic3FzdWIiOiLiio8iLCJzcXN1YmUiOiLiipEiLCJzcXN1YnNldCI6IuKKjyIsInNxc3Vic2V0ZXEiOiLiipEiLCJzcXN1cCI6IuKKkCIsInNxc3VwZSI6IuKKkiIsInNxc3Vwc2V0Ijoi4oqQIiwic3FzdXBzZXRlcSI6IuKKkiIsInNxdWFyZSI6IuKWoSIsIlNxdWFyZSI6IuKWoSIsIlNxdWFyZUludGVyc2VjdGlvbiI6IuKKkyIsIlNxdWFyZVN1YnNldCI6IuKKjyIsIlNxdWFyZVN1YnNldEVxdWFsIjoi4oqRIiwiU3F1YXJlU3VwZXJzZXQiOiLiipAiLCJTcXVhcmVTdXBlcnNldEVxdWFsIjoi4oqSIiwiU3F1YXJlVW5pb24iOiLiipQiLCJzcXVhcmYiOiLilqoiLCJzcXUiOiLilqEiLCJzcXVmIjoi4paqIiwic3JhcnIiOiLihpIiLCJTc2NyIjoi8J2SriIsInNzY3IiOiLwnZOIIiwic3NldG1uIjoi4oiWIiwic3NtaWxlIjoi4oyjIiwic3N0YXJmIjoi4ouGIiwiU3RhciI6IuKLhiIsInN0YXIiOiLimIYiLCJzdGFyZiI6IuKYhSIsInN0cmFpZ2h0ZXBzaWxvbiI6Is+1Iiwic3RyYWlnaHRwaGkiOiLPlSIsInN0cm5zIjoiwq8iLCJzdWIiOiLiioIiLCJTdWIiOiLii5AiLCJzdWJkb3QiOiLiqr0iLCJzdWJFIjoi4quFIiwic3ViZSI6IuKKhiIsInN1YmVkb3QiOiLiq4MiLCJzdWJtdWx0Ijoi4quBIiwic3VibkUiOiLiq4siLCJzdWJuZSI6IuKKiiIsInN1YnBsdXMiOiLiqr8iLCJzdWJyYXJyIjoi4qW5Iiwic3Vic2V0Ijoi4oqCIiwiU3Vic2V0Ijoi4ouQIiwic3Vic2V0ZXEiOiLiioYiLCJzdWJzZXRlcXEiOiLiq4UiLCJTdWJzZXRFcXVhbCI6IuKKhiIsInN1YnNldG5lcSI6IuKKiiIsInN1YnNldG5lcXEiOiLiq4siLCJzdWJzaW0iOiLiq4ciLCJzdWJzdWIiOiLiq5UiLCJzdWJzdXAiOiLiq5MiLCJzdWNjYXBwcm94Ijoi4qq4Iiwic3VjYyI6IuKJuyIsInN1Y2NjdXJseWVxIjoi4om9IiwiU3VjY2VlZHMiOiLiibsiLCJTdWNjZWVkc0VxdWFsIjoi4qqwIiwiU3VjY2VlZHNTbGFudEVxdWFsIjoi4om9IiwiU3VjY2VlZHNUaWxkZSI6IuKJvyIsInN1Y2NlcSI6IuKqsCIsInN1Y2NuYXBwcm94Ijoi4qq6Iiwic3VjY25lcXEiOiLiqrYiLCJzdWNjbnNpbSI6IuKLqSIsInN1Y2NzaW0iOiLiib8iLCJTdWNoVGhhdCI6IuKIiyIsInN1bSI6IuKIkSIsIlN1bSI6IuKIkSIsInN1bmciOiLimaoiLCJzdXAxIjoiwrkiLCJzdXAyIjoiwrIiLCJzdXAzIjoiwrMiLCJzdXAiOiLiioMiLCJTdXAiOiLii5EiLCJzdXBkb3QiOiLiqr4iLCJzdXBkc3ViIjoi4quYIiwic3VwRSI6IuKrhiIsInN1cGUiOiLiiociLCJzdXBlZG90Ijoi4quEIiwiU3VwZXJzZXQiOiLiioMiLCJTdXBlcnNldEVxdWFsIjoi4oqHIiwic3VwaHNvbCI6IuKfiSIsInN1cGhzdWIiOiLiq5ciLCJzdXBsYXJyIjoi4qW7Iiwic3VwbXVsdCI6IuKrgiIsInN1cG5FIjoi4quMIiwic3VwbmUiOiLiiosiLCJzdXBwbHVzIjoi4quAIiwic3Vwc2V0Ijoi4oqDIiwiU3Vwc2V0Ijoi4ouRIiwic3Vwc2V0ZXEiOiLiiociLCJzdXBzZXRlcXEiOiLiq4YiLCJzdXBzZXRuZXEiOiLiiosiLCJzdXBzZXRuZXFxIjoi4quMIiwic3Vwc2ltIjoi4quIIiwic3Vwc3ViIjoi4quUIiwic3Vwc3VwIjoi4quWIiwic3dhcmhrIjoi4qSmIiwic3dhcnIiOiLihpkiLCJzd0FyciI6IuKHmSIsInN3YXJyb3ciOiLihpkiLCJzd253YXIiOiLipKoiLCJzemxpZyI6IsOfIiwiVGFiIjoiXFx0IiwidGFyZ2V0Ijoi4oyWIiwiVGF1IjoizqQiLCJ0YXUiOiLPhCIsInRicmsiOiLijrQiLCJUY2Fyb24iOiLFpCIsInRjYXJvbiI6IsWlIiwiVGNlZGlsIjoixaIiLCJ0Y2VkaWwiOiLFoyIsIlRjeSI6ItCiIiwidGN5Ijoi0YIiLCJ0ZG90Ijoi4oObIiwidGVscmVjIjoi4oyVIiwiVGZyIjoi8J2UlyIsInRmciI6IvCdlLEiLCJ0aGVyZTQiOiLiiLQiLCJ0aGVyZWZvcmUiOiLiiLQiLCJUaGVyZWZvcmUiOiLiiLQiLCJUaGV0YSI6Is6YIiwidGhldGEiOiLOuCIsInRoZXRhc3ltIjoiz5EiLCJ0aGV0YXYiOiLPkSIsInRoaWNrYXBwcm94Ijoi4omIIiwidGhpY2tzaW0iOiLiiLwiLCJUaGlja1NwYWNlIjoi4oGf4oCKIiwiVGhpblNwYWNlIjoi4oCJIiwidGhpbnNwIjoi4oCJIiwidGhrYXAiOiLiiYgiLCJ0aGtzaW0iOiLiiLwiLCJUSE9STiI6IsOeIiwidGhvcm4iOiLDviIsInRpbGRlIjoiy5wiLCJUaWxkZSI6IuKIvCIsIlRpbGRlRXF1YWwiOiLiiYMiLCJUaWxkZUZ1bGxFcXVhbCI6IuKJhSIsIlRpbGRlVGlsZGUiOiLiiYgiLCJ0aW1lc2JhciI6IuKosSIsInRpbWVzYiI6IuKKoCIsInRpbWVzIjoiw5ciLCJ0aW1lc2QiOiLiqLAiLCJ0aW50Ijoi4oitIiwidG9lYSI6IuKkqCIsInRvcGJvdCI6IuKMtiIsInRvcGNpciI6IuKrsSIsInRvcCI6IuKKpCIsIlRvcGYiOiLwnZWLIiwidG9wZiI6IvCdlaUiLCJ0b3Bmb3JrIjoi4quaIiwidG9zYSI6IuKkqSIsInRwcmltZSI6IuKAtCIsInRyYWRlIjoi4oSiIiwiVFJBREUiOiLihKIiLCJ0cmlhbmdsZSI6IuKWtSIsInRyaWFuZ2xlZG93biI6IuKWvyIsInRyaWFuZ2xlbGVmdCI6IuKXgyIsInRyaWFuZ2xlbGVmdGVxIjoi4oq0IiwidHJpYW5nbGVxIjoi4omcIiwidHJpYW5nbGVyaWdodCI6IuKWuSIsInRyaWFuZ2xlcmlnaHRlcSI6IuKKtSIsInRyaWRvdCI6IuKXrCIsInRyaWUiOiLiiZwiLCJ0cmltaW51cyI6IuKouiIsIlRyaXBsZURvdCI6IuKDmyIsInRyaXBsdXMiOiLiqLkiLCJ0cmlzYiI6IuKnjSIsInRyaXRpbWUiOiLiqLsiLCJ0cnBleml1bSI6IuKPoiIsIlRzY3IiOiLwnZKvIiwidHNjciI6IvCdk4kiLCJUU2N5Ijoi0KYiLCJ0c2N5Ijoi0YYiLCJUU0hjeSI6ItCLIiwidHNoY3kiOiLRmyIsIlRzdHJvayI6IsWmIiwidHN0cm9rIjoixaciLCJ0d2l4dCI6IuKJrCIsInR3b2hlYWRsZWZ0YXJyb3ciOiLihp4iLCJ0d29oZWFkcmlnaHRhcnJvdyI6IuKGoCIsIlVhY3V0ZSI6IsOaIiwidWFjdXRlIjoiw7oiLCJ1YXJyIjoi4oaRIiwiVWFyciI6IuKGnyIsInVBcnIiOiLih5EiLCJVYXJyb2NpciI6IuKliSIsIlVicmN5Ijoi0I4iLCJ1YnJjeSI6ItGeIiwiVWJyZXZlIjoixawiLCJ1YnJldmUiOiLFrSIsIlVjaXJjIjoiw5siLCJ1Y2lyYyI6IsO7IiwiVWN5Ijoi0KMiLCJ1Y3kiOiLRgyIsInVkYXJyIjoi4oeFIiwiVWRibGFjIjoixbAiLCJ1ZGJsYWMiOiLFsSIsInVkaGFyIjoi4qWuIiwidWZpc2h0Ijoi4qW+IiwiVWZyIjoi8J2UmCIsInVmciI6IvCdlLIiLCJVZ3JhdmUiOiLDmSIsInVncmF2ZSI6IsO5IiwidUhhciI6IuKloyIsInVoYXJsIjoi4oa/IiwidWhhcnIiOiLihr4iLCJ1aGJsayI6IuKWgCIsInVsY29ybiI6IuKMnCIsInVsY29ybmVyIjoi4oycIiwidWxjcm9wIjoi4oyPIiwidWx0cmkiOiLil7giLCJVbWFjciI6IsWqIiwidW1hY3IiOiLFqyIsInVtbCI6IsKoIiwiVW5kZXJCYXIiOiJfIiwiVW5kZXJCcmFjZSI6IuKPnyIsIlVuZGVyQnJhY2tldCI6IuKOtSIsIlVuZGVyUGFyZW50aGVzaXMiOiLij50iLCJVbmlvbiI6IuKLgyIsIlVuaW9uUGx1cyI6IuKKjiIsIlVvZ29uIjoixbIiLCJ1b2dvbiI6IsWzIiwiVW9wZiI6IvCdlYwiLCJ1b3BmIjoi8J2VpiIsIlVwQXJyb3dCYXIiOiLipJIiLCJ1cGFycm93Ijoi4oaRIiwiVXBBcnJvdyI6IuKGkSIsIlVwYXJyb3ciOiLih5EiLCJVcEFycm93RG93bkFycm93Ijoi4oeFIiwidXBkb3duYXJyb3ciOiLihpUiLCJVcERvd25BcnJvdyI6IuKGlSIsIlVwZG93bmFycm93Ijoi4oeVIiwiVXBFcXVpbGlicml1bSI6IuKlriIsInVwaGFycG9vbmxlZnQiOiLihr8iLCJ1cGhhcnBvb25yaWdodCI6IuKGviIsInVwbHVzIjoi4oqOIiwiVXBwZXJMZWZ0QXJyb3ciOiLihpYiLCJVcHBlclJpZ2h0QXJyb3ciOiLihpciLCJ1cHNpIjoiz4UiLCJVcHNpIjoiz5IiLCJ1cHNpaCI6Is+SIiwiVXBzaWxvbiI6Is6lIiwidXBzaWxvbiI6Is+FIiwiVXBUZWVBcnJvdyI6IuKGpSIsIlVwVGVlIjoi4oqlIiwidXB1cGFycm93cyI6IuKHiCIsInVyY29ybiI6IuKMnSIsInVyY29ybmVyIjoi4oydIiwidXJjcm9wIjoi4oyOIiwiVXJpbmciOiLFriIsInVyaW5nIjoixa8iLCJ1cnRyaSI6IuKXuSIsIlVzY3IiOiLwnZKwIiwidXNjciI6IvCdk4oiLCJ1dGRvdCI6IuKLsCIsIlV0aWxkZSI6IsWoIiwidXRpbGRlIjoixakiLCJ1dHJpIjoi4pa1IiwidXRyaWYiOiLilrQiLCJ1dWFyciI6IuKHiCIsIlV1bWwiOiLDnCIsInV1bWwiOiLDvCIsInV3YW5nbGUiOiLipqciLCJ2YW5ncnQiOiLippwiLCJ2YXJlcHNpbG9uIjoiz7UiLCJ2YXJrYXBwYSI6Is+wIiwidmFybm90aGluZyI6IuKIhSIsInZhcnBoaSI6Is+VIiwidmFycGkiOiLPliIsInZhcnByb3B0byI6IuKInSIsInZhcnIiOiLihpUiLCJ2QXJyIjoi4oeVIiwidmFycmhvIjoiz7EiLCJ2YXJzaWdtYSI6Is+CIiwidmFyc3Vic2V0bmVxIjoi4oqK77iAIiwidmFyc3Vic2V0bmVxcSI6IuKri++4gCIsInZhcnN1cHNldG5lcSI6IuKKi++4gCIsInZhcnN1cHNldG5lcXEiOiLiq4zvuIAiLCJ2YXJ0aGV0YSI6Is+RIiwidmFydHJpYW5nbGVsZWZ0Ijoi4oqyIiwidmFydHJpYW5nbGVyaWdodCI6IuKKsyIsInZCYXIiOiLiq6giLCJWYmFyIjoi4qurIiwidkJhcnYiOiLiq6kiLCJWY3kiOiLQkiIsInZjeSI6ItCyIiwidmRhc2giOiLiiqIiLCJ2RGFzaCI6IuKKqCIsIlZkYXNoIjoi4oqpIiwiVkRhc2giOiLiiqsiLCJWZGFzaGwiOiLiq6YiLCJ2ZWViYXIiOiLiirsiLCJ2ZWUiOiLiiKgiLCJWZWUiOiLii4EiLCJ2ZWVlcSI6IuKJmiIsInZlbGxpcCI6IuKLriIsInZlcmJhciI6InwiLCJWZXJiYXIiOiLigJYiLCJ2ZXJ0IjoifCIsIlZlcnQiOiLigJYiLCJWZXJ0aWNhbEJhciI6IuKIoyIsIlZlcnRpY2FsTGluZSI6InwiLCJWZXJ0aWNhbFNlcGFyYXRvciI6IuKdmCIsIlZlcnRpY2FsVGlsZGUiOiLiiYAiLCJWZXJ5VGhpblNwYWNlIjoi4oCKIiwiVmZyIjoi8J2UmSIsInZmciI6IvCdlLMiLCJ2bHRyaSI6IuKKsiIsInZuc3ViIjoi4oqC4oOSIiwidm5zdXAiOiLiioPig5IiLCJWb3BmIjoi8J2VjSIsInZvcGYiOiLwnZWnIiwidnByb3AiOiLiiJ0iLCJ2cnRyaSI6IuKKsyIsIlZzY3IiOiLwnZKxIiwidnNjciI6IvCdk4siLCJ2c3VibkUiOiLiq4vvuIAiLCJ2c3VibmUiOiLiiorvuIAiLCJ2c3VwbkUiOiLiq4zvuIAiLCJ2c3VwbmUiOiLiiovvuIAiLCJWdmRhc2giOiLiiqoiLCJ2emlnemFnIjoi4qaaIiwiV2NpcmMiOiLFtCIsIndjaXJjIjoixbUiLCJ3ZWRiYXIiOiLiqZ8iLCJ3ZWRnZSI6IuKIpyIsIldlZGdlIjoi4ouAIiwid2VkZ2VxIjoi4omZIiwid2VpZXJwIjoi4oSYIiwiV2ZyIjoi8J2UmiIsIndmciI6IvCdlLQiLCJXb3BmIjoi8J2VjiIsIndvcGYiOiLwnZWoIiwid3AiOiLihJgiLCJ3ciI6IuKJgCIsIndyZWF0aCI6IuKJgCIsIldzY3IiOiLwnZKyIiwid3NjciI6IvCdk4wiLCJ4Y2FwIjoi4ouCIiwieGNpcmMiOiLil68iLCJ4Y3VwIjoi4ouDIiwieGR0cmkiOiLilr0iLCJYZnIiOiLwnZSbIiwieGZyIjoi8J2UtSIsInhoYXJyIjoi4p+3IiwieGhBcnIiOiLin7oiLCJYaSI6Is6eIiwieGkiOiLOviIsInhsYXJyIjoi4p+1IiwieGxBcnIiOiLin7giLCJ4bWFwIjoi4p+8IiwieG5pcyI6IuKLuyIsInhvZG90Ijoi4qiAIiwiWG9wZiI6IvCdlY8iLCJ4b3BmIjoi8J2VqSIsInhvcGx1cyI6IuKogSIsInhvdGltZSI6IuKogiIsInhyYXJyIjoi4p+2IiwieHJBcnIiOiLin7kiLCJYc2NyIjoi8J2SsyIsInhzY3IiOiLwnZONIiwieHNxY3VwIjoi4qiGIiwieHVwbHVzIjoi4qiEIiwieHV0cmkiOiLilrMiLCJ4dmVlIjoi4ouBIiwieHdlZGdlIjoi4ouAIiwiWWFjdXRlIjoiw50iLCJ5YWN1dGUiOiLDvSIsIllBY3kiOiLQryIsInlhY3kiOiLRjyIsIlljaXJjIjoixbYiLCJ5Y2lyYyI6IsW3IiwiWWN5Ijoi0KsiLCJ5Y3kiOiLRiyIsInllbiI6IsKlIiwiWWZyIjoi8J2UnCIsInlmciI6IvCdlLYiLCJZSWN5Ijoi0IciLCJ5aWN5Ijoi0ZciLCJZb3BmIjoi8J2VkCIsInlvcGYiOiLwnZWqIiwiWXNjciI6IvCdkrQiLCJ5c2NyIjoi8J2TjiIsIllVY3kiOiLQriIsInl1Y3kiOiLRjiIsInl1bWwiOiLDvyIsIll1bWwiOiLFuCIsIlphY3V0ZSI6IsW5IiwiemFjdXRlIjoixboiLCJaY2Fyb24iOiLFvSIsInpjYXJvbiI6IsW+IiwiWmN5Ijoi0JciLCJ6Y3kiOiLQtyIsIlpkb3QiOiLFuyIsInpkb3QiOiLFvCIsInplZXRyZiI6IuKEqCIsIlplcm9XaWR0aFNwYWNlIjoi4oCLIiwiWmV0YSI6Is6WIiwiemV0YSI6Is62IiwiemZyIjoi8J2UtyIsIlpmciI6IuKEqCIsIlpIY3kiOiLQliIsInpoY3kiOiLQtiIsInppZ3JhcnIiOiLih50iLCJ6b3BmIjoi8J2VqyIsIlpvcGYiOiLihKQiLCJac2NyIjoi8J2StSIsInpzY3IiOiLwnZOPIiwiendqIjoi4oCNIiwienduaiI6IuKAjCJ9Jyl9LGZ1bmN0aW9uKGQpe2QuZXhwb3J0cz1KU09OLnBhcnNlKCd7IkFhY3V0ZSI6IsOBIiwiYWFjdXRlIjoiw6EiLCJBY2lyYyI6IsOCIiwiYWNpcmMiOiLDoiIsImFjdXRlIjoiwrQiLCJBRWxpZyI6IsOGIiwiYWVsaWciOiLDpiIsIkFncmF2ZSI6IsOAIiwiYWdyYXZlIjoiw6AiLCJhbXAiOiImIiwiQU1QIjoiJiIsIkFyaW5nIjoiw4UiLCJhcmluZyI6IsOlIiwiQXRpbGRlIjoiw4MiLCJhdGlsZGUiOiLDoyIsIkF1bWwiOiLDhCIsImF1bWwiOiLDpCIsImJydmJhciI6IsKmIiwiQ2NlZGlsIjoiw4ciLCJjY2VkaWwiOiLDpyIsImNlZGlsIjoiwrgiLCJjZW50IjoiwqIiLCJjb3B5IjoiwqkiLCJDT1BZIjoiwqkiLCJjdXJyZW4iOiLCpCIsImRlZyI6IsKwIiwiZGl2aWRlIjoiw7ciLCJFYWN1dGUiOiLDiSIsImVhY3V0ZSI6IsOpIiwiRWNpcmMiOiLDiiIsImVjaXJjIjoiw6oiLCJFZ3JhdmUiOiLDiCIsImVncmF2ZSI6IsOoIiwiRVRIIjoiw5AiLCJldGgiOiLDsCIsIkV1bWwiOiLDiyIsImV1bWwiOiLDqyIsImZyYWMxMiI6IsK9IiwiZnJhYzE0IjoiwrwiLCJmcmFjMzQiOiLCviIsImd0IjoiPiIsIkdUIjoiPiIsIklhY3V0ZSI6IsONIiwiaWFjdXRlIjoiw60iLCJJY2lyYyI6IsOOIiwiaWNpcmMiOiLDriIsImlleGNsIjoiwqEiLCJJZ3JhdmUiOiLDjCIsImlncmF2ZSI6IsOsIiwiaXF1ZXN0Ijoiwr8iLCJJdW1sIjoiw48iLCJpdW1sIjoiw68iLCJsYXF1byI6IsKrIiwibHQiOiI8IiwiTFQiOiI8IiwibWFjciI6IsKvIiwibWljcm8iOiLCtSIsIm1pZGRvdCI6IsK3IiwibmJzcCI6IsKgIiwibm90IjoiwqwiLCJOdGlsZGUiOiLDkSIsIm50aWxkZSI6IsOxIiwiT2FjdXRlIjoiw5MiLCJvYWN1dGUiOiLDsyIsIk9jaXJjIjoiw5QiLCJvY2lyYyI6IsO0IiwiT2dyYXZlIjoiw5IiLCJvZ3JhdmUiOiLDsiIsIm9yZGYiOiLCqiIsIm9yZG0iOiLCuiIsIk9zbGFzaCI6IsOYIiwib3NsYXNoIjoiw7giLCJPdGlsZGUiOiLDlSIsIm90aWxkZSI6IsO1IiwiT3VtbCI6IsOWIiwib3VtbCI6IsO2IiwicGFyYSI6IsK2IiwicGx1c21uIjoiwrEiLCJwb3VuZCI6IsKjIiwicXVvdCI6IlxcIiIsIlFVT1QiOiJcXCIiLCJyYXF1byI6IsK7IiwicmVnIjoiwq4iLCJSRUciOiLCriIsInNlY3QiOiLCpyIsInNoeSI6IsKtIiwic3VwMSI6IsK5Iiwic3VwMiI6IsKyIiwic3VwMyI6IsKzIiwic3psaWciOiLDnyIsIlRIT1JOIjoiw54iLCJ0aG9ybiI6IsO+IiwidGltZXMiOiLDlyIsIlVhY3V0ZSI6IsOaIiwidWFjdXRlIjoiw7oiLCJVY2lyYyI6IsObIiwidWNpcmMiOiLDuyIsIlVncmF2ZSI6IsOZIiwidWdyYXZlIjoiw7kiLCJ1bWwiOiLCqCIsIlV1bWwiOiLDnCIsInV1bWwiOiLDvCIsIllhY3V0ZSI6IsOdIiwieWFjdXRlIjoiw70iLCJ5ZW4iOiLCpSIsInl1bWwiOiLDvyJ9Jyl9LGZ1bmN0aW9uKGQpe2QuZXhwb3J0cz1KU09OLnBhcnNlKGB7ImFtcCI6IiYiLCJhcG9zIjoiJyIsImd0IjoiPiIsImx0IjoiPCIsInF1b3QiOiJcXCIifWApfSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dGhpcyYmdGhpcy5fX2ltcG9ydERlZmF1bHR8fGZ1bmN0aW9uKHMpe3JldHVybiBzJiZzLl9fZXNNb2R1bGU/czp7ZGVmYXVsdDpzfX07T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBuPWUodCgyNjUpKTtmdW5jdGlvbiBhKHMpe2lmKHM+PTU1Mjk2JiZzPD01NzM0M3x8cz4xMTE0MTExKXJldHVybiLvv70iO3MgaW4gbi5kZWZhdWx0JiYocz1uLmRlZmF1bHRbc10pO3ZhciBpPSIiO3JldHVybiBzPjY1NTM1JiYocy09NjU1MzYsaSs9U3RyaW5nLmZyb21DaGFyQ29kZShzPj4+MTAmMTAyM3w1NTI5Nikscz01NjMyMHxzJjEwMjMpLGkrPVN0cmluZy5mcm9tQ2hhckNvZGUocyksaX1yLmRlZmF1bHQ9YX0sZnVuY3Rpb24oZCl7ZC5leHBvcnRzPUpTT04ucGFyc2UoJ3siMCI6NjU1MzMsIjEyOCI6ODM2NCwiMTMwIjo4MjE4LCIxMzEiOjQwMiwiMTMyIjo4MjIyLCIxMzMiOjgyMzAsIjEzNCI6ODIyNCwiMTM1Ijo4MjI1LCIxMzYiOjcxMCwiMTM3Ijo4MjQwLCIxMzgiOjM1MiwiMTM5Ijo4MjQ5LCIxNDAiOjMzOCwiMTQyIjozODEsIjE0NSI6ODIxNiwiMTQ2Ijo4MjE3LCIxNDciOjgyMjAsIjE0OCI6ODIyMSwiMTQ5Ijo4MjI2LCIxNTAiOjgyMTEsIjE1MSI6ODIxMiwiMTUyIjo3MzIsIjE1MyI6ODQ4MiwiMTU0IjozNTMsIjE1NSI6ODI1MCwiMTU2IjozMzksIjE1OCI6MzgyLCIxNTkiOjM3Nn0nKX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXRoaXMmJnRoaXMuX19pbXBvcnREZWZhdWx0fHxmdW5jdGlvbihUKXtyZXR1cm4gVCYmVC5fX2VzTW9kdWxlP1Q6e2RlZmF1bHQ6VH19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxyLmVzY2FwZT1yLmVuY29kZUhUTUw9ci5lbmNvZGVYTUw9dm9pZCAwO3ZhciBuPWUodCgyNjMpKSxhPW0obi5kZWZhdWx0KSxzPXUoYSk7ci5lbmNvZGVYTUw9TyhhLHMpO3ZhciBpPWUodCgyNjEpKSxvPW0oaS5kZWZhdWx0KSxjPXUobyk7ci5lbmNvZGVIVE1MPU8obyxjKTtmdW5jdGlvbiBtKFQpe3JldHVybiBPYmplY3Qua2V5cyhUKS5zb3J0KCkucmVkdWNlKGZ1bmN0aW9uKGwsaCl7cmV0dXJuIGxbVFtoXV09IiYiK2grIjsiLGx9LHt9KX1mdW5jdGlvbiB1KFQpe2Zvcih2YXIgbD1bXSxoPVtdLGY9MCxnPU9iamVjdC5rZXlzKFQpO2Y8Zy5sZW5ndGg7ZisrKXt2YXIgTT1nW2ZdO00ubGVuZ3RoPT09MT9sLnB1c2goIlxcIitNKTpoLnB1c2goTSl9bC5zb3J0KCk7Zm9yKHZhciBBPTA7QTxsLmxlbmd0aC0xO0ErKyl7Zm9yKHZhciBDPUE7QzxsLmxlbmd0aC0xJiZsW0NdLmNoYXJDb2RlQXQoMSkrMT09PWxbQysxXS5jaGFyQ29kZUF0KDEpOylDKz0xO3ZhciBiPTErQy1BO2I8M3x8bC5zcGxpY2UoQSxiLGxbQV0rIi0iK2xbQ10pfXJldHVybiBoLnVuc2hpZnQoIlsiK2wuam9pbigiIikrIl0iKSxuZXcgUmVnRXhwKGguam9pbigifCIpLCJnIil9dmFyIHA9Lyg/OltceDgwLVx1RDdGRlx1RTAwMC1cdUZGRkZdfFtcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGXXxbXHVEODAwLVx1REJGRl0oPyFbXHVEQzAwLVx1REZGRl0pfCg/OlteXHVEODAwLVx1REJGRl18XilbXHVEQzAwLVx1REZGRl0pL2c7ZnVuY3Rpb24geShUKXtyZXR1cm4iJiN4IitULmNvZGVQb2ludEF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpKyI7In1mdW5jdGlvbiBPKFQsbCl7cmV0dXJuIGZ1bmN0aW9uKGgpe3JldHVybiBoLnJlcGxhY2UobCxmdW5jdGlvbihmKXtyZXR1cm4gVFtmXX0pLnJlcGxhY2UocCx5KX19dmFyIHg9dShhKTtmdW5jdGlvbiB2KFQpe3JldHVybiBULnJlcGxhY2UoeCx5KS5yZXBsYWNlKHAseSl9ci5lc2NhcGU9dn0sZnVuY3Rpb24oZCl7ZC5leHBvcnRzPUpTT04ucGFyc2UoJ3siZWxlbWVudE5hbWVzIjp7ImFsdGdseXBoIjoiYWx0R2x5cGgiLCJhbHRnbHlwaGRlZiI6ImFsdEdseXBoRGVmIiwiYWx0Z2x5cGhpdGVtIjoiYWx0R2x5cGhJdGVtIiwiYW5pbWF0ZWNvbG9yIjoiYW5pbWF0ZUNvbG9yIiwiYW5pbWF0ZW1vdGlvbiI6ImFuaW1hdGVNb3Rpb24iLCJhbmltYXRldHJhbnNmb3JtIjoiYW5pbWF0ZVRyYW5zZm9ybSIsImNsaXBwYXRoIjoiY2xpcFBhdGgiLCJmZWJsZW5kIjoiZmVCbGVuZCIsImZlY29sb3JtYXRyaXgiOiJmZUNvbG9yTWF0cml4IiwiZmVjb21wb25lbnR0cmFuc2ZlciI6ImZlQ29tcG9uZW50VHJhbnNmZXIiLCJmZWNvbXBvc2l0ZSI6ImZlQ29tcG9zaXRlIiwiZmVjb252b2x2ZW1hdHJpeCI6ImZlQ29udm9sdmVNYXRyaXgiLCJmZWRpZmZ1c2VsaWdodGluZyI6ImZlRGlmZnVzZUxpZ2h0aW5nIiwiZmVkaXNwbGFjZW1lbnRtYXAiOiJmZURpc3BsYWNlbWVudE1hcCIsImZlZGlzdGFudGxpZ2h0IjoiZmVEaXN0YW50TGlnaHQiLCJmZWRyb3BzaGFkb3ciOiJmZURyb3BTaGFkb3ciLCJmZWZsb29kIjoiZmVGbG9vZCIsImZlZnVuY2EiOiJmZUZ1bmNBIiwiZmVmdW5jYiI6ImZlRnVuY0IiLCJmZWZ1bmNnIjoiZmVGdW5jRyIsImZlZnVuY3IiOiJmZUZ1bmNSIiwiZmVnYXVzc2lhbmJsdXIiOiJmZUdhdXNzaWFuQmx1ciIsImZlaW1hZ2UiOiJmZUltYWdlIiwiZmVtZXJnZSI6ImZlTWVyZ2UiLCJmZW1lcmdlbm9kZSI6ImZlTWVyZ2VOb2RlIiwiZmVtb3JwaG9sb2d5IjoiZmVNb3JwaG9sb2d5IiwiZmVvZmZzZXQiOiJmZU9mZnNldCIsImZlcG9pbnRsaWdodCI6ImZlUG9pbnRMaWdodCIsImZlc3BlY3VsYXJsaWdodGluZyI6ImZlU3BlY3VsYXJMaWdodGluZyIsImZlc3BvdGxpZ2h0IjoiZmVTcG90TGlnaHQiLCJmZXRpbGUiOiJmZVRpbGUiLCJmZXR1cmJ1bGVuY2UiOiJmZVR1cmJ1bGVuY2UiLCJmb3JlaWdub2JqZWN0IjoiZm9yZWlnbk9iamVjdCIsImdseXBocmVmIjoiZ2x5cGhSZWYiLCJsaW5lYXJncmFkaWVudCI6ImxpbmVhckdyYWRpZW50IiwicmFkaWFsZ3JhZGllbnQiOiJyYWRpYWxHcmFkaWVudCIsInRleHRwYXRoIjoidGV4dFBhdGgifSwiYXR0cmlidXRlTmFtZXMiOnsiZGVmaW5pdGlvbnVybCI6ImRlZmluaXRpb25VUkwiLCJhdHRyaWJ1dGVuYW1lIjoiYXR0cmlidXRlTmFtZSIsImF0dHJpYnV0ZXR5cGUiOiJhdHRyaWJ1dGVUeXBlIiwiYmFzZWZyZXF1ZW5jeSI6ImJhc2VGcmVxdWVuY3kiLCJiYXNlcHJvZmlsZSI6ImJhc2VQcm9maWxlIiwiY2FsY21vZGUiOiJjYWxjTW9kZSIsImNsaXBwYXRodW5pdHMiOiJjbGlwUGF0aFVuaXRzIiwiZGlmZnVzZWNvbnN0YW50IjoiZGlmZnVzZUNvbnN0YW50IiwiZWRnZW1vZGUiOiJlZGdlTW9kZSIsImZpbHRlcnVuaXRzIjoiZmlsdGVyVW5pdHMiLCJnbHlwaHJlZiI6ImdseXBoUmVmIiwiZ3JhZGllbnR0cmFuc2Zvcm0iOiJncmFkaWVudFRyYW5zZm9ybSIsImdyYWRpZW50dW5pdHMiOiJncmFkaWVudFVuaXRzIiwia2VybmVsbWF0cml4Ijoia2VybmVsTWF0cml4Iiwia2VybmVsdW5pdGxlbmd0aCI6Imtlcm5lbFVuaXRMZW5ndGgiLCJrZXlwb2ludHMiOiJrZXlQb2ludHMiLCJrZXlzcGxpbmVzIjoia2V5U3BsaW5lcyIsImtleXRpbWVzIjoia2V5VGltZXMiLCJsZW5ndGhhZGp1c3QiOiJsZW5ndGhBZGp1c3QiLCJsaW1pdGluZ2NvbmVhbmdsZSI6ImxpbWl0aW5nQ29uZUFuZ2xlIiwibWFya2VyaGVpZ2h0IjoibWFya2VySGVpZ2h0IiwibWFya2VydW5pdHMiOiJtYXJrZXJVbml0cyIsIm1hcmtlcndpZHRoIjoibWFya2VyV2lkdGgiLCJtYXNrY29udGVudHVuaXRzIjoibWFza0NvbnRlbnRVbml0cyIsIm1hc2t1bml0cyI6Im1hc2tVbml0cyIsIm51bW9jdGF2ZXMiOiJudW1PY3RhdmVzIiwicGF0aGxlbmd0aCI6InBhdGhMZW5ndGgiLCJwYXR0ZXJuY29udGVudHVuaXRzIjoicGF0dGVybkNvbnRlbnRVbml0cyIsInBhdHRlcm50cmFuc2Zvcm0iOiJwYXR0ZXJuVHJhbnNmb3JtIiwicGF0dGVybnVuaXRzIjoicGF0dGVyblVuaXRzIiwicG9pbnRzYXR4IjoicG9pbnRzQXRYIiwicG9pbnRzYXR5IjoicG9pbnRzQXRZIiwicG9pbnRzYXR6IjoicG9pbnRzQXRaIiwicHJlc2VydmVhbHBoYSI6InByZXNlcnZlQWxwaGEiLCJwcmVzZXJ2ZWFzcGVjdHJhdGlvIjoicHJlc2VydmVBc3BlY3RSYXRpbyIsInByaW1pdGl2ZXVuaXRzIjoicHJpbWl0aXZlVW5pdHMiLCJyZWZ4IjoicmVmWCIsInJlZnkiOiJyZWZZIiwicmVwZWF0Y291bnQiOiJyZXBlYXRDb3VudCIsInJlcGVhdGR1ciI6InJlcGVhdER1ciIsInJlcXVpcmVkZXh0ZW5zaW9ucyI6InJlcXVpcmVkRXh0ZW5zaW9ucyIsInJlcXVpcmVkZmVhdHVyZXMiOiJyZXF1aXJlZEZlYXR1cmVzIiwic3BlY3VsYXJjb25zdGFudCI6InNwZWN1bGFyQ29uc3RhbnQiLCJzcGVjdWxhcmV4cG9uZW50Ijoic3BlY3VsYXJFeHBvbmVudCIsInNwcmVhZG1ldGhvZCI6InNwcmVhZE1ldGhvZCIsInN0YXJ0b2Zmc2V0Ijoic3RhcnRPZmZzZXQiLCJzdGRkZXZpYXRpb24iOiJzdGREZXZpYXRpb24iLCJzdGl0Y2h0aWxlcyI6InN0aXRjaFRpbGVzIiwic3VyZmFjZXNjYWxlIjoic3VyZmFjZVNjYWxlIiwic3lzdGVtbGFuZ3VhZ2UiOiJzeXN0ZW1MYW5ndWFnZSIsInRhYmxldmFsdWVzIjoidGFibGVWYWx1ZXMiLCJ0YXJnZXR4IjoidGFyZ2V0WCIsInRhcmdldHkiOiJ0YXJnZXRZIiwidGV4dGxlbmd0aCI6InRleHRMZW5ndGgiLCJ2aWV3Ym94Ijoidmlld0JveCIsInZpZXd0YXJnZXQiOiJ2aWV3VGFyZ2V0IiwieGNoYW5uZWxzZWxlY3RvciI6InhDaGFubmVsU2VsZWN0b3IiLCJ5Y2hhbm5lbHNlbGVjdG9yIjoieUNoYW5uZWxTZWxlY3RvciIsInpvb21hbmRwYW4iOiJ6b29tQW5kUGFuIn19Jyl9LGZ1bmN0aW9uKGQscil7dmFyIHQ9ci5nZXRDaGlsZHJlbj1mdW5jdGlvbihuKXtyZXR1cm4gbi5jaGlsZHJlbn0sZT1yLmdldFBhcmVudD1mdW5jdGlvbihuKXtyZXR1cm4gbi5wYXJlbnR9O3IuZ2V0U2libGluZ3M9ZnVuY3Rpb24obil7dmFyIGE9ZShuKTtyZXR1cm4gYT90KGEpOltuXX0sci5nZXRBdHRyaWJ1dGVWYWx1ZT1mdW5jdGlvbihuLGEpe3JldHVybiBuLmF0dHJpYnMmJm4uYXR0cmlic1thXX0sci5oYXNBdHRyaWI9ZnVuY3Rpb24obixhKXtyZXR1cm4hIW4uYXR0cmlicyYmaGFzT3duUHJvcGVydHkuY2FsbChuLmF0dHJpYnMsYSl9LHIuZ2V0TmFtZT1mdW5jdGlvbihuKXtyZXR1cm4gbi5uYW1lfX0sZnVuY3Rpb24oZCxyKXtyLnJlbW92ZUVsZW1lbnQ9ZnVuY3Rpb24odCl7aWYodC5wcmV2JiYodC5wcmV2Lm5leHQ9dC5uZXh0KSx0Lm5leHQmJih0Lm5leHQucHJldj10LnByZXYpLHQucGFyZW50KXt2YXIgZT10LnBhcmVudC5jaGlsZHJlbjtlLnNwbGljZShlLmxhc3RJbmRleE9mKHQpLDEpfX0sci5yZXBsYWNlRWxlbWVudD1mdW5jdGlvbih0LGUpe3ZhciBuPWUucHJldj10LnByZXY7biYmKG4ubmV4dD1lKTt2YXIgYT1lLm5leHQ9dC5uZXh0O2EmJihhLnByZXY9ZSk7dmFyIHM9ZS5wYXJlbnQ9dC5wYXJlbnQ7aWYocyl7dmFyIGk9cy5jaGlsZHJlbjtpW2kubGFzdEluZGV4T2YodCldPWV9fSxyLmFwcGVuZENoaWxkPWZ1bmN0aW9uKHQsZSl7aWYoZS5wYXJlbnQ9dCx0LmNoaWxkcmVuLnB1c2goZSkhPT0xKXt2YXIgbj10LmNoaWxkcmVuW3QuY2hpbGRyZW4ubGVuZ3RoLTJdO24ubmV4dD1lLGUucHJldj1uLGUubmV4dD1udWxsfX0sci5hcHBlbmQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10LnBhcmVudCxhPXQubmV4dDtpZihlLm5leHQ9YSxlLnByZXY9dCx0Lm5leHQ9ZSxlLnBhcmVudD1uLGEpe2lmKGEucHJldj1lLG4pe3ZhciBzPW4uY2hpbGRyZW47cy5zcGxpY2Uocy5sYXN0SW5kZXhPZihhKSwwLGUpfX1lbHNlIG4mJm4uY2hpbGRyZW4ucHVzaChlKX0sci5wcmVwZW5kPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5wYXJlbnQ7aWYobil7dmFyIGE9bi5jaGlsZHJlbjthLnNwbGljZShhLmxhc3RJbmRleE9mKHQpLDAsZSl9dC5wcmV2JiYodC5wcmV2Lm5leHQ9ZSksZS5wYXJlbnQ9bixlLnByZXY9dC5wcmV2LGUubmV4dD10LHQucHJldj1lfX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoMjU2KS5pc1RhZztkLmV4cG9ydHM9e2ZpbHRlcjpuLGZpbmQ6YSxmaW5kT25lQ2hpbGQ6cyxmaW5kT25lOmksZXhpc3RzT25lOm8sZmluZEFsbDpjfTtmdW5jdGlvbiBuKG0sdSxwLHkpe3JldHVybiBBcnJheS5pc0FycmF5KHUpfHwodT1bdV0pLCh0eXBlb2YgeSE9Im51bWJlciJ8fCFpc0Zpbml0ZSh5KSkmJih5PTEvMCksYShtLHUscCE9PSExLHkpfWZ1bmN0aW9uIGEobSx1LHAseSl7Zm9yKHZhciBPPVtdLHgsdj0wLFQ9dS5sZW5ndGg7djxUJiYhKG0odVt2XSkmJihPLnB1c2godVt2XSksLS15PD0wKXx8KHg9dVt2XS5jaGlsZHJlbixwJiZ4JiZ4Lmxlbmd0aD4wJiYoeD1hKG0seCxwLHkpLE89Ty5jb25jYXQoeCkseS09eC5sZW5ndGgseTw9MCkpKTt2KyspO3JldHVybiBPfWZ1bmN0aW9uIHMobSx1KXtmb3IodmFyIHA9MCx5PXUubGVuZ3RoO3A8eTtwKyspaWYobSh1W3BdKSlyZXR1cm4gdVtwXTtyZXR1cm4gbnVsbH1mdW5jdGlvbiBpKG0sdSl7Zm9yKHZhciBwPW51bGwseT0wLE89dS5sZW5ndGg7eTxPJiYhcDt5KyspaWYoZSh1W3ldKSltKHVbeV0pP3A9dVt5XTp1W3ldLmNoaWxkcmVuLmxlbmd0aD4wJiYocD1pKG0sdVt5XS5jaGlsZHJlbikpO2Vsc2UgY29udGludWU7cmV0dXJuIHB9ZnVuY3Rpb24gbyhtLHUpe2Zvcih2YXIgcD0wLHk9dS5sZW5ndGg7cDx5O3ArKylpZihlKHVbcF0pJiYobSh1W3BdKXx8dVtwXS5jaGlsZHJlbi5sZW5ndGg+MCYmbyhtLHVbcF0uY2hpbGRyZW4pKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBjKG0sdSl7Zm9yKHZhciBwPVtdLHk9dS5zbGljZSgpO3kubGVuZ3RoOyl7dmFyIE89eS5zaGlmdCgpO2UoTykmJihPLmNoaWxkcmVuJiZPLmNoaWxkcmVuLmxlbmd0aD4wJiZ5LnVuc2hpZnQuYXBwbHkoeSxPLmNoaWxkcmVuKSxtKE8pJiZwLnB1c2goTykpfXJldHVybiBwfX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoMjU2KSxuPXIuaXNUYWc9ZS5pc1RhZztyLnRlc3RFbGVtZW50PWZ1bmN0aW9uKG8sYyl7Zm9yKHZhciBtIGluIG8paWYoby5oYXNPd25Qcm9wZXJ0eShtKSl7aWYobT09PSJ0YWdfbmFtZSIpe2lmKCFuKGMpfHwhby50YWdfbmFtZShjLm5hbWUpKXJldHVybiExfWVsc2UgaWYobT09PSJ0YWdfdHlwZSIpe2lmKCFvLnRhZ190eXBlKGMudHlwZSkpcmV0dXJuITF9ZWxzZSBpZihtPT09InRhZ19jb250YWlucyIpe2lmKG4oYyl8fCFvLnRhZ19jb250YWlucyhjLmRhdGEpKXJldHVybiExfWVsc2UgaWYoIWMuYXR0cmlic3x8IW9bbV0oYy5hdHRyaWJzW21dKSlyZXR1cm4hMX1yZXR1cm4hMH07dmFyIGE9e3RhZ19uYW1lOmZ1bmN0aW9uKG8pe3JldHVybiB0eXBlb2Ygbz09ImZ1bmN0aW9uIj9mdW5jdGlvbihjKXtyZXR1cm4gbihjKSYmbyhjLm5hbWUpfTpvPT09IioiP246ZnVuY3Rpb24oYyl7cmV0dXJuIG4oYykmJmMubmFtZT09PW99fSx0YWdfdHlwZTpmdW5jdGlvbihvKXtyZXR1cm4gdHlwZW9mIG89PSJmdW5jdGlvbiI/ZnVuY3Rpb24oYyl7cmV0dXJuIG8oYy50eXBlKX06ZnVuY3Rpb24oYyl7cmV0dXJuIGMudHlwZT09PW99fSx0YWdfY29udGFpbnM6ZnVuY3Rpb24obyl7cmV0dXJuIHR5cGVvZiBvPT0iZnVuY3Rpb24iP2Z1bmN0aW9uKGMpe3JldHVybiFuKGMpJiZvKGMuZGF0YSl9OmZ1bmN0aW9uKGMpe3JldHVybiFuKGMpJiZjLmRhdGE9PT1vfX19O2Z1bmN0aW9uIHMobyxjKXtyZXR1cm4gdHlwZW9mIGM9PSJmdW5jdGlvbiI/ZnVuY3Rpb24obSl7cmV0dXJuIG0uYXR0cmlicyYmYyhtLmF0dHJpYnNbb10pfTpmdW5jdGlvbihtKXtyZXR1cm4gbS5hdHRyaWJzJiZtLmF0dHJpYnNbb109PT1jfX1mdW5jdGlvbiBpKG8sYyl7cmV0dXJuIGZ1bmN0aW9uKG0pe3JldHVybiBvKG0pfHxjKG0pfX1yLmdldEVsZW1lbnRzPWZ1bmN0aW9uKG8sYyxtLHUpe3ZhciBwPU9iamVjdC5rZXlzKG8pLm1hcChmdW5jdGlvbih5KXt2YXIgTz1vW3ldO3JldHVybiB5IGluIGE/YVt5XShPKTpzKHksTyl9KTtyZXR1cm4gcC5sZW5ndGg9PT0wP1tdOnRoaXMuZmlsdGVyKHAucmVkdWNlKGkpLGMsbSx1KX0sci5nZXRFbGVtZW50QnlJZD1mdW5jdGlvbihvLGMsbSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoYyl8fChjPVtjXSksdGhpcy5maW5kT25lKHMoImlkIixvKSxjLG0hPT0hMSl9LHIuZ2V0RWxlbWVudHNCeVRhZ05hbWU9ZnVuY3Rpb24obyxjLG0sdSl7cmV0dXJuIHRoaXMuZmlsdGVyKGEudGFnX25hbWUobyksYyxtLHUpfSxyLmdldEVsZW1lbnRzQnlUYWdUeXBlPWZ1bmN0aW9uKG8sYyxtLHUpe3JldHVybiB0aGlzLmZpbHRlcihhLnRhZ190eXBlKG8pLGMsbSx1KX19LGZ1bmN0aW9uKGQscil7ci5yZW1vdmVTdWJzZXRzPWZ1bmN0aW9uKG4pe2Zvcih2YXIgYT1uLmxlbmd0aCxzLGksbzstLWE+LTE7KXtmb3Iocz1pPW5bYV0sblthXT1udWxsLG89ITA7aTspe2lmKG4uaW5kZXhPZihpKT4tMSl7bz0hMSxuLnNwbGljZShhLDEpO2JyZWFrfWk9aS5wYXJlbnR9byYmKG5bYV09cyl9cmV0dXJuIG59O3ZhciB0PXtESVNDT05ORUNURUQ6MSxQUkVDRURJTkc6MixGT0xMT1dJTkc6NCxDT05UQUlOUzo4LENPTlRBSU5FRF9CWToxNn0sZT1yLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uPWZ1bmN0aW9uKG4sYSl7dmFyIHM9W10saT1bXSxvLGMsbSx1LHAseTtpZihuPT09YSlyZXR1cm4gMDtmb3Iobz1uO287KXMudW5zaGlmdChvKSxvPW8ucGFyZW50O2ZvcihvPWE7bzspaS51bnNoaWZ0KG8pLG89by5wYXJlbnQ7Zm9yKHk9MDtzW3ldPT09aVt5XTspeSsrO3JldHVybiB5PT09MD90LkRJU0NPTk5FQ1RFRDooYz1zW3ktMV0sbT1jLmNoaWxkcmVuLHU9c1t5XSxwPWlbeV0sbS5pbmRleE9mKHUpPm0uaW5kZXhPZihwKT9jPT09YT90LkZPTExPV0lOR3x0LkNPTlRBSU5FRF9CWTp0LkZPTExPV0lORzpjPT09bj90LlBSRUNFRElOR3x0LkNPTlRBSU5TOnQuUFJFQ0VESU5HKX07ci51bmlxdWVTb3J0PWZ1bmN0aW9uKG4pe3ZhciBhPW4ubGVuZ3RoLHMsaTtmb3Iobj1uLnNsaWNlKCk7LS1hPi0xOylzPW5bYV0saT1uLmluZGV4T2YocyksaT4tMSYmaTxhJiZuLnNwbGljZShhLDEpO3JldHVybiBuLnNvcnQoZnVuY3Rpb24obyxjKXt2YXIgbT1lKG8sYyk7cmV0dXJuIG0mdC5QUkVDRURJTkc/LTE6bSZ0LkZPTExPV0lORz8xOjB9KSxufX0sZnVuY3Rpb24oZCxyKXtkLmV4cG9ydHM9e3RydWVGdW5jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGZhbHNlRnVuYzpmdW5jdGlvbigpe3JldHVybiExfX19LGZ1bmN0aW9uKGQscix0KXtkLmV4cG9ydHM9cDt2YXIgZT10KDI3NSkucGFyc2Usbj10KDI3MyksYT10KDI3OCkscz10KDI3OSksaT10KDI4MCksbz10KDI4MiksYz1uLnRydWVGdW5jLG09bi5mYWxzZUZ1bmMsdT1vLmZpbHRlcnM7ZnVuY3Rpb24gcChFLEwsRCl7dmFyIEk9TyhFLEwsRCk7cmV0dXJuIHkoSSxMKX1mdW5jdGlvbiB5KEUsTCl7dmFyIEQ9TC5hZGFwdGVyO3JldHVybiBmdW5jdGlvbihSKXtyZXR1cm4gRC5pc1RhZyhSKSYmRShSKX19ZnVuY3Rpb24gTyhFLEwsRCl7dmFyIEk9ZShFLEwpO3JldHVybiBnKEksTCxEKX1mdW5jdGlvbiB4KEUpe3JldHVybiBFLnR5cGU9PT0icHNldWRvIiYmKEUubmFtZT09PSJzY29wZSJ8fEFycmF5LmlzQXJyYXkoRS5kYXRhKSYmRS5kYXRhLnNvbWUoZnVuY3Rpb24oTCl7cmV0dXJuIEwuc29tZSh4KX0pKX12YXIgdj17dHlwZToiZGVzY2VuZGFudCJ9LFQ9e3R5cGU6Il9mbGV4aWJsZURlc2NlbmRhbnQifSxsPXt0eXBlOiJwc2V1ZG8iLG5hbWU6InNjb3BlIn0saD17fTtmdW5jdGlvbiBmKEUsTCxEKXt2YXIgST1MLmFkYXB0ZXIsUj0hIUQmJiEhRC5sZW5ndGgmJkQuZXZlcnkoZnVuY3Rpb24oQil7cmV0dXJuIEI9PT1ofHwhIUkuZ2V0UGFyZW50KEIpfSk7RS5mb3JFYWNoKGZ1bmN0aW9uKEIpe2lmKCEoQi5sZW5ndGg+MCYmTShCWzBdKSYmQlswXS50eXBlIT09ImRlc2NlbmRhbnQiKSlpZihSJiYhKEFycmF5LmlzQXJyYXkoQik/Qi5zb21lKHgpOngoQikpKUIudW5zaGlmdCh2KTtlbHNlIHJldHVybjtCLnVuc2hpZnQobCl9KX1mdW5jdGlvbiBnKEUsTCxEKXtFPUUuZmlsdGVyKGZ1bmN0aW9uKHope3JldHVybiB6Lmxlbmd0aD4wfSksRS5mb3JFYWNoKGEpO3ZhciBJPUFycmF5LmlzQXJyYXkoRCk7RD1MJiZMLmNvbnRleHR8fEQsRCYmIUkmJihEPVtEXSksZihFLEwsRCk7dmFyIFI9ITEsQj1FLm1hcChmdW5jdGlvbih6KXtpZih6WzBdJiZ6WzFdJiZ6WzBdLm5hbWU9PT0ic2NvcGUiKXt2YXIgSz16WzFdLnR5cGU7SSYmSz09PSJkZXNjZW5kYW50Ij96WzFdPVQ6KEs9PT0iYWRqYWNlbnQifHxLPT09InNpYmxpbmciKSYmKFI9ITApfXJldHVybiBBKHosTCxEKX0pLnJlZHVjZShDLG0pO3JldHVybiBCLnNob3VsZFRlc3ROZXh0U2libGluZ3M9UixCfWZ1bmN0aW9uIE0oRSl7cmV0dXJuIHNbRS50eXBlXTwwfWZ1bmN0aW9uIEEoRSxMLEQpe3JldHVybiBFLnJlZHVjZShmdW5jdGlvbihJLFIpe2lmKEk9PT1tKXJldHVybiBJO2lmKCEoUi50eXBlIGluIGkpKXRocm93IG5ldyBFcnJvcigiUnVsZSB0eXBlICIrUi50eXBlKyIgaXMgbm90IHN1cHBvcnRlZCBieSBjc3Mtc2VsZWN0Iik7cmV0dXJuIGlbUi50eXBlXShJLFIsTCxEKX0sTCYmTC5yb290RnVuY3x8Yyl9ZnVuY3Rpb24gQyhFLEwpe3JldHVybiBMPT09bXx8RT09PWM/RTpFPT09bXx8TD09PWM/TDpmdW5jdGlvbihJKXtyZXR1cm4gRShJKXx8TChJKX19ZnVuY3Rpb24gYihFKXtyZXR1cm4gRS5zb21lKE0pfXUubm90PWZ1bmN0aW9uKEUsTCxELEkpe3ZhciBSPXt4bWxNb2RlOiEhKEQmJkQueG1sTW9kZSksc3RyaWN0OiEhKEQmJkQuc3RyaWN0KSxhZGFwdGVyOkQuYWRhcHRlcn07aWYoUi5zdHJpY3QmJihMLmxlbmd0aD4xfHxMLnNvbWUoYikpKXRocm93IG5ldyBFcnJvcigiY29tcGxleCBzZWxlY3RvcnMgaW4gOm5vdCBhcmVuJ3QgYWxsb3dlZCBpbiBzdHJpY3QgbW9kZSIpO3ZhciBCPWcoTCxSLEkpO3JldHVybiBCPT09bT9FOkI9PT1jP206ZnVuY3Rpb24oSyl7cmV0dXJuIUIoSykmJkUoSyl9fSx1Lmhhcz1mdW5jdGlvbihFLEwsRCl7dmFyIEk9RC5hZGFwdGVyLFI9e3htbE1vZGU6ISEoRCYmRC54bWxNb2RlKSxzdHJpY3Q6ISEoRCYmRC5zdHJpY3QpLGFkYXB0ZXI6SX0sQj1MLnNvbWUoYik/W2hdOm51bGwsej1nKEwsUixCKTtyZXR1cm4gej09PW0/bTp6PT09Yz9mdW5jdGlvbihRKXtyZXR1cm4gSS5nZXRDaGlsZHJlbihRKS5zb21lKEkuaXNUYWcpJiZFKFEpfTooej15KHosRCksQj9mdW5jdGlvbihRKXtyZXR1cm4gRShRKSYmKEJbMF09USxJLmV4aXN0c09uZSh6LEkuZ2V0Q2hpbGRyZW4oUSkpKX06ZnVuY3Rpb24oUSl7cmV0dXJuIEUoUSkmJkkuZXhpc3RzT25lKHosSS5nZXRDaGlsZHJlbihRKSl9KX0sdS5tYXRjaGVzPWZ1bmN0aW9uKEUsTCxELEkpe3ZhciBSPXt4bWxNb2RlOiEhKEQmJkQueG1sTW9kZSksc3RyaWN0OiEhKEQmJkQuc3RyaWN0KSxyb290RnVuYzpFLGFkYXB0ZXI6RC5hZGFwdGVyfTtyZXR1cm4gZyhMLFIsSSl9LHAuY29tcGlsZVRva2VuPWcscC5jb21waWxlVW5zYWZlPU8scC5Qc2V1ZG9zPW99LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10aGlzJiZ0aGlzLl9fY3JlYXRlQmluZGluZ3x8KE9iamVjdC5jcmVhdGU/ZnVuY3Rpb24oaSxvLGMsbSl7bT09PXZvaWQgMCYmKG09YyksT2JqZWN0LmRlZmluZVByb3BlcnR5KGksbSx7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gb1tjXX19KX06ZnVuY3Rpb24oaSxvLGMsbSl7bT09PXZvaWQgMCYmKG09YyksaVttXT1vW2NdfSksbj10aGlzJiZ0aGlzLl9fZXhwb3J0U3Rhcnx8ZnVuY3Rpb24oaSxvKXtmb3IodmFyIGMgaW4gaSljIT09ImRlZmF1bHQiJiYhby5oYXNPd25Qcm9wZXJ0eShjKSYmZShvLGksYyl9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxuKHQoMjc2KSxyKTt2YXIgYT10KDI3Nik7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsInBhcnNlIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYS5kZWZhdWx0fX0pO3ZhciBzPXQoMjc3KTtPYmplY3QuZGVmaW5lUHJvcGVydHkociwic3RyaW5naWZ5Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gcy5kZWZhdWx0fX0pfSxmdW5jdGlvbihkLHIsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHIuZGVmYXVsdD14O3ZhciBlPS9eW15cXF0/KD86XFwoPzpbXGRhLWZdezEsNn1ccz98Lil8W1x3XC1cdTAwYjAtXHVGRkZGXSkrLyxuPS9cXChbXGRhLWZdezEsNn1ccz98KFxzKXwuKS9naSxhPS9eXHMqKCg/OlxcLnxbXHdcdTAwYjAtXHVGRkZGLV0pKylccyooPzooXFM/KT1ccyooPzooWyciXSkoW15dKj8pXDN8KCM/KD86XFwufFtcd1x1MDBiMC1cdUZGRkYtXSkqKXwpfClccyooaSk/XF0vLHM9e3VuZGVmaW5lZDoiZXhpc3RzIiwiIjoiZXF1YWxzIiwifiI6ImVsZW1lbnQiLCJeIjoic3RhcnQiLCQ6ImVuZCIsIioiOiJhbnkiLCIhIjoibm90IiwifCI6Imh5cGhlbiJ9LGk9eyI+IjoiY2hpbGQiLCI8IjoicGFyZW50IiwifiI6InNpYmxpbmciLCIrIjoiYWRqYWNlbnQifSxvPXsiIyI6WyJpZCIsImVxdWFscyJdLCIuIjpbImNsYXNzIiwiZWxlbWVudCJdfSxjPW5ldyBTZXQoWyJoYXMiLCJub3QiLCJtYXRjaGVzIl0pLG09bmV3IFNldChbImNvbnRhaW5zIiwiaWNvbnRhaW5zIl0pLHU9bmV3IFNldChbJyInLCInIl0pO2Z1bmN0aW9uIHAobCxoLGYpe3ZhciBnPXBhcnNlSW50KGgsMTYpLTY1NTM2O3JldHVybiBnIT09Z3x8Zj9oOmc8MD9TdHJpbmcuZnJvbUNoYXJDb2RlKGcrNjU1MzYpOlN0cmluZy5mcm9tQ2hhckNvZGUoZz4+MTB8NTUyOTYsZyYxMDIzfDU2MzIwKX1mdW5jdGlvbiB5KGwpe3JldHVybiBsLnJlcGxhY2UobixwKX1mdW5jdGlvbiBPKGwpe3JldHVybiBsPT09IiAifHxsPT09YApgfHxsPT09IgkifHxsPT09IlxmInx8bD09PSJcciJ9ZnVuY3Rpb24geChsLGgpe3ZhciBmPVtdO2lmKGw9dihmLCIiK2wsaCksbCE9PSIiKXRocm93IG5ldyBFcnJvcigiVW5tYXRjaGVkIHNlbGVjdG9yOiAiK2wpO3JldHVybiBmfWZ1bmN0aW9uIHYobCxoLGYpe3ZhciBnPVtdLE09ITE7ZnVuY3Rpb24gQSgpe3ZhciBYPWgubWF0Y2goZSk7aWYoIVgpdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCBuYW1lLCBmb3VuZCAiK2gpO3ZhciBaPVhbMF07cmV0dXJuIGg9aC5zdWJzdHIoWi5sZW5ndGgpLHkoWil9ZnVuY3Rpb24gQyhYKXtmb3IoO08oaC5jaGFyQXQoWCkpOylYKys7aD1oLnN1YnN0cihYKX1mdW5jdGlvbiBiKFgpe2Zvcih2YXIgWj0wO2guY2hhckF0KC0tWCk9PT0iXFwiOylaKys7cmV0dXJuKFomMSk9PT0xfWZvcihDKDApO2ghPT0iIjspe3ZhciBFPWguY2hhckF0KDApO2lmKE8oRSkpTT0hMCxDKDEpO2Vsc2UgaWYoRSBpbiBpKWcucHVzaCh7dHlwZTppW0VdfSksTT0hMSxDKDEpO2Vsc2UgaWYoRT09PSIsIil7aWYoZy5sZW5ndGg9PT0wKXRocm93IG5ldyBFcnJvcigiRW1wdHkgc3ViLXNlbGVjdG9yIik7bC5wdXNoKGcpLGc9W10sTT0hMSxDKDEpfWVsc2UgaWYoTSYmKGcubGVuZ3RoPjAmJmcucHVzaCh7dHlwZToiZGVzY2VuZGFudCJ9KSxNPSExKSxFPT09IioiKWg9aC5zdWJzdHIoMSksZy5wdXNoKHt0eXBlOiJ1bml2ZXJzYWwifSk7ZWxzZSBpZihFIGluIG8pe3ZhciBMPW9bRV0sRD1MWzBdLEk9TFsxXTtoPWguc3Vic3RyKDEpLGcucHVzaCh7dHlwZToiYXR0cmlidXRlIixuYW1lOkQsYWN0aW9uOkksdmFsdWU6QSgpLGlnbm9yZUNhc2U6ITF9KX1lbHNlIGlmKEU9PT0iWyIpe2g9aC5zdWJzdHIoMSk7dmFyIFI9aC5tYXRjaChhKTtpZighUil0aHJvdyBuZXcgRXJyb3IoIk1hbGZvcm1lZCBhdHRyaWJ1dGUgc2VsZWN0b3I6ICIraCk7aD1oLnN1YnN0cihSWzBdLmxlbmd0aCk7dmFyIEI9eShSWzFdKTsoIWZ8fCgibG93ZXJDYXNlQXR0cmlidXRlTmFtZXMiaW4gZj9mLmxvd2VyQ2FzZUF0dHJpYnV0ZU5hbWVzOiFmLnhtbE1vZGUpKSYmKEI9Qi50b0xvd2VyQ2FzZSgpKSxnLnB1c2goe3R5cGU6ImF0dHJpYnV0ZSIsbmFtZTpCLGFjdGlvbjpzW1JbMl1dLHZhbHVlOnkoUls0XXx8Uls1XXx8IiIpLGlnbm9yZUNhc2U6ISFSWzZdfSl9ZWxzZSBpZihFPT09IjoiKXtpZihoLmNoYXJBdCgxKT09PSI6Iil7aD1oLnN1YnN0cigyKSxnLnB1c2goe3R5cGU6InBzZXVkby1lbGVtZW50IixuYW1lOkEoKS50b0xvd2VyQ2FzZSgpfSk7Y29udGludWV9aD1oLnN1YnN0cigxKTt2YXIgej1BKCkudG9Mb3dlckNhc2UoKSxSPW51bGw7aWYoaC5jaGFyQXQoMCk9PT0iKCIpaWYoYy5oYXMoeikpe3ZhciBLPWguY2hhckF0KDEpLFE9dS5oYXMoSyk7aWYoaD1oLnN1YnN0cihRPzI6MSksUj1bXSxoPXYoUixoLGYpLFEpe2lmKGguY2hhckF0KDApIT09Syl0aHJvdyBuZXcgRXJyb3IoIlVubWF0Y2hlZCBxdW90ZXMgaW4gOiIreik7aD1oLnN1YnN0cigxKX1pZihoLmNoYXJBdCgwKSE9PSIpIil0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgY2xvc2luZyBwYXJlbnRoZXNpcyBpbiA6Iit6KyIgKCIraCsiKSIpO2g9aC5zdWJzdHIoMSl9ZWxzZXtmb3IodmFyIF89MSxqPTE7aj4wJiZfPGgubGVuZ3RoO18rKyloLmNoYXJBdChfKT09PSIoIiYmIWIoXyk/aisrOmguY2hhckF0KF8pPT09IikiJiYhYihfKSYmai0tO2lmKGopdGhyb3cgbmV3IEVycm9yKCJQYXJlbnRoZXNpcyBub3QgbWF0Y2hlZCIpO2lmKFI9aC5zdWJzdHIoMSxfLTIpLGg9aC5zdWJzdHIoXyksbS5oYXMoeikpe3ZhciBLPVIuY2hhckF0KDApO0s9PT1SLnNsaWNlKC0xKSYmdS5oYXMoSykmJihSPVIuc2xpY2UoMSwtMSkpLFI9eShSKX19Zy5wdXNoKHt0eXBlOiJwc2V1ZG8iLG5hbWU6eixkYXRhOlJ9KX1lbHNlIGlmKGUudGVzdChoKSl7dmFyIEc9QSgpOyghZnx8KCJsb3dlckNhc2VUYWdzImluIGY/Zi5sb3dlckNhc2VUYWdzOiFmLnhtbE1vZGUpKSYmKEc9Ry50b0xvd2VyQ2FzZSgpKSxnLnB1c2goe3R5cGU6InRhZyIsbmFtZTpHfSl9ZWxzZSByZXR1cm4gZy5sZW5ndGgmJmdbZy5sZW5ndGgtMV0udHlwZT09PSJkZXNjZW5kYW50IiYmZy5wb3AoKSxUKGwsZyksaH1yZXR1cm4gVChsLGcpLGh9ZnVuY3Rpb24gVChsLGgpe2lmKGwubGVuZ3RoPjAmJmgubGVuZ3RoPT09MCl0aHJvdyBuZXcgRXJyb3IoIkVtcHR5IHN1Yi1zZWxlY3RvciIpO2wucHVzaChoKX19LGZ1bmN0aW9uKGQscix0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkociwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGU9e2VxdWFsczoiIixlbGVtZW50OiJ+IixzdGFydDoiXiIsZW5kOiIkIixhbnk6IioiLG5vdDoiISIsaHlwaGVuOiJ8In07ZnVuY3Rpb24gbihvKXtyZXR1cm4gby5tYXAoYSkuam9pbigiLCAiKX1yLmRlZmF1bHQ9bjtmdW5jdGlvbiBhKG8pe3JldHVybiBvLm1hcChzKS5qb2luKCIiKX1mdW5jdGlvbiBzKG8pe3N3aXRjaChvLnR5cGUpe2Nhc2UiY2hpbGQiOnJldHVybiIgPiAiO2Nhc2UicGFyZW50IjpyZXR1cm4iIDwgIjtjYXNlInNpYmxpbmciOnJldHVybiIgfiAiO2Nhc2UiYWRqYWNlbnQiOnJldHVybiIgKyAiO2Nhc2UiZGVzY2VuZGFudCI6cmV0dXJuIiAiO2Nhc2UidW5pdmVyc2FsIjpyZXR1cm4iKiI7Y2FzZSJ0YWciOnJldHVybiBvLm5hbWU7Y2FzZSJwc2V1ZG8tZWxlbWVudCI6cmV0dXJuIjo6IitvLm5hbWU7Y2FzZSJwc2V1ZG8iOnJldHVybiBvLmRhdGE9PT1udWxsPyI6IitvLm5hbWU6dHlwZW9mIG8uZGF0YT09InN0cmluZyI/IjoiK28ubmFtZSsiKCIrby5kYXRhKyIpIjoiOiIrby5uYW1lKyIoIituKG8uZGF0YSkrIikiO2Nhc2UiYXR0cmlidXRlIjpyZXR1cm4gby5hY3Rpb249PT0iZXhpc3RzIj8iWyIrby5uYW1lKyJdIjpvLm5hbWU9PT0iaWQiJiZvLmFjdGlvbj09PSJlcXVhbHMiJiYhby5pZ25vcmVDYXNlPyIjIitvLnZhbHVlOm8ubmFtZT09PSJjbGFzcyImJm8uYWN0aW9uPT09ImVsZW1lbnQiJiYhby5pZ25vcmVDYXNlPyIuIitvLnZhbHVlOiJbIitvLm5hbWUrZVtvLmFjdGlvbl0rIj0nIitvLnZhbHVlKyInIisoby5pZ25vcmVDYXNlPyJpIjoiIikrIl0iO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIHR5cGUiKX19ZnVuY3Rpb24gaShvKXtyZXR1cm4gb319LGZ1bmN0aW9uKGQscix0KXtkLmV4cG9ydHM9YTt2YXIgZT10KDI3OSksbj17X19wcm90b19fOm51bGwsZXhpc3RzOjEwLGVxdWFsczo4LG5vdDo3LHN0YXJ0OjYsZW5kOjYsYW55OjUsaHlwaGVuOjQsZWxlbWVudDo0fTtmdW5jdGlvbiBhKGkpe2Zvcih2YXIgbz1pLm1hcChzKSxjPTE7YzxpLmxlbmd0aDtjKyspe3ZhciBtPW9bY107aWYoIShtPDApKWZvcih2YXIgdT1jLTE7dT49MCYmbTxvW3VdO3UtLSl7dmFyIHA9aVt1KzFdO2lbdSsxXT1pW3VdLGlbdV09cCxvW3UrMV09b1t1XSxvW3VdPW19fX1mdW5jdGlvbiBzKGkpe3ZhciBvPWVbaS50eXBlXTtpZihvPT09ZS5hdHRyaWJ1dGUpbz1uW2kuYWN0aW9uXSxvPT09bi5lcXVhbHMmJmkubmFtZT09PSJpZCImJihvPTkpLGkuaWdub3JlQ2FzZSYmKG8+Pj0xKTtlbHNlIGlmKG89PT1lLnBzZXVkbylpZighaS5kYXRhKW89MztlbHNlIGlmKGkubmFtZT09PSJoYXMifHxpLm5hbWU9PT0iY29udGFpbnMiKW89MDtlbHNlIGlmKGkubmFtZT09PSJtYXRjaGVzInx8aS5uYW1lPT09Im5vdCIpe289MDtmb3IodmFyIGM9MDtjPGkuZGF0YS5sZW5ndGg7YysrKWlmKGkuZGF0YVtjXS5sZW5ndGg9PT0xKXt2YXIgbT1zKGkuZGF0YVtjXVswXSk7aWYobT09PTApe289MDticmVha31tPm8mJihvPW0pfWkuZGF0YS5sZW5ndGg+MSYmbz4wJiYoby09MSl9ZWxzZSBvPTE7cmV0dXJuIG99fSxmdW5jdGlvbihkKXtkLmV4cG9ydHM9SlNPTi5wYXJzZSgneyJ1bml2ZXJzYWwiOjUwLCJ0YWciOjMwLCJhdHRyaWJ1dGUiOjEsInBzZXVkbyI6MCwiZGVzY2VuZGFudCI6LTEsImNoaWxkIjotMSwicGFyZW50IjotMSwic2libGluZyI6LTEsImFkamFjZW50IjotMX0nKX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoMjgxKSxuPXQoMjgyKTtkLmV4cG9ydHM9e19fcHJvdG9fXzpudWxsLGF0dHJpYnV0ZTplLmNvbXBpbGUscHNldWRvOm4uY29tcGlsZSx0YWc6ZnVuY3Rpb24oYSxzLGkpe3ZhciBvPXMubmFtZSxjPWkuYWRhcHRlcjtyZXR1cm4gZnVuY3Rpb24odSl7cmV0dXJuIGMuZ2V0TmFtZSh1KT09PW8mJmEodSl9fSxkZXNjZW5kYW50OmZ1bmN0aW9uKGEscyxpKXt2YXIgbz10eXBlb2YgV2Vha1NldDwidSI/bmV3IFdlYWtTZXQ6bnVsbCxjPWkuYWRhcHRlcjtyZXR1cm4gZnVuY3Rpb24odSl7Zm9yKHZhciBwPSExOyFwJiYodT1jLmdldFBhcmVudCh1KSk7KSghb3x8IW8uaGFzKHUpKSYmKHA9YSh1KSwhcCYmbyYmby5hZGQodSkpO3JldHVybiBwfX0sX2ZsZXhpYmxlRGVzY2VuZGFudDpmdW5jdGlvbihhLHMsaSl7dmFyIG89aS5hZGFwdGVyO3JldHVybiBmdW5jdGlvbihtKXtmb3IodmFyIHU9YShtKTshdSYmKG09by5nZXRQYXJlbnQobSkpOyl1PWEobSk7cmV0dXJuIHV9fSxwYXJlbnQ6ZnVuY3Rpb24oYSxzLGkpe2lmKGkmJmkuc3RyaWN0KXRocm93IG5ldyBFcnJvcigiUGFyZW50IHNlbGVjdG9yIGlzbid0IHBhcnQgb2YgQ1NTMyIpO3ZhciBvPWkuYWRhcHRlcjtyZXR1cm4gZnVuY3Rpb24odSl7cmV0dXJuIG8uZ2V0Q2hpbGRyZW4odSkuc29tZShjKX07ZnVuY3Rpb24gYyhtKXtyZXR1cm4gby5pc1RhZyhtKSYmYShtKX19LGNoaWxkOmZ1bmN0aW9uKGEscyxpKXt2YXIgbz1pLmFkYXB0ZXI7cmV0dXJuIGZ1bmN0aW9uKG0pe3ZhciB1PW8uZ2V0UGFyZW50KG0pO3JldHVybiEhdSYmYSh1KX19LHNpYmxpbmc6ZnVuY3Rpb24oYSxzLGkpe3ZhciBvPWkuYWRhcHRlcjtyZXR1cm4gZnVuY3Rpb24obSl7Zm9yKHZhciB1PW8uZ2V0U2libGluZ3MobSkscD0wO3A8dS5sZW5ndGg7cCsrKWlmKG8uaXNUYWcodVtwXSkpe2lmKHVbcF09PT1tKWJyZWFrO2lmKGEodVtwXSkpcmV0dXJuITB9cmV0dXJuITF9fSxhZGphY2VudDpmdW5jdGlvbihhLHMsaSl7dmFyIG89aS5hZGFwdGVyO3JldHVybiBmdW5jdGlvbihtKXtmb3IodmFyIHU9by5nZXRTaWJsaW5ncyhtKSxwLHk9MDt5PHUubGVuZ3RoO3krKylpZihvLmlzVGFnKHVbeV0pKXtpZih1W3ldPT09bSlicmVhaztwPXVbeV19cmV0dXJuISFwJiZhKHApfX0sdW5pdmVyc2FsOmZ1bmN0aW9uKGEpe3JldHVybiBhfX19LGZ1bmN0aW9uKGQscix0KXt2YXIgZT10KDI3MykuZmFsc2VGdW5jLG49L1stW1xde30oKSorPy4sXFxeJHwjXHNdL2csYT17X19wcm90b19fOm51bGwsZXF1YWxzOmZ1bmN0aW9uKHMsaSxvKXt2YXIgYz1pLm5hbWUsbT1pLnZhbHVlLHU9by5hZGFwdGVyO3JldHVybiBpLmlnbm9yZUNhc2U/KG09bS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKHkpe3ZhciBPPXUuZ2V0QXR0cmlidXRlVmFsdWUoeSxjKTtyZXR1cm4gTyE9bnVsbCYmTy50b0xvd2VyQ2FzZSgpPT09bSYmcyh5KX0pOmZ1bmN0aW9uKHkpe3JldHVybiB1LmdldEF0dHJpYnV0ZVZhbHVlKHksYyk9PT1tJiZzKHkpfX0saHlwaGVuOmZ1bmN0aW9uKHMsaSxvKXt2YXIgYz1pLm5hbWUsbT1pLnZhbHVlLHU9bS5sZW5ndGgscD1vLmFkYXB0ZXI7cmV0dXJuIGkuaWdub3JlQ2FzZT8obT1tLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24oTyl7dmFyIHg9cC5nZXRBdHRyaWJ1dGVWYWx1ZShPLGMpO3JldHVybiB4IT1udWxsJiYoeC5sZW5ndGg9PT11fHx4LmNoYXJBdCh1KT09PSItIikmJnguc3Vic3RyKDAsdSkudG9Mb3dlckNhc2UoKT09PW0mJnMoTyl9KTpmdW5jdGlvbihPKXt2YXIgeD1wLmdldEF0dHJpYnV0ZVZhbHVlKE8sYyk7cmV0dXJuIHghPW51bGwmJnguc3Vic3RyKDAsdSk9PT1tJiYoeC5sZW5ndGg9PT11fHx4LmNoYXJBdCh1KT09PSItIikmJnMoTyl9fSxlbGVtZW50OmZ1bmN0aW9uKHMsaSxvKXt2YXIgYz1pLm5hbWUsbT1pLnZhbHVlLHU9by5hZGFwdGVyO2lmKC9ccy8udGVzdChtKSlyZXR1cm4gZTttPW0ucmVwbGFjZShuLCJcXCQmIik7dmFyIHA9Iig/Ol58XFxzKSIrbSsiKD86JHxcXHMpIix5PWkuaWdub3JlQ2FzZT8iaSI6IiIsTz1uZXcgUmVnRXhwKHAseSk7cmV0dXJuIGZ1bmN0aW9uKHYpe3ZhciBUPXUuZ2V0QXR0cmlidXRlVmFsdWUodixjKTtyZXR1cm4gVCE9bnVsbCYmTy50ZXN0KFQpJiZzKHYpfX0sZXhpc3RzOmZ1bmN0aW9uKHMsaSxvKXt2YXIgYz1pLm5hbWUsbT1vLmFkYXB0ZXI7cmV0dXJuIGZ1bmN0aW9uKHApe3JldHVybiBtLmhhc0F0dHJpYihwLGMpJiZzKHApfX0sc3RhcnQ6ZnVuY3Rpb24ocyxpLG8pe3ZhciBjPWkubmFtZSxtPWkudmFsdWUsdT1tLmxlbmd0aCxwPW8uYWRhcHRlcjtyZXR1cm4gdT09PTA/ZTppLmlnbm9yZUNhc2U/KG09bS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKE8pe3ZhciB4PXAuZ2V0QXR0cmlidXRlVmFsdWUoTyxjKTtyZXR1cm4geCE9bnVsbCYmeC5zdWJzdHIoMCx1KS50b0xvd2VyQ2FzZSgpPT09bSYmcyhPKX0pOmZ1bmN0aW9uKE8pe3ZhciB4PXAuZ2V0QXR0cmlidXRlVmFsdWUoTyxjKTtyZXR1cm4geCE9bnVsbCYmeC5zdWJzdHIoMCx1KT09PW0mJnMoTyl9fSxlbmQ6ZnVuY3Rpb24ocyxpLG8pe3ZhciBjPWkubmFtZSxtPWkudmFsdWUsdT0tbS5sZW5ndGgscD1vLmFkYXB0ZXI7cmV0dXJuIHU9PT0wP2U6aS5pZ25vcmVDYXNlPyhtPW0udG9Mb3dlckNhc2UoKSxmdW5jdGlvbihPKXt2YXIgeD1wLmdldEF0dHJpYnV0ZVZhbHVlKE8sYyk7cmV0dXJuIHghPW51bGwmJnguc3Vic3RyKHUpLnRvTG93ZXJDYXNlKCk9PT1tJiZzKE8pfSk6ZnVuY3Rpb24oTyl7dmFyIHg9cC5nZXRBdHRyaWJ1dGVWYWx1ZShPLGMpO3JldHVybiB4IT1udWxsJiZ4LnN1YnN0cih1KT09PW0mJnMoTyl9fSxhbnk6ZnVuY3Rpb24ocyxpLG8pe3ZhciBjPWkubmFtZSxtPWkudmFsdWUsdT1vLmFkYXB0ZXI7aWYobT09PSIiKXJldHVybiBlO2lmKGkuaWdub3JlQ2FzZSl7dmFyIHA9bmV3IFJlZ0V4cChtLnJlcGxhY2UobiwiXFwkJiIpLCJpIik7cmV0dXJuIGZ1bmN0aW9uKE8pe3ZhciB4PXUuZ2V0QXR0cmlidXRlVmFsdWUoTyxjKTtyZXR1cm4geCE9bnVsbCYmcC50ZXN0KHgpJiZzKE8pfX1yZXR1cm4gZnVuY3Rpb24oTyl7dmFyIHg9dS5nZXRBdHRyaWJ1dGVWYWx1ZShPLGMpO3JldHVybiB4IT1udWxsJiZ4LmluZGV4T2YobSk+PTAmJnMoTyl9fSxub3Q6ZnVuY3Rpb24ocyxpLG8pe3ZhciBjPWkubmFtZSxtPWkudmFsdWUsdT1vLmFkYXB0ZXI7cmV0dXJuIG09PT0iIj9mdW5jdGlvbih5KXtyZXR1cm4hIXUuZ2V0QXR0cmlidXRlVmFsdWUoeSxjKSYmcyh5KX06aS5pZ25vcmVDYXNlPyhtPW0udG9Mb3dlckNhc2UoKSxmdW5jdGlvbih5KXt2YXIgTz11LmdldEF0dHJpYnV0ZVZhbHVlKHksYyk7cmV0dXJuIE8hPW51bGwmJk8udG9Mb3dlckNhc2UoKSE9PW0mJnMoeSl9KTpmdW5jdGlvbih5KXtyZXR1cm4gdS5nZXRBdHRyaWJ1dGVWYWx1ZSh5LGMpIT09bSYmcyh5KX19fTtkLmV4cG9ydHM9e2NvbXBpbGU6ZnVuY3Rpb24ocyxpLG8pe2lmKG8mJm8uc3RyaWN0JiYoaS5pZ25vcmVDYXNlfHxpLmFjdGlvbj09PSJub3QiKSl0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIGF0dHJpYnV0ZSBzZWxlY3RvciIpO3JldHVybiBhW2kuYWN0aW9uXShzLGksbyl9LHJ1bGVzOmF9fSxmdW5jdGlvbihkLHIsdCl7dmFyIGU9dCgyODMpLG49dCgyNzMpLGE9dCgyODEpLHM9bi50cnVlRnVuYyxpPW4uZmFsc2VGdW5jLG89YS5ydWxlcy5lcXVhbHM7ZnVuY3Rpb24gYyhULGwpe3ZhciBoPXtuYW1lOlQsdmFsdWU6bH07cmV0dXJuIGZ1bmN0aW9uKGcsTSxBKXtyZXR1cm4gbyhnLGgsQSl9fWZ1bmN0aW9uIG0oVCxsKXtyZXR1cm4gZnVuY3Rpb24oaCl7cmV0dXJuISFsLmdldFBhcmVudChoKSYmVChoKX19dmFyIHU9e2NvbnRhaW5zOmZ1bmN0aW9uKFQsbCxoKXt2YXIgZj1oLmFkYXB0ZXI7cmV0dXJuIGZ1bmN0aW9uKE0pe3JldHVybiBUKE0pJiZmLmdldFRleHQoTSkuaW5kZXhPZihsKT49MH19LGljb250YWluczpmdW5jdGlvbihULGwsaCl7dmFyIGY9bC50b0xvd2VyQ2FzZSgpLGc9aC5hZGFwdGVyO3JldHVybiBmdW5jdGlvbihBKXtyZXR1cm4gVChBKSYmZy5nZXRUZXh0KEEpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihmKT49MH19LCJudGgtY2hpbGQiOmZ1bmN0aW9uKFQsbCxoKXt2YXIgZj1lKGwpLGc9aC5hZGFwdGVyO3JldHVybiBmPT09aT9mOmY9PT1zP20oVCxnKTpmdW5jdGlvbihBKXtmb3IodmFyIEM9Zy5nZXRTaWJsaW5ncyhBKSxiPTAsRT0wO2I8Qy5sZW5ndGg7YisrKWlmKGcuaXNUYWcoQ1tiXSkpe2lmKENbYl09PT1BKWJyZWFrO0UrK31yZXR1cm4gZihFKSYmVChBKX19LCJudGgtbGFzdC1jaGlsZCI6ZnVuY3Rpb24oVCxsLGgpe3ZhciBmPWUobCksZz1oLmFkYXB0ZXI7cmV0dXJuIGY9PT1pP2Y6Zj09PXM/bShULGcpOmZ1bmN0aW9uKEEpe2Zvcih2YXIgQz1nLmdldFNpYmxpbmdzKEEpLGI9MCxFPUMubGVuZ3RoLTE7RT49MDtFLS0paWYoZy5pc1RhZyhDW0VdKSl7aWYoQ1tFXT09PUEpYnJlYWs7YisrfXJldHVybiBmKGIpJiZUKEEpfX0sIm50aC1vZi10eXBlIjpmdW5jdGlvbihULGwsaCl7dmFyIGY9ZShsKSxnPWguYWRhcHRlcjtyZXR1cm4gZj09PWk/ZjpmPT09cz9tKFQsZyk6ZnVuY3Rpb24oQSl7Zm9yKHZhciBDPWcuZ2V0U2libGluZ3MoQSksYj0wLEU9MDtFPEMubGVuZ3RoO0UrKylpZihnLmlzVGFnKENbRV0pKXtpZihDW0VdPT09QSlicmVhaztnLmdldE5hbWUoQ1tFXSk9PT1nLmdldE5hbWUoQSkmJmIrK31yZXR1cm4gZihiKSYmVChBKX19LCJudGgtbGFzdC1vZi10eXBlIjpmdW5jdGlvbihULGwsaCl7dmFyIGY9ZShsKSxnPWguYWRhcHRlcjtyZXR1cm4gZj09PWk/ZjpmPT09cz9tKFQsZyk6ZnVuY3Rpb24oQSl7Zm9yKHZhciBDPWcuZ2V0U2libGluZ3MoQSksYj0wLEU9Qy5sZW5ndGgtMTtFPj0wO0UtLSlpZihnLmlzVGFnKENbRV0pKXtpZihDW0VdPT09QSlicmVhaztnLmdldE5hbWUoQ1tFXSk9PT1nLmdldE5hbWUoQSkmJmIrK31yZXR1cm4gZihiKSYmVChBKX19LHJvb3Q6ZnVuY3Rpb24oVCxsLGgpe3ZhciBmPWguYWRhcHRlcjtyZXR1cm4gZnVuY3Rpb24oZyl7cmV0dXJuIWYuZ2V0UGFyZW50KGcpJiZUKGcpfX0sc2NvcGU6ZnVuY3Rpb24oVCxsLGgsZil7dmFyIGc9aC5hZGFwdGVyO2lmKCFmfHxmLmxlbmd0aD09PTApcmV0dXJuIHUucm9vdChULGwsaCk7ZnVuY3Rpb24gTShBLEMpe3JldHVybiB0eXBlb2YgZy5lcXVhbHM9PSJmdW5jdGlvbiI/Zy5lcXVhbHMoQSxDKTpBPT09Q31yZXR1cm4gZi5sZW5ndGg9PT0xP2Z1bmN0aW9uKEEpe3JldHVybiBNKGZbMF0sQSkmJlQoQSl9OmZ1bmN0aW9uKEEpe3JldHVybiBmLmluZGV4T2YoQSk+PTAmJlQoQSl9fSxjaGVja2JveDpjKCJ0eXBlIiwiY2hlY2tib3giKSxmaWxlOmMoInR5cGUiLCJmaWxlIikscGFzc3dvcmQ6YygidHlwZSIsInBhc3N3b3JkIikscmFkaW86YygidHlwZSIsInJhZGlvIikscmVzZXQ6YygidHlwZSIsInJlc2V0IiksaW1hZ2U6YygidHlwZSIsImltYWdlIiksc3VibWl0OmMoInR5cGUiLCJzdWJtaXQiKSxob3ZlcjpmdW5jdGlvbihULGwsaCl7dmFyIGY9aC5hZGFwdGVyO3JldHVybiB0eXBlb2YgZi5pc0hvdmVyZWQ9PSJmdW5jdGlvbiI/ZnVuY3Rpb24oTSl7cmV0dXJuIFQoTSkmJmYuaXNIb3ZlcmVkKE0pfTppfSx2aXNpdGVkOmZ1bmN0aW9uKFQsbCxoKXt2YXIgZj1oLmFkYXB0ZXI7cmV0dXJuIHR5cGVvZiBmLmlzVmlzaXRlZD09ImZ1bmN0aW9uIj9mdW5jdGlvbihNKXtyZXR1cm4gVChNKSYmZi5pc1Zpc2l0ZWQoTSl9Oml9LGFjdGl2ZTpmdW5jdGlvbihULGwsaCl7dmFyIGY9aC5hZGFwdGVyO3JldHVybiB0eXBlb2YgZi5pc0FjdGl2ZT09ImZ1bmN0aW9uIj9mdW5jdGlvbihNKXtyZXR1cm4gVChNKSYmZi5pc0FjdGl2ZShNKX06aX19O2Z1bmN0aW9uIHAoVCxsKXtmb3IodmFyIGg9MDtUJiZoPFQubGVuZ3RoO2grKylpZihsLmlzVGFnKFRbaF0pKXJldHVybiBUW2hdfXZhciB5PXtlbXB0eTpmdW5jdGlvbihULGwpe3JldHVybiFsLmdldENoaWxkcmVuKFQpLnNvbWUoZnVuY3Rpb24oaCl7cmV0dXJuIGwuaXNUYWcoaCl8fGgudHlwZT09PSJ0ZXh0In0pfSwiZmlyc3QtY2hpbGQiOmZ1bmN0aW9uKFQsbCl7cmV0dXJuIHAobC5nZXRTaWJsaW5ncyhUKSxsKT09PVR9LCJsYXN0LWNoaWxkIjpmdW5jdGlvbihULGwpe2Zvcih2YXIgaD1sLmdldFNpYmxpbmdzKFQpLGY9aC5sZW5ndGgtMTtmPj0wO2YtLSl7aWYoaFtmXT09PVQpcmV0dXJuITA7aWYobC5pc1RhZyhoW2ZdKSlicmVha31yZXR1cm4hMX0sImZpcnN0LW9mLXR5cGUiOmZ1bmN0aW9uKFQsbCl7Zm9yKHZhciBoPWwuZ2V0U2libGluZ3MoVCksZj0wO2Y8aC5sZW5ndGg7ZisrKWlmKGwuaXNUYWcoaFtmXSkpe2lmKGhbZl09PT1UKXJldHVybiEwO2lmKGwuZ2V0TmFtZShoW2ZdKT09PWwuZ2V0TmFtZShUKSlicmVha31yZXR1cm4hMX0sImxhc3Qtb2YtdHlwZSI6ZnVuY3Rpb24oVCxsKXtmb3IodmFyIGg9bC5nZXRTaWJsaW5ncyhUKSxmPWgubGVuZ3RoLTE7Zj49MDtmLS0paWYobC5pc1RhZyhoW2ZdKSl7aWYoaFtmXT09PVQpcmV0dXJuITA7aWYobC5nZXROYW1lKGhbZl0pPT09bC5nZXROYW1lKFQpKWJyZWFrfXJldHVybiExfSwib25seS1vZi10eXBlIjpmdW5jdGlvbihULGwpe2Zvcih2YXIgaD1sLmdldFNpYmxpbmdzKFQpLGY9MCxnPWgubGVuZ3RoO2Y8ZztmKyspaWYobC5pc1RhZyhoW2ZdKSl7aWYoaFtmXT09PVQpY29udGludWU7aWYobC5nZXROYW1lKGhbZl0pPT09bC5nZXROYW1lKFQpKXJldHVybiExfXJldHVybiEwfSwib25seS1jaGlsZCI6ZnVuY3Rpb24oVCxsKXtmb3IodmFyIGg9bC5nZXRTaWJsaW5ncyhUKSxmPTA7ZjxoLmxlbmd0aDtmKyspaWYobC5pc1RhZyhoW2ZdKSYmaFtmXSE9PVQpcmV0dXJuITE7cmV0dXJuITB9LGxpbms6ZnVuY3Rpb24oVCxsKXtyZXR1cm4gbC5oYXNBdHRyaWIoVCwiaHJlZiIpfSxzZWxlY3RlZDpmdW5jdGlvbihULGwpe2lmKGwuaGFzQXR0cmliKFQsInNlbGVjdGVkIikpcmV0dXJuITA7aWYobC5nZXROYW1lKFQpIT09Im9wdGlvbiIpcmV0dXJuITE7dmFyIGg9bC5nZXRQYXJlbnQoVCk7aWYoIWh8fGwuZ2V0TmFtZShoKSE9PSJzZWxlY3QifHxsLmhhc0F0dHJpYihoLCJtdWx0aXBsZSIpKXJldHVybiExO2Zvcih2YXIgZj1sLmdldENoaWxkcmVuKGgpLGc9ITEsTT0wO008Zi5sZW5ndGg7TSsrKWlmKGwuaXNUYWcoZltNXSkpaWYoZltNXT09PVQpZz0hMDtlbHNlIGlmKGcpe2lmKGwuaGFzQXR0cmliKGZbTV0sInNlbGVjdGVkIikpcmV0dXJuITF9ZWxzZSByZXR1cm4hMTtyZXR1cm4gZ30sZGlzYWJsZWQ6ZnVuY3Rpb24oVCxsKXtyZXR1cm4gbC5oYXNBdHRyaWIoVCwiZGlzYWJsZWQiKX0sZW5hYmxlZDpmdW5jdGlvbihULGwpe3JldHVybiFsLmhhc0F0dHJpYihULCJkaXNhYmxlZCIpfSxjaGVja2VkOmZ1bmN0aW9uKFQsbCl7cmV0dXJuIGwuaGFzQXR0cmliKFQsImNoZWNrZWQiKXx8eS5zZWxlY3RlZChULGwpfSxyZXF1aXJlZDpmdW5jdGlvbihULGwpe3JldHVybiBsLmhhc0F0dHJpYihULCJyZXF1aXJlZCIpfSxvcHRpb25hbDpmdW5jdGlvbihULGwpe3JldHVybiFsLmhhc0F0dHJpYihULCJyZXF1aXJlZCIpfSxwYXJlbnQ6ZnVuY3Rpb24oVCxsKXtyZXR1cm4heS5lbXB0eShULGwpfSxoZWFkZXI6TyhbImgxIiwiaDIiLCJoMyIsImg0IiwiaDUiLCJoNiJdKSxidXR0b246ZnVuY3Rpb24oVCxsKXt2YXIgaD1sLmdldE5hbWUoVCk7cmV0dXJuIGg9PT0iYnV0dG9uInx8aD09PSJpbnB1dCImJmwuZ2V0QXR0cmlidXRlVmFsdWUoVCwidHlwZSIpPT09ImJ1dHRvbiJ9LGlucHV0Ok8oWyJpbnB1dCIsInRleHRhcmVhIiwic2VsZWN0IiwiYnV0dG9uIl0pLHRleHQ6ZnVuY3Rpb24oVCxsKXt2YXIgaDtyZXR1cm4gbC5nZXROYW1lKFQpPT09ImlucHV0IiYmKCEoaD1sLmdldEF0dHJpYnV0ZVZhbHVlKFQsInR5cGUiKSl8fGgudG9Mb3dlckNhc2UoKT09PSJ0ZXh0Iil9fTtmdW5jdGlvbiBPKFQpe2lmKHR5cGVvZiBTZXQ8InUiKXt2YXIgbD1uZXcgU2V0KFQpO3JldHVybiBmdW5jdGlvbihoLGYpe3JldHVybiBsLmhhcyhmLmdldE5hbWUoaCkpfX1yZXR1cm4gZnVuY3Rpb24oaCxmKXtyZXR1cm4gVC5pbmRleE9mKGYuZ2V0TmFtZShoKSk+PTB9fWZ1bmN0aW9uIHgoVCxsLGgpe2lmKGg9PT1udWxsKXtpZihULmxlbmd0aD4yJiZsIT09InNjb3BlIil0aHJvdyBuZXcgRXJyb3IoInBzZXVkby1zZWxlY3RvciA6IitsKyIgcmVxdWlyZXMgYW4gYXJndW1lbnQiKX1lbHNlIGlmKFQubGVuZ3RoPT09Mil0aHJvdyBuZXcgRXJyb3IoInBzZXVkby1zZWxlY3RvciA6IitsKyIgZG9lc24ndCBoYXZlIGFueSBhcmd1bWVudHMiKX12YXIgdj0vXig/Oig/Om50aHxsYXN0fGZpcnN0fG9ubHkpLSg/OmNoaWxkfG9mLXR5cGUpfHJvb3R8ZW1wdHl8KD86ZW58ZGlzKWFibGVkfGNoZWNrZWR8bm90KSQvO2QuZXhwb3J0cz17Y29tcGlsZTpmdW5jdGlvbihULGwsaCxmKXt2YXIgZz1sLm5hbWUsTT1sLmRhdGEsQT1oLmFkYXB0ZXI7aWYoaCYmaC5zdHJpY3QmJiF2LnRlc3QoZykpdGhyb3cgbmV3IEVycm9yKCI6IitnKyIgaXNuJ3QgcGFydCBvZiBDU1MzIik7aWYodHlwZW9mIHVbZ109PSJmdW5jdGlvbiIpcmV0dXJuIHVbZ10oVCxNLGgsZik7aWYodHlwZW9mIHlbZ109PSJmdW5jdGlvbiIpe3ZhciBDPXlbZ107cmV0dXJuIHgoQyxnLE0pLEM9PT1pP0M6VD09PXM/ZnVuY3Rpb24oRSl7cmV0dXJuIEMoRSxBLE0pfTpmdW5jdGlvbihFKXtyZXR1cm4gQyhFLEEsTSkmJlQoRSl9fWVsc2UgdGhyb3cgbmV3IEVycm9yKCJ1bm1hdGNoZWQgcHNldWRvLWNsYXNzIDoiK2cpfSxmaWx0ZXJzOnUscHNldWRvczp5fX0sZnVuY3Rpb24oZCxyLHQpe3ZhciBlPXQoMjg0KSxuPXQoMjg1KTtkLmV4cG9ydHM9ZnVuY3Rpb24ocyl7cmV0dXJuIG4oZShzKSl9LGQuZXhwb3J0cy5wYXJzZT1lLGQuZXhwb3J0cy5jb21waWxlPW59LGZ1bmN0aW9uKGQscil7ZC5leHBvcnRzPWU7dmFyIHQ9L14oWytcLV0/XGQqbik/XHMqKD86KFsrXC1dPylccyooXGQrKSk/JC87ZnVuY3Rpb24gZShuKXtpZihuPW4udHJpbSgpLnRvTG93ZXJDYXNlKCksbj09PSJldmVuIilyZXR1cm5bMiwwXTtpZihuPT09Im9kZCIpcmV0dXJuWzIsMV07dmFyIGE9bi5tYXRjaCh0KTtpZighYSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIm4tdGggcnVsZSBjb3VsZG4ndCBiZSBwYXJzZWQgKCciK24rIicpIik7dmFyIHM7cmV0dXJuIGFbMV0/KHM9cGFyc2VJbnQoYVsxXSwxMCksaXNOYU4ocykmJihhWzFdLmNoYXJBdCgwKT09PSItIj9zPS0xOnM9MSkpOnM9MCxbcyxhWzNdP3BhcnNlSW50KChhWzJdfHwiIikrYVszXSwxMCk6MF19fSxmdW5jdGlvbihkLHIsdCl7ZC5leHBvcnRzPXM7dmFyIGU9dCgyNzMpLG49ZS50cnVlRnVuYyxhPWUuZmFsc2VGdW5jO2Z1bmN0aW9uIHMoaSl7dmFyIG89aVswXSxjPWlbMV0tMTtpZihjPDAmJm88PTApcmV0dXJuIGE7aWYobz09PS0xKXJldHVybiBmdW5jdGlvbih1KXtyZXR1cm4gdTw9Y307aWYobz09PTApcmV0dXJuIGZ1bmN0aW9uKHUpe3JldHVybiB1PT09Y307aWYobz09PTEpcmV0dXJuIGM8MD9uOmZ1bmN0aW9uKHUpe3JldHVybiB1Pj1jfTt2YXIgbT1jJW87cmV0dXJuIG08MCYmKG0rPW8pLG8+MT9mdW5jdGlvbih1KXtyZXR1cm4gdT49YyYmdSVvPT09bX06KG8qPS0xLGZ1bmN0aW9uKHUpe3JldHVybiB1PD1jJiZ1JW89PT1tfSl9fSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLHQuZChyLCJkZWZhdWx0IixmdW5jdGlvbigpe3JldHVybiBNfSk7dmFyIGU9dCgxMiksbj10KDc0KSxhPXQoMSkscz10KDY4KSxpPXQoMjUwKSxvPXQoMjEzKSxjPXQoMjE4KTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7ZnVuY3Rpb24gbShBLEMpe2lmKEE9PW51bGwpcmV0dXJue307dmFyIGI9dShBLEMpLEUsTDtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgRD1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKEEpO2ZvcihMPTA7TDxELmxlbmd0aDtMKyspRT1EW0xdLCEoQy5pbmRleE9mKEUpPj0wKSYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKEEsRSkmJihiW0VdPUFbRV0pfXJldHVybiBifWZ1bmN0aW9uIHUoQSxDKXtpZihBPT1udWxsKXJldHVybnt9O3ZhciBiPXt9LEU9T2JqZWN0LmtleXMoQSksTCxEO2ZvcihEPTA7RDxFLmxlbmd0aDtEKyspTD1FW0RdLCEoQy5pbmRleE9mKEwpPj0wKSYmKGJbTF09QVtMXSk7cmV0dXJuIGJ9Y29uc3QgcD17YW50aWFsaWFzOiEwLGF1dG9SZW5kZXI6ITAsYWxwaGE6ITB9LHk9U3ltYm9sKCJhdXRvUmVuZGVyIiksTz1TeW1ib2woInJlbmRlcmVyIikseD1TeW1ib2woInRpbWVsaW5lIiksdj1TeW1ib2woInByZXBhcmVSZW5kZXIiKSxUPVN5bWJvbCgidGlja1JlbmRlciIpLGw9U3ltYm9sKCJwYXNzIiksaD1TeW1ib2woImZibyIpLGY9U3ltYm9sKCJ0aWNrZXJzIiksZz1TeW1ib2woImxheWVyVHJhbnNmb3JtSW52ZXJ0Iik7Y2xhc3MgTSBleHRlbmRzIGkuZGVmYXVsdHtjb25zdHJ1Y3RvcihDPXt9KXtpZihzdXBlcigpLCFDLmNhbnZhcyl7Y29uc3R7d2lkdGg6RCxoZWlnaHQ6SX09dGhpcy5nZXRSZXNvbHV0aW9uKCksUj1lLkVOVi5jcmVhdGVDYW52YXMoRCxJLHtvZmZzY3JlZW46ISFDLm9mZnNjcmVlbixpZDpDLmlkLGV4dHJhOkMuZXh0cmF9KTtSLnN0eWxlJiYoUi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiKSxSLmRhdGFzZXQmJihSLmRhdGFzZXQubGF5ZXJJZD1DLmlkKSxSLmNvbnRleHRUeXBlJiYoQy5jb250ZXh0VHlwZT1SLmNvbnRleHRUeXBlKSxDLmNhbnZhcz1SfWNvbnN0IGI9Qy5jYW52YXMsRT1PYmplY3QuYXNzaWduKHt9LHAsQyk7dGhpc1t5XT1FLmF1dG9SZW5kZXIsZGVsZXRlIEMuYXV0b1JlbmRlcjtjb25zdCBMPUUuUmVuZGVyZXJ8fGUuUmVuZGVyZXI7dGhpc1tPXT1uZXcgTChiLEUpLHRoaXMub3B0aW9ucz1DLHRoaXMuaWQ9Qy5pZCx0aGlzW2xdPVtdLHRoaXMuc2V0UmVzb2x1dGlvbihiKSx0aGlzLmNhbnZhcz1iLHRoaXNbeF09bmV3IG4uVGltZWxpbmUsdGhpcy5fX21vdXNlQ2FwdHVyZWRUYXJnZXQ9bnVsbCx0aGlzW2ddPW51bGx9Z2V0IGF1dG9SZW5kZXIoKXtyZXR1cm4gdGhpc1t5XX1nZXQgZGlzcGxheVJhdGlvKCl7cmV0dXJuIHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5vcHRpb25zP3RoaXMucGFyZW50Lm9wdGlvbnMuZGlzcGxheVJhdGlvOjF9Z2V0IGhlaWdodCgpe2NvbnN0e2hlaWdodDpDfT10aGlzLmdldFJlc29sdXRpb24oKTtyZXR1cm4gQy90aGlzLmRpc3BsYXlSYXRpb31nZXQgZ2woKXtyZXR1cm4gdGhpcy5yZW5kZXJlci5nbFJlbmRlcmVyP3RoaXMucmVuZGVyZXIuZ2xSZW5kZXJlci5nbDpudWxsfWdldCBsYXllcigpe3JldHVybiB0aGlzfWdldCBvZmZzY3JlZW4oKXtyZXR1cm4hIXRoaXMub3B0aW9ucy5vZmZzY3JlZW58fHRoaXMuY2FudmFzLl9vZmZzY3JlZW59Z2V0IHBhc3MoKXtyZXR1cm4gdGhpc1tsXX1nZXQgcHJlcGFyZVJlbmRlcigpe3JldHVybiB0aGlzW3ZdP3RoaXNbdl06UHJvbWlzZS5yZXNvbHZlKCl9Z2V0IHJlbmRlcmVyKCl7cmV0dXJuIHRoaXNbT119Z2V0IHJlbmRlck9mZnNldCgpe2lmKHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5vcHRpb25zKXtjb25zdHtsZWZ0OkMsdG9wOmJ9PXRoaXMucGFyZW50Lm9wdGlvbnM7cmV0dXJuW0MsYl19cmV0dXJuW3RoaXMub3B0aW9ucy5sZWZ0fDAsdGhpcy5vcHRpb25zLnRvcHwwXX1nZXQgdGltZWxpbmUoKXtyZXR1cm4gdGhpc1t4XX1nZXQgd2lkdGgoKXtjb25zdHt3aWR0aDpDfT10aGlzLmdldFJlc29sdXRpb24oKTtyZXR1cm4gQy90aGlzLmRpc3BsYXlSYXRpb31nZXQgbG9jYWxNYXRyaXgoKXtjb25zdHt4OkMseTpifT10aGlzLmF0dHJpYnV0ZXM7cmV0dXJuWzEsMCwwLDEsQyxiXX1nZXQgbGF5ZXJUcmFuc2Zvcm1JbnZlcnQoKXtpZih0aGlzW2ddKXJldHVybiB0aGlzW2ddO2NvbnN0IEM9dGhpcy50cmFuc2Zvcm1NYXRyaXg7cmV0dXJuIENbMF09PT0xJiZDWzFdPT09MCYmQ1syXT09PTAmJkNbM109PT0xJiZDWzRdPT09MCYmQ1s1XT09PTA/bnVsbDoodGhpc1tnXT1hLm1hdDJkLmludmVydChBcnJheS5vZigwLDAsMCwwLDAsMCksQyksdGhpc1tnXSl9Zm9yY2VDb250ZXh0TG9zcygpe2NvbnN0IEM9dGhpcy5yZW5kZXJlci5nbFJlbmRlcmVyO2lmKEMpe2NvbnN0IGI9Qy5nZXRFeHRlbnNpb24oIldFQkdMX2xvc2VfY29udGV4dCIpO2lmKGIpcmV0dXJuIGIubG9zZUNvbnRleHQoKSwhMH1yZXR1cm4hMX1hZGRQYXNzKHt2ZXJ0ZXg6QyxmcmFnbWVudDpiLG9wdGlvbnM6RSx1bmlmb3JtczpMfT17fSl7aWYodGhpcy5yZW5kZXJlci5nbFJlbmRlcmVyKXtjb25zdHt3aWR0aDpELGhlaWdodDpJfT10aGlzLmdldFJlc29sdXRpb24oKSxSPXRoaXMucmVuZGVyZXIuY3JlYXRlUGFzc1Byb2dyYW0oe3ZlcnRleDpDLGZyYWdtZW50OmIsb3B0aW9uczpFfSksQj1uZXcgZS5GaWd1cmUyRDtCLnJlY3QoMCwwLEQvdGhpcy5kaXNwbGF5UmF0aW8sSS90aGlzLmRpc3BsYXlSYXRpbyk7Y29uc3Qgej1uZXcgZS5NZXNoMkQoQik7cmV0dXJuIHouc2V0VW5pZm9ybXMoTCksei5zZXRQcm9ncmFtKFIpLHRoaXNbbF0ucHVzaCh6KSx0aGlzLmZvcmNlVXBkYXRlKCksen1yZXR1cm4gbnVsbH1kZWxldGVUZXh0dXJlKEMpe3JldHVybiBPYmplY3QoYy5kZWxldGVUZXh0dXJlKShDLHRoaXMucmVuZGVyZXIpfWRpc3BhdGNoUG9pbnRlckV2ZW50KEMpe2NvbnN0IGI9Qy50eXBlO2lmKGI9PT0ibW91c2Vkb3duInx8Yj09PSJtb3VzZXVwInx8Yj09PSJtb3VzZW1vdmUiKXtjb25zdCBSPXRoaXMuX19tb3VzZUNhcHR1cmVkVGFyZ2V0O2lmKFIpe2lmKFIubGF5ZXI9PT10aGlzKXJldHVybiBSLmRpc3BhdGNoRXZlbnQoQyksITA7dGhpcy5fX21vdXNlQ2FwdHVyZWRUYXJnZXQ9bnVsbH19bGV0IEUsTDtjb25zdCBEPXRoaXMubGF5ZXJUcmFuc2Zvcm1JbnZlcnQ7aWYoRCl7RT1DLngsTD1DLnk7Y29uc3QgUj1ELEI9UlswXSpFK1JbMl0qTCtSWzRdLHo9UlsxXSpFK1JbM10qTCtSWzVdO2RlbGV0ZSBDLngsZGVsZXRlIEMueSxkZWxldGUgQy5sYXllclgsZGVsZXRlIEMubGF5ZXJZLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEMse2xheWVyWDp7dmFsdWU6Qixjb25maWd1cmFibGU6ITB9LGxheWVyWTp7dmFsdWU6eixjb25maWd1cmFibGU6ITB9LHg6e3ZhbHVlOkIsY29uZmlndXJhYmxlOiEwfSx5Ont2YWx1ZTp6LGNvbmZpZ3VyYWJsZTohMH19KX1jb25zdCBJPXN1cGVyLmRpc3BhdGNoUG9pbnRlckV2ZW50KEMpO3JldHVybiBEJiZPYmplY3QuZGVmaW5lUHJvcGVydGllcyhDLHtsYXllclg6e3ZhbHVlOkUsY29uZmlndXJhYmxlOiEwfSxsYXllclk6e3ZhbHVlOkwsY29uZmlndXJhYmxlOiEwfSx4Ont2YWx1ZTpFLGNvbmZpZ3VyYWJsZTohMH0seTp7dmFsdWU6TCxjb25maWd1cmFibGU6ITB9fSksSX1mb3JjZVVwZGF0ZSgpe2lmKCF0aGlzW3ZdKWlmKHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5oYXNPZmZzY3JlZW5DYW52YXMpe3RoaXMucGFyZW50LmZvcmNlVXBkYXRlKCk7bGV0IEM9bnVsbDtjb25zdCBiPW5ldyBQcm9taXNlKEU9PntDPUV9KTtiLl9yZXNvbHZlPUMsdGhpc1t2XT1ifWVsc2V7bGV0IEM9bnVsbCxiPW51bGw7Y29uc3QgRT1uZXcgUHJvbWlzZShMPT57Qz1MLHRoaXNbeV0mJihiPU9iamVjdChzLnJlcXVlc3RBbmltYXRpb25GcmFtZSkoKCk9PntkZWxldGUgRS5fcmVxdWVzdElELHRoaXMucmVuZGVyKCl9KSl9KTtFLl9yZXNvbHZlPUMsRS5fcmVxdWVzdElEPWIsdGhpc1t2XT1FfX1nZXRGQk8oKXtjb25zdCBDPXRoaXMucmVuZGVyZXIuZ2xSZW5kZXJlcix7d2lkdGg6YixoZWlnaHQ6RX09dGhpcy5nZXRSZXNvbHV0aW9uKCk7cmV0dXJuIEMmJighdGhpc1toXXx8dGhpc1toXS53aWR0aCE9PWJ8fHRoaXNbaF0uaGVpZ2h0IT09RSk/KHRoaXNbaF09e3dpZHRoOmIsaGVpZ2h0OkUsdGFyZ2V0OkMuY3JlYXRlRkJPKCksYnVmZmVyOkMuY3JlYXRlRkJPKCksc3dhcCgpe1t0aGlzLnRhcmdldCx0aGlzLmJ1ZmZlcl09W3RoaXMuYnVmZmVyLHRoaXMudGFyZ2V0XX19LHRoaXNbaF0pOnRoaXNbaF0/dGhpc1toXTpudWxsfXVwZGF0ZUdsb2JhbFRyYW5zZm9ybSgpe2lmKHRoaXMubGF5ZXJUcmFuc2Zvcm1JbnZlcnQpe2NvbnN0IEM9dGhpcy5yZW5kZXJlcixiPUMuX19nbG9iYWxUcmFuc2Zvcm1NYXRyaXh8fEMuZ2xvYmFsVHJhbnNmb3JtTWF0cml4O0MuX19nbG9iYWxUcmFuc2Zvcm1NYXRyaXg9Yjtjb25zdCBFPWEubWF0MmQuZnJvbVZhbHVlcygxLDAsMCwxLDAsMCk7Qy5zZXRHbG9iYWxUcmFuc2Zvcm0oLi4uYS5tYXQyZC5tdWx0aXBseShFLGIsdGhpcy50cmFuc2Zvcm1NYXRyaXgpKX19b25Qcm9wZXJ0eUNoYW5nZShDLGIsRSl7aWYoc3VwZXIub25Qcm9wZXJ0eUNoYW5nZShDLGIsRSksQz09PSJ6SW5kZXgiJiYodGhpcy5jYW52YXMuc3R5bGUuekluZGV4PWIpLEM9PT0idHJhbnNmb3JtInx8Qz09PSJ0cmFuc2xhdGUifHxDPT09InJvdGF0ZSJ8fEM9PT0ic2NhbGUifHxDPT09InNrZXciKXtjb25zdCBMPXRoaXNbZ107aWYodGhpc1tnXT1udWxsLHRoaXMudXBkYXRlR2xvYmFsVHJhbnNmb3JtKCksTCYmIXRoaXMubGF5ZXJUcmFuc2Zvcm1JbnZlcnQpe2NvbnN0IEQ9dGhpcy5yZW5kZXJlcixJPUQuX19nbG9iYWxUcmFuc2Zvcm1NYXRyaXh8fEQuZ2xvYmFsVHJhbnNmb3JtTWF0cml4O0Quc2V0R2xvYmFsVHJhbnNmb3JtKC4uLkkpfX19X3ByZXBhcmVSZW5kZXJGaW5pc2hlZCgpe3RoaXNbdl0mJih0aGlzW3ZdLl9yZXF1ZXN0SUQmJk9iamVjdChzLmNhbmNlbEFuaW1hdGlvbkZyYW1lKSh0aGlzW3ZdLl9yZXF1ZXN0SUQpLHRoaXNbdl0uX3Jlc29sdmUoKSxkZWxldGUgdGhpc1t2XSl9cmVuZGVyKHtjbGVhcjpDPSEwfT17fSl7Y29uc3QgYj10aGlzW2xdLmxlbmd0aD90aGlzLmdldEZCTygpOm51bGw7YiYmdGhpcy5yZW5kZXJlci5nbFJlbmRlcmVyLmJpbmRGQk8oYi50YXJnZXQpLEMmJnRoaXNbT10uY2xlYXIoKTtjb25zdCBFPXRoaXMuZHJhdygpO2lmKEUmJkUubGVuZ3RoJiYodGhpcy5yZW5kZXJlci5kcmF3TWVzaGVzKEUpLHRoaXMuY2FudmFzLmRyYXcmJnRoaXMuY2FudmFzLmRyYXcoKSksYil7Y29uc3QgTD10aGlzLnJlbmRlcmVyLmdsUmVuZGVyZXIsRD10aGlzW2xdLmxlbmd0aCx7d2lkdGg6SSxoZWlnaHQ6Un09dGhpcy5nZXRSZXNvbHV0aW9uKCksQj1bMCwwLEkvdGhpcy5kaXNwbGF5UmF0aW8sUi90aGlzLmRpc3BsYXlSYXRpb107dGhpc1tsXS5mb3JFYWNoKCh6LEspPT57ei5ibGVuZD0hMCx6LnNldFRleHR1cmUoYi50YXJnZXQudGV4dHVyZSx7cmVjdDpCfSksSz09PUQtMT9MLmJpbmRGQk8obnVsbCk6KGIuc3dhcCgpLEwuYmluZEZCTyhiLnRhcmdldCkpLHRoaXNbT10uY2xlYXIoKSx0aGlzLnJlbmRlcmVyLmRyYXdNZXNoZXMoW3pdKX0pfXRoaXMuX3ByZXBhcmVSZW5kZXJGaW5pc2hlZCgpfXNldFJlc29sdXRpb24oe3dpZHRoOkMsaGVpZ2h0OmJ9KXtjb25zdCBFPXRoaXMucmVuZGVyZXIsTD1FLl9fZ2xvYmFsVHJhbnNmb3JtTWF0cml4fHxFLmdsb2JhbFRyYW5zZm9ybU1hdHJpeCxEPUxbNF0sST1MWzVdLFI9TFswXSx7d2lkdGg6QixoZWlnaHQ6en09dGhpcy5nZXRSZXNvbHV0aW9uKCk7KEIhPT1DfHx6IT09YikmJihzdXBlci5zZXRSZXNvbHV0aW9uKHt3aWR0aDpDLGhlaWdodDpifSksdGhpcy5jYW52YXMmJih0aGlzLmNhbnZhcy53aWR0aD1DLHRoaXMuY2FudmFzLmhlaWdodD1iLEUudXBkYXRlUmVzb2x1dGlvbiYmRS51cGRhdGVSZXNvbHV0aW9uKCkpLHRoaXMuYXR0cmlidXRlcy5zaXplPVtDLGJdLHRoaXNbbF0ubGVuZ3RoJiZ0aGlzW2xdLmZvckVhY2goaj0+e2NvbnN0IEc9bmV3IGUuRmlndXJlMkQ7Ry5yZWN0KDAsMCxDL3RoaXMuZGlzcGxheVJhdGlvLGIvdGhpcy5kaXNwbGF5UmF0aW8pLGouY29udG91cnM9Ry5jb250b3Vyc30pKTtjb25zdFtLLFFdPXRoaXMucmVuZGVyT2Zmc2V0LF89dGhpcy5kaXNwbGF5UmF0aW87KEQhPT1LfHxJIT09UXx8UiE9PV8pJiYoRS5zZXRHbG9iYWxUcmFuc2Zvcm0oXywwLDAsXyxLLFEpLEUuX19nbG9iYWxUcmFuc2Zvcm1NYXRyaXg9bnVsbCx0aGlzW2ddPW51bGwsdGhpcy51cGRhdGVHbG9iYWxUcmFuc2Zvcm0oKSx0aGlzLmZvcmNlVXBkYXRlKCkpfXRpY2soQz1udWxsLGI9e30pe2xldHtkdXJhdGlvbjpFPTEvMH09YixMPW0oYixbImR1cmF0aW9uIl0pO2NvbnN0IEQ9dGhpcy50aW1lbGluZS5mb3JrKEwpLEk9dGhpczt0aGlzW2ZdPXRoaXNbZl18fFtdLHRoaXNbZl0ucHVzaCh7aGFuZGxlcjpDLGR1cmF0aW9uOkV9KTtjb25zdCBSPSgpPT57bGV0IEI9bnVsbCx6PW51bGw7Y29uc3QgSz0oKT0+e2NvbnN0IFE9dGhpc1tmXS5tYXAoKHtoYW5kbGVyOl8sZHVyYXRpb246an0pPT57Y29uc3QgRz1NYXRoLm1pbigxLEQuY3VycmVudFRpbWUvaik7cmV0dXJue3ZhbHVlOl8/XyhELmN1cnJlbnRUaW1lLEcpOm51bGwscDpHfX0pO0lbVF18fChJW1RdPVByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PntJW3ldJiZJLnJlbmRlcigpLGRlbGV0ZSBJW1RdO2ZvcihsZXQgXz1RLmxlbmd0aC0xO18+PTA7Xy0tKXtjb25zdHt2YWx1ZTpqLHA6R309UVtfXTsoaj09PSExfHxHPj0xKSYmdGhpc1tmXS5zcGxpY2UoXywxKX10aGlzW2ZdLmxlbmd0aD4wJiZSKCl9KSl9O2lmKHRoaXNbdl0mJnRoaXNbdl0uX3R5cGUhPT0idGlja2VyIiYmKE9iamVjdChzLmNhbmNlbEFuaW1hdGlvbkZyYW1lKSh0aGlzW3ZdLl9yZXF1ZXN0SUQpLGRlbGV0ZSB0aGlzW3ZdKSwhdGhpc1t2XSl7Y29uc3QgUT1uZXcgUHJvbWlzZShfPT57Qj1fLHo9T2JqZWN0KHMucmVxdWVzdEFuaW1hdGlvbkZyYW1lKShLKX0pO1EuX3Jlc29sdmU9QixRLl9yZXF1ZXN0SUQ9eixRLl90eXBlPSJ0aWNrZXIiLHRoaXNbdl09UX19O1IoKX10b0dsb2JhbFBvcyhDLGIpe2lmKHRoaXMubGF5ZXJUcmFuc2Zvcm1JbnZlcnQpe2NvbnN0IEI9dGhpcy50cmFuc2Zvcm1NYXRyaXg7Qz1CWzBdKkMrQlsyXSpiK0JbNF0sYj1CWzFdKkMrQlszXSpiK0JbNV19Y29uc3R7d2lkdGg6RSxoZWlnaHQ6TH09dGhpcy5nZXRSZXNvbHV0aW9uKCksRD10aGlzLnJlbmRlck9mZnNldCxJPVt0aGlzLmNhbnZhcy5jbGllbnRXaWR0aCx0aGlzLmNhbnZhcy5jbGllbnRIZWlnaHRdO0M9QypJWzBdL0UrRFswXSxiPWIqSVsxXS9MK0RbMV07Y29uc3QgUj10aGlzLmRpc3BsYXlSYXRpbztyZXR1cm4gQyo9UixiKj1SLFtDLGJdfXRvTG9jYWxQb3MoQyxiKXtjb25zdHt3aWR0aDpFLGhlaWdodDpMfT10aGlzLmdldFJlc29sdXRpb24oKSxEPXRoaXMucmVuZGVyT2Zmc2V0LEk9W3RoaXMuY2FudmFzLmNsaWVudFdpZHRoLHRoaXMuY2FudmFzLmNsaWVudEhlaWdodF07Qz1DKkUvSVswXS1EWzBdLGI9YipML0lbMV0tRFsxXTtjb25zdCBSPXRoaXMuZGlzcGxheVJhdGlvO0MvPVIsYi89Ujtjb25zdCBCPXRoaXMubGF5ZXJUcmFuc2Zvcm1JbnZlcnQ7cmV0dXJuIEImJihDPUJbMF0qQytCWzJdKmIrQls0XSxiPUJbMV0qQytCWzNdKmIrQls1XSksW0MsYl19fW8uZGVmYXVsdC5yZWdpc3Rlck5vZGUoTSwibGF5ZXIiKX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gdn0pO3ZhciBlPXQoMjI0KSxuPXQoMjg4KSxhPXQoMjEzKSxzPXQoMjUyKSxpPXQoNzIpO3QoMSkuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlKEFycmF5KTtmdW5jdGlvbiBvKFQsbCl7aWYoVD09bnVsbClyZXR1cm57fTt2YXIgaD1jKFQsbCksZixnO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBNPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoVCk7Zm9yKGc9MDtnPE0ubGVuZ3RoO2crKylmPU1bZ10sIShsLmluZGV4T2YoZik+PTApJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoVCxmKSYmKGhbZl09VFtmXSl9cmV0dXJuIGh9ZnVuY3Rpb24gYyhULGwpe2lmKFQ9PW51bGwpcmV0dXJue307dmFyIGg9e30sZj1PYmplY3Qua2V5cyhUKSxnLE07Zm9yKE09MDtNPGYubGVuZ3RoO00rKylnPWZbTV0sIShsLmluZGV4T2YoZyk+PTApJiYoaFtnXT1UW2ddKTtyZXR1cm4gaH1mdW5jdGlvbiBtKFQsbCxoKXtyZXR1cm4gbCBpbiBUP09iamVjdC5kZWZpbmVQcm9wZXJ0eShULGwse3ZhbHVlOmgsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTpUW2xdPWgsVH1jb25zdCB1PSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIscD1TeW1ib2wuZm9yKCJzcHJpdGVqc19zZXRBdHRyaWJ1dGUiKSx5PVN5bWJvbCgicm9vdCIpLE89U3ltYm9sKCJ0YXNrIik7ZnVuY3Rpb24geChULGw9ITApe2NvbnN0IGg9VFt5XTtpZihoJiZoLmNoaWxkcmVuWzBdKXtjb25zdCBmPVQuc3ZnLGc9VC5sYXllcj9ULmxheWVyLmRpc3BsYXlSYXRpbzoxO2lmKCFmLmhhc0F0dHJpYnV0ZSgiZGF0YS1vcmlnaW5hbC13aWR0aCIpKXtsZXQgQz1mLmdldEF0dHJpYnV0ZSgid2lkdGgiKTtDPUM/T2JqZWN0KGkuc2l6ZVRvUGl4ZWwpKEMpOjMwMDtsZXQgYj1mLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iik7Yj1iP09iamVjdChpLnNpemVUb1BpeGVsKShiKToxNTAsZi5oYXNBdHRyaWJ1dGUoInZpZXdCb3giKXx8Zi5zZXRBdHRyaWJ1dGUoInZpZXdCb3giLGAwIDAgJHtNYXRoLnJvdW5kKEMpfSAke01hdGgucm91bmQoYil9YCksZi5zZXRBdHRyaWJ1dGUoImRhdGEtb3JpZ2luYWwtd2lkdGgiLEMpLGYuc2V0QXR0cmlidXRlKCJkYXRhLW9yaWdpbmFsLWhlaWdodCIsYil9bGV0IE09VC5hdHRyaWJ1dGVzLndpZHRofHxOdW1iZXIoZi5nZXRBdHRyaWJ1dGUoImRhdGEtb3JpZ2luYWwtd2lkdGgiKSksQT1ULmF0dHJpYnV0ZXMuaGVpZ2h0fHxOdW1iZXIoZi5nZXRBdHRyaWJ1dGUoImRhdGEtb3JpZ2luYWwtaGVpZ2h0IikpO2lmKE0qPWcsQSo9ZyxsJiZULmF0dHJpYnV0ZXMuZmxleGlibGUpe2NvbnN0IEM9VC5hdHRyaWJ1dGVzLnNjYWxlWzBdO2lmKE0qPUMsQSo9QyxmLnNldEF0dHJpYnV0ZSgid2lkdGgiLE0pLGYuc2V0QXR0cmlidXRlKCJoZWlnaHQiLEEpLE0mJkEmJlQudGV4dHVyZUltYWdlKXtjb25zdCBiPVQudGV4dHVyZUltYWdlLndpZHRoLEU9VC50ZXh0dXJlSW1hZ2UuaGVpZ2h0LEw9VC5jbGllbnRTaXplO1QuYXR0cmlidXRlcy50ZXh0dXJlUmVjdD1bMCwwLE1hdGgucm91bmQoTFswXSpiL00pLE1hdGgucm91bmQoTFsxXSpFL0EpXX19ZWxzZSBUW09dfHwoZi5zZXRBdHRyaWJ1dGUoIndpZHRoIixNKSxmLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixBKSxUW09dPVByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PntkZWxldGUgVFtPXTtjb25zdCBDPWguaW5uZXJIVE1MLGI9bmV3IEJsb2IoW0NdLHt0eXBlOiJpbWFnZS9zdmcreG1sIn0pLEU9VVJMLmNyZWF0ZU9iamVjdFVSTChiKSxMPW5ldyBJbWFnZTtMLm9ubG9hZD1mdW5jdGlvbigpe0wud2lkdGgmJkwuaGVpZ2h0PyhULmF0dHJpYnV0ZXNbcF0oInRleHR1cmUiLEwpLFQuYXR0cmlidXRlcy5mbGV4aWJsZSYmKFQuYXR0cmlidXRlcy50ZXh0dXJlUmVjdD1udWxsKSk6VC5hdHRyaWJ1dGVzW3BdKCJ0ZXh0dXJlIixudWxsKX0sTC5zcmM9RX0pKX19Y2xhc3MgdiBleHRlbmRzIGUuZGVmYXVsdHtjb25zdHJ1Y3RvcihsPXt9KXt0eXBlb2YgbD09InN0cmluZyImJihsPXtzdmdUZXh0Omx9KTtsZXR7c3ZnVGV4dDpofT1sLGY9byhsLFsic3ZnVGV4dCJdKTtpZihzdXBlcihmKSx0aGlzW3ldPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGgpe3RoaXNbeV0uaW5uZXJIVE1MPWg7Y29uc3QgZz10aGlzW3ldLmNoaWxkcmVuWzBdO2c/Zy5zZXRBdHRyaWJ1dGUoInhtbG5zIix1KTooZmV0Y2goaCkudGhlbihNPT5NLnRleHQoKSkudGhlbihNPT57dGhpc1t5XS5pbm5lckhUTUw9TSwoIXRoaXMub2JzZXJ2ZXJ8fHRoaXMuYXR0cmlidXRlcy5mbGV4aWJsZSkmJngodGhpcyl9KSxoPW51bGwpfWlmKCFoKXtjb25zdCBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh1LCJzdmciKTtnLnNldEF0dHJpYnV0ZSgieG1sbnMiLHUpLHRoaXNbeV0uYXBwZW5kQ2hpbGQoZyl9aWYodHlwZW9mIE11dGF0aW9uT2JzZXJ2ZXI9PSJmdW5jdGlvbiIpe2NvbnN0IGc9bmV3IE11dGF0aW9uT2JzZXJ2ZXIoTT0+e3godGhpcywhMSl9KTtnLm9ic2VydmUodGhpc1t5XSx7YXR0cmlidXRlczohMCxzdWJ0cmVlOiEwLGNoYXJhY3RlckRhdGE6ITAsY2hpbGRMaXN0OiEwfSksdGhpcy5vYnNlcnZlcj1nfX1nZXQgY2hpbGRyZW4oKXtyZXR1cm5bdGhpcy5zdmddfWdldCBjaGlsZE5vZGVzKCl7cmV0dXJuW3RoaXMuc3ZnXX1nZXQgc3ZnKCl7cmV0dXJuIHRoaXNbeV0/dGhpc1t5XS5jaGlsZHJlblswXTpudWxsfXNldFJlc29sdXRpb24oe3dpZHRoOmwsaGVpZ2h0Omh9KXtzdXBlci5zZXRSZXNvbHV0aW9uKHt3aWR0aDpsLGhlaWdodDpofSkseCh0aGlzKX1kaXNwYXRjaFBvaW50ZXJFdmVudChsKXtjb25zdCBoPXN1cGVyLmRpc3BhdGNoUG9pbnRlckV2ZW50KGwpO2lmKGgmJnRoaXMuYXR0cmlidXRlcy5wYXNzRXZlbnRzJiZ0eXBlb2YgTW91c2VFdmVudD09ImZ1bmN0aW9uIil7Y29uc3R7eDpmLHk6Z309bDtsZXRbTSxBXT10aGlzLmdldE9mZnNldFBvc2l0aW9uKGYsZyk7Y29uc3QgQz1sLm9yaWdpbmFsRXZlbnQsYj10aGlzLmF0dHJpYnV0ZXMuYW5jaG9yLEU9dGhpcy5jbGllbnRTaXplO009KE0rYlswXSpFWzBdKS8yLEE9KEErYlsxXSpFWzFdKS8yO2NvbnN0IEw9bC50eXBlO2lmKEw9PT1DLnR5cGUpe2xldCBEPW51bGw7aWYoQyBpbnN0YW5jZW9mIE1vdXNlRXZlbnQpRD1uZXcgTW91c2VFdmVudChMLHtzY3JlZW5YOk0sc2NyZWVuWTpBLGNsaWVudFg6TSxjbGllbnRZOkEsYnViYmxlczpDLmJ1YmJsZXMsYnV0dG9uOkMuYnV0dG9uLGJ1dHRvbnM6Qy5idXR0b25zLGNhbmNlbEJ1YmJsZTpDLmNhbmNlbEJ1YmJsZSxjYW5jZWxhYmxlOkMuY2FuY2VsYWJsZSxjdXJyZW50VGFyZ2V0OkMuY3VycmVudFRhcmdldCxmcm9tRWxlbWVudDpDLmZyb21FbGVtZW50LHJlbGF0ZWRUYXJnZXQ6Qy5yZWxhdGVkVGFyZ2V0LHJldHVyblZhbHVlOkMucmV0dXJuVmFsdWUsc3JjRWxlbWVudDpDLnNyY0VsZW1lbnQsdGFyZ2V0OkMudGFyZ2V0LHRvRWxlbWVudDpDLnRvRWxlbWVudCx3aGljaDpDLndpdGNofSk7ZWxzZSBpZihDIGluc3RhbmNlb2YgVG91Y2hFdmVudCl7bGV0IEk9bnVsbDtjb25zdCBSPUMuY2hhbmdlZFRvdWNoZXN8fFtDXTtmb3IobGV0IEI9MDtCPFIubGVuZ3RoO0IrKyl7Y29uc3Qgej1SW0JdO2lmKGwuaWRlbnRpZmllcj09PXouaWRlbnRpZmllcil7ST16O2JyZWFrfX1pZihJKXtjb25zdCBCPW5ldyBUb3VjaCh7aWRlbnRpZmllcjpJLmlkZW50aWZpZXIsdGFyZ2V0OkkudGFyZ2V0LGNsaWVudFg6TSxjbGllbnRZOkEsc2NyZWVuWDpNLHNjcmVlblk6QSxwYWdlWDpNLHBhZ2VZOkEscmFkaXVzWDpJLnJhZGl1c1gscmFkaXVzWTpJLnJhZGl1c1kscm90YXRpb25BbmdsZTpJLnJvdGF0aW9uQW5nbGUsZm9yY2U6SS5mb3JjZX0pO0Q9bmV3IFRvdWNoRXZlbnQoTCx7Y2FuY2VsYWJsZTpDLmNhbmNlbGFibGUsYnViYmxlczpDLmJ1YmJsZXMsY29tcG9zZWQ6Qy5jb21wb3NlZCx0b3VjaGVzOltCXSx0YXJnZXRUb3VjaGVzOltCXSxjaGFuZ2VkVG91Y2hlczpbQl19KX19ZWxzZSBEPUM7RCYmdGhpcy5zdmcuZGlzcGF0Y2hFdmVudChEKX19cmV0dXJuIGh9Z2V0RWxlbWVudEJ5SWQobCl7cmV0dXJuIE9iamVjdChzLnF1ZXJ5U2VsZWN0b3IpKGAjJHtsfWAsdGhpcyl9Z2V0RWxlbWVudHNCeUNsYXNzTmFtZShsKXtyZXR1cm4gT2JqZWN0KHMucXVlcnlTZWxlY3RvckFsbCkoYC4ke2x9YCx0aGlzKX1nZXRFbGVtZW50c0J5TmFtZShsKXtyZXR1cm4gT2JqZWN0KHMucXVlcnlTZWxlY3RvckFsbCkoYFtuYW1lPSIke2x9Il1gLHRoaXMpfWdldEVsZW1lbnRzQnlUYWdOYW1lKGwpe3JldHVybiBPYmplY3Qocy5xdWVyeVNlbGVjdG9yQWxsKShsLHRoaXMpfXF1ZXJ5U2VsZWN0b3IobCl7cmV0dXJuIE9iamVjdChzLnF1ZXJ5U2VsZWN0b3IpKGwsdGhpcyl9cXVlcnlTZWxlY3RvckFsbChsKXtyZXR1cm4gT2JqZWN0KHMucXVlcnlTZWxlY3RvckFsbCkobCx0aGlzKX1vblByb3BlcnR5Q2hhbmdlKGwsaCxmKXtzdXBlci5vblByb3BlcnR5Q2hhbmdlKGwsaCxmKSxsPT09ImZsZXhpYmxlIiYmeCh0aGlzKSx0aGlzLmF0dHJpYnV0ZXMuZmxleGlibGUmJihsPT09IndpZHRoInx8bD09PSJoZWlnaHQifHxsPT09InNjYWxlInx8bD09PSJ0cmFuc2Zvcm0iKSYmeCh0aGlzKX19bSh2LCJBdHRyIixuLmRlZmF1bHQpLGEuZGVmYXVsdC5yZWdpc3Rlck5vZGUodiwic3ByaXRlc3ZnIil9LGZ1bmN0aW9uKGQscix0KXt0LnIociksdC5kKHIsImRlZmF1bHQiLGZ1bmN0aW9uKCl7cmV0dXJuIGl9KTt2YXIgZT10KDIyNSk7dCgxKS5nbE1hdHJpeC5zZXRNYXRyaXhBcnJheVR5cGUoQXJyYXkpO2NvbnN0IG49U3ltYm9sLmZvcigic3ByaXRlanNfZ2V0QXR0cmlidXRlIiksYT1TeW1ib2wuZm9yKCJzcHJpdGVqc19zZXRBdHRyaWJ1dGUiKSxzPVN5bWJvbC5mb3IoInNwcml0ZWpzX3NldEF0dHJpYnV0ZURlZmF1bHQiKTtjbGFzcyBpIGV4dGVuZHMgZS5kZWZhdWx0e2NvbnN0cnVjdG9yKGMpe3N1cGVyKGMpLHRoaXNbc10oe3Bhc3NFdmVudHM6ITEsZmxleGlibGU6ITF9KX1nZXQgdGV4dHVyZSgpe3JldHVybiB0aGlzW25dKCJ0ZXh0dXJlIil9c2V0IHRleHR1cmUoYyl7fWdldCBwYXNzRXZlbnRzKCl7cmV0dXJuIHRoaXNbbl0oInBhc3NFdmVudHMiKX1zZXQgcGFzc0V2ZW50cyhjKXtyZXR1cm4gdGhpc1thXSgicGFzc0V2ZW50cyIsYyl9Z2V0IGZsZXhpYmxlKCl7cmV0dXJuIHRoaXNbbl0oImZsZXhpYmxlIil9c2V0IGZsZXhpYmxlKGMpe3JldHVybiB0aGlzW2FdKCJmbGV4aWJsZSIsYyl9fX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKTt2YXIgZT10KDEyKTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7ZnVuY3Rpb24gbihjLG0pe3ZhciB1PU9iamVjdC5rZXlzKGMpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciBwPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoYyk7bSYmKHA9cC5maWx0ZXIoZnVuY3Rpb24oeSl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYyx5KS5lbnVtZXJhYmxlfSkpLHUucHVzaC5hcHBseSh1LHApfXJldHVybiB1fWZ1bmN0aW9uIGEoYyl7Zm9yKHZhciBtPTE7bTxhcmd1bWVudHMubGVuZ3RoO20rKyl7dmFyIHU9YXJndW1lbnRzW21dIT1udWxsP2FyZ3VtZW50c1ttXTp7fTttJTI/bihPYmplY3QodSksITApLmZvckVhY2goZnVuY3Rpb24ocCl7cyhjLHAsdVtwXSl9KTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyhjLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHUpKTpuKE9iamVjdCh1KSkuZm9yRWFjaChmdW5jdGlvbihwKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYyxwLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodSxwKSl9KX1yZXR1cm4gY31mdW5jdGlvbiBzKGMsbSx1KXtyZXR1cm4gbSBpbiBjP09iamVjdC5kZWZpbmVQcm9wZXJ0eShjLG0se3ZhbHVlOnUsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTpjW21dPXUsY31jb25zdCBpPVN5bWJvbCgiaW5pdGVkIik7bGV0IG89bnVsbDt0eXBlb2YgV29ya2VyPT0iZnVuY3Rpb24iJiYobz1jbGFzcyBleHRlbmRzIFdvcmtlcntjb25zdHJ1Y3RvcihjKXtpZihjLndvcmtlcj09PSEwJiYoYy53b3JrZXI9YC4vJHtjLmlkfS53b3JrZXIuanNgKSxzdXBlcihjLndvcmtlciksdGhpcy5vcHRpb25zPWMsIWMuY2FudmFzKXtjb25zdHt3aWR0aDptLGhlaWdodDp1fT10aGlzLmdldFJlc29sdXRpb24oKSxwPWUuRU5WLmNyZWF0ZUNhbnZhcyhtLHUse29mZnNjcmVlbjohMX0pO3Auc3R5bGUmJihwLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIpLHAuZGF0YXNldCYmKHAuZGF0YXNldC5sYXllcklkPWMuaWQpLGMuY2FudmFzPXB9dGhpcy5jYW52YXM9Yy5jYW52YXN9Z2V0IGlkKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5pZH1zZXRSZXNvbHV0aW9uKHt3aWR0aDpjLGhlaWdodDptfSl7aWYodGhpc1tpXSl0aGlzLnBvc3RNZXNzYWdlKHt0eXBlOiJyZXNvbHV0aW9uX2NoYW5nZSIsd2lkdGg6YyxoZWlnaHQ6bX0pO2Vsc2V7dGhpcy5jYW52YXMud2lkdGg9Yyx0aGlzLmNhbnZhcy5oZWlnaHQ9bTtjb25zdCB1PXRoaXMub3B0aW9ucyxwPXUuY2FudmFzLnRyYW5zZmVyQ29udHJvbFRvT2Zmc2NyZWVuKCkseT1hKHt9LHUpO2RlbGV0ZSB5LmNvbnRhaW5lcix5LmNhbnZhcz1wLHRoaXMucG9zdE1lc3NhZ2Uoe3R5cGU6ImNyZWF0ZSIsb3B0aW9uczp5fSxbcF0pLHRoaXNbaV09ITB9fWdldFJlc29sdXRpb24oKXtpZih0aGlzLmNhbnZhcyl7Y29uc3R7d2lkdGg6YyxoZWlnaHQ6bX09dGhpcy5jYW52YXM7cmV0dXJue3dpZHRoOmMsaGVpZ2h0Om19fXJldHVybnt3aWR0aDozMDAsaGVpZ2h0OjE1MH19cmVtb3ZlKCl7cmV0dXJuIHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5yZW1vdmVDaGlsZD8odGhpcy5wYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyksITApOiExfWNvbm5lY3QoYyxtKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywicGFyZW50Iix7dmFsdWU6Yyx3cml0YWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiek9yZGVyIix7dmFsdWU6bSx3cml0YWJsZTohMSxjb25maWd1cmFibGU6ITB9KX1kaXNjb25uZWN0KCl7ZGVsZXRlIHRoaXMucGFyZW50LGRlbGV0ZSB0aGlzLnpPcmRlcn1kaXNwYXRjaFBvaW50ZXJFdmVudChjKXt0aGlzLnBvc3RNZXNzYWdlKHt0eXBlOiJldmVudCIsZXZlbnQ6e2NhbmNlbEJ1YmJsZTpjLmNhbmNlbEJ1YmJsZSxidWJibGVzOmMuYnViYmxlcyxkZXRhaWw6Yy5kZXRhaWwsaWRlbnRpZmllcjpjLmlkZW50aWZpZXIsbGF5ZXJYOmMubGF5ZXJYLGxheWVyWTpjLmxheWVyWSxvcmlnaW5hbFg6Yy5vcmlnaW5hbFgsb3JpZ2luYWxZOmMub3JpZ2luYWxZLHR5cGU6Yy50eXBlLHg6Yy54LHk6Yy55fX0pfX0pLHIuZGVmYXVsdD1vfSxmdW5jdGlvbihkLHIsdCl7dC5yKHIpLChmdW5jdGlvbihlKXt0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gTX0pO3ZhciBuPXQoMTIpLGE9dCg2OCkscz10KDcwKSxpPXQoMjg2KSxvPXQoMjg5KSxjPXQoMjUwKSxtPXQoMjkxKSx1PXQoMjE0KSxwPXQoMjE4KSx5PXQoMjEzKTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7Y29uc3QgTz1TeW1ib2woImVudGVyZWRUYXJnZXRzIik7ZnVuY3Rpb24geChBKXtyZXR1cm4gQS5pZD1BLmlkfHxgX2xheWVyJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLDEyKX1gLEEuZGF0YXNldHx8KEEuZGF0YXNldD17fSksQS5kYXRhc2V0LmxheWVySWQ9QS5pZCxBLmNvbm5lY3Q9KEMsYik9PntBLnBhcmVudD1DLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBLCJ6T3JkZXIiLHt2YWx1ZTpiLHdyaXRhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pfSxBLmRpc2Nvbm5lY3Q9Qz0+e2RlbGV0ZSBBLnpPcmRlcn0sQS5jYW52YXM9QSxBLmdldFJlc29sdXRpb249KCk9Pih7d2lkdGg6MCxoZWlnaHQ6MH0pLEEuc2V0UmVzb2x1dGlvbj0oKT0+ITEsQS5vcHRpb25zPXtoYW5kbGVFdmVudDohMX0sQX1mdW5jdGlvbiB2KEEsQyl7Y29uc3QgYj1BLmNoaWxkcmVuO2xldCBFPW51bGw7Zm9yKGxldCBMPTA7TDxiLmxlbmd0aDtMKyspe2NvbnN0IEQ9YltMXTtpZigoQz09PUR8fEUhPW51bGwpJiYoRT1EKSxFJiZFIT09QyYmIUUub2Zmc2NyZWVuKXJldHVybiBFLmNhbnZhc31yZXR1cm4gbnVsbH1mdW5jdGlvbiBUKEEsQyl7Y29uc3RbYixFXT1BLnJlbmRlck9mZnNldCx7d2lkdGg6TCxoZWlnaHQ6RH09QS5nZXRSZXNvbHV0aW9uKCksST1BLmRpc3BsYXlSYXRpbztBLnJlbmRlcmVyLmRyYXdJbWFnZShDLmNhbnZhcywtYi9JLC1FL0ksTC9JLEQvSSl9Y29uc3QgbD17fTtmdW5jdGlvbiBoKEEpe2NvbnN0IEM9WyJtb3VzZWRvd24iLCJtb3VzZXVwIiwibW91c2Vtb3ZlIiwibW91c2V3aGVlbCIsIndoZWVsIiwidG91Y2hzdGFydCIsInRvdWNoZW5kIiwidG91Y2htb3ZlIiwidG91Y2hjYW5jZWwiLCJjbGljayIsImRibGNsaWNrIiwibG9uZ3ByZXNzIiwidGFwIiwiY29udGV4dG1lbnUiXSxiPUEuY29udGFpbmVyO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsRT0+e2NvbnN0IEw9QVtPXTtpZihMLnNpemUpe2NvbnN0IEQ9bmV3IHUuZGVmYXVsdCgibW91c2VsZWF2ZSIpO0Quc2V0T3JpZ2luYWxFdmVudChFKSxbLi4uTF0uZm9yRWFjaChJPT57SS5kaXNwYXRjaEV2ZW50KEQpfSksQVtPXS5jbGVhcigpfX0se3Bhc3NpdmU6ITB9KSxDLmZvckVhY2goRT0+e2IuYWRkRXZlbnRMaXN0ZW5lcihFLEw9Pntjb25zdHtsZWZ0OkQsdG9wOkksZGlzcGxheVJhdGlvOlJ9PUEub3B0aW9ucyxCPUEub3JkZXJlZENoaWxkcmVuO09iamVjdChtLmRlZmF1bHQpKEwse29mZnNldExlZnQ6RCxvZmZzZXRUb3A6SSxkaXNwbGF5UmF0aW86Un0pLmZvckVhY2goSz0+e2NvbnN0IFE9Sy5pZGVudGlmaWVyO2lmKEsudHlwZT09PSJ0b3VjaG1vdmUifHxLLnR5cGU9PT0idG91Y2hlbmQiKXtjb25zdCBqPWxbUV07aiYmai5kaXNwYXRjaEV2ZW50KEspLEsudHlwZT09PSJ0b3VjaGVuZCImJmRlbGV0ZSBsW1FdfWVsc2V7Zm9yKGxldCBqPUIubGVuZ3RoLTE7aj49MDtqLS0pe2NvbnN0IEc9QltqXTtpZihHLm9wdGlvbnMuaGFuZGxlRXZlbnQhPT0hMSl7aWYoRy5kaXNwYXRjaFBvaW50ZXJFdmVudChLKSYmSy50YXJnZXQhPT1HKWJyZWFrO0suY2FuY2VsQnViYmxlPSExfX1pZihLLnRhcmdldD09PUJbMF0pZm9yKGxldCBqPUIubGVuZ3RoLTE7aj49MDtqLS0pe2NvbnN0IEc9QltqXTtpZihHLm9wdGlvbnMuaGFuZGxlRXZlbnQhPT0hMSl7Sy50YXJnZXQ9RzticmVha319fWNvbnN0IF89Sy50YXJnZXQ7aWYoSy50eXBlPT09InRvdWNoc3RhcnQiJiYobFtRXT1LLnRhcmdldCksSy50eXBlPT09Im1vdXNlbW92ZSIpe2NvbnN0IGo9QVtPXTtsZXQgRztpZihfKXtjb25zdCB0dD1fLmFuY2VzdG9yc3x8W107Rz1uZXcgU2V0KFtfLC4uLnR0XSl9ZWxzZSBHPW5ldyBTZXQ7Y29uc3QgWD1PYmplY3QuZW50cmllcyhMKTtpZighai5oYXMoXykmJl8pe2NvbnN0IHR0PW5ldyB1LmRlZmF1bHQoIm1vdXNlZW50ZXIiKTt0dC5zZXRPcmlnaW5hbEV2ZW50KEwpLFguZm9yRWFjaCgoW3EsZHRdKT0+e3R0W3FdPWR0fSksai5hZGQoXyksXy5kaXNwYXRjaEV2ZW50KHR0KTtjb25zdCBudD1fLmFuY2VzdG9ycztudCYmbnQuZm9yRWFjaChxPT57cSBpbnN0YW5jZW9mIHMuZGVmYXVsdCYmIWouaGFzKHEpJiYoai5hZGQocSkscS5kaXNwYXRjaEV2ZW50KHR0KSl9KX1jb25zdCBaPW5ldyB1LmRlZmF1bHQoIm1vdXNlbGVhdmUiKTtaLnNldE9yaWdpbmFsRXZlbnQoTCksWC5mb3JFYWNoKChbdHQsbnRdKT0+e1pbdHRdPW50fSksWy4uLmpdLmZvckVhY2godHQ9PntHLmhhcyh0dCl8fChqLmRlbGV0ZSh0dCksdHQuZGlzcGF0Y2hFdmVudChaKSl9KX19KX0se3Bhc3NpdmU6RSE9PSJjb250ZXh0bWVudSJ9KX0pfWZ1bmN0aW9uIGYoQSxDKXtpZihDJiZDLnN0eWxlKXtsZXR7d2lkdGg6YixoZWlnaHQ6RSxtb2RlOkwsY29udGFpbmVyOkR9PUE7Y29uc3R7Y2xpZW50V2lkdGg6SSxjbGllbnRIZWlnaHQ6Un09RDtiPWJ8fEksRT1FfHxSLEw9PT0ic3RhdGljIj8oQy5zdHlsZS53aWR0aD1gJHtifXB4YCxDLnN0eWxlLmhlaWdodD1gJHtFfXB4YCk6KEMuc3R5bGUudG9wPSIwIixDLnN0eWxlLmxlZnQ9IjAiLEMuc3R5bGUud2lkdGg9YCR7SX1weGAsQy5zdHlsZS5oZWlnaHQ9YCR7Un1weGAsQy5zdHlsZS50cmFuc2Zvcm09IiIsQy5zdHlsZS53ZWJraXRUcmFuc2Zvcm09IiIpfX1jb25zdCBnPVN5bWJvbCgib2Zmc2NyZWVuTGF5ZXJDb3VudCIpO2NsYXNzIE0gZXh0ZW5kcyBjLmRlZmF1bHR7Y29uc3RydWN0b3IoQz17fSl7aWYoc3VwZXIoKSwhQy5jb250YWluZXIpaWYodHlwZW9mIG4uRU5WLkNvbnRhaW5lcj09ImZ1bmN0aW9uIilDLmNvbnRhaW5lcj1uZXcgbi5FTlYuQ29udGFpbmVyKEMud2lkdGh8fDMwMCxDLmhlaWdodHx8MTUwKTtlbHNlIHRocm93IG5ldyBFcnJvcigiTm8gY29udGFpbmVyIHNwZWNpZmllZC4iKTtpZih0aGlzLmNvbnRhaW5lcj1DLmNvbnRhaW5lcix0aGlzLmNvbnRhaW5lci5zdHlsZSYmKHRoaXMuY29udGFpbmVyLnN0eWxlLm92ZXJmbG93fHwodGhpcy5jb250YWluZXIuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIpLHRoaXMuY29udGFpbmVyLnN0eWxlLnBvc2l0aW9ufHwodGhpcy5jb250YWluZXIuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIikpLHRoaXMub3B0aW9ucz1DLEMuZGlzcGxheVJhdGlvPUMuZGlzcGxheVJhdGlvfHwxLEMubW9kZT1DLm1vZGV8fCJzY2FsZSIsQy5sZWZ0PTAsQy50b3A9MCxDLmF1dG9SZXNpemU9Qy5hdXRvUmVzaXplIT09ITEsQy5hdXRvUmVzaXplKXtsZXQgYjtpZih0eXBlb2YgZ2xvYmFsVGhpczwidSI/Yj1nbG9iYWxUaGlzOmI9dHlwZW9mIHdpbmRvdzwidSI/d2luZG93OmUsYi5hZGRFdmVudExpc3RlbmVyKXtjb25zdCBFPXRoaXM7Yi5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLGZ1bmN0aW9uIEwoKXt0eXBlb2YgZG9jdW1lbnQ8InUiJiZkb2N1bWVudC5jb250YWlucyhFLmNvbnRhaW5lcik/RS5yZXNpemUoKTpiLnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsTCl9KX19dGhpc1tPXT1uZXcgU2V0LHRoaXMuc2V0UmVzb2x1dGlvbihDKSxoKHRoaXMpLHRoaXNbZ109MH1nZXQgaGFzT2Zmc2NyZWVuQ2FudmFzKCl7cmV0dXJuIHRoaXNbZ10+MH1zZXQgZGlzcGxheVJhdGlvKEMpe3RoaXMub3B0aW9ucy5kaXNwbGF5UmF0aW8hPT1DJiYodGhpcy5vcHRpb25zLmRpc3BsYXlSYXRpbz1DLHRoaXMucmVzaXplKCkpfWdldCBkaXNwbGF5UmF0aW8oKXtyZXR1cm4gdGhpcy5vcHRpb25zLmRpc3BsYXlSYXRpb31zZXQgaGVpZ2h0KEMpe3RoaXMub3B0aW9ucy5oZWlnaHQhPT1DJiYodGhpcy5vcHRpb25zLmhlaWdodD1DLHRoaXMucmVzaXplKCkpfWdldCBoZWlnaHQoKXtyZXR1cm4gdGhpcy5vcHRpb25zLmhlaWdodH1zZXQgbW9kZShDKXt0aGlzLm9wdGlvbnMubW9kZSE9PUMmJih0aGlzLm9wdGlvbnMubW9kZT1DLHRoaXMucmVzaXplKCkpfWdldCBtb2RlKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5tb2RlfXNldCB3aWR0aChDKXt0aGlzLm9wdGlvbnMud2lkdGghPT1DJiYodGhpcy5vcHRpb25zLndpZHRoPUMsdGhpcy5yZXNpemUoKSl9Z2V0IHdpZHRoKCl7cmV0dXJuIHRoaXMub3B0aW9ucy53aWR0aH1hcHBlbmRDaGlsZChDKXshKEMgaW5zdGFuY2VvZiBpLmRlZmF1bHQpJiYhKEMgaW5zdGFuY2VvZiBvLmRlZmF1bHQpJiZ4KEMpO2NvbnN0IGI9c3VwZXIuYXBwZW5kQ2hpbGQoQyksRT1DLmNhbnZhcztyZXR1cm4gQy5vZmZzY3JlZW4/dGhpc1tnXSsrOnRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKEUpLGYodGhpcy5vcHRpb25zLEUpLEMuc2V0UmVzb2x1dGlvbih0aGlzLmdldFJlc29sdXRpb24oKSksYn1mb3JjZVVwZGF0ZSgpe3RoaXMuaGFzT2Zmc2NyZWVuQ2FudmFzJiYhdGhpcy5fcmVxdWVzdElEJiYodGhpcy5fcmVxdWVzdElEPU9iamVjdChhLnJlcXVlc3RBbmltYXRpb25GcmFtZSkoKCk9PntkZWxldGUgdGhpcy5fcmVxdWVzdElELHRoaXMucmVuZGVyKCl9KSl9aW5zZXJ0QmVmb3JlKEMsYil7IShDIGluc3RhbmNlb2YgaS5kZWZhdWx0KSYmIShDIGluc3RhbmNlb2Ygby5kZWZhdWx0KSYmeChDKTtjb25zdCBFPXN1cGVyLmluc2VydEJlZm9yZShDLGIpLEw9Qy5jYW52YXM7aWYoIUMub2Zmc2NyZWVuKXtjb25zdCBEPXYodGhpcyxDKTt0aGlzLmNvbnRhaW5lci5pbnNlcnRCZWZvcmUoTCxEKX1yZXR1cm4gZih0aGlzLm9wdGlvbnMsTCksQy5zZXRSZXNvbHV0aW9uKHRoaXMuZ2V0UmVzb2x1dGlvbigpKSxFfWxheWVyKEM9ImRlZmF1bHQiLGI9e30pe2I9T2JqZWN0LmFzc2lnbih7fSx0aGlzLm9wdGlvbnMsYiksYi5pZD1DO2NvbnN0IEU9dGhpcy5vcmRlcmVkQ2hpbGRyZW47Zm9yKGxldCBJPTA7STxFLmxlbmd0aDtJKyspaWYoRVtJXS5pZD09PUMpcmV0dXJuIEVbSV07Y29uc3QgTD1iLndvcmtlcjtsZXQgRDtyZXR1cm4gTD9EPW5ldyBvLmRlZmF1bHQoYik6RD1uZXcgaS5kZWZhdWx0KGIpLHRoaXMuYXBwZW5kQ2hpbGQoRCksRH1hc3luYyBwcmVsb2FkKC4uLkMpe2NvbnN0IGI9W10sRT1bXSxMPVtdO2ZvcihsZXQgRD0wO0Q8Qy5sZW5ndGg7RCsrKXtjb25zdCBJPUNbRF07bGV0IFI7aWYodHlwZW9mIEk9PSJzdHJpbmciKVI9T2JqZWN0KHAubG9hZFRleHR1cmUpKEkpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShJKSlSPU9iamVjdChwLmxvYWRGcmFtZXMpKC4uLkkpO2Vsc2V7Y29uc3R7aWQ6QixzcmM6en09STtSPU9iamVjdChwLmxvYWRUZXh0dXJlKSh6LEIpfVIgaW5zdGFuY2VvZiBQcm9taXNlfHwoUj1Qcm9taXNlLnJlc29sdmUoUikpLEUucHVzaChSLnRoZW4oQj0+e2IucHVzaChCKSxMW0RdPUI7Y29uc3Qgej1uZXcgdS5kZWZhdWx0KHt0eXBlOiJwcmVsb2FkIixkZXRhaWw6e2N1cnJlbnQ6Qixsb2FkZWQ6YixyZXNvdXJjZXM6Q319KTt0aGlzLmRpc3BhdGNoRXZlbnQoeil9KSl9cmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKEUpLEx9cmVtb3ZlQ2hpbGQoQyl7Y29uc3QgYj1zdXBlci5yZW1vdmVDaGlsZChDKTtpZihiKXtDLl9wcmVwYXJlUmVuZGVyRmluaXNoZWQmJkMuX3ByZXBhcmVSZW5kZXJGaW5pc2hlZCgpO2NvbnN0IEU9Qy5jYW52YXM7RSYmRS5yZW1vdmUmJkUucmVtb3ZlKCksQy5vZmZzY3JlZW4mJnRoaXNbZ10tLX1yZXR1cm4gYn1yZW5kZXIoKXtjb25zdCBDPXRoaXMub3JkZXJlZENoaWxkcmVuO2xldCBiPW51bGw7Y29uc3QgRT1bXTtmb3IobGV0IEw9MDtMPEMubGVuZ3RoO0wrKyl7Y29uc3QgRD1DW0xdLEk9RS5sZW5ndGg+MDtpZihEIGluc3RhbmNlb2YgaS5kZWZhdWx0JiYhRC5vZmZzY3JlZW4paWYoIUQuYXV0b1JlbmRlcilJJiYoY29uc29sZS53YXJuKCJTb21lIG9mZnNjcmVlbiBjYW52YXMgd2lsbCBub3QgYmUgcmVuZGVyZWQuIiksRS5sZW5ndGg9MCk7ZWxzZSBpZihiPUQsSSl7RC5yZW5kZXJlci5jbGVhcigpO2ZvcihsZXQgUj0wO1I8RS5sZW5ndGg7UisrKXtjb25zdCBCPUVbUl07Qi5yZW5kZXIoKSxUKEQsQil9RS5sZW5ndGg9MCxELnJlbmRlcih7Y2xlYXI6ITF9KX1lbHNlIEQucHJlcGFyZVJlbmRlciYmRC5yZW5kZXIoKTtlbHNlIEQub2Zmc2NyZWVuP2I/KEQucHJlcGFyZVJlbmRlciYmRC5yZW5kZXIoKSxUKGIsRCkpOkUucHVzaChEKTpEIGluc3RhbmNlb2Ygby5kZWZhdWx0JiZJJiYoY29uc29sZS53YXJuKCJTb21lIG9mZnNjcmVlbiBjYW52YXMgd2lsbCBub3QgYmUgcmVuZGVyZWQuIiksRS5sZW5ndGg9MCl9fXJlcGxhY2VDaGlsZChDLGIpe2NvbnN0IEU9c3VwZXIucmVwbGFjZUNoaWxkKEMsYik7Yi5jYW52YXMucmVtb3ZlJiZiLmNhbnZhcy5yZW1vdmUoKSxiLm9mZnNjcmVlbiYmdGhpc1tnXS0tO2NvbnN0IEw9Qy5jYW52YXM7aWYoIUMub2Zmc2NyZWVuKXtjb25zdCBEPXYodGhpcyxDKTt0aGlzLmNvbnRhaW5lci5pbnNlcnRCZWZvcmUoTCxEKX1yZXR1cm4gZih0aGlzLm9wdGlvbnMsTCksQy5zZXRSZXNvbHV0aW9uKHRoaXMuZ2V0UmVzb2x1dGlvbigpKSxFfXJlc2l6ZSgpe2NvbnN0IEM9dGhpcy5vcHRpb25zO3RoaXMuY2hpbGRyZW4uZm9yRWFjaChiPT57ZihDLGIuY2FudmFzKX0pLHRoaXMuc2V0UmVzb2x1dGlvbihDKSx0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6InJlc2l6ZSJ9KX1zZXRSZXNvbHV0aW9uKHt3aWR0aDpDLGhlaWdodDpifT17fSl7Y29uc3QgRT10aGlzLmNvbnRhaW5lcix7Y2xpZW50V2lkdGg6TCxjbGllbnRIZWlnaHQ6RH09RTsoQz09bnVsbHx8Yj09bnVsbCkmJihDPUM/P0wsYj1iPz9EKTtjb25zdHttb2RlOkksZGlzcGxheVJhdGlvOlJ9PXRoaXMub3B0aW9ucztpZihDKj1SLGIqPVIsdGhpcy5vcHRpb25zLmxlZnQ9MCx0aGlzLm9wdGlvbnMudG9wPTAsST09PSJzdGlja3lIZWlnaHQifHxJPT09InN0aWNreUxlZnQifHxJPT09InN0aWNreVJpZ2h0Iil7Y29uc3QgQj1DO0M9TCpiL0QsST09PSJzdGlja3lIZWlnaHQiJiYodGhpcy5vcHRpb25zLmxlZnQ9LjUqKEMtQikpLEk9PT0ic3RpY2t5UmlnaHQiJiYodGhpcy5vcHRpb25zLmxlZnQ9Qy1CKX1lbHNlIGlmKEk9PT0ic3RpY2t5V2lkdGgifHxJPT09InN0aWNreVRvcCJ8fEk9PT0ic3RpY2t5Qm90dG9tIil7Y29uc3QgQj1iO2I9RCpDL0wsST09PSJzdGlja3lXaWR0aCImJih0aGlzLm9wdGlvbnMudG9wPS41KihiLUIpKSxJPT09InN0aWNreUJvdHRvbSImJih0aGlzLm9wdGlvbnMudG9wPWItQil9c3VwZXIuc2V0UmVzb2x1dGlvbih7d2lkdGg6QyxoZWlnaHQ6Yn0pfXNuYXBzaG90KHtvZmZzY3JlZW46Qz0hMSxsYXllcnM6Yn09e30pe2NvbnN0IEU9Qz8ic25hcHNob3RPZmZTY3JlZW5DYW52YXMiOiJzbmFwc2hvdENhbnZhcyIse3dpZHRoOkwsaGVpZ2h0OkR9PXRoaXMuZ2V0UmVzb2x1dGlvbigpO3RoaXNbRV09dGhpc1tFXXx8bi5FTlYuY3JlYXRlQ2FudmFzKEwsRCx7b2Zmc2NyZWVuOkN9KTtjb25zdCBJPXRoaXNbRV0uZ2V0Q29udGV4dCgiMmQiKTtiPWJ8fHRoaXMub3JkZXJlZENoaWxkcmVuLHRoaXNbRV0ud2lkdGg9TCx0aGlzW0VdLmhlaWdodD1EO2ZvcihsZXQgUj0wO1I8Yi5sZW5ndGg7UisrKXtjb25zdCBCPWJbUl07aWYoIUIub3B0aW9ucy5pZ25vcmVTbmFwc2hvdCl7Qi5yZW5kZXImJkIucmVuZGVyKCk7Y29uc3Qgej1CLmNhbnZhczt6JiZ6IT09QiYmSS5kcmF3SW1hZ2UoeiwwLDAsTCxEKX19cmV0dXJuIHRoaXNbRV19fXR5cGVvZiBkb2N1bWVudDwidSImJihNLnByb3RvdHlwZS5sYXllcjNkPWZ1bmN0aW9uKEEsQz17fSl7Y29uc3QgYj1DLnVybHx8Imh0dHBzOi8vdW5wa2cuY29tL3Nwcml0ZS1leHRlbmQtM2QvZGlzdC9zcHJpdGUtZXh0ZW5kLTNkLm1pbi5qcyI7cmV0dXJuIG5ldyBQcm9taXNlKChFLEwpPT57Y29uc3QgRD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtELmFzeW5jPSExLEQuc3JjPWIsRC5vbmxvYWQ9KCk9Pnt0cnl7RSh0aGlzLmxheWVyM2QoQSxDKSl9Y2F0Y2goSSl7TChJKX19LGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZChEKX0pfSkseS5kZWZhdWx0LnJlZ2lzdGVyTm9kZShNLCJzY2VuZSIpfSkuY2FsbCh0aGlzLHQoMjIpKX0sZnVuY3Rpb24oZCxyLHQpe3QucihyKSx0LmQociwiZGVmYXVsdCIsZnVuY3Rpb24oKXtyZXR1cm4gbn0pO3ZhciBlPXQoMjE0KTt0KDEpLmdsTWF0cml4LnNldE1hdHJpeEFycmF5VHlwZShBcnJheSk7ZnVuY3Rpb24gbihhLHtvZmZzZXRUb3A6cz0wLG9mZnNldExlZnQ6aT0wLGRpc3BsYXlSYXRpbzpvPTF9PXt9KXtsZXQgYyxtO2NvbnN0IHU9W10se2xlZnQ6cCx0b3A6eSx3aWR0aDpPLGhlaWdodDp4fT1hLnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx2PWEudGFyZ2V0LndpZHRoLFQ9YS50YXJnZXQuaGVpZ2h0LGw9YS5jaGFuZ2VkVG91Y2hlc3x8W2FdO2ZvcihsZXQgZj0wO2Y8bC5sZW5ndGg7ZisrKXtjb25zdCBnPWxbZl0sTT1nLmlkZW50aWZpZXIse2NsaWVudFg6QSxjbGllbnRZOkN9PWc7QSE9bnVsbCYmQyE9bnVsbCYmdS5wdXNoKHt4Ok1hdGgucm91bmQoKEF8MCktcCkseTpNYXRoLnJvdW5kKChDfDApLXkpLGlkZW50aWZpZXI6TX0pfXUubGVuZ3RoPD0wJiZ1LnB1c2goe3g6Yyx5Om19KTtjb25zdCBoPVtdO3JldHVybiB1LmZvckVhY2goZj0+e2YueCE9bnVsbCYmZi55IT1udWxsJiYoYz0oZi54KnYvTy1pKS9vLG09KGYueSpUL3gtcykvbyk7Y29uc3QgZz1uZXcgZS5kZWZhdWx0KGEpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGcse2xheWVyWDp7dmFsdWU6Yyxjb25maWd1cmFibGU6ITB9LGxheWVyWTp7dmFsdWU6bSxjb25maWd1cmFibGU6ITB9LG9yaWdpbmFsWDp7dmFsdWU6Zi54fSxvcmlnaW5hbFk6e3ZhbHVlOmYueX0seDp7dmFsdWU6Yyxjb25maWd1cmFibGU6ITB9LHk6e3ZhbHVlOm0sY29uZmlndXJhYmxlOiEwfSxpZGVudGlmaWVyOnt2YWx1ZTpmLmlkZW50aWZpZXJ9fSksaC5wdXNoKGcpfSksaH19XSk7RHQudmVyc2lvbixEdC5BcmMsRHQuQmxvY2ssRHQuQ2xvdWQsRHQuQ29sb3I7Y29uc3QgeG49RHQuRWxsaXBzZTtEdC5HcmFkaWVudDtjb25zdCByZT1EdC5Hcm91cCxVaD1EdC5MYWJlbDtEdC5MYXllcixEdC5MYXllcldvcmtlcixEdC5Ob2RlLER0LlBhcmFsbGVsO2NvbnN0IGhlPUR0LlBhdGgsZGU9RHQuUG9seWxpbmUsaHI9RHQuUmVjdDtEdC5SZWd1bGFyLER0LlJpbmc7Y29uc3QgJGg9RHQuU2NlbmUsemg9RHQuU3ByaXRlO0R0LlNwcml0ZVN2ZyxEdC5TdGFyLER0LlRyaWFuZ2xlLER0LmhlbHBlcnMsRHQuY3JlYXRlRWxlbWVudCxEdC5pc1Nwcml0ZU5vZGUsRHQucmVnaXN0ZXJOb2RlLER0LnJlcXVlc3RBbmltYXRpb25GcmFtZSxEdC5jYW5jZWxBbmltYXRpb25GcmFtZSxEdC5FTlY7ZnVuY3Rpb24gT2UoZCxyPSEwKXtjb25zdCB0PWQubGVuZ3RoO2lmKHQ8MilyZXR1cm4iIjtsZXQgZT1kWzBdLG49ZFsxXTtpZih0PT09MilyZXR1cm5gTSR7VGUoZSl9TCR7VGUobil9YDtsZXQgYT0iIjtmb3IobGV0IHM9MixpPXQtMTtzPGk7cysrKWU9ZFtzXSxuPWRbcysxXSxhKz1NZShlLG4pO3JldHVybiByP2BNJHtNZShkWzBdLGRbMV0pfVEke1RlKGRbMV0pfSR7TWUoZFsxXSxkWzJdKX1UJHthfSR7TWUoZFt0LTFdLGRbMF0pfSR7TWUoZFswXSxkWzFdKX1aYDpgTSR7VGUoZFswXSl9USR7VGUoZFsxXSl9JHtNZShkWzFdLGRbMl0pfSR7ZC5sZW5ndGg+Mz8iVCI6IiJ9JHthfUwke1RlKGRbdC0xXSl9YH12YXIgZHI9e2V4cG9ydHM6e319O2RyLmV4cG9ydHMsZnVuY3Rpb24oZCl7dmFyIHI9ZnVuY3Rpb24oKXt2YXIgdD1TdHJpbmcuZnJvbUNoYXJDb2RlLGU9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89IixuPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSstJCIsYT17fTtmdW5jdGlvbiBzKG8sYyl7aWYoIWFbb10pe2Fbb109e307Zm9yKHZhciBtPTA7bTxvLmxlbmd0aDttKyspYVtvXVtvLmNoYXJBdChtKV09bX1yZXR1cm4gYVtvXVtjXX12YXIgaT17Y29tcHJlc3NUb0Jhc2U2NDpmdW5jdGlvbihvKXtpZihvPT1udWxsKXJldHVybiIiO3ZhciBjPWkuX2NvbXByZXNzKG8sNixmdW5jdGlvbihtKXtyZXR1cm4gZS5jaGFyQXQobSl9KTtzd2l0Y2goYy5sZW5ndGglNCl7ZGVmYXVsdDpjYXNlIDA6cmV0dXJuIGM7Y2FzZSAxOnJldHVybiBjKyI9PT0iO2Nhc2UgMjpyZXR1cm4gYysiPT0iO2Nhc2UgMzpyZXR1cm4gYysiPSJ9fSxkZWNvbXByZXNzRnJvbUJhc2U2NDpmdW5jdGlvbihvKXtyZXR1cm4gbz09bnVsbD8iIjpvPT0iIj9udWxsOmkuX2RlY29tcHJlc3Moby5sZW5ndGgsMzIsZnVuY3Rpb24oYyl7cmV0dXJuIHMoZSxvLmNoYXJBdChjKSl9KX0sY29tcHJlc3NUb1VURjE2OmZ1bmN0aW9uKG8pe3JldHVybiBvPT1udWxsPyIiOmkuX2NvbXByZXNzKG8sMTUsZnVuY3Rpb24oYyl7cmV0dXJuIHQoYyszMil9KSsiICJ9LGRlY29tcHJlc3NGcm9tVVRGMTY6ZnVuY3Rpb24obyl7cmV0dXJuIG89PW51bGw/IiI6bz09IiI/bnVsbDppLl9kZWNvbXByZXNzKG8ubGVuZ3RoLDE2Mzg0LGZ1bmN0aW9uKGMpe3JldHVybiBvLmNoYXJDb2RlQXQoYyktMzJ9KX0sY29tcHJlc3NUb1VpbnQ4QXJyYXk6ZnVuY3Rpb24obyl7Zm9yKHZhciBjPWkuY29tcHJlc3MobyksbT1uZXcgVWludDhBcnJheShjLmxlbmd0aCoyKSx1PTAscD1jLmxlbmd0aDt1PHA7dSsrKXt2YXIgeT1jLmNoYXJDb2RlQXQodSk7bVt1KjJdPXk+Pj44LG1bdSoyKzFdPXklMjU2fXJldHVybiBtfSxkZWNvbXByZXNzRnJvbVVpbnQ4QXJyYXk6ZnVuY3Rpb24obyl7aWYobz09bnVsbClyZXR1cm4gaS5kZWNvbXByZXNzKG8pO2Zvcih2YXIgYz1uZXcgQXJyYXkoby5sZW5ndGgvMiksbT0wLHU9Yy5sZW5ndGg7bTx1O20rKyljW21dPW9bbSoyXSoyNTYrb1ttKjIrMV07dmFyIHA9W107cmV0dXJuIGMuZm9yRWFjaChmdW5jdGlvbih5KXtwLnB1c2godCh5KSl9KSxpLmRlY29tcHJlc3MocC5qb2luKCIiKSl9LGNvbXByZXNzVG9FbmNvZGVkVVJJQ29tcG9uZW50OmZ1bmN0aW9uKG8pe3JldHVybiBvPT1udWxsPyIiOmkuX2NvbXByZXNzKG8sNixmdW5jdGlvbihjKXtyZXR1cm4gbi5jaGFyQXQoYyl9KX0sZGVjb21wcmVzc0Zyb21FbmNvZGVkVVJJQ29tcG9uZW50OmZ1bmN0aW9uKG8pe3JldHVybiBvPT1udWxsPyIiOm89PSIiP251bGw6KG89by5yZXBsYWNlKC8gL2csIisiKSxpLl9kZWNvbXByZXNzKG8ubGVuZ3RoLDMyLGZ1bmN0aW9uKGMpe3JldHVybiBzKG4sby5jaGFyQXQoYykpfSkpfSxjb21wcmVzczpmdW5jdGlvbihvKXtyZXR1cm4gaS5fY29tcHJlc3MobywxNixmdW5jdGlvbihjKXtyZXR1cm4gdChjKX0pfSxfY29tcHJlc3M6ZnVuY3Rpb24obyxjLG0pe2lmKG89PW51bGwpcmV0dXJuIiI7dmFyIHUscCx5PXt9LE89e30seD0iIix2PSIiLFQ9IiIsbD0yLGg9MyxmPTIsZz1bXSxNPTAsQT0wLEM7Zm9yKEM9MDtDPG8ubGVuZ3RoO0MrPTEpaWYoeD1vLmNoYXJBdChDKSxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeSx4KXx8KHlbeF09aCsrLE9beF09ITApLHY9VCt4LE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh5LHYpKVQ9djtlbHNle2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChPLFQpKXtpZihULmNoYXJDb2RlQXQoMCk8MjU2KXtmb3IodT0wO3U8Zjt1KyspTT1NPDwxLEE9PWMtMT8oQT0wLGcucHVzaChtKE0pKSxNPTApOkErKztmb3IocD1ULmNoYXJDb2RlQXQoMCksdT0wO3U8ODt1KyspTT1NPDwxfHAmMSxBPT1jLTE/KEE9MCxnLnB1c2gobShNKSksTT0wKTpBKysscD1wPj4xfWVsc2V7Zm9yKHA9MSx1PTA7dTxmO3UrKylNPU08PDF8cCxBPT1jLTE/KEE9MCxnLnB1c2gobShNKSksTT0wKTpBKysscD0wO2ZvcihwPVQuY2hhckNvZGVBdCgwKSx1PTA7dTwxNjt1KyspTT1NPDwxfHAmMSxBPT1jLTE/KEE9MCxnLnB1c2gobShNKSksTT0wKTpBKysscD1wPj4xfWwtLSxsPT0wJiYobD1NYXRoLnBvdygyLGYpLGYrKyksZGVsZXRlIE9bVF19ZWxzZSBmb3IocD15W1RdLHU9MDt1PGY7dSsrKU09TTw8MXxwJjEsQT09Yy0xPyhBPTAsZy5wdXNoKG0oTSkpLE09MCk6QSsrLHA9cD4+MTtsLS0sbD09MCYmKGw9TWF0aC5wb3coMixmKSxmKyspLHlbdl09aCsrLFQ9U3RyaW5nKHgpfWlmKFQhPT0iIil7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKE8sVCkpe2lmKFQuY2hhckNvZGVBdCgwKTwyNTYpe2Zvcih1PTA7dTxmO3UrKylNPU08PDEsQT09Yy0xPyhBPTAsZy5wdXNoKG0oTSkpLE09MCk6QSsrO2ZvcihwPVQuY2hhckNvZGVBdCgwKSx1PTA7dTw4O3UrKylNPU08PDF8cCYxLEE9PWMtMT8oQT0wLGcucHVzaChtKE0pKSxNPTApOkErKyxwPXA+PjF9ZWxzZXtmb3IocD0xLHU9MDt1PGY7dSsrKU09TTw8MXxwLEE9PWMtMT8oQT0wLGcucHVzaChtKE0pKSxNPTApOkErKyxwPTA7Zm9yKHA9VC5jaGFyQ29kZUF0KDApLHU9MDt1PDE2O3UrKylNPU08PDF8cCYxLEE9PWMtMT8oQT0wLGcucHVzaChtKE0pKSxNPTApOkErKyxwPXA+PjF9bC0tLGw9PTAmJihsPU1hdGgucG93KDIsZiksZisrKSxkZWxldGUgT1tUXX1lbHNlIGZvcihwPXlbVF0sdT0wO3U8Zjt1KyspTT1NPDwxfHAmMSxBPT1jLTE/KEE9MCxnLnB1c2gobShNKSksTT0wKTpBKysscD1wPj4xO2wtLSxsPT0wJiYobD1NYXRoLnBvdygyLGYpLGYrKyl9Zm9yKHA9Mix1PTA7dTxmO3UrKylNPU08PDF8cCYxLEE9PWMtMT8oQT0wLGcucHVzaChtKE0pKSxNPTApOkErKyxwPXA+PjE7Zm9yKDs7KWlmKE09TTw8MSxBPT1jLTEpe2cucHVzaChtKE0pKTticmVha31lbHNlIEErKztyZXR1cm4gZy5qb2luKCIiKX0sZGVjb21wcmVzczpmdW5jdGlvbihvKXtyZXR1cm4gbz09bnVsbD8iIjpvPT0iIj9udWxsOmkuX2RlY29tcHJlc3Moby5sZW5ndGgsMzI3NjgsZnVuY3Rpb24oYyl7cmV0dXJuIG8uY2hhckNvZGVBdChjKX0pfSxfZGVjb21wcmVzczpmdW5jdGlvbihvLGMsbSl7dmFyIHU9W10scD00LHk9NCxPPTMseD0iIix2PVtdLFQsbCxoLGYsZyxNLEEsQz17dmFsOm0oMCkscG9zaXRpb246YyxpbmRleDoxfTtmb3IoVD0wO1Q8MztUKz0xKXVbVF09VDtmb3IoaD0wLGc9TWF0aC5wb3coMiwyKSxNPTE7TSE9ZzspZj1DLnZhbCZDLnBvc2l0aW9uLEMucG9zaXRpb24+Pj0xLEMucG9zaXRpb249PTAmJihDLnBvc2l0aW9uPWMsQy52YWw9bShDLmluZGV4KyspKSxofD0oZj4wPzE6MCkqTSxNPDw9MTtzd2l0Y2goaCl7Y2FzZSAwOmZvcihoPTAsZz1NYXRoLnBvdygyLDgpLE09MTtNIT1nOylmPUMudmFsJkMucG9zaXRpb24sQy5wb3NpdGlvbj4+PTEsQy5wb3NpdGlvbj09MCYmKEMucG9zaXRpb249YyxDLnZhbD1tKEMuaW5kZXgrKykpLGh8PShmPjA/MTowKSpNLE08PD0xO0E9dChoKTticmVhaztjYXNlIDE6Zm9yKGg9MCxnPU1hdGgucG93KDIsMTYpLE09MTtNIT1nOylmPUMudmFsJkMucG9zaXRpb24sQy5wb3NpdGlvbj4+PTEsQy5wb3NpdGlvbj09MCYmKEMucG9zaXRpb249YyxDLnZhbD1tKEMuaW5kZXgrKykpLGh8PShmPjA/MTowKSpNLE08PD0xO0E9dChoKTticmVhaztjYXNlIDI6cmV0dXJuIiJ9Zm9yKHVbM109QSxsPUEsdi5wdXNoKEEpOzspe2lmKEMuaW5kZXg+bylyZXR1cm4iIjtmb3IoaD0wLGc9TWF0aC5wb3coMixPKSxNPTE7TSE9ZzspZj1DLnZhbCZDLnBvc2l0aW9uLEMucG9zaXRpb24+Pj0xLEMucG9zaXRpb249PTAmJihDLnBvc2l0aW9uPWMsQy52YWw9bShDLmluZGV4KyspKSxofD0oZj4wPzE6MCkqTSxNPDw9MTtzd2l0Y2goQT1oKXtjYXNlIDA6Zm9yKGg9MCxnPU1hdGgucG93KDIsOCksTT0xO00hPWc7KWY9Qy52YWwmQy5wb3NpdGlvbixDLnBvc2l0aW9uPj49MSxDLnBvc2l0aW9uPT0wJiYoQy5wb3NpdGlvbj1jLEMudmFsPW0oQy5pbmRleCsrKSksaHw9KGY+MD8xOjApKk0sTTw8PTE7dVt5KytdPXQoaCksQT15LTEscC0tO2JyZWFrO2Nhc2UgMTpmb3IoaD0wLGc9TWF0aC5wb3coMiwxNiksTT0xO00hPWc7KWY9Qy52YWwmQy5wb3NpdGlvbixDLnBvc2l0aW9uPj49MSxDLnBvc2l0aW9uPT0wJiYoQy5wb3NpdGlvbj1jLEMudmFsPW0oQy5pbmRleCsrKSksaHw9KGY+MD8xOjApKk0sTTw8PTE7dVt5KytdPXQoaCksQT15LTEscC0tO2JyZWFrO2Nhc2UgMjpyZXR1cm4gdi5qb2luKCIiKX1pZihwPT0wJiYocD1NYXRoLnBvdygyLE8pLE8rKyksdVtBXSl4PXVbQV07ZWxzZSBpZihBPT09eSl4PWwrbC5jaGFyQXQoMCk7ZWxzZSByZXR1cm4gbnVsbDt2LnB1c2goeCksdVt5KytdPWwreC5jaGFyQXQoMCkscC0tLGw9eCxwPT0wJiYocD1NYXRoLnBvdygyLE8pLE8rKyl9fX07cmV0dXJuIGl9KCk7ZCE9bnVsbD9kLmV4cG9ydHM9cjp0eXBlb2YgYW5ndWxhcjwidSImJmFuZ3VsYXIhPW51bGwmJmFuZ3VsYXIubW9kdWxlKCJMWlN0cmluZyIsW10pLmZhY3RvcnkoIkxaU3RyaW5nIixmdW5jdGlvbigpe3JldHVybiByfSl9KGRyKTt2YXIgVG49ZHIuZXhwb3J0cztmdW5jdGlvbiBWZShkKXtyZXR1cm4gSlNPTi5wYXJzZShUbi5kZWNvbXByZXNzKGQpKX1mdW5jdGlvbiBuZShkKXtyZXR1cm4gVG4uY29tcHJlc3MoSlNPTi5zdHJpbmdpZnkoZCkpfWNsYXNzIE1uIGV4dGVuZHMgeXR7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7c3QodGhpcywiY2FuUm90YXRlIiwhMCk7c3QodGhpcywic2NhbGVUeXBlIixGdC5hbGwpO3N0KHRoaXMsInRvb2xzVHlwZSIsZ3QuUGVuY2lsKTtzdCh0aGlzLCJzeW5jVGltZXN0YW1wIik7c3QodGhpcywic3luY0luZGV4IiwwKTtzdCh0aGlzLCJ0bXBQb2ludHMiLFtdKTtzdCh0aGlzLCJNQVhfUkVQRUFSIiwxMCk7c3QodGhpcywidW5pVGhpY2tuZXNzIik7c3QodGhpcywid29ya09wdGlvbnMiKTtzdCh0aGlzLCJjZW50ZXJQb3MiLFswLDBdKTt0aGlzLndvcmtPcHRpb25zPXQudG9vbHNPcHQsdGhpcy51bmlUaGlja25lc3M9dGhpcy5NQVhfUkVQRUFSL3RoaXMud29ya09wdGlvbnMudGhpY2tuZXNzLzEwLHRoaXMuc3luY1RpbWVzdGFtcD0wfWNvbWJpbmVDb25zdW1lKCl7dmFyIGk7Y29uc3QgdD0oaT10aGlzLndvcmtJZCk9PW51bGw/dm9pZCAwOmkudG9TdHJpbmcoKSxlPXRoaXMudHJhbnNmb3JtRGF0YUFsbCghMCksbj17bmFtZTp0fTtsZXQgYTtjb25zdCBzPXRoaXMuZHJhd0xheWVyfHx0aGlzLmZ1bGxMYXllcjtyZXR1cm4gZS5sZW5ndGgmJihhPXRoaXMuZHJhdyh7YXR0cnM6bix0YXNrczplLHJlcGxhY2VJZDp0LGxheWVyOnMsaXNDbGVhckFsbDohMH0pKSx7cmVjdDphLHR5cGU6bHQuRHJhd1dvcmssZGF0YVR5cGU6VHQuTG9jYWx9fXNldFdvcmtPcHRpb25zKHQpe3N1cGVyLnNldFdvcmtPcHRpb25zKHQpLHRoaXMuc3luY1RpbWVzdGFtcD1EYXRlLm5vdygpfWNvbnN1bWUodCl7dmFyIHY7Y29uc3R7ZGF0YTplLGlzRnVsbFdvcms6bixpc0NsZWFyQWxsOmEsaXNTdWJXb3JrZXI6c309dDtpZigoKHY9ZS5vcCk9PW51bGw/dm9pZCAwOnYubGVuZ3RoKT09PTApcmV0dXJue3R5cGU6bHQuTm9uZX07Y29uc3R7d29ya0lkOml9PWUse3Rhc2tzOm8sZWZmZWN0czpjLGNvbnN1bWVJbmRleDptfT10aGlzLnRyYW5zZm9ybURhdGEoZSwhMSk7dGhpcy5zeW5jSW5kZXg9TWF0aC5taW4odGhpcy5zeW5jSW5kZXgsbSxNYXRoLm1heCgwLHRoaXMudG1wUG9pbnRzLmxlbmd0aC0yKSk7Y29uc3QgdT17bmFtZTppPT1udWxsP3ZvaWQgMDppLnRvU3RyaW5nKCl9O2xldCBwLHk9ITE7Y29uc3QgTz10aGlzLnN5bmNJbmRleDtpZih0aGlzLnN5bmNUaW1lc3RhbXA9PT0wJiYodGhpcy5zeW5jVGltZXN0YW1wPURhdGUubm93KCkpLG8ubGVuZ3RoJiYob1swXS50YXNrSWQtdGhpcy5zeW5jVGltZXN0YW1wPnRoaXMuc3luY1VuaXRUaW1lJiYoeT0hMCx0aGlzLnN5bmNUaW1lc3RhbXA9b1swXS50YXNrSWQsdGhpcy5zeW5jSW5kZXg9dGhpcy50bXBQb2ludHMubGVuZ3RoKSxzKSl7Y29uc3QgVD1uP3RoaXMuZnVsbExheWVyOnRoaXMuZHJhd0xheWVyfHx0aGlzLmZ1bGxMYXllcjtwPXRoaXMuZHJhdyh7YXR0cnM6dSx0YXNrczpvLGVmZmVjdHM6YyxsYXllcjpULGlzQ2xlYXJBbGw6YX0pfWlmKHMpcmV0dXJuIG0+MTAmJnRoaXMudG1wUG9pbnRzLnNwbGljZSgwLG0tMTApLHtyZWN0OnAsdHlwZTpsdC5EcmF3V29yayxkYXRhVHlwZTpUdC5Mb2NhbH07Y29uc3QgeD1bXTtyZXR1cm4gdGhpcy50bXBQb2ludHMuc2xpY2UoTykuZm9yRWFjaChUPT57eC5wdXNoKFQueCxULnksdGhpcy5jb21wdXRSYWRpdXMoVC56LHRoaXMud29ya09wdGlvbnMudGhpY2tuZXNzKSl9KSx7cmVjdDpwLHR5cGU6bHQuRHJhd1dvcmssZGF0YVR5cGU6VHQuTG9jYWwsd29ya0lkOnk/aTp2b2lkIDAsb3A6eT94OnZvaWQgMCxpbmRleDp5P08qMzp2b2lkIDB9fWNvbnN1bWVBbGwodCl7dmFyIG0sdTtpZih0LmRhdGEpe2NvbnN0e29wOnAsd29ya1N0YXRlOnl9PXQuZGF0YTtwIT1udWxsJiZwLmxlbmd0aCYmeT09PUl0LkRvbmUmJnRoaXMud29ya09wdGlvbnMuc3Ryb2tlVHlwZT09PUt0LlN0cm9rZSYmdGhpcy51cGRhdGVUZW1wUG9pbnRzV2l0aFByZXNzdXJlV2hlbkRvbmUocCl9Y29uc3QgZT0obT10aGlzLndvcmtJZCk9PW51bGw/dm9pZCAwOm0udG9TdHJpbmcoKTtpZighZSlyZXR1cm57dHlwZTpsdC5Ob25lfTtjb25zdCBuPXRoaXMudHJhbnNmb3JtRGF0YUFsbCghMCksYT17bmFtZTplfTtsZXQgcztjb25zdCBpPXRoaXMuZnVsbExheWVyO24ubGVuZ3RoJiYocz10aGlzLmRyYXcoe2F0dHJzOmEsdGFza3M6bixyZXBsYWNlSWQ6ZSxsYXllcjppLGlzQ2xlYXJBbGw6ITF9KSk7Y29uc3Qgbz1bXTt0aGlzLnRtcFBvaW50cy5tYXAocD0+e28ucHVzaChwLngscC55LHRoaXMuY29tcHV0UmFkaXVzKHAueix0aGlzLndvcmtPcHRpb25zLnRoaWNrbmVzcykpfSksdGhpcy5zeW5jVGltZXN0YW1wPTAsZGVsZXRlIHRoaXMud29ya09wdGlvbnMuc3luY1VuaXRUaW1lO2NvbnN0IGM9bmUobyk7cmV0dXJuIHRoaXMudk5vZGVzLnNldEluZm8oZSx7cmVjdDpzLG9wOm8sb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLHNjYWxlVHlwZTp0aGlzLnNjYWxlVHlwZSxjYW5Sb3RhdGU6dGhpcy5jYW5Sb3RhdGUsY2VudGVyUG9zOnMmJnl0LmdldENlbnRlclBvcyhzLGkpfSkse3JlY3Q6cyx0eXBlOmx0LkZ1bGxXb3JrLGRhdGFUeXBlOlR0LkxvY2FsLHdvcmtJZDplLG9wczpjLHVwZGF0ZU5vZGVPcHQ6e3Bvczp0aGlzLmNlbnRlclBvcyx1c2VBbmltYXRpb246ITB9LG9wdDp0aGlzLndvcmtPcHRpb25zLHVuZG9UaWNrZXJJZDoodT10LmRhdGEpPT1udWxsP3ZvaWQgMDp1LnVuZG9UaWNrZXJJZH19Y2xlYXJUbXBQb2ludHMoKXt0aGlzLnRtcFBvaW50cy5sZW5ndGg9MCx0aGlzLnN5bmNUaW1lc3RhbXA9MCx0aGlzLnN5bmNJbmRleD0wfWNvbnN1bWVTZXJ2aWNlKHQpe3ZhciB1O2NvbnN0e29wOmUsaXNGdWxsV29yazpuLHJlcGxhY2VJZDphLGlzQ2xlYXJBbGw6c309dDt0aGlzLnRtcFBvaW50cy5sZW5ndGg9MDtmb3IobGV0IHA9MDtwPGUubGVuZ3RoO3ArPTMpe2NvbnN0IHk9bmV3IE10KGVbcF0sZVtwKzFdLGVbcCsyXSk7aWYodGhpcy50bXBQb2ludHMubGVuZ3RoPjApe2NvbnN0IE89dGhpcy50bXBQb2ludHNbdGhpcy50bXBQb2ludHMubGVuZ3RoLTFdLHg9ZXQuU3ViKHksTykudW5pKCk7eS5zZXR2KHgpfXRoaXMudG1wUG9pbnRzLnB1c2goeSl9Y29uc3QgaT10aGlzLnRyYW5zZm9ybURhdGFBbGwoITEpLG89KHU9dGhpcy53b3JrSWQpPT1udWxsP3ZvaWQgMDp1LnRvU3RyaW5nKCksYz17bmFtZTpvfTtsZXQgbTtpZihvJiZpLmxlbmd0aCl7Y29uc3QgcD1uP3RoaXMuZnVsbExheWVyOnRoaXMuZHJhd0xheWVyfHx0aGlzLmZ1bGxMYXllcjttPXRoaXMuZHJhdyh7YXR0cnM6Yyx0YXNrczppLHJlcGxhY2VJZDphLGxheWVyOnAsaXNDbGVhckFsbDpzfSksdGhpcy52Tm9kZXMuc2V0SW5mbyhvLHtyZWN0Om0sb3A6ZSxvcHQ6dGhpcy53b3JrT3B0aW9ucyx0b29sc1R5cGU6dGhpcy50b29sc1R5cGUsc2NhbGVUeXBlOnRoaXMuc2NhbGVUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxjZW50ZXJQb3M6bSYmeXQuZ2V0Q2VudGVyUG9zKG0scCl9KX1yZXR1cm4gbX10cmFuc2Zvcm1EYXRhQWxsKHQ9ITApe3JldHVybiB0aGlzLmdldFRhc2tQb2ludHModGhpcy50bXBQb2ludHMsdCYmdGhpcy53b3JrT3B0aW9ucy50aGlja25lc3N8fHZvaWQgMCl9ZHJhdyh0KXt2YXIgZztjb25zdHthdHRyczplLHRhc2tzOm4scmVwbGFjZUlkOmEsZWZmZWN0czpzLGxheWVyOmksaXNDbGVhckFsbDpvfT10LHtzdHJva2VDb2xvcjpjLHN0cm9rZVR5cGU6bSx0aGlja25lc3M6dSx6SW5kZXg6cCxzY2FsZTp5LHJvdGF0ZTpPLHRyYW5zbGF0ZTp4fT10aGlzLndvcmtPcHRpb25zO28mJmkucmVtb3ZlQWxsQ2hpbGRyZW4oKSxhJiYodGhpcy5mdWxsTGF5ZXIuZ2V0RWxlbWVudHNCeU5hbWUoYSsiIikubWFwKE09Pk0ucmVtb3ZlKCkpLChnPXRoaXMuZHJhd0xheWVyKT09bnVsbHx8Zy5nZXRFbGVtZW50c0J5TmFtZShhKyIiKS5tYXAoTT0+TS5yZW1vdmUoKSkpLHMhPW51bGwmJnMuc2l6ZSYmKHMuZm9yRWFjaChNPT57dmFyIEE7KEE9aS5nZXRFbGVtZW50QnlJZChNKyIiKSk9PW51bGx8fEEucmVtb3ZlKCl9KSxzLmNsZWFyKCkpO2xldCB2O2NvbnN0IFQ9W10sbD1pLndvcmxkUG9zaXRpb24saD1pLndvcmxkU2NhbGluZztmb3IobGV0IE09MDtNPG4ubGVuZ3RoO00rKyl7Y29uc3R7cG9zOkEscG9pbnRzOkMsdGFza0lkOmJ9PW5bTV07ZS5pZD1iLnRvU3RyaW5nKCk7Y29uc3R7cHM6RSxyZWN0Okx9PXRoaXMuY29tcHV0RHJhd1BvaW50cyhDKTtsZXQgRDtjb25zdCBJPUMubGVuZ3RoPT09MTttPT09S3QuU3Ryb2tlfHxJP0Q9T2UoRSwhMCk6RD1PZShFLCExKTtjb25zdCBSPXtwb3M6QSxkOkQsZmlsbENvbG9yOm09PT1LdC5TdHJva2V8fEk/Yzp2b2lkIDAsbGluZURhc2g6bT09PUt0LkRvdHRlZCYmIUk/WzEsdSoyXTptPT09S3QuTG9uZ0RvdHRlZCYmIUk/W3UsdSoyXTp2b2lkIDAsc3Ryb2tlQ29sb3I6YyxsaW5lQ2FwOm09PT1LdC5TdHJva2V8fEk/dm9pZCAwOiJyb3VuZCIsbGluZVdpZHRoOm09PT1LdC5TdHJva2V8fEk/MDp1fTt2PU90KHYse3g6TWF0aC5mbG9vcigoTC54K0FbMF0pKmhbMF0rbFswXS15dC5TYWZlQm9yZGVyUGFkZGluZykseTpNYXRoLmZsb29yKChMLnkrQVsxXSkqaFsxXStsWzFdLXl0LlNhZmVCb3JkZXJQYWRkaW5nKSx3Ok1hdGguZmxvb3IoTC53KmhbMF0rMip5dC5TYWZlQm9yZGVyUGFkZGluZyksaDpNYXRoLmZsb29yKEwuaCpoWzFdKzIqeXQuU2FmZUJvcmRlclBhZGRpbmcpfSksVC5wdXNoKFIpfXkmJihlLnNjYWxlPXkpLE8mJihlLnJvdGF0ZT1PKSx4JiYoZS50cmFuc2xhdGU9eCk7Y29uc3QgZj1uZXcgcmU7aWYodil7dGhpcy5jZW50ZXJQb3M9eXQuZ2V0Q2VudGVyUG9zKHYsaSksZi5hdHRyKHsuLi5lLG5vcm1hbGl6ZTohMCxpZDplLm5hbWUsYW5jaG9yOlsuNSwuNV0sYmdjb2xvcjptPT09S3QuU3Ryb2tlP2M6dm9pZCAwLHBvczp0aGlzLmNlbnRlclBvcyxzaXplOlsodi53LTIqeXQuU2FmZUJvcmRlclBhZGRpbmcpL2hbMF0sKHYuaC0yKnl0LlNhZmVCb3JkZXJQYWRkaW5nKS9oWzFdXSx6SW5kZXg6cH0pO2NvbnN0IE09VC5tYXAoQT0+KEEucG9zPVtBLnBvc1swXS10aGlzLmNlbnRlclBvc1swXSxBLnBvc1sxXS10aGlzLmNlbnRlclBvc1sxXV0sbmV3IGhlKEEpKSk7Zi5hcHBlbmQoLi4uTSksbT09PUt0LlN0cm9rZSYmZi5zZWFsKCksaS5hcHBlbmQoZil9aWYoeXx8T3x8eCl7Y29uc3QgTT1mPT1udWxsP3ZvaWQgMDpmLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKE0pcmV0dXJue3g6TWF0aC5mbG9vcihNLngteXQuU2FmZUJvcmRlclBhZGRpbmcpLHk6TWF0aC5mbG9vcihNLnkteXQuU2FmZUJvcmRlclBhZGRpbmcpLHc6TWF0aC5mbG9vcihNLndpZHRoK3l0LlNhZmVCb3JkZXJQYWRkaW5nKjIpLGg6TWF0aC5mbG9vcihNLmhlaWdodCt5dC5TYWZlQm9yZGVyUGFkZGluZyoyKX19cmV0dXJuIHZ9Y29tcHV0RHJhd1BvaW50cyh0KXtyZXR1cm4gdGhpcy53b3JrT3B0aW9ucy5zdHJva2VUeXBlPT09S3QuU3Ryb2tlfHx0Lmxlbmd0aD09PTE/dGhpcy5jb21wdXRTdHJva2UodCk6dGhpcy5jb21wdXROb21hbCh0KX1jb21wdXROb21hbCh0KXtsZXQgZT10aGlzLndvcmtPcHRpb25zLnRoaWNrbmVzcztjb25zdCBuPXQubWFwKGE9PihlPU1hdGgubWF4KGUsYS5yYWRpdXMpLGEucG9pbnQpKTtyZXR1cm57cHM6bixyZWN0OkJ0KG4sZSl9fWNvbXB1dFN0cm9rZSh0KXtyZXR1cm4gdC5sZW5ndGg9PT0xP3RoaXMuY29tcHV0RG90U3Ryb2tlKHRbMF0pOnRoaXMuY29tcHV0TGluZVN0cm9rZSh0KX1jb21wdXRMaW5lU3Ryb2tlKHQpe2NvbnN0IGU9W10sbj1bXTtmb3IobGV0IGM9MDtjPHQubGVuZ3RoO2MrKyl7Y29uc3R7cG9pbnQ6bSxyYWRpdXM6dX09dFtjXTtsZXQgcD1tLnY7Yz09PTAmJnQubGVuZ3RoPjEmJihwPXRbYysxXS5wb2ludC52KTtjb25zdCB5PWV0LlBlcihwKS5tdWwodSk7ZS5wdXNoKE10LlN1YihtLHkpKSxuLnB1c2goTXQuQWRkKG0seSkpfWNvbnN0IGE9dFt0Lmxlbmd0aC0xXSxzPU10LkdldFNlbWljaXJjbGVTdHJva2UoYS5wb2ludCxlW2UubGVuZ3RoLTFdLC0xLDgpLGk9TXQuR2V0U2VtaWNpcmNsZVN0cm9rZSh0WzBdLnBvaW50LG5bMF0sLTEsOCksbz1lLmNvbmNhdChzLG4ucmV2ZXJzZSgpLGkpO3JldHVybntwczpvLHJlY3Q6QnQobyl9fWNvbXB1dERvdFN0cm9rZSh0KXtjb25zdHtwb2ludDplLHJhZGl1czpufT10LGE9e3g6ZS54LW4seTplLnktbix3Om4qMixoOm4qMn07cmV0dXJue3BzOk10LkdldERvdFN0cm9rZShlLG4sOCkscmVjdDphfX10cmFuc2Zvcm1EYXRhKHQsZSl7Y29uc3R7b3A6bix3b3JrU3RhdGU6YX09dDtsZXQgcz10aGlzLnRtcFBvaW50cy5sZW5ndGgtMSxpPVtdO2lmKG4hPW51bGwmJm4ubGVuZ3RoJiZhKXtjb25zdHtzdHJva2VUeXBlOm8sdGhpY2tuZXNzOmN9PXRoaXMud29ya09wdGlvbnMsbT1uZXcgU2V0O3M9bz09PUt0LlN0cm9rZT90aGlzLnVwZGF0ZVRlbXBQb2ludHNXaXRoUHJlc3N1cmUobixjLG0pOnRoaXMudXBkYXRlVGVtcFBvaW50cyhuLGMsbSk7Y29uc3QgdT1lP3RoaXMudG1wUG9pbnRzOnRoaXMudG1wUG9pbnRzLnNsaWNlKHMpO3JldHVybiBpPXRoaXMuZ2V0VGFza1BvaW50cyh1LGMpLHt0YXNrczppLGVmZmVjdHM6bSxjb25zdW1lSW5kZXg6c319cmV0dXJue3Rhc2tzOmksY29uc3VtZUluZGV4OnN9fWNvbXB1dFJhZGl1cyh0LGUpe3JldHVybiB0Ki4wMyplK2UqLjV9Z2V0TWluWih0LGUpe3JldHVybigoZXx8TWF0aC5tYXgoMSxNYXRoLmZsb29yKHQqLjMpKSktdCouNSkqMTAwL3QvM31nZXRUYXNrUG9pbnRzKHQsZSl7dmFyIHU7Y29uc3Qgbj1bXTtpZih0Lmxlbmd0aD09PTApcmV0dXJuW107bGV0IGE9MCxzPXRbMF0ueCxpPXRbMF0ueSxvPVtzLGldLGM9W10sbT10WzBdLnQ7Zm9yKDthPHQubGVuZ3RoOyl7Y29uc3QgcD10W2FdLHk9cC54LXMsTz1wLnktaSx4PXAueix2PWU/dGhpcy5jb21wdXRSYWRpdXMoeCxlKTp4O2lmKGMucHVzaCh7cG9pbnQ6bmV3IE10KHksTyx4LHRbYV0udikscmFkaXVzOnZ9KSxhPjAmJmE8dC5sZW5ndGgtMSl7Y29uc3QgVD10W2FdLmdldEFuZ2xlQnlQb2ludHModFthLTFdLHRbYSsxXSk7aWYoVDw5MHx8VD4yNzApe2NvbnN0IGw9KHU9Yy5wb3AoKSk9PW51bGw/dm9pZCAwOnUucG9pbnQuY2xvbmUoKTtsJiZuLnB1c2goe3Rhc2tJZDptLHBvczpvLHBvaW50czpbLi4uYyx7cG9pbnQ6bCxyYWRpdXM6dn1dfSkscz10W2FdLngsaT10W2FdLnksbz1bcyxpXTtjb25zdCBoPXAueC1zLGY9cC55LWk7Yz1be3BvaW50Om5ldyBNdChoLGYseCkscmFkaXVzOnZ9XSxtPURhdGUubm93KCl9fWErK31yZXR1cm4gbi5wdXNoKHt0YXNrSWQ6bSxwb3M6byxwb2ludHM6Y30pLG59dXBkYXRlVGVtcFBvaW50c1dpdGhQcmVzc3VyZSh0LGUsbil7Y29uc3QgYT1EYXRlLm5vdygpLHM9dGhpcy50bXBQb2ludHMubGVuZ3RoO2xldCBpPXM7Zm9yKGxldCBjPTA7Yzx0Lmxlbmd0aDtjKz0yKXtpPU1hdGgubWluKGkscyk7Y29uc3QgbT10aGlzLnRtcFBvaW50cy5sZW5ndGgsdT1uZXcgTXQodFtjXSx0W2MrMV0pO2lmKG09PT0wKXt0aGlzLnRtcFBvaW50cy5wdXNoKHUpO2NvbnRpbnVlfWNvbnN0IHA9bS0xLHk9dGhpcy50bXBQb2ludHNbcF0sTz1ldC5TdWIodSx5KS51bmkoKTtpZih1LmlzTmVhcih5LGUpKXtpZih5Lno8dGhpcy5NQVhfUkVQRUFSKXtpZih5LnNldHooTWF0aC5taW4oeS56KzEsdGhpcy5NQVhfUkVQRUFSKSksaT1NYXRoLm1pbihpLHApLG0+MSl7bGV0IFQ9bS0xO2Zvcig7VD4wOyl7Y29uc3QgbD10aGlzLnRtcFBvaW50c1tUXS5kaXN0YW5jZSh0aGlzLnRtcFBvaW50c1tULTFdKSxoPU1hdGgubWF4KHRoaXMudG1wUG9pbnRzW1RdLnotdGhpcy51bmlUaGlja25lc3MqbCwwKTtpZih0aGlzLnRtcFBvaW50c1tULTFdLno+PWgpYnJlYWs7dGhpcy50bXBQb2ludHNbVC0xXS5zZXR6KGgpLGk9TWF0aC5taW4oaSxULTEpLFQtLX19fWVsc2UgaT0xLzA7Y29udGludWV9dS5zZXR2KE8pO2NvbnN0IHg9dS5kaXN0YW5jZSh5KSx2PU1hdGgubWF4KHkuei10aGlzLnVuaVRoaWNrbmVzcyp4LDApO20+MSYmZXQuRXF1YWxzKE8seS52LC4wMikmJih2PjB8fHkuejw9MCkmJihuJiZ5LnQmJm4uYWRkKHkudCksdGhpcy50bXBQb2ludHMucG9wKCksaT1NYXRoLm1pbihwLGkpKSx1LnNldHoodiksdGhpcy50bXBQb2ludHMucHVzaCh1KX1pZihpPT09MS8wKXJldHVybiB0aGlzLnRtcFBvaW50cy5sZW5ndGg7bGV0IG89cztpZihpPT09cyl7bz1NYXRoLm1heChvLTEsMCk7Y29uc3QgYz10aGlzLnRtcFBvaW50c1tvXS50O2MmJihuPT1udWxsfHxuLmFkZChjKSl9ZWxzZXtsZXQgYz1zLTE7Zm9yKG89aTtjPj0wOyl7Y29uc3QgbT10aGlzLnRtcFBvaW50c1tjXS50O2lmKG0mJihuPT1udWxsfHxuLmFkZChtKSxjPD1pKSl7bz1jLGM9LTE7YnJlYWt9Yy0tfX1yZXR1cm4gdGhpcy50bXBQb2ludHNbb10uc2V0VChhKSxvfXVwZGF0ZVRlbXBQb2ludHModCxlLG4pe3ZhciBjO2NvbnN0IGE9RGF0ZS5ub3coKSxzPXRoaXMudG1wUG9pbnRzLmxlbmd0aDtsZXQgaT1zO2ZvcihsZXQgbT0wO208dC5sZW5ndGg7bSs9Mil7Y29uc3QgdT10aGlzLnRtcFBvaW50cy5sZW5ndGgscD1uZXcgTXQodFttXSx0W20rMV0pO2lmKHU9PT0wKXt0aGlzLnRtcFBvaW50cy5wdXNoKHApO2NvbnRpbnVlfWNvbnN0IHk9dS0xLE89dGhpcy50bXBQb2ludHNbeV0seD1ldC5TdWIocCxPKS51bmkoKTtpZihwLmlzTmVhcihPLGUvMikpe2k9TWF0aC5taW4oeSxpKTtjb250aW51ZX1ldC5FcXVhbHMoeCxPLnYsLjAyKSYmKG4mJk8udCYmbi5hZGQoTy50KSx0aGlzLnRtcFBvaW50cy5wb3AoKSxpPU1hdGgubWluKHksaSkpLHAuc2V0dih4KSx0aGlzLnRtcFBvaW50cy5wdXNoKHApfWxldCBvPXM7aWYoaT09PXMpe289TWF0aC5tYXgoby0xLDApO2NvbnN0IG09dGhpcy50bXBQb2ludHNbb10udDttJiYobj09bnVsbHx8bi5hZGQobSkpfWVsc2V7bGV0IG09TWF0aC5taW4ocy0xLGkpO2ZvcihvPWk7bT49MDspe2NvbnN0IHU9KGM9dGhpcy50bXBQb2ludHNbbV0pPT1udWxsP3ZvaWQgMDpjLnQ7aWYodSYmKG49PW51bGx8fG4uYWRkKHUpLG08PWkpKXtvPW0sbT0tMTticmVha31tLS19fXJldHVybiB0aGlzLnRtcFBvaW50c1tvXS5zZXRUKGEpLG99dXBkYXRlVGVtcFBvaW50c1dpdGhQcmVzc3VyZVdoZW5Eb25lKHQpe2NvbnN0e3RoaWNrbmVzczplfT10aGlzLndvcmtPcHRpb25zLG49dC5sZW5ndGgsYT10aGlzLmdldE1pblooZSk7Zm9yKGxldCBzPTA7czxuO3MrPTIpe2NvbnN0IGk9dGhpcy50bXBQb2ludHMubGVuZ3RoLG89bmV3IE10KHRbc10sdFtzKzFdKTtpZihpPT09MCl7dGhpcy50bXBQb2ludHMucHVzaChvKTtjb250aW51ZX1jb25zdCBjPWktMSxtPXRoaXMudG1wUG9pbnRzW2NdLHU9ZXQuU3ViKG8sbSkudW5pKCkscD1vLmRpc3RhbmNlKG0pO2lmKGk+MSYmbS56PT09YSlicmVhaztpZihvLmlzTmVhcihtLGUvMikpe2lmKG48MyYmbS56PHRoaXMuTUFYX1JFUEVBUiYmKG0uc2V0eihNYXRoLm1pbihtLnorMSx0aGlzLk1BWF9SRVBFQVIpKSxpPjEpKXtsZXQgTz1pLTE7Zm9yKDtPPjA7KXtjb25zdCB4PXRoaXMudG1wUG9pbnRzW09dLmRpc3RhbmNlKHRoaXMudG1wUG9pbnRzW08tMV0pLHY9TWF0aC5tYXgodGhpcy50bXBQb2ludHNbT10uei10aGlzLnVuaVRoaWNrbmVzcyp4LC1lLzQpO2lmKHRoaXMudG1wUG9pbnRzW08tMV0uej49dilicmVhazt0aGlzLnRtcFBvaW50c1tPLTFdLnNldHoodiksTy0tfX1jb250aW51ZX1vLnNldHYodSk7Y29uc3QgeT1NYXRoLm1heChtLnotdGhpcy51bmlUaGlja25lc3MqcCxhKTtpPjEmJmV0LkVxdWFscyh1LG0udiwuMDIpJiZtLno8PTAmJnRoaXMudG1wUG9pbnRzLnBvcCgpLG8uc2V0eih5KSx0aGlzLnRtcFBvaW50cy5wdXNoKG8pfX1zdGF0aWMgdXBkYXRlTm9kZU9wdCh0KXt2YXIgbztjb25zdHtub2RlOmUsb3B0Om4sdk5vZGVzOmF9PXQse3N0cm9rZUNvbG9yOnN9PW4saT1hLmdldChlLm5hbWUpO3JldHVybiBzJiYoZS50YWdOYW1lPT09IkdST1VQIj9IZShlKT9lLnNldEF0dHJpYnV0ZSgiYmdjb2xvciIscyk6ZS5jaGlsZHJlbi5mb3JFYWNoKGM9PntjLnNldEF0dHJpYnV0ZSgic3Ryb2tlQ29sb3IiLHMpLGMuZ2V0QXR0cmlidXRlKCJmaWxsQ29sb3IiKSYmYy5zZXRBdHRyaWJ1dGUoImZpbGxDb2xvciIscyl9KTooZS5zZXRBdHRyaWJ1dGUoInN0cm9rZUNvbG9yIixzKSxlLnNldEF0dHJpYnV0ZSgiZmlsbENvbG9yIixzKSksKG89aT09bnVsbD92b2lkIDA6aS5vcHQpIT1udWxsJiZvLnN0cm9rZUNvbG9yJiYoaS5vcHQuc3Ryb2tlQ29sb3I9cykpLGkmJmEuc2V0SW5mbyhlLm5hbWUsaSkseXQudXBkYXRlTm9kZU9wdCh0KX19Y2xhc3MgT24gZXh0ZW5kcyB5dHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KTtzdCh0aGlzLCJ0b29sc1R5cGUiLGd0Lkxhc2VyUGVuKTtzdCh0aGlzLCJjYW5Sb3RhdGUiLCExKTtzdCh0aGlzLCJzY2FsZVR5cGUiLEZ0Lm5vbmUpO3N0KHRoaXMsInN5bmNUaW1lc3RhbXAiKTtzdCh0aGlzLCJzeW5jSW5kZXgiLDApO3N0KHRoaXMsInRtcFBvaW50cyIsW10pO3N0KHRoaXMsIndvcmtPcHRpb25zIik7c3QodGhpcywiY29uc3VtZUluZGV4IiwwKTt0aGlzLndvcmtPcHRpb25zPXQudG9vbHNPcHQsdGhpcy5zeW5jVGltZXN0YW1wPTB9Y29tYmluZUNvbnN1bWUoKXt9c2V0V29ya09wdGlvbnModCl7c3VwZXIuc2V0V29ya09wdGlvbnModCksdGhpcy5zeW5jVGltZXN0YW1wPURhdGUubm93KCl9Y29uc3VtZSh0KXtjb25zdHtkYXRhOmUsaXNTdWJXb3JrZXI6bn09dCx7d29ya0lkOmEsb3A6c309ZTtpZigocz09bnVsbD92b2lkIDA6cy5sZW5ndGgpPT09MClyZXR1cm57dHlwZTpsdC5Ob25lfTtpZih0aGlzLnVwZGF0ZVRlbXBQb2ludHMoc3x8W10pLHRoaXMuY29uc3VtZUluZGV4PnRoaXMudG1wUG9pbnRzLmxlbmd0aC00KXJldHVybnt0eXBlOmx0Lk5vbmV9O2NvbnN0e3N0cm9rZUNvbG9yOmksdGhpY2tuZXNzOm8sc3Ryb2tlVHlwZTpjfT10aGlzLndvcmtPcHRpb25zLG09QnQodGhpcy50bXBQb2ludHMsbyk7bGV0IHU9ITE7Y29uc3QgcD10aGlzLnN5bmNJbmRleCx5PXRoaXMudG1wUG9pbnRzLnNsaWNlKHRoaXMuY29uc3VtZUluZGV4KTt0aGlzLmNvbnN1bWVJbmRleD10aGlzLnRtcFBvaW50cy5sZW5ndGgtMSx0aGlzLnN5bmNUaW1lc3RhbXA9PT0wJiYodGhpcy5zeW5jVGltZXN0YW1wPURhdGUubm93KCkpO2NvbnN0IE89e25hbWU6YT09bnVsbD92b2lkIDA6YS50b1N0cmluZygpLG9wYWNpdHk6MSxsaW5lRGFzaDpjPT09S3QuRG90dGVkP1sxLG8qMl06Yz09PUt0LkxvbmdEb3R0ZWQ/W28sbyoyXTp2b2lkIDAsc3Ryb2tlQ29sb3I6aSxsaW5lQ2FwOiJyb3VuZCIsbGluZVdpZHRoOm8sYW5jaG9yOlsuNSwuNV19LHg9dGhpcy5nZXRUYXNrUG9pbnRzKHkpO2lmKHgubGVuZ3RoKXtjb25zdCBUPURhdGUubm93KCk7VC10aGlzLnN5bmNUaW1lc3RhbXA+dGhpcy5zeW5jVW5pdFRpbWUmJih1PSEwLHRoaXMuc3luY1RpbWVzdGFtcD1ULHRoaXMuc3luY0luZGV4PXRoaXMudG1wUG9pbnRzLmxlbmd0aCksbiYmdGhpcy5kcmF3KHthdHRyczpPLHRhc2tzOngsaXNEb3Q6ITEsbGF5ZXI6dGhpcy5kcmF3TGF5ZXJ8fHRoaXMuZnVsbExheWVyfSl9Y29uc3Qgdj1bXTtyZXR1cm4gdGhpcy50bXBQb2ludHMuc2xpY2UocCkuZm9yRWFjaChUPT57di5wdXNoKFQueCxULnkpfSkse3JlY3Q6e3g6bS54KnRoaXMuZnVsbExheWVyLndvcmxkU2NhbGluZ1swXSt0aGlzLmZ1bGxMYXllci53b3JsZFBvc2l0aW9uWzBdLHk6bS55KnRoaXMuZnVsbExheWVyLndvcmxkU2NhbGluZ1sxXSt0aGlzLmZ1bGxMYXllci53b3JsZFBvc2l0aW9uWzFdLHc6bS53KnRoaXMuZnVsbExheWVyLndvcmxkU2NhbGluZ1swXSxoOm0uaCp0aGlzLmZ1bGxMYXllci53b3JsZFNjYWxpbmdbMV19LHR5cGU6bHQuRHJhd1dvcmssZGF0YVR5cGU6VHQuTG9jYWwsd29ya0lkOnU/YTp2b2lkIDAsb3A6dT92OnZvaWQgMCxpbmRleDp1P3AqMjp2b2lkIDB9fWNvbnN1bWVBbGwoKXt2YXIgYTtjb25zdCB0PShhPXRoaXMud29ya0lkKT09bnVsbD92b2lkIDA6YS50b1N0cmluZygpO2xldCBlO2lmKHRoaXMudG1wUG9pbnRzLmxlbmd0aC0xPnRoaXMuY29uc3VtZUluZGV4KXtsZXQgcz10aGlzLnRtcFBvaW50cy5zbGljZSh0aGlzLmNvbnN1bWVJbmRleCk7Y29uc3QgaT1zLmxlbmd0aD09PTEse3N0cm9rZUNvbG9yOm8sdGhpY2tuZXNzOmMsc3Ryb2tlVHlwZTptfT10aGlzLndvcmtPcHRpb25zO2lmKGkpe2NvbnN0IHk9dGhpcy5jb21wdXREb3RTdHJva2Uoe3BvaW50OnNbMF0scmFkaXVzOmMvMn0pO3M9eS5wcyxlPXkucmVjdH1lbHNlIGU9QnQodGhpcy50bXBQb2ludHMsYyk7Y29uc3QgdT17bmFtZTp0PT1udWxsP3ZvaWQgMDp0LnRvU3RyaW5nKCksZmlsbENvbG9yOmk/bzp2b2lkIDAsb3BhY2l0eToxLGxpbmVEYXNoOm09PT1LdC5Eb3R0ZWQmJiFpP1sxLGMqMl06bT09PUt0LkxvbmdEb3R0ZWQmJiFpP1tjLGMqMl06dm9pZCAwLHN0cm9rZUNvbG9yOm8sbGluZUNhcDppP3ZvaWQgMDoicm91bmQiLGxpbmVXaWR0aDppPzA6YyxhbmNob3I6Wy41LC41XX0scD10aGlzLmdldFRhc2tQb2ludHMocyk7cC5sZW5ndGgmJnRoaXMuZHJhdyh7YXR0cnM6dSx0YXNrczpwLGlzRG90OmksbGF5ZXI6dGhpcy5kcmF3TGF5ZXJ8fHRoaXMuZnVsbExheWVyfSl9Y29uc3Qgbj1bXTtyZXR1cm4gdGhpcy50bXBQb2ludHMuc2xpY2UodGhpcy5zeW5jSW5kZXgpLmZvckVhY2gocz0+e24ucHVzaChzLngscy55KX0pLHtyZWN0OmUmJnt4OmUueCp0aGlzLmZ1bGxMYXllci53b3JsZFNjYWxpbmdbMF0rdGhpcy5mdWxsTGF5ZXIud29ybGRQb3NpdGlvblswXSx5OmUueSp0aGlzLmZ1bGxMYXllci53b3JsZFNjYWxpbmdbMV0rdGhpcy5mdWxsTGF5ZXIud29ybGRQb3NpdGlvblsxXSx3OmUudyp0aGlzLmZ1bGxMYXllci53b3JsZFNjYWxpbmdbMF0saDplLmgqdGhpcy5mdWxsTGF5ZXIud29ybGRTY2FsaW5nWzFdfSx0eXBlOmx0LkRyYXdXb3JrLGRhdGFUeXBlOlR0LkxvY2FsLHdvcmtJZDp0LG9wOm4saW5kZXg6dGhpcy5zeW5jSW5kZXgqMn19Y2xlYXJUbXBQb2ludHMoKXt0aGlzLnRtcFBvaW50cy5sZW5ndGg9MCx0aGlzLnN5bmNUaW1lc3RhbXA9MCx0aGlzLnN5bmNJbmRleD0wfWNvbnN1bWVTZXJ2aWNlKHQpe3ZhciB4O2NvbnN0e29wOmUscmVwbGFjZUlkOm4saXNGdWxsV29yazphfT10LHtzdHJva2VDb2xvcjpzLHRoaWNrbmVzczppLHN0cm9rZVR5cGU6b309dGhpcy53b3JrT3B0aW9ucztpZighZS5sZW5ndGgpe2NvbnN0IHY9QnQodGhpcy50bXBQb2ludHMsaSk7cmV0dXJue3g6di54KnRoaXMuZnVsbExheWVyLndvcmxkU2NhbGluZ1swXSt0aGlzLmZ1bGxMYXllci53b3JsZFBvc2l0aW9uWzBdLHk6di55KnRoaXMuZnVsbExheWVyLndvcmxkU2NhbGluZ1sxXSt0aGlzLmZ1bGxMYXllci53b3JsZFBvc2l0aW9uWzFdLHc6di53KnRoaXMuZnVsbExheWVyLndvcmxkU2NhbGluZ1swXSxoOnYuaCp0aGlzLmZ1bGxMYXllci53b3JsZFNjYWxpbmdbMV19fWNvbnN0IGM9TWF0aC5tYXgoMCx0aGlzLnRtcFBvaW50cy5sZW5ndGgtMSk7dGhpcy51cGRhdGVUZW1wUG9pbnRzKGV8fFtdKTtsZXQgbSx1PXRoaXMudG1wUG9pbnRzLnNsaWNlKGMpO2NvbnN0IHA9dS5sZW5ndGg9PT0xO2lmKHApe2NvbnN0IHY9dGhpcy5jb21wdXREb3RTdHJva2Uoe3BvaW50OnVbMF0scmFkaXVzOmkvMn0pO3U9di5wcyxtPXYucmVjdH1lbHNlIG09QnQodGhpcy50bXBQb2ludHMsaSk7Y29uc3QgeT17bmFtZTooeD10aGlzLndvcmtJZCk9PW51bGw/dm9pZCAwOngudG9TdHJpbmcoKSxmaWxsQ29sb3I6cD9zOnZvaWQgMCxvcGFjaXR5OjEsbGluZURhc2g6bz09PUt0LkRvdHRlZCYmIXA/WzEsaSoyXTpvPT09S3QuTG9uZ0RvdHRlZCYmIXA/W2ksaSoyXTp2b2lkIDAsc3Ryb2tlQ29sb3I6cyxsaW5lQ2FwOnA/dm9pZCAwOiJyb3VuZCIsbGluZVdpZHRoOnA/MDppLGFuY2hvcjpbLjUsLjVdfSxPPXRoaXMuZ2V0VGFza1BvaW50cyh1KTtpZihPLmxlbmd0aCl7Y29uc3Qgdj1hP3RoaXMuZnVsbExheWVyOnRoaXMuZHJhd0xheWVyfHx0aGlzLmZ1bGxMYXllcjt0aGlzLmRyYXcoe2F0dHJzOnksdGFza3M6Tyxpc0RvdDpwLHJlcGxhY2VJZDpuLGxheWVyOnZ9KX1yZXR1cm57eDptLngqdGhpcy5mdWxsTGF5ZXIud29ybGRTY2FsaW5nWzBdK3RoaXMuZnVsbExheWVyLndvcmxkUG9zaXRpb25bMF0seTptLnkqdGhpcy5mdWxsTGF5ZXIud29ybGRTY2FsaW5nWzFdK3RoaXMuZnVsbExheWVyLndvcmxkUG9zaXRpb25bMV0sdzptLncqdGhpcy5mdWxsTGF5ZXIud29ybGRTY2FsaW5nWzBdLGg6bS5oKnRoaXMuZnVsbExheWVyLndvcmxkU2NhbGluZ1sxXX19Y29tcHV0RG90U3Ryb2tlKHQpe2NvbnN0e3BvaW50OmUscmFkaXVzOm59PXQsYT17eDplLngtbix5OmUueS1uLHc6bioyLGg6bioyfTtyZXR1cm57cHM6TXQuR2V0RG90U3Ryb2tlKGUsbiw4KSxyZWN0OmF9fXVwZGF0ZVRlbXBQb2ludHModCl7Y29uc3QgZT10aGlzLnRtcFBvaW50cy5sZW5ndGg7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKz0yKXtpZihlKXtjb25zdCBhPXRoaXMudG1wUG9pbnRzLnNsaWNlKC0xKVswXTthJiZhLng9PT10W25dJiZhLnk9PT10W24rMV0mJnRoaXMudG1wUG9pbnRzLnBvcCgpfXRoaXMudG1wUG9pbnRzLnB1c2gobmV3IE10KHRbbl0sdFtuKzFdKSl9fWFzeW5jIGRyYXcodCl7Y29uc3R7YXR0cnM6ZSx0YXNrczpuLGlzRG90OmEsbGF5ZXI6c309dCx7ZHVyYXRpb246aX09dGhpcy53b3JrT3B0aW9ucztmb3IoY29uc3QgbyBvZiBuKXtjb25zdCBjPW5ldyBoZSx7cG9zOm0scG9pbnRzOnV9PW87bGV0IHA7YT9wPU9lKHUsITApOnA9T2UodSwhMSksYy5hdHRyKHsuLi5lLHBvczptLGQ6cH0pO2NvbnN0e3ZlcnRleDp5LGZyYWdtZW50Ok99PXRoaXMud29ya09wdGlvbnM7aWYoeSYmTyl7Y29uc3QgeD1zLnJlbmRlcmVyLmNyZWF0ZVByb2dyYW0oe3ZlcnRleDp5LGZyYWdtZW50Ok99KSx7d2lkdGg6dixoZWlnaHQ6VH09cy5nZXRSZXNvbHV0aW9uKCk7Yy5zZXRVbmlmb3Jtcyh7dV90aW1lOjAsdV9yZXNvbHV0aW9uOlt2LFRdfSksYy5zZXRQcm9ncmFtKHgpfXMuYXBwZW5kQ2hpbGQoYyksYy50cmFuc2l0aW9uKGkpLmF0dHIoe3NjYWxlOmE/Wy4xLC4xXTpbMSwxXSxsaW5lV2lkdGg6YT8wOjF9KS50aGVuKCgpPT57Yy5yZW1vdmUoKX0pfX1nZXRUYXNrUG9pbnRzKHQpe3ZhciBjO2NvbnN0IGU9W107aWYodC5sZW5ndGg9PT0wKXJldHVybltdO2xldCBuPTAsYT10WzBdLngscz10WzBdLnksaT1bYSxzXSxvPVtdO2Zvcig7bjx0Lmxlbmd0aDspe2NvbnN0IG09dFtuXSx1PW0ueC1hLHA9bS55LXM7aWYoby5wdXNoKG5ldyBNdCh1LHApKSxuPjAmJm48dC5sZW5ndGgtMSl7Y29uc3QgeT10W25dLmdldEFuZ2xlQnlQb2ludHModFtuLTFdLHRbbisxXSk7aWYoeTw5MHx8eT4yNzApe2NvbnN0IE89KGM9by5wb3AoKSk9PW51bGw/dm9pZCAwOmMuY2xvbmUoKTtPJiZlLnB1c2goe3BvczppLHBvaW50czpbLi4ubyxPXX0pLGE9dFtuXS54LHM9dFtuXS55LGk9W2Esc107Y29uc3QgeD1tLngtYSx2PW0ueS1zO289W25ldyBNdCh4LHYpXX19bisrfXJldHVybiBlLnB1c2goe3BvczppLHBvaW50czpvfSksZX1yZW1vdmVMb2NhbCgpe31yZW1vdmVTZXJ2aWNlKHQpe2xldCBlO2NvbnN0IG49W107cmV0dXJuIHRoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKHQpLmZvckVhY2goYT0+e2lmKGEubmFtZT09PXQpe2NvbnN0IHM9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtlPU90KGUse3g6cy54LHk6cy55LHc6cy53aWR0aCxoOnMuaGVpZ2h0fSksbi5wdXNoKGEpfX0pLG4ubGVuZ3RoJiZuLmZvckVhY2goYT0+YS5yZW1vdmUoKSksZX19dmFyIEdoPVllO1llLnBvbHlsaW5lPVllLFllLnBvbHlnb249SGg7ZnVuY3Rpb24gWWUoZCxyLHQpe3ZhciBlPWQubGVuZ3RoLG49RWUoZFswXSxyKSxhPVtdLHMsaSxvLGMsbTtmb3IodHx8KHQ9W10pLHM9MTtzPGU7cysrKXtmb3IoaT1kW3MtMV0sbz1kW3NdLGM9bT1FZShvLHIpOzspaWYobnxjKXtpZihuJmMpYnJlYWs7bj8oaT1ncihpLG8sbixyKSxuPUVlKGkscikpOihvPWdyKGksbyxjLHIpLGM9RWUobyxyKSl9ZWxzZXthLnB1c2goaSksYyE9PW0/KGEucHVzaChvKSxzPGUtMSYmKHQucHVzaChhKSxhPVtdKSk6cz09PWUtMSYmYS5wdXNoKG8pO2JyZWFrfW49bX1yZXR1cm4gYS5sZW5ndGgmJnQucHVzaChhKSx0fWZ1bmN0aW9uIEhoKGQscil7dmFyIHQsZSxuLGEscyxpLG87Zm9yKGU9MTtlPD04O2UqPTIpe2Zvcih0PVtdLG49ZFtkLmxlbmd0aC0xXSxhPSEoRWUobixyKSZlKSxzPTA7czxkLmxlbmd0aDtzKyspaT1kW3NdLG89IShFZShpLHIpJmUpLG8hPT1hJiZ0LnB1c2goZ3IobixpLGUscikpLG8mJnQucHVzaChpKSxuPWksYT1vO2lmKGQ9dCwhZC5sZW5ndGgpYnJlYWt9cmV0dXJuIHR9ZnVuY3Rpb24gZ3IoZCxyLHQsZSl7cmV0dXJuIHQmOD9bZFswXSsoclswXS1kWzBdKSooZVszXS1kWzFdKS8oclsxXS1kWzFdKSxlWzNdXTp0JjQ/W2RbMF0rKHJbMF0tZFswXSkqKGVbMV0tZFsxXSkvKHJbMV0tZFsxXSksZVsxXV06dCYyP1tlWzJdLGRbMV0rKHJbMV0tZFsxXSkqKGVbMl0tZFswXSkvKHJbMF0tZFswXSldOnQmMT9bZVswXSxkWzFdKyhyWzFdLWRbMV0pKihlWzBdLWRbMF0pLyhyWzBdLWRbMF0pXTpudWxsfWZ1bmN0aW9uIEVlKGQscil7dmFyIHQ9MDtyZXR1cm4gZFswXTxyWzBdP3R8PTE6ZFswXT5yWzJdJiYodHw9MiksZFsxXTxyWzFdP3R8PTQ6ZFsxXT5yWzNdJiYodHw9OCksdH12YXIgS2g9WHQoR2gpO2NvbnN0IFBlPWNsYXNzIFBlIGV4dGVuZHMgeXR7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0KTtzdCh0aGlzLCJjYW5Sb3RhdGUiLCExKTtzdCh0aGlzLCJzY2FsZVR5cGUiLEZ0Lm5vbmUpO3N0KHRoaXMsInRvb2xzVHlwZSIsZ3QuRXJhc2VyKTtzdCh0aGlzLCJzZXJ2aWNlV29yayIpO3N0KHRoaXMsInRtcFBvaW50cyIsW10pO3N0KHRoaXMsIndvcmtPcHRpb25zIik7c3QodGhpcywid29ybGRQb3NpdGlvbiIpO3N0KHRoaXMsIndvcmxkU2NhbGluZyIpO3N0KHRoaXMsImVyYXNlclJlY3QiKTtzdCh0aGlzLCJlcmFzZXJQb2x5bGluZSIpO3RoaXMuc2VydmljZVdvcms9ZSx0aGlzLndvcmtPcHRpb25zPXQudG9vbHNPcHQsdGhpcy53b3JsZFBvc2l0aW9uPXRoaXMuZnVsbExheWVyLndvcmxkUG9zaXRpb24sdGhpcy53b3JsZFNjYWxpbmc9dGhpcy5mdWxsTGF5ZXIud29ybGRTY2FsaW5nfWNvbWJpbmVDb25zdW1lKCl7fWNvbnN1bWVTZXJ2aWNlKCl7fXNldFdvcmtPcHRpb25zKHQpe3N1cGVyLnNldFdvcmtPcHRpb25zKHQpfWNyZWF0ZUVyYXNlclJlY3QodCl7Y29uc3QgZT10WzBdKnRoaXMud29ybGRTY2FsaW5nWzBdK3RoaXMud29ybGRQb3NpdGlvblswXSxuPXRbMV0qdGhpcy53b3JsZFNjYWxpbmdbMV0rdGhpcy53b3JsZFBvc2l0aW9uWzFdLHt3aWR0aDphLGhlaWdodDpzfT1QZS5lcmFzZXJTaXplc1t0aGlzLndvcmtPcHRpb25zLnRoaWNrbmVzc107dGhpcy5lcmFzZXJSZWN0PXt4OmUtYSouNSx5Om4tcyouNSx3OmEsaDpzfSx0aGlzLmVyYXNlclBvbHlsaW5lPVt0aGlzLmVyYXNlclJlY3QueCx0aGlzLmVyYXNlclJlY3QueSx0aGlzLmVyYXNlclJlY3QueCt0aGlzLmVyYXNlclJlY3Qudyx0aGlzLmVyYXNlclJlY3QueSt0aGlzLmVyYXNlclJlY3QuaF19Y29tcHV0UmVjdENlbnRlclBvaW50cygpe2NvbnN0IHQ9dGhpcy50bXBQb2ludHMuc2xpY2UoLTIpO2lmKHRoaXMudG1wUG9pbnRzLmxlbmd0aD09PTQpe2NvbnN0IGU9bmV3IGV0KHRoaXMudG1wUG9pbnRzWzBdLHRoaXMudG1wUG9pbnRzWzFdKSxuPW5ldyBldCh0aGlzLnRtcFBvaW50c1syXSx0aGlzLnRtcFBvaW50c1szXSksYT1ldC5TdWIobixlKS51bmkoKSxzPWV0LkRpc3QoZSxuKSx7d2lkdGg6aSxoZWlnaHQ6b309UGUuZXJhc2VyU2l6ZXNbdGhpcy53b3JrT3B0aW9ucy50aGlja25lc3NdLGM9TWF0aC5taW4oaSxvKSxtPU1hdGgucm91bmQocy9jKTtpZihtPjEpe2NvbnN0IHU9W107Zm9yKGxldCBwPTA7cDxtO3ArKyl7Y29uc3QgeT1ldC5NdWwoYSxwKmMpO3UucHVzaCh0aGlzLnRtcFBvaW50c1swXSt5LngsdGhpcy50bXBQb2ludHNbMV0reS55KX1yZXR1cm4gdS5jb25jYXQodCl9fXJldHVybiB0fWlzTmVhcih0LGUpe2NvbnN0IG49bmV3IGV0KHRbMF0sdFsxXSksYT1uZXcgZXQoZVswXSxlWzFdKSx7d2lkdGg6cyxoZWlnaHQ6aX09UGUuZXJhc2VyU2l6ZXNbdGhpcy53b3JrT3B0aW9ucy50aGlja25lc3NdO3JldHVybiBldC5EaXN0KG4sYSk8TWF0aC5oeXBvdChzLGkpKi41fWN1dFBvbHlsaW5lKHQsZSl7bGV0IG49W2VdLGE9MDtmb3IoO2E8dC5sZW5ndGg7KXtjb25zdCBvPXRbYV07aWYoby5sZW5ndGg8MilicmVhaztuPXMobixvKSxhKyt9cmV0dXJuIG47ZnVuY3Rpb24gcyhvLGMpe2NvbnN0IG09bztmb3IobGV0IHU9MDt1PG8ubGVuZ3RoO3UrKyl7Y29uc3QgcD1vW3VdLHk9cC5maW5kSW5kZXgoKE8seCk9Png8cC5sZW5ndGgtMT9pKFtPLHBbeCsxXV0sW2NbMF0sY1sxXV0pOiExKTtpZih5IT09LTEmJnk+LTEpe2NvbnN0IE89W10seD1wLnNsaWNlKDAseSsxKTtpZihldC5FcXVhbHMocFt5XSxjWzBdKXx8eC5wdXNoKGNbMF0uY2xvbmUoKS5zZXR6KHBbeV0ueikpLHgubGVuZ3RoPjEmJk8ucHVzaCh4KSx5K2MubGVuZ3RoLTE8cC5sZW5ndGgtMSl7Y29uc3Qgdj15K2MubGVuZ3RoLTEsVD1wLnNsaWNlKHYpLGw9Y1tjLmxlbmd0aC0xXTtldC5FcXVhbHMocFt2XSxsKXx8VC51bnNoaWZ0KGwuY2xvbmUoKS5zZXR6KHBbdl0ueikpLFQubGVuZ3RoPjEmJk8ucHVzaChUKX1yZXR1cm4gbS5zcGxpY2UodSwxLC4uLk8pLG19fXJldHVybiBtfWZ1bmN0aW9uIGkobyxjKXtjb25zdCBtPWV0LlN1YihvWzFdLG9bMF0pLHU9ZXQuU3ViKGNbMV0sY1swXSkscD1ldC5TdWIoY1swXSxvWzBdKTtyZXR1cm4gTWF0aC5hYnMoZXQuQ3ByKG0sdSkpPC4xJiZNYXRoLmFicyhldC5DcHIobSxwKSk8LjF9fWlzU2FtZVBvaW50KHQsZSl7cmV0dXJuIHRbMF09PT1lWzBdJiZ0WzFdPT09ZVsxXX10cmFuc2xhdGVJbnRlcnNlY3QodCl7Y29uc3QgZT1bXTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7Y29uc3QgYT10W25dLmZpbHRlcigobyxjLG0pPT4hKGM+MCYmdGhpcy5pc1NhbWVQb2ludChvLG1bYy0xXSkpKSxzPVtdO2xldCBpPTA7Zm9yKDtpPGEubGVuZ3RoOyl7Y29uc3Qgbz1hW2ldLGM9bmV3IGV0KG9bMF0sb1sxXSk7cy5wdXNoKGMpLGkrK31lLnB1c2gocyl9cmV0dXJuIGV9aXNMaW5lRXJhc2VyKHQsZSl7cmV0dXJuISh0PT09Z3QuUGVuY2lsJiYhZSl9cmVtb3ZlKHQpe2NvbnN0e2N1ck5vZGVNYXA6ZSxyZW1vdmVJZHM6bixuZXdXb3JrRGF0YXM6YX09dCx7aXNMaW5lOnN9PXRoaXMud29ya09wdGlvbnM7bGV0IGk7Zm9yKGNvbnN0W28sY11vZiBlLmVudHJpZXMoKSlpZihjLnJlY3QmJnRoaXMuZXJhc2VyUmVjdCYmdGhpcy5lcmFzZXJQb2x5bGluZSYmeGUodGhpcy5lcmFzZXJSZWN0LGMucmVjdCkpe2NvbnN0e29wOm0sdG9vbHNUeXBlOnV9PWMscD10aGlzLmlzTGluZUVyYXNlcih1LHMpLHk9W10sTz1bXTtmb3IobGV0IHY9MDt2PG0ubGVuZ3RoO3YrPTMpe2NvbnN0IFQ9bmV3IGV0KG1bdl0qdGhpcy53b3JsZFNjYWxpbmdbMF0rdGhpcy53b3JsZFBvc2l0aW9uWzBdLG1bdisxXSp0aGlzLndvcmxkU2NhbGluZ1sxXSt0aGlzLndvcmxkUG9zaXRpb25bMV0sbVt2KzJdKTtPLnB1c2goVCkseS5wdXNoKG5ldyBNdChULngsVC55KSl9Y29uc3QgeD15Lmxlbmd0aCYmQnQoeSl8fGMucmVjdDtpZih4ZSh4LHRoaXMuZXJhc2VyUmVjdCkpe2lmKE8ubGVuZ3RoPjEpe2NvbnN0IHY9S2gucG9seWxpbmUoTy5tYXAoVD0+VC5YWSksdGhpcy5lcmFzZXJQb2x5bGluZSk7aWYodi5sZW5ndGgmJihuLmFkZChjLm5hbWUpLCFwKSl7Y29uc3QgVD10aGlzLnRyYW5zbGF0ZUludGVyc2VjdCh2KSxsPXRoaXMuY3V0UG9seWxpbmUoVCxPKTtmb3IobGV0IGg9MDtoPGwubGVuZ3RoO2grKyl7Y29uc3QgZj1gJHtvfV9zXyR7aH1gLGc9W107bFtoXS5mb3JFYWNoKE09PntnLnB1c2goKE0ueC10aGlzLndvcmxkUG9zaXRpb25bMF0pL3RoaXMud29ybGRTY2FsaW5nWzBdLChNLnktdGhpcy53b3JsZFBvc2l0aW9uWzFdKS90aGlzLndvcmxkU2NhbGluZ1sxXSxNLnopfSksYy5vcHQmJmMudG9vbHNUeXBlJiZ0aGlzLnZOb2RlcyYmKHRoaXMudk5vZGVzLnNldEluZm8oZix7cmVjdDp4LG9wOmcsb3B0OmMub3B0LGNhblJvdGF0ZTpjLmNhblJvdGF0ZSxzY2FsZVR5cGU6Yy5zY2FsZVR5cGUsdG9vbHNUeXBlOmMudG9vbHNUeXBlfSksYS5zZXQoZix7d29ya0lkOmYsb3A6ZyxvcHQ6Yy5vcHQsdG9vbHNUeXBlOmMudG9vbHNUeXBlfSkpfX19ZWxzZSBuLmFkZChjLm5hbWUpO2k9T3QoaSx4KX19cmV0dXJuIG4uZm9yRWFjaChvPT57dmFyIGM7cmV0dXJuKGM9dGhpcy52Tm9kZXMpPT1udWxsP3ZvaWQgMDpjLmRlbGV0ZShvKX0pLGkmJihpLngtPXl0LlNhZmVCb3JkZXJQYWRkaW5nLGkueS09eXQuU2FmZUJvcmRlclBhZGRpbmcsaS53Kz15dC5TYWZlQm9yZGVyUGFkZGluZyoyLGkuaCs9eXQuU2FmZUJvcmRlclBhZGRpbmcqMiksaX1jb25zdW1lKHQpe2NvbnN0e29wOmV9PXQuZGF0YTtpZighZXx8ZS5sZW5ndGg9PT0wKXJldHVybnt0eXBlOmx0Lk5vbmV9O2NvbnN0IG49dGhpcy50bXBQb2ludHMubGVuZ3RoO2lmKG4+MSYmdGhpcy5pc05lYXIoW2VbMF0sZVsxXV0sW3RoaXMudG1wUG9pbnRzW24tMl0sdGhpcy50bXBQb2ludHNbbi0xXV0pKXJldHVybnt0eXBlOmx0Lk5vbmV9O249PT00JiYodGhpcy50bXBQb2ludHMuc2hpZnQoKSx0aGlzLnRtcFBvaW50cy5zaGlmdCgpKSx0aGlzLnRtcFBvaW50cy5wdXNoKGVbMF0sZVsxXSk7Y29uc3QgYT10aGlzLmNvbXB1dFJlY3RDZW50ZXJQb2ludHMoKTtsZXQgcztjb25zdCBpPW5ldyBTZXQsbz1uZXcgTWFwO3RoaXMudk5vZGVzLnNldFRhcmdldCgpO2NvbnN0IGM9dGhpcy5nZXRVbkxvY2tOb2RlTWFwKHRoaXMudk5vZGVzLmdldExhc3RUYXJnZXQoKSk7Zm9yKGxldCBtPTA7bTxhLmxlbmd0aC0xO20rPTIpe3RoaXMuY3JlYXRlRXJhc2VyUmVjdChhLnNsaWNlKG0sbSsyKSk7Y29uc3QgdT10aGlzLnJlbW92ZSh7Y3VyTm9kZU1hcDpjLHJlbW92ZUlkczppLG5ld1dvcmtEYXRhczpvfSk7cz1PdChzLHUpfWlmKHRoaXMudk5vZGVzLmRlbGV0ZUxhc3RUYXJnZXQoKSxzJiZpLnNpemUpe2Zvcihjb25zdCBtIG9mIG8ua2V5cygpKWkuaGFzKG0pJiZvLmRlbGV0ZShtKTtyZXR1cm57dHlwZTpsdC5SZW1vdmVOb2RlLGRhdGFUeXBlOlR0LkxvY2FsLHJlY3Q6cyxyZW1vdmVJZHM6Wy4uLmldLG5ld1dvcmtEYXRhczpvfX1yZXR1cm57dHlwZTpsdC5Ob25lfX1jb25zdW1lQWxsKHQpe3JldHVybiB0aGlzLmNvbnN1bWUodCl9Y2xlYXJUbXBQb2ludHMoKXt0aGlzLnRtcFBvaW50cy5sZW5ndGg9MH1nZXRVbkxvY2tOb2RlTWFwKHQpe3ZhciBlO2lmKHRoaXMuc2VydmljZVdvcmspe2NvbnN0IG49WnQodCksYT10aGlzLnNlcnZpY2VXb3JrLnNlbGVjdG9yV29ya1NoYXBlcyxzPXRoaXMuc2VydmljZVdvcmsud29ya1NoYXBlcztmb3IoY29uc3QgaSBvZiBhLnZhbHVlcygpKWlmKChlPWkuc2VsZWN0SWRzKSE9bnVsbCYmZS5sZW5ndGgpZm9yKGNvbnN0IG8gb2YgaS5zZWxlY3RJZHMpbi5kZWxldGUobyk7Zm9yKGNvbnN0IGkgb2Ygcy5rZXlzKCkpbi5kZWxldGUoaSk7cmV0dXJuIG59cmV0dXJuIHR9fTtzdChQZSwiZXJhc2VyU2l6ZXMiLE9iamVjdC5mcmVlemUoW09iamVjdC5mcmVlemUoe3dpZHRoOjE4LGhlaWdodDoyNn0pLE9iamVjdC5mcmVlemUoe3dpZHRoOjI2LGhlaWdodDozNH0pLE9iamVjdC5mcmVlemUoe3dpZHRoOjM0LGhlaWdodDo1MH0pXSkpO2xldCBhZT1QZTtjb25zdCBWaD0iKysiLFloPSJzZWxlY3RvciIsWGg9ImFsbCI7dmFyIFpoPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjtmdW5jdGlvbiBKaChkKXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5zZXQoZCxaaCksdGhpc312YXIgUWg9Smg7ZnVuY3Rpb24ga2goZCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKGQpfXZhciBxaD1raCxfaD1Mcix0ZD1RaCxlZD1xaDtmdW5jdGlvbiBYZShkKXt2YXIgcj0tMSx0PWQ9PW51bGw/MDpkLmxlbmd0aDtmb3IodGhpcy5fX2RhdGFfXz1uZXcgX2g7KytyPHQ7KXRoaXMuYWRkKGRbcl0pfVhlLnByb3RvdHlwZS5hZGQ9WGUucHJvdG90eXBlLnB1c2g9dGQsWGUucHJvdG90eXBlLmhhcz1lZDt2YXIgcmQ9WGU7ZnVuY3Rpb24gbmQoZCxyKXtmb3IodmFyIHQ9LTEsZT1kPT1udWxsPzA6ZC5sZW5ndGg7Kyt0PGU7KWlmKHIoZFt0XSx0LGQpKXJldHVybiEwO3JldHVybiExfXZhciBpZD1uZDtmdW5jdGlvbiBzZChkLHIpe3JldHVybiBkLmhhcyhyKX12YXIgb2Q9c2QsYWQ9cmQsbGQ9aWQsY2Q9b2QsZmQ9MSx1ZD0yO2Z1bmN0aW9uIGhkKGQscix0LGUsbixhKXt2YXIgcz10JmZkLGk9ZC5sZW5ndGgsbz1yLmxlbmd0aDtpZihpIT1vJiYhKHMmJm8+aSkpcmV0dXJuITE7dmFyIGM9YS5nZXQoZCksbT1hLmdldChyKTtpZihjJiZtKXJldHVybiBjPT1yJiZtPT1kO3ZhciB1PS0xLHA9ITAseT10JnVkP25ldyBhZDp2b2lkIDA7Zm9yKGEuc2V0KGQsciksYS5zZXQocixkKTsrK3U8aTspe3ZhciBPPWRbdV0seD1yW3VdO2lmKGUpdmFyIHY9cz9lKHgsTyx1LHIsZCxhKTplKE8seCx1LGQscixhKTtpZih2IT09dm9pZCAwKXtpZih2KWNvbnRpbnVlO3A9ITE7YnJlYWt9aWYoeSl7aWYoIWxkKHIsZnVuY3Rpb24oVCxsKXtpZighY2QoeSxsKSYmKE89PT1UfHxuKE8sVCx0LGUsYSkpKXJldHVybiB5LnB1c2gobCl9KSl7cD0hMTticmVha319ZWxzZSBpZighKE89PT14fHxuKE8seCx0LGUsYSkpKXtwPSExO2JyZWFrfX1yZXR1cm4gYS5kZWxldGUoZCksYS5kZWxldGUocikscH12YXIgRW49aGQ7ZnVuY3Rpb24gZGQoZCl7dmFyIHI9LTEsdD1BcnJheShkLnNpemUpO3JldHVybiBkLmZvckVhY2goZnVuY3Rpb24oZSxuKXt0Wysrcl09W24sZV19KSx0fXZhciBnZD1kZDtmdW5jdGlvbiBwZChkKXt2YXIgcj0tMSx0PUFycmF5KGQuc2l6ZSk7cmV0dXJuIGQuZm9yRWFjaChmdW5jdGlvbihlKXt0Wysrcl09ZX0pLHR9dmFyIG1kPXBkLFBuPXdlLEFuPW5uLHZkPVFlLHlkPUVuLFNkPWdkLHhkPW1kLFRkPTEsTWQ9MixPZD0iW29iamVjdCBCb29sZWFuXSIsRWQ9IltvYmplY3QgRGF0ZV0iLFBkPSJbb2JqZWN0IEVycm9yXSIsQWQ9IltvYmplY3QgTWFwXSIsQ2Q9IltvYmplY3QgTnVtYmVyXSIsUmQ9IltvYmplY3QgUmVnRXhwXSIsSWQ9IltvYmplY3QgU2V0XSIsTGQ9IltvYmplY3QgU3RyaW5nXSIsYmQ9IltvYmplY3QgU3ltYm9sXSIsRGQ9IltvYmplY3QgQXJyYXlCdWZmZXJdIix3ZD0iW29iamVjdCBEYXRhVmlld10iLENuPVBuP1BuLnByb3RvdHlwZTp2b2lkIDAscHI9Q24/Q24udmFsdWVPZjp2b2lkIDA7ZnVuY3Rpb24gTmQoZCxyLHQsZSxuLGEscyl7c3dpdGNoKHQpe2Nhc2Ugd2Q6aWYoZC5ieXRlTGVuZ3RoIT1yLmJ5dGVMZW5ndGh8fGQuYnl0ZU9mZnNldCE9ci5ieXRlT2Zmc2V0KXJldHVybiExO2Q9ZC5idWZmZXIscj1yLmJ1ZmZlcjtjYXNlIERkOnJldHVybiEoZC5ieXRlTGVuZ3RoIT1yLmJ5dGVMZW5ndGh8fCFhKG5ldyBBbihkKSxuZXcgQW4ocikpKTtjYXNlIE9kOmNhc2UgRWQ6Y2FzZSBDZDpyZXR1cm4gdmQoK2QsK3IpO2Nhc2UgUGQ6cmV0dXJuIGQubmFtZT09ci5uYW1lJiZkLm1lc3NhZ2U9PXIubWVzc2FnZTtjYXNlIFJkOmNhc2UgTGQ6cmV0dXJuIGQ9PXIrIiI7Y2FzZSBBZDp2YXIgaT1TZDtjYXNlIElkOnZhciBvPWUmVGQ7aWYoaXx8KGk9eGQpLGQuc2l6ZSE9ci5zaXplJiYhbylyZXR1cm4hMTt2YXIgYz1zLmdldChkKTtpZihjKXJldHVybiBjPT1yO2V8PU1kLHMuc2V0KGQscik7dmFyIG09eWQoaShkKSxpKHIpLGUsbixhLHMpO3JldHVybiBzLmRlbGV0ZShkKSxtO2Nhc2UgYmQ6aWYocHIpcmV0dXJuIHByLmNhbGwoZCk9PXByLmNhbGwocil9cmV0dXJuITF9dmFyIEJkPU5kLFJuPVFyLFdkPTEsRmQ9T2JqZWN0LnByb3RvdHlwZSxqZD1GZC5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBVZChkLHIsdCxlLG4sYSl7dmFyIHM9dCZXZCxpPVJuKGQpLG89aS5sZW5ndGgsYz1SbihyKSxtPWMubGVuZ3RoO2lmKG8hPW0mJiFzKXJldHVybiExO2Zvcih2YXIgdT1vO3UtLTspe3ZhciBwPWlbdV07aWYoIShzP3AgaW4gcjpqZC5jYWxsKHIscCkpKXJldHVybiExfXZhciB5PWEuZ2V0KGQpLE89YS5nZXQocik7aWYoeSYmTylyZXR1cm4geT09ciYmTz09ZDt2YXIgeD0hMDthLnNldChkLHIpLGEuc2V0KHIsZCk7Zm9yKHZhciB2PXM7Kyt1PG87KXtwPWlbdV07dmFyIFQ9ZFtwXSxsPXJbcF07aWYoZSl2YXIgaD1zP2UobCxULHAscixkLGEpOmUoVCxsLHAsZCxyLGEpO2lmKCEoaD09PXZvaWQgMD9UPT09bHx8bihULGwsdCxlLGEpOmgpKXt4PSExO2JyZWFrfXZ8fCh2PXA9PSJjb25zdHJ1Y3RvciIpfWlmKHgmJiF2KXt2YXIgZj1kLmNvbnN0cnVjdG9yLGc9ci5jb25zdHJ1Y3RvcjtmIT1nJiYiY29uc3RydWN0b3IiaW4gZCYmImNvbnN0cnVjdG9yImluIHImJiEodHlwZW9mIGY9PSJmdW5jdGlvbiImJmYgaW5zdGFuY2VvZiBmJiZ0eXBlb2YgZz09ImZ1bmN0aW9uIiYmZyBpbnN0YW5jZW9mIGcpJiYoeD0hMSl9cmV0dXJuIGEuZGVsZXRlKGQpLGEuZGVsZXRlKHIpLHh9dmFyICRkPVVkLG1yPWJyLHpkPUVuLEdkPUJkLEhkPSRkLEluPXplLExuPUZlLGJuPV9lLEtkPSRyLFZkPTEsRG49IltvYmplY3QgQXJndW1lbnRzXSIsd249IltvYmplY3QgQXJyYXldIixaZT0iW29iamVjdCBPYmplY3RdIixZZD1PYmplY3QucHJvdG90eXBlLE5uPVlkLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIFhkKGQscix0LGUsbixhKXt2YXIgcz1MbihkKSxpPUxuKHIpLG89cz93bjpJbihkKSxjPWk/d246SW4ocik7bz1vPT1Ebj9aZTpvLGM9Yz09RG4/WmU6Yzt2YXIgbT1vPT1aZSx1PWM9PVplLHA9bz09YztpZihwJiZibihkKSl7aWYoIWJuKHIpKXJldHVybiExO3M9ITAsbT0hMX1pZihwJiYhbSlyZXR1cm4gYXx8KGE9bmV3IG1yKSxzfHxLZChkKT96ZChkLHIsdCxlLG4sYSk6R2QoZCxyLG8sdCxlLG4sYSk7aWYoISh0JlZkKSl7dmFyIHk9bSYmTm4uY2FsbChkLCJfX3dyYXBwZWRfXyIpLE89dSYmTm4uY2FsbChyLCJfX3dyYXBwZWRfXyIpO2lmKHl8fE8pe3ZhciB4PXk/ZC52YWx1ZSgpOmQsdj1PP3IudmFsdWUoKTpyO3JldHVybiBhfHwoYT1uZXcgbXIpLG4oeCx2LHQsZSxhKX19cmV0dXJuIHA/KGF8fChhPW5ldyBtciksSGQoZCxyLHQsZSxuLGEpKTohMX12YXIgWmQ9WGQsSmQ9WmQsQm49aWU7ZnVuY3Rpb24gV24oZCxyLHQsZSxuKXtyZXR1cm4gZD09PXI/ITA6ZD09bnVsbHx8cj09bnVsbHx8IUJuKGQpJiYhQm4ocik/ZCE9PWQmJnIhPT1yOkpkKGQscix0LGUsV24sbil9dmFyIFFkPVduLGtkPVFkO2Z1bmN0aW9uIHFkKGQscil7cmV0dXJuIGtkKGQscil9dmFyIF9kPXFkLHZyPVh0KF9kKTtjb25zdCBfdD1jbGFzcyBfdCBleHRlbmRzIHl0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO3N0KHRoaXMsInRvb2xzVHlwZSIsZ3QuU2VsZWN0b3IpO3N0KHRoaXMsInRtcFBvaW50cyIsW10pO3N0KHRoaXMsIndvcmtPcHRpb25zIik7c3QodGhpcywic2VsZWN0SWRzIik7c3QodGhpcywic2VsZWN0b3JDb2xvciIpO3N0KHRoaXMsInN0cm9rZUNvbG9yIik7c3QodGhpcywiZmlsbENvbG9yIik7c3QodGhpcywib2xkU2VsZWN0UmVjdCIpO3N0KHRoaXMsImNhblJvdGF0ZSIsITEpO3N0KHRoaXMsImNhblRleHRFZGl0IiwhMSk7c3QodGhpcywiY2FuTG9jayIsITEpO3N0KHRoaXMsInNjYWxlVHlwZSIsRnQuYWxsKTtzdCh0aGlzLCJ0b29sc1R5cGVzIik7c3QodGhpcywic2hhcGVPcHQiKTtzdCh0aGlzLCJ0ZXh0T3B0Iik7c3QodGhpcywiaXNMb2NrZWQiKTt0aGlzLndvcmtPcHRpb25zPXQudG9vbHNPcHR9Y29tcHV0U2VsZWN0b3IodD0hMCl7Y29uc3QgZT1CdCh0aGlzLnRtcFBvaW50cyk7aWYoZS53PT09MHx8ZS5oPT09MClyZXR1cm57c2VsZWN0SWRzOltdLGludGVyc2VjdFJlY3Q6dm9pZCAwLHN1Yk5vZGVNYXA6bmV3IE1hcH07Y29uc3R7cmVjdFJhbmdlOm4sbm9kZVJhbmdlOmF9PXRoaXMudk5vZGVzLmdldFJlY3RJbnRlcnNlY3RSYW5nZShlLHQpO3JldHVybntzZWxlY3RJZHM6Wy4uLmEua2V5cygpXSxpbnRlcnNlY3RSZWN0Om4sc3ViTm9kZU1hcDphfX11cGRhdGVUZW1wUG9pbnRzKHQpe2NvbnN0IGU9dGhpcy50bXBQb2ludHMubGVuZ3RoLG49dC5sZW5ndGg7aWYobj4xKXtjb25zdCBhPW5ldyBNdCh0W24tMl0qdGhpcy5mdWxsTGF5ZXIud29ybGRTY2FsaW5nWzBdK3RoaXMuZnVsbExheWVyLndvcmxkUG9zaXRpb25bMF0sdFtuLTFdKnRoaXMuZnVsbExheWVyLndvcmxkU2NhbGluZ1swXSt0aGlzLmZ1bGxMYXllci53b3JsZFBvc2l0aW9uWzFdKTtlPT09Mj90aGlzLnRtcFBvaW50cy5zcGxpY2UoMSwxLGEpOnRoaXMudG1wUG9pbnRzLnB1c2goYSl9fWRyYXdTZWxlY3Rvcih0KXtjb25zdHtkcmF3UmVjdDplLHN1Yk5vZGVNYXA6bixzZWxlY3RvcklkOmEsbGF5ZXI6cyxpc1NlcnZpY2U6aX09dCxvPW5ldyByZSh7cG9zOltlLngsZS55XSxhbmNob3I6WzAsMF0sc2l6ZTpbZS53LGUuaF0saWQ6YSxuYW1lOmEsekluZGV4OjFlM30pLGM9W107aWYoaSl7Y29uc3QgbT1uZXcgaHIoe25vcm1hbGl6ZTohMCxwb3M6W2Uudy8yLGUuaC8yXSxsaW5lV2lkdGg6MSxzdHJva2VDb2xvcjp0aGlzLnNlbGVjdG9yQ29sb3J8fHRoaXMud29ya09wdGlvbnMuc3Ryb2tlQ29sb3Isd2lkdGg6ZS53LGhlaWdodDplLmgsbmFtZTpfdC5zZWxlY3RvckJvcmRlcklkfSk7Yy5wdXNoKG0pfW4uZm9yRWFjaCgobSx1KT0+e2NvbnN0IHA9W20ucmVjdC54K20ucmVjdC53LzItZS54LG0ucmVjdC55K20ucmVjdC5oLzItZS55XSx5PW5ldyBocih7bm9ybWFsaXplOiEwLHBvczpwLGxpbmVXaWR0aDoxLHN0cm9rZUNvbG9yOm4uc2l6ZT4xP3RoaXMuc2VsZWN0b3JDb2xvcnx8dGhpcy53b3JrT3B0aW9ucy5zdHJva2VDb2xvcjp2b2lkIDAsd2lkdGg6bS5yZWN0LncsaGVpZ2h0Om0ucmVjdC5oLGlkOmBzZWxlY3Rvci0ke3V9YCxuYW1lOmBzZWxlY3Rvci0ke3V9YH0pO2MucHVzaCh5KX0pLGMmJm8uYXBwZW5kKC4uLmMpLChzPT1udWxsP3ZvaWQgMDpzLnBhcmVudCkuYXBwZW5kQ2hpbGQobyl9ZHJhdyh0LGUsbixhPSExKXt2YXIgbyxjO2NvbnN0e2ludGVyc2VjdFJlY3Q6cyxzdWJOb2RlTWFwOml9PW47KGM9KG89ZS5wYXJlbnQpPT1udWxsP3ZvaWQgMDpvLmdldEVsZW1lbnRCeUlkKHQpKT09bnVsbHx8Yy5yZW1vdmUoKSxzJiZ0aGlzLmRyYXdTZWxlY3Rvcih7ZHJhd1JlY3Q6cyxzdWJOb2RlTWFwOmksc2VsZWN0b3JJZDp0LGxheWVyOmUsaXNTZXJ2aWNlOmF9KX1nZXRTZWxlY3Rlb3JJbmZvKHQpe3RoaXMuc2NhbGVUeXBlPUZ0LmFsbCx0aGlzLmNhblJvdGF0ZT0hMSx0aGlzLnRleHRPcHQ9dm9pZCAwLHRoaXMuc3Ryb2tlQ29sb3I9dm9pZCAwLHRoaXMuZmlsbENvbG9yPXZvaWQgMCx0aGlzLmNhblRleHRFZGl0PSExLHRoaXMuY2FuTG9jaz0hMSx0aGlzLmlzTG9ja2VkPSExLHRoaXMudG9vbHNUeXBlcz12b2lkIDAsdGhpcy5zaGFwZU9wdD12b2lkIDA7Y29uc3QgZT1uZXcgU2V0O2xldCBuO2Zvcihjb25zdCBhIG9mIHQudmFsdWVzKCkpe2NvbnN0e29wdDpzLGNhblJvdGF0ZTppLHNjYWxlVHlwZTpvLHRvb2xzVHlwZTpjfT1hO3RoaXMuc2VsZWN0b3JDb2xvcj10aGlzLndvcmtPcHRpb25zLnN0cm9rZUNvbG9yLHMuc3Ryb2tlQ29sb3ImJih0aGlzLnN0cm9rZUNvbG9yPXMuc3Ryb2tlQ29sb3IpLHMuZmlsbENvbG9yJiYodGhpcy5maWxsQ29sb3I9cy5maWxsQ29sb3IpLHMudGV4dE9wdCYmKHRoaXMudGV4dE9wdD1zLnRleHRPcHQpLGM9PT1ndC5TcGVlY2hCYWxsb29uJiYoZS5hZGQoYyksdGhpcy5zaGFwZU9wdHx8KHRoaXMuc2hhcGVPcHQ9e30pLHRoaXMuc2hhcGVPcHQucGxhY2VtZW50PXMucGxhY2VtZW50KSxjPT09Z3QuUG9seWdvbiYmKGUuYWRkKGMpLHRoaXMuc2hhcGVPcHR8fCh0aGlzLnNoYXBlT3B0PXt9KSx0aGlzLnNoYXBlT3B0LnZlcnRpY2VzPXMudmVydGljZXMpLGM9PT1ndC5TdGFyJiYoZS5hZGQoYyksdGhpcy5zaGFwZU9wdHx8KHRoaXMuc2hhcGVPcHQ9e30pLHRoaXMuc2hhcGVPcHQudmVydGljZXM9cy52ZXJ0aWNlcyx0aGlzLnNoYXBlT3B0LmlubmVyUmF0aW89cy5pbm5lclJhdGlvLHRoaXMuc2hhcGVPcHQuaW5uZXJWZXJ0aWNlU3RlcD1zLmlubmVyVmVydGljZVN0ZXApLGM9PT1ndC5UZXh0JiYodGhpcy50ZXh0T3B0PXMpLHQuc2l6ZT09PTEmJih0aGlzLnRleHRPcHQmJih0aGlzLmNhblRleHRFZGl0PSEwKSx0aGlzLmNhblJvdGF0ZT1pLHRoaXMuc2NhbGVUeXBlPW8pLG89PT1GdC5ub25lJiYodGhpcy5zY2FsZVR5cGU9byksYz09PWd0LkltYWdlJiYobj1hKX1lLnNpemUmJih0aGlzLnRvb2xzVHlwZXM9Wy4uLmVdKSxuJiYodC5zaXplPT09MT8odGhpcy5jYW5Mb2NrPSEwLG4ub3B0LmxvY2tlZCYmKHRoaXMuaXNMb2NrZWQ9ITAsdGhpcy5zY2FsZVR5cGU9RnQubm9uZSx0aGlzLmNhblJvdGF0ZT0hMSx0aGlzLnRleHRPcHQ9dm9pZCAwLHRoaXMuZmlsbENvbG9yPXZvaWQgMCx0aGlzLnNlbGVjdG9yQ29sb3I9InJnYigxNzcsMTc3LDE3NykiLHRoaXMuc3Ryb2tlQ29sb3I9dm9pZCAwLHRoaXMuY2FuVGV4dEVkaXQ9ITEpKTp0LnNpemU+MSYmIW4ub3B0LmxvY2tlZCYmKHRoaXMuY2FuTG9jaz0hMSx0aGlzLmNhblJvdGF0ZT0hMSkpfWdldENoaWxkcmVuUG9pbnRzKCl7dmFyIHQ7aWYodGhpcy5zY2FsZVR5cGU9PT1GdC5ib3RoJiZ0aGlzLnNlbGVjdElkcyl7Y29uc3QgZT10aGlzLnNlbGVjdElkc1swXSxuPSh0PXRoaXMudk5vZGVzLmdldChlKSk9PW51bGw/dm9pZCAwOnQub3A7aWYobil7Y29uc3QgYT1bXTtmb3IobGV0IHM9MDtzPG4ubGVuZ3RoO3MrPTMpYS5wdXNoKFtuW3NdLG5bcysxXV0pO3JldHVybiBhfX19Y29uc3VtZSh0KXtjb25zdHtvcDplLHdvcmtTdGF0ZTpufT10LmRhdGE7bGV0IGE9dGhpcy5vbGRTZWxlY3RSZWN0O2lmKG49PT1JdC5TdGFydCYmKGE9dGhpcy5iYWNrVG9GdWxsTGF5ZXIoKSksIShlIT1udWxsJiZlLmxlbmd0aCl8fCF0aGlzLnZOb2Rlcy5jdXJOb2RlTWFwLnNpemUpcmV0dXJue3R5cGU6bHQuTm9uZX07dGhpcy51cGRhdGVUZW1wUG9pbnRzKGUpO2NvbnN0IHM9dGhpcy5jb21wdXRTZWxlY3RvcigpO2lmKHRoaXMuc2VsZWN0SWRzJiZJaCh0aGlzLnNlbGVjdElkcyxzLnNlbGVjdElkcykpcmV0dXJue3R5cGU6bHQuTm9uZX07dGhpcy5zZWxlY3RJZHM9cy5zZWxlY3RJZHM7Y29uc3QgaT1zLmludGVyc2VjdFJlY3Q7dGhpcy5nZXRTZWxlY3Rlb3JJbmZvKHMuc3ViTm9kZU1hcCksdGhpcy5kcmF3KF90LnNlbGVjdG9ySWQsdGhpcy5kcmF3TGF5ZXJ8fHRoaXMuZnVsbExheWVyLHMpLHRoaXMub2xkU2VsZWN0UmVjdD1pO2NvbnN0IG89dGhpcy5nZXRDaGlsZHJlblBvaW50cygpO3JldHVybnt0eXBlOmx0LlNlbGVjdCxkYXRhVHlwZTpUdC5Mb2NhbCxyZWN0Ok90KGksYSksc2VsZWN0SWRzOnMuc2VsZWN0SWRzLG9wdDp0aGlzLndvcmtPcHRpb25zLHNlbGVjdFJlY3Q6aSxzZWxlY3RvckNvbG9yOnRoaXMuc2VsZWN0b3JDb2xvcixzdHJva2VDb2xvcjp0aGlzLnN0cm9rZUNvbG9yLGZpbGxDb2xvcjp0aGlzLmZpbGxDb2xvcix0ZXh0T3B0OnRoaXMudGV4dE9wdCxjYW5UZXh0RWRpdDp0aGlzLmNhblRleHRFZGl0LGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxjYW5Mb2NrOnRoaXMuY2FuTG9jayxzY2FsZVR5cGU6dGhpcy5zY2FsZVR5cGUsd2lsbFN5bmNTZXJ2aWNlOiEwLHBvaW50czpvLGlzTG9ja2VkOnRoaXMuaXNMb2NrZWQsdG9vbHNUeXBlczp0aGlzLnRvb2xzVHlwZXMsc2hhcGVPcHQ6dGhpcy5zaGFwZU9wdH19Y29uc3VtZUFsbCh0KXt2YXIgZSxuO2lmKCEoKGU9dGhpcy5zZWxlY3RJZHMpIT1udWxsJiZlLmxlbmd0aCkmJnRoaXMudG1wUG9pbnRzWzBdJiZ0aGlzLnNlbGVjdFNpbmdsZVRvb2wodGhpcy50bXBQb2ludHNbMF0uWFksX3Quc2VsZWN0b3JJZCwhMSx0PT1udWxsP3ZvaWQgMDp0LmhvdmVySWQpLChuPXRoaXMuc2VsZWN0SWRzKSE9bnVsbCYmbi5sZW5ndGgmJnRoaXMuc2VhbFRvRHJhd0xheWVyKHRoaXMuc2VsZWN0SWRzKSx0aGlzLm9sZFNlbGVjdFJlY3Qpe2NvbnN0IGE9dGhpcy5nZXRDaGlsZHJlblBvaW50cygpO3JldHVybnt0eXBlOmx0LlNlbGVjdCxkYXRhVHlwZTpUdC5Mb2NhbCxyZWN0OnRoaXMub2xkU2VsZWN0UmVjdCxzZWxlY3RJZHM6dGhpcy5zZWxlY3RJZHMsb3B0OnRoaXMud29ya09wdGlvbnMsc2VsZWN0b3JDb2xvcjp0aGlzLnNlbGVjdG9yQ29sb3Isc2VsZWN0UmVjdDp0aGlzLm9sZFNlbGVjdFJlY3Qsc3Ryb2tlQ29sb3I6dGhpcy5zdHJva2VDb2xvcixmaWxsQ29sb3I6dGhpcy5maWxsQ29sb3IsdGV4dE9wdDp0aGlzLnRleHRPcHQsY2FuVGV4dEVkaXQ6dGhpcy5jYW5UZXh0RWRpdCxjYW5Sb3RhdGU6dGhpcy5jYW5Sb3RhdGUsY2FuTG9jazp0aGlzLmNhbkxvY2ssc2NhbGVUeXBlOnRoaXMuc2NhbGVUeXBlLHdpbGxTeW5jU2VydmljZTohMCxwb2ludHM6YSxpc0xvY2tlZDp0aGlzLmlzTG9ja2VkLHRvb2xzVHlwZXM6dGhpcy50b29sc1R5cGVzLHNoYXBlT3B0OnRoaXMuc2hhcGVPcHR9fXJldHVybnt0eXBlOmx0Lk5vbmV9fWNvbnN1bWVTZXJ2aWNlKCl7fWNsZWFyVG1wUG9pbnRzKCl7dGhpcy50bXBQb2ludHMubGVuZ3RoPTB9Y2xlYXJTZWxlY3REYXRhKCl7dGhpcy5zZWxlY3RJZHM9dm9pZCAwLHRoaXMub2xkU2VsZWN0UmVjdD12b2lkIDB9c2VsZWN0U2luZ2xlVG9vbCh0LGU9X3Quc2VsZWN0b3JJZCxuPSExLGEpe2lmKHQubGVuZ3RoPT09Mil7Y29uc3Qgcz10WzBdLGk9dFsxXTtsZXQgbztmb3IoY29uc3QgYyBvZiB0aGlzLmZ1bGxMYXllci5jaGlsZHJlbil7Y29uc3QgbT1ZbihbY10pO2xldCB1PSExO2lmKChhJiZhPT09Yy5uYW1lfHwhMSkmJm0uZmluZCh5PT55LmlzUG9pbnRDb2xsaXNpb24ocyxpKSkpe289YzticmVha31mb3IoY29uc3QgeSBvZiBtKWlmKHU9eS5pc1BvaW50Q29sbGlzaW9uKHMsaSksdSl7aWYoIW8pbz1jO2Vsc2V7Y29uc3QgTz10aGlzLnZOb2Rlcy5nZXQoYy5uYW1lKSx4PXRoaXMudk5vZGVzLmdldChvLm5hbWUpO2lmKChPPT1udWxsP3ZvaWQgMDpPLnRvb2xzVHlwZSkhPT1ndC5UZXh0JiYoeD09bnVsbD92b2lkIDA6eC50b29sc1R5cGUpPT09Z3QuVGV4dClicmVhaztpZigoTz09bnVsbD92b2lkIDA6Ty50b29sc1R5cGUpPT09Z3QuVGV4dCYmKHg9PW51bGw/dm9pZCAwOngudG9vbHNUeXBlKSE9PWd0LlRleHQpbz1jO2Vsc2V7Y29uc3Qgdj0oTz09bnVsbD92b2lkIDA6Ty5vcHQuekluZGV4KXx8MCxUPSh4PT1udWxsP3ZvaWQgMDp4Lm9wdC56SW5kZXgpfHwwO051bWJlcih2KT49TnVtYmVyKFQpJiYobz1jKX19YnJlYWt9fWlmKG8pe2NvbnN0IGM9by5uYW1lLG09dGhpcy52Tm9kZXMuZ2V0KGMpO2lmKG0pe2lmKCF2cih0aGlzLm9sZFNlbGVjdFJlY3QsbS5yZWN0KSl7Y29uc3QgdT1uZXcgTWFwKFtbYyxtXV0pO3RoaXMuZ2V0U2VsZWN0ZW9ySW5mbyh1KSx0aGlzLmRyYXcoZSx0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXIse2ludGVyc2VjdFJlY3Q6bS5yZWN0LHN1Yk5vZGVNYXA6dSxzZWxlY3RJZHM6dGhpcy5zZWxlY3RJZHN8fFtdfSxuKX10aGlzLnNlbGVjdElkcz1bY10sdGhpcy5vbGRTZWxlY3RSZWN0PW0ucmVjdH19fX1iYWNrVG9GdWxsTGF5ZXIodCl7dmFyIHMsaTtsZXQgZTtjb25zdCBuPVtdLGE9W107Zm9yKGNvbnN0IG8gb2YoKHM9dGhpcy5kcmF3TGF5ZXIpPT1udWxsP3ZvaWQgMDpzLmNoaWxkcmVuKXx8W10paWYoISh0IT1udWxsJiZ0Lmxlbmd0aCYmIXQuaW5jbHVkZXMoby5pZCkpJiZvLmlkIT09X3Quc2VsZWN0b3JJZCl7Y29uc3QgYz1vLmNsb25lTm9kZSghMCk7SGUobykmJmMuc2VhbCgpLHRoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKG8ubmFtZSkubGVuZ3RofHxuLnB1c2goYyksYS5wdXNoKG8pO2NvbnN0IG09KGk9dGhpcy52Tm9kZXMuZ2V0KG8ubmFtZSkpPT1udWxsP3ZvaWQgMDppLnJlY3Q7bSYmKGU9T3QoZSxtKSl9cmV0dXJuIGEuZm9yRWFjaChvPT5vLnJlbW92ZSgpKSxuLmxlbmd0aCYmdGhpcy5mdWxsTGF5ZXIuYXBwZW5kKC4uLm4pLGV9c2VhbFRvRHJhd0xheWVyKHQpe3ZhciBhO2NvbnN0IGU9W10sbj1bXTt0LmZvckVhY2gocz0+e3RoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKHMudG9TdHJpbmcoKSkuZm9yRWFjaChpPT57dmFyIGM7Y29uc3Qgbz1pLmNsb25lTm9kZSghMCk7SGUoaSkmJm8uc2VhbCgpLChjPXRoaXMuZHJhd0xheWVyKSE9bnVsbCYmYy5nZXRFbGVtZW50c0J5TmFtZShpLm5hbWUpLmxlbmd0aHx8ZS5wdXNoKG8pLG4ucHVzaChpKX0pfSksbi5mb3JFYWNoKHM9PnMucmVtb3ZlKCkpLGUmJigoYT10aGlzLmRyYXdMYXllcik9PW51bGx8fGEuYXBwZW5kKC4uLmUpKX1nZXRTZWxlY3RvclJlY3QodCxlKXt2YXIgaTtsZXQgbjtjb25zdCBhPShpPXQucGFyZW50KT09bnVsbD92b2lkIDA6aS5nZXRFbGVtZW50QnlJZChlKSxzPWE9PW51bGw/dm9pZCAwOmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuIHMmJihuPU90KG4se3g6TWF0aC5mbG9vcihzLngpLHk6TWF0aC5mbG9vcihzLnkpLHc6TWF0aC5yb3VuZChzLndpZHRoKSxoOk1hdGgucm91bmQocy5oZWlnaHQpfSkpLG59aXNDYW5GaWxsQ29sb3IodCl7cmV0dXJuIHQ9PT1ndC5FbGxpcHNlfHx0PT09Z3QuVHJpYW5nbGV8fHQ9PT1ndC5SZWN0YW5nbGV8fHQ9PT1ndC5Qb2x5Z29ufHx0PT09Z3QuU3Rhcnx8dD09PWd0LlNwZWVjaEJhbGxvb259YXN5bmMgdXBkYXRlU2VsZWN0b3IodCl7Y29uc3R7dXBkYXRlU2VsZWN0b3JPcHQ6ZSxzZWxlY3RJZHM6bix2Tm9kZXM6YSx3aWxsU2VyaWFsaXplRGF0YTpzLHdvcmtlcjppLG9mZnNldDpvLHNjZW5lOmN9PXQsbT10aGlzLmRyYXdMYXllcjtpZighbSlyZXR1cm47bGV0IHU7Y29uc3QgcD1uZXcgTWFwLHtib3g6eSx3b3JrU3RhdGU6TyxhbmdsZTp4LHRyYW5zbGF0ZTp2fT1lO2xldCBUPVswLDBdLGw9WzEsMV0saD1bMCwwXSxmLGc7aWYoeXx8dnx8b2UoeCkpe2lmKE89PT1JdC5TdGFydClyZXR1cm4gYS5zZXRUYXJnZXQoKSx7dHlwZTpsdC5TZWxlY3QsZGF0YVR5cGU6VHQuTG9jYWwsc2VsZWN0UmVjdDp0aGlzLm9sZFNlbGVjdFJlY3QscmVjdDp0aGlzLm9sZFNlbGVjdFJlY3R9O2lmKGY9YS5nZXRMYXN0VGFyZ2V0KCksZiYmeSl7bGV0IEM7bj09bnVsbHx8bi5mb3JFYWNoKGI9Pntjb25zdCBFPWY9PW51bGw/dm9pZCAwOmYuZ2V0KGIpO0M9T3QoQyxFPT1udWxsP3ZvaWQgMDpFLnJlY3QpfSksQyYmKGw9W3kudy9DLncseS5oL0MuaF0sVD1beS54K3kudy8yLShDLngrQy53LzIpLHkueSt5LmgvMi0oQy55K0MuaC8yKV0saD1bQy54K0Mudy8yLEMueStDLmgvMl0pLGc9Q319aWYobilmb3IoY29uc3QgQyBvZiBuKXtjb25zdCBiPWEuZ2V0KEMpO2lmKGIpe2NvbnN0e3Rvb2xzVHlwZTpFfT1iO2xldCBMPShtPT1udWxsP3ZvaWQgMDptLmdldEVsZW1lbnRzQnlOYW1lKEMpKVswXTtpZihMKXtjb25zdCBEPXsuLi5lfTtsZXQgSTtpZihFKXtpZihmJiYoST1mLmdldChDKSxJJiZ5KSl7RC5ib3hTY2FsZT1sO2NvbnN0IEI9W0kucmVjdC54K0kucmVjdC53LzIsSS5yZWN0LnkrSS5yZWN0LmgvMl0sej1bQlswXS1oWzBdLEJbMV0taFsxXV07RC5ib3hUcmFuc2xhdGU9W3pbMF0qKGxbMF0tMSkrVFswXSsobyYmb1swXXx8MCkselsxXSoobFsxXS0xKStUWzFdKyhvJiZvWzFdfHwwKV19Y29uc3QgUj1WbihFKTtpZihSPT1udWxsfHxSLnVwZGF0ZU5vZGVPcHQoe25vZGU6TCxvcHQ6RCx2Tm9kZXM6YSx3aWxsU2VyaWFsaXplRGF0YTpzLHRhcmdldE5vZGU6SX0pLGImJmkmJihzJiYoRC5hbmdsZXx8RC50cmFuc2xhdGUpfHxELmJveCYmRC53b3JrU3RhdGUhPT1JdC5TdGFydHx8RC5wb2ludE1hcCYmRC5wb2ludE1hcC5oYXMoQyl8fEU9PT1ndC5UZXh0JiYoRC5mb250U2l6ZXx8RC50cmFuc2xhdGV8fEQudGV4dEluZm9zJiZELnRleHRJbmZvcy5nZXQoQykpfHxFPT09Z3QuSW1hZ2UmJihELmFuZ2xlfHxELnRyYW5zbGF0ZXx8RC5ib3hTY2FsZSl8fEU9PT1ELnRvb2xzVHlwZSYmRC53aWxsUmVmcmVzaCkpe2NvbnN0IEI9aS5jcmVhdGVXb3JrU2hhcGVOb2RlKHt0b29sc1R5cGU6RSx0b29sc09wdDpiLm9wdH0pO0I9PW51bGx8fEIuc2V0V29ya0lkKEMpO2xldCB6O0U9PT1ndC5JbWFnZSYmYz96PWF3YWl0IEIuY29uc3VtZVNlcnZpY2VBc3luYyh7aXNGdWxsV29yazohMSxyZXBsYWNlSWQ6QyxzY2VuZTpjfSk6ej1CPT1udWxsP3ZvaWQgMDpCLmNvbnN1bWVTZXJ2aWNlKHtvcDpiLm9wLGlzRnVsbFdvcms6ITEscmVwbGFjZUlkOkMsaXNDbGVhckFsbDohMX0pLHomJihiLnJlY3Q9eiksTD0obT09bnVsbD92b2lkIDA6bS5nZXRFbGVtZW50c0J5TmFtZShDKSlbMF19YiYmKHAuc2V0KEMsYiksdT1PdCh1LGIucmVjdCkpfX19fWYmJk89PT1JdC5Eb25lJiZhLmRlbGV0ZUxhc3RUYXJnZXQoKTtjb25zdCBNPXU7aWYoZyYmZS5kaXImJk0pe2xldCBDPVswLDBdO3N3aXRjaChlLmRpcil7Y2FzZSJ0b3BMZWZ0IjpjYXNlImxlZnQiOntjb25zdCBiPVtnLngrZy53LGcueStnLmhdO0M9W2JbMF0tKE0ueCtNLncpLGJbMV0tKE0ueStNLmgpXTticmVha31jYXNlImJvdHRvbUxlZnQiOmNhc2UiYm90dG9tIjp7Y29uc3QgYj1bZy54K2cudyxnLnldO0M9W2JbMF0tKE0ueCtNLncpLGJbMV0tTS55XTticmVha31jYXNlInRvcFJpZ2h0IjpjYXNlInRvcCI6e2NvbnN0IGI9W2cueCxnLnkrZy5oXTtDPVtiWzBdLU0ueCxiWzFdLShNLnkrTS5oKV07YnJlYWt9Y2FzZSJyaWdodCI6Y2FzZSJib3R0b21SaWdodCI6e2NvbnN0IGI9W2cueCxnLnldO0M9W2JbMF0tTS54LGJbMV0tTS55XTticmVha319aWYoQ1swXXx8Q1sxXSlyZXR1cm4gTS54PU0ueCtDWzBdLE0ueT1NLnkrQ1sxXSxhd2FpdCB0aGlzLnVwZGF0ZVNlbGVjdG9yKHsuLi50LG9mZnNldDpDfSl9dGhpcy5nZXRTZWxlY3Rlb3JJbmZvKHApLHRoaXMuZHJhdyhfdC5zZWxlY3RvcklkLG0se3NlbGVjdElkczpufHxbXSxzdWJOb2RlTWFwOnAsaW50ZXJzZWN0UmVjdDpNfSk7Y29uc3QgQT1PdCh0aGlzLm9sZFNlbGVjdFJlY3QsdSk7cmV0dXJuIHRoaXMub2xkU2VsZWN0UmVjdD11LHt0eXBlOmx0LlNlbGVjdCxkYXRhVHlwZTpUdC5Mb2NhbCxzZWxlY3RSZWN0Ok0scmVuZGVyUmVjdDp1LHJlY3Q6T3QoQSxNKX19Ymx1clNlbGVjdG9yKCl7Y29uc3QgdD10aGlzLmJhY2tUb0Z1bGxMYXllcigpO3JldHVybnt0eXBlOmx0LlNlbGVjdCxkYXRhVHlwZTpUdC5Mb2NhbCxyZWN0OnQsc2VsZWN0SWRzOltdLHdpbGxTeW5jU2VydmljZTohMH19Z2V0UmlnaHRTZXJ2aWNlSWQodCl7cmV0dXJuIHQucmVwbGFjZSgiKysiLCItIil9c2VsZWN0U2VydmljZU5vZGUodCxlLG4pe2NvbnN0e3NlbGVjdElkczphfT1lLHM9dGhpcy5nZXRSaWdodFNlcnZpY2VJZCh0KSxpPXRoaXMuZ2V0U2VsZWN0b3JSZWN0KHRoaXMuZnVsbExheWVyLHMpO2xldCBvO2NvbnN0IGM9bmV3IE1hcDtyZXR1cm4gYT09bnVsbHx8YS5mb3JFYWNoKG09Pntjb25zdCB1PXRoaXMudk5vZGVzLmdldChtKSxwPXRoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKG0pWzBdO3UmJnAmJihvPU90KG8sdS5yZWN0KSxjLnNldChtLHUpKX0pLHRoaXMuZ2V0U2VsZWN0ZW9ySW5mbyhjKSx0aGlzLmRyYXcocyx0aGlzLmZ1bGxMYXllcix7aW50ZXJzZWN0UmVjdDpvLHNlbGVjdElkczphfHxbXSxzdWJOb2RlTWFwOmN9LG4pLE90KG8saSl9cmVSZW5kZXJTZWxlY3Rvcigpe3ZhciBuO2xldCB0O2NvbnN0IGU9bmV3IE1hcDtyZXR1cm4obj10aGlzLnNlbGVjdElkcyk9PW51bGx8fG4uZm9yRWFjaChhPT57Y29uc3Qgcz10aGlzLnZOb2Rlcy5nZXQoYSk7cyYmKHQ9T3QodCxzLnJlY3QpLGUuc2V0KGEscykpfSx0aGlzKSx0aGlzLmdldFNlbGVjdGVvckluZm8oZSksdGhpcy5kcmF3KF90LnNlbGVjdG9ySWQsdGhpcy5kcmF3TGF5ZXJ8fHRoaXMuZnVsbExheWVyLHtpbnRlcnNlY3RSZWN0OnQsc3ViTm9kZU1hcDplLHNlbGVjdElkczp0aGlzLnNlbGVjdElkc3x8W119KSx0aGlzLm9sZFNlbGVjdFJlY3Q9dCx0fXVwZGF0ZVNlbGVjdElkcyh0KXt2YXIgaSxvO2xldCBlO2NvbnN0IG49KGk9dGhpcy5zZWxlY3RJZHMpPT1udWxsP3ZvaWQgMDppLmZpbHRlcihjPT4hdC5pbmNsdWRlcyhjKSksYT10LmZpbHRlcihjPT57dmFyIG07cmV0dXJuISgobT10aGlzLnNlbGVjdElkcykhPW51bGwmJm0uaW5jbHVkZXMoYykpfSk7aWYobiE9bnVsbCYmbi5sZW5ndGgmJihlPXRoaXMuYmFja1RvRnVsbExheWVyKG4pKSxhLmxlbmd0aCl7dGhpcy5zZWFsVG9EcmF3TGF5ZXIoYSk7Zm9yKGNvbnN0IGMgb2YgYSl7Y29uc3QgbT0obz10aGlzLnZOb2Rlcy5nZXQoYykpPT1udWxsP3ZvaWQgMDpvLnJlY3Q7bSYmKGU9T3QoZSxtKSl9fXRoaXMuc2VsZWN0SWRzPXQ7Y29uc3Qgcz10aGlzLnJlUmVuZGVyU2VsZWN0b3IoKTtyZXR1cm57YmdSZWN0OmUsc2VsZWN0UmVjdDpzfX1jdXJzb3JIb3Zlcih0KXt2YXIgcyxpO2NvbnN0IGU9dGhpcy5vbGRTZWxlY3RSZWN0O3RoaXMuc2VsZWN0SWRzPVtdO2NvbnN0IG49KHM9dGhpcy53b3JrSWQpPT1udWxsP3ZvaWQgMDpzLnRvU3RyaW5nKCksYT1bdFswXSp0aGlzLmZ1bGxMYXllci53b3JsZFNjYWxpbmdbMF0rdGhpcy5mdWxsTGF5ZXIud29ybGRQb3NpdGlvblswXSx0WzFdKnRoaXMuZnVsbExheWVyLndvcmxkU2NhbGluZ1swXSt0aGlzLmZ1bGxMYXllci53b3JsZFBvc2l0aW9uWzFdXTtpZih0aGlzLnNlbGVjdFNpbmdsZVRvb2woYSxuLCEwKSx0aGlzLm9sZFNlbGVjdFJlY3QmJiF2cihlLHRoaXMub2xkU2VsZWN0UmVjdCkpcmV0dXJue3R5cGU6bHQuQ3Vyc29ySG92ZXIsZGF0YVR5cGU6VHQuTG9jYWwscmVjdDpPdChlLHRoaXMub2xkU2VsZWN0UmVjdCksc2VsZWN0b3JDb2xvcjp0aGlzLnNlbGVjdG9yQ29sb3Isd2lsbFN5bmNTZXJ2aWNlOiExfTtpZigoaT10aGlzLnNlbGVjdElkcykhPW51bGwmJmkubGVuZ3RofHwodGhpcy5vbGRTZWxlY3RSZWN0PXZvaWQgMCksZSYmIXRoaXMub2xkU2VsZWN0UmVjdClyZXR1cm4gdGhpcy5jdXJzb3JCbHVyKCkse3R5cGU6bHQuQ3Vyc29ySG92ZXIsZGF0YVR5cGU6VHQuTG9jYWwscmVjdDplLHNlbGVjdG9yQ29sb3I6dGhpcy5zZWxlY3RvckNvbG9yLHdpbGxTeW5jU2VydmljZTohMX19Y3Vyc29yQmx1cigpe3ZhciBlLG47dGhpcy5zZWxlY3RJZHM9W107Y29uc3QgdD0oZT10aGlzLndvcmtJZCk9PW51bGw/dm9pZCAwOmUudG9TdHJpbmcoKTsoKG49dGhpcy5mdWxsTGF5ZXIpPT1udWxsP3ZvaWQgMDpuLnBhcmVudCkuY2hpbGRyZW4uZm9yRWFjaChhPT57YS5uYW1lPT09dCYmYS5yZW1vdmUoKX0pfX07c3QoX3QsInNlbGVjdG9ySWQiLFloKSxzdChfdCwic2VsZWN0b3JCb3JkZXJJZCIsInNlbGVjdG9yLWJvcmRlciIpO2xldCB3dD1fdDtjbGFzcyBGbiBleHRlbmRzIHl0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO3N0KHRoaXMsImNhblJvdGF0ZSIsITEpO3N0KHRoaXMsInNjYWxlVHlwZSIsRnQuYm90aCk7c3QodGhpcywidG9vbHNUeXBlIixndC5BcnJvdyk7c3QodGhpcywidG1wUG9pbnRzIixbXSk7c3QodGhpcywid29ya09wdGlvbnMiKTtzdCh0aGlzLCJvbGRSZWN0Iik7c3QodGhpcywiYXJyb3dUaXBXaWR0aCIpO3N0KHRoaXMsInN5bmNUaW1lc3RhbXAiKTt0aGlzLndvcmtPcHRpb25zPXQudG9vbHNPcHQsdGhpcy5hcnJvd1RpcFdpZHRoPXRoaXMud29ya09wdGlvbnMudGhpY2tuZXNzKjQsdGhpcy5zeW5jVGltZXN0YW1wPTAsdGhpcy5zeW5jVW5pdFRpbWU9NTB9Y29uc3VtZSh0KXt2YXIgTztjb25zdHtkYXRhOmUsaXNGdWxsV29yazpuLGlzU3ViV29ya2VyOmF9PXQscz0oTz1lPT1udWxsP3ZvaWQgMDplLndvcmtJZCk9PW51bGw/dm9pZCAwOk8udG9TdHJpbmcoKTtpZighcylyZXR1cm57dHlwZTpsdC5Ob25lfTtjb25zdHtvcDppLHdvcmtTdGF0ZTpvfT1lLGM9aT09bnVsbD92b2lkIDA6aS5sZW5ndGg7aWYoIWN8fGM8MilyZXR1cm57dHlwZTpsdC5Ob25lfTtsZXQgbTtpZihvPT09SXQuU3RhcnQ/KHRoaXMudG1wUG9pbnRzPVtuZXcgTXQoaVswXSxpWzFdKV0sbT0hMSk6bT10aGlzLnVwZGF0ZVRlbXBQb2ludHMoaSksIW0pcmV0dXJue3R5cGU6bHQuTm9uZX07aWYoIWEpe2NvbnN0IHg9RGF0ZS5ub3coKTtyZXR1cm4geC10aGlzLnN5bmNUaW1lc3RhbXA+dGhpcy5zeW5jVW5pdFRpbWU/KHRoaXMuc3luY1RpbWVzdGFtcD14LHt0eXBlOmx0LkRyYXdXb3JrLGRhdGFUeXBlOlR0LkxvY2FsLHdvcmtJZDpzLG9wOnRoaXMudG1wUG9pbnRzLm1hcCh2PT5bLi4udi5YWSwwXSkuZmxhdCgxKSxpc1N5bmM6ITAsaW5kZXg6MH0pOnt0eXBlOmx0Lk5vbmV9fWNvbnN0IHU9bj90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXIscD10aGlzLmRyYXcoe3dvcmtJZDpzLGxheWVyOnV9KSx5PU90KHAsdGhpcy5vbGRSZWN0KTtyZXR1cm4gdGhpcy5vbGRSZWN0PXAse3JlY3Q6eSx0eXBlOmx0LkRyYXdXb3JrLGRhdGFUeXBlOlR0LkxvY2FsLHdvcmtJZDpzfX1jb25zdW1lQWxsKHQpe3ZhciBjO2NvbnN0e2RhdGE6ZX09dCxuPShjPWU9PW51bGw/dm9pZCAwOmUud29ya0lkKT09bnVsbD92b2lkIDA6Yy50b1N0cmluZygpO2lmKCFuKXJldHVybnt0eXBlOmx0Lk5vbmV9O2lmKHRoaXMudG1wUG9pbnRzLmxlbmd0aDwyKXJldHVybnt0eXBlOmx0LlJlbW92ZU5vZGUscmVtb3ZlSWRzOltuXX07Y29uc3QgYT10aGlzLmZ1bGxMYXllcixzPXRoaXMuZHJhdyh7d29ya0lkOm4sbGF5ZXI6YX0pO3RoaXMub2xkUmVjdD1zO2NvbnN0IGk9dGhpcy50bXBQb2ludHMubWFwKG09PlsuLi5tLlhZLDBdKS5mbGF0KDEpLG89bmUoaSk7cmV0dXJuIHRoaXMudk5vZGVzLnNldEluZm8obix7cmVjdDpzLG9wOmksb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxzY2FsZVR5cGU6dGhpcy5zY2FsZVR5cGUsY2VudGVyUG9zOnl0LmdldENlbnRlclBvcyhzLGEpfSkse3JlY3Q6cyx0eXBlOmx0LkZ1bGxXb3JrLGRhdGFUeXBlOlR0LkxvY2FsLHdvcmtJZDpuLG9wczpvLGlzU3luYzohMCxvcHQ6dGhpcy53b3JrT3B0aW9uc319ZHJhdyh0KXt2YXIgbDtjb25zdHt3b3JrSWQ6ZSxsYXllcjpufT10O3RoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKGUpLm1hcChoPT5oLnJlbW92ZSgpKSwobD10aGlzLmRyYXdMYXllcik9PW51bGx8fGwuZ2V0RWxlbWVudHNCeU5hbWUoZSkubWFwKGg9PmgucmVtb3ZlKCkpO2NvbnN0e3N0cm9rZUNvbG9yOmEsdGhpY2tuZXNzOnMsekluZGV4Omksc2NhbGU6byxyb3RhdGU6Yyx0cmFuc2xhdGU6bX09dGhpcy53b3JrT3B0aW9ucyx1PW4ud29ybGRQb3NpdGlvbixwPW4ud29ybGRTY2FsaW5nLHtwb2ludHM6eSxyZWN0Ok99PXRoaXMuY29tcHV0RHJhd1BvaW50cyhzKSx2PXtwb3M6W08ueCtPLncvMixPLnkrTy5oLzJdLG5hbWU6ZSxpZDplLGNsb3NlOiEwLHBvaW50czp5LGZpbGxDb2xvcjphLHN0cm9rZUNvbG9yOmEsbGluZVdpZHRoOjAsbm9ybWFsaXplOiEwLHpJbmRleDppfTtvJiYodi5zY2FsZT1vKSxjJiYodi5yb3RhdGU9YyksbSYmKHYudHJhbnNsYXRlPW0pO2NvbnN0IFQ9bmV3IGRlKHYpO2lmKG4uYXBwZW5kKFQpLG98fGN8fG0pe2NvbnN0IGg9VC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm57eDpNYXRoLmZsb29yKGgueC15dC5TYWZlQm9yZGVyUGFkZGluZykseTpNYXRoLmZsb29yKGgueS15dC5TYWZlQm9yZGVyUGFkZGluZyksdzpNYXRoLmZsb29yKGgud2lkdGgreXQuU2FmZUJvcmRlclBhZGRpbmcqMiksaDpNYXRoLmZsb29yKGguaGVpZ2h0K3l0LlNhZmVCb3JkZXJQYWRkaW5nKjIpfX1yZXR1cm57eDpNYXRoLmZsb29yKE8ueCpwWzBdK3VbMF0teXQuU2FmZUJvcmRlclBhZGRpbmcpLHk6TWF0aC5mbG9vcihPLnkqcFsxXSt1WzFdLXl0LlNhZmVCb3JkZXJQYWRkaW5nKSx3Ok1hdGguZmxvb3IoTy53KnBbMF0rMip5dC5TYWZlQm9yZGVyUGFkZGluZyksaDpNYXRoLmZsb29yKE8uaCpwWzFdKzIqeXQuU2FmZUJvcmRlclBhZGRpbmcpfX1jb21wdXREcmF3UG9pbnRzKHQpe3JldHVybiB0aGlzLnRtcFBvaW50c1sxXS5kaXN0YW5jZSh0aGlzLnRtcFBvaW50c1swXSk+dGhpcy5hcnJvd1RpcFdpZHRoP3RoaXMuY29tcHV0RnVsbEFycm93UG9pbnRzKHQpOnRoaXMuY29tcHV0VHJpYW5nbGVQb2ludHMoKX1jb21wdXRGdWxsQXJyb3dQb2ludHModCl7Y29uc3QgZT1ldC5TdWIodGhpcy50bXBQb2ludHNbMV0sdGhpcy50bXBQb2ludHNbMF0pLnVuaSgpLG49ZXQuUGVyKGUpLm11bCh0LzIpLGE9TXQuU3ViKHRoaXMudG1wUG9pbnRzWzBdLG4pLHM9TXQuQWRkKHRoaXMudG1wUG9pbnRzWzBdLG4pLGk9ZXQuTXVsKGUsdGhpcy5hcnJvd1RpcFdpZHRoKSxvPWV0LlN1Yih0aGlzLnRtcFBvaW50c1sxXSxpKSxjPU10LlN1YihvLG4pLG09TXQuQWRkKG8sbiksdT1ldC5QZXIoZSkubXVsKHQqMS41KSxwPU10LlN1YihvLHUpLHk9TXQuQWRkKG8sdSksTz1bYSxjLHAsdGhpcy50bXBQb2ludHNbMV0seSxtLHNdO3JldHVybntwb2ludHM6Ty5tYXAoeD0+TXQuU3ViKHgsdGhpcy50bXBQb2ludHNbMF0pLlhZKS5mbGF0KDEpLHJlY3Q6QnQoTyksaXNUcmlhbmdsZTohMSxwb3M6dGhpcy50bXBQb2ludHNbMF0uWFl9fWNvbXB1dFRyaWFuZ2xlUG9pbnRzKCl7Y29uc3QgdD1ldC5TdWIodGhpcy50bXBQb2ludHNbMV0sdGhpcy50bXBQb2ludHNbMF0pLnVuaSgpLGU9dGhpcy50bXBQb2ludHNbMV0uZGlzdGFuY2UodGhpcy50bXBQb2ludHNbMF0pLG49ZXQuUGVyKHQpLm11bChNYXRoLmZsb29yKGUqMy84KSksYT1NdC5TdWIodGhpcy50bXBQb2ludHNbMF0sbikscz1NdC5BZGQodGhpcy50bXBQb2ludHNbMF0sbiksaT1bYSx0aGlzLnRtcFBvaW50c1sxXSxzXTtyZXR1cm57cG9pbnRzOmkubWFwKG89Pk10LlN1YihvLHRoaXMudG1wUG9pbnRzWzBdKS5YWSkuZmxhdCgxKSxyZWN0OkJ0KGkpLGlzVHJpYW5nbGU6ITAscG9zOnRoaXMudG1wUG9pbnRzWzBdLlhZfX11cGRhdGVUZW1wUG9pbnRzKHQpe2NvbnN0IGU9dC5zbGljZSgtMiksbj1uZXcgTXQoZVswXSxlWzFdKSxhPXRoaXMudG1wUG9pbnRzWzBdLHt0aGlja25lc3M6c309dGhpcy53b3JrT3B0aW9ucztpZihhLmlzTmVhcihuLHMpKXJldHVybiExO2lmKHRoaXMudG1wUG9pbnRzLmxlbmd0aD09PTIpe2lmKG4uaXNOZWFyKHRoaXMudG1wUG9pbnRzWzFdLDEpKXJldHVybiExO3RoaXMudG1wUG9pbnRzWzFdPW59ZWxzZSB0aGlzLnRtcFBvaW50cy5wdXNoKG4pO3JldHVybiEwfWNvbnN1bWVTZXJ2aWNlKHQpe3ZhciBvO2NvbnN0e29wOmUsaXNGdWxsV29yazpufT10LGE9KG89dGhpcy53b3JrSWQpPT1udWxsP3ZvaWQgMDpvLnRvU3RyaW5nKCk7aWYoIWEpcmV0dXJuO3RoaXMudG1wUG9pbnRzLmxlbmd0aD0wO2ZvcihsZXQgYz0wO2M8ZS5sZW5ndGg7Yys9Myl0aGlzLnRtcFBvaW50cy5wdXNoKG5ldyBNdChlW2NdLGVbYysxXSxlW2MrMl0pKTtjb25zdCBzPW4/dGhpcy5mdWxsTGF5ZXI6dGhpcy5kcmF3TGF5ZXJ8fHRoaXMuZnVsbExheWVyLGk9dGhpcy5kcmF3KHt3b3JrSWQ6YSxsYXllcjpzfSk7cmV0dXJuIHRoaXMub2xkUmVjdD1pLHRoaXMudk5vZGVzLnNldEluZm8oYSx7cmVjdDppLG9wOmUsb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxzY2FsZVR5cGU6dGhpcy5zY2FsZVR5cGUsY2VudGVyUG9zOnl0LmdldENlbnRlclBvcyhpLHMpfSksaX1jbGVhclRtcFBvaW50cygpe3RoaXMudG1wUG9pbnRzLmxlbmd0aD0wfXN0YXRpYyB1cGRhdGVOb2RlT3B0KHQpe3ZhciBvO2NvbnN0e25vZGU6ZSxvcHQ6bix2Tm9kZXM6YX09dCx7c3Ryb2tlQ29sb3I6c309bixpPWEuZ2V0KGUubmFtZSk7cmV0dXJuIHMmJihlLnNldEF0dHJpYnV0ZSgic3Ryb2tlQ29sb3IiLHMpLGUuc2V0QXR0cmlidXRlKCJmaWxsQ29sb3IiLHMpLChvPWk9PW51bGw/dm9pZCAwOmkub3B0KSE9bnVsbCYmby5zdHJva2VDb2xvciYmKGkub3B0LnN0cm9rZUNvbG9yPXMpLGkmJmEuc2V0SW5mbyhlLm5hbWUsaSkpLHl0LnVwZGF0ZU5vZGVPcHQodCl9fWNsYXNzIGpuIGV4dGVuZHMgeXR7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7c3QodGhpcywiY2FuUm90YXRlIiwhMSk7c3QodGhpcywic2NhbGVUeXBlIixGdC5hbGwpO3N0KHRoaXMsInRvb2xzVHlwZSIsZ3QuRWxsaXBzZSk7c3QodGhpcywidG1wUG9pbnRzIixbXSk7c3QodGhpcywid29ya09wdGlvbnMiKTtzdCh0aGlzLCJvbGRSZWN0Iik7c3QodGhpcywic3luY1RpbWVzdGFtcCIpO3RoaXMud29ya09wdGlvbnM9dC50b29sc09wdCx0aGlzLnN5bmNUaW1lc3RhbXA9MCx0aGlzLnN5bmNVbml0VGltZT01MH1jb25zdW1lKHQpe3ZhciBPO2NvbnN0e2RhdGE6ZSxpc0Z1bGxXb3JrOm4saXNTdWJXb3JrZXI6YX09dCxzPShPPWU9PW51bGw/dm9pZCAwOmUud29ya0lkKT09bnVsbD92b2lkIDA6Ty50b1N0cmluZygpO2lmKCFzKXJldHVybnt0eXBlOmx0Lk5vbmV9O2NvbnN0e29wOmksd29ya1N0YXRlOm99PWUsYz1pPT1udWxsP3ZvaWQgMDppLmxlbmd0aDtpZighY3x8YzwyKXJldHVybnt0eXBlOmx0Lk5vbmV9O2xldCBtO2lmKG89PT1JdC5TdGFydD8odGhpcy50bXBQb2ludHM9W25ldyBNdChpWzBdLGlbMV0pXSxtPSExKTptPXRoaXMudXBkYXRlVGVtcFBvaW50cyhpKSwhbSlyZXR1cm57dHlwZTpsdC5Ob25lfTtpZighYSl7Y29uc3QgeD1EYXRlLm5vdygpO3JldHVybiB4LXRoaXMuc3luY1RpbWVzdGFtcD50aGlzLnN5bmNVbml0VGltZT8odGhpcy5zeW5jVGltZXN0YW1wPXgse3R5cGU6bHQuRHJhd1dvcmssZGF0YVR5cGU6VHQuTG9jYWwsd29ya0lkOnMsb3A6dGhpcy50bXBQb2ludHMubWFwKHY9PlsuLi52LlhZLDBdKS5mbGF0KDEpLGlzU3luYzohMCxpbmRleDowfSk6e3R5cGU6bHQuTm9uZX19Y29uc3QgdT1uP3RoaXMuZnVsbExheWVyOnRoaXMuZHJhd0xheWVyfHx0aGlzLmZ1bGxMYXllcixwPXRoaXMuZHJhdyh7d29ya0lkOnMsbGF5ZXI6dSxpc0RyYXdpbmc6ITB9KSx5PU90KHAsdGhpcy5vbGRSZWN0KTtyZXR1cm4gdGhpcy5vbGRSZWN0PXAse3JlY3Q6eSx0eXBlOmx0LkRyYXdXb3JrLGRhdGFUeXBlOlR0LkxvY2FsLHdvcmtJZDpzfX1jb25zdW1lQWxsKHQpe3ZhciBjO2NvbnN0e2RhdGE6ZX09dCxuPShjPWU9PW51bGw/dm9pZCAwOmUud29ya0lkKT09bnVsbD92b2lkIDA6Yy50b1N0cmluZygpO2lmKCFuKXJldHVybnt0eXBlOmx0Lk5vbmV9O2lmKHRoaXMudG1wUG9pbnRzLmxlbmd0aDwyKXJldHVybnt0eXBlOmx0LlJlbW92ZU5vZGUscmVtb3ZlSWRzOltuXX07Y29uc3QgYT10aGlzLmZ1bGxMYXllcixzPXRoaXMuZHJhdyh7d29ya0lkOm4sbGF5ZXI6YSxpc0RyYXdpbmc6ITF9KTt0aGlzLm9sZFJlY3Q9cztjb25zdCBpPXRoaXMudG1wUG9pbnRzLm1hcChtPT5bLi4ubS5YWSwwXSkuZmxhdCgxKSxvPW5lKGkpO3JldHVybiB0aGlzLnZOb2Rlcy5zZXRJbmZvKG4se3JlY3Q6cyxvcDppLG9wdDp0aGlzLndvcmtPcHRpb25zLHRvb2xzVHlwZTp0aGlzLnRvb2xzVHlwZSxjYW5Sb3RhdGU6dGhpcy5jYW5Sb3RhdGUsc2NhbGVUeXBlOnRoaXMuc2NhbGVUeXBlLGNlbnRlclBvczpzJiZ5dC5nZXRDZW50ZXJQb3MocyxhKX0pLHtyZWN0OnMsdHlwZTpsdC5GdWxsV29yayxkYXRhVHlwZTpUdC5Mb2NhbCx3b3JrSWQ6bixvcHM6byxpc1N5bmM6ITAsb3B0OnRoaXMud29ya09wdGlvbnN9fWRyYXcodCl7dmFyIGc7Y29uc3R7d29ya0lkOmUsbGF5ZXI6bixpc0RyYXdpbmc6YX09dDt0aGlzLmZ1bGxMYXllci5nZXRFbGVtZW50c0J5TmFtZShlKS5tYXAoTT0+TS5yZW1vdmUoKSksKGc9dGhpcy5kcmF3TGF5ZXIpPT1udWxsfHxnLmdldEVsZW1lbnRzQnlOYW1lKGUpLm1hcChNPT5NLnJlbW92ZSgpKTtjb25zdHtzdHJva2VDb2xvcjpzLGZpbGxDb2xvcjppLHRoaWNrbmVzczpvLHpJbmRleDpjLHNjYWxlOm0scm90YXRlOnUsdHJhbnNsYXRlOnB9PXRoaXMud29ya09wdGlvbnMseT1uLndvcmxkUG9zaXRpb24sTz1uLndvcmxkU2NhbGluZyx7cmFkaXVzOngscmVjdDp2LHBvczpUfT10aGlzLmNvbXB1dERyYXdQb2ludHMobyksbD17cG9zOlQsbmFtZTplLGlkOmUscmFkaXVzOngsbGluZVdpZHRoOm8sZmlsbENvbG9yOmkhPT0idHJhbnNwYXJlbnQiJiZpfHx2b2lkIDAsc3Ryb2tlQ29sb3I6cyxub3JtYWxpemU6ITAsekluZGV4OmN9LGg9e3g6TWF0aC5mbG9vcih2LngqT1swXSt5WzBdLXl0LlNhZmVCb3JkZXJQYWRkaW5nKSx5Ok1hdGguZmxvb3Iodi55Kk9bMV0reVsxXS15dC5TYWZlQm9yZGVyUGFkZGluZyksdzpNYXRoLmZsb29yKHYudypPWzBdKzIqeXQuU2FmZUJvcmRlclBhZGRpbmcpLGg6TWF0aC5mbG9vcih2LmgqT1sxXSsyKnl0LlNhZmVCb3JkZXJQYWRkaW5nKX07aWYoYSl7Y29uc3R7bmFtZTpNLGlkOkEsekluZGV4OkMsc3Ryb2tlQ29sb3I6Yn09bCxFPXl0LmdldENlbnRlclBvcyhoLG4pLEw9bmV3IHJlKHtuYW1lOk0saWQ6QSx6SW5kZXg6Qyxwb3M6RSxhbmNob3I6Wy41LC41XSxzaXplOltoLncsaC5oXX0pLEQ9bmV3IHhuKHsuLi5sLHBvczpbMCwwXX0pLEk9bmV3IGhlKHtkOiJNLTQsMEg0TTAsLTRWNCIsbm9ybWFsaXplOiEwLHBvczpbMCwwXSxzdHJva2VDb2xvcjpiLGxpbmVXaWR0aDoxLHNjYWxlOlsxL09bMF0sMS9PWzFdXX0pO3JldHVybiBMLmFwcGVuZChELEkpLG4uYXBwZW5kKEwpLGh9bSYmKGwuc2NhbGU9bSksdSYmKGwucm90YXRlPXUpLHAmJihsLnRyYW5zbGF0ZT1wKTtjb25zdCBmPW5ldyB4bihsKTtpZihuLmFwcGVuZChmKSx1fHxtfHxwKXtjb25zdCBNPWYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJue3g6TWF0aC5mbG9vcihNLngteXQuU2FmZUJvcmRlclBhZGRpbmcpLHk6TWF0aC5mbG9vcihNLnkteXQuU2FmZUJvcmRlclBhZGRpbmcpLHc6TWF0aC5mbG9vcihNLndpZHRoK3l0LlNhZmVCb3JkZXJQYWRkaW5nKjIpLGg6TWF0aC5mbG9vcihNLmhlaWdodCt5dC5TYWZlQm9yZGVyUGFkZGluZyoyKX19cmV0dXJuIGh9Y29tcHV0RHJhd1BvaW50cyh0KXtjb25zdCBlPUJ0KHRoaXMudG1wUG9pbnRzKSxuPUJ0KHRoaXMudG1wUG9pbnRzLHQpLGE9W01hdGguZmxvb3IoZS54K2Uudy8yKSxNYXRoLmZsb29yKGUueStlLmgvMildO3JldHVybntyZWN0Om4scG9zOmEscmFkaXVzOltNYXRoLmZsb29yKGUudy8yKSxNYXRoLmZsb29yKGUuaC8yKV19fXVwZGF0ZVRlbXBQb2ludHModCl7Y29uc3QgZT10LnNsaWNlKC0yKSxuPW5ldyBNdChlWzBdLGVbMV0pLGE9dGhpcy50bXBQb2ludHNbMF0se3RoaWNrbmVzczpzfT10aGlzLndvcmtPcHRpb25zO2lmKGEuaXNOZWFyKG4scykpcmV0dXJuITE7aWYodGhpcy50bXBQb2ludHMubGVuZ3RoPT09Mil7aWYobi5pc05lYXIodGhpcy50bXBQb2ludHNbMV0sMSkpcmV0dXJuITE7dGhpcy50bXBQb2ludHNbMV09bn1lbHNlIHRoaXMudG1wUG9pbnRzLnB1c2gobik7cmV0dXJuITB9Y29uc3VtZVNlcnZpY2UodCl7dmFyIG87Y29uc3R7b3A6ZSxpc0Z1bGxXb3JrOm59PXQsYT0obz10aGlzLndvcmtJZCk9PW51bGw/dm9pZCAwOm8udG9TdHJpbmcoKTtpZighYSlyZXR1cm47dGhpcy50bXBQb2ludHMubGVuZ3RoPTA7Zm9yKGxldCBjPTA7YzxlLmxlbmd0aDtjKz0zKXRoaXMudG1wUG9pbnRzLnB1c2gobmV3IE10KGVbY10sZVtjKzFdLGVbYysyXSkpO2NvbnN0IHM9bj90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXIsaT10aGlzLmRyYXcoe3dvcmtJZDphLGxheWVyOnMsaXNEcmF3aW5nOiExfSk7cmV0dXJuIHRoaXMub2xkUmVjdD1pLHRoaXMudk5vZGVzLnNldEluZm8oYSx7cmVjdDppLG9wOmUsb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxzY2FsZVR5cGU6dGhpcy5zY2FsZVR5cGUsY2VudGVyUG9zOnl0LmdldENlbnRlclBvcyhpLHMpfSksaX1jbGVhclRtcFBvaW50cygpe3RoaXMudG1wUG9pbnRzLmxlbmd0aD0wfXN0YXRpYyB1cGRhdGVOb2RlT3B0KHQpe3ZhciBtLHU7Y29uc3R7bm9kZTplLG9wdDpuLHZOb2RlczphfT10LHtzdHJva2VDb2xvcjpzLGZpbGxDb2xvcjppfT1uLG89YS5nZXQoZS5uYW1lKTtsZXQgYz1lO3JldHVybiBlLnRhZ05hbWU9PT0iR1JPVVAiJiYoYz1lLmNoaWxkcmVuWzBdKSxzJiYoYy5zZXRBdHRyaWJ1dGUoInN0cm9rZUNvbG9yIixzKSwobT1vPT1udWxsP3ZvaWQgMDpvLm9wdCkhPW51bGwmJm0uc3Ryb2tlQ29sb3ImJihvLm9wdC5zdHJva2VDb2xvcj1zKSksaSYmKGk9PT0idHJhbnNwYXJlbnQiP2Muc2V0QXR0cmlidXRlKCJmaWxsQ29sb3IiLCJyZ2JhKDAsMCwwLDApIik6Yy5zZXRBdHRyaWJ1dGUoImZpbGxDb2xvciIsaSksKHU9bz09bnVsbD92b2lkIDA6by5vcHQpIT1udWxsJiZ1LmZpbGxDb2xvciYmKG8ub3B0LmZpbGxDb2xvcj1pKSksbyYmYS5zZXRJbmZvKGUubmFtZSxvKSx5dC51cGRhdGVOb2RlT3B0KHQpfX12YXIgdDA9Y2UsZTA9aWUscjA9IltvYmplY3QgQm9vbGVhbl0iO2Z1bmN0aW9uIG4wKGQpe3JldHVybiBkPT09ITB8fGQ9PT0hMXx8ZTAoZCkmJnQwKGQpPT1yMH12YXIgaTA9bjAsZ2U9WHQoaTApO2NsYXNzIFVuIGV4dGVuZHMgeXR7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7c3QodGhpcywiY2FuUm90YXRlIiwhMCk7c3QodGhpcywic2NhbGVUeXBlIixGdC5hbGwpO3N0KHRoaXMsInRvb2xzVHlwZSIsZ3QuUmVjdGFuZ2xlKTtzdCh0aGlzLCJ0bXBQb2ludHMiLFtdKTtzdCh0aGlzLCJ3b3JrT3B0aW9ucyIpO3N0KHRoaXMsIm9sZFJlY3QiKTtzdCh0aGlzLCJzeW5jVGltZXN0YW1wIik7dGhpcy53b3JrT3B0aW9ucz10LnRvb2xzT3B0LHRoaXMuc3luY1RpbWVzdGFtcD0wLHRoaXMuc3luY1VuaXRUaW1lPTUwfXRyYW5zZm9ybURhdGEoKXtjb25zdCB0PUJ0KHRoaXMudG1wUG9pbnRzKTtyZXR1cm5bW3QueCx0LnksMF0sW3QueCt0LncsdC55LDBdLFt0LngrdC53LHQueSt0LmgsMF0sW3QueCx0LnkrdC5oLDBdXX1jb21wdXREcmF3UG9pbnRzKHQpe2NvbnN0e3RoaWNrbmVzczplfT10aGlzLndvcmtPcHRpb25zLG49W107Zm9yKGNvbnN0IGkgb2YgdCluLnB1c2gobmV3IGV0KC4uLmkpKTtjb25zdCBhPUJ0KG4sZSkscz1bYS54K2Eudy8yLGEueSthLmgvMl07cmV0dXJue3JlY3Q6YSxwb3M6cyxwb2ludHM6bi5tYXAoaT0+aS5YWSkuZmxhdCgxKX19Y29uc3VtZSh0KXt2YXIgeDtjb25zdHtkYXRhOmUsaXNGdWxsV29yazpuLGlzU3ViV29ya2VyOmF9PXQscz0oeD1lPT1udWxsP3ZvaWQgMDplLndvcmtJZCk9PW51bGw/dm9pZCAwOngudG9TdHJpbmcoKTtpZighcylyZXR1cm57dHlwZTpsdC5Ob25lfTtjb25zdHtvcDppLHdvcmtTdGF0ZTpvfT1lLGM9aT09bnVsbD92b2lkIDA6aS5sZW5ndGg7aWYoIWN8fGM8MilyZXR1cm57dHlwZTpsdC5Ob25lfTtsZXQgbTtpZihvPT09SXQuU3RhcnQ/KHRoaXMudG1wUG9pbnRzPVtuZXcgTXQoaVswXSxpWzFdKV0sbT0hMSk6bT10aGlzLnVwZGF0ZVRlbXBQb2ludHMoaSksIW0pcmV0dXJue3R5cGU6bHQuTm9uZX07Y29uc3QgdT10aGlzLnRyYW5zZm9ybURhdGEoKTtpZighYSl7Y29uc3Qgdj1EYXRlLm5vdygpO3JldHVybiB2LXRoaXMuc3luY1RpbWVzdGFtcD50aGlzLnN5bmNVbml0VGltZT8odGhpcy5zeW5jVGltZXN0YW1wPXYse3R5cGU6bHQuRHJhd1dvcmssZGF0YVR5cGU6VHQuTG9jYWwsd29ya0lkOnMsb3A6dS5mbGF0KDEpLGlzU3luYzohMCxpbmRleDowfSk6e3R5cGU6bHQuTm9uZX19Y29uc3QgcD1uP3RoaXMuZnVsbExheWVyOnRoaXMuZHJhd0xheWVyfHx0aGlzLmZ1bGxMYXllcix5PXRoaXMuZHJhdyh7cHM6dSx3b3JrSWQ6cyxsYXllcjpwLGlzRHJhd2luZzohMH0pLE89T3QoeSx0aGlzLm9sZFJlY3QpO3JldHVybiB0aGlzLm9sZFJlY3Q9eSx7cmVjdDpPLHR5cGU6bHQuRHJhd1dvcmssZGF0YVR5cGU6VHQuTG9jYWwsd29ya0lkOnN9fWNvbnN1bWVBbGwodCl7dmFyIG07Y29uc3R7ZGF0YTplfT10LG49KG09ZT09bnVsbD92b2lkIDA6ZS53b3JrSWQpPT1udWxsP3ZvaWQgMDptLnRvU3RyaW5nKCk7aWYoIW4pcmV0dXJue3R5cGU6bHQuTm9uZX07aWYodGhpcy50bXBQb2ludHMubGVuZ3RoPDIpcmV0dXJue3R5cGU6bHQuUmVtb3ZlTm9kZSxyZW1vdmVJZHM6W25dfTtjb25zdCBhPXRoaXMudHJhbnNmb3JtRGF0YSgpLHM9dGhpcy5mdWxsTGF5ZXIsaT10aGlzLmRyYXcoe3BzOmEsd29ya0lkOm4sbGF5ZXI6cyxpc0RyYXdpbmc6ITF9KTt0aGlzLm9sZFJlY3Q9aTtjb25zdCBvPWEuZmxhdCgxKSxjPW5lKG8pO3JldHVybiB0aGlzLnZOb2Rlcy5zZXRJbmZvKG4se3JlY3Q6aSxvcDpvLG9wdDp0aGlzLndvcmtPcHRpb25zLHRvb2xzVHlwZTp0aGlzLnRvb2xzVHlwZSxzY2FsZVR5cGU6dGhpcy5zY2FsZVR5cGUsY2FuUm90YXRlOnRoaXMuY2FuUm90YXRlLGNlbnRlclBvczppJiZ5dC5nZXRDZW50ZXJQb3MoaSxzKX0pLHtyZWN0OmksdHlwZTpsdC5GdWxsV29yayxkYXRhVHlwZTpUdC5Mb2NhbCx3b3JrSWQ6bixvcHM6YyxvcHQ6dGhpcy53b3JrT3B0aW9ucyxpc1N5bmM6ITB9fWRyYXcodCl7dmFyIGI7Y29uc3R7d29ya0lkOmUsbGF5ZXI6bixpc0RyYXdpbmc6YSxwczpzLHJlcGxhY2VJZDppfT10O3RoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKGl8fGUpLm1hcChFPT5FLnJlbW92ZSgpKSwoYj10aGlzLmRyYXdMYXllcik9PW51bGx8fGIuZ2V0RWxlbWVudHNCeU5hbWUoaXx8ZSkubWFwKEU9PkUucmVtb3ZlKCkpO2NvbnN0e3N0cm9rZUNvbG9yOm8sZmlsbENvbG9yOmMsdGhpY2tuZXNzOm0sekluZGV4OnUsc2NhbGU6cCxyb3RhdGU6eSx0cmFuc2xhdGU6Tyx0ZXh0T3B0Onh9PXRoaXMud29ya09wdGlvbnMsdj1uLndvcmxkUG9zaXRpb24sVD1uLndvcmxkU2NhbGluZyx7cG9pbnRzOmwscmVjdDpoLHBvczpmfT10aGlzLmNvbXB1dERyYXdQb2ludHMocyksZz17Y2xvc2U6ITAsbm9ybWFsaXplOiEwLHBvaW50czpsLGxpbmVXaWR0aDptLGZpbGxDb2xvcjpjIT09InRyYW5zcGFyZW50IiYmY3x8dm9pZCAwLHN0cm9rZUNvbG9yOm8sbGluZUpvaW46InJvdW5kIn0sTT17eDpNYXRoLmZsb29yKGgueCpUWzBdK3ZbMF0teXQuU2FmZUJvcmRlclBhZGRpbmcpLHk6TWF0aC5mbG9vcihoLnkqVFsxXSt2WzFdLXl0LlNhZmVCb3JkZXJQYWRkaW5nKSx3Ok1hdGguZmxvb3IoaC53KlRbMF0rMip5dC5TYWZlQm9yZGVyUGFkZGluZyksaDpNYXRoLmZsb29yKGguaCpUWzBdKzIqeXQuU2FmZUJvcmRlclBhZGRpbmcpfSxBPW5ldyByZSh7bmFtZTplLGlkOmUsekluZGV4OnUscG9zOmYsYW5jaG9yOlsuNSwuNV0sc2l6ZTpbaC53LGguaF0sc2NhbGU6cCxyb3RhdGU6eSx0cmFuc2xhdGU6T30pLEM9bmV3IGRlKHsuLi5nLHBvczpbMCwwXX0pO2lmKEEuYXBwZW5kQ2hpbGQoQyksYSl7Y29uc3QgRT1uZXcgaGUoe2Q6Ik0tNCwwSDRNMCwtNFY0Iixub3JtYWxpemU6ITAscG9zOlswLDBdLHN0cm9rZUNvbG9yOm8sbGluZVdpZHRoOjEsc2NhbGU6WzEvVFswXSwxL1RbMV1dfSk7QS5hcHBlbmRDaGlsZChFKX1pZihuLmFwcGVuZChBKSxwfHx5fHxPKXtjb25zdCBFPUEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJue3g6TWF0aC5mbG9vcihFLngteXQuU2FmZUJvcmRlclBhZGRpbmcpLHk6TWF0aC5mbG9vcihFLnkteXQuU2FmZUJvcmRlclBhZGRpbmcpLHc6TWF0aC5mbG9vcihFLndpZHRoKzIqeXQuU2FmZUJvcmRlclBhZGRpbmcpLGg6TWF0aC5mbG9vcihFLmhlaWdodCsyKnl0LlNhZmVCb3JkZXJQYWRkaW5nKX19cmV0dXJuIE19dXBkYXRlVGVtcFBvaW50cyh0KXtjb25zdCBlPXQuc2xpY2UoLTIpLG49bmV3IE10KGVbMF0sZVsxXSksYT10aGlzLnRtcFBvaW50c1swXSx7dGhpY2tuZXNzOnN9PXRoaXMud29ya09wdGlvbnM7aWYoYS5pc05lYXIobixzKSlyZXR1cm4hMTtpZih0aGlzLnRtcFBvaW50cy5sZW5ndGg9PT0yKXtpZihuLmlzTmVhcih0aGlzLnRtcFBvaW50c1sxXSwxKSlyZXR1cm4hMTt0aGlzLnRtcFBvaW50c1sxXT1ufWVsc2UgdGhpcy50bXBQb2ludHMucHVzaChuKTtyZXR1cm4hMH1jb25zdW1lU2VydmljZSh0KXt2YXIgbTtjb25zdHtvcDplLGlzRnVsbFdvcms6bixyZXBsYWNlSWQ6YX09dCxzPShtPXRoaXMud29ya0lkKT09bnVsbD92b2lkIDA6bS50b1N0cmluZygpO2lmKCFzKXJldHVybjtjb25zdCBpPVtdO2ZvcihsZXQgdT0wO3U8ZS5sZW5ndGg7dSs9MylpLnB1c2goW2VbdV0sZVt1KzFdLGVbdSsyXV0pO2NvbnN0IG89bj90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXIsYz10aGlzLmRyYXcoe3BzOmksd29ya0lkOnMsbGF5ZXI6byxpc0RyYXdpbmc6ITEscmVwbGFjZUlkOmF9KTtyZXR1cm4gdGhpcy5vbGRSZWN0PWMsdGhpcy52Tm9kZXMuc2V0SW5mbyhzLHtyZWN0OmMsb3A6ZSxvcHQ6dGhpcy53b3JrT3B0aW9ucyx0b29sc1R5cGU6dGhpcy50b29sc1R5cGUsc2NhbGVUeXBlOnRoaXMuc2NhbGVUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxjZW50ZXJQb3M6YyYmeXQuZ2V0Q2VudGVyUG9zKGMsbyl9KSxjfWNsZWFyVG1wUG9pbnRzKCl7dGhpcy50bXBQb2ludHMubGVuZ3RoPTB9c3RhdGljIHVwZGF0ZU5vZGVPcHQodCl7dmFyIFQsbDtjb25zdHtub2RlOmUsb3B0Om4sdk5vZGVzOmF9PXQse3N0cm9rZUNvbG9yOnMsZmlsbENvbG9yOmksZm9udENvbG9yOm8sZm9udEJnQ29sb3I6Yyxib2xkOm0saXRhbGljOnUsbGluZVRocm91Z2g6cCx1bmRlcmxpbmU6eSxmb250U2l6ZTpPfT1uLHg9YS5nZXQoZS5uYW1lKTtsZXQgdj1lO2lmKGUudGFnTmFtZT09PSJHUk9VUCImJih2PWUuY2hpbGRyZW5bMF0pLHMmJih2LnNldEF0dHJpYnV0ZSgic3Ryb2tlQ29sb3IiLHMpLChUPXg9PW51bGw/dm9pZCAwOngub3B0KSE9bnVsbCYmVC5zdHJva2VDb2xvciYmKHgub3B0LnN0cm9rZUNvbG9yPXMpKSxpJiYoaT09PSJ0cmFuc3BhcmVudCI/di5zZXRBdHRyaWJ1dGUoImZpbGxDb2xvciIsInJnYmEoMCwwLDAsMCkiKTp2LnNldEF0dHJpYnV0ZSgiZmlsbENvbG9yIixpKSwobD14PT1udWxsP3ZvaWQgMDp4Lm9wdCkhPW51bGwmJmwuZmlsbENvbG9yJiYoeC5vcHQuZmlsbENvbG9yPWkpKSx4IT1udWxsJiZ4Lm9wdC50ZXh0T3B0KXtjb25zdCBoPXgub3B0LnRleHRPcHQ7byYmaC5mb250Q29sb3ImJihoLmZvbnRDb2xvcj1vKSxjJiZoLmZvbnRCZ0NvbG9yJiYoaC5mb250QmdDb2xvcj1jKSxtJiYoaC5ib2xkPW0pLHUmJihoLml0YWxpYz11KSxnZShwKSYmKGgubGluZVRocm91Z2g9cCksZ2UoeSkmJihoLnVuZGVybGluZT15KSxPJiYoaC5mb250U2l6ZT1PKX1yZXR1cm4geCYmYS5zZXRJbmZvKGUubmFtZSx4KSx5dC51cGRhdGVOb2RlT3B0KHQpfX1jbGFzcyAkbiBleHRlbmRzIHl0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO3N0KHRoaXMsImNhblJvdGF0ZSIsITEpO3N0KHRoaXMsInNjYWxlVHlwZSIsRnQuYWxsKTtzdCh0aGlzLCJ0b29sc1R5cGUiLGd0LlN0YXIpO3N0KHRoaXMsInRtcFBvaW50cyIsW10pO3N0KHRoaXMsIndvcmtPcHRpb25zIik7c3QodGhpcywib2xkUmVjdCIpO3N0KHRoaXMsInN5bmNUaW1lc3RhbXAiKTt0aGlzLndvcmtPcHRpb25zPXQudG9vbHNPcHQsdGhpcy5zeW5jVGltZXN0YW1wPTAsdGhpcy5zeW5jVW5pdFRpbWU9NTB9Y29uc3VtZSh0KXt2YXIgTztjb25zdHtkYXRhOmUsaXNGdWxsV29yazpuLGlzU3ViV29ya2VyOmF9PXQscz0oTz1lPT1udWxsP3ZvaWQgMDplLndvcmtJZCk9PW51bGw/dm9pZCAwOk8udG9TdHJpbmcoKTtpZighcylyZXR1cm57dHlwZTpsdC5Ob25lfTtjb25zdHtvcDppLHdvcmtTdGF0ZTpvfT1lLGM9aT09bnVsbD92b2lkIDA6aS5sZW5ndGg7aWYoIWN8fGM8MilyZXR1cm57dHlwZTpsdC5Ob25lfTtsZXQgbTtpZihvPT09SXQuU3RhcnQ/KHRoaXMudG1wUG9pbnRzPVtuZXcgTXQoaVswXSxpWzFdKV0sbT0hMSk6bT10aGlzLnVwZGF0ZVRlbXBQb2ludHMoaSksIW0pcmV0dXJue3R5cGU6bHQuTm9uZX07aWYoIWEpe2NvbnN0IHg9RGF0ZS5ub3coKTtyZXR1cm4geC10aGlzLnN5bmNUaW1lc3RhbXA+dGhpcy5zeW5jVW5pdFRpbWU/KHRoaXMuc3luY1RpbWVzdGFtcD14LHt0eXBlOmx0LkRyYXdXb3JrLGRhdGFUeXBlOlR0LkxvY2FsLHdvcmtJZDpzLG9wOnRoaXMudG1wUG9pbnRzLm1hcCh2PT5bLi4udi5YWSwwXSkuZmxhdCgxKSxpc1N5bmM6ITAsaW5kZXg6MH0pOnt0eXBlOmx0Lk5vbmV9fWNvbnN0IHU9bj90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXIscD10aGlzLmRyYXcoe3dvcmtJZDpzLGxheWVyOnUsaXNEcmF3aW5nOiEwfSkseT1PdChwLHRoaXMub2xkUmVjdCk7cmV0dXJuIHRoaXMub2xkUmVjdD1wLHtyZWN0OnksdHlwZTpsdC5EcmF3V29yayxkYXRhVHlwZTpUdC5Mb2NhbCx3b3JrSWQ6c319Y29uc3VtZUFsbCh0KXt2YXIgYztjb25zdHtkYXRhOmV9PXQsbj0oYz1lPT1udWxsP3ZvaWQgMDplLndvcmtJZCk9PW51bGw/dm9pZCAwOmMudG9TdHJpbmcoKTtpZighbilyZXR1cm57dHlwZTpsdC5Ob25lfTtpZih0aGlzLnRtcFBvaW50cy5sZW5ndGg8MilyZXR1cm57dHlwZTpsdC5SZW1vdmVOb2RlLHJlbW92ZUlkczpbbl19O2NvbnN0IGE9dGhpcy5mdWxsTGF5ZXIscz10aGlzLmRyYXcoe3dvcmtJZDpuLGxheWVyOmEsaXNEcmF3aW5nOiExfSk7dGhpcy5vbGRSZWN0PXM7Y29uc3QgaT10aGlzLnRtcFBvaW50cy5tYXAobT0+Wy4uLm0uWFksMF0pLmZsYXQoMSksbz1uZShpKTtyZXR1cm4gdGhpcy52Tm9kZXMuc2V0SW5mbyhuLHtyZWN0OnMsb3A6aSxvcHQ6dGhpcy53b3JrT3B0aW9ucyx0b29sc1R5cGU6dGhpcy50b29sc1R5cGUsc2NhbGVUeXBlOnRoaXMuc2NhbGVUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxjZW50ZXJQb3M6cyYmeXQuZ2V0Q2VudGVyUG9zKHMsYSl9KSx7cmVjdDpzLHR5cGU6bHQuRnVsbFdvcmssZGF0YVR5cGU6VHQuTG9jYWwsd29ya0lkOm4sb3BzOm8saXNTeW5jOiEwLG9wdDp0aGlzLndvcmtPcHRpb25zfX1kcmF3KHQpe3ZhciBiO2NvbnN0e3dvcmtJZDplLGxheWVyOm4saXNEcmF3aW5nOmF9PXQ7dGhpcy5mdWxsTGF5ZXIuZ2V0RWxlbWVudHNCeU5hbWUoZSkubWFwKEU9PkUucmVtb3ZlKCkpLChiPXRoaXMuZHJhd0xheWVyKT09bnVsbHx8Yi5nZXRFbGVtZW50c0J5TmFtZShlKS5tYXAoRT0+RS5yZW1vdmUoKSk7Y29uc3R7c3Ryb2tlQ29sb3I6cyxmaWxsQ29sb3I6aSx0aGlja25lc3M6byx6SW5kZXg6Yyx2ZXJ0aWNlczptLGlubmVyVmVydGljZVN0ZXA6dSxpbm5lclJhdGlvOnAsc2NhbGU6eSxyb3RhdGU6Tyx0cmFuc2xhdGU6eH09dGhpcy53b3JrT3B0aW9ucyx2PW4ud29ybGRTY2FsaW5nLHtyZWN0OlQscG9zOmwscG9pbnRzOmh9PXRoaXMuY29tcHV0RHJhd1BvaW50cyhvLG0sdSxwKSxmPXtjbG9zZTohMCxwb2ludHM6aCxsaW5lV2lkdGg6byxmaWxsQ29sb3I6aSE9PSJ0cmFuc3BhcmVudCImJml8fHZvaWQgMCxzdHJva2VDb2xvcjpzLG5vcm1hbGl6ZTohMCxsaW5lSm9pbjoicm91bmQifSxnPXtuYW1lOmUsaWQ6ZSx6SW5kZXg6Yyxwb3M6bCxhbmNob3I6Wy41LC41XSxzaXplOltULncsVC5oXSxjbGFzc05hbWU6YCR7bFswXX0sJHtsWzFdfWB9O3kmJihnLnNjYWxlPXkpLE8mJihnLnJvdGF0ZT1PKSx4JiYoZy50cmFuc2xhdGU9eCk7Y29uc3QgTT1uZXcgcmUoZyk7aWYoYSl7Y29uc3QgRT1uZXcgaGUoe2Q6Ik0tNCwwSDRNMCwtNFY0Iixub3JtYWxpemU6ITAscG9zOlswLDBdLHN0cm9rZUNvbG9yOnMsbGluZVdpZHRoOjEsc2NhbGU6WzEvdlswXSwxL3ZbMV1dfSk7TS5hcHBlbmQoRSl9Y29uc3QgQT1uZXcgZGUoey4uLmYscG9zOlswLDBdfSk7TS5hcHBlbmQoQSksbi5hcHBlbmQoTSk7Y29uc3QgQz1NLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybnt4Ok1hdGguZmxvb3IoQy54LXl0LlNhZmVCb3JkZXJQYWRkaW5nKSx5Ok1hdGguZmxvb3IoQy55LXl0LlNhZmVCb3JkZXJQYWRkaW5nKSx3Ok1hdGguZmxvb3IoQy53aWR0aCt5dC5TYWZlQm9yZGVyUGFkZGluZyoyKSxoOk1hdGguZmxvb3IoQy5oZWlnaHQreXQuU2FmZUJvcmRlclBhZGRpbmcqMil9fWNvbXB1dERyYXdQb2ludHModCxlLG4sYSl7Y29uc3Qgcz1CdCh0aGlzLnRtcFBvaW50cyksaT1bTWF0aC5mbG9vcihzLngrcy53LzIpLE1hdGguZmxvb3Iocy55K3MuaC8yKV0sbz1TbihzLncscy5oKSxjPU1hdGguZmxvb3IoTWF0aC5taW4ocy53LHMuaCkvMiksbT1hKmMsdT1bXSxwPTIqTWF0aC5QSS9lO2ZvcihsZXQgTz0wO088ZTtPKyspe2NvbnN0IHg9TypwLS41Kk1hdGguUEk7bGV0IHYsVDtPJW49PT0xPyh2PW0qb1swXSpNYXRoLmNvcyh4KSxUPW0qb1sxXSpNYXRoLnNpbih4KSk6KHY9YypvWzBdKk1hdGguY29zKHgpLFQ9YypvWzFdKk1hdGguc2luKHgpLHUucHVzaCh2LFQpKSx1LnB1c2godixUKX1yZXR1cm57cmVjdDpCdCh0aGlzLnRtcFBvaW50cyx0KSxwb3M6aSxwb2ludHM6dX19dXBkYXRlVGVtcFBvaW50cyh0KXtjb25zdCBlPXQuc2xpY2UoLTIpLG49bmV3IE10KGVbMF0sZVsxXSksYT10aGlzLnRtcFBvaW50c1swXSx7dGhpY2tuZXNzOnN9PXRoaXMud29ya09wdGlvbnM7aWYoYS5pc05lYXIobixzKXx8TXQuU3ViKGEsbikuWFkuaW5jbHVkZXMoMCkpcmV0dXJuITE7aWYodGhpcy50bXBQb2ludHMubGVuZ3RoPT09Mil7aWYobi5pc05lYXIodGhpcy50bXBQb2ludHNbMV0sMSkpcmV0dXJuITE7dGhpcy50bXBQb2ludHNbMV09bn1lbHNlIHRoaXMudG1wUG9pbnRzLnB1c2gobik7cmV0dXJuITB9Y29uc3VtZVNlcnZpY2UodCl7dmFyIG87Y29uc3R7b3A6ZSxpc0Z1bGxXb3JrOm59PXQsYT0obz10aGlzLndvcmtJZCk9PW51bGw/dm9pZCAwOm8udG9TdHJpbmcoKTtpZighYSlyZXR1cm47dGhpcy50bXBQb2ludHMubGVuZ3RoPTA7Zm9yKGxldCBjPTA7YzxlLmxlbmd0aDtjKz0zKXRoaXMudG1wUG9pbnRzLnB1c2gobmV3IE10KGVbY10sZVtjKzFdLGVbYysyXSkpO2NvbnN0IHM9bj90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXIsaT10aGlzLmRyYXcoe3dvcmtJZDphLGxheWVyOnMsaXNEcmF3aW5nOiExfSk7cmV0dXJuIHRoaXMub2xkUmVjdD1pLHRoaXMudk5vZGVzLnNldEluZm8oYSx7cmVjdDppLG9wOmUsb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLHNjYWxlVHlwZTp0aGlzLnNjYWxlVHlwZSxjYW5Sb3RhdGU6dGhpcy5jYW5Sb3RhdGUsY2VudGVyUG9zOmkmJnl0LmdldENlbnRlclBvcyhpLHMpfSksaX1jbGVhclRtcFBvaW50cygpe3RoaXMudG1wUG9pbnRzLmxlbmd0aD0wfXN0YXRpYyB1cGRhdGVOb2RlT3B0KHQpe2NvbnN0e25vZGU6ZSxvcHQ6bix2Tm9kZXM6YX09dCx7c3Ryb2tlQ29sb3I6cyxmaWxsQ29sb3I6aSx0b29sc1R5cGU6byx2ZXJ0aWNlczpjLGlubmVyVmVydGljZVN0ZXA6bSxpbm5lclJhdGlvOnV9PW4scD1hLmdldChlLm5hbWUpLHk9cD09bnVsbD92b2lkIDA6cC5vcHQ7bGV0IE89ZTtyZXR1cm4gZS50YWdOYW1lPT09IkdST1VQIiYmKE89ZS5jaGlsZHJlblswXSkscyYmKE8uc2V0QXR0cmlidXRlKCJzdHJva2VDb2xvciIscykseSE9bnVsbCYmeS5zdHJva2VDb2xvciYmKHkuc3Ryb2tlQ29sb3I9cykpLGkmJihpPT09InRyYW5zcGFyZW50Ij9PLnNldEF0dHJpYnV0ZSgiZmlsbENvbG9yIiwicmdiYSgwLDAsMCwwKSIpOk8uc2V0QXR0cmlidXRlKCJmaWxsQ29sb3IiLGkpLHkhPW51bGwmJnkuZmlsbENvbG9yJiYoeS5maWxsQ29sb3I9aSkpLG89PT1ndC5TdGFyJiYoYyYmKHkudmVydGljZXM9YyksbSYmKHkuaW5uZXJWZXJ0aWNlU3RlcD1tKSx1JiYoeS5pbm5lclJhdGlvPXUpKSxwJiZhLnNldEluZm8oZS5uYW1lLHsuLi5wLG9wdDp5fSkseXQudXBkYXRlTm9kZU9wdCh0KX19Y2xhc3Mgem4gZXh0ZW5kcyB5dHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KTtzdCh0aGlzLCJjYW5Sb3RhdGUiLCExKTtzdCh0aGlzLCJzY2FsZVR5cGUiLEZ0LmFsbCk7c3QodGhpcywidG9vbHNUeXBlIixndC5Qb2x5Z29uKTtzdCh0aGlzLCJ0bXBQb2ludHMiLFtdKTtzdCh0aGlzLCJ3b3JrT3B0aW9ucyIpO3N0KHRoaXMsIm9sZFJlY3QiKTtzdCh0aGlzLCJzeW5jVGltZXN0YW1wIik7dGhpcy53b3JrT3B0aW9ucz10LnRvb2xzT3B0LHRoaXMuc3luY1RpbWVzdGFtcD0wLHRoaXMuc3luY1VuaXRUaW1lPTUwfWNvbnN1bWUodCl7dmFyIE87Y29uc3R7ZGF0YTplLGlzRnVsbFdvcms6bixpc1N1YldvcmtlcjphfT10LHM9KE89ZT09bnVsbD92b2lkIDA6ZS53b3JrSWQpPT1udWxsP3ZvaWQgMDpPLnRvU3RyaW5nKCk7aWYoIXMpcmV0dXJue3R5cGU6bHQuTm9uZX07Y29uc3R7b3A6aSx3b3JrU3RhdGU6b309ZSxjPWk9PW51bGw/dm9pZCAwOmkubGVuZ3RoO2lmKCFjfHxjPDIpcmV0dXJue3R5cGU6bHQuTm9uZX07bGV0IG07aWYobz09PUl0LlN0YXJ0Pyh0aGlzLnRtcFBvaW50cz1bbmV3IE10KGlbMF0saVsxXSldLG09ITEpOm09dGhpcy51cGRhdGVUZW1wUG9pbnRzKGkpLCFtKXJldHVybnt0eXBlOmx0Lk5vbmV9O2lmKCFhKXtjb25zdCB4PURhdGUubm93KCk7cmV0dXJuIHgtdGhpcy5zeW5jVGltZXN0YW1wPnRoaXMuc3luY1VuaXRUaW1lPyh0aGlzLnN5bmNUaW1lc3RhbXA9eCx7dHlwZTpsdC5EcmF3V29yayxkYXRhVHlwZTpUdC5Mb2NhbCx3b3JrSWQ6cyxvcDp0aGlzLnRtcFBvaW50cy5tYXAodj0+Wy4uLnYuWFksMF0pLmZsYXQoMSksaXNTeW5jOiEwLGluZGV4OjB9KTp7dHlwZTpsdC5Ob25lfX1jb25zdCB1PW4/dGhpcy5mdWxsTGF5ZXI6dGhpcy5kcmF3TGF5ZXJ8fHRoaXMuZnVsbExheWVyLHA9dGhpcy5kcmF3KHt3b3JrSWQ6cyxsYXllcjp1LGlzRHJhd2luZzohMH0pLHk9T3QocCx0aGlzLm9sZFJlY3QpO3JldHVybiB0aGlzLm9sZFJlY3Q9cCx7cmVjdDp5LHR5cGU6bHQuRHJhd1dvcmssZGF0YVR5cGU6VHQuTG9jYWwsd29ya0lkOnN9fWNvbnN1bWVBbGwodCl7dmFyIGM7Y29uc3R7ZGF0YTplfT10LG49KGM9ZT09bnVsbD92b2lkIDA6ZS53b3JrSWQpPT1udWxsP3ZvaWQgMDpjLnRvU3RyaW5nKCk7aWYoIW4pcmV0dXJue3R5cGU6bHQuTm9uZX07aWYodGhpcy50bXBQb2ludHMubGVuZ3RoPDIpcmV0dXJue3R5cGU6bHQuUmVtb3ZlTm9kZSxyZW1vdmVJZHM6W25dfTtjb25zdCBhPXRoaXMuZnVsbExheWVyLHM9dGhpcy5kcmF3KHt3b3JrSWQ6bixsYXllcjphLGlzRHJhd2luZzohMX0pO3RoaXMub2xkUmVjdD1zO2NvbnN0IGk9dGhpcy50bXBQb2ludHMubWFwKG09PlsuLi5tLlhZLDBdKS5mbGF0KDEpLG89bmUoaSk7cmV0dXJuIHRoaXMudk5vZGVzLnNldEluZm8obix7cmVjdDpzLG9wOmksb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLHNjYWxlVHlwZTp0aGlzLnNjYWxlVHlwZSxjYW5Sb3RhdGU6dGhpcy5jYW5Sb3RhdGUsY2VudGVyUG9zOnMmJnl0LmdldENlbnRlclBvcyhzLGEpfSkse3JlY3Q6cyx0eXBlOmx0LkZ1bGxXb3JrLGRhdGFUeXBlOlR0LkxvY2FsLHdvcmtJZDpuLG9wczpvLGlzU3luYzohMCxvcHQ6dGhpcy53b3JrT3B0aW9uc319ZHJhdyh0KXt2YXIgQTtjb25zdHt3b3JrSWQ6ZSxsYXllcjpuLGlzRHJhd2luZzphfT10O3RoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKGUpLm1hcChDPT5DLnJlbW92ZSgpKSwoQT10aGlzLmRyYXdMYXllcik9PW51bGx8fEEuZ2V0RWxlbWVudHNCeU5hbWUoZSkubWFwKEM9PkMucmVtb3ZlKCkpO2NvbnN0e3N0cm9rZUNvbG9yOnMsZmlsbENvbG9yOmksdGhpY2tuZXNzOm8sekluZGV4OmMsdmVydGljZXM6bSxzY2FsZTp1LHJvdGF0ZTpwLHRyYW5zbGF0ZTp5fT10aGlzLndvcmtPcHRpb25zLE89bi53b3JsZFNjYWxpbmcse3JlY3Q6eCxwb3M6dixwb2ludHM6VH09dGhpcy5jb21wdXREcmF3UG9pbnRzKG8sbSksbD17Y2xvc2U6ITAscG9pbnRzOlQsbGluZVdpZHRoOm8sZmlsbENvbG9yOmkhPT0idHJhbnNwYXJlbnQiJiZpfHx2b2lkIDAsc3Ryb2tlQ29sb3I6cyxub3JtYWxpemU6ITAsbGluZUpvaW46InJvdW5kIn0saD17bmFtZTplLGlkOmUsekluZGV4OmMscG9zOnYsYW5jaG9yOlsuNSwuNV0sc2l6ZTpbeC53LHguaF19O3UmJihoLnNjYWxlPXUpLHAmJihoLnJvdGF0ZT1wKSx5JiYoaC50cmFuc2xhdGU9eSk7Y29uc3QgZj1uZXcgcmUoaCk7aWYoYSl7Y29uc3QgQz1uZXcgaGUoe2Q6Ik0tNCwwSDRNMCwtNFY0Iixub3JtYWxpemU6ITAscG9zOlswLDBdLHN0cm9rZUNvbG9yOnMsbGluZVdpZHRoOjEsc2NhbGU6WzEvT1swXSwxL09bMV1dfSk7Zi5hcHBlbmQoQyl9Y29uc3QgZz1uZXcgZGUoey4uLmwscG9zOlswLDBdfSk7Zi5hcHBlbmQoZyksbi5hcHBlbmQoZik7Y29uc3QgTT1mLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybnt4Ok1hdGguZmxvb3IoTS54LXl0LlNhZmVCb3JkZXJQYWRkaW5nKSx5Ok1hdGguZmxvb3IoTS55LXl0LlNhZmVCb3JkZXJQYWRkaW5nKSx3Ok1hdGguZmxvb3IoTS53aWR0aCt5dC5TYWZlQm9yZGVyUGFkZGluZyoyKSxoOk1hdGguZmxvb3IoTS5oZWlnaHQreXQuU2FmZUJvcmRlclBhZGRpbmcqMil9fWNvbXB1dERyYXdQb2ludHModCxlKXtjb25zdCBuPUJ0KHRoaXMudG1wUG9pbnRzKSxhPVtNYXRoLmZsb29yKG4ueCtuLncvMiksTWF0aC5mbG9vcihuLnkrbi5oLzIpXSxzPVNuKG4udyxuLmgpLGk9TWF0aC5mbG9vcihNYXRoLm1pbihuLncsbi5oKS8yKSxvPVtdLGM9MipNYXRoLlBJL2U7Zm9yKGxldCB1PTA7dTxlO3UrKyl7Y29uc3QgcD11KmMtLjUqTWF0aC5QSSx5PWkqc1swXSpNYXRoLmNvcyhwKSxPPWkqc1sxXSpNYXRoLnNpbihwKTtvLnB1c2goeSxPKX1yZXR1cm57cmVjdDpCdCh0aGlzLnRtcFBvaW50cyx0KSxwb3M6YSxwb2ludHM6b319dXBkYXRlVGVtcFBvaW50cyh0KXtjb25zdCBlPXQuc2xpY2UoLTIpLG49bmV3IE10KGVbMF0sZVsxXSksYT10aGlzLnRtcFBvaW50c1swXSx7dGhpY2tuZXNzOnN9PXRoaXMud29ya09wdGlvbnM7aWYoYS5pc05lYXIobixzKXx8TXQuU3ViKGEsbikuWFkuaW5jbHVkZXMoMCkpcmV0dXJuITE7aWYodGhpcy50bXBQb2ludHMubGVuZ3RoPT09Mil7aWYobi5pc05lYXIodGhpcy50bXBQb2ludHNbMV0sMSkpcmV0dXJuITE7dGhpcy50bXBQb2ludHNbMV09bn1lbHNlIHRoaXMudG1wUG9pbnRzLnB1c2gobik7cmV0dXJuITB9Y29uc3VtZVNlcnZpY2UodCl7dmFyIG87Y29uc3R7b3A6ZSxpc0Z1bGxXb3JrOm59PXQsYT0obz10aGlzLndvcmtJZCk9PW51bGw/dm9pZCAwOm8udG9TdHJpbmcoKTtpZighYSlyZXR1cm47dGhpcy50bXBQb2ludHMubGVuZ3RoPTA7Zm9yKGxldCBjPTA7YzxlLmxlbmd0aDtjKz0zKXRoaXMudG1wUG9pbnRzLnB1c2gobmV3IE10KGVbY10sZVtjKzFdLGVbYysyXSkpO2NvbnN0IHM9bj90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXIsaT10aGlzLmRyYXcoe3dvcmtJZDphLGxheWVyOnMsaXNEcmF3aW5nOiExfSk7cmV0dXJuIHRoaXMub2xkUmVjdD1pLHRoaXMudk5vZGVzLnNldEluZm8oYSx7cmVjdDppLG9wOmUsb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLHNjYWxlVHlwZTp0aGlzLnNjYWxlVHlwZSxjYW5Sb3RhdGU6dGhpcy5jYW5Sb3RhdGUsY2VudGVyUG9zOmkmJnl0LmdldENlbnRlclBvcyhpLHMpfSksaX1jbGVhclRtcFBvaW50cygpe3RoaXMudG1wUG9pbnRzLmxlbmd0aD0wfXN0YXRpYyB1cGRhdGVOb2RlT3B0KHQpe2NvbnN0e25vZGU6ZSxvcHQ6bix2Tm9kZXM6YX09dCx7c3Ryb2tlQ29sb3I6cyxmaWxsQ29sb3I6aSx0b29sc1R5cGU6byx2ZXJ0aWNlczpjfT1uLG09YS5nZXQoZS5uYW1lKSx1PW09PW51bGw/dm9pZCAwOm0ub3B0O2xldCBwPWU7cmV0dXJuIGUudGFnTmFtZT09PSJHUk9VUCImJihwPWUuY2hpbGRyZW5bMF0pLHMmJihwLnNldEF0dHJpYnV0ZSgic3Ryb2tlQ29sb3IiLHMpLHUhPW51bGwmJnUuc3Ryb2tlQ29sb3ImJih1LnN0cm9rZUNvbG9yPXMpKSxpJiYoaT09PSJ0cmFuc3BhcmVudCI/cC5zZXRBdHRyaWJ1dGUoImZpbGxDb2xvciIsInJnYmEoMCwwLDAsMCkiKTpwLnNldEF0dHJpYnV0ZSgiZmlsbENvbG9yIixpKSx1IT1udWxsJiZ1LmZpbGxDb2xvciYmKHUuZmlsbENvbG9yPWkpKSxvPT09Z3QuUG9seWdvbiYmYyYmKHUudmVydGljZXM9YyksbSYmYS5zZXRJbmZvKGUubmFtZSx7Li4ubSxvcHQ6dX0pLHl0LnVwZGF0ZU5vZGVPcHQodCl9fWNsYXNzIGt0e3N0YXRpYyBiZXppZXIocix0KXtjb25zdCBlPVtdO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bis9NCl7Y29uc3QgYT10W25dLHM9dFtuKzFdLGk9dFtuKzJdLG89dFtuKzNdO2EmJnMmJmkmJm8/ZS5wdXNoKC4uLmt0LmdldEJlemllclBvaW50cyhyLGEscyxpLG8pKTphJiZzJiZpP2UucHVzaCguLi5rdC5nZXRCZXppZXJQb2ludHMocixhLHMsaSkpOmEmJnM/ZS5wdXNoKC4uLmt0LmdldEJlemllclBvaW50cyhyLGEscykpOmEmJmUucHVzaChhKX1yZXR1cm4gZX1zdGF0aWMgZ2V0QmV6aWVyUG9pbnRzKHI9MTAsdCxlLG4sYSl7bGV0IHM9bnVsbDtjb25zdCBpPVtdOyFuJiYhYT9zPWt0Lm9uZUJlemllcjpuJiYhYT9zPWt0LnR3b0JlemllcjpuJiZhJiYocz1rdC50aHJlZUJlemllcik7Zm9yKGxldCBvPTA7bzxyO28rKylzJiZpLnB1c2gocyhvL3IsdCxlLG4sYSkpO3JldHVybiBhP2kucHVzaChhKTpuJiZpLnB1c2gobiksaX1zdGF0aWMgb25lQmV6aWVyKHIsdCxlKXtjb25zdCBuPXQueCsoZS54LXQueCkqcixhPXQueSsoZS55LXQueSkqcjtyZXR1cm4gbmV3IGV0KG4sYSl9c3RhdGljIHR3b0JlemllcihyLHQsZSxuKXtjb25zdCBhPSgxLXIpKigxLXIpKnQueCsyKnIqKDEtcikqZS54K3IqcipuLngscz0oMS1yKSooMS1yKSp0LnkrMipyKigxLXIpKmUueStyKnIqbi55O3JldHVybiBuZXcgZXQoYSxzKX1zdGF0aWMgdGhyZWVCZXppZXIocix0LGUsbixhKXtjb25zdCBzPXQueCooMS1yKSooMS1yKSooMS1yKSszKmUueCpyKigxLXIpKigxLXIpKzMqbi54KnIqciooMS1yKSthLngqcipyKnIsaT10LnkqKDEtcikqKDEtcikqKDEtcikrMyplLnkqciooMS1yKSooMS1yKSszKm4ueSpyKnIqKDEtcikrYS55KnIqcipyO3JldHVybiBuZXcgZXQocyxpKX19Y2xhc3MgR24gZXh0ZW5kcyB5dHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KTtzdCh0aGlzLCJjYW5Sb3RhdGUiLCExKTtzdCh0aGlzLCJzY2FsZVR5cGUiLEZ0LmFsbCk7c3QodGhpcywidG9vbHNUeXBlIixndC5TcGVlY2hCYWxsb29uKTtzdCh0aGlzLCJyYXRpbyIsLjgpO3N0KHRoaXMsInRtcFBvaW50cyIsW10pO3N0KHRoaXMsIndvcmtPcHRpb25zIik7c3QodGhpcywib2xkUmVjdCIpO3N0KHRoaXMsInN5bmNUaW1lc3RhbXAiKTt0aGlzLndvcmtPcHRpb25zPXQudG9vbHNPcHQsdGhpcy5zeW5jVGltZXN0YW1wPTAsdGhpcy5zeW5jVW5pdFRpbWU9NTB9Y29uc3VtZSh0KXt2YXIgTztjb25zdHtkYXRhOmUsaXNGdWxsV29yazpuLGlzU3ViV29ya2VyOmF9PXQscz0oTz1lPT1udWxsP3ZvaWQgMDplLndvcmtJZCk9PW51bGw/dm9pZCAwOk8udG9TdHJpbmcoKTtpZighcylyZXR1cm57dHlwZTpsdC5Ob25lfTtjb25zdHtvcDppLHdvcmtTdGF0ZTpvfT1lLGM9aT09bnVsbD92b2lkIDA6aS5sZW5ndGg7aWYoIWN8fGM8MilyZXR1cm57dHlwZTpsdC5Ob25lfTtsZXQgbTtpZihvPT09SXQuU3RhcnQ/KHRoaXMudG1wUG9pbnRzPVtuZXcgTXQoaVswXSxpWzFdKV0sbT0hMSk6bT10aGlzLnVwZGF0ZVRlbXBQb2ludHMoaSksIW0pcmV0dXJue3R5cGU6bHQuTm9uZX07aWYoIWEpe2NvbnN0IHg9RGF0ZS5ub3coKTtyZXR1cm4geC10aGlzLnN5bmNUaW1lc3RhbXA+dGhpcy5zeW5jVW5pdFRpbWU/KHRoaXMuc3luY1RpbWVzdGFtcD14LHt0eXBlOmx0LkRyYXdXb3JrLGRhdGFUeXBlOlR0LkxvY2FsLHdvcmtJZDpzLG9wOnRoaXMudG1wUG9pbnRzLm1hcCh2PT5bLi4udi5YWSwwXSkuZmxhdCgxKSxpc1N5bmM6ITAsaW5kZXg6MH0pOnt0eXBlOmx0Lk5vbmV9fWNvbnN0IHU9bj90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXIscD10aGlzLmRyYXcoe3dvcmtJZDpzLGxheWVyOnUsaXNEcmF3aW5nOiEwfSkseT1PdChwLHRoaXMub2xkUmVjdCk7cmV0dXJuIHRoaXMub2xkUmVjdD1wLHtyZWN0OnksdHlwZTpsdC5EcmF3V29yayxkYXRhVHlwZTpUdC5Mb2NhbCx3b3JrSWQ6c319Y29uc3VtZUFsbCh0KXt2YXIgYztjb25zdHtkYXRhOmV9PXQsbj0oYz1lPT1udWxsP3ZvaWQgMDplLndvcmtJZCk9PW51bGw/dm9pZCAwOmMudG9TdHJpbmcoKTtpZighbilyZXR1cm57dHlwZTpsdC5Ob25lfTtpZih0aGlzLnRtcFBvaW50cy5sZW5ndGg8MilyZXR1cm57dHlwZTpsdC5SZW1vdmVOb2RlLHJlbW92ZUlkczpbbl19O2NvbnN0IGE9dGhpcy5mdWxsTGF5ZXIscz10aGlzLmRyYXcoe3dvcmtJZDpuLGxheWVyOmEsaXNEcmF3aW5nOiExfSk7dGhpcy5vbGRSZWN0PXM7Y29uc3QgaT10aGlzLnRtcFBvaW50cy5tYXAobT0+Wy4uLm0uWFksMF0pLmZsYXQoMSksbz1uZShpKTtyZXR1cm4gdGhpcy52Tm9kZXMuc2V0SW5mbyhuLHtyZWN0OnMsb3A6aSxvcHQ6dGhpcy53b3JrT3B0aW9ucyx0b29sc1R5cGU6dGhpcy50b29sc1R5cGUsc2NhbGVUeXBlOnRoaXMuc2NhbGVUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxjZW50ZXJQb3M6cyYmeXQuZ2V0Q2VudGVyUG9zKHMsYSl9KSx7cmVjdDpzLHR5cGU6bHQuRnVsbFdvcmssZGF0YVR5cGU6VHQuTG9jYWwsd29ya0lkOm4sb3BzOm8saXNTeW5jOiEwLG9wdDp0aGlzLndvcmtPcHRpb25zfX1kcmF3KHQpe3ZhciBnO2NvbnN0e3dvcmtJZDplLGxheWVyOm59PXQ7dGhpcy5mdWxsTGF5ZXIuZ2V0RWxlbWVudHNCeU5hbWUoZSkubWFwKE09Pk0ucmVtb3ZlKCkpLChnPXRoaXMuZHJhd0xheWVyKT09bnVsbHx8Zy5nZXRFbGVtZW50c0J5TmFtZShlKS5tYXAoTT0+TS5yZW1vdmUoKSk7Y29uc3R7c3Ryb2tlQ29sb3I6YSxmaWxsQ29sb3I6cyx0aGlja25lc3M6aSx6SW5kZXg6byxwbGFjZW1lbnQ6YyxzY2FsZTptLHJvdGF0ZTp1LHRyYW5zbGF0ZTpwfT10aGlzLndvcmtPcHRpb25zLHtyZWN0OnkscG9zOk8scG9pbnRzOnh9PXRoaXMuY29tcHV0RHJhd1BvaW50cyhpLGMpLHY9e3BvaW50czp4Lm1hcChNPT5NLlhZKSxsaW5lV2lkdGg6aSxmaWxsQ29sb3I6cyE9PSJ0cmFuc3BhcmVudCImJnN8fHZvaWQgMCxzdHJva2VDb2xvcjphLG5vcm1hbGl6ZTohMCxjbGFzc05hbWU6YCR7T1swXX0sJHtPWzFdfWAsbGluZUpvaW46InJvdW5kIixjbG9zZTohMH0sVD17bmFtZTplLGlkOmUsekluZGV4Om8scG9zOk8sYW5jaG9yOlsuNSwuNV0sc2l6ZTpbeS53LHkuaF19O20mJihULnNjYWxlPW0pLHUmJihULnJvdGF0ZT11KSxwJiYoVC50cmFuc2xhdGU9cCk7Y29uc3QgbD1uZXcgcmUoVCksaD1uZXcgZGUoey4uLnYscG9zOlswLDBdfSk7bC5hcHBlbmQoaCksbi5hcHBlbmQobCk7Y29uc3QgZj1sLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybnt4Ok1hdGguZmxvb3IoZi54LXl0LlNhZmVCb3JkZXJQYWRkaW5nKSx5Ok1hdGguZmxvb3IoZi55LXl0LlNhZmVCb3JkZXJQYWRkaW5nKSx3Ok1hdGguZmxvb3IoZi53aWR0aCt5dC5TYWZlQm9yZGVyUGFkZGluZyoyKSxoOk1hdGguZmxvb3IoZi5oZWlnaHQreXQuU2FmZUJvcmRlclBhZGRpbmcqMil9fXRyYW5zZm9ybUNvbnRyb2xQb2ludHModCl7Y29uc3QgZT1CdCh0aGlzLnRtcFBvaW50cyk7c3dpdGNoKHQpe2Nhc2UiYm90dG9tIjpjYXNlImJvdHRvbUxlZnQiOmNhc2UiYm90dG9tUmlnaHQiOntjb25zdCBuPWUueStlLmgqdGhpcy5yYXRpbztyZXR1cm5bbmV3IGV0KGUueCxlLnksMCksbmV3IGV0KGUueCtlLncsZS55LDApLG5ldyBldChlLngrZS53LG4sMCksbmV3IGV0KGUueCxuLDApXX1jYXNlInRvcCI6Y2FzZSJ0b3BMZWZ0IjpjYXNlInRvcFJpZ2h0Ijp7Y29uc3Qgbj1lLnkrZS5oKigxLXRoaXMucmF0aW8pO3JldHVybltuZXcgZXQoZS54LG4sMCksbmV3IGV0KGUueCtlLncsbiwwKSxuZXcgZXQoZS54K2UudyxlLnkrZS5oLDApLG5ldyBldChlLngsZS55K2UuaCwwKV19Y2FzZSJsZWZ0IjpjYXNlImxlZnRCb3R0b20iOmNhc2UibGVmdFRvcCI6e2NvbnN0IG49ZS54K2UudyooMS10aGlzLnJhdGlvKTtyZXR1cm5bbmV3IGV0KG4sZS55LDApLG5ldyBldChlLngrZS53LGUueSwwKSxuZXcgZXQoZS54K2UudyxlLnkrZS5oLDApLG5ldyBldChuLGUueStlLmgsMCldfWNhc2UicmlnaHQiOmNhc2UicmlnaHRCb3R0b20iOmNhc2UicmlnaHRUb3AiOntjb25zdCBuPWUueCtlLncqdGhpcy5yYXRpbztyZXR1cm5bbmV3IGV0KGUueCxlLnksMCksbmV3IGV0KG4sZS55LDApLG5ldyBldChuLGUueStlLmgsMCksbmV3IGV0KGUueCxlLnkrZS5oLDApXX19fWNvbXB1dERyYXdQb2ludHModCxlKXtjb25zdCBuPUJ0KHRoaXMudG1wUG9pbnRzKSxhPXRoaXMudHJhbnNmb3JtQ29udHJvbFBvaW50cyhlKSxzPU1hdGguZmxvb3Iobi53Ki4xKSxpPU1hdGguZmxvb3Iobi5oKi4xKSxvPVtdLGM9ZXQuQWRkKGFbMF0sbmV3IGV0KDAsaSwwKSksbT1ldC5BZGQoYVswXSxuZXcgZXQocywwLDApKSx1PWt0LmdldEJlemllclBvaW50cygxMCxjLGFbMF0sbSkscD1ldC5TdWIoYVsxXSxuZXcgZXQocywwLDApKSx5PWV0LkFkZChhWzFdLG5ldyBldCgwLGksMCkpLE89a3QuZ2V0QmV6aWVyUG9pbnRzKDEwLHAsYVsxXSx5KSx4PWV0LlN1YihhWzJdLG5ldyBldCgwLGksMCkpLHY9ZXQuU3ViKGFbMl0sbmV3IGV0KHMsMCwwKSksVD1rdC5nZXRCZXppZXJQb2ludHMoMTAseCxhWzJdLHYpLGw9ZXQuQWRkKGFbM10sbmV3IGV0KHMsMCwwKSksaD1ldC5TdWIoYVszXSxuZXcgZXQoMCxpLDApKSxmPWt0LmdldEJlemllclBvaW50cygxMCxsLGFbM10saCksZz1zKigxLXRoaXMucmF0aW8pKjEwLE09aSooMS10aGlzLnJhdGlvKSoxMDtzd2l0Y2goZSl7Y2FzZSJib3R0b20iOntjb25zdCBiPWV0LlN1YihhWzJdLG5ldyBldChzKjUtZy8yLDAsMCkpLEU9ZXQuU3ViKGFbMl0sbmV3IGV0KHMqNSwtTSwwKSksTD1ldC5TdWIoYVsyXSxuZXcgZXQocyo1K2cvMiwwLDApKTtvLnB1c2goRSxMLC4uLmYsLi4udSwuLi5PLC4uLlQsYik7YnJlYWt9Y2FzZSJib3R0b21SaWdodCI6e2NvbnN0IGI9ZXQuU3ViKGFbMl0sbmV3IGV0KHMqMS4xLDAsMCkpLEU9ZXQuU3ViKGFbMl0sbmV3IGV0KHMqMS4xK2cvMiwtTSwwKSksTD1ldC5TdWIoYVsyXSxuZXcgZXQocyoxLjErZywwLDApKTtvLnB1c2goRSxMLC4uLmYsLi4udSwuLi5PLC4uLlQsYik7YnJlYWt9Y2FzZSJib3R0b21MZWZ0Ijp7Y29uc3QgYj1ldC5BZGQoYVszXSxuZXcgZXQocyoxLjErZywwLDApKSxFPWV0LkFkZChhWzNdLG5ldyBldChzKjEuMStnLzIsTSwwKSksTD1ldC5BZGQoYVszXSxuZXcgZXQocyoxLjEsMCwwKSk7by5wdXNoKEUsTCwuLi5mLC4uLnUsLi4uTywuLi5ULGIpO2JyZWFrfWNhc2UidG9wIjp7Y29uc3QgYj1ldC5TdWIoYVsxXSxuZXcgZXQocyo1LWcvMiwwLDApKSxFPWV0LlN1YihhWzFdLG5ldyBldChzKjUsTSwwKSksTD1ldC5TdWIoYVsxXSxuZXcgZXQocyo1K2cvMiwwLDApKTtvLnB1c2goRSxiLC4uLk8sLi4uVCwuLi5mLC4uLnUsTCk7YnJlYWt9Y2FzZSJ0b3BSaWdodCI6e2NvbnN0IGI9ZXQuU3ViKGFbMV0sbmV3IGV0KHMqMS4xLDAsMCkpLEU9ZXQuU3ViKGFbMV0sbmV3IGV0KHMqMS4xK2cvMixNLDApKSxMPWV0LlN1YihhWzFdLG5ldyBldChzKjEuMStnLDAsMCkpO28ucHVzaChFLGIsLi4uTywuLi5ULC4uLmYsLi4udSxMKTticmVha31jYXNlInRvcExlZnQiOntjb25zdCBiPWV0LkFkZChhWzBdLG5ldyBldChzKjEuMStnLDAsMCkpLEU9ZXQuQWRkKGFbMF0sbmV3IGV0KHMqMS4xK2cvMiwtTSwwKSksTD1ldC5BZGQoYVswXSxuZXcgZXQocyoxLjEsMCwwKSk7by5wdXNoKEUsYiwuLi5PLC4uLlQsLi4uZiwuLi51LEwpO2JyZWFrfWNhc2UibGVmdCI6e2NvbnN0IGI9ZXQuQWRkKGFbMF0sbmV3IGV0KDAsaSo1LU0vMiwwKSksRT1ldC5BZGQoYVswXSxuZXcgZXQoLWcsaSo1LDApKSxMPWV0LkFkZChhWzBdLG5ldyBldCgwLGkqNStNLzIsMCkpO28ucHVzaChFLGIsLi4udSwuLi5PLC4uLlQsLi4uZixMKTticmVha31jYXNlImxlZnRUb3AiOntjb25zdCBiPWV0LkFkZChhWzBdLG5ldyBldCgwLGkqMS4xLDApKSxFPWV0LkFkZChhWzBdLG5ldyBldCgtZyxpKjEuMStNLzIsMCkpLEw9ZXQuQWRkKGFbMF0sbmV3IGV0KDAsaSoxLjErTSwwKSk7by5wdXNoKEUsYiwuLi51LC4uLk8sLi4uVCwuLi5mLEwpO2JyZWFrfWNhc2UibGVmdEJvdHRvbSI6e2NvbnN0IGI9ZXQuU3ViKGFbM10sbmV3IGV0KDAsaSoxLjErTSwwKSksRT1ldC5TdWIoYVszXSxuZXcgZXQoZyxpKjEuMStNLzIsMCkpLEw9ZXQuU3ViKGFbM10sbmV3IGV0KDAsaSoxLjEsMCkpO28ucHVzaChFLGIsLi4udSwuLi5PLC4uLlQsLi4uZixMKTticmVha31jYXNlInJpZ2h0Ijp7Y29uc3QgYj1ldC5BZGQoYVsxXSxuZXcgZXQoMCxpKjUtTS8yLDApKSxFPWV0LkFkZChhWzFdLG5ldyBldChnLGkqNSwwKSksTD1ldC5BZGQoYVsxXSxuZXcgZXQoMCxpKjUrTS8yLDApKTtvLnB1c2goRSxMLC4uLlQsLi4uZiwuLi51LC4uLk8sYik7YnJlYWt9Y2FzZSJyaWdodFRvcCI6e2NvbnN0IGI9ZXQuQWRkKGFbMV0sbmV3IGV0KDAsaSoxLjEsMCkpLEU9ZXQuQWRkKGFbMV0sbmV3IGV0KGcsaSoxLjErTS8yLDApKSxMPWV0LkFkZChhWzFdLG5ldyBldCgwLGkqMS4xK00sMCkpO28ucHVzaChFLEwsLi4uVCwuLi5mLC4uLnUsLi4uTyxiKTticmVha31jYXNlInJpZ2h0Qm90dG9tIjp7Y29uc3QgYj1ldC5TdWIoYVsyXSxuZXcgZXQoMCxpKjEuMStNLDApKSxFPWV0LlN1YihhWzJdLG5ldyBldCgtZyxpKjEuMStNLzIsMCkpLEw9ZXQuU3ViKGFbMl0sbmV3IGV0KDAsaSoxLjEsMCkpO28ucHVzaChFLEwsLi4uVCwuLi5mLC4uLnUsLi4uTyxiKTticmVha319Y29uc3QgQT1CdCh0aGlzLnRtcFBvaW50cyx0KSxDPVtNYXRoLmZsb29yKEEueCtBLncvMiksTWF0aC5mbG9vcihBLnkrQS5oLzIpXTtyZXR1cm57cmVjdDpBLHBvczpDLHBvaW50czpvfX11cGRhdGVUZW1wUG9pbnRzKHQpe2NvbnN0IGU9dC5zbGljZSgtMiksbj1uZXcgTXQoZVswXSxlWzFdKSxhPXRoaXMudG1wUG9pbnRzWzBdLHt0aGlja25lc3M6c309dGhpcy53b3JrT3B0aW9ucztpZihhLmlzTmVhcihuLHMpfHxNdC5TdWIoYSxuKS5YWS5pbmNsdWRlcygwKSlyZXR1cm4hMTtpZih0aGlzLnRtcFBvaW50cy5sZW5ndGg9PT0yKXtpZihuLmlzTmVhcih0aGlzLnRtcFBvaW50c1sxXSwxKSlyZXR1cm4hMTt0aGlzLnRtcFBvaW50c1sxXT1ufWVsc2UgdGhpcy50bXBQb2ludHMucHVzaChuKTtyZXR1cm4hMH1jb25zdW1lU2VydmljZSh0KXt2YXIgbztjb25zdHtvcDplLGlzRnVsbFdvcms6bn09dCxhPShvPXRoaXMud29ya0lkKT09bnVsbD92b2lkIDA6by50b1N0cmluZygpO2lmKCFhKXJldHVybjt0aGlzLnRtcFBvaW50cy5sZW5ndGg9MDtmb3IobGV0IGM9MDtjPGUubGVuZ3RoO2MrPTMpdGhpcy50bXBQb2ludHMucHVzaChuZXcgTXQoZVtjXSxlW2MrMV0sZVtjKzJdKSk7Y29uc3Qgcz1uP3RoaXMuZnVsbExheWVyOnRoaXMuZHJhd0xheWVyfHx0aGlzLmZ1bGxMYXllcixpPXRoaXMuZHJhdyh7d29ya0lkOmEsbGF5ZXI6cyxpc0RyYXdpbmc6ITF9KTtyZXR1cm4gdGhpcy5vbGRSZWN0PWksdGhpcy52Tm9kZXMuc2V0SW5mbyhhLHtyZWN0Omksb3A6ZSxvcHQ6dGhpcy53b3JrT3B0aW9ucyx0b29sc1R5cGU6dGhpcy50b29sc1R5cGUsc2NhbGVUeXBlOnRoaXMuc2NhbGVUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxjZW50ZXJQb3M6aSYmeXQuZ2V0Q2VudGVyUG9zKGkscyl9KSxpfWNsZWFyVG1wUG9pbnRzKCl7dGhpcy50bXBQb2ludHMubGVuZ3RoPTB9c3RhdGljIHVwZGF0ZU5vZGVPcHQodCl7Y29uc3R7bm9kZTplLG9wdDpuLHZOb2RlczphfT10LHtzdHJva2VDb2xvcjpzLGZpbGxDb2xvcjppLHRvb2xzVHlwZTpvLHBsYWNlbWVudDpjfT1uLG09YS5nZXQoZS5uYW1lKSx1PW09PW51bGw/dm9pZCAwOm0ub3B0O2xldCBwPWU7cmV0dXJuIGUudGFnTmFtZT09PSJHUk9VUCImJihwPWUuY2hpbGRyZW5bMF0pLHMmJihwLnNldEF0dHJpYnV0ZSgic3Ryb2tlQ29sb3IiLHMpLHUhPW51bGwmJnUuc3Ryb2tlQ29sb3ImJih1LnN0cm9rZUNvbG9yPXMpKSxpJiYoaT09PSJ0cmFuc3BhcmVudCI/cC5zZXRBdHRyaWJ1dGUoImZpbGxDb2xvciIsInJnYmEoMCwwLDAsMCkiKTpwLnNldEF0dHJpYnV0ZSgiZmlsbENvbG9yIixpKSx1IT1udWxsJiZ1LmZpbGxDb2xvciYmKHUuZmlsbENvbG9yPWkpKSxvPT09Z3QuU3BlZWNoQmFsbG9vbiYmYyYmKHUucGxhY2VtZW50PWMpLG0mJmEuc2V0SW5mbyhlLm5hbWUsey4uLm0sb3B0OnV9KSx5dC51cGRhdGVOb2RlT3B0KHQpfX1jbGFzcyBIbiBleHRlbmRzIHl0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO3N0KHRoaXMsImNhblJvdGF0ZSIsITApO3N0KHRoaXMsInNjYWxlVHlwZSIsRnQuYWxsKTtzdCh0aGlzLCJ0b29sc1R5cGUiLGd0LkltYWdlKTtzdCh0aGlzLCJ0bXBQb2ludHMiLFtdKTtzdCh0aGlzLCJ3b3JrT3B0aW9ucyIpO3N0KHRoaXMsIm9sZFJlY3QiKTt0aGlzLndvcmtPcHRpb25zPXQudG9vbHNPcHQsdGhpcy5zY2FsZVR5cGU9dGhpcy53b3JrT3B0aW9ucy51bmlmb3JtU2NhbGU/RnQucHJvcG9ydGlvbmFsOkZ0LmFsbH1jb25zdW1lKCl7cmV0dXJue3R5cGU6bHQuTm9uZX19Y29uc3VtZUFsbCgpe3JldHVybnt0eXBlOmx0Lk5vbmV9fWRyYXcodCl7dmFyIGg7Y29uc3R7bGF5ZXI6ZSx3b3JrSWQ6bixyZXBsYWNlSWQ6YSxpbWFnZUJpdG1hcDpzfT10LHtjZW50ZXJYOmksY2VudGVyWTpvLHdpZHRoOmMsaGVpZ2h0Om0sc2NhbGU6dSxyb3RhdGU6cCx0cmFuc2xhdGU6eSx6SW5kZXg6T309dGhpcy53b3JrT3B0aW9uczt0aGlzLmZ1bGxMYXllci5nZXRFbGVtZW50c0J5TmFtZShhfHxuKS5tYXAoZj0+Zi5yZW1vdmUoKSksKGg9dGhpcy5kcmF3TGF5ZXIpPT1udWxsfHxoLmdldEVsZW1lbnRzQnlOYW1lKGF8fG4pLm1hcChmPT5mLnJlbW92ZSgpKTtjb25zdCB4PXthbmNob3I6Wy41LC41XSxwb3M6W2ksb10sbmFtZTpuLHNpemU6W2MsbV0sekluZGV4Ok99O2lmKHUpaWYodGhpcy5zY2FsZVR5cGU9PT1GdC5wcm9wb3J0aW9uYWwpe2NvbnN0IGY9TWF0aC5taW4odVswXSx1WzFdKTt4LnNjYWxlPVtmLGZdfWVsc2UgeC5zY2FsZT11O3kmJih4LnRyYW5zbGF0ZT15KSxwJiYoeC5yb3RhdGU9cCk7Y29uc3Qgdj1uZXcgcmUoeCksVD1uZXcgemgoe2FuY2hvcjpbLjUsLjVdLHBvczpbMCwwXSxzaXplOltjLG1dLHRleHR1cmU6cyxyb3RhdGU6MTgwfSk7di5hcHBlbmQoVCksZS5hcHBlbmQodik7Y29uc3QgbD12LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKGwpcmV0dXJue3g6TWF0aC5mbG9vcihsLngteXQuU2FmZUJvcmRlclBhZGRpbmcpLHk6TWF0aC5mbG9vcihsLnkteXQuU2FmZUJvcmRlclBhZGRpbmcpLHc6TWF0aC5mbG9vcihsLndpZHRoK3l0LlNhZmVCb3JkZXJQYWRkaW5nKjIpLGg6TWF0aC5mbG9vcihsLmhlaWdodCt5dC5TYWZlQm9yZGVyUGFkZGluZyoyKX19Y29uc3VtZVNlcnZpY2UoKXt9YXN5bmMgY29uc3VtZVNlcnZpY2VBc3luYyh0KXt2YXIgbSx1O2NvbnN0e2lzRnVsbFdvcms6ZSxyZXBsYWNlSWQ6bixzY2VuZTphfT10LHtzcmM6cyx1dWlkOml9PXRoaXMud29ya09wdGlvbnMsbz0oKG09dGhpcy53b3JrSWQpPT1udWxsP3ZvaWQgMDptLnRvU3RyaW5nKCkpfHxpLGM9ZT90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXI7aWYocyl7Y29uc3QgcD1hd2FpdCBhLnByZWxvYWQoe2lkOmksc3JjOnRoaXMud29ya09wdGlvbnMuc3JjfSkseT10aGlzLmRyYXcoe3dvcmtJZDpvLGxheWVyOmMscmVwbGFjZUlkOm4saW1hZ2VCaXRtYXA6cFswXX0pO3JldHVybiB0aGlzLm9sZFJlY3Q9byYmKCh1PXRoaXMudk5vZGVzLmdldChvKSk9PW51bGw/dm9pZCAwOnUucmVjdCl8fHZvaWQgMCx0aGlzLnZOb2Rlcy5zZXRJbmZvKG8se3JlY3Q6eSxvcDpbXSxvcHQ6dGhpcy53b3JrT3B0aW9ucyx0b29sc1R5cGU6dGhpcy50b29sc1R5cGUsc2NhbGVUeXBlOnRoaXMuc2NhbGVUeXBlLGNhblJvdGF0ZTp0aGlzLmNhblJvdGF0ZSxjZW50ZXJQb3M6eSYmeXQuZ2V0Q2VudGVyUG9zKHksYyl9KSx5fX1jbGVhclRtcFBvaW50cygpe3RoaXMudG1wUG9pbnRzLmxlbmd0aD0wfXN0YXRpYyB1cGRhdGVOb2RlT3B0KHQpe2NvbnN0e25vZGU6ZSxvcHQ6bix2Tm9kZXM6YSx0YXJnZXROb2RlOnN9PXQse3RyYW5zbGF0ZTppLGJveDpvLGJveFNjYWxlOmMsYm94VHJhbnNsYXRlOm0sYW5nbGU6dSxpc0xvY2tlZDpwLHpJbmRleDp5fT1uLE89cyYmWnQocyl8fGEuZ2V0KGUubmFtZSk7aWYoIU8pcmV0dXJuO2NvbnN0IHg9ZS5wYXJlbnQ7aWYoeCl7aWYob2UoeSkmJihlLnNldEF0dHJpYnV0ZSgiekluZGV4Iix5KSxPLm9wdC56SW5kZXg9eSksZ2UocCkmJihPLm9wdC5sb2NrZWQ9cCksbyYmbSYmYyl7Y29uc3R7Y2VudGVyWDp2LGNlbnRlclk6VCx3aWR0aDpsLGhlaWdodDpoLHVuaWZvcm1TY2FsZTpmfT1PLm9wdDtpZihmKXtjb25zdCBBPU1hdGgubWluKGNbMF0sY1sxXSk7Ty5vcHQuc2NhbGU9W0EsQV19ZWxzZSBPLm9wdC5zY2FsZT1jO08ub3B0LndpZHRoPU1hdGguZmxvb3IobCpjWzBdKSxPLm9wdC5oZWlnaHQ9TWF0aC5mbG9vcihoKmNbMV0pO2NvbnN0IGc9W21bMF0veC53b3JsZFNjYWxpbmdbMF0sbVsxXS94LndvcmxkU2NhbGluZ1sxXV07Ty5vcHQuY2VudGVyWD12K2dbMF0sTy5vcHQuY2VudGVyWT1UK2dbMV07Y29uc3QgTT1bTy5jZW50ZXJQb3NbMF0rZ1swXSxPLmNlbnRlclBvc1sxXStnWzFdXTtpZihPLmNlbnRlclBvcz1NLHMpe2xldCBBPXluKE8ucmVjdCxjKTtBPUNlKEEsZyksTy5yZWN0PUF9fWVsc2UgaWYoaSl7Y29uc3Qgdj1baVswXS94LndvcmxkU2NhbGluZ1swXSxpWzFdL3gud29ybGRTY2FsaW5nWzFdXTtpZihPLm9wdC5jZW50ZXJYPU8ub3B0LmNlbnRlclgrdlswXSxPLm9wdC5jZW50ZXJZPU8ub3B0LmNlbnRlclkrdlsxXSxPLmNlbnRlclBvcz1bTy5jZW50ZXJQb3NbMF0rdlswXSxPLmNlbnRlclBvc1sxXSt2WzFdXSxzKXtjb25zdCBUPUNlKE8ucmVjdCx2KTtPLnJlY3Q9VH19ZWxzZSBpZihvZSh1KSYmKGUuc2V0QXR0cmlidXRlKCJyb3RhdGUiLHUpLE8ub3B0LnJvdGF0ZT11LHMpKXtjb25zdCB2PXZuKE8ucmVjdCx1KTtPLnJlY3Q9dn1yZXR1cm4gTyYmYS5zZXRJbmZvKGUubmFtZSxPKSxPPT1udWxsP3ZvaWQgMDpPLnJlY3R9fX1jbGFzcyBLbiBleHRlbmRzIHl0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpO3N0KHRoaXMsImNhblJvdGF0ZSIsITEpO3N0KHRoaXMsInNjYWxlVHlwZSIsRnQuYm90aCk7c3QodGhpcywidG9vbHNUeXBlIixndC5TdHJhaWdodCk7c3QodGhpcywidG1wUG9pbnRzIixbXSk7c3QodGhpcywid29ya09wdGlvbnMiKTtzdCh0aGlzLCJvbGRSZWN0Iik7c3QodGhpcywic3RyYWlnaHRUaXBXaWR0aCIpO3N0KHRoaXMsInN5bmNUaW1lc3RhbXAiKTt0aGlzLndvcmtPcHRpb25zPXQudG9vbHNPcHQsdGhpcy5zdHJhaWdodFRpcFdpZHRoPXRoaXMud29ya09wdGlvbnMudGhpY2tuZXNzLzIsdGhpcy5zeW5jVGltZXN0YW1wPTAsdGhpcy5zeW5jVW5pdFRpbWU9NTB9Y29uc3VtZSh0KXt2YXIgTztjb25zdHtkYXRhOmUsaXNGdWxsV29yazpuLGlzU3ViV29ya2VyOmF9PXQscz0oTz1lPT1udWxsP3ZvaWQgMDplLndvcmtJZCk9PW51bGw/dm9pZCAwOk8udG9TdHJpbmcoKTtpZighcylyZXR1cm57dHlwZTpsdC5Ob25lfTtjb25zdHtvcDppLHdvcmtTdGF0ZTpvfT1lLGM9aT09bnVsbD92b2lkIDA6aS5sZW5ndGg7aWYoIWN8fGM8MilyZXR1cm57dHlwZTpsdC5Ob25lfTtsZXQgbTtpZihvPT09SXQuU3RhcnQ/KHRoaXMudG1wUG9pbnRzPVtuZXcgTXQoaVswXSxpWzFdKV0sbT0hMSk6bT10aGlzLnVwZGF0ZVRlbXBQb2ludHMoaSksIW0pcmV0dXJue3R5cGU6bHQuTm9uZX07aWYoIWEpe2NvbnN0IHg9RGF0ZS5ub3coKTtyZXR1cm4geC10aGlzLnN5bmNUaW1lc3RhbXA+dGhpcy5zeW5jVW5pdFRpbWU/KHRoaXMuc3luY1RpbWVzdGFtcD14LHt0eXBlOmx0LkRyYXdXb3JrLGRhdGFUeXBlOlR0LkxvY2FsLHdvcmtJZDpzLG9wOnRoaXMudG1wUG9pbnRzLm1hcCh2PT5bLi4udi5YWSwwXSkuZmxhdCgxKSxpc1N5bmM6ITAsaW5kZXg6MH0pOnt0eXBlOmx0Lk5vbmV9fWNvbnN0IHU9bj90aGlzLmZ1bGxMYXllcjp0aGlzLmRyYXdMYXllcnx8dGhpcy5mdWxsTGF5ZXIscD10aGlzLmRyYXcoe3dvcmtJZDpzLGxheWVyOnV9KSx5PU90KHAsdGhpcy5vbGRSZWN0KTtyZXR1cm4gdGhpcy5vbGRSZWN0PXAse3JlY3Q6eSx0eXBlOmx0LkRyYXdXb3JrLGRhdGFUeXBlOlR0LkxvY2FsLHdvcmtJZDpzfX1jb25zdW1lQWxsKHQpe3ZhciBjO2NvbnN0e2RhdGE6ZX09dCxuPShjPWU9PW51bGw/dm9pZCAwOmUud29ya0lkKT09bnVsbD92b2lkIDA6Yy50b1N0cmluZygpO2lmKCFuKXJldHVybnt0eXBlOmx0Lk5vbmV9O2lmKHRoaXMudG1wUG9pbnRzLmxlbmd0aDwyKXJldHVybnt0eXBlOmx0LlJlbW92ZU5vZGUscmVtb3ZlSWRzOltuXX07Y29uc3QgYT10aGlzLmZ1bGxMYXllcixzPXRoaXMuZHJhdyh7d29ya0lkOm4sbGF5ZXI6YX0pO3RoaXMub2xkUmVjdD1zO2NvbnN0IGk9dGhpcy50bXBQb2ludHMubWFwKG09PlsuLi5tLlhZLDBdKS5mbGF0KDEpLG89bmUoaSk7cmV0dXJuIHRoaXMudk5vZGVzLnNldEluZm8obix7cmVjdDpzLG9wOmksb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLHNjYWxlVHlwZTp0aGlzLnNjYWxlVHlwZSxjYW5Sb3RhdGU6dGhpcy5jYW5Sb3RhdGUsY2VudGVyUG9zOnMmJnl0LmdldENlbnRlclBvcyhzLGEpfSkse3JlY3Q6cyx0eXBlOmx0LkZ1bGxXb3JrLGRhdGFUeXBlOlR0LkxvY2FsLHdvcmtJZDpuLG9wczpvLGlzU3luYzohMCxvcHQ6dGhpcy53b3JrT3B0aW9uc319ZHJhdyh0KXt2YXIgaDtjb25zdHt3b3JrSWQ6ZSxsYXllcjpufT10O3RoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKGUpLm1hcChmPT5mLnJlbW92ZSgpKSwoaD10aGlzLmRyYXdMYXllcik9PW51bGx8fGguZ2V0RWxlbWVudHNCeU5hbWUoZSkubWFwKGY9PmYucmVtb3ZlKCkpO2NvbnN0e3N0cm9rZUNvbG9yOmEsdGhpY2tuZXNzOnMsekluZGV4Omksc2NhbGU6byxyb3RhdGU6Yyx0cmFuc2xhdGU6bX09dGhpcy53b3JrT3B0aW9ucyx1PW4ud29ybGRQb3NpdGlvbixwPW4ud29ybGRTY2FsaW5nLHtkOnkscmVjdDpPfT10aGlzLmNvbXB1dERyYXdQb2ludHMocykseD1bTy54K08udy8yLE8ueStPLmgvMl0sdj17cG9zOngsbmFtZTplLGlkOmUsZDp5LGZpbGxDb2xvcjphLHN0cm9rZUNvbG9yOmEsbGluZVdpZHRoOjAsY2xhc3NOYW1lOmAke3hbMF19LCR7eFsxXX1gLG5vcm1hbGl6ZTohMCx6SW5kZXg6aX07byYmKHYuc2NhbGU9byksYyYmKHYucm90YXRlPWMpLG0mJih2LnRyYW5zbGF0ZT1tKTtjb25zdCBUPW5ldyBoZSh2KTtpZihuLmFwcGVuZChUKSxjfHxvfHxtKXtjb25zdCBmPVQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJue3g6TWF0aC5mbG9vcihmLngteXQuU2FmZUJvcmRlclBhZGRpbmcpLHk6TWF0aC5mbG9vcihmLnkteXQuU2FmZUJvcmRlclBhZGRpbmcpLHc6TWF0aC5mbG9vcihmLndpZHRoK3l0LlNhZmVCb3JkZXJQYWRkaW5nKjIpLGg6TWF0aC5mbG9vcihmLmhlaWdodCt5dC5TYWZlQm9yZGVyUGFkZGluZyoyKX19cmV0dXJue3g6TWF0aC5mbG9vcihPLngqcFswXSt1WzBdLXl0LlNhZmVCb3JkZXJQYWRkaW5nKSx5Ok1hdGguZmxvb3IoTy55KnBbMV0rdVsxXS15dC5TYWZlQm9yZGVyUGFkZGluZyksdzpNYXRoLmZsb29yKE8udypwWzBdKzIqeXQuU2FmZUJvcmRlclBhZGRpbmcpLGg6TWF0aC5mbG9vcihPLmgqcFsxXSsyKnl0LlNhZmVCb3JkZXJQYWRkaW5nKX19Y29tcHV0RHJhd1BvaW50cyh0KXtyZXR1cm4gdGhpcy50bXBQb2ludHNbMV0uZGlzdGFuY2UodGhpcy50bXBQb2ludHNbMF0pPnRoaXMuc3RyYWlnaHRUaXBXaWR0aD90aGlzLmNvbXB1dEZ1bGxQb2ludHModCk6dGhpcy5jb21wdXREb3RQb2ludHModCl9Y29tcHV0RnVsbFBvaW50cyh0KXtjb25zdCBlPWV0LlN1Yih0aGlzLnRtcFBvaW50c1sxXSx0aGlzLnRtcFBvaW50c1swXSkudW5pKCksbj1ldC5QZXIoZSkubXVsKHQvMiksYT1NdC5TdWIodGhpcy50bXBQb2ludHNbMF0sbikscz1NdC5BZGQodGhpcy50bXBQb2ludHNbMF0sbiksaT1NdC5TdWIodGhpcy50bXBQb2ludHNbMV0sbiksbz1NdC5BZGQodGhpcy50bXBQb2ludHNbMV0sbiksYz1NdC5HZXRTZW1pY2lyY2xlU3Ryb2tlKHRoaXMudG1wUG9pbnRzWzFdLGksLTEsOCksbT1NdC5HZXRTZW1pY2lyY2xlU3Ryb2tlKHRoaXMudG1wUG9pbnRzWzBdLHMsLTEsOCksdT1bYSxpLC4uLmMsbyxzLC4uLm1dO3JldHVybntkOk9lKHUsITApLHJlY3Q6QnQodSksaXNEb3Q6ITEscG9zOnRoaXMudG1wUG9pbnRzWzBdLlhZfX1jb21wdXREb3RQb2ludHModCl7Y29uc3QgZT1NdC5HZXREb3RTdHJva2UodGhpcy50bXBQb2ludHNbMF0sdC8yLDgpO3JldHVybntkOk9lKGUsITApLHJlY3Q6QnQoZSksaXNEb3Q6ITAscG9zOnRoaXMudG1wUG9pbnRzWzBdLlhZfX11cGRhdGVUZW1wUG9pbnRzKHQpe2NvbnN0IGU9dC5zbGljZSgtMiksbj1uZXcgTXQoZVswXSxlWzFdKSxhPXRoaXMudG1wUG9pbnRzWzBdLHt0aGlja25lc3M6c309dGhpcy53b3JrT3B0aW9ucztpZihhLmlzTmVhcihuLHMpKXJldHVybiExO2lmKHRoaXMudG1wUG9pbnRzLmxlbmd0aD09PTIpe2lmKG4uaXNOZWFyKHRoaXMudG1wUG9pbnRzWzFdLDEpKXJldHVybiExO3RoaXMudG1wUG9pbnRzWzFdPW59ZWxzZSB0aGlzLnRtcFBvaW50cy5wdXNoKG4pO3JldHVybiEwfWNvbnN1bWVTZXJ2aWNlKHQpe3ZhciBvO2NvbnN0e29wOmUsaXNGdWxsV29yazpufT10LGE9KG89dGhpcy53b3JrSWQpPT1udWxsP3ZvaWQgMDpvLnRvU3RyaW5nKCk7aWYoIWEpcmV0dXJuO3RoaXMudG1wUG9pbnRzLmxlbmd0aD0wO2ZvcihsZXQgYz0wO2M8ZS5sZW5ndGg7Yys9Myl0aGlzLnRtcFBvaW50cy5wdXNoKG5ldyBNdChlW2NdLGVbYysxXSxlW2MrMl0pKTtjb25zdCBzPW4/dGhpcy5mdWxsTGF5ZXI6dGhpcy5kcmF3TGF5ZXJ8fHRoaXMuZnVsbExheWVyLGk9dGhpcy5kcmF3KHt3b3JrSWQ6YSxsYXllcjpzfSk7cmV0dXJuIHRoaXMub2xkUmVjdD1pLHRoaXMudk5vZGVzLnNldEluZm8oYSx7cmVjdDppLG9wOmUsb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLHNjYWxlVHlwZTp0aGlzLnNjYWxlVHlwZSxjYW5Sb3RhdGU6dGhpcy5jYW5Sb3RhdGUsY2VudGVyUG9zOmkmJnl0LmdldENlbnRlclBvcyhpLHMpfSksaX1jbGVhclRtcFBvaW50cygpe3RoaXMudG1wUG9pbnRzLmxlbmd0aD0wfXN0YXRpYyB1cGRhdGVOb2RlT3B0KHQpe3ZhciBvO2NvbnN0e25vZGU6ZSxvcHQ6bix2Tm9kZXM6YX09dCx7c3Ryb2tlQ29sb3I6c309bixpPWEuZ2V0KGUubmFtZSk7cmV0dXJuIHMmJihlLnNldEF0dHJpYnV0ZSgic3Ryb2tlQ29sb3IiLHMpLGUuc2V0QXR0cmlidXRlKCJmaWxsQ29sb3IiLHMpLChvPWk9PW51bGw/dm9pZCAwOmkub3B0KSE9bnVsbCYmby5zdHJva2VDb2xvciYmKGkub3B0LnN0cm9rZUNvbG9yPXMpKSxpJiZhLnNldEluZm8oZS5uYW1lLGkpLHl0LnVwZGF0ZU5vZGVPcHQodCl9fWNsYXNzIFJlIGV4dGVuZHMgeXR7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7c3QodGhpcywiY2FuUm90YXRlIiwhMSk7c3QodGhpcywic2NhbGVUeXBlIixGdC5hbGwpO3N0KHRoaXMsInRvb2xzVHlwZSIsZ3QuVGV4dCk7c3QodGhpcywidG1wUG9pbnRzIixbXSk7c3QodGhpcywid29ya09wdGlvbnMiKTtzdCh0aGlzLCJvbGRSZWN0Iik7dGhpcy53b3JrT3B0aW9ucz10LnRvb2xzT3B0fWNvbnN1bWUoKXtyZXR1cm57dHlwZTpsdC5Ob25lfX1jb25zdW1lQWxsKCl7cmV0dXJue3R5cGU6bHQuTm9uZX19ZHJhdyh0KXt2YXIgeDtjb25zdHt3b3JrSWQ6ZSxsYXllcjpuLGlzRHJhd0xhYmVsOmF9PXQ7dGhpcy5mdWxsTGF5ZXIuZ2V0RWxlbWVudHNCeU5hbWUoZSkubWFwKHY9PnYucmVtb3ZlKCkpLCh4PXRoaXMuZHJhd0xheWVyKT09bnVsbHx8eC5nZXRFbGVtZW50c0J5TmFtZShlKS5tYXAodj0+di5yZW1vdmUoKSk7Y29uc3R7Ym94U2l6ZTpzLGJveFBvaW50OmksekluZGV4Om99PXRoaXMud29ya09wdGlvbnMsYz1uLndvcmxkUG9zaXRpb24sbT1uLndvcmxkU2NhbGluZztpZighaXx8IXMpcmV0dXJuO2NvbnN0IHU9bmV3IHJlKHtuYW1lOmUsaWQ6ZSxwb3M6W2lbMF0rc1swXS8yLGlbMV0rc1sxXS8yXSxhbmNob3I6Wy41LC41XSxzaXplOnMsekluZGV4Om99KSxwPXt4OmlbMF0seTppWzFdLHc6c1swXSxoOnNbMV19LHk9bmV3IGhyKHtub3JtYWxpemU6ITAscG9zOlswLDBdLHNpemU6c30pLE89YSYmUmUuY3JlYXRlTGFiZWxzKHRoaXMud29ya09wdGlvbnMsbil8fFtdO3JldHVybiB1LmFwcGVuZCguLi5PLHkpLG4uYXBwZW5kKHUpLHt4Ok1hdGguZmxvb3IocC54Km1bMF0rY1swXSkseTpNYXRoLmZsb29yKHAueSptWzFdK2NbMV0pLHc6TWF0aC5mbG9vcihwLncqbVswXSksaDpNYXRoLmZsb29yKHAuaCptWzFdKX19Y29uc3VtZVNlcnZpY2UodCl7dmFyIGMsbTtjb25zdCBlPShjPXRoaXMud29ya0lkKT09bnVsbD92b2lkIDA6Yy50b1N0cmluZygpO2lmKCFlKXJldHVybjtjb25zdHtpc0Z1bGxXb3JrOm4scmVwbGFjZUlkOmEsaXNEcmF3TGFiZWw6c309dDt0aGlzLm9sZFJlY3Q9YSYmKChtPXRoaXMudk5vZGVzLmdldChhKSk9PW51bGw/dm9pZCAwOm0ucmVjdCl8fHZvaWQgMDtjb25zdCBpPW4/dGhpcy5mdWxsTGF5ZXI6dGhpcy5kcmF3TGF5ZXJ8fHRoaXMuZnVsbExheWVyLG89dGhpcy5kcmF3KHt3b3JrSWQ6ZSxsYXllcjppLGlzRHJhd0xhYmVsOnN9KTtyZXR1cm4gdGhpcy52Tm9kZXMuc2V0SW5mbyhlLHtyZWN0Om8sb3A6W10sb3B0OnRoaXMud29ya09wdGlvbnMsdG9vbHNUeXBlOnRoaXMudG9vbHNUeXBlLHNjYWxlVHlwZTp0aGlzLnNjYWxlVHlwZSxjYW5Sb3RhdGU6dGhpcy5jYW5Sb3RhdGUsY2VudGVyUG9zOm8mJnl0LmdldENlbnRlclBvcyhvLGkpfSksb311cGRhdGFPcHRTZXJ2aWNlKHQpe2lmKCF0aGlzLndvcmtJZClyZXR1cm47Y29uc3QgZT10aGlzLndvcmtJZC50b1N0cmluZygpLHtmb250Q29sb3I6bixmb250QmdDb2xvcjphLGJvbGQ6cyxpdGFsaWM6aSxsaW5lVGhyb3VnaDpvLHVuZGVybGluZTpjLHpJbmRleDptfT10LHU9dGhpcy52Tm9kZXMuZ2V0KGUpO2lmKCF1KXJldHVybjtuJiYodS5vcHQuZm9udENvbG9yPW4pLGEmJih1Lm9wdC5mb250QmdDb2xvcj1hKSxzJiYodS5vcHQuYm9sZD1zKSxpJiYodS5vcHQuaXRhbGljPWkpLGdlKG8pJiYodS5vcHQubGluZVRocm91Z2g9byksZ2UoYykmJih1Lm9wdC51bmRlcmxpbmU9YyksYSYmKHUub3B0LmZvbnRCZ0NvbG9yPWEpLG9lKG0pJiYodS5vcHQuekluZGV4PW0pLHRoaXMub2xkUmVjdD11LnJlY3Q7Y29uc3QgcD10aGlzLmRyYXcoe3dvcmtJZDplLGxheWVyOnRoaXMuZnVsbExheWVyLGlzRHJhd0xhYmVsOiExfSk7cmV0dXJuIHRoaXMudk5vZGVzLnNldEluZm8oZSx7cmVjdDpwLG9wOltdLG9wdDp0aGlzLndvcmtPcHRpb25zLHRvb2xzVHlwZTp0aGlzLnRvb2xzVHlwZSxzY2FsZVR5cGU6dGhpcy5zY2FsZVR5cGUsY2FuUm90YXRlOnRoaXMuY2FuUm90YXRlLGNlbnRlclBvczpwJiZ5dC5nZXRDZW50ZXJQb3MocCx0aGlzLmZ1bGxMYXllcil9KSxwfWNsZWFyVG1wUG9pbnRzKCl7dGhpcy50bXBQb2ludHMubGVuZ3RoPTB9c3RhdGljIGdldEZvbnRXaWR0aCh0KXtjb25zdHtjdHg6ZSxvcHQ6bix0ZXh0OmF9PXQse2JvbGQ6cyxpdGFsaWM6aSxmb250U2l6ZTpvLGZvbnRGYW1pbHk6Y309bjtyZXR1cm4gZS5mb250PWAke3N9ICR7aX0gJHtvfXB4ICR7Y31gLGUubWVhc3VyZVRleHQoYSkud2lkdGh9c3RhdGljIGNyZWF0ZUxhYmVscyh0LGUpe2NvbnN0IG49W10sYT10LnRleHQuc3BsaXQoIiwiKSxzPWEubGVuZ3RoO2ZvcihsZXQgaT0wO2k8cztpKyspe2NvbnN0IG89YVtpXSx7Zm9udFNpemU6YyxsaW5lSGVpZ2h0Om0sYm9sZDp1LHRleHRBbGlnbjpwLGl0YWxpYzp5LGJveFNpemU6Tyxmb250RmFtaWx5OngsdmVydGljYWxBbGlnbjp2LGZvbnRDb2xvcjpULHVuZGVybGluZTpsLGxpbmVUaHJvdWdoOmh9PXQsZj1tfHxjKjEuMixnPWUmJmUucGFyZW50LmNhbnZhcy5nZXRDb250ZXh0KCIyZCIpLE09ZyYmUmUuZ2V0Rm9udFdpZHRoKHt0ZXh0Om8sb3B0OnQsY3R4Omcsd29ybGRTY2FsaW5nOmUud29ybGRTY2FsaW5nfSk7aWYoTSl7Y29uc3QgQT17YW5jaG9yOlswLC41XSx0ZXh0Om8sZm9udFNpemU6YyxsaW5lSGVpZ2h0OmYsZm9udEZhbWlseTp4LGZvbnRXZWlnaHQ6dSxmaWxsQ29sb3I6VCx0ZXh0QWxpZ246cCxmb250U3R5bGU6eSxuYW1lOmkudG9TdHJpbmcoKSxjbGFzc05hbWU6ImxhYmVsIn0sQz1bMCwwXTtpZih2PT09Im1pZGRsZSIpe2NvbnN0IEU9KHMtMSkvMjtDWzFdPShpLUUpKmZ9cD09PSJsZWZ0IiYmKENbMF09TyYmLU9bMF0vMis1fHwwKSxBLnBvcz1DO2NvbnN0IGI9bmV3IFVoKEEpO2lmKG4ucHVzaChiKSxsKXtjb25zdCBFPXtub3JtYWxpemU6ITEscG9zOltBLnBvc1swXSxBLnBvc1sxXStjLzJdLGxpbmVXaWR0aDoyKmUud29ybGRTY2FsaW5nWzBdLHBvaW50czpbMCwwLE0sMF0sc3Ryb2tlQ29sb3I6VCxuYW1lOmAke2l9X3VuZGVybGluZWAsY2xhc3NOYW1lOiJ1bmRlcmxpbmUifSxMPW5ldyBkZShFKTtuLnB1c2goTCl9aWYoaCl7Y29uc3QgRT17bm9ybWFsaXplOiExLHBvczpBLnBvcyxsaW5lV2lkdGg6MiplLndvcmxkU2NhbGluZ1swXSxwb2ludHM6WzAsMCxNLDBdLHN0cm9rZUNvbG9yOlQsbmFtZTpgJHtpfV9saW5lVGhyb3VnaGAsY2xhc3NOYW1lOiJsaW5lVGhyb3VnaCJ9LEw9bmV3IGRlKEUpO24ucHVzaChMKX19fXJldHVybiBufXN0YXRpYyB1cGRhdGVOb2RlT3B0KHQpe2NvbnN0e25vZGU6ZSxvcHQ6bix2Tm9kZXM6YSx0YXJnZXROb2RlOnN9PXQse2ZvbnRCZ0NvbG9yOmksZm9udENvbG9yOm8sdHJhbnNsYXRlOmMsYm94Om0sYm94U2NhbGU6dSxib3hUcmFuc2xhdGU6cCxib2xkOnksaXRhbGljOk8sbGluZVRocm91Z2g6eCx1bmRlcmxpbmU6dixmb250U2l6ZTpULHRleHRJbmZvczpsfT1uLGg9cyYmWnQocyl8fGEuZ2V0KGUubmFtZSk7aWYoIWgpcmV0dXJuO2NvbnN0IGY9ZS5wYXJlbnQ7aWYoIWYpcmV0dXJuO2NvbnN0IGc9aC5vcHQ7aWYobyYmZy5mb250Q29sb3ImJihnLmZvbnRDb2xvcj1vKSxpJiZnLmZvbnRCZ0NvbG9yJiYoZy5mb250QmdDb2xvcj1pKSx5JiYoZy5ib2xkPXkpLE8mJihnLml0YWxpYz1PKSxnZSh4KSYmKGcubGluZVRocm91Z2g9eCksZ2UodikmJihnLnVuZGVybGluZT12KSxUJiYoZy5mb250U2l6ZT1UKSxtJiZwJiZ1KXtjb25zdCBNPWw9PW51bGw/dm9pZCAwOmwuZ2V0KGUubmFtZSk7aWYoTSl7Y29uc3R7Zm9udFNpemU6Yixib3hTaXplOkV9PU07Zy5ib3hTaXplPUV8fGcuYm94U2l6ZSxnLmZvbnRTaXplPWJ8fGcuZm9udFNpemV9Y29uc3QgQT1oLnJlY3QsQz1DZSh5bihBLHUpLHApO2cuYm94UG9pbnQ9QyYmWyhDLngtZi53b3JsZFBvc2l0aW9uWzBdKS9mLndvcmxkU2NhbGluZ1swXSwoQy55LWYud29ybGRQb3NpdGlvblsxXSkvZi53b3JsZFNjYWxpbmdbMV1dfWVsc2UgaWYoYyYmZy5ib3hQb2ludCl7Y29uc3QgTT1bY1swXS9mLndvcmxkU2NhbGluZ1swXSxjWzFdL2Yud29ybGRTY2FsaW5nWzFdXTtnLmJveFBvaW50PVtnLmJveFBvaW50WzBdK01bMF0sZy5ib3hQb2ludFsxXStNWzFdXSxoLmNlbnRlclBvcz1baC5jZW50ZXJQb3NbMF0rTVswXSxoLmNlbnRlclBvc1sxXStNWzFdXSxoLnJlY3Q9Q2UoaC5yZWN0LE0pfXJldHVybiBoJiZhLnNldEluZm8oZS5uYW1lLGgpLGg9PW51bGw/dm9pZCAwOmgucmVjdH1zdGF0aWMgZ2V0UmVjdEZyb21MYXllcih0LGUpe2NvbnN0IG49dC5nZXRFbGVtZW50c0J5TmFtZShlKVswXTtpZihuKXtjb25zdCBhPW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJue3g6TWF0aC5mbG9vcihhLngpLHk6TWF0aC5mbG9vcihhLnkpLHc6TWF0aC5mbG9vcihhLndpZHRoKSxoOk1hdGguZmxvb3IoYS5oZWlnaHQpfX19fWZ1bmN0aW9uIFZuKGQpe3N3aXRjaChkKXtjYXNlIGd0LkFycm93OnJldHVybiBGbjtjYXNlIGd0LlBlbmNpbDpyZXR1cm4gTW47Y2FzZSBndC5TdHJhaWdodDpyZXR1cm4gS247Y2FzZSBndC5FbGxpcHNlOnJldHVybiBqbjtjYXNlIGd0LlBvbHlnb246Y2FzZSBndC5UcmlhbmdsZTpyZXR1cm4gem47Y2FzZSBndC5TdGFyOmNhc2UgZ3QuUmhvbWJ1czpyZXR1cm4gJG47Y2FzZSBndC5SZWN0YW5nbGU6cmV0dXJuIFVuO2Nhc2UgZ3QuU3BlZWNoQmFsbG9vbjpyZXR1cm4gR247Y2FzZSBndC5UZXh0OnJldHVybiBSZTtjYXNlIGd0Lkxhc2VyUGVuOnJldHVybiBPbjtjYXNlIGd0LkVyYXNlcjpyZXR1cm4gYWU7Y2FzZSBndC5TZWxlY3RvcjpyZXR1cm4gd3Q7Y2FzZSBndC5JbWFnZTpyZXR1cm4gSG59fWZ1bmN0aW9uIHlyKGQscil7Y29uc3R7dG9vbHNUeXBlOnQsLi4uZX09ZDtzd2l0Y2godCl7Y2FzZSBndC5BcnJvdzpyZXR1cm4gbmV3IEZuKGUpO2Nhc2UgZ3QuUGVuY2lsOnJldHVybiBuZXcgTW4oZSk7Y2FzZSBndC5TdHJhaWdodDpyZXR1cm4gbmV3IEtuKGUpO2Nhc2UgZ3QuRWxsaXBzZTpyZXR1cm4gbmV3IGpuKGUpO2Nhc2UgZ3QuUG9seWdvbjpjYXNlIGd0LlRyaWFuZ2xlOnJldHVybiBuZXcgem4oZSk7Y2FzZSBndC5TdGFyOmNhc2UgZ3QuUmhvbWJ1czpyZXR1cm4gbmV3ICRuKGUpO2Nhc2UgZ3QuUmVjdGFuZ2xlOnJldHVybiBuZXcgVW4oZSk7Y2FzZSBndC5TcGVlY2hCYWxsb29uOnJldHVybiBuZXcgR24oZSk7Y2FzZSBndC5UZXh0OnJldHVybiBuZXcgUmUoZSk7Y2FzZSBndC5MYXNlclBlbjpyZXR1cm4gbmV3IE9uKGUpO2Nhc2UgZ3QuRXJhc2VyOnJldHVybiBuZXcgYWUoZSxyKTtjYXNlIGd0LlNlbGVjdG9yOnJldHVybiBuZXcgd3QoZSk7Y2FzZSBndC5JbWFnZTpyZXR1cm4gbmV3IEhuKGUpO2RlZmF1bHQ6cmV0dXJufX1mdW5jdGlvbiBZbihkKXtjb25zdCByPVtdLHQ9WyJQQVRIIiwiU1BSSVRFIiwiUE9MWUxJTkUiLCJSRUNUIiwiRUxMSVBTRSJdO2Zvcihjb25zdCBlIG9mIGQpe2lmKGUudGFnTmFtZT09PSJHUk9VUCImJmUuY2hpbGRyZW4ubGVuZ3RoKXJldHVybiBZbihlLmNoaWxkcmVuKTtlLnRhZ05hbWUmJnQuaW5jbHVkZXMoZS50YWdOYW1lKSYmci5wdXNoKGUpfXJldHVybiByfWNsYXNzIHMwIGV4dGVuZHMgSnR7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3N0KHRoaXMsImVtaXRFdmVudFR5cGUiLEx0LlpJbmRleEFjdGl2ZSl9Y29uc3VtZSh0KXtjb25zdHttc2dUeXBlOmUsZGF0YVR5cGU6bixlbWl0RXZlbnRUeXBlOmF9PXQ7aWYoZT09PWx0LlVwZGF0ZU5vZGUmJm49PT1UdC5Mb2NhbCYmYT09PXRoaXMuZW1pdEV2ZW50VHlwZSlyZXR1cm4gdGhpcy5jb25zdW1lRm9yTG9jYWxXb3JrZXIodCksITB9Y29uc3VtZUZvckxvY2FsV29ya2VyKHQpe3ZhciBvLGMsbSx1LHA7Y29uc3R7d29ya0lkOmUsaXNBY3RpdmVaSW5kZXg6bix3aWxsUmVmcmVzaFNlbGVjdG9yOmF9PXQ7aWYoZSE9PXd0LnNlbGVjdG9ySWQpcmV0dXJuO2NvbnN0IHM9KG89dGhpcy5sb2NhbFdvcmspPT1udWxsP3ZvaWQgMDpvLndvcmtTaGFwZXMuZ2V0KHd0LnNlbGVjdG9ySWQpO2lmKCFzKXJldHVybjtjb25zdCBpPXMub2xkU2VsZWN0UmVjdDtpZihuJiZpJiZ0aGlzLmxvY2FsV29yayl7Y29uc3QgeT1uZXcgU2V0O2lmKHRoaXMubG9jYWxXb3JrLnZOb2Rlcy5jdXJOb2RlTWFwLmZvckVhY2goKE8seCk9Pnt4ZShpLE8ucmVjdCkmJnkuYWRkKHgpfSkseS5zaXplKXtjb25zdCBPPVtdO3kuZm9yRWFjaCh4PT57dmFyIHY7KHY9dGhpcy5sb2NhbFdvcmspPT1udWxsfHx2LmZ1bGxMYXllci5nZXRFbGVtZW50c0J5TmFtZSh4KS5mb3JFYWNoKFQ9Pnt2YXIgaCxmO2NvbnN0IGw9VC5jbG9uZU5vZGUoITApO0hlKFQpJiZsLnNlYWwoKSwoZj0oaD10aGlzLmxvY2FsV29yayk9PW51bGw/dm9pZCAwOmguZHJhd0xheWVyKSE9bnVsbCYmZi5nZXRFbGVtZW50c0J5TmFtZSh4KS5sZW5ndGh8fE8ucHVzaChsKX0pfSksTy5sZW5ndGgmJigoYz10aGlzLmxvY2FsV29yay5kcmF3TGF5ZXIpPT1udWxsfHxjLmFwcGVuZCguLi5PKSl9fWVsc2UodT0obT10aGlzLmxvY2FsV29yayk9PW51bGw/dm9pZCAwOm0uZHJhd0xheWVyKT09bnVsbHx8dS5jaGlsZHJlbi5maWx0ZXIoeT0+e3ZhciBPO3JldHVybiEoKE89cy5zZWxlY3RJZHMpIT1udWxsJiZPLmluY2x1ZGVzKHkubmFtZSkpfSkuZm9yRWFjaCh5PT55LnJlbW92ZSgpKTthJiYoKHA9dGhpcy5sb2NhbFdvcmspPT1udWxsfHxwLl9wb3N0KHtyZW5kZXI6W3tyZWN0OmksZHJhd0NhbnZhczpTdC5TZWxlY3RvcixjbGVhckNhbnZhczpTdC5TZWxlY3Rvcixpc0NsZWFyOiEwLGlzRnVsbFdvcms6ITEsdmlld0lkOnRoaXMubG9jYWxXb3JrLnZpZXdJZH1dLHNwOlt7dHlwZTpsdC5TZWxlY3Qsc2VsZWN0SWRzOnMuc2VsZWN0SWRzLG9wdDpzLmdldFdvcmtPcHRpb25zKCksc2VsZWN0UmVjdDppLHN0cm9rZUNvbG9yOnMuc3Ryb2tlQ29sb3IsZmlsbENvbG9yOnMuZmlsbENvbG9yLHdpbGxTeW5jU2VydmljZTohMSxpc1N5bmM6ITB9XX0pKX19Y2xhc3MgbzAgZXh0ZW5kcyBKdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7c3QodGhpcywiZW1pdEV2ZW50VHlwZSIsTHQuQ29weU5vZGUpfWNvbnN1bWUodCl7Y29uc3R7bXNnVHlwZTplLGRhdGFUeXBlOm4sZW1pdEV2ZW50VHlwZTphLHVuZG9UaWNrZXJJZDpzfT10O2lmKGU9PT1sdC5GdWxsV29yayYmbj09PVR0LkxvY2FsJiZhPT09dGhpcy5lbWl0RXZlbnRUeXBlKXJldHVybiB0aGlzLmNvbnN1bWVGb3JMb2NhbFdvcmtlcih0KS5maW5hbGx5KCgpPT57cyYmc2V0VGltZW91dCgoKT0+e3ZhciBpOyhpPXRoaXMubG9jYWxXb3JrKT09bnVsbHx8aS5fcG9zdCh7c3A6W3t0eXBlOmx0Lk5vbmUsdW5kb1RpY2tlcklkOnN9XX0pfSwwKX0pLCEwfWFzeW5jIGNvbnN1bWVGb3JMb2NhbFdvcmtlcih0KXt2YXIgbjtjb25zdHt3b3JrSWQ6ZX09dDtlJiZhd2FpdCgobj10aGlzLmxvY2FsV29yayk9PW51bGw/dm9pZCAwOm4uY29uc3VtZUZ1bGwodCx0aGlzLnNjZW5lKSl9fWNsYXNzIGEwIGV4dGVuZHMgSnR7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3N0KHRoaXMsImVtaXRFdmVudFR5cGUiLEx0LlNldENvbG9yTm9kZSl9Y29uc3VtZSh0KXtjb25zdHttc2dUeXBlOmUsZGF0YVR5cGU6bixlbWl0RXZlbnRUeXBlOmEsdW5kb1RpY2tlcklkOnN9PXQ7aWYoZT09PWx0LlVwZGF0ZU5vZGUmJm49PT1UdC5Mb2NhbCYmYT09PXRoaXMuZW1pdEV2ZW50VHlwZSlyZXR1cm4gdGhpcy5jb25zdW1lRm9yTG9jYWxXb3JrZXIodCkuZmluYWxseSgoKT0+e3MmJnNldFRpbWVvdXQoKCk9Pnt2YXIgaTsoaT10aGlzLmxvY2FsV29yayk9PW51bGx8fGkuX3Bvc3Qoe3NwOlt7dHlwZTpsdC5Ob25lLHVuZG9UaWNrZXJJZDpzfV19KX0sMCl9KSwhMH1hc3luYyBjb25zdW1lRm9yTG9jYWxXb3JrZXIodCl7dmFyIGM7Y29uc3R7d29ya0lkOmUsdXBkYXRlTm9kZU9wdDpuLHdpbGxSZWZyZXNoU2VsZWN0b3I6YSx3aWxsU3luY1NlcnZpY2U6cyx3aWxsU2VyaWFsaXplRGF0YTppLHRleHRVcGRhdGVGb3JXb2tlcjpvfT10O2U9PT13dC5zZWxlY3RvcklkJiZuJiZhd2FpdCgoYz10aGlzLmxvY2FsV29yayk9PW51bGw/dm9pZCAwOmMudXBkYXRlU2VsZWN0b3Ioe3VwZGF0ZVNlbGVjdG9yT3B0Om4sd2lsbFJlZnJlc2hTZWxlY3RvcjphLHdpbGxTeW5jU2VydmljZTpzLHdpbGxTZXJpYWxpemVEYXRhOmksdGV4dFVwZGF0ZUZvcldva2VyOm8sY2FsbGJhY2s6dGhpcy51cGRhdGVTZWxlY3RvckNhbGxiYWNrfSkpfXVwZGF0ZVNlbGVjdG9yQ2FsbGJhY2sodCl7Y29uc3R7cGFyYW06ZSxwb3N0RGF0YTpuLG5ld1NlcnZpY2VTdG9yZTphfT10LHt3aWxsU3luY1NlcnZpY2U6cyxpc1N5bmM6aSx0ZXh0VXBkYXRlRm9yV29rZXI6b309ZSxjPW4ucmVuZGVyfHxbXSxtPW4uc3B8fFtdO2lmKHMpZm9yKGNvbnN0W3UscF1vZiBhLmVudHJpZXMoKSlvJiZwLnRvb2xzVHlwZT09PWd0LlRleHQ/bS5wdXNoKHsuLi5wLHdvcmtJZDp1LHR5cGU6bHQuVGV4dFVwZGF0ZSxkYXRhVHlwZTpUdC5Mb2NhbCx3aWxsU3luY1NlcnZpY2U6ITB9KTptLnB1c2goey4uLnAsd29ya0lkOnUsdHlwZTpsdC5VcGRhdGVOb2RlLHVwZGF0ZU5vZGVPcHQ6e3VzZUFuaW1hdGlvbjohMX0saXNTeW5jOml9KTtyZXR1cm57cmVuZGVyOmMsc3A6bX19fWNsYXNzIGwwIGV4dGVuZHMgSnR7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3N0KHRoaXMsImVtaXRFdmVudFR5cGUiLEx0LlpJbmRleE5vZGUpfWNvbnN1bWUodCl7Y29uc3R7bXNnVHlwZTplLGRhdGFUeXBlOm4sZW1pdEV2ZW50VHlwZTphfT10O2lmKGU9PT1sdC5VcGRhdGVOb2RlJiZuPT09VHQuTG9jYWwmJmE9PT10aGlzLmVtaXRFdmVudFR5cGUpcmV0dXJuIHRoaXMuY29uc3VtZUZvckxvY2FsV29ya2VyKHQpLCEwfWFzeW5jIGNvbnN1bWVGb3JMb2NhbFdvcmtlcih0KXt2YXIgbztjb25zdHt3b3JrSWQ6ZSx1cGRhdGVOb2RlT3B0Om4sd2lsbFJlZnJlc2hTZWxlY3RvcjphLHdpbGxTeW5jU2VydmljZTpzLHdpbGxTZXJpYWxpemVEYXRhOml9PXQ7ZT09PXd0LnNlbGVjdG9ySWQmJm4mJmF3YWl0KChvPXRoaXMubG9jYWxXb3JrKT09bnVsbD92b2lkIDA6by51cGRhdGVTZWxlY3Rvcih7dXBkYXRlU2VsZWN0b3JPcHQ6bix3aWxsUmVmcmVzaFNlbGVjdG9yOmEsd2lsbFN5bmNTZXJ2aWNlOnMsd2lsbFNlcmlhbGl6ZURhdGE6aSxjYWxsYmFjazp0aGlzLnVwZGF0ZVNlbGVjdG9yQ2FsbGJhY2t9KSl9dXBkYXRlU2VsZWN0b3JDYWxsYmFjayh0KXtjb25zdHtwYXJhbTplLHBvc3REYXRhOm4sbmV3U2VydmljZVN0b3JlOmF9PXQse3dpbGxTeW5jU2VydmljZTpzLGlzU3luYzppfT1lLG89bi5yZW5kZXJ8fFtdLGM9bi5zcHx8W107aWYocyYmYylmb3IoY29uc3RbbSx1XW9mIGEuZW50cmllcygpKWMucHVzaCh7Li4udSx3b3JrSWQ6bSx0eXBlOmx0LlVwZGF0ZU5vZGUsdXBkYXRlTm9kZU9wdDp7dXNlQW5pbWF0aW9uOiExfSxpc1N5bmM6aX0pO3JldHVybntyZW5kZXI6byxzcDpjfX19Y2xhc3MgYzAgZXh0ZW5kcyBKdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7c3QodGhpcywiZW1pdEV2ZW50VHlwZSIsTHQuVHJhbnNsYXRlTm9kZSl9Y29uc3VtZSh0KXtjb25zdHttc2dUeXBlOmUsZGF0YVR5cGU6bixlbWl0RXZlbnRUeXBlOmEsdW5kb1RpY2tlcklkOnN9PXQ7aWYoZT09PWx0LlVwZGF0ZU5vZGUmJm49PT1UdC5Mb2NhbCYmYT09PXRoaXMuZW1pdEV2ZW50VHlwZSlyZXR1cm4gdGhpcy5jb25zdW1lRm9yTG9jYWxXb3JrZXIodCkuZmluYWxseSgoKT0+e3MmJnNldFRpbWVvdXQoKCk9Pnt2YXIgaTsoaT10aGlzLmxvY2FsV29yayk9PW51bGx8fGkuX3Bvc3Qoe3NwOlt7dHlwZTpsdC5Ob25lLHVuZG9UaWNrZXJJZDpzfV19KX0sMCl9KSwhMH1hc3luYyBjb25zdW1lRm9yTG9jYWxXb3JrZXIodCl7dmFyIG0sdTtjb25zdHt3b3JrSWQ6ZSx1cGRhdGVOb2RlT3B0Om4sd2lsbFJlZnJlc2hTZWxlY3RvcjphLHdpbGxTeW5jU2VydmljZTpzLHdpbGxTZXJpYWxpemVEYXRhOmksdGV4dFVwZGF0ZUZvcldva2VyOm8sZW1pdEV2ZW50VHlwZTpjfT10O2U9PT13dC5zZWxlY3RvcklkJiZuJiYobi53b3JrU3RhdGU9PT1JdC5Eb25lJiYobiE9bnVsbCYmbi50cmFuc2xhdGUpJiYobi50cmFuc2xhdGVbMF18fG4udHJhbnNsYXRlWzFdKXx8bi53b3JrU3RhdGUhPT1JdC5Eb25lP2F3YWl0KChtPXRoaXMubG9jYWxXb3JrKT09bnVsbD92b2lkIDA6bS51cGRhdGVTZWxlY3Rvcih7dXBkYXRlU2VsZWN0b3JPcHQ6bix3aWxsUmVmcmVzaFNlbGVjdG9yOmEsd2lsbFN5bmNTZXJ2aWNlOnMsd2lsbFNlcmlhbGl6ZURhdGE6aSxpc1N5bmM6ITAsdGV4dFVwZGF0ZUZvcldva2VyOm8sZW1pdEV2ZW50VHlwZTpjLHNjZW5lOnRoaXMuc2NlbmUsY2FsbGJhY2s6dGhpcy51cGRhdGVTZWxlY3RvckNhbGxiYWNrfSkpOm4ud29ya1N0YXRlPT09SXQuRG9uZSYmKCh1PXRoaXMubG9jYWxXb3JrKT09bnVsbHx8dS52Tm9kZXMuZGVsZXRlTGFzdFRhcmdldCgpKSl9dXBkYXRlU2VsZWN0b3JDYWxsYmFjayh0KXtjb25zdHtwYXJhbTplLHBvc3REYXRhOm4sbmV3U2VydmljZVN0b3JlOmEsd29ya1NoYXBlTm9kZTpzLHJlczppfT10LHt3aWxsU3luY1NlcnZpY2U6byxpc1N5bmM6Yyx1cGRhdGVTZWxlY3Rvck9wdDptLHdpbGxTZXJpYWxpemVEYXRhOnUsdGV4dFVwZGF0ZUZvcldva2VyOnB9PWUseT1tLndvcmtTdGF0ZSxPPW4ucmVuZGVyfHxbXSx4PW4uc3B8fFtdO2lmKHk9PT1JdC5TdGFydClyZXR1cm57c3A6W10scmVuZGVyOltdfTtjb25zdCB2PWk9PW51bGw/dm9pZCAwOmkuc2VsZWN0UmVjdDtpZihvKXtpZih1KXtjb25zdCBUPXMuZ2V0Q2hpbGRyZW5Qb2ludHMoKTtUJiZ4LnB1c2goe3R5cGU6bHQuU2VsZWN0LHNlbGVjdElkczpzLnNlbGVjdElkcyxzZWxlY3RSZWN0OnYsd2lsbFN5bmNTZXJ2aWNlOiExLGlzU3luYzpjLHBvaW50czpUfSl9Zm9yKGNvbnN0W1QsbF1vZiBhLmVudHJpZXMoKSlwJiZsLnRvb2xzVHlwZT09PWd0LlRleHQ/eC5wdXNoKHsuLi5sLHdvcmtJZDpULHR5cGU6bHQuVGV4dFVwZGF0ZSxkYXRhVHlwZTpUdC5Mb2NhbCx3aWxsU3luY1NlcnZpY2U6ITB9KTp4LnB1c2goey4uLmwsd29ya0lkOlQsdHlwZTpsdC5VcGRhdGVOb2RlLHVwZGF0ZU5vZGVPcHQ6e3VzZUFuaW1hdGlvbjohMX0saXNTeW5jOmN9KX1yZXR1cm57cmVuZGVyOk8sc3A6eH19fWNsYXNzIGYwIGV4dGVuZHMgSnR7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3N0KHRoaXMsImVtaXRFdmVudFR5cGUiLEx0LkRlbGV0ZU5vZGUpfWNvbnN1bWUodCl7Y29uc3R7bXNnVHlwZTplLGRhdGFUeXBlOm4sZW1pdEV2ZW50VHlwZTphfT10O2lmKGU9PT1sdC5SZW1vdmVOb2RlKXtpZihuPT09VHQuTG9jYWwmJmE9PT10aGlzLmVtaXRFdmVudFR5cGUpcmV0dXJuIHRoaXMuY29uc3VtZUZvckxvY2FsV29ya2VyKHQpLCEwO2lmKG49PT1UdC5TZXJ2aWNlJiZhPT09dGhpcy5lbWl0RXZlbnRUeXBlKXJldHVybiB0aGlzLmNvbnN1bWVGb3JTZXJ2aWNlV29ya2VyKHQpLCEwfX1jb25zdW1lRm9yTG9jYWxXb3JrZXIodCl7aWYoIXRoaXMubG9jYWxXb3JrKXJldHVybjtjb25zdHtyZW1vdmVJZHM6ZSx3aWxsUmVmcmVzaDpuLHdpbGxTeW5jU2VydmljZTphLHZpZXdJZDpzfT10O2lmKCEoZSE9bnVsbCYmZS5sZW5ndGgpKXJldHVybjtsZXQgaTtjb25zdCBvPVtdLGM9W10sbT1bXTtmb3IoY29uc3QgdSBvZiBlKXtpZih1PT09d3Quc2VsZWN0b3JJZCl7Y29uc3QgeT10aGlzLmxvY2FsV29yay53b3JrU2hhcGVzLmdldCh3dC5zZWxlY3RvcklkKTtpZigheSlyZXR1cm47Y29uc3QgTz15LnNlbGVjdElkcyYmWy4uLnkuc2VsZWN0SWRzXXx8W107Zm9yKGNvbnN0IHYgb2YgTyl7aWYodGhpcy5sb2NhbFdvcmsudk5vZGVzLmdldCh2KSl7Y29uc3QgbD10aGlzLmNvbW1hbmREZWxldGVUZXh0KHYpO2wmJm8ucHVzaChsKX1pPU90KGksdGhpcy5sb2NhbFdvcmsucmVtb3ZlTm9kZSh2KSksbS5wdXNoKHYpfWNvbnN0IHg9eT09bnVsbD92b2lkIDA6eS51cGRhdGVTZWxlY3RJZHMoW10pO2k9T3QoaSx4LmJnUmVjdCksdGhpcy5sb2NhbFdvcmsuY2xlYXJXb3JrU2hhcGVOb2RlQ2FjaGUod3Quc2VsZWN0b3JJZCksdGhpcy5sb2NhbFdvcmsud29ya1NoYXBlcy5kZWxldGUod3Quc2VsZWN0b3JJZCksby5wdXNoKHt0eXBlOmx0LlNlbGVjdCxzZWxlY3RJZHM6W10sd2lsbFN5bmNTZXJ2aWNlOmF9KTtjb250aW51ZX1jb25zdCBwPXRoaXMuY29tbWFuZERlbGV0ZVRleHQodSk7cCYmby5wdXNoKHApLGk9T3QoaSx0aGlzLmxvY2FsV29yay5yZW1vdmVOb2RlKHUpKSxtLnB1c2godSl9YSYmby5wdXNoKHt0eXBlOmx0LlJlbW92ZU5vZGUscmVtb3ZlSWRzOm0sdW5kb1RpY2tlcklkOnQudW5kb1RpY2tlcklkfSksaSYmbiYmYy5wdXNoKHtyZWN0OmksZHJhd0NhbnZhczpTdC5CZyxjbGVhckNhbnZhczpTdC5CZyxpc0NsZWFyOiEwLGlzRnVsbFdvcms6ITAsdmlld0lkOnN9KSwoYy5sZW5ndGh8fG8ubGVuZ3RoKSYmdGhpcy5sb2NhbFdvcmsuX3Bvc3Qoe3JlbmRlcjpjLHNwOm99KX1jb25zdW1lRm9yU2VydmljZVdvcmtlcih0KXt0aGlzLnNlcnZpY2VXb3JrJiZ0aGlzLnNlcnZpY2VXb3JrLnJlbW92ZVNlbGVjdFdvcmsodCl9Y29tbWFuZERlbGV0ZVRleHQodCl7dmFyIG47Y29uc3QgZT0obj10aGlzLmxvY2FsV29yayk9PW51bGw/dm9pZCAwOm4udk5vZGVzLmdldCh0KTtpZihlJiZlLnRvb2xzVHlwZT09PWd0LlRleHQpcmV0dXJue3R5cGU6bHQuVGV4dFVwZGF0ZSx0b29sc1R5cGU6Z3QuVGV4dCx3b3JrSWQ6dCxkYXRhVHlwZTpUdC5Mb2NhbH19fWNsYXNzIHUwIGV4dGVuZHMgSnR7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3N0KHRoaXMsImVtaXRFdmVudFR5cGUiLEx0LlNjYWxlTm9kZSl9Y29uc3VtZSh0KXtjb25zdHttc2dUeXBlOmUsZGF0YVR5cGU6bixlbWl0RXZlbnRUeXBlOmEsdW5kb1RpY2tlcklkOnN9PXQ7aWYoZT09PWx0LlVwZGF0ZU5vZGUmJm49PT1UdC5Mb2NhbCYmYT09PXRoaXMuZW1pdEV2ZW50VHlwZSlyZXR1cm4gdGhpcy5jb25zdW1lRm9yTG9jYWxXb3JrZXIodCkuZmluYWxseSgoKT0+e3MmJnNldFRpbWVvdXQoKCk9Pnt2YXIgaTsoaT10aGlzLmxvY2FsV29yayk9PW51bGx8fGkuX3Bvc3Qoe3NwOlt7dHlwZTpsdC5Ob25lLHVuZG9UaWNrZXJJZDpzfV19KX0sMCl9KSwhMH1hc3luYyBjb25zdW1lRm9yTG9jYWxXb3JrZXIodCl7dmFyIGk7Y29uc3R7d29ya0lkOmUsdXBkYXRlTm9kZU9wdDpuLHdpbGxTeW5jU2VydmljZTphLHdpbGxTZXJpYWxpemVEYXRhOnN9PXQ7ZT09PXd0LnNlbGVjdG9ySWQmJm4mJmF3YWl0KChpPXRoaXMubG9jYWxXb3JrKT09bnVsbD92b2lkIDA6aS51cGRhdGVTZWxlY3Rvcih7dXBkYXRlU2VsZWN0b3JPcHQ6bix3aWxsU3luY1NlcnZpY2U6YSx3aWxsU2VyaWFsaXplRGF0YTpzLGlzU3luYzohMCxzY2VuZTp0aGlzLnNjZW5lLGNhbGxiYWNrOnRoaXMudXBkYXRlU2VsZWN0b3JDYWxsYmFjay5iaW5kKHRoaXMpfSkpfXVwZGF0ZVNlbGVjdG9yQ2FsbGJhY2sodCl7Y29uc3R7cGFyYW06ZSxwb3N0RGF0YTpuLHdvcmtTaGFwZU5vZGU6YSxyZXM6cyxuZXdTZXJ2aWNlU3RvcmU6aX09dCx7dXBkYXRlU2VsZWN0b3JPcHQ6byx3aWxsU3luY1NlcnZpY2U6Yyx3aWxsU2VyaWFsaXplRGF0YTptfT1lLHU9by53b3JrU3RhdGUscD1uLnJlbmRlcnx8W10seT1uLnNwfHxbXSxPPXM9PW51bGw/dm9pZCAwOnMuc2VsZWN0UmVjdCx4PXM9PW51bGw/dm9pZCAwOnMucmVuZGVyUmVjdDtpZih1PT09SXQuU3RhcnQpcmV0dXJue3NwOltdLHJlbmRlcjpbXX07aWYodGhpcy5sb2NhbFdvcmspe3AucHVzaCh7aXNDbGVhckFsbDohMCxpc0Z1bGxXb3JrOiExLGNsZWFyQ2FudmFzOlN0LlNlbGVjdG9yLHZpZXdJZDp0aGlzLmxvY2FsV29yay52aWV3SWR9KTtjb25zdCB2PXtyZWN0OngsaXNGdWxsV29yazohMSxkcmF3Q2FudmFzOlN0LlNlbGVjdG9yLHZpZXdJZDp0aGlzLmxvY2FsV29yay52aWV3SWR9O3AucHVzaCh2KX1pZihjKXt1PT09SXQuRG9pbmcmJnkucHVzaCh7dHlwZTpsdC5TZWxlY3Qsc2VsZWN0SWRzOmEuc2VsZWN0SWRzLHNlbGVjdFJlY3Q6Tyx3aWxsU3luY1NlcnZpY2U6ITAsaXNTeW5jOiEwLHBvaW50czphLmdldENoaWxkcmVuUG9pbnRzKCksdGV4dE9wdDphLnRleHRPcHR9KSxtJiZ1PT09SXQuRG9uZSYmeS5wdXNoKHt0eXBlOmx0LlNlbGVjdCxzZWxlY3RJZHM6YS5zZWxlY3RJZHMsc2VsZWN0UmVjdDpPLHdpbGxTeW5jU2VydmljZTohMSxpc1N5bmM6ITAscG9pbnRzOmEuZ2V0Q2hpbGRyZW5Qb2ludHMoKSx0ZXh0T3B0OmEudGV4dE9wdH0pO2Zvcihjb25zdFt2LFRdb2YgaS5lbnRyaWVzKCkpVC50b29sc1R5cGU9PT1ndC5UZXh0P3kucHVzaCh7Li4uVCx3b3JrSWQ6dix0eXBlOmx0LlRleHRVcGRhdGUsZGF0YVR5cGU6VHQuTG9jYWwsd2lsbFN5bmNTZXJ2aWNlOiEwfSk6eS5wdXNoKHsuLi5ULHdvcmtJZDp2LHR5cGU6bHQuVXBkYXRlTm9kZSx1cGRhdGVOb2RlT3B0Ont1c2VBbmltYXRpb246ITF9LGlzU3luYzohMH0pfXJldHVybntyZW5kZXI6cCxzcDp5fX19Y2xhc3MgaDAgZXh0ZW5kcyBKdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7c3QodGhpcywiZW1pdEV2ZW50VHlwZSIsTHQuUm90YXRlTm9kZSl9Y29uc3VtZSh0KXtjb25zdHttc2dUeXBlOmUsZGF0YVR5cGU6bixlbWl0RXZlbnRUeXBlOmEsdW5kb1RpY2tlcklkOnN9PXQ7aWYoZT09PWx0LlVwZGF0ZU5vZGUmJm49PT1UdC5Mb2NhbCYmYT09PXRoaXMuZW1pdEV2ZW50VHlwZSlyZXR1cm4gdGhpcy5jb25zdW1lRm9yTG9jYWxXb3JrZXIodCkuZmluYWxseSgoKT0+e3MmJnNldFRpbWVvdXQoKCk9Pnt2YXIgaTsoaT10aGlzLmxvY2FsV29yayk9PW51bGx8fGkuX3Bvc3Qoe3NwOlt7dHlwZTpsdC5Ob25lLHVuZG9UaWNrZXJJZDpzfV19KX0sMCl9KSwhMH1hc3luYyBjb25zdW1lRm9yTG9jYWxXb3JrZXIodCl7dmFyIGM7Y29uc3R7d29ya0lkOmUsdXBkYXRlTm9kZU9wdDpuLHdpbGxSZWZyZXNoU2VsZWN0b3I6YSx3aWxsU3luY1NlcnZpY2U6cyx3aWxsU2VyaWFsaXplRGF0YTppLGVtaXRFdmVudFR5cGU6b309dDtlPT09d3Quc2VsZWN0b3JJZCYmbiYmYXdhaXQoKGM9dGhpcy5sb2NhbFdvcmspPT1udWxsP3ZvaWQgMDpjLnVwZGF0ZVNlbGVjdG9yKHt1cGRhdGVTZWxlY3Rvck9wdDpuLHdpbGxSZWZyZXNoU2VsZWN0b3I6YSx3aWxsU3luY1NlcnZpY2U6cyx3aWxsU2VyaWFsaXplRGF0YTppLGVtaXRFdmVudFR5cGU6byxpc1N5bmM6ITAsc2NlbmU6dGhpcy5zY2VuZSxjYWxsYmFjazp0aGlzLnVwZGF0ZVNlbGVjdG9yQ2FsbGJhY2t9KSl9dXBkYXRlU2VsZWN0b3JDYWxsYmFjayh0KXtjb25zdHtwYXJhbTplLHBvc3REYXRhOm4sd29ya1NoYXBlTm9kZTphLHJlczpzLG5ld1NlcnZpY2VTdG9yZTppfT10LHt1cGRhdGVTZWxlY3Rvck9wdDpvLHdpbGxTeW5jU2VydmljZTpjLHdpbGxTZXJpYWxpemVEYXRhOm0saXNTeW5jOnV9PWUscD1vLndvcmtTdGF0ZSx5PW4ucmVuZGVyfHxbXSxPPW4uc3B8fFtdLHg9cz09bnVsbD92b2lkIDA6cy5zZWxlY3RSZWN0O2lmKGMpe20mJnA9PT1JdC5Eb25lJiZPLnB1c2goe3R5cGU6bHQuU2VsZWN0LHNlbGVjdElkczphLnNlbGVjdElkcyxzZWxlY3RSZWN0Ongsd2lsbFN5bmNTZXJ2aWNlOiEwLGlzU3luYzp1LHBvaW50czphLmdldENoaWxkcmVuUG9pbnRzKCl9KTtmb3IoY29uc3RbdixUXW9mIGkuZW50cmllcygpKU8ucHVzaCh7Li4uVCx3b3JrSWQ6dix0eXBlOmx0LlVwZGF0ZU5vZGUsdXBkYXRlTm9kZU9wdDp7dXNlQW5pbWF0aW9uOiExfSxpc1N5bmM6dX0pfXJldHVybntyZW5kZXI6eSxzcDpPfX19Y2xhc3MgZDAgZXh0ZW5kcyBKdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7c3QodGhpcywiZW1pdEV2ZW50VHlwZSIsTHQuU2V0Rm9udFN0eWxlKX1jb25zdW1lKHQpe2NvbnN0e21zZ1R5cGU6ZSxkYXRhVHlwZTpuLGVtaXRFdmVudFR5cGU6YSx1bmRvVGlja2VySWQ6c309dDtpZihlPT09bHQuVXBkYXRlTm9kZSYmbj09PVR0LkxvY2FsJiZhPT09dGhpcy5lbWl0RXZlbnRUeXBlKXJldHVybiB0aGlzLmNvbnN1bWVGb3JMb2NhbFdvcmtlcih0KS5maW5hbGx5KCgpPT57cyYmc2V0VGltZW91dCgoKT0+e3ZhciBpOyhpPXRoaXMubG9jYWxXb3JrKT09bnVsbHx8aS5fcG9zdCh7c3A6W3t0eXBlOmx0Lk5vbmUsdW5kb1RpY2tlcklkOnN9XX0pfSwwKX0pLCEwfWFzeW5jIGNvbnN1bWVGb3JMb2NhbFdvcmtlcih0KXt2YXIgYztjb25zdHt3b3JrSWQ6ZSx1cGRhdGVOb2RlT3B0Om4sd2lsbFJlZnJlc2hTZWxlY3RvcjphLHdpbGxTeW5jU2VydmljZTpzLHdpbGxTZXJpYWxpemVEYXRhOmksdGV4dFVwZGF0ZUZvcldva2VyOm99PXQ7ZT09PXd0LnNlbGVjdG9ySWQmJm4mJmF3YWl0KChjPXRoaXMubG9jYWxXb3JrKT09bnVsbD92b2lkIDA6Yy51cGRhdGVTZWxlY3Rvcih7dXBkYXRlU2VsZWN0b3JPcHQ6bix3aWxsUmVmcmVzaFNlbGVjdG9yOmEsd2lsbFN5bmNTZXJ2aWNlOnMsd2lsbFNlcmlhbGl6ZURhdGE6aSx0ZXh0VXBkYXRlRm9yV29rZXI6byxjYWxsYmFjazp0aGlzLnVwZGF0ZVNlbGVjdG9yQ2FsbGJhY2t9KSl9dXBkYXRlU2VsZWN0b3JDYWxsYmFjayh0KXtjb25zdHtwYXJhbTplLHBvc3REYXRhOm4sbmV3U2VydmljZVN0b3JlOmEsd29ya1NoYXBlTm9kZTpzLHJlczppfT10LHt3aWxsU3luY1NlcnZpY2U6byxpc1N5bmM6Yyx1cGRhdGVTZWxlY3Rvck9wdDptLHRleHRVcGRhdGVGb3JXb2tlcjp1fT1lLHA9bi5yZW5kZXJ8fFtdLHk9bi5zcHx8W10sTz1pPT1udWxsP3ZvaWQgMDppLnNlbGVjdFJlY3Q7aWYobyYmeSl7bS5mb250U2l6ZSYmeS5wdXNoKHt0eXBlOmx0LlNlbGVjdCxzZWxlY3RJZHM6cy5zZWxlY3RJZHMsc2VsZWN0UmVjdDpPLHdpbGxTeW5jU2VydmljZTpvLGlzU3luYzpjLHBvaW50czpzLmdldENoaWxkcmVuUG9pbnRzKCl9KTtmb3IoY29uc3RbeCx2XW9mIGEuZW50cmllcygpKXUmJnYudG9vbHNUeXBlPT09Z3QuVGV4dD95LnB1c2goey4uLnYsd29ya0lkOngsdHlwZTpsdC5UZXh0VXBkYXRlLGRhdGFUeXBlOlR0LkxvY2FsLHdpbGxTeW5jU2VydmljZTohMH0pOnkucHVzaCh7Li4udix3b3JrSWQ6eCx0eXBlOmx0LlVwZGF0ZU5vZGUsdXBkYXRlTm9kZU9wdDp7dXNlQW5pbWF0aW9uOiExfSxpc1N5bmM6Y30pfXJldHVybntyZW5kZXI6cCxzcDp5fX19Y2xhc3MgZzAgZXh0ZW5kcyBKdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7c3QodGhpcywiZW1pdEV2ZW50VHlwZSIsTHQuU2V0UG9pbnQpfWNvbnN1bWUodCl7Y29uc3R7bXNnVHlwZTplLGRhdGFUeXBlOm4sZW1pdEV2ZW50VHlwZTphLHVuZG9UaWNrZXJJZDpzfT10O2lmKGU9PT1sdC5VcGRhdGVOb2RlJiZuPT09VHQuTG9jYWwmJmE9PT10aGlzLmVtaXRFdmVudFR5cGUpcmV0dXJuIHRoaXMuY29uc3VtZUZvckxvY2FsV29ya2VyKHQpLmZpbmFsbHkoKCk9PntzJiZzZXRUaW1lb3V0KCgpPT57dmFyIGk7KGk9dGhpcy5sb2NhbFdvcmspPT1udWxsfHxpLl9wb3N0KHtzcDpbe3R5cGU6bHQuTm9uZSx1bmRvVGlja2VySWQ6c31dfSl9LDApfSksITB9YXN5bmMgY29uc3VtZUZvckxvY2FsV29ya2VyKHQpe3ZhciBjO2NvbnN0e3dvcmtJZDplLHVwZGF0ZU5vZGVPcHQ6bix3aWxsUmVmcmVzaFNlbGVjdG9yOmEsd2lsbFN5bmNTZXJ2aWNlOnMsd2lsbFNlcmlhbGl6ZURhdGE6aSx0ZXh0VXBkYXRlRm9yV29rZXI6b309dDtlPT09d3Quc2VsZWN0b3JJZCYmbiYmYXdhaXQoKGM9dGhpcy5sb2NhbFdvcmspPT1udWxsP3ZvaWQgMDpjLnVwZGF0ZVNlbGVjdG9yKHt1cGRhdGVTZWxlY3Rvck9wdDpuLHdpbGxSZWZyZXNoU2VsZWN0b3I6YSx3aWxsU3luY1NlcnZpY2U6cyxlbWl0RXZlbnRUeXBlOnRoaXMuZW1pdEV2ZW50VHlwZSx3aWxsU2VyaWFsaXplRGF0YTppLGlzU3luYzohMCx0ZXh0VXBkYXRlRm9yV29rZXI6byxjYWxsYmFjazp0aGlzLnVwZGF0ZVNlbGVjdG9yQ2FsbGJhY2t9KSl9dXBkYXRlU2VsZWN0b3JDYWxsYmFjayh0KXtjb25zdHtwYXJhbTplLHBvc3REYXRhOm4sbmV3U2VydmljZVN0b3JlOmEsd29ya1NoYXBlTm9kZTpzLHJlczppfT10LHt3aWxsU3luY1NlcnZpY2U6byxpc1N5bmM6Y309ZSxtPW4ucmVuZGVyfHxbXSx1PW4uc3B8fFtdLHA9aT09bnVsbD92b2lkIDA6aS5zZWxlY3RSZWN0O2lmKG8mJnUpe2Zvcihjb25zdFt5LE9db2YgYS5lbnRyaWVzKCkpdS5wdXNoKHsuLi5PLHdvcmtJZDp5LHR5cGU6bHQuVXBkYXRlTm9kZSx1cGRhdGVOb2RlT3B0Ont1c2VBbmltYXRpb246ITF9LGlzU3luYzpjfSk7dS5wdXNoKHt0eXBlOmx0LlNlbGVjdCxzZWxlY3RJZHM6cy5zZWxlY3RJZHMsc2VsZWN0UmVjdDpwLHdpbGxTeW5jU2VydmljZTpvLGlzU3luYzpjLHBvaW50czpzLmdldENoaWxkcmVuUG9pbnRzKCl9KX1yZXR1cm57cmVuZGVyOm0sc3A6dX19fWNsYXNzIHAwIGV4dGVuZHMgSnR7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3N0KHRoaXMsImVtaXRFdmVudFR5cGUiLEx0LlNldExvY2spfWNvbnN1bWUodCl7Y29uc3R7bXNnVHlwZTplLGRhdGFUeXBlOm4sZW1pdEV2ZW50VHlwZTphLHVuZG9UaWNrZXJJZDpzfT10O2lmKGU9PT1sdC5VcGRhdGVOb2RlJiZuPT09VHQuTG9jYWwmJmE9PT10aGlzLmVtaXRFdmVudFR5cGUpcmV0dXJuIHRoaXMuY29uc3VtZUZvckxvY2FsV29ya2VyKHQpLmZpbmFsbHkoKCk9PntzJiZzZXRUaW1lb3V0KCgpPT57dmFyIGk7KGk9dGhpcy5sb2NhbFdvcmspPT1udWxsfHxpLl9wb3N0KHtzcDpbe3R5cGU6bHQuTm9uZSx1bmRvVGlja2VySWQ6c31dfSl9LDApfSksITB9YXN5bmMgY29uc3VtZUZvckxvY2FsV29ya2VyKHQpe3ZhciBvO2NvbnN0e3dvcmtJZDplLHVwZGF0ZU5vZGVPcHQ6bix3aWxsUmVmcmVzaFNlbGVjdG9yOmEsd2lsbFN5bmNTZXJ2aWNlOnMsd2lsbFNlcmlhbGl6ZURhdGE6aX09dDtlPT09d3Quc2VsZWN0b3JJZCYmbiYmYXdhaXQoKG89dGhpcy5sb2NhbFdvcmspPT1udWxsP3ZvaWQgMDpvLnVwZGF0ZVNlbGVjdG9yKHt1cGRhdGVTZWxlY3Rvck9wdDpuLHdpbGxSZWZyZXNoU2VsZWN0b3I6YSx3aWxsU3luY1NlcnZpY2U6cyx3aWxsU2VyaWFsaXplRGF0YTppLGNhbGxiYWNrOnRoaXMudXBkYXRlU2VsZWN0b3JDYWxsYmFja30pKX11cGRhdGVTZWxlY3RvckNhbGxiYWNrKHQpe2NvbnN0e3BhcmFtOmUscG9zdERhdGE6bixuZXdTZXJ2aWNlU3RvcmU6YSx3b3JrU2hhcGVOb2RlOnMscmVzOml9PXQse3dpbGxTeW5jU2VydmljZTpvLGlzU3luYzpjLHVwZGF0ZVNlbGVjdG9yT3B0Om19PWUsdT1uLnJlbmRlcnx8W10scD1uLnNwfHxbXSx5PWk9PW51bGw/dm9pZCAwOmkuc2VsZWN0UmVjdDtpZihvJiZwKXtmb3IoY29uc3RbTyx4XW9mIGEuZW50cmllcygpKXAucHVzaCh7Li4ueCx3b3JrSWQ6Tyx0eXBlOmx0LlVwZGF0ZU5vZGUsdXBkYXRlTm9kZU9wdDp7dXNlQW5pbWF0aW9uOiExfSxpc1N5bmM6Y30pO3AucHVzaCh7aXNMb2NrZWQ6bS5pc0xvY2tlZCxzZWxlY3RvckNvbG9yOnMuc2VsZWN0b3JDb2xvcixzY2FsZVR5cGU6cy5zY2FsZVR5cGUsY2FuUm90YXRlOnMuY2FuUm90YXRlLHR5cGU6bHQuU2VsZWN0LHNlbGVjdElkczpzLnNlbGVjdElkcyxzZWxlY3RSZWN0Onksd2lsbFN5bmNTZXJ2aWNlOm8saXNTeW5jOmN9KX1yZXR1cm57cmVuZGVyOnUsc3A6cH19fWNsYXNzIG0wIGV4dGVuZHMgSnR7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3N0KHRoaXMsImVtaXRFdmVudFR5cGUiLEx0LlNldFNoYXBlT3B0KX1jb25zdW1lKHQpe2NvbnN0e21zZ1R5cGU6ZSxkYXRhVHlwZTpuLGVtaXRFdmVudFR5cGU6YSx1bmRvVGlja2VySWQ6c309dDtpZihlPT09bHQuVXBkYXRlTm9kZSYmbj09PVR0LkxvY2FsJiZhPT09dGhpcy5lbWl0RXZlbnRUeXBlKXJldHVybiB0aGlzLmNvbnN1bWVGb3JMb2NhbFdvcmtlcih0KS5maW5hbGx5KCgpPT57cyYmc2V0VGltZW91dCgoKT0+e3ZhciBpOyhpPXRoaXMubG9jYWxXb3JrKT09bnVsbHx8aS5fcG9zdCh7c3A6W3t0eXBlOmx0Lk5vbmUsdW5kb1RpY2tlcklkOnN9XX0pfSwwKX0pLCEwfWFzeW5jIGNvbnN1bWVGb3JMb2NhbFdvcmtlcih0KXt2YXIgbztjb25zdHt3b3JrSWQ6ZSx1cGRhdGVOb2RlT3B0Om4sd2lsbFJlZnJlc2hTZWxlY3RvcjphLHdpbGxTeW5jU2VydmljZTpzLHdpbGxTZXJpYWxpemVEYXRhOml9PXQ7ZT09PXd0LnNlbGVjdG9ySWQmJm4mJmF3YWl0KChvPXRoaXMubG9jYWxXb3JrKT09bnVsbD92b2lkIDA6by51cGRhdGVTZWxlY3Rvcih7dXBkYXRlU2VsZWN0b3JPcHQ6bix3aWxsUmVmcmVzaFNlbGVjdG9yOmEsd2lsbFN5bmNTZXJ2aWNlOnMsd2lsbFNlcmlhbGl6ZURhdGE6aSxjYWxsYmFjazp0aGlzLnVwZGF0ZVNlbGVjdG9yQ2FsbGJhY2t9KSl9dXBkYXRlU2VsZWN0b3JDYWxsYmFjayh0KXtjb25zdHtwYXJhbTplLHBvc3REYXRhOm4sbmV3U2VydmljZVN0b3JlOmF9PXQse3dpbGxTeW5jU2VydmljZTpzLGlzU3luYzppfT1lLG89bi5yZW5kZXJ8fFtdLGM9bi5zcHx8W107aWYocyYmYylmb3IoY29uc3RbbSx1XW9mIGEuZW50cmllcygpKWMucHVzaCh7Li4udSx3b3JrSWQ6bSx0eXBlOmx0LlVwZGF0ZU5vZGUsdXBkYXRlTm9kZU9wdDp7dXNlQW5pbWF0aW9uOiExfSxpc1N5bmM6aX0pO3JldHVybntyZW5kZXI6byxzcDpjfX19Y2xhc3MgdjB7Y29uc3RydWN0b3Iocil7c3QodGhpcywiYnVpbGRlcnMiLG5ldyBNYXApO3RoaXMuYnVpbGRlcnM9bmV3IE1hcChyLm1hcCh0PT5bdCx0aGlzLmJ1aWxkKHQpXSkpfWJ1aWxkKHIpe3N3aXRjaChyKXtjYXNlIEx0LlRyYW5zbGF0ZU5vZGU6cmV0dXJuIG5ldyBjMDtjYXNlIEx0LlpJbmRleE5vZGU6cmV0dXJuIG5ldyBsMDtjYXNlIEx0LlpJbmRleEFjdGl2ZTpyZXR1cm4gbmV3IHMwO2Nhc2UgTHQuQ29weU5vZGU6cmV0dXJuIG5ldyBvMDtjYXNlIEx0LlNldENvbG9yTm9kZTpyZXR1cm4gbmV3IGEwO2Nhc2UgTHQuRGVsZXRlTm9kZTpyZXR1cm4gbmV3IGYwO2Nhc2UgTHQuU2NhbGVOb2RlOnJldHVybiBuZXcgdTA7Y2FzZSBMdC5Sb3RhdGVOb2RlOnJldHVybiBuZXcgaDA7Y2FzZSBMdC5TZXRGb250U3R5bGU6cmV0dXJuIG5ldyBkMDtjYXNlIEx0LlNldFBvaW50OnJldHVybiBuZXcgZzA7Y2FzZSBMdC5TZXRMb2NrOnJldHVybiBuZXcgcDA7Y2FzZSBMdC5TZXRTaGFwZU9wdDpyZXR1cm4gbmV3IG0wfX1yZWdpc3RlckZvcldvcmtlcihyLHQsZSl7cmV0dXJuIHRoaXMuYnVpbGRlcnMuZm9yRWFjaChuPT57biYmbi5yZWdpc3RlckZvcldvcmtlcihyLHQsZSl9KSx0aGlzfWNvbnN1bWVGb3JXb3JrZXIocil7Zm9yKGNvbnN0IHQgb2YgdGhpcy5idWlsZGVycy52YWx1ZXMoKSlpZih0IT1udWxsJiZ0LmNvbnN1bWUocikpcmV0dXJuITA7cmV0dXJuITF9fWNvbnN0IEplPSJjdXJzb3Job3ZlciI7Y2xhc3MgeTB7Y29uc3RydWN0b3Iocix0KXtzdCh0aGlzLCJ2aWV3SWQiKTtzdCh0aGlzLCJzY2VuZSIpO3N0KHRoaXMsInNjZW5lUGF0aCIpO3N0KHRoaXMsImRyYXdMYXllciIpO3N0KHRoaXMsImZ1bGxMYXllciIpO3N0KHRoaXMsImN1ck5vZGVNYXAiLG5ldyBNYXApO3N0KHRoaXMsInRhcmdldE5vZGVNYXAiLFtdKTt0aGlzLnZpZXdJZD1yLHRoaXMuc2NlbmU9dH1pbml0KHIsdCl7dGhpcy5mdWxsTGF5ZXI9cix0aGlzLmRyYXdMYXllcj10fWdldChyKXtyZXR1cm4gdGhpcy5jdXJOb2RlTWFwLmdldChyKX1oYXNSZW5kZXJOb2Rlcygpe2xldCByPSExO2Zvcihjb25zdCB0IG9mIHRoaXMuY3VyTm9kZU1hcC52YWx1ZXMoKSl3aCh0LnRvb2xzVHlwZSkmJihyPSEwKTtyZXR1cm4gcn1oYXMocil7dGhpcy5jdXJOb2RlTWFwLmhhcyhyKX1zZXRJbmZvKHIsdCl7Y29uc3QgZT10aGlzLmN1ck5vZGVNYXAuZ2V0KHIpfHx7bmFtZTpyLHJlY3Q6dC5yZWN0fTt0LnJlY3QmJihlLnJlY3Q9WnQodC5yZWN0KSksdC5vcCYmKGUub3A9WnQodC5vcCkpLHQuY2FuUm90YXRlJiYoZS5jYW5Sb3RhdGU9dC5jYW5Sb3RhdGUpLHQuc2NhbGVUeXBlJiYoZS5zY2FsZVR5cGU9dC5zY2FsZVR5cGUpLHQub3B0JiYoZS5vcHQ9WnQodC5vcHQpKSx0LnRvb2xzVHlwZSYmKGUudG9vbHNUeXBlPXQudG9vbHNUeXBlKSx0LmNlbnRlclBvcyYmKGUuY2VudGVyUG9zPVp0KHQuY2VudGVyUG9zKSksZS5yZWN0P3RoaXMuY3VyTm9kZU1hcC5zZXQocixlKTp0aGlzLmN1ck5vZGVNYXAuZGVsZXRlKHIpfWRlbGV0ZShyKXt0aGlzLmN1ck5vZGVNYXAuZGVsZXRlKHIpfWNsZWFyKCl7dGhpcy5jdXJOb2RlTWFwLmNsZWFyKCksdGhpcy50YXJnZXROb2RlTWFwLmxlbmd0aD0wfWhhc1JlY3RJbnRlcnNlY3RSYW5nZShyLHQ9ITApe2Zvcihjb25zdCBlIG9mIHRoaXMuY3VyTm9kZU1hcC52YWx1ZXMoKSlpZih4ZShyLGUucmVjdCkpe2lmKHQmJmUudG9vbHNUeXBlPT09Z3QuSW1hZ2UmJmUub3B0LmxvY2tlZHx8dCYmZS50b29sc1R5cGU9PT1ndC5UZXh0JiYoZS5vcHQud29ya1N0YXRlPT09SXQuRG9pbmd8fGUub3B0LndvcmtTdGF0ZT09PUl0LlN0YXJ0KSljb250aW51ZTtyZXR1cm4hMH1yZXR1cm4hMX1nZXRSZWN0SW50ZXJzZWN0UmFuZ2Uocix0PSEwKXtsZXQgZTtjb25zdCBuPW5ldyBNYXA7Zm9yKGNvbnN0W2Esc11vZiB0aGlzLmN1ck5vZGVNYXAuZW50cmllcygpKWlmKHhlKHIscy5yZWN0KSl7aWYodCYmcy50b29sc1R5cGU9PT1ndC5JbWFnZSYmcy5vcHQubG9ja2VkfHx0JiZzLnRvb2xzVHlwZT09PWd0LlRleHQmJihzLm9wdC53b3JrU3RhdGU9PT1JdC5Eb2luZ3x8cy5vcHQud29ya1N0YXRlPT09SXQuU3RhcnQpKWNvbnRpbnVlO2U9T3QoZSxzLnJlY3QpLG4uc2V0KGEscyl9cmV0dXJue3JlY3RSYW5nZTplLG5vZGVSYW5nZTpufX1nZXROb2RlUmVjdEZvcm1TaGFwZShyLHQpe2NvbnN0IGU9Vm4odC50b29sc1R5cGUpO2xldCBuPXRoaXMuZnVsbExheWVyJiYoZT09bnVsbD92b2lkIDA6ZS5nZXRSZWN0RnJvbUxheWVyKHRoaXMuZnVsbExheWVyLHIpKTtyZXR1cm4hbiYmdGhpcy5kcmF3TGF5ZXImJihuPWU9PW51bGw/dm9pZCAwOmUuZ2V0UmVjdEZyb21MYXllcih0aGlzLmRyYXdMYXllcixyKSksbn11cGRhdGVOb2Rlc1JlY3QoKXt0aGlzLmN1ck5vZGVNYXAuZm9yRWFjaCgocix0KT0+e2NvbnN0IGU9dGhpcy5nZXROb2RlUmVjdEZvcm1TaGFwZSh0LHIpO2U/KHIucmVjdD1lLHRoaXMuY3VyTm9kZU1hcC5zZXQodCxyKSk6dGhpcy5jdXJOb2RlTWFwLmRlbGV0ZSh0KX0pfWNvbWJpbmVJbnRlcnNlY3RSZWN0KHIpe2xldCB0PXI7cmV0dXJuIHRoaXMuY3VyTm9kZU1hcC5mb3JFYWNoKGU9Pnt4ZSh0LGUucmVjdCkmJih0PU90KHQsZS5yZWN0KSl9KSx0fXNldFRhcmdldCgpe3JldHVybiB0aGlzLnRhcmdldE5vZGVNYXAucHVzaChadCh0aGlzLmN1ck5vZGVNYXApKSx0aGlzLnRhcmdldE5vZGVNYXAubGVuZ3RoLTF9Z2V0TGFzdFRhcmdldCgpe3JldHVybiB0aGlzLnRhcmdldE5vZGVNYXBbdGhpcy50YXJnZXROb2RlTWFwLmxlbmd0aC0xXX1kZWxldGVMYXN0VGFyZ2V0KCl7dGhpcy50YXJnZXROb2RlTWFwLmxlbmd0aD10aGlzLnRhcmdldE5vZGVNYXAubGVuZ3RoLTF9Z2V0VGFyZ2V0KHIpe3JldHVybiB0aGlzLnRhcmdldE5vZGVNYXBbcl19ZGVsZXRlVGFyZ2V0KHIpe3RoaXMudGFyZ2V0Tm9kZU1hcC5sZW5ndGg9cn19Y2xhc3MgWG57Y29uc3RydWN0b3Iocix0KXtzdCh0aGlzLCJ2aWV3SWQiKTtzdCh0aGlzLCJmdWxsTGF5ZXIiKTtzdCh0aGlzLCJ2Tm9kZXMiKTtzdCh0aGlzLCJkcHIiKTtzdCh0aGlzLCJvcHQiKTtzdCh0aGlzLCJjYW1lcmFPcHQiKTtzdCh0aGlzLCJzY2VuZSIpO3N0KHRoaXMsImlzU2FmYXJpIiwhMSk7dGhpcy52aWV3SWQ9cix0aGlzLm9wdD10LHRoaXMuZHByPXQuZHByLHRoaXMuc2NlbmU9dGhpcy5jcmVhdGVTY2VuZSh0Lm9mZnNjcmVlbkNhbnZhc09wdCksdGhpcy5mdWxsTGF5ZXI9dGhpcy5jcmVhdGVMYXllcigiZnVsbExheWVyIix0aGlzLnNjZW5lLHsuLi50LmxheWVyT3B0LGJ1ZmZlclNpemU6dGhpcy52aWV3SWQ9PT0ibWFpblZpZXciPzZlMzozZTN9KSx0aGlzLnZOb2Rlcz1uZXcgeTAocix0aGlzLnNjZW5lKX1zZXRJc1NhZmFyaShyKXt0aGlzLmlzU2FmYXJpPXJ9b24ocil7Y29uc3R7bXNnVHlwZTp0LHRvb2xzVHlwZTplLG9wdDpuLHdvcmtJZDphLHdvcmtTdGF0ZTpzLGRhdGFUeXBlOml9PXI7c3dpdGNoKHQpe2Nhc2UgbHQuRGVzdHJveTp0aGlzLmRlc3Ryb3koKTticmVhaztjYXNlIGx0LkNsZWFyOnRoaXMuY2xlYXJBbGwoKTticmVhaztjYXNlIGx0LlVwZGF0ZVRvb2xzOmlmKGUmJm4pe2NvbnN0IG89e3Rvb2xzVHlwZTplLHRvb2xzT3B0Om59O3RoaXMubG9jYWxXb3JrLnNldFRvb2xzT3B0KG8pfWJyZWFrO2Nhc2UgbHQuQ3JlYXRlV29yazphJiZuJiYoIXRoaXMubG9jYWxXb3JrLmdldFRtcFdvcmtTaGFwZU5vZGUoKSYmZSYmdGhpcy5zZXRUb29sc09wdCh7dG9vbHNUeXBlOmUsdG9vbHNPcHQ6bn0pLHRoaXMuc2V0V29ya09wdCh7d29ya0lkOmEsdG9vbHNPcHQ6bn0pKTticmVhaztjYXNlIGx0LkRyYXdXb3JrOnM9PT1JdC5Eb25lJiZpPT09VHQuTG9jYWw/dGhpcy5jb25zdW1lRHJhd0FsbChpLHIpOnRoaXMuY29uc3VtZURyYXcoaSxyKTticmVha319dXBkYXRlU2NlbmUocil7dGhpcy5zY2VuZS5hdHRyKHsuLi5yfSk7Y29uc3R7d2lkdGg6dCxoZWlnaHQ6ZX09cjt0aGlzLnNjZW5lLmNvbnRhaW5lci53aWR0aD10LHRoaXMuc2NlbmUuY29udGFpbmVyLmhlaWdodD1lLHRoaXMuc2NlbmUud2lkdGg9dCx0aGlzLnNjZW5lLmhlaWdodD1lLHRoaXMudXBkYXRlTGF5ZXIoe3dpZHRoOnQsaGVpZ2h0OmV9KX11cGRhdGVMYXllcihyKXtjb25zdHt3aWR0aDp0LGhlaWdodDplfT1yO3RoaXMuZnVsbExheWVyJiYodGhpcy5mdWxsTGF5ZXIucGFyZW50LnNldEF0dHJpYnV0ZSgid2lkdGgiLHQpLHRoaXMuZnVsbExheWVyLnBhcmVudC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsZSksdGhpcy5mdWxsTGF5ZXIuc2V0QXR0cmlidXRlKCJzaXplIixbdCxlXSksdGhpcy5mdWxsTGF5ZXIuc2V0QXR0cmlidXRlKCJwb3MiLFt0Ki41LGUqLjVdKSksdGhpcy5kcmF3TGF5ZXImJih0aGlzLmRyYXdMYXllci5wYXJlbnQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsdCksdGhpcy5kcmF3TGF5ZXIucGFyZW50LnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixlKSx0aGlzLmRyYXdMYXllci5zZXRBdHRyaWJ1dGUoInNpemUiLFt0LGVdKSx0aGlzLmRyYXdMYXllci5zZXRBdHRyaWJ1dGUoInBvcyIsW3QqLjUsZSouNV0pKSx0aGlzLnNuYXBzaG90RnVsbExheWVyJiYodGhpcy5zbmFwc2hvdEZ1bGxMYXllci5wYXJlbnQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsdCksdGhpcy5zbmFwc2hvdEZ1bGxMYXllci5wYXJlbnQuc2V0QXR0cmlidXRlKCJoZWlnaHQiLGUpLHRoaXMuc25hcHNob3RGdWxsTGF5ZXIuc2V0QXR0cmlidXRlKCJzaXplIixbdCxlXSksdGhpcy5zbmFwc2hvdEZ1bGxMYXllci5zZXRBdHRyaWJ1dGUoInBvcyIsW3QqLjUsZSouNV0pKX1jcmVhdGVTY2VuZShyKXtjb25zdHt3aWR0aDp0LGhlaWdodDplfT1yLG49bmV3IE9mZnNjcmVlbkNhbnZhcyh0LGUpO3JldHVybiBuZXcgJGgoe2NvbnRhaW5lcjpuLGRpc3BsYXlSYXRpbzp0aGlzLmRwcixkZXB0aDohMSxkZXN5bmNocm9uaXplZDohMCwuLi5yfSl9Y3JlYXRlTGF5ZXIocix0LGUpe2NvbnN0e3dpZHRoOm4saGVpZ2h0OmF9PWUscz1gb2Zmc2NyZWVuLSR7cn1gLGk9dC5sYXllcihzLGUpLG89bmV3IHJlKHthbmNob3I6Wy41LC41XSxwb3M6W24qLjUsYSouNV0sc2l6ZTpbbixhXSxuYW1lOiJ2aWV3cG9ydCIsaWQ6cn0pO3JldHVybiBpLmFwcGVuZChvKSxvfWNsZWFyQWxsKCl7dmFyIHI7dGhpcy5mdWxsTGF5ZXImJih0aGlzLmZ1bGxMYXllci5wYXJlbnQuY2hpbGRyZW4uZm9yRWFjaCh0PT57dC5uYW1lIT09InZpZXdwb3J0IiYmdC5yZW1vdmUoKX0pLHRoaXMuZnVsbExheWVyLnJlbW92ZUFsbENoaWxkcmVuKCkpLHRoaXMuZHJhd0xheWVyJiYodGhpcy5kcmF3TGF5ZXIucGFyZW50LmNoaWxkcmVuLmZvckVhY2godD0+e3QubmFtZSE9PSJ2aWV3cG9ydCImJnQucmVtb3ZlKCl9KSx0aGlzLmRyYXdMYXllci5yZW1vdmVBbGxDaGlsZHJlbigpKSx0aGlzLmxvY2FsV29yay5jbGVhckFsbFdvcmtTaGFwZXNDYWNoZSgpLChyPXRoaXMuc2VydmljZVdvcmspPT1udWxsfHxyLmNsZWFyQWxsV29ya1NoYXBlc0NhY2hlKCl9c2V0VG9vbHNPcHQocil7dGhpcy5sb2NhbFdvcmsuc2V0VG9vbHNPcHQocil9c2V0V29ya09wdChyKXtjb25zdHt3b3JrSWQ6dCx0b29sc09wdDplfT1yO3QmJmUmJnRoaXMubG9jYWxXb3JrLnNldFdvcmtPcHRpb25zKHQsZSl9ZGVzdHJveSgpe3ZhciByO3RoaXMudk5vZGVzLmNsZWFyKCksdGhpcy5mdWxsTGF5ZXIucmVtb3ZlKCksdGhpcy5zY2VuZS5yZW1vdmUoKSx0aGlzLmxvY2FsV29yay5kZXN0cm95KCksKHI9dGhpcy5zZXJ2aWNlV29yayk9PW51bGx8fHIuZGVzdHJveSgpfX1jbGFzcyBabntjb25zdHJ1Y3RvcihyKXtzdCh0aGlzLCJ2aWV3SWQiKTtzdCh0aGlzLCJ2Tm9kZXMiKTtzdCh0aGlzLCJ0aHJlYWQiKTtzdCh0aGlzLCJmdWxsTGF5ZXIiKTtzdCh0aGlzLCJkcmF3TGF5ZXIiKTtzdCh0aGlzLCJfcG9zdCIpO3N0KHRoaXMsInRtcFdvcmtTaGFwZU5vZGUiKTtzdCh0aGlzLCJ0bXBPcHQiKTtzdCh0aGlzLCJ3b3JrU2hhcGVzIixuZXcgTWFwKTtzdCh0aGlzLCJ3b3JrU2hhcGVTdGF0ZSIsbmV3IE1hcCk7c3QodGhpcywiZWZmZWN0V29ya0lkIik7c3QodGhpcywiZHJhd0NvdW50IiwwKTt0aGlzLnRocmVhZD1yLnRocmVhZCx0aGlzLnZpZXdJZD1yLnZpZXdJZCx0aGlzLnZOb2Rlcz1yLnZOb2Rlcyx0aGlzLmZ1bGxMYXllcj1yLmZ1bGxMYXllcix0aGlzLmRyYXdMYXllcj1yLmRyYXdMYXllcix0aGlzLl9wb3N0PXIucG9zdH1kZXN0cm95KCl7dGhpcy53b3JrU2hhcGVTdGF0ZS5jbGVhcigpLHRoaXMud29ya1NoYXBlcy5jbGVhcigpfWdldFdvcmtTaGFwZShyKXtyZXR1cm4gdGhpcy53b3JrU2hhcGVzLmdldChyKX1nZXRUbXBXb3JrU2hhcGVOb2RlKCl7cmV0dXJuIHRoaXMudG1wV29ya1NoYXBlTm9kZX1zZXRUbXBXb3JrSWQocil7aWYociYmdGhpcy50bXBXb3JrU2hhcGVOb2RlKXt0aGlzLnRtcFdvcmtTaGFwZU5vZGUuc2V0V29ya0lkKHIpLHRoaXMud29ya1NoYXBlcy5zZXQocix0aGlzLnRtcFdvcmtTaGFwZU5vZGUpLHRoaXMudG1wT3B0JiZ0aGlzLnNldFRvb2xzT3B0KHRoaXMudG1wT3B0KTtyZXR1cm59fXNldFRtcFdvcmtPcHRpb25zKHIpe3ZhciB0Oyh0PXRoaXMudG1wV29ya1NoYXBlTm9kZSk9PW51bGx8fHQuc2V0V29ya09wdGlvbnMocil9c2V0V29ya09wdGlvbnMocix0KXt2YXIgbjt0aGlzLndvcmtTaGFwZXMuZ2V0KHIpfHx0aGlzLnNldFRtcFdvcmtJZChyKSwobj10aGlzLndvcmtTaGFwZXMuZ2V0KHIpKT09bnVsbHx8bi5zZXRXb3JrT3B0aW9ucyh0KX1jcmVhdGVXb3JrU2hhcGVOb2RlKHIpe3ZhciBuO2NvbnN0e3Rvb2xzVHlwZTp0LHdvcmtJZDplfT1yO3JldHVybiB0PT09Z3QuU2VsZWN0b3ImJmU9PT1KZT95cih7Li4ucix2Tm9kZXM6dGhpcy52Tm9kZXMsZnVsbExheWVyOnRoaXMuZnVsbExheWVyLGRyYXdMYXllcjp0aGlzLmZ1bGxMYXllcn0pOnlyKHsuLi5yLHZOb2Rlczp0aGlzLnZOb2RlcyxmdWxsTGF5ZXI6dGhpcy5mdWxsTGF5ZXIsZHJhd0xheWVyOnRoaXMuZHJhd0xheWVyfSwobj10aGlzLnRocmVhZCk9PW51bGw/dm9pZCAwOm4uc2VydmljZVdvcmspfXNldFRvb2xzT3B0KHIpe3ZhciB0LGU7KCh0PXRoaXMudG1wT3B0KT09bnVsbD92b2lkIDA6dC50b29sc1R5cGUpIT09ci50b29sc1R5cGUmJihlPXRoaXMudG1wT3B0KSE9bnVsbCYmZS50b29sc1R5cGUmJnRoaXMuY2xlYXJBbGxXb3JrU2hhcGVzQ2FjaGUoKSx0aGlzLnRtcE9wdD1yLHRoaXMudG1wV29ya1NoYXBlTm9kZT10aGlzLmNyZWF0ZVdvcmtTaGFwZU5vZGUocil9Y2xlYXJXb3JrU2hhcGVOb2RlQ2FjaGUocil7dmFyIHQ7KHQ9dGhpcy5nZXRXb3JrU2hhcGUocikpPT1udWxsfHx0LmNsZWFyVG1wUG9pbnRzKCksdGhpcy53b3JrU2hhcGVzLmRlbGV0ZShyKSx0aGlzLndvcmtTaGFwZVN0YXRlLmRlbGV0ZShyKX1jbGVhckFsbFdvcmtTaGFwZXNDYWNoZSgpe3RoaXMud29ya1NoYXBlcy5mb3JFYWNoKHI9PnIuY2xlYXJUbXBQb2ludHMoKSksdGhpcy53b3JrU2hhcGVzLmNsZWFyKCksdGhpcy53b3JrU2hhcGVTdGF0ZS5jbGVhcigpfXNldEZ1bGxXb3JrKHIpe2NvbnN0e3dvcmtJZDp0LG9wdDplLHRvb2xzVHlwZTpufT1yO2lmKHQmJmUmJm4pe2NvbnN0IGE9dCYmdGhpcy53b3JrU2hhcGVzLmdldCh0KXx8dGhpcy5jcmVhdGVXb3JrU2hhcGVOb2RlKHt0b29sc09wdDplLHRvb2xzVHlwZTpuLHdvcmtJZDp0fSk7cmV0dXJuIGE/KGEuc2V0V29ya0lkKHQpLHRoaXMud29ya1NoYXBlcy5zZXQodCxhKSxhKTp2b2lkIDB9fX12YXIgUzA9UXQseDA9ZnVuY3Rpb24oKXtyZXR1cm4gUzAuRGF0ZS5ub3coKX0sVDA9eDAsTTA9L1xzLztmdW5jdGlvbiBPMChkKXtmb3IodmFyIHI9ZC5sZW5ndGg7ci0tJiZNMC50ZXN0KGQuY2hhckF0KHIpKTspO3JldHVybiByfXZhciBFMD1PMCxQMD1FMCxBMD0vXlxzKy87ZnVuY3Rpb24gQzAoZCl7cmV0dXJuIGQmJmQuc2xpY2UoMCxQMChkKSsxKS5yZXBsYWNlKEEwLCIiKX12YXIgUjA9QzAsSTA9Y2UsTDA9aWUsYjA9IltvYmplY3QgU3ltYm9sXSI7ZnVuY3Rpb24gRDAoZCl7cmV0dXJuIHR5cGVvZiBkPT0ic3ltYm9sInx8TDAoZCkmJkkwKGQpPT1iMH12YXIgdzA9RDAsTjA9UjAsSm49c2UsQjA9dzAsUW49TmFOLFcwPS9eWy0rXTB4WzAtOWEtZl0rJC9pLEYwPS9eMGJbMDFdKyQvaSxqMD0vXjBvWzAtN10rJC9pLFUwPXBhcnNlSW50O2Z1bmN0aW9uICQwKGQpe2lmKHR5cGVvZiBkPT0ibnVtYmVyIilyZXR1cm4gZDtpZihCMChkKSlyZXR1cm4gUW47aWYoSm4oZCkpe3ZhciByPXR5cGVvZiBkLnZhbHVlT2Y9PSJmdW5jdGlvbiI/ZC52YWx1ZU9mKCk6ZDtkPUpuKHIpP3IrIiI6cn1pZih0eXBlb2YgZCE9InN0cmluZyIpcmV0dXJuIGQ9PT0wP2Q6K2Q7ZD1OMChkKTt2YXIgdD1GMC50ZXN0KGQpO3JldHVybiB0fHxqMC50ZXN0KGQpP1UwKGQuc2xpY2UoMiksdD8yOjgpOlcwLnRlc3QoZCk/UW46K2R9dmFyIHowPSQwLEcwPXNlLFNyPVQwLGtuPXowLEgwPSJFeHBlY3RlZCBhIGZ1bmN0aW9uIixLMD1NYXRoLm1heCxWMD1NYXRoLm1pbjtmdW5jdGlvbiBZMChkLHIsdCl7dmFyIGUsbixhLHMsaSxvLGM9MCxtPSExLHU9ITEscD0hMDtpZih0eXBlb2YgZCE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEgwKTtyPWtuKHIpfHwwLEcwKHQpJiYobT0hIXQubGVhZGluZyx1PSJtYXhXYWl0ImluIHQsYT11P0swKGtuKHQubWF4V2FpdCl8fDAscik6YSxwPSJ0cmFpbGluZyJpbiB0PyEhdC50cmFpbGluZzpwKTtmdW5jdGlvbiB5KE0pe3ZhciBBPWUsQz1uO3JldHVybiBlPW49dm9pZCAwLGM9TSxzPWQuYXBwbHkoQyxBKSxzfWZ1bmN0aW9uIE8oTSl7cmV0dXJuIGM9TSxpPXNldFRpbWVvdXQoVCxyKSxtP3koTSk6c31mdW5jdGlvbiB4KE0pe3ZhciBBPU0tbyxDPU0tYyxiPXItQTtyZXR1cm4gdT9WMChiLGEtQyk6Yn1mdW5jdGlvbiB2KE0pe3ZhciBBPU0tbyxDPU0tYztyZXR1cm4gbz09PXZvaWQgMHx8QT49cnx8QTwwfHx1JiZDPj1hfWZ1bmN0aW9uIFQoKXt2YXIgTT1TcigpO2lmKHYoTSkpcmV0dXJuIGwoTSk7aT1zZXRUaW1lb3V0KFQseChNKSl9ZnVuY3Rpb24gbChNKXtyZXR1cm4gaT12b2lkIDAscCYmZT95KE0pOihlPW49dm9pZCAwLHMpfWZ1bmN0aW9uIGgoKXtpIT09dm9pZCAwJiZjbGVhclRpbWVvdXQoaSksYz0wLGU9bz1uPWk9dm9pZCAwfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaT09PXZvaWQgMD9zOmwoU3IoKSl9ZnVuY3Rpb24gZygpe3ZhciBNPVNyKCksQT12KE0pO2lmKGU9YXJndW1lbnRzLG49dGhpcyxvPU0sQSl7aWYoaT09PXZvaWQgMClyZXR1cm4gTyhvKTtpZih1KXJldHVybiBjbGVhclRpbWVvdXQoaSksaT1zZXRUaW1lb3V0KFQscikseShvKX1yZXR1cm4gaT09PXZvaWQgMCYmKGk9c2V0VGltZW91dChULHIpKSxzfXJldHVybiBnLmNhbmNlbD1oLGcuZmx1c2g9ZixnfXZhciBYMD1ZMCxaMD1YMCxKMD1zZSxRMD0iRXhwZWN0ZWQgYSBmdW5jdGlvbiI7ZnVuY3Rpb24gazAoZCxyLHQpe3ZhciBlPSEwLG49ITA7aWYodHlwZW9mIGQhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihRMCk7cmV0dXJuIEowKHQpJiYoZT0ibGVhZGluZyJpbiB0PyEhdC5sZWFkaW5nOmUsbj0idHJhaWxpbmciaW4gdD8hIXQudHJhaWxpbmc6biksWjAoZCxyLHtsZWFkaW5nOmUsbWF4V2FpdDpyLHRyYWlsaW5nOm59KX12YXIgcTA9azAsXzA9WHQocTApO2NsYXNzIHRnIGV4dGVuZHMgWm57Y29uc3RydWN0b3IodCl7c3VwZXIodCk7c3QodGhpcywiY29tYmluZVVuaXRUaW1lIiw2MDApO3N0KHRoaXMsImNvbWJpbmVUaW1lcklkIik7c3QodGhpcywiZWZmZWN0U2VsZWN0Tm9kZURhdGEiLG5ldyBTZXQpO3N0KHRoaXMsImJhdGNoRXJhc2VyV29ya3MiLG5ldyBTZXQpO3N0KHRoaXMsImJhdGNoRXJhc2VyUmVtb3ZlTm9kZXMiLG5ldyBTZXQpO3N0KHRoaXMsImJhdGNoRXJhc2VyQ29tYmluZSIsXzAoKCk9Pntjb25zdCB0PXRoaXMudXBkYXRlQmF0Y2hFcmFzZXJDb21iaW5lTm9kZSh0aGlzLmJhdGNoRXJhc2VyV29ya3MsdGhpcy5iYXRjaEVyYXNlclJlbW92ZU5vZGVzKTt0aGlzLmJhdGNoRXJhc2VyV29ya3MuY2xlYXIoKSx0aGlzLmJhdGNoRXJhc2VyUmVtb3ZlTm9kZXMuY2xlYXIoKSx0Lmxlbmd0aCYmdGhpcy5fcG9zdCh7cmVuZGVyOnR9KX0sMTAwLHtsZWFkaW5nOiExfSkpfWNvbnN1bWVEcmF3KHQsZSl7Y29uc3R7b3A6bix3b3JrSWQ6YX09dDtpZihuIT1udWxsJiZuLmxlbmd0aCYmYSl7Y29uc3Qgcz10aGlzLndvcmtTaGFwZXMuZ2V0KGEpO2lmKCFzKXJldHVybjtjb25zdCBpPXMudG9vbHNUeXBlO2lmKGk9PT1ndC5MYXNlclBlbilyZXR1cm47Y29uc3Qgbz1zLmNvbnN1bWUoe2RhdGE6dCxpc0Z1bGxXb3JrOiEwfSk7c3dpdGNoKGkpe2Nhc2UgZ3QuU2VsZWN0b3I6by50eXBlPT09bHQuU2VsZWN0JiYoby5zZWxlY3RJZHMmJmUucnVuUmV2ZXJzZVNlbGVjdFdvcmsoby5zZWxlY3RJZHMpLHRoaXMuZHJhd1NlbGVjdG9yKG8sITApKTticmVhaztjYXNlIGd0LkVyYXNlcjpvIT1udWxsJiZvLnJlY3QmJnRoaXMuZHJhd0VyYXNlcihvKTticmVhaztjYXNlIGd0LkFycm93OmNhc2UgZ3QuU3RyYWlnaHQ6Y2FzZSBndC5FbGxpcHNlOmNhc2UgZ3QuUmVjdGFuZ2xlOmNhc2UgZ3QuU3RhcjpjYXNlIGd0LlBvbHlnb246Y2FzZSBndC5TcGVlY2hCYWxsb29uOm8mJih0aGlzLmRyYXdDb3VudCsrLHRoaXMuZHJhd1BlbmNpbChvKSk7YnJlYWs7Y2FzZSBndC5QZW5jaWw6dGhpcy5jb21iaW5lVGltZXJJZHx8KHRoaXMuY29tYmluZVRpbWVySWQ9c2V0VGltZW91dCgoKT0+e3RoaXMuY29tYmluZVRpbWVySWQ9dm9pZCAwLHRoaXMuZHJhd1BlbmNpbENvbWJpbmUoYSl9LE1hdGguZmxvb3Iocy5nZXRXb3JrT3B0aW9ucygpLnN5bmNVbml0VGltZXx8dGhpcy5jb21iaW5lVW5pdFRpbWUvMikpKSxvJiYodGhpcy5kcmF3Q291bnQrKyx0aGlzLmRyYXdQZW5jaWwobykpO2JyZWFrfX19Y29uc3VtZURyYXdBbGwodCxlKXt2YXIgaSxvLGM7dGhpcy5jb21iaW5lVGltZXJJZCYmKGNsZWFyVGltZW91dCh0aGlzLmNvbWJpbmVUaW1lcklkKSx0aGlzLmNvbWJpbmVUaW1lcklkPXZvaWQgMCk7Y29uc3R7d29ya0lkOm4sdW5kb1RpY2tlcklkOmEsc2NlbmVQYXRoOnN9PXQ7aWYobil7YSYmc2V0VGltZW91dCgoKT0+e3RoaXMuX3Bvc3Qoe3NwOlt7dHlwZTpsdC5Ob25lLHVuZG9UaWNrZXJJZDphfV19KX0sMCk7Y29uc3QgbT10aGlzLndvcmtTaGFwZXMuZ2V0KG4pO2lmKCFtKXJldHVybjtjb25zdCB1PW0udG9vbHNUeXBlO2lmKHU9PT1ndC5MYXNlclBlbilyZXR1cm47Y29uc3QgcD10aGlzLndvcmtTaGFwZXMuZ2V0KEplKSx5PShpPXA9PW51bGw/dm9pZCAwOnAuc2VsZWN0SWRzKT09bnVsbD92b2lkIDA6aVswXSxPPW0uY29uc3VtZUFsbCh7ZGF0YTp0LGhvdmVySWQ6eX0pLHg9dGhpcy53b3JrU2hhcGVTdGF0ZS5nZXQobik7c3dpdGNoKHUpe2Nhc2UgZ3QuU2VsZWN0b3I6Ty5zZWxlY3RJZHMmJnkmJigobz1PLnNlbGVjdElkcykhPW51bGwmJm8uaW5jbHVkZXMoeSkpJiZwLmN1cnNvckJsdXIoKSxPLnNlbGVjdElkcyYmZS5ydW5SZXZlcnNlU2VsZWN0V29yayhPLnNlbGVjdElkcyksdGhpcy5kcmF3U2VsZWN0b3Ioey4uLk8sc2NlbmVQYXRoOnN9LCExKSwoYz1tLnNlbGVjdElkcykhPW51bGwmJmMubGVuZ3RoP20uY2xlYXJUbXBQb2ludHMoKTp0aGlzLmNsZWFyV29ya1NoYXBlTm9kZUNhY2hlKG4pO2JyZWFrO2Nhc2UgZ3QuRXJhc2VyOk8hPW51bGwmJk8ucmVjdCYmdGhpcy5kcmF3RXJhc2VyKHsuLi5PLHNjZW5lUGF0aDpzfSksbS5jbGVhclRtcFBvaW50cygpO2JyZWFrO2Nhc2UgZ3QuQXJyb3c6Y2FzZSBndC5TdHJhaWdodDpjYXNlIGd0LkVsbGlwc2U6Y2FzZSBndC5SZWN0YW5nbGU6Y2FzZSBndC5TdGFyOmNhc2UgZ3QuUG9seWdvbjpjYXNlIGd0LlNwZWVjaEJhbGxvb246dGhpcy5kcmF3UGVuY2lsRnVsbCh7Li4uTyxzY2VuZVBhdGg6c30sbS5nZXRXb3JrT3B0aW9ucygpLHgpLHRoaXMuZHJhd0NvdW50PTAsdGhpcy5jbGVhcldvcmtTaGFwZU5vZGVDYWNoZShuKTticmVhaztjYXNlIGd0LlBlbmNpbDpPIT1udWxsJiZPLnJlY3QmJih0aGlzLmRyYXdQZW5jaWxGdWxsKHsuLi5PLHNjZW5lUGF0aDpzfSxtLmdldFdvcmtPcHRpb25zKCkseCksdGhpcy5kcmF3Q291bnQ9MCksdGhpcy5jbGVhcldvcmtTaGFwZU5vZGVDYWNoZShuKTticmVha319fWFzeW5jIGNvbnN1bWVGdWxsKHQsZSl7dmFyIGksbztjb25zdCBuPXRoaXMuc2V0RnVsbFdvcmsodCksYT10Lm9wcyYmVmUodC5vcHMpLHM9KGk9dC53b3JrSWQpPT1udWxsP3ZvaWQgMDppLnRvU3RyaW5nKCk7aWYocyYmbil7Y29uc3QgYz0obz10aGlzLnZOb2Rlcy5nZXQocykpPT1udWxsP3ZvaWQgMDpvLnJlY3Q7bGV0IG07bi50b29sc1R5cGU9PT1ndC5JbWFnZSYmZT9tPWF3YWl0IG4uY29uc3VtZVNlcnZpY2VBc3luYyh7c2NlbmU6ZSxpc0Z1bGxXb3JrOiEwLHJlcGxhY2VJZDpzfSk6bT1uLmNvbnN1bWVTZXJ2aWNlKHtvcDphLGlzRnVsbFdvcms6ITAscmVwbGFjZUlkOnN9KTtjb25zdCB1PSh0PT1udWxsP3ZvaWQgMDp0LnVwZGF0ZU5vZGVPcHQpJiZuLnVwZGF0YU9wdFNlcnZpY2UodC51cGRhdGVOb2RlT3B0KTttPU90KG0sdSk7Y29uc3QgcD1bXSx5PVtdO2lmKHQud29ya0lkJiZ0aGlzLndvcmtTaGFwZXMuZGVsZXRlKHQud29ya0lkKSxtJiZ0LndpbGxSZWZyZXNoJiYoYyYmcC5wdXNoKHtyZWN0Om0saXNDbGVhcjohMCxjbGVhckNhbnZhczpTdC5CZyxpc0Z1bGxXb3JrOiEwLHZpZXdJZDp0aGlzLnZpZXdJZH0pLHAucHVzaCh7cmVjdDptLGRyYXdDYW52YXM6U3QuQmcsaXNGdWxsV29yazohMCx2aWV3SWQ6dGhpcy52aWV3SWR9KSksdC53aWxsU3luY1NlcnZpY2UmJnkucHVzaCh7b3B0OnQub3B0LHRvb2xzVHlwZTp0LnRvb2xzVHlwZSx0eXBlOmx0LkZ1bGxXb3JrLHdvcmtJZDp0LndvcmtJZCxvcHM6dC5vcHMsdXBkYXRlTm9kZU9wdDp0LnVwZGF0ZU5vZGVPcHQsdW5kb1RpY2tlcklkOnQudW5kb1RpY2tlcklkLHZpZXdJZDp0aGlzLnZpZXdJZH0pLHAubGVuZ3RofHx5Lmxlbmd0aCl7Y29uc3QgTz17cmVuZGVyOnAsc3A6eX07YXdhaXQgdGhpcy5fcG9zdChPKX19fWFzeW5jIHJlbW92ZVdvcmsodCl7Y29uc3R7d29ya0lkOmV9PXQsbj1lPT1udWxsP3ZvaWQgMDplLnRvU3RyaW5nKCk7aWYobil7Y29uc3QgYT10aGlzLnJlbW92ZU5vZGUobik7YSYmYXdhaXQgdGhpcy5fcG9zdCh7cmVuZGVyOlt7cmVjdDphLGlzQ2xlYXI6ITAsaXNGdWxsV29yazohMCxjbGVhckNhbnZhczpTdC5CZyxkcmF3Q2FudmFzOlN0LkJnLHZpZXdJZDp0aGlzLnZpZXdJZH1dfSl9fXJlbW92ZU5vZGUodCl7dmFyIGE7dGhpcy53b3JrU2hhcGVzLmhhcyh0KSYmdGhpcy5jbGVhcldvcmtTaGFwZU5vZGVDYWNoZSh0KTtsZXQgZTtjb25zdCBuPXRoaXMudk5vZGVzLmdldCh0KTtyZXR1cm4gbiYmKHRoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKHQpLmNvbmNhdCgoKGE9dGhpcy5kcmF3TGF5ZXIpPT1udWxsP3ZvaWQgMDphLmdldEVsZW1lbnRzQnlOYW1lKHQpKXx8W10pLmZvckVhY2gocz0+e3MucmVtb3ZlKCl9KSxlPU90KGUsbi5yZWN0KSx0aGlzLnZOb2Rlcy5kZWxldGUodCkpLGV9YXN5bmMgY2hlY2tUZXh0QWN0aXZlKHQpe2NvbnN0e29wOmUsdmlld0lkOm4sZGF0YVR5cGU6YX09dDtpZihlIT1udWxsJiZlLmxlbmd0aCl7bGV0IHM7Zm9yKGNvbnN0IGkgb2YgdGhpcy52Tm9kZXMuY3VyTm9kZU1hcC52YWx1ZXMoKSl7Y29uc3R7cmVjdDpvLG5hbWU6Yyx0b29sc1R5cGU6bSxvcHQ6dX09aSxwPWVbMF0qdGhpcy5mdWxsTGF5ZXIud29ybGRTY2FsaW5nWzBdK3RoaXMuZnVsbExheWVyLndvcmxkUG9zaXRpb25bMF0seT1lWzFdKnRoaXMuZnVsbExheWVyLndvcmxkU2NhbGluZ1sxXSt0aGlzLmZ1bGxMYXllci53b3JsZFBvc2l0aW9uWzFdO2lmKG09PT1ndC5UZXh0JiZEaChbcCx5XSxvKSYmdS53b3JrU3RhdGU9PT1JdC5Eb25lKXtzPWM7YnJlYWt9fXMmJihhd2FpdCB0aGlzLmJsdXJTZWxlY3Rvcih7dmlld0lkOm4sbXNnVHlwZTpsdC5TZWxlY3QsZGF0YVR5cGU6YSxpc1N5bmM6ITB9KSxhd2FpdCB0aGlzLl9wb3N0KHtzcDpbe3R5cGU6bHQuR2V0VGV4dEFjdGl2ZSx0b29sc1R5cGU6Z3QuVGV4dCx3b3JrSWQ6c31dfSkpfX1hc3luYyBjb2xsb2N0RWZmZWN0U2VsZWN0V29yayh0KXtjb25zdCBlPXRoaXMud29ya1NoYXBlcy5nZXQod3Quc2VsZWN0b3JJZCkse3dvcmtJZDpuLG1zZ1R5cGU6YX09dDtpZihlJiZuJiZlLnNlbGVjdElkcyYmZS5zZWxlY3RJZHMuaW5jbHVkZXMobi50b1N0cmluZygpKSl7YT09PWx0LlJlbW92ZU5vZGU/ZS5zZWxlY3RJZHM9ZS5zZWxlY3RJZHMuZmlsdGVyKHM9PnMhPT1uLnRvU3RyaW5nKCkpOnRoaXMuZWZmZWN0U2VsZWN0Tm9kZURhdGEuYWRkKHQpLGF3YWl0IG5ldyBQcm9taXNlKHM9PntzZXRUaW1lb3V0KCgpPT57cyghMCl9LDApfSksYXdhaXQgdGhpcy5ydW5FZmZlY3RTZWxlY3RXb3JrKCEwKS50aGVuKCgpPT57dmFyIHM7KHM9dGhpcy5lZmZlY3RTZWxlY3ROb2RlRGF0YSk9PW51bGx8fHMuY2xlYXIoKX0pO3JldHVybn1yZXR1cm4gdH1hc3luYyB1cGRhdGVTZWxlY3Rvcih0KXt2YXIgbDtjb25zdCBlPXRoaXMud29ya1NoYXBlcy5nZXQod3Quc2VsZWN0b3JJZCk7aWYoISgobD1lPT1udWxsP3ZvaWQgMDplLnNlbGVjdElkcykhPW51bGwmJmwubGVuZ3RoKSlyZXR1cm47Y29uc3R7Y2FsbGJhY2s6biwuLi5hfT10LHt1cGRhdGVTZWxlY3Rvck9wdDpzLHdpbGxSZWZyZXNoU2VsZWN0b3I6aSx3aWxsU2VyaWFsaXplRGF0YTpvLGVtaXRFdmVudFR5cGU6YyxzY2VuZTptfT1hLHU9cy53b3JrU3RhdGUscD1hd2FpdChlPT1udWxsP3ZvaWQgMDplLnVwZGF0ZVNlbGVjdG9yKHt1cGRhdGVTZWxlY3Rvck9wdDpzLHNlbGVjdElkczplLnNlbGVjdElkcyx2Tm9kZXM6dGhpcy52Tm9kZXMsd2lsbFNlcmlhbGl6ZURhdGE6byx3b3JrZXI6dGhpcyxzY2VuZTptfSkpLHk9cD09bnVsbD92b2lkIDA6cC5zZWxlY3RSZWN0LE89bmV3IE1hcDtlLnNlbGVjdElkcy5mb3JFYWNoKGg9Pntjb25zdCBmPXRoaXMudk5vZGVzLmdldChoKTtpZihmKXtjb25zdHt0b29sc1R5cGU6ZyxvcDpNLG9wdDpBfT1mO08uc2V0KGgse29wdDpBLHRvb2xzVHlwZTpnLG9wczooTT09bnVsbD92b2lkIDA6TS5sZW5ndGgpJiZuZShNKXx8dm9pZCAwfSl9fSk7Y29uc3QgeD1bXSx2PVtdO2lmKGkpe3gucHVzaCh7aXNDbGVhckFsbDohMCxpc0Z1bGxXb3JrOiExLGNsZWFyQ2FudmFzOlN0LlNlbGVjdG9yLHZpZXdJZDp0aGlzLnZpZXdJZH0pO2NvbnN0IGg9e3JlY3Q6eSxpc0Z1bGxXb3JrOiExLGRyYXdDYW52YXM6U3QuU2VsZWN0b3Isdmlld0lkOnRoaXMudmlld0lkfTtzLnRyYW5zbGF0ZSYmYz09PUx0LlRyYW5zbGF0ZU5vZGUmJnU9PT1JdC5Eb2luZyYmKGgudHJhbnNsYXRlPXMudHJhbnNsYXRlKSx4LnB1c2goaCl9Y29uc3QgVD1uJiZuKHtyZXM6cCx3b3JrU2hhcGVOb2RlOmUscGFyYW06YSxwb3N0RGF0YTp7cmVuZGVyOngsc3A6dn0sbmV3U2VydmljZVN0b3JlOk99KXx8e3JlbmRlcjp4LHNwOnZ9OyhULnJlbmRlci5sZW5ndGh8fFQuc3AubGVuZ3RoKSYmdGhpcy5fcG9zdChUKX1hc3luYyBibHVyU2VsZWN0b3IodCl7dmFyIGE7Y29uc3QgZT10aGlzLndvcmtTaGFwZXMuZ2V0KHd0LnNlbGVjdG9ySWQpLG49ZT09bnVsbD92b2lkIDA6ZS5ibHVyU2VsZWN0b3IoKTtpZih0aGlzLmNsZWFyV29ya1NoYXBlTm9kZUNhY2hlKHd0LnNlbGVjdG9ySWQpLCgoYT10aGlzLmRyYXdMYXllcik9PW51bGw/dm9pZCAwOmEucGFyZW50KS5jaGlsZHJlbi5mb3JFYWNoKHM9PntzLm5hbWU9PT13dC5zZWxlY3RvcklkJiZzLnJlbW92ZSgpfSksbil7Y29uc3Qgcz1bXTtzLnB1c2goey4uLm4sdW5kb1RpY2tlcklkOnQ9PW51bGw/dm9pZCAwOnQudW5kb1RpY2tlcklkLGlzU3luYzp0PT1udWxsP3ZvaWQgMDp0LmlzU3luY30pLGF3YWl0IHRoaXMuX3Bvc3Qoe3JlbmRlcjoobj09bnVsbD92b2lkIDA6bi5yZWN0KSYmW3tyZWN0Om4ucmVjdCxkcmF3Q2FudmFzOlN0LkJnLGlzQ2xlYXI6ITAsY2xlYXJDYW52YXM6U3QuQmcsaXNGdWxsV29yazohMCx2aWV3SWQ6dGhpcy52aWV3SWR9XSxzcDpzfSl9fXJlUmVuZGVyU2VsZWN0b3IodD0hMSl7dmFyIG47Y29uc3QgZT10aGlzLndvcmtTaGFwZXMuZ2V0KHd0LnNlbGVjdG9ySWQpO2lmKGUpe2lmKGUmJiEoKG49ZS5zZWxlY3RJZHMpIT1udWxsJiZuLmxlbmd0aCkpcmV0dXJuIHRoaXMuYmx1clNlbGVjdG9yKCk7aWYodGhpcy5kcmF3TGF5ZXIpe2NvbnN0IGE9ZS5yZVJlbmRlclNlbGVjdG9yKCk7YSYmdGhpcy5fcG9zdCh7cmVuZGVyOlt7cmVjdDphLGlzQ2xlYXI6ITAsaXNGdWxsV29yazohMSxjbGVhckNhbnZhczpTdC5TZWxlY3RvcixkcmF3Q2FudmFzOlN0LlNlbGVjdG9yLHZpZXdJZDp0aGlzLnZpZXdJZH1dLHNwOlt7dHlwZTpsdC5TZWxlY3Qsc2VsZWN0SWRzOmUuc2VsZWN0SWRzLHNlbGVjdFJlY3Q6YSx3aWxsU3luY1NlcnZpY2U6dCx2aWV3SWQ6dGhpcy52aWV3SWQscG9pbnRzOmUuZ2V0Q2hpbGRyZW5Qb2ludHMoKSx0ZXh0T3B0OmUudGV4dE9wdH1dfSl9fX11cGRhdGVGdWxsU2VsZWN0V29yayh0KXt2YXIgYSxzLGksbyxjLG0sdSxwO2NvbnN0IGU9dGhpcy53b3JrU2hhcGVzLmdldCh3dC5zZWxlY3RvcklkKSx7c2VsZWN0SWRzOm59PXQ7aWYoIShuIT1udWxsJiZuLmxlbmd0aCkpe3RoaXMuYmx1clNlbGVjdG9yKHQpO3JldHVybn1pZighZSl7IXRoaXMuc2V0RnVsbFdvcmsodCkmJnQud29ya0lkJiYoKGE9dGhpcy50bXBXb3JrU2hhcGVOb2RlKT09bnVsbD92b2lkIDA6YS50b29sc1R5cGUpPT09Z3QuU2VsZWN0b3ImJnRoaXMuc2V0VG1wV29ya0lkKHQud29ya0lkKSx0aGlzLnVwZGF0ZUZ1bGxTZWxlY3RXb3JrKHQpO3JldHVybn1pZihlJiYobiE9bnVsbCYmbi5sZW5ndGgpKXtjb25zdHtiZ1JlY3Q6eSxzZWxlY3RSZWN0Ok99PWUudXBkYXRlU2VsZWN0SWRzKG4pLHg9e3JlbmRlcjpbXSxzcDpbXX07eSYmKChzPXgucmVuZGVyKT09bnVsbHx8cy5wdXNoKHtyZWN0Oll0KHkpLGlzQ2xlYXI6ITAsaXNGdWxsV29yazohMCxjbGVhckNhbnZhczpTdC5CZyxkcmF3Q2FudmFzOlN0LkJnLHZpZXdJZDp0aGlzLnZpZXdJZH0pKSwoaT14LnJlbmRlcik9PW51bGx8fGkucHVzaCh7cmVjdDpPLGlzQ2xlYXI6ITAsaXNGdWxsV29yazohMSxjbGVhckNhbnZhczpTdC5TZWxlY3RvcixkcmF3Q2FudmFzOlN0LlNlbGVjdG9yLHZpZXdJZDp0aGlzLnZpZXdJZH0pLChwPXguc3ApPT1udWxsfHxwLnB1c2goey4uLnQsc2VsZWN0b3JDb2xvcjooKG89dC5vcHQpPT1udWxsP3ZvaWQgMDpvLnN0cm9rZUNvbG9yKXx8ZS5zZWxlY3RvckNvbG9yLHN0cm9rZUNvbG9yOigoYz10Lm9wdCk9PW51bGw/dm9pZCAwOmMuc3Ryb2tlQ29sb3IpfHxlLnN0cm9rZUNvbG9yLGZpbGxDb2xvcjooKG09dC5vcHQpPT1udWxsP3ZvaWQgMDptLmZpbGxDb2xvcil8fGUuZmlsbENvbG9yLHRleHRPcHQ6KCh1PXQub3B0KT09bnVsbD92b2lkIDA6dS50ZXh0T3B0KXx8ZS50ZXh0T3B0LGNhblRleHRFZGl0OmUuY2FuVGV4dEVkaXQsY2FuUm90YXRlOmUuY2FuUm90YXRlLHNjYWxlVHlwZTplLnNjYWxlVHlwZSx0eXBlOmx0LlNlbGVjdCxzZWxlY3RSZWN0Ok8scG9pbnRzOmUuZ2V0Q2hpbGRyZW5Qb2ludHMoKSx3aWxsU3luY1NlcnZpY2U6KHQ9PW51bGw/dm9pZCAwOnQud2lsbFN5bmNTZXJ2aWNlKXx8ITEsb3B0Oih0PT1udWxsP3ZvaWQgMDp0LndpbGxTeW5jU2VydmljZSkmJmUuZ2V0V29ya09wdGlvbnMoKXx8dm9pZCAwLGNhbkxvY2s6ZS5jYW5Mb2NrLGlzTG9ja2VkOmUuaXNMb2NrZWQsdG9vbHNUeXBlczplLnRvb2xzVHlwZXMsc2hhcGVPcHQ6ZS5zaGFwZU9wdH0pLHRoaXMuX3Bvc3QoeCl9fWRlc3Ryb3koKXtzdXBlci5kZXN0cm95KCksdGhpcy5lZmZlY3RTZWxlY3ROb2RlRGF0YS5jbGVhcigpLHRoaXMuYmF0Y2hFcmFzZXJXb3Jrcy5jbGVhcigpLHRoaXMuYmF0Y2hFcmFzZXJSZW1vdmVOb2Rlcy5jbGVhcigpfWRyYXdQZW5jaWxDb21iaW5lKHQpe3ZhciBuLGE7Y29uc3QgZT0obj10aGlzLndvcmtTaGFwZXMuZ2V0KHQpKT09bnVsbD92b2lkIDA6bi5jb21iaW5lQ29uc3VtZSgpO2lmKGUpe2NvbnN0IHM9e3JlbmRlcjpbXSxkcmF3Q291bnQ6dGhpcy5kcmF3Q291bnR9OyhhPXMucmVuZGVyKT09bnVsbHx8YS5wdXNoKHtyZWN0OihlPT1udWxsP3ZvaWQgMDplLnJlY3QpJiZZdChlLnJlY3QpLGlzQ2xlYXI6ITAsZHJhd0NhbnZhczpTdC5GbG9hdCxjbGVhckNhbnZhczpTdC5GbG9hdCxpc0Z1bGxXb3JrOiExLHZpZXdJZDp0aGlzLnZpZXdJZH0pLHRoaXMuX3Bvc3Qocyl9fWRyYXdTZWxlY3Rvcih0LGUpe3ZhciBhLHM7Y29uc3Qgbj17cmVuZGVyOltdLHNwOlt0XX07dC50eXBlPT09bHQuU2VsZWN0JiYhZSYmKChhPW4ucmVuZGVyKT09bnVsbHx8YS5wdXNoKHtyZWN0OnQuc2VsZWN0UmVjdCxkcmF3Q2FudmFzOlN0LlNlbGVjdG9yLGlzQ2xlYXI6ITAsY2xlYXJDYW52YXM6U3QuU2VsZWN0b3IsaXNGdWxsV29yazohMSx2aWV3SWQ6dGhpcy52aWV3SWR9LHtyZWN0OnQucmVjdCYmWXQodC5yZWN0KSxpc0NsZWFyOiEwLGNsZWFyQ2FudmFzOlN0LkZsb2F0LGlzRnVsbFdvcms6ITEsdmlld0lkOnRoaXMudmlld0lkfSx7cmVjdDp0LnJlY3QmJll0KHQucmVjdCksZHJhd0NhbnZhczpTdC5CZyxpc0NsZWFyOiEwLGNsZWFyQ2FudmFzOlN0LkJnLGlzRnVsbFdvcms6ITAsdmlld0lkOnRoaXMudmlld0lkfSkpLGUmJigocz1uLnJlbmRlcik9PW51bGx8fHMucHVzaCh7cmVjdDp0LnJlY3QmJll0KHQucmVjdCksZHJhd0NhbnZhczpTdC5GbG9hdCxpc0NsZWFyOiEwLGNsZWFyQ2FudmFzOlN0LkZsb2F0LGlzRnVsbFdvcms6ITEsdmlld0lkOnRoaXMudmlld0lkfSx7cmVjdDp0LnJlY3QmJll0KHQucmVjdCksZHJhd0NhbnZhczpTdC5CZyxpc0NsZWFyOiEwLGNsZWFyQ2FudmFzOlN0LkJnLGlzRnVsbFdvcms6ITAsdmlld0lkOnRoaXMudmlld0lkfSkpLHRoaXMuX3Bvc3Qobil9YXN5bmMgZHJhd0VyYXNlcih0KXt2YXIgbixhO2NvbnN0IGU9W107aWYoKG49dC5uZXdXb3JrRGF0YXMpIT1udWxsJiZuLnNpemUpe2Zvcihjb25zdCBzIG9mIHQubmV3V29ya0RhdGFzLnZhbHVlcygpKXtjb25zdCBpPXMud29ya0lkLnRvU3RyaW5nKCk7dGhpcy5iYXRjaEVyYXNlcldvcmtzLmFkZChpKSxlLnB1c2goe3R5cGU6bHQuRnVsbFdvcmssd29ya0lkOmksb3BzOm5lKHMub3ApLG9wdDpzLm9wdCx0b29sc1R5cGU6cy50b29sc1R5cGUsdXBkYXRlTm9kZU9wdDp7dXNlQW5pbWF0aW9uOiExfX0pfWRlbGV0ZSB0Lm5ld1dvcmtEYXRhc30oYT10LnJlbW92ZUlkcyk9PW51bGx8fGEuZm9yRWFjaChzPT57dGhpcy5iYXRjaEVyYXNlclJlbW92ZU5vZGVzLmFkZChzKX0pLGUucHVzaCh0KSx0aGlzLl9wb3N0KHtzcDplfSksdGhpcy5iYXRjaEVyYXNlckNvbWJpbmUoKX1kcmF3UGVuY2lsKHQpe3RoaXMuX3Bvc3Qoe2RyYXdDb3VudDp0aGlzLmRyYXdDb3VudCxzcDoodD09bnVsbD92b2lkIDA6dC5vcCkmJlt0XX0pfWRyYXdQZW5jaWxGdWxsKHQsZSxuKXt2YXIgaTtsZXQgYT0obj09bnVsbD92b2lkIDA6bi53aWxsQ2xlYXIpfHwoZT09bnVsbD92b2lkIDA6ZS5pc09wYWNpdHkpfHwhMTshYSYmdC5yZWN0JiYoYT10aGlzLnZOb2Rlcy5oYXNSZWN0SW50ZXJzZWN0UmFuZ2UodC5yZWN0KSk7Y29uc3Qgcz17ZHJhd0NvdW50OjEvMCxyZW5kZXI6W3tyZWN0OnQucmVjdCxkcmF3Q2FudmFzOlN0LkJnLGlzQ2xlYXI6YSxjbGVhckNhbnZhczpTdC5CZyxpc0Z1bGxXb3JrOiEwLHZpZXdJZDp0aGlzLnZpZXdJZH1dLHNwOlt0XX07KGk9cy5yZW5kZXIpPT1udWxsfHxpLnB1c2goe2lzQ2xlYXJBbGw6ITAsY2xlYXJDYW52YXM6U3QuRmxvYXQsaXNGdWxsV29yazohMSx2aWV3SWQ6dGhpcy52aWV3SWR9KSx0aGlzLl9wb3N0KHMpfXVwZGF0ZUJhdGNoRXJhc2VyQ29tYmluZU5vZGUodCxlKXtjb25zdCBuPVtdO2xldCBhO2Zvcihjb25zdCBzIG9mIGUua2V5cygpKXRoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKHMpLmZvckVhY2goaT0+e2NvbnN0IG89aS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTthPU90KGEse3g6by54LWFlLlNhZmVCb3JkZXJQYWRkaW5nLHk6by55LWFlLlNhZmVCb3JkZXJQYWRkaW5nLHc6by53aWR0aCthZS5TYWZlQm9yZGVyUGFkZGluZyoyLGg6by5oZWlnaHQrYWUuU2FmZUJvcmRlclBhZGRpbmcqMn0pLGkucmVtb3ZlKCl9KTtyZXR1cm4gdC5mb3JFYWNoKHM9Pntjb25zdCBpPXRoaXMudk5vZGVzLmdldChzKTtpZihpKWlmKHRoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKHMpWzBdKWE9T3QoYSxpLnJlY3QpO2Vsc2V7Y29uc3QgYz10aGlzLnNldEZ1bGxXb3JrKHsuLi5pLHdvcmtJZDpzfSksbT1jJiZjLmNvbnN1bWVTZXJ2aWNlKHtvcDppLm9wLGlzRnVsbFdvcms6ITB9KTttJiYoaS5yZWN0PW0sYT1PdChhLG0pKX19KSxhJiZuLnB1c2goe3JlY3Q6YSxpc0NsZWFyOiEwLGlzRnVsbFdvcms6ITAsY2xlYXJDYW52YXM6U3QuQmcsZHJhd0NhbnZhczpTdC5CZyx2aWV3SWQ6dGhpcy52aWV3SWR9KSxufWFzeW5jIHJ1bkVmZmVjdFNlbGVjdFdvcmsodCl7dmFyIGUsbixhLHM7Zm9yKGNvbnN0IGkgb2YgdGhpcy5lZmZlY3RTZWxlY3ROb2RlRGF0YS52YWx1ZXMoKSl7Y29uc3Qgbz10aGlzLnNldEZ1bGxXb3JrKGkpO2lmKG8pe2lmKG8udG9vbHNUeXBlPT09Z3QuSW1hZ2UpYXdhaXQgby5jb25zdW1lU2VydmljZUFzeW5jKHtzY2VuZToobj0oZT10aGlzLmRyYXdMYXllcik9PW51bGw/dm9pZCAwOmUucGFyZW50KT09bnVsbD92b2lkIDA6bi5wYXJlbnQsaXNGdWxsV29yazohMSxyZXBsYWNlSWQ6KGE9by5nZXRXb3JrSWQoKSk9PW51bGw/dm9pZCAwOmEudG9TdHJpbmcoKX0pO2Vsc2V7Y29uc3QgYz1pLm9wcyYmVmUoaS5vcHMpO28uY29uc3VtZVNlcnZpY2Uoe29wOmMsaXNGdWxsV29yazohMSxyZXBsYWNlSWQ6KHM9by5nZXRXb3JrSWQoKSk9PW51bGw/dm9pZCAwOnMudG9TdHJpbmcoKX0pfWkhPW51bGwmJmkudXBkYXRlTm9kZU9wdCYmby51cGRhdGFPcHRTZXJ2aWNlKGkudXBkYXRlTm9kZU9wdCksaS53b3JrSWQmJnRoaXMud29ya1NoYXBlcy5kZWxldGUoaS53b3JrSWQpfX10aGlzLnJlUmVuZGVyU2VsZWN0b3IodCl9Y3Vyc29ySG92ZXIodCl7dmFyIGk7Y29uc3R7b3B0OmUsdG9vbHNUeXBlOm4scG9pbnQ6YX09dCxzPXRoaXMuc2V0RnVsbFdvcmsoe3dvcmtJZDpKZSx0b29sc1R5cGU6bixvcHQ6ZX0pO2lmKHMmJmEpe2NvbnN0IG89cy5jdXJzb3JIb3ZlcihhKSxjPXtyZW5kZXI6W119O28mJm8udHlwZT09PWx0LkN1cnNvckhvdmVyJiYoKGk9Yy5yZW5kZXIpPT1udWxsfHxpLnB1c2goe3JlY3Q6by5yZWN0JiZZdChvLnJlY3QpLGlzQ2xlYXI6ITAsY2xlYXJDYW52YXM6U3QuQmcsZHJhd0NhbnZhczpTdC5CZyxpc0Z1bGxXb3JrOiEwLHZpZXdJZDp0aGlzLnZpZXdJZH0pLHRoaXMuX3Bvc3QoYykpfX19Y2xhc3MgZWd7Y29uc3RydWN0b3Iocil7c3QodGhpcywidmlld0lkIik7c3QodGhpcywidk5vZGVzIik7c3QodGhpcywiZnVsbExheWVyIik7c3QodGhpcywiZHJhd0xheWVyIik7c3QodGhpcywic2VydmljZURyYXdMYXllciIpO3N0KHRoaXMsIndvcmtTaGFwZXMiLG5ldyBNYXApO3N0KHRoaXMsInNlbGVjdG9yV29ya1NoYXBlcyIsbmV3IE1hcCk7c3QodGhpcywiYW5pbWF0aW9uSWQiKTtzdCh0aGlzLCJ3aWxsUnVuRWZmZWN0U2VsZWN0b3JJZHMiLG5ldyBTZXQpO3N0KHRoaXMsInJ1bkVmZmVjdElkIik7c3QodGhpcywibm9BbmltYXRpb25SZWN0Iik7c3QodGhpcywicG9zdCIpO3RoaXMudmlld0lkPXIudmlld0lkLHRoaXMudk5vZGVzPXIudk5vZGVzLHRoaXMuZnVsbExheWVyPXIuZnVsbExheWVyLHRoaXMuZHJhd0xheWVyPXIuZHJhd0xheWVyLHRoaXMuc2VydmljZURyYXdMYXllcj1yLnNlcnZpY2VEcmF3TGF5ZXIsdGhpcy5wb3N0PXIucG9zdH1kZXN0cm95KCl7dGhpcy53b3JrU2hhcGVzLmNsZWFyKCksdGhpcy5zZWxlY3RvcldvcmtTaGFwZXMuY2xlYXIoKSx0aGlzLndpbGxSdW5FZmZlY3RTZWxlY3Rvcklkcy5jbGVhcigpfWNvbnN1bWVEcmF3KHIpe3RoaXMuYWN0aXZlV29ya1NoYXBlKHIpLHRoaXMucnVuQW5pbWF0aW9uKCl9Y29uc3VtZUZ1bGwocil7dGhpcy5hY3RpdmVXb3JrU2hhcGUociksdGhpcy5ydW5BbmltYXRpb24oKX1jbGVhckFsbFdvcmtTaGFwZXNDYWNoZSgpe3RoaXMud29ya1NoYXBlcy5mb3JFYWNoKChyLHQpPT57ci50b29sc1R5cGU9PT1ndC5MYXNlclBlbj9zZXRUaW1lb3V0KCgpPT57dGhpcy53b3JrU2hhcGVzLmRlbGV0ZSh0KX0sMmUzKTp0aGlzLndvcmtTaGFwZXMuZGVsZXRlKHQpfSl9cnVuU2VsZWN0V29yayhyKXt0aGlzLmFjdGl2ZVNlbGVjdG9yU2hhcGUocik7Y29uc3R7d29ya0lkOnR9PXIsZT10PT1udWxsP3ZvaWQgMDp0LnRvU3RyaW5nKCk7ZSYmdGhpcy53aWxsUnVuRWZmZWN0U2VsZWN0b3JJZHMuYWRkKGUpLHRoaXMucnVuRWZmZWN0KCl9c2V0Tm9kZUtleShyLHQsZSl7cmV0dXJuIHIudG9vbHNUeXBlPXQsci5ub2RlPXlyKHt0b29sc1R5cGU6dCx0b29sc09wdDplLHZOb2Rlczp0aGlzLnZOb2RlcyxmdWxsTGF5ZXI6dGhpcy5mdWxsTGF5ZXIsZHJhd0xheWVyOnRoaXMuc2VydmljZURyYXdMYXllcn0sdGhpcykscn1ydW5SZXZlcnNlU2VsZWN0V29yayhyKXtyLmZvckVhY2godD0+e3RoaXMuc2VsZWN0b3JXb3JrU2hhcGVzLmZvckVhY2goKGUsbik9Pnt2YXIgYTtpZigoYT1lLnNlbGVjdElkcykhPW51bGwmJmEubGVuZ3RoKXtjb25zdCBzPWUuc2VsZWN0SWRzLmluZGV4T2YodCk7cz4tMSYmKGUuc2VsZWN0SWRzLnNwbGljZShzLDEpLHRoaXMud2lsbFJ1bkVmZmVjdFNlbGVjdG9ySWRzLmFkZChuKSl9fSl9KSx0aGlzLndpbGxSdW5FZmZlY3RTZWxlY3Rvcklkcy5zaXplJiZ0aGlzLnJ1bkVmZmVjdCgpfWFzeW5jIHJlbW92ZVdvcmsocil7Y29uc3R7d29ya0lkOnR9PXIsZT10PT1udWxsP3ZvaWQgMDp0LnRvU3RyaW5nKCk7aWYoZSl7Y29uc3Qgbj10aGlzLndvcmtTaGFwZXMuZ2V0KGUpO2lmKG4pe3RoaXMud29ya1NoYXBlcy5kZWxldGUoZSksYXdhaXQgdGhpcy5yZW1vdmVOb2RlKGUscixuPT1udWxsP3ZvaWQgMDpuLnRvdGFsUmVjdCwhMSk7cmV0dXJufWF3YWl0IHRoaXMucmVtb3ZlTm9kZShlLHIpfX1yZW1vdmVTZWxlY3RXb3JrKHIpe2NvbnN0e3dvcmtJZDp0fT1yLGU9dD09bnVsbD92b2lkIDA6dC50b1N0cmluZygpO2UmJih0aGlzLmFjdGl2ZVNlbGVjdG9yU2hhcGUociksdGhpcy53aWxsUnVuRWZmZWN0U2VsZWN0b3JJZHMuYWRkKGUpKSx0aGlzLnJ1bkVmZmVjdCgpfWFzeW5jIHJlbW92ZU5vZGUocix0LGUsbj0hMCl7dmFyIGk7ci5pbmRleE9mKHd0LnNlbGVjdG9ySWQpPi0xJiZ0aGlzLnJlbW92ZVNlbGVjdFdvcmsodCk7bGV0IGE9ZTtjb25zdCBzPShpPXRoaXMudk5vZGVzLmdldChyKSk9PW51bGw/dm9pZCAwOmkucmVjdDtzJiYoYT1PdChzLGEpKSx0aGlzLmZ1bGxMYXllci5nZXRFbGVtZW50c0J5TmFtZShyKS5mb3JFYWNoKG89PntvLnJlbW92ZSgpfSksdGhpcy5kcmF3TGF5ZXIuZ2V0RWxlbWVudHNCeU5hbWUocikuZm9yRWFjaChvPT57by5yZW1vdmUoKX0pLHRoaXMuc2VydmljZURyYXdMYXllci5nZXRFbGVtZW50c0J5TmFtZShyKS5mb3JFYWNoKG89PntvLnJlbW92ZSgpfSksdGhpcy52Tm9kZXMuZGVsZXRlKHIpLGEmJmF3YWl0IHRoaXMucG9zdCh7cmVuZGVyOlt7cmVjdDpZdChhKSxpc0NsZWFyOiEwLGlzRnVsbFdvcms6bixjbGVhckNhbnZhczpuP1N0LkJnOlN0LlNlcnZpY2VGbG9hdCxkcmF3Q2FudmFzOm4/U3QuQmc6U3QuU2VydmljZUZsb2F0LHdvcmtlclR5cGU6bj92b2lkIDA6VHQuU2VydmljZSx2aWV3SWQ6dGhpcy52aWV3SWR9XX0pfWFjdGl2ZVdvcmtTaGFwZShyKXt2YXIgeSxPLHgsdjtjb25zdHt3b3JrSWQ6dCxvcHQ6ZSx0b29sc1R5cGU6bix0eXBlOmEsdXBkYXRlTm9kZU9wdDpzLG9wczppLG9wOm8sdXNlQW5pbWF0aW9uOmN9PXI7aWYoIXQpcmV0dXJuO2NvbnN0IG09dC50b1N0cmluZygpLHU9KHk9dGhpcy52Tm9kZXMuZ2V0KG0pKT09bnVsbD92b2lkIDA6eS5yZWN0O2lmKCEoKE89dGhpcy53b3JrU2hhcGVzKSE9bnVsbCYmTy5oYXMobSkpKXtsZXQgVD17dG9vbHNUeXBlOm4sYW5pbWF0aW9uV29ya0RhdGE6b3x8W10sYW5pbWF0aW9uSW5kZXg6MCx0eXBlOmEsdXBkYXRlTm9kZU9wdDpzLG9wczppLHVzZUFuaW1hdGlvbjp0eXBlb2YgYzwidSI/Yzp0eXBlb2Yocz09bnVsbD92b2lkIDA6cy51c2VBbmltYXRpb24pPCJ1Ij9zPT1udWxsP3ZvaWQgMDpzLnVzZUFuaW1hdGlvbjohMCxvbGRSZWN0OnUsaXNEaWZmOiExfTtuJiZlJiYoVD10aGlzLnNldE5vZGVLZXkoVCxuLGUpKSwoeD10aGlzLndvcmtTaGFwZXMpPT1udWxsfHx4LnNldChtLFQpfWNvbnN0IHA9KHY9dGhpcy53b3JrU2hhcGVzKT09bnVsbD92b2lkIDA6di5nZXQobSk7YSYmKHAudHlwZT1hKSxpJiYocC5hbmltYXRpb25Xb3JrRGF0YT1WZShpKSxwLm9wcz1pKSxzJiYocC51cGRhdGVOb2RlT3B0PXMpLG8mJihwLmlzRGlmZj10aGlzLmhhc0RpZmZEYXRhKHAuYW5pbWF0aW9uV29ya0RhdGF8fFtdLG8scC50b29sc1R5cGUpLHAuYW5pbWF0aW9uV29ya0RhdGE9bykscC5ub2RlJiZwLm5vZGUuZ2V0V29ya0lkKCkhPT1tJiZwLm5vZGUuc2V0V29ya0lkKG0pLHUmJihwLm9sZFJlY3Q9dSksbiYmZSYmKHAudG9vbHNUeXBlIT09biYmbiYmZSYmdGhpcy5zZXROb2RlS2V5KHAsbixlKSxwLm5vZGUmJnAubm9kZS5zZXRXb3JrT3B0aW9ucyhlKSl9aGFzRGlmZkRhdGEocix0LGUpe2NvbnN0IG49ci5sZW5ndGg7aWYodC5sZW5ndGg8bilyZXR1cm4hMDtzd2l0Y2goZSl7Y2FzZSBndC5QZW5jaWw6e2ZvcihsZXQgYT0wO2E8bjthKz0zKWlmKHRbYV0hPT1yW2FdfHx0W2ErMV0hPT1yW2ErMV0pcmV0dXJuITA7YnJlYWt9Y2FzZSBndC5MYXNlclBlbjp7Zm9yKGxldCBhPTA7YTxuO2ErPTIpaWYodFthXSE9PXJbYV18fHRbYSsxXSE9PXJbYSsxXSlyZXR1cm4hMDticmVha319cmV0dXJuITF9YXN5bmMgYW5pbWF0aW9uRHJhdygpe3ZhciBvLGMsbSx1LHAseSxPLHgsdixULGwsaCxmLGcsTSxBLEMsYixFLEwsRCxJLFIsQix6LEssUSxfLGosRzt0aGlzLmFuaW1hdGlvbklkPXZvaWQgMDtsZXQgcj0hMTtjb25zdCB0PW5ldyBNYXAsZT1bXSxuPVtdLGE9W10scz1bXTtmb3IoY29uc3RbWCxaXW9mIHRoaXMud29ya1NoYXBlcy5lbnRyaWVzKCkpc3dpdGNoKFoudG9vbHNUeXBlKXtjYXNlIGd0LkltYWdlOntjb25zdCB0dD1aLm9sZFJlY3Q7dHQmJmEucHVzaCh7cmVjdDp0dCxpc0NsZWFyOiEwLGNsZWFyQ2FudmFzOlN0LkJnLHZpZXdJZDp0aGlzLnZpZXdJZH0pO2NvbnN0IG50PWF3YWl0KChjPVoubm9kZSk9PW51bGw/dm9pZCAwOmMuY29uc3VtZVNlcnZpY2VBc3luYyh7aXNGdWxsV29yazohMCxzY2VuZToobz10aGlzLmZ1bGxMYXllci5wYXJlbnQpPT1udWxsP3ZvaWQgMDpvLnBhcmVudH0pKTt0aGlzLnNlbGVjdG9yV29ya1NoYXBlcy5mb3JFYWNoKChxLGR0KT0+e3ZhciB1dDsodXQ9cS5zZWxlY3RJZHMpIT1udWxsJiZ1dC5pbmNsdWRlcyhYKSYmKHRoaXMud2lsbFJ1bkVmZmVjdFNlbGVjdG9ySWRzLmFkZChkdCksdGhpcy5ub0FuaW1hdGlvblJlY3Q9T3QodGhpcy5ub0FuaW1hdGlvblJlY3QsdHQpLHRoaXMubm9BbmltYXRpb25SZWN0PU90KHRoaXMubm9BbmltYXRpb25SZWN0LG50KSx0aGlzLnJ1bkVmZmVjdCgpKX0pLHRoaXMud29ya1NoYXBlcy5kZWxldGUoWCksZS5wdXNoKHtyZWN0Om50LGRyYXdDYW52YXM6U3QuQmcsaXNGdWxsV29yazohMCx2aWV3SWQ6dGhpcy52aWV3SWR9KTticmVha31jYXNlIGd0LlRleHQ6e2lmKFoubm9kZSl7Y29uc3QgdHQ9Wi5vbGRSZWN0LG50PShtPVoubm9kZSk9PW51bGw/dm9pZCAwOm0uY29uc3VtZVNlcnZpY2Uoe29wOlouYW5pbWF0aW9uV29ya0RhdGF8fFtdLGlzRnVsbFdvcms6ITB9KTt0aGlzLnNlbGVjdG9yV29ya1NoYXBlcy5mb3JFYWNoKChxLGR0KT0+e3ZhciB1dDsodXQ9cS5zZWxlY3RJZHMpIT1udWxsJiZ1dC5pbmNsdWRlcyhYKSYmKHRoaXMud2lsbFJ1bkVmZmVjdFNlbGVjdG9ySWRzLmFkZChkdCksdGhpcy5ub0FuaW1hdGlvblJlY3Q9T3QodGhpcy5ub0FuaW1hdGlvblJlY3QsdHQpLHRoaXMubm9BbmltYXRpb25SZWN0PU90KHRoaXMubm9BbmltYXRpb25SZWN0LG50KSx0aGlzLnJ1bkVmZmVjdCgpKX0pLCh1PVoubm9kZSk9PW51bGx8fHUuY2xlYXJUbXBQb2ludHMoKSx0aGlzLndvcmtTaGFwZXMuZGVsZXRlKFgpfWJyZWFrfWNhc2UgZ3QuQXJyb3c6Y2FzZSBndC5TdHJhaWdodDpjYXNlIGd0LlJlY3RhbmdsZTpjYXNlIGd0LkVsbGlwc2U6Y2FzZSBndC5TdGFyOmNhc2UgZ3QuUG9seWdvbjpjYXNlIGd0LlNwZWVjaEJhbGxvb246e2NvbnN0IHR0PSEhWi5vcHM7aWYoKHA9Wi5hbmltYXRpb25Xb3JrRGF0YSkhPW51bGwmJnAubGVuZ3RoKXtjb25zdCBudD1aLm9sZFJlY3QscT1aLm5vZGUub2xkUmVjdDtudCYmKGEucHVzaCh7cmVjdDpudCxpc0NsZWFyOiEwLGNsZWFyQ2FudmFzOlN0LkJnLHZpZXdJZDp0aGlzLnZpZXdJZH0pLGUucHVzaCh7cmVjdDpudCxkcmF3Q2FudmFzOlN0LkJnLHZpZXdJZDp0aGlzLnZpZXdJZH0pKSxxJiZzLnB1c2goe3JlY3Q6cSxpc0NsZWFyOiEwLGNsZWFyQ2FudmFzOlN0LlNlcnZpY2VGbG9hdCx2aWV3SWQ6dGhpcy52aWV3SWR9KTtjb25zdCBkdD0oeT1aLm5vZGUpPT1udWxsP3ZvaWQgMDp5LmNvbnN1bWVTZXJ2aWNlKHtvcDpaLmFuaW1hdGlvbldvcmtEYXRhLGlzRnVsbFdvcms6dHR9KTt0LnNldChYLHt3b3JrU3RhdGU6bnQ/Wi5vcHM/SXQuRG9uZTpJdC5Eb2luZzpJdC5TdGFydCxvcDpaLmFuaW1hdGlvbldvcmtEYXRhLmZpbHRlcigodXQsVyk9PntpZihXJTMhPT0yKXJldHVybiEwfSkuc2xpY2UoLTIpfSksdHQ/KHRoaXMuc2VsZWN0b3JXb3JrU2hhcGVzLmZvckVhY2goKHV0LFcpPT57dmFyIEY7KEY9dXQuc2VsZWN0SWRzKSE9bnVsbCYmRi5pbmNsdWRlcyhYKSYmKHRoaXMud2lsbFJ1bkVmZmVjdFNlbGVjdG9ySWRzLmFkZChXKSx0aGlzLm5vQW5pbWF0aW9uUmVjdD1PdCh0aGlzLm5vQW5pbWF0aW9uUmVjdCxudCksdGhpcy5ub0FuaW1hdGlvblJlY3Q9T3QodGhpcy5ub0FuaW1hdGlvblJlY3QscSksdGhpcy5ub0FuaW1hdGlvblJlY3Q9T3QodGhpcy5ub0FuaW1hdGlvblJlY3QsZHQpLHRoaXMucnVuRWZmZWN0KCkpfSksKE89Wi5ub2RlKT09bnVsbHx8Ty5jbGVhclRtcFBvaW50cygpLHRoaXMud29ya1NoYXBlcy5kZWxldGUoWCksZS5wdXNoKHtyZWN0OmR0LGRyYXdDYW52YXM6U3QuQmcsaXNGdWxsV29yazp0dCx2aWV3SWQ6dGhpcy52aWV3SWR9KSx0LnNldChYLHt3b3JrU3RhdGU6SXQuRG9uZSxvcDpaLmFuaW1hdGlvbldvcmtEYXRhLmZpbHRlcigodXQsVyk9PntpZihXJTMhPT0yKXJldHVybiEwfSkuc2xpY2UoLTIpfSkpOm4ucHVzaCh7cmVjdDpkdCxkcmF3Q2FudmFzOlN0LlNlcnZpY2VGbG9hdCx3b3JrZXJUeXBlOnR0P3ZvaWQgMDpUdC5TZXJ2aWNlLGlzRnVsbFdvcms6dHQsdmlld0lkOnRoaXMudmlld0lkfSksWi5hbmltYXRpb25Xb3JrRGF0YS5sZW5ndGg9MH1icmVha31jYXNlIGd0LlBlbmNpbDp7aWYoIVoudXNlQW5pbWF0aW9uJiZaLm9wcyl7bGV0IHR0PSh4PVoubm9kZSk9PW51bGw/dm9pZCAwOnguY29uc3VtZVNlcnZpY2Uoe29wOlouYW5pbWF0aW9uV29ya0RhdGF8fFtdLGlzRnVsbFdvcms6ITAscmVwbGFjZUlkOlh9KTtjb25zdCBudD0odj1aLm5vZGUpPT1udWxsP3ZvaWQgMDp2LnVwZGF0YU9wdFNlcnZpY2UoWi51cGRhdGVOb2RlT3B0KTt0dD1PdCh0dCxudCksYS5wdXNoKHtyZWN0Ok90KFoub2xkUmVjdCx0dCksY2xlYXJDYW52YXM6U3QuQmcsdmlld0lkOnRoaXMudmlld0lkfSksZS5wdXNoKHtyZWN0Ok90KFoub2xkUmVjdCx0dCksZHJhd0NhbnZhczpTdC5CZyx2aWV3SWQ6dGhpcy52aWV3SWR9KSx0aGlzLnNlbGVjdG9yV29ya1NoYXBlcy5mb3JFYWNoKChxLGR0KT0+e3ZhciB1dDsodXQ9cS5zZWxlY3RJZHMpIT1udWxsJiZ1dC5pbmNsdWRlcyhYKSYmKHRoaXMud2lsbFJ1bkVmZmVjdFNlbGVjdG9ySWRzLmFkZChkdCksdGhpcy5ub0FuaW1hdGlvblJlY3Q9T3QodGhpcy5ub0FuaW1hdGlvblJlY3QsdHQpLHRoaXMucnVuRWZmZWN0KCkpfSksKFQ9Wi5ub2RlKT09bnVsbHx8VC5jbGVhclRtcFBvaW50cygpLHRoaXMud29ya1NoYXBlcy5kZWxldGUoWCl9ZWxzZSBpZihaLnVzZUFuaW1hdGlvbil7Y29uc3QgbnQ9dGhpcy5jb21wdXROZXh0QW5pbWF0aW9uSW5kZXgoWiwzKSxxPVouaXNEaWZmPzA6TWF0aC5tYXgoMCwoWi5hbmltYXRpb25JbmRleHx8MCktMyksZHQ9KFouYW5pbWF0aW9uV29ya0RhdGF8fFtdKS5zbGljZShxLG50KTtpZihaLmlzRGVsKVouaXNEZWwmJigoYj1aLm5vZGUpPT1udWxsfHxiLmNsZWFyVG1wUG9pbnRzKCksdGhpcy53b3JrU2hhcGVzLmRlbGV0ZShYKSk7ZWxzZXtpZigoWi5hbmltYXRpb25JbmRleHx8MCk8bnR8fFouaXNEaWZmKXtjb25zdCB1dD0oaD1aLm5vZGUpPT1udWxsP3ZvaWQgMDpoLmNvbnN1bWVTZXJ2aWNlKHtvcDpkdCxpc0Z1bGxXb3JrOiExLHJlcGxhY2VJZDoobD1aLm5vZGUuZ2V0V29ya0lkKCkpPT1udWxsP3ZvaWQgMDpsLnRvU3RyaW5nKCl9KTtpZihuLnB1c2goe3JlY3Q6dXQsZHJhd0NhbnZhczpTdC5TZXJ2aWNlRmxvYXQsdmlld0lkOnRoaXMudmlld0lkfSksWi5hbmltYXRpb25JbmRleD1udCxaLmlzRGlmZiYmKFouaXNEaWZmPSExKSxkdC5sZW5ndGgpe2NvbnN0IFc9ZHQuZmlsdGVyKChGLFYpPT57aWYoViUzIT09MilyZXR1cm4hMH0pLnNsaWNlKC0yKTt0LnNldChYLHt3b3JrU3RhdGU6cT09PTA/SXQuU3RhcnQ6bnQ9PT0oKGY9Wi5hbmltYXRpb25Xb3JrRGF0YSk9PW51bGw/dm9pZCAwOmYubGVuZ3RoKT9JdC5Eb25lOkl0LkRvaW5nLG9wOld9KX19ZWxzZSBpZihaLm9wcyl7Y29uc3QgdXQ9KE09Wi5ub2RlKT09bnVsbD92b2lkIDA6TS5jb25zdW1lU2VydmljZSh7b3A6Wi5hbmltYXRpb25Xb3JrRGF0YXx8W10saXNGdWxsV29yazohMCxyZXBsYWNlSWQ6KGc9Wi5ub2RlLmdldFdvcmtJZCgpKT09bnVsbD92b2lkIDA6Zy50b1N0cmluZygpfSk7Wi5pc0RlbD0hMCxzLnB1c2goe3JlY3Q6dXQsY2xlYXJDYW52YXM6U3QuU2VydmljZUZsb2F0LHZpZXdJZDp0aGlzLnZpZXdJZH0pLChBPVoubm9kZSkhPW51bGwmJkEuZ2V0V29ya09wdGlvbnMoKS5pc09wYWNpdHkmJmEucHVzaCh7cmVjdDp1dCxjbGVhckNhbnZhczpTdC5CZyx2aWV3SWQ6dGhpcy52aWV3SWR9KSxlLnB1c2goe3JlY3Q6dXQsZHJhd0NhbnZhczpTdC5CZyx2aWV3SWQ6dGhpcy52aWV3SWR9KSx0aGlzLnZOb2Rlcy5zZXRJbmZvKFgse29wOlouYW5pbWF0aW9uV29ya0RhdGEsb3B0OihDPVoubm9kZSk9PW51bGw/dm9pZCAwOkMuZ2V0V29ya09wdGlvbnMoKSx0b29sc1R5cGU6Wi50b29sc1R5cGUscmVjdDp1dH0pLHQuc2V0KFgse3dvcmtTdGF0ZTpJdC5Eb25lLG9wOmR0LmZpbHRlcigoVyxGKT0+e2lmKEYlMyE9PTIpcmV0dXJuITB9KS5zbGljZSgtMil9KX1yPSEwfWJyZWFrfWJyZWFrfWNhc2UgZ3QuTGFzZXJQZW46e2NvbnN0IG50PXRoaXMuY29tcHV0TmV4dEFuaW1hdGlvbkluZGV4KFosMikscT1NYXRoLm1heCgwLChaLmFuaW1hdGlvbkluZGV4fHwwKS0yKSxkdD0oWi5hbmltYXRpb25Xb3JrRGF0YXx8W10pLnNsaWNlKHEsbnQpO2lmKFouaXNEZWwpe2lmKFouaXNEZWwpe2NvbnN0IHV0PShCPVoubm9kZSk9PW51bGw/dm9pZCAwOkIuY29uc3VtZVNlcnZpY2Uoe29wOltdLGlzRnVsbFdvcms6ITF9KTtaLnRvdGFsUmVjdD1PdChaLnRvdGFsUmVjdCx1dCkscy5wdXNoKHtyZWN0OloudG90YWxSZWN0LGNsZWFyQ2FudmFzOlN0LlNlcnZpY2VGbG9hdCx2aWV3SWQ6dGhpcy52aWV3SWR9KSxuLnB1c2goe3JlY3Q6Wi50b3RhbFJlY3QsZHJhd0NhbnZhczpTdC5TZXJ2aWNlRmxvYXQsdmlld0lkOnRoaXMudmlld0lkfSksKHo9Wi5ub2RlKT09bnVsbHx8ei5jbGVhclRtcFBvaW50cygpLHRoaXMud29ya1NoYXBlcy5kZWxldGUoWCl9fWVsc2V7aWYoKFouYW5pbWF0aW9uSW5kZXh8fDApPG50KXtjb25zdCB1dD0oTD1aLm5vZGUpPT1udWxsP3ZvaWQgMDpMLmNvbnN1bWVTZXJ2aWNlKHtvcDpkdCxpc0Z1bGxXb3JrOiExLHJlcGxhY2VJZDooRT1aLm5vZGUuZ2V0V29ya0lkKCkpPT1udWxsP3ZvaWQgMDpFLnRvU3RyaW5nKCl9KTtaLnRvdGFsUmVjdD1PdChaLnRvdGFsUmVjdCx1dCksWi50aW1lciYmKGNsZWFyVGltZW91dChaLnRpbWVyKSxaLnRpbWVyPXZvaWQgMCksWi5hbmltYXRpb25JbmRleD1udCxkdC5sZW5ndGgmJnQuc2V0KFgse3dvcmtTdGF0ZTpxPT09MD9JdC5TdGFydDpudD09PSgoRD1aLmFuaW1hdGlvbldvcmtEYXRhKT09bnVsbD92b2lkIDA6RC5sZW5ndGgpP0l0LkRvbmU6SXQuRG9pbmcsb3A6ZHQuc2xpY2UoLTIpfSl9ZWxzZXtaLnRpbWVyfHwoWi50aW1lcj1zZXRUaW1lb3V0KCgpPT57Wi50aW1lcj12b2lkIDAsWi5pc0RlbD0hMCx0aGlzLnJ1bkFuaW1hdGlvbigpfSwoKEk9Wi5ub2RlKT09bnVsbD92b2lkIDA6SS5nZXRXb3JrT3B0aW9ucygpKS5kdXJhdGlvbioxZTMrMTAwKSx0LnNldChYLHt3b3JrU3RhdGU6SXQuRG9uZSxvcDpbXX0pKTtjb25zdCB1dD0oUj1aLm5vZGUpPT1udWxsP3ZvaWQgMDpSLmNvbnN1bWVTZXJ2aWNlKHtvcDpbXSxpc0Z1bGxXb3JrOiExfSk7Wi50b3RhbFJlY3Q9T3QoWi50b3RhbFJlY3QsdXQpfXMucHVzaCh7cmVjdDpaLnRvdGFsUmVjdCxjbGVhckNhbnZhczpTdC5TZXJ2aWNlRmxvYXQsdmlld0lkOnRoaXMudmlld0lkfSksbi5wdXNoKHtyZWN0OloudG90YWxSZWN0LGRyYXdDYW52YXM6U3QuU2VydmljZUZsb2F0LHZpZXdJZDp0aGlzLnZpZXdJZH0pLHI9ITB9YnJlYWt9fXImJnRoaXMucnVuQW5pbWF0aW9uKCk7Y29uc3QgaT17cmVuZGVyOltdfTtpZihhLmxlbmd0aCl7Y29uc3QgWD1hLnJlZHVjZSgoWix0dCk9Pih0dC5yZWN0JiZ0dC5jbGVhckNhbnZhcz09PVN0LkJnJiYoWi5yZWN0PU90KFoucmVjdCx0dC5yZWN0KSksWikse2lzQ2xlYXI6ITAsY2xlYXJDYW52YXM6U3QuQmcsdmlld0lkOnRoaXMudmlld0lkfSk7WC5yZWN0JiYoWC5yZWN0PVgucmVjdCYmWXQoWC5yZWN0KSwoSz1pLnJlbmRlcik9PW51bGx8fEsucHVzaChYKSl9aWYocy5sZW5ndGgpe2NvbnN0IFg9cy5yZWR1Y2UoKFosdHQpPT4odHQucmVjdCYmdHQuY2xlYXJDYW52YXM9PT1TdC5TZXJ2aWNlRmxvYXQmJihaLnJlY3Q9T3QoWi5yZWN0LHR0LnJlY3QpKSxaKSx7aXNDbGVhcjohMCxjbGVhckNhbnZhczpTdC5TZXJ2aWNlRmxvYXQsd29ya2VyVHlwZTpUdC5TZXJ2aWNlLHZpZXdJZDp0aGlzLnZpZXdJZH0pO1gucmVjdCYmKFgucmVjdD1YLnJlY3QmJll0KFgucmVjdCksKFE9aS5yZW5kZXIpPT1udWxsfHxRLnB1c2goWCkpfWlmKGUubGVuZ3RoKXtjb25zdCBYPWUucmVkdWNlKChaLHR0KT0+KHR0LnJlY3QmJnR0LmRyYXdDYW52YXM9PT1TdC5CZyYmKFoucmVjdD1PdChaLnJlY3QsdHQucmVjdCkpLFopLHtpc0Z1bGxXb3JrOiEwLGRyYXdDYW52YXM6U3QuQmcsdmlld0lkOnRoaXMudmlld0lkfSk7WC5yZWN0JiYoWC5yZWN0PVgucmVjdCYmWXQoWC5yZWN0KSwoXz1pLnJlbmRlcik9PW51bGx8fF8ucHVzaChYKSl9aWYobi5sZW5ndGgpe2NvbnN0IFg9bi5yZWR1Y2UoKFosdHQpPT4odHQucmVjdCYmdHQuZHJhd0NhbnZhcz09PVN0LlNlcnZpY2VGbG9hdCYmKFoucmVjdD1PdChaLnJlY3QsdHQucmVjdCkpLFopLHtpc0Z1bGxXb3JrOiExLGRyYXdDYW52YXM6U3QuU2VydmljZUZsb2F0LHdvcmtlclR5cGU6VHQuU2VydmljZSx2aWV3SWQ6dGhpcy52aWV3SWR9KTtYLnJlY3QmJihYLnJlY3Q9WC5yZWN0JiZZdChYLnJlY3QpLChqPWkucmVuZGVyKT09bnVsbHx8ai5wdXNoKFgpKX10LnNpemUmJihpLnNwPVtdLHQuZm9yRWFjaCgoWCxaKT0+e3ZhciB0dDsodHQ9aS5zcCk9PW51bGx8fHR0LnB1c2goe3R5cGU6bHQuQ3Vyc29yLHVpZDpaLnNwbGl0KFZoKVswXSxvcDpYLm9wLHdvcmtTdGF0ZTpYLndvcmtTdGF0ZSx2aWV3SWQ6dGhpcy52aWV3SWR9KX0pKSwoRz1pLnJlbmRlcikhPW51bGwmJkcubGVuZ3RoJiZ0aGlzLnBvc3QoaSl9cnVuQW5pbWF0aW9uKCl7dGhpcy5hbmltYXRpb25JZHx8KHRoaXMuYW5pbWF0aW9uSWQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0aW9uRHJhdy5iaW5kKHRoaXMpKSl9Y29tcHV0TmV4dEFuaW1hdGlvbkluZGV4KHIsdCl7dmFyIG47Y29uc3QgZT1NYXRoLmZsb29yKChyLmFuaW1hdGlvbldvcmtEYXRhfHxbXSkuc2xpY2Uoci5hbmltYXRpb25JbmRleCkubGVuZ3RoKjMyL3QvKCgobj1yLm5vZGUpPT1udWxsP3ZvaWQgMDpuLnN5bmNVbml0VGltZSl8fDFlMykpKnQ7cmV0dXJuIE1hdGgubWluKChyLmFuaW1hdGlvbkluZGV4fHwwKSsoZXx8dCksKHIuYW5pbWF0aW9uV29ya0RhdGF8fFtdKS5sZW5ndGgpfXJ1bkVmZmVjdCgpe3RoaXMucnVuRWZmZWN0SWR8fCh0aGlzLnJ1bkVmZmVjdElkPXNldFRpbWVvdXQodGhpcy5lZmZlY3RSdW5TZWxlY3Rvci5iaW5kKHRoaXMpLDApKX1lZmZlY3RSdW5TZWxlY3Rvcigpe3RoaXMucnVuRWZmZWN0SWQ9dm9pZCAwO2xldCByPXRoaXMubm9BbmltYXRpb25SZWN0O3RoaXMud2lsbFJ1bkVmZmVjdFNlbGVjdG9ySWRzLmZvckVhY2godD0+e3ZhciBhLHM7Y29uc3QgZT10aGlzLnNlbGVjdG9yV29ya1NoYXBlcy5nZXQodCksbj1lJiZlLnNlbGVjdElkcyYmKChhPWUubm9kZSk9PW51bGw/dm9pZCAwOmEuc2VsZWN0U2VydmljZU5vZGUodCxlLCEwKSk7cj1PdChyLG4pLChzPWU9PW51bGw/dm9pZCAwOmUuc2VsZWN0SWRzKSE9bnVsbCYmcy5sZW5ndGh8fHRoaXMuc2VsZWN0b3JXb3JrU2hhcGVzLmRlbGV0ZSh0KX0pLHImJnRoaXMucG9zdCh7cmVuZGVyOlt7cmVjdDpZdChyKSxkcmF3Q2FudmFzOlN0LkJnLGlzQ2xlYXI6ITAsY2xlYXJDYW52YXM6U3QuQmcsaXNGdWxsV29yazohMCx2aWV3SWQ6dGhpcy52aWV3SWR9XX0pLHRoaXMud2lsbFJ1bkVmZmVjdFNlbGVjdG9ySWRzLmNsZWFyKCksdGhpcy5ub0FuaW1hdGlvblJlY3Q9dm9pZCAwfWFjdGl2ZVNlbGVjdG9yU2hhcGUocil7dmFyIGMsbSx1O2NvbnN0e3dvcmtJZDp0LG9wdDplLHRvb2xzVHlwZTpuLHR5cGU6YSxzZWxlY3RJZHM6c309cjtpZighdClyZXR1cm47Y29uc3QgaT10LnRvU3RyaW5nKCk7aWYoISgoYz10aGlzLnNlbGVjdG9yV29ya1NoYXBlcykhPW51bGwmJmMuaGFzKGkpKSl7bGV0IHA9e3Rvb2xzVHlwZTpuLHNlbGVjdElkczpzLHR5cGU6YSxvcHQ6ZX07biYmZSYmKHA9dGhpcy5zZXROb2RlS2V5KHAsbixlKSksKG09dGhpcy5zZWxlY3RvcldvcmtTaGFwZXMpPT1udWxsfHxtLnNldChpLHApfWNvbnN0IG89KHU9dGhpcy5zZWxlY3RvcldvcmtTaGFwZXMpPT1udWxsP3ZvaWQgMDp1LmdldChpKTthJiYoby50eXBlPWEpLG8ubm9kZSYmby5ub2RlLmdldFdvcmtJZCgpIT09aSYmby5ub2RlLnNldFdvcmtJZChpKSxvLnNlbGVjdElkcz1zfHxbXX19Y2xhc3MgcmcgZXh0ZW5kcyBabntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KTtzdCh0aGlzLCJhbmltYXRpb25Xb3JrUmVjdHMiLG5ldyBNYXApO3N0KHRoaXMsImNvbWJpbmVEcmF3VGltZXIiKTtzdCh0aGlzLCJhbmltYXRpb25JZCIpO3N0KHRoaXMsImNsb3NlQW5pbWF0aW9uVGltZSIsMTEwMCk7c3QodGhpcywicnVuTGFzZXJQZW5TdGVwIiwwKX1hc3luYyBydW5GdWxsV29yayh0LGUpe3ZhciBzLGk7Y29uc3Qgbj10aGlzLnNldEZ1bGxXb3JrKHQpLGE9dC5vcHMmJlZlKHQub3BzKTtpZihuKXtsZXQgbztuLnRvb2xzVHlwZT09PWd0LkltYWdlP289YXdhaXQgbi5jb25zdW1lU2VydmljZUFzeW5jKHtpc0Z1bGxXb3JrOiEwLHNjZW5lOihzPXRoaXMuZnVsbExheWVyLnBhcmVudCk9PW51bGw/dm9pZCAwOnMucGFyZW50fSk6bz1uLmNvbnN1bWVTZXJ2aWNlKHtvcDphLGlzRnVsbFdvcms6ITAscmVwbGFjZUlkOihpPW4uZ2V0V29ya0lkKCkpPT1udWxsP3ZvaWQgMDppLnRvU3RyaW5nKCksaXNEcmF3TGFiZWw6ZX0pO2NvbnN0IGM9KHQ9PW51bGw/dm9pZCAwOnQudXBkYXRlTm9kZU9wdCkmJm4udXBkYXRhT3B0U2VydmljZSh0LnVwZGF0ZU5vZGVPcHQpO3JldHVybiB0LndvcmtJZCYmdGhpcy53b3JrU2hhcGVzLmRlbGV0ZSh0LndvcmtJZCksY3x8b319cnVuU2VsZWN0V29yayh0KXt2YXIgbjtjb25zdCBlPXRoaXMuc2V0RnVsbFdvcmsodCk7ZSYmKChuPXQuc2VsZWN0SWRzKSE9bnVsbCYmbi5sZW5ndGgpJiZ0LndvcmtJZCYmZS5zZWxlY3RTZXJ2aWNlTm9kZSh0LndvcmtJZC50b1N0cmluZygpLHtzZWxlY3RJZHM6dC5zZWxlY3RJZHN9LCExKX1jb25zdW1lRHJhdyh0KXt2YXIgYTtjb25zdHtvcDplLHdvcmtJZDpufT10O2lmKGUhPW51bGwmJmUubGVuZ3RoJiZuKXtjb25zdCBzPXRoaXMud29ya1NoYXBlcy5nZXQobik7aWYoIXMpcmV0dXJuO2NvbnN0IGk9cy50b29sc1R5cGUsbz1zLmNvbnN1bWUoe2RhdGE6dCxpc0Z1bGxXb3JrOiExLGlzQ2xlYXJBbGw6ITAsaXNTdWJXb3JrZXI6ITB9KTtzd2l0Y2goaSl7Y2FzZSBndC5MYXNlclBlbjpvIT1udWxsJiZvLnJlY3QmJigoYT10aGlzLmFuaW1hdGlvbldvcmtSZWN0cyk9PW51bGx8fGEuc2V0KG4se3JlczpvLGNhbkRlbDohMSxpc1JlY3Q6ITB9KSksdGhpcy5ydW5MYXNlclBlbkFuaW1hdGlvbigpO2JyZWFrO2Nhc2UgZ3QuQXJyb3c6Y2FzZSBndC5TdHJhaWdodDpjYXNlIGd0LkVsbGlwc2U6Y2FzZSBndC5SZWN0YW5nbGU6Y2FzZSBndC5TdGFyOmNhc2UgZ3QuUG9seWdvbjpjYXNlIGd0LlNwZWVjaEJhbGxvb246byYmKHRoaXMuZHJhd0NvdW50KyssdGhpcy5kcmF3QXJyb3cobykpO2JyZWFrO2Nhc2UgZ3QuUGVuY2lsOm8mJih0aGlzLmRyYXdDb3VudCsrLHRoaXMuZHJhd1BlbmNpbChvKSk7YnJlYWt9fX1jb25zdW1lRHJhd0FsbCh0KXt2YXIgbixhO2NvbnN0e3dvcmtJZDplfT10O2lmKGUpe2NvbnN0IHM9dGhpcy53b3JrU2hhcGVzLmdldChlKTtpZighcylyZXR1cm47c3dpdGNoKHMudG9vbHNUeXBlKXtjYXNlIGd0Lkxhc2VyUGVuOmlmKHRoaXMuYW5pbWF0aW9uSWQpe2NvbnN0IG89cy5jb25zdW1lQWxsKHtkYXRhOnR9KTtvIT1udWxsJiZvLm9wJiZvIT1udWxsJiZvLnJlY3QmJigobj10aGlzLmFuaW1hdGlvbldvcmtSZWN0cyk9PW51bGx8fG4uc2V0KGUse3JlczpvLGNhbkRlbDohMSxpc1JlY3Q6ITB9KSx0aGlzLnJ1bkxhc2VyUGVuQW5pbWF0aW9uKG8pKTtjb25zdCBjPShhPXMuZ2V0V29ya09wdGlvbnMoKSk9PW51bGw/dm9pZCAwOmEuZHVyYXRpb247dGhpcy5jbG9zZUFuaW1hdGlvblRpbWU9Yz9jKjFlMysxMDA6dGhpcy5jbG9zZUFuaW1hdGlvblRpbWUsc2V0VGltZW91dCgoKT0+e3ZhciB1O3RoaXMuZnVsbExheWVyLmdldEVsZW1lbnRzQnlOYW1lKGUudG9TdHJpbmcoKSkubWFwKHA9PnAucmVtb3ZlKCkpLHRoaXMuY2xlYXJXb3JrU2hhcGVOb2RlQ2FjaGUoZSk7Y29uc3QgbT0odT10aGlzLmFuaW1hdGlvbldvcmtSZWN0cyk9PW51bGw/dm9pZCAwOnUuZ2V0KGUpO20mJihtLmNhbkRlbD0hMCksc2V0VGltZW91dCgoKT0+e3RoaXMuX3Bvc3Qoe3NwOlt7cmVtb3ZlSWRzOltlLnRvU3RyaW5nKCldLHR5cGU6bHQuUmVtb3ZlTm9kZX1dfSl9LHMuZ2V0V29ya09wdGlvbnMoKS5zeW5jVW5pdFRpbWV8fHRoaXMuY2xvc2VBbmltYXRpb25UaW1lKX0sdGhpcy5jbG9zZUFuaW1hdGlvblRpbWUpfWJyZWFrO2Nhc2UgZ3QuQXJyb3c6Y2FzZSBndC5TdHJhaWdodDpjYXNlIGd0LkVsbGlwc2U6Y2FzZSBndC5QZW5jaWw6Y2FzZSBndC5SZWN0YW5nbGU6Y2FzZSBndC5TdGFyOmNhc2UgZ3QuUG9seWdvbjpjYXNlIGd0LlNwZWVjaEJhbGxvb246dGhpcy5kcmF3Q291bnQ9MCx0aGlzLmZ1bGxMYXllci5yZW1vdmVBbGxDaGlsZHJlbigpLHRoaXMuY2xlYXJXb3JrU2hhcGVOb2RlQ2FjaGUoZSk7YnJlYWt9fX11cGRhdGVMYWJlbHModCxlKXt0LmNoaWxkcmVuLmZvckVhY2gobj0+e2lmKG4udGFnTmFtZT09PSJMQUJFTCIpe2NvbnN0IGE9bi5uYW1lLHt3aWR0aDpzfT1uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFtpXT10LndvcmxkU2NhbGluZyx7dW5kZXJsaW5lOm8sbGluZVRocm91Z2g6Y309ZS5vcHQ7byYmdC5nZXRFbGVtZW50c0J5TmFtZShgJHthfV91bmRlcmxpbmVgKVswXS5hdHRyKHtwb2ludHM6WzAsMCxzL2ksMF19KSxjJiZ0LmdldEVsZW1lbnRzQnlOYW1lKGAke2F9X2xpbmVUaHJvdWdoYClbMF0uYXR0cih7cG9pbnRzOlswLDAscy9pLDBdfSl9fSl9cnVuTGFzZXJQZW5BbmltYXRpb24odCl7dGhpcy5hbmltYXRpb25JZHx8KHRoaXMuYW5pbWF0aW9uSWQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dmFyIGEscztpZih0aGlzLmFuaW1hdGlvbklkPXZvaWQgMCx0aGlzLnJ1bkxhc2VyUGVuU3RlcCsrLHRoaXMucnVuTGFzZXJQZW5TdGVwPjEpe3RoaXMucnVuTGFzZXJQZW5TdGVwPTAsdGhpcy5ydW5MYXNlclBlbkFuaW1hdGlvbih0KTtyZXR1cm59bGV0IGU7Y29uc3Qgbj1bXTsoYT10aGlzLmFuaW1hdGlvbldvcmtSZWN0cyk9PW51bGx8fGEuZm9yRWFjaCgoaSxvLGMpPT57aS5pc1JlY3QmJihlPU90KGUsaS5yZXMucmVjdCkpLGkucmVzLndvcmtJZCYmbi5wdXNoKGkucmVzKSx0aGlzLmZ1bGxMYXllci5nZXRFbGVtZW50c0J5TmFtZShvLnRvU3RyaW5nKCkpLmxlbmd0aD9pLmlzUmVjdD0hMDppLmlzUmVjdD0hMSxpLmNhbkRlbCYmYy5kZWxldGUobyl9KSwocz10aGlzLmFuaW1hdGlvbldvcmtSZWN0cykhPW51bGwmJnMuc2l6ZSYmdGhpcy5ydW5MYXNlclBlbkFuaW1hdGlvbigpLGUmJih0JiZuLnB1c2godCksdGhpcy5fcG9zdCh7cmVuZGVyOlt7cmVjdDpZdChlKSxkcmF3Q2FudmFzOlN0LkZsb2F0LGlzQ2xlYXI6ITAsY2xlYXJDYW52YXM6U3QuRmxvYXQsaXNGdWxsV29yazohMSx2aWV3SWQ6dGhpcy52aWV3SWR9XSxzcDpufSkpfSkpfWRyYXdQZW5jaWwodCl7dGhpcy5fcG9zdCh7ZHJhd0NvdW50OnRoaXMuZHJhd0NvdW50LHJlbmRlcjpbe3JlY3Q6dD09bnVsbD92b2lkIDA6dC5yZWN0LGRyYXdDYW52YXM6U3QuRmxvYXQsaXNDbGVhcjohMSxpc0Z1bGxXb3JrOiExLHZpZXdJZDp0aGlzLnZpZXdJZH1dLHNwOih0PT1udWxsP3ZvaWQgMDp0Lm9wKSYmW3RdfSl9ZHJhd0Fycm93KHQpe3RoaXMuX3Bvc3Qoe2RyYXdDb3VudDp0aGlzLmRyYXdDb3VudCxyZW5kZXI6W3tyZWN0Oih0PT1udWxsP3ZvaWQgMDp0LnJlY3QpJiZZdCh0LnJlY3QpLGRyYXdDYW52YXM6U3QuRmxvYXQsaXNDbGVhcjohMCxjbGVhckNhbnZhczpTdC5GbG9hdCxpc0Z1bGxXb3JrOiExLHZpZXdJZDp0aGlzLnZpZXdJZH1dfSl9fXZhciBxbj0oZD0+KGQuRnVsbD0iZnVsbCIsZC5TdWI9InN1YiIsZCkpKHFufHx7fSk7Y2xhc3Mgbmd7Y29uc3RydWN0b3Iocix0KXtzdCh0aGlzLCJfc2VsZiIpO3N0KHRoaXMsInR5cGUiKTtzdCh0aGlzLCJ3b3JrVGhyZWFkTWFwIixuZXcgTWFwKTt0aGlzLl9zZWxmPXIsdGhpcy50eXBlPXQsdGhpcy5yZWdpc3RlcigpfWluaXQocil7Y29uc3R7dmlld0lkOnQsZHByOmUsb2Zmc2NyZWVuQ2FudmFzT3B0Om4sbGF5ZXJPcHQ6YSxpc1NhZmFyaTpzfT1yO2lmKCFlfHwhbnx8IWEpcmV0dXJuO2xldCBpO3RoaXMudHlwZT09PSJmdWxsIiYmKGk9bmV3IGlnKHQse2RwcjplLG9mZnNjcmVlbkNhbnZhc09wdDpuLGxheWVyT3B0OmF9LHRoaXMucG9zdC5iaW5kKHRoaXMpKSksdGhpcy50eXBlPT09InN1YiImJihpPW5ldyBzZyh0LHtkcHI6ZSxvZmZzY3JlZW5DYW52YXNPcHQ6bixsYXllck9wdDphfSx0aGlzLnBvc3QuYmluZCh0aGlzKSkpLGkmJnMmJmkuc2V0SXNTYWZhcmkocyksaSYmci5jYW1lcmFPcHQmJmkuc2V0Q2FtZXJhT3B0KHIuY2FtZXJhT3B0KSxpJiZ0aGlzLndvcmtUaHJlYWRNYXAuc2V0KHQsaSl9cmVnaXN0ZXIoKXtvbm1lc3NhZ2U9cj0+e2NvbnN0IHQ9ci5kYXRhO2lmKHQpZm9yKGNvbnN0IGUgb2YgdC52YWx1ZXMoKSl7Y29uc3R7bXNnVHlwZTpuLHZpZXdJZDphLHRhc2tzcXVldWU6cyxtYWluVGFza3NxdWV1ZUNvdW50Oml9PWU7aWYobj09PWx0LkluaXQpe3RoaXMuaW5pdChlKTtjb250aW51ZX1pZihuPT09bHQuVGFza3NRdWV1ZSYmKHMhPW51bGwmJnMuc2l6ZSkmJmkpe3RoaXMud29ya1RocmVhZE1hcC5mb3JFYWNoKChjLG0pPT57Y29uc3QgdT1zLmdldChtKTt1JiZjLm9uKHUpLHRoaXMucG9zdCh7d29ya2VyVGFza3NxdWV1ZUNvdW50Oml9KX0pO2NvbnRpbnVlfWlmKGE9PT1YaCl7dGhpcy53b3JrVGhyZWFkTWFwLmZvckVhY2goYz0+e2Mub24oZSksbj09PWx0LkRlc3Ryb3kmJnRoaXMud29ya1RocmVhZE1hcC5kZWxldGUoYSl9KTtjb250aW51ZX1jb25zdCBvPXRoaXMud29ya1RocmVhZE1hcC5nZXQoYSk7byYmKG8ub24oZSksbj09PWx0LkRlc3Ryb3kmJnRoaXMud29ya1RocmVhZE1hcC5kZWxldGUoYSkpfX19cG9zdChyLHQpe3Q/dGhpcy5fc2VsZi5wb3N0TWVzc2FnZShyLHQpOnRoaXMuX3NlbGYucG9zdE1lc3NhZ2Uocil9fWNsYXNzIGlnIGV4dGVuZHMgWG57Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKHQsZSk7c3QodGhpcywic2VydmljZURyYXdMYXllciIpO3N0KHRoaXMsImRyYXdMYXllciIpO3N0KHRoaXMsInNuYXBzaG90RnVsbExheWVyIik7c3QodGhpcywibWV0aG9kQnVpbGRlciIpO3N0KHRoaXMsImxvY2FsV29yayIpO3N0KHRoaXMsInNlcnZpY2VXb3JrIik7c3QodGhpcywiX3Bvc3QiKTt0aGlzLl9wb3N0PW4sdGhpcy5zZXJ2aWNlRHJhd0xheWVyPXRoaXMuY3JlYXRlTGF5ZXIoInNlcnZpY2VEcmF3TGF5ZXIiLHRoaXMuc2NlbmUsey4uLmUubGF5ZXJPcHQsYnVmZmVyU2l6ZToxZTN9KSx0aGlzLmRyYXdMYXllcj10aGlzLmNyZWF0ZUxheWVyKCJkcmF3TGF5ZXIiLHRoaXMuc2NlbmUsey4uLmUubGF5ZXJPcHQsYnVmZmVyU2l6ZToxZTN9KTtjb25zdCBhPXt0aHJlYWQ6dGhpcyx2aWV3SWQ6dGhpcy52aWV3SWQsdk5vZGVzOnRoaXMudk5vZGVzLGZ1bGxMYXllcjp0aGlzLmZ1bGxMYXllcixkcmF3TGF5ZXI6dGhpcy5kcmF3TGF5ZXIscG9zdDp0aGlzLnBvc3QuYmluZCh0aGlzKX07dGhpcy5sb2NhbFdvcms9bmV3IHRnKGEpLHRoaXMuc2VydmljZVdvcms9bmV3IGVnKHsuLi5hLHNlcnZpY2VEcmF3TGF5ZXI6dGhpcy5zZXJ2aWNlRHJhd0xheWVyfSksdGhpcy5tZXRob2RCdWlsZGVyPW5ldyB2MChbTHQuQ29weU5vZGUsTHQuU2V0Q29sb3JOb2RlLEx0LkRlbGV0ZU5vZGUsTHQuUm90YXRlTm9kZSxMdC5TY2FsZU5vZGUsTHQuVHJhbnNsYXRlTm9kZSxMdC5aSW5kZXhBY3RpdmUsTHQuWkluZGV4Tm9kZSxMdC5TZXRGb250U3R5bGUsTHQuU2V0UG9pbnQsTHQuU2V0TG9jayxMdC5TZXRTaGFwZU9wdF0pLnJlZ2lzdGVyRm9yV29ya2VyKHRoaXMubG9jYWxXb3JrLHRoaXMuc2VydmljZVdvcmssdGhpcy5zY2VuZSksdGhpcy52Tm9kZXMuaW5pdCh0aGlzLmZ1bGxMYXllcix0aGlzLmRyYXdMYXllcil9YXN5bmMgcG9zdCh0LGUpe3ZhciBvLGMsbTtjb25zdCBuPXQucmVuZGVyLGE9W107bGV0IHM9ZTtpZihuIT1udWxsJiZuLmxlbmd0aCl7Zm9yKGNvbnN0IHUgb2Ygbil7aWYodS5pc0NsZWFyQWxsJiYodS5yZWN0PXRoaXMuZ2V0U2NlbmVSZWN0KCksdS5pc0NsZWFyPSEwLGRlbGV0ZSB1LmlzQ2xlYXJBbGwpLHUuZHJhd0NhbnZhcyl7Y29uc3QgcD10aGlzLmdldExheWVyKHUuaXNGdWxsV29yayx1LndvcmtlclR5cGUpO2lmKChwPT1udWxsP3ZvaWQgMDpwLnBhcmVudCkucmVuZGVyKCksdS5pc0RyYXdBbGwpe2NvbnN0IHk9dGhpcy5nZXRTY2VuZVJlY3QoKSx7cmVjdFJhbmdlOk99PXRoaXMudk5vZGVzLmdldFJlY3RJbnRlcnNlY3RSYW5nZSh5LCExKTt1LnJlY3Q9TyxkZWxldGUgdS5pc0RyYXdBbGx9fWlmKHUucmVjdCl7dS5jbGVhckNhbnZhcz09PXUuZHJhd0NhbnZhcyYmdS5kcmF3Q2FudmFzPT09U3QuQmcmJih1LnJlY3Q9dGhpcy5jaGVja1JpZ2h0UmVjdEJvdW5kaW5nQm94KHUucmVjdCkpO2NvbnN0IHA9dS5kcmF3Q2FudmFzPT09U3QuU2VsZWN0b3ImJnUucmVjdDtpZih1LmRyYXdDYW52YXMmJih1LnJlY3Q9dGhpcy5zYWZhcmlGaXhSZWN0KFp0KHUucmVjdCkpKSwhdS5yZWN0KWNvbnRpbnVlO2lmKHUuZHJhd0NhbnZhcz09PVN0LlNlbGVjdG9yKXtjb25zdCB5PShvPXQuc3ApPT1udWxsP3ZvaWQgMDpvLmZpbmQoTz0+Ty50eXBlPT09bHQuU2VsZWN0KTt5JiYoeS5yZWN0PXUucmVjdCkscCYmKHUub2Zmc2V0PXt4OnUucmVjdC54LXAueCx5OnUucmVjdC55LXAueX0pfWlmKHUuZHJhd0NhbnZhcyl7Y29uc3QgeT1hd2FpdCB0aGlzLmdldFJlY3RJbWFnZUJpdG1hcCh1LnJlY3QsISF1LmlzRnVsbFdvcmssdS53b3JrZXJUeXBlKTt1LmltYWdlQml0bWFwPXksc3x8KHM9W10pLHMucHVzaCh5KX1hLnB1c2godSl9fXQucmVuZGVyPWF9Y29uc3QgaT0oYz10LnNwKT09bnVsbD92b2lkIDA6Yy5maWx0ZXIodT0+dS50eXBlIT09bHQuTm9uZXx8T2JqZWN0LmtleXModSkuZmlsdGVyKHA9PnA9PT0idHlwZSIpLmxlbmd0aCk7aWYoaSE9bnVsbCYmaS5sZW5ndGgmJih0LnNwPWkubWFwKHU9Pih7Li4udSx2aWV3SWQ6dGhpcy52aWV3SWR9KSkpLCh0LmRyYXdDb3VudHx8dC53b3JrZXJUYXNrc3F1ZXVlQ291bnR8fChtPXQuc3ApIT1udWxsJiZtLmxlbmd0aHx8YSE9bnVsbCYmYS5sZW5ndGgpJiYodGhpcy5fcG9zdCh0LHMpLHMhPW51bGwmJnMubGVuZ3RoKSlmb3IoY29uc3QgdSBvZiBzKXUgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCYmdS5jbG9zZSgpfW9uKHQpe2lmKHRoaXMubWV0aG9kQnVpbGRlci5jb25zdW1lRm9yV29ya2VyKHQpKXJldHVybjtjb25zdHttc2dUeXBlOmUsZGF0YVR5cGU6bix3b3JrSWQ6YX09dDtzd2l0Y2goZSl7Y2FzZSBsdC5VcGRhdGVDYW1lcmE6dGhpcy51cGRhdGVDYW1lcmEodCk7YnJlYWs7Y2FzZSBsdC5TZWxlY3Q6bj09PVR0LlNlcnZpY2UmJihhPT09d3Quc2VsZWN0b3JJZD90aGlzLmxvY2FsV29yay51cGRhdGVGdWxsU2VsZWN0V29yayh0KTp0aGlzLnNlcnZpY2VXb3JrLnJ1blNlbGVjdFdvcmsodCkpO2JyZWFrO2Nhc2UgbHQuVXBkYXRlTm9kZTpjYXNlIGx0LkZ1bGxXb3JrOnRoaXMuY29uc3VtZUZ1bGwobix0KTticmVhaztjYXNlIGx0LlJlbW92ZU5vZGU6dGhpcy5yZW1vdmVOb2RlKHQpO2JyZWFrO2Nhc2UgbHQuR2V0VGV4dEFjdGl2ZTp0aGlzLmNoZWNrVGV4dEFjdGl2ZSh0KTticmVhaztjYXNlIGx0LkN1cnNvckhvdmVyOnRoaXMuY3Vyc29ySG92ZXIodCl9c3VwZXIub24odCl9YXN5bmMgcmVtb3ZlTm9kZSh0KXtjb25zdHtkYXRhVHlwZTplLHdvcmtJZDpufT10O2lmKG49PT13dC5zZWxlY3RvcklkKXthd2FpdCB0aGlzLmxvY2FsV29yay5ibHVyU2VsZWN0b3IodCk7cmV0dXJufWU9PT1UdC5Mb2NhbCYmKGF3YWl0IHRoaXMubG9jYWxXb3JrLnJlbW92ZVdvcmsodCksYXdhaXQgdGhpcy5sb2NhbFdvcmsuY29sbG9jdEVmZmVjdFNlbGVjdFdvcmsodCkpLGU9PT1UdC5TZXJ2aWNlJiYoYXdhaXQgdGhpcy5zZXJ2aWNlV29yay5yZW1vdmVXb3JrKHQpLHRoaXMubG9jYWxXb3JrLmNvbGxvY3RFZmZlY3RTZWxlY3RXb3JrKHQpKX1jaGVja1RleHRBY3RpdmUodCl7Y29uc3R7ZGF0YVR5cGU6ZX09dDtlPT09VHQuTG9jYWwmJnRoaXMubG9jYWxXb3JrLmNoZWNrVGV4dEFjdGl2ZSh0KX1jbGVhckFsbCgpe3RoaXMudk5vZGVzLmNsZWFyKCksc3VwZXIuY2xlYXJBbGwoKSx0aGlzLnNlcnZpY2VEcmF3TGF5ZXImJih0aGlzLnNlcnZpY2VEcmF3TGF5ZXIucGFyZW50LmNoaWxkcmVuLmZvckVhY2godD0+e3QubmFtZSE9PSJ2aWV3cG9ydCImJnQucmVtb3ZlKCl9KSx0aGlzLnNlcnZpY2VEcmF3TGF5ZXIucmVtb3ZlQWxsQ2hpbGRyZW4oKSksdGhpcy5wb3N0KHtyZW5kZXI6W3tpc0NsZWFyQWxsOiEwLGNsZWFyQ2FudmFzOlN0LkJnLGlzRnVsbFdvcms6ITAsdmlld0lkOnRoaXMudmlld0lkfSx7aXNDbGVhckFsbDohMCxjbGVhckNhbnZhczpTdC5GbG9hdCxpc0Z1bGxXb3JrOiExLHZpZXdJZDp0aGlzLnZpZXdJZH0se2lzQ2xlYXJBbGw6ITAsY2xlYXJDYW52YXM6U3QuU2VydmljZUZsb2F0LGlzRnVsbFdvcms6ITEsdmlld0lkOnRoaXMudmlld0lkfV0sc3A6W3t0eXBlOmx0LkNsZWFyfV19KX11cGRhdGVMYXllcih0KXtjb25zdHt3aWR0aDplLGhlaWdodDpufT10O3N1cGVyLnVwZGF0ZUxheWVyKHQpLHRoaXMuc2VydmljZURyYXdMYXllciYmKHRoaXMuc2VydmljZURyYXdMYXllci5wYXJlbnQuc2V0QXR0cmlidXRlKCJ3aWR0aCIsZSksdGhpcy5zZXJ2aWNlRHJhd0xheWVyLnBhcmVudC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsbiksdGhpcy5zZXJ2aWNlRHJhd0xheWVyLnNldEF0dHJpYnV0ZSgic2l6ZSIsW2Usbl0pLHRoaXMuc2VydmljZURyYXdMYXllci5zZXRBdHRyaWJ1dGUoInBvcyIsW2UqLjUsbiouNV0pKX1zZXRDYW1lcmFPcHQodCl7dGhpcy5jYW1lcmFPcHQ9dDtjb25zdHtzY2FsZTplLGNlbnRlclg6bixjZW50ZXJZOmEsd2lkdGg6cyxoZWlnaHQ6aX09dDsocyE9PXRoaXMuc2NlbmUud2lkdGh8fGkhPT10aGlzLnNjZW5lLmhlaWdodCkmJnRoaXMudXBkYXRlU2NlbmUoe3dpZHRoOnMsaGVpZ2h0Oml9KSx0aGlzLmZ1bGxMYXllciYmKHRoaXMuZnVsbExheWVyLnNldEF0dHJpYnV0ZSgic2NhbGUiLFtlLGVdKSx0aGlzLmZ1bGxMYXllci5zZXRBdHRyaWJ1dGUoInRyYW5zbGF0ZSIsWy1uLC1hXSkpLHRoaXMuZHJhd0xheWVyJiYodGhpcy5kcmF3TGF5ZXIuc2V0QXR0cmlidXRlKCJzY2FsZSIsW2UsZV0pLHRoaXMuZHJhd0xheWVyLnNldEF0dHJpYnV0ZSgidHJhbnNsYXRlIixbLW4sLWFdKSksdGhpcy5zZXJ2aWNlRHJhd0xheWVyJiYodGhpcy5zZXJ2aWNlRHJhd0xheWVyLnNldEF0dHJpYnV0ZSgic2NhbGUiLFtlLGVdKSx0aGlzLnNlcnZpY2VEcmF3TGF5ZXIuc2V0QXR0cmlidXRlKCJ0cmFuc2xhdGUiLFstbiwtYV0pKX1nZXRMYXllcih0LGUpe3JldHVybiB0P3RoaXMuZnVsbExheWVyOmUmJmU9PT1UdC5TZXJ2aWNlP3RoaXMuc2VydmljZURyYXdMYXllcjp0aGlzLmRyYXdMYXllcn1nZXRPZmZzY3JlZW4odCxlKXtyZXR1cm4gdGhpcy5nZXRMYXllcih0LGUpLnBhcmVudC5jYW52YXN9YXN5bmMgY29uc3VtZUZ1bGwodCxlKXtjb25zdCBuPWF3YWl0IHRoaXMubG9jYWxXb3JrLmNvbGxvY3RFZmZlY3RTZWxlY3RXb3JrKGUpO24mJnQ9PT1UdC5Mb2NhbCYmYXdhaXQgdGhpcy5sb2NhbFdvcmsuY29uc3VtZUZ1bGwobix0aGlzLnNjZW5lKSxuJiZ0PT09VHQuU2VydmljZSYmdGhpcy5zZXJ2aWNlV29yay5jb25zdW1lRnVsbChuKX1jb25zdW1lRHJhdyh0LGUpe3Q9PT1UdC5Mb2NhbCYmdGhpcy5sb2NhbFdvcmsuY29uc3VtZURyYXcoZSx0aGlzLnNlcnZpY2VXb3JrKSx0PT09VHQuU2VydmljZSYmdGhpcy5zZXJ2aWNlV29yay5jb25zdW1lRHJhdyhlKX1jb25zdW1lRHJhd0FsbCh0LGUpe3Q9PT1UdC5Mb2NhbCYmdGhpcy5sb2NhbFdvcmsuY29uc3VtZURyYXdBbGwoZSx0aGlzLnNlcnZpY2VXb3JrKX11cGRhdGVDYW1lcmEodCl7dmFyIGE7Y29uc3QgZT1bXSx7Y2FtZXJhT3B0Om59PXQ7aWYobiYmIXZyKHRoaXMuY2FtZXJhT3B0LG4pKXtjb25zdCBzPXRoaXMubG9jYWxXb3JrLmdldFdvcmtTaGFwZShKZSk7aWYocyYmKChhPXMuc2VsZWN0SWRzKSE9bnVsbCYmYS5sZW5ndGgpJiZzLmN1cnNvckJsdXIoKSx0aGlzLnNldENhbWVyYU9wdChuKSx0aGlzLmxvY2FsV29yay53b3JrU2hhcGVzLmZvckVhY2goKGksbyk9PnsoaS50b29sc1R5cGU9PT1ndC5QZW5jaWx8fGkudG9vbHNUeXBlPT09Z3QuQXJyb3d8fGkudG9vbHNUeXBlPT09Z3QuU3RyYWlnaHR8fGkudG9vbHNUeXBlPT09Z3QuRWxsaXBzZXx8aS50b29sc1R5cGU9PT1ndC5SZWN0YW5nbGV8fGkudG9vbHNUeXBlPT09Z3QuU3Rhcnx8aS50b29sc1R5cGU9PT1ndC5Qb2x5Z29ufHxpLnRvb2xzVHlwZT09PWd0LlNwZWVjaEJhbGxvb258fGkudG9vbHNUeXBlPT09Z3QuVGV4dCkmJnRoaXMubG9jYWxXb3JrLndvcmtTaGFwZVN0YXRlLnNldChvLHt3aWxsQ2xlYXI6ITB9KX0pLHRoaXMudk5vZGVzLmN1ck5vZGVNYXAuc2l6ZSYmKHRoaXMudk5vZGVzLnVwZGF0ZU5vZGVzUmVjdCgpLHRoaXMubG9jYWxXb3JrLnJlUmVuZGVyU2VsZWN0b3IoKSx0aGlzLnNlcnZpY2VXb3JrLnNlbGVjdG9yV29ya1NoYXBlcy5zaXplKSlmb3IoY29uc3RbaSxvXW9mIHRoaXMuc2VydmljZVdvcmsuc2VsZWN0b3JXb3JrU2hhcGVzLmVudHJpZXMoKSl0aGlzLnNlcnZpY2VXb3JrLnJ1blNlbGVjdFdvcmsoe3dvcmtJZDppLHNlbGVjdElkczpvLnNlbGVjdElkcyxtc2dUeXBlOmx0LlNlbGVjdCxkYXRhVHlwZTpUdC5TZXJ2aWNlLHZpZXdJZDp0aGlzLnZpZXdJZH0pO3RoaXMudk5vZGVzLmhhc1JlbmRlck5vZGVzKCkmJmUucHVzaCh7aXNDbGVhckFsbDohMCxjbGVhckNhbnZhczpTdC5CZyxpc0Z1bGxXb3JrOiEwLHZpZXdJZDp0aGlzLnZpZXdJZH0se2lzQ2xlYXJBbGw6ITAsY2xlYXJDYW52YXM6U3QuRmxvYXQsaXNGdWxsV29yazohMSx2aWV3SWQ6dGhpcy52aWV3SWR9LHtpc0NsZWFyQWxsOiEwLGNsZWFyQ2FudmFzOlN0LlNlcnZpY2VGbG9hdCxpc0Z1bGxXb3JrOiExLHZpZXdJZDp0aGlzLnZpZXdJZH0se2lzRHJhd0FsbDohMCxkcmF3Q2FudmFzOlN0LkJnLGlzRnVsbFdvcms6ITAsdmlld0lkOnRoaXMudmlld0lkfSksZS5sZW5ndGgmJnRoaXMucG9zdCh7cmVuZGVyOmV9KX19Z2V0UmVjdEltYWdlQml0bWFwKHQsZSxuKXtjb25zdCBhPXQueCp0aGlzLmRwcixzPXQueSp0aGlzLmRwcixpPXQudyp0aGlzLmRwcixvPXQuaCp0aGlzLmRwcjtyZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAodGhpcy5nZXRPZmZzY3JlZW4oZSxuKSxhLHMsaSxvKX1zYWZhcmlGaXhSZWN0KHQpe2lmKHQueD50aGlzLnNjZW5lLndpZHRofHx0Lnk+dGhpcy5zY2VuZS5oZWlnaHR8fHQudyt0Lng8PTB8fHQuaCt0Lnk8PTB8fHQudzw9MHx8dC5oPD0wKXJldHVybjtjb25zdCBlPXt4Ok1hdGguZmxvb3IoTWF0aC5tYXgoMCx0LngpKSx5Ok1hdGguZmxvb3IoTWF0aC5tYXgoMCx0LnkpKSx3Ok1hdGguZmxvb3IoTWF0aC5taW4odGhpcy5zY2VuZS53aWR0aCx0LncpKSxoOk1hdGguZmxvb3IoTWF0aC5taW4odGhpcy5zY2VuZS5oZWlnaHQsdC5oKSl9O2lmKHQueCt0Lnc8dGhpcy5zY2VuZS53aWR0aCYmKGUudz1NYXRoLmZsb29yKHQueCt0LnctZS54KSksdC55K3QuaDx0aGlzLnNjZW5lLmhlaWdodCYmKGUuaD1NYXRoLmZsb29yKHQueSt0LmgtZS55KSksIShlLnc8PTB8fGUuaDw9MCkpcmV0dXJuIGV9Z2V0U2NlbmVSZWN0KCl7Y29uc3R7d2lkdGg6dCxoZWlnaHQ6ZX09dGhpcy5zY2VuZTtyZXR1cm57eDowLHk6MCx3Ok1hdGguZmxvb3IodCksaDpNYXRoLmZsb29yKGUpfX1jaGVja1JpZ2h0UmVjdEJvdW5kaW5nQm94KHQpe3JldHVybiB0aGlzLnZOb2Rlcy5jb21iaW5lSW50ZXJzZWN0UmVjdCh0KX1jdXJzb3JIb3Zlcih0KXt0aGlzLmxvY2FsV29yay5jdXJzb3JIb3Zlcih0KX19Y2xhc3Mgc2cgZXh0ZW5kcyBYbntjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIodCxlKTtzdCh0aGlzLCJfcG9zdCIpO3N0KHRoaXMsImRyYXdMYXllciIpO3N0KHRoaXMsInNuYXBzaG90RnVsbExheWVyIik7c3QodGhpcywic2VydmljZVdvcmsiKTtzdCh0aGlzLCJsb2NhbFdvcmsiKTt0aGlzLl9wb3N0PW47Y29uc3QgYT17dGhyZWFkOnRoaXMsdmlld0lkOnRoaXMudmlld0lkLHZOb2Rlczp0aGlzLnZOb2RlcyxmdWxsTGF5ZXI6dGhpcy5mdWxsTGF5ZXIsZHJhd0xheWVyOnRoaXMuZHJhd0xheWVyLHBvc3Q6dGhpcy5wb3N0LmJpbmQodGhpcyl9O3RoaXMubG9jYWxXb3JrPW5ldyByZyhhKSx0aGlzLnZOb2Rlcy5pbml0KHRoaXMuZnVsbExheWVyLHRoaXMuZHJhd0xheWVyKX1hc3luYyBwb3N0KHQsZSl7dmFyIG8sYztjb25zdCBuPXQucmVuZGVyLGE9W107bGV0IHM9ZTtpZihuIT1udWxsJiZuLmxlbmd0aCl7Zm9yKGNvbnN0IG0gb2YgbilpZihtLmRyYXdDYW52YXMmJnRoaXMuZnVsbExheWVyLnBhcmVudC5yZW5kZXIoKSxtLnJlY3Qpe2lmKG0ucmVjdD10aGlzLnNhZmFyaUZpeFJlY3QoWnQobS5yZWN0KSksIW0ucmVjdCljb250aW51ZTtpZihtLmRyYXdDYW52YXMpe2NvbnN0IHU9YXdhaXQgdGhpcy5nZXRSZWN0SW1hZ2VCaXRtYXAobS5yZWN0LCEhbS5pc0Z1bGxXb3JrKTttLmltYWdlQml0bWFwPXUsc3x8KHM9W10pLHMucHVzaCh1KX1hLnB1c2gobSl9dC5yZW5kZXI9YX1jb25zdCBpPShvPXQuc3ApPT1udWxsP3ZvaWQgMDpvLmZpbHRlcihtPT5tLnR5cGUhPT1sdC5Ob25lfHxPYmplY3Qua2V5cyhtKS5maWx0ZXIodT0+dT09PSJ0eXBlIikubGVuZ3RoKTtpZihpIT1udWxsJiZpLmxlbmd0aCYmKHQuc3A9aS5tYXAobT0+KHsuLi5tLHZpZXdJZDp0aGlzLnZpZXdJZH0pKSksKChjPXQuc3ApIT1udWxsJiZjLmxlbmd0aHx8dC5kcmF3Q291bnR8fGEhPW51bGwmJmEubGVuZ3RoKSYmKHRoaXMuX3Bvc3QodCxzKSxzIT1udWxsJiZzLmxlbmd0aCkpZm9yKGNvbnN0IG0gb2YgcyltIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXAmJm0uY2xvc2UoKX1vbih0KXtjb25zdHttc2dUeXBlOmV9PXQ7c3dpdGNoKGUpe2Nhc2UgbHQuVXBkYXRlQ2FtZXJhOnRoaXMudXBkYXRlQ2FtZXJhKHQpO2JyZWFrO2Nhc2UgbHQuU25hcHNob3Q6dGhpcy5zbmFwc2hvdEZ1bGxMYXllcj10aGlzLmNyZWF0ZUxheWVyKCJzbmFwc2hvdEZ1bGxMYXllciIsdGhpcy5zY2VuZSx7Li4udGhpcy5vcHQubGF5ZXJPcHQsYnVmZmVyU2l6ZTp0aGlzLnZpZXdJZD09PSJtYWluVmlldyI/NmUzOjNlM30pLHRoaXMuc25hcHNob3RGdWxsTGF5ZXImJnRoaXMuZ2V0U25hcHNob3QodCkudGhlbigoKT0+e3RoaXMuc25hcHNob3RGdWxsTGF5ZXI9dm9pZCAwfSk7YnJlYWs7Y2FzZSBsdC5Cb3VuZGluZ0JveDp0aGlzLnNuYXBzaG90RnVsbExheWVyPXRoaXMuY3JlYXRlTGF5ZXIoInNuYXBzaG90RnVsbExheWVyIix0aGlzLnNjZW5lLHsuLi50aGlzLm9wdC5sYXllck9wdCxidWZmZXJTaXplOnRoaXMudmlld0lkPT09Im1haW5WaWV3Ij82ZTM6M2UzfSksdGhpcy5zbmFwc2hvdEZ1bGxMYXllciYmdGhpcy5nZXRCb3VuZGluZ1JlY3QodCkudGhlbigoKT0+e3RoaXMuc25hcHNob3RGdWxsTGF5ZXI9dm9pZCAwfSk7YnJlYWt9c3VwZXIub24odCl9Z2V0T2Zmc2NyZWVuKHQpe3ZhciBlO3JldHVybihlPSh0JiZ0aGlzLnNuYXBzaG90RnVsbExheWVyfHx0aGlzLmZ1bGxMYXllcikucGFyZW50KT09bnVsbD92b2lkIDA6ZS5jYW52YXN9Y29uc3VtZURyYXcodCxlKXt0PT09VHQuTG9jYWwmJnRoaXMubG9jYWxXb3JrLmNvbnN1bWVEcmF3KGUpfWNvbnN1bWVEcmF3QWxsKHQsZSl7dGhpcy5sb2NhbFdvcmsuY29uc3VtZURyYXdBbGwoZSl9Z2V0UmVjdEltYWdlQml0bWFwKHQsZT0hMSxuKXtjb25zdCBhPXQueCp0aGlzLmRwcixzPXQueSp0aGlzLmRwcixpPXQudyp0aGlzLmRwcixvPXQuaCp0aGlzLmRwcjtyZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAodGhpcy5nZXRPZmZzY3JlZW4oZSksYSxzLGksbyxuKX1zYWZhcmlGaXhSZWN0KHQpe2lmKHQudyt0Lng8PTB8fHQuaCt0Lnk8PTB8fHQudzw9MHx8dC5oPD0wKXJldHVybjtjb25zdCBlPXt4OjAseTowLHc6TWF0aC5mbG9vcih0aGlzLnNjZW5lLndpZHRoKSxoOk1hdGguZmxvb3IodGhpcy5zY2VuZS5oZWlnaHQpfTtpZih0Lng8MD90LncrdC54PHRoaXMuc2NlbmUud2lkdGgmJihlLnc9dC53K3QueCk6dC53K3QueD4wJiYoZS54PXQueCxlLnc9TWF0aC5mbG9vcih0aGlzLnNjZW5lLndpZHRoLXQueCkpLHQueTwwP3QuaCt0Lnk8dGhpcy5zY2VuZS5oZWlnaHQmJihlLmg9dC5oK3QueSk6dC5oK3QueT4wJiYoZS55PXQueSxlLmg9TWF0aC5mbG9vcih0aGlzLnNjZW5lLmhlaWdodC10LnkpKSwhKGUudzw9MHx8ZS5oPD0wKSlyZXR1cm4gZX11cGRhdGVDYW1lcmEodCl7Y29uc3R7Y2FtZXJhT3B0OmV9PXQ7ZSYmdGhpcy5zZXRDYW1lcmFPcHQoZSl9c2V0Q2FtZXJhT3B0KHQsZSl7dGhpcy5jYW1lcmFPcHQ9dDtjb25zdHtzY2FsZTpuLGNlbnRlclg6YSxjZW50ZXJZOnMsd2lkdGg6aSxoZWlnaHQ6b309dDsoaSE9PXRoaXMuc2NlbmUud2lkdGh8fG8hPT10aGlzLnNjZW5lLmhlaWdodCkmJnRoaXMudXBkYXRlU2NlbmUoe3dpZHRoOmksaGVpZ2h0Om99KSxlPyhlLnNldEF0dHJpYnV0ZSgic2NhbGUiLFtuLG5dKSxlLnNldEF0dHJpYnV0ZSgidHJhbnNsYXRlIixbLWEsLXNdKSk6KHRoaXMuZnVsbExheWVyLnNldEF0dHJpYnV0ZSgic2NhbGUiLFtuLG5dKSx0aGlzLmZ1bGxMYXllci5zZXRBdHRyaWJ1dGUoInRyYW5zbGF0ZSIsWy1hLC1zXSkpfWFzeW5jIGdldFNuYXBzaG90KHQpe2NvbnN0e3NjZW5lUGF0aDplLHNjZW5lczpuLGNhbWVyYU9wdDphLHc6cyxoOmksbWF4WkluZGV4Om99PXQ7aWYoZSYmbiYmYSYmdGhpcy5zbmFwc2hvdEZ1bGxMYXllcil7Y29uc3QgYz1adCh0aGlzLmNhbWVyYU9wdCk7dGhpcy5zZXRDYW1lcmFPcHQoYSx0aGlzLnNuYXBzaG90RnVsbExheWVyKSx0aGlzLmxvY2FsV29yay5mdWxsTGF5ZXI9dGhpcy5zbmFwc2hvdEZ1bGxMYXllcix0aGlzLmxvY2FsV29yay5kcmF3TGF5ZXI9dGhpcy5mdWxsTGF5ZXI7bGV0IG07Y29uc3QgdT1uZXcgTWFwO2Zvcihjb25zdFt5LE9db2YgT2JqZWN0LmVudHJpZXMobikpaWYoTyE9bnVsbCYmTy50eXBlKXN3aXRjaChPPT1udWxsP3ZvaWQgMDpPLnR5cGUpe2Nhc2UgbHQuVXBkYXRlTm9kZTpjYXNlIGx0LkZ1bGxXb3JrOntjb25zdHt0b29sc1R5cGU6eCxvcHQ6dn09Tzt4PT09Z3QuVGV4dCYmdiYmKHYuekluZGV4PXYuekluZGV4KyhvfHwwKSwodi5saW5lVGhyb3VnaHx8di51bmRlcmxpbmUpJiZ1LnNldCh5LE8pKTtjb25zdCBUPWF3YWl0IHRoaXMubG9jYWxXb3JrLnJ1bkZ1bGxXb3JrKHsuLi5PLG9wdDp2LHdvcmtJZDp5LG1zZ1R5cGU6bHQuRnVsbFdvcmssZGF0YVR5cGU6VHQuU2VydmljZSx2aWV3SWQ6dGhpcy52aWV3SWR9LHg9PT1ndC5UZXh0KTttPU90KG0sVCk7YnJlYWt9fXRoaXMubG9jYWxXb3JrLmZ1bGxMYXllcj10aGlzLmZ1bGxMYXllcix0aGlzLmxvY2FsV29yay5kcmF3TGF5ZXI9dm9pZCAwO2xldCBwO3MmJmkmJihwPXtyZXNpemVXaWR0aDpzLHJlc2l6ZUhlaWdodDppfSksdS5zaXplJiYoYXdhaXQgbmV3IFByb21pc2UoeT0+e3NldFRpbWVvdXQoeSw1MDApfSksdGhpcy53aWxsUmVuZGVyU3BlY2lhbExhYmVsKHUpKSxhd2FpdCB0aGlzLmdldFNuYXBzaG90UmVuZGVyKHtzY2VuZVBhdGg6ZSxjdXJDYW1lcmFPcHQ6YyxvcHRpb25zOnB9KX19d2lsbFJlbmRlclNwZWNpYWxMYWJlbCh0KXt2YXIgZTtmb3IoY29uc3RbbixhXW9mIHQuZW50cmllcygpKXtjb25zdCBzPShlPXRoaXMuc25hcHNob3RGdWxsTGF5ZXIpPT1udWxsP3ZvaWQgMDplLmdldEVsZW1lbnRzQnlOYW1lKG4pWzBdO3MmJmEub3B0JiZ0aGlzLmxvY2FsV29yay51cGRhdGVMYWJlbHMocyxhKX19YXN5bmMgZ2V0U25hcHNob3RSZW5kZXIodCl7dmFyIGksbztjb25zdHtzY2VuZVBhdGg6ZSxjdXJDYW1lcmFPcHQ6bixvcHRpb25zOmF9PXQ7KChpPXRoaXMuc25hcHNob3RGdWxsTGF5ZXIpPT1udWxsP3ZvaWQgMDppLnBhcmVudCkucmVuZGVyKCk7Y29uc3Qgcz1hd2FpdCB0aGlzLmdldFJlY3RJbWFnZUJpdG1hcCh7eDowLHk6MCx3OnRoaXMuc2NlbmUud2lkdGgsaDp0aGlzLnNjZW5lLmhlaWdodH0sITAsYSk7cyYmKGF3YWl0IHRoaXMucG9zdCh7c3A6W3t0eXBlOmx0LlNuYXBzaG90LHNjZW5lUGF0aDplLGltYWdlQml0bWFwOnN9XX0sW3NdKSxzLmNsb3NlKCksKG89dGhpcy5zbmFwc2hvdEZ1bGxMYXllcik9PW51bGx8fG8ucmVtb3ZlQWxsQ2hpbGRyZW4oKSx0aGlzLnNldENhbWVyYU9wdChuLHRoaXMuZnVsbExheWVyKSl9YXN5bmMgZ2V0Qm91bmRpbmdSZWN0KHQpe2NvbnN0e3NjZW5lUGF0aDplLHNjZW5lczpuLGNhbWVyYU9wdDphfT10O2lmKGUmJm4mJmEmJnRoaXMuc25hcHNob3RGdWxsTGF5ZXIpe2NvbnN0IHM9WnQodGhpcy5jYW1lcmFPcHQpO3RoaXMuc2V0Q2FtZXJhT3B0KGEsdGhpcy5zbmFwc2hvdEZ1bGxMYXllciksdGhpcy5sb2NhbFdvcmsuZnVsbExheWVyPXRoaXMuc25hcHNob3RGdWxsTGF5ZXIsdGhpcy5sb2NhbFdvcmsuZHJhd0xheWVyPXRoaXMuZHJhd0xheWVyO2xldCBpO2Zvcihjb25zdFtvLGNdb2YgT2JqZWN0LmVudHJpZXMobikpaWYoYyE9bnVsbCYmYy50eXBlKXN3aXRjaChjPT1udWxsP3ZvaWQgMDpjLnR5cGUpe2Nhc2UgbHQuVXBkYXRlTm9kZTpjYXNlIGx0LkZ1bGxXb3JrOntjb25zdCBtPWF3YWl0IHRoaXMubG9jYWxXb3JrLnJ1bkZ1bGxXb3JrKHsuLi5jLHdvcmtJZDpvLG1zZ1R5cGU6bHQuRnVsbFdvcmssZGF0YVR5cGU6VHQuU2VydmljZSx2aWV3SWQ6dGhpcy52aWV3SWR9KTtpPU90KGksbSk7YnJlYWt9fWkmJmF3YWl0IHRoaXMucG9zdCh7c3A6W3t0eXBlOmx0LkJvdW5kaW5nQm94LHNjZW5lUGF0aDplLHJlY3Q6aX1dfSksdGhpcy5sb2NhbFdvcmsuZnVsbExheWVyPXRoaXMuZnVsbExheWVyLHRoaXMubG9jYWxXb3JrLmRyYXdMYXllcj12b2lkIDAsdGhpcy5zbmFwc2hvdEZ1bGxMYXllci5yZW1vdmVBbGxDaGlsZHJlbigpLHRoaXMuc2V0Q2FtZXJhT3B0KHMsdGhpcy5mdWxsTGF5ZXIpfX19Y29uc3Qgb2c9c2VsZjtuZXcgbmcob2cscW4uU3ViKX0pKCk7Cg==",Qp=c=>Uint8Array.from(atob(c),l=>l.charCodeAt(0)),Eb=typeof window<"u"&&window.Blob&&new Blob([Qp(HZ)],{type:"text/javascript;charset=utf-8"});function Up(c){let l;try{if(l=Eb&&(window.URL||window.webkitURL).createObjectURL(Eb),!l)throw"";const d=new Worker(l,{name:c==null?void 0:c.name});return d.addEventListener("error",()=>{(window.URL||window.webkitURL).revokeObjectURL(l)}),d}catch{return new Worker("data:text/javascript;base64,"+HZ,{name:c==null?void 0:c.name})}finally{l&&(window.URL||window.webkitURL).revokeObjectURL(l)}}class ad{constructor(){h(this,"emtType");h(this,"control");h(this,"mainEngine")}static dispatch(l,d,b){var Z;(Z=yd.InternalMsgEmitter)==null||Z.emit([l,d],b)}get serviceColloctor(){return this.control.collector}registerForMainEngine(l,d){return this.emtType=l,this.control=d,this.mainEngine=d.worker,this.mainEngine.internalMsgEmitter.on([this.emtType,this.emitEventType],this.collect.bind(this)),this}destroy(){this.emtType&&this.mainEngine&&this.mainEngine.internalMsgEmitter.off([this.emtType,this.emitEventType],this.collect.bind(this))}collectForLocalWorker(l){var d,b,Z;for(const[i,m]of l)(d=this.mainEngine)==null||d.queryTaskBatchData(m).forEach(X=>{var s;(s=this.mainEngine)==null||s.taskBatchData.delete(X)}),(b=this.mainEngine)==null||b.taskBatchData.add(i);(Z=this.mainEngine)==null||Z.runAnimation()}collectForServiceWorker(l){fd(()=>{l.forEach(d=>{var i,m,X;(i=this.serviceColloctor)==null||i.dispatch(d);const{viewId:b,undoTickerId:Z}=d;Z&&b&&((X=(m=this.mainEngine)==null?void 0:m.internalMsgEmitter)==null||X.emit("undoTickerEnd",Z,b))})},this.mainEngine.maxLastSyncTime)}}class wp extends ad{constructor(){super(...arguments);h(this,"emitEventType",C.ZIndexActive)}collect(d){if(!this.serviceColloctor||!this.mainEngine)return;const{workId:b,isActive:Z,viewId:i}=d,m=this.control.viewContainerManager.getView(i);if(!(m!=null&&m.displayer))return;const X=m.focusScenePath,s=[],G=[];b===k&&s.push([{workId:b,msgType:N.UpdateNode,dataType:r.Local,isActiveZIndex:Z,emitEventType:this.emitEventType,willRefreshSelector:!0,willSyncService:!1,viewId:i,scenePath:X},{workId:b,msgType:N.UpdateNode,emitEventType:this.emitEventType}]),s.length&&this.collectForLocalWorker(s),G.length&&this.collectForServiceWorker(G)}}class vp extends ad{constructor(){super(...arguments);h(this,"emitEventType",C.CopyNode)}collect(d){var X;if(!this.serviceColloctor||!this.mainEngine)return;const{workIds:b,viewId:Z}=d,i=this.control.viewContainerManager.getView(Z);if(!(i!=null&&i.displayer))return;const m=i.focusScenePath;for(const s of b){const G=s.toString(),W=this.serviceColloctor.isLocalId(G)?this.serviceColloctor.transformKey(s):G,I=(X=this.serviceColloctor.getStorageData(Z,m))==null?void 0:X[W];if(I){if(s===k){const o=I&&this.copySelector({viewId:Z,store:I});o&&this.pasteSelector({...o,viewId:Z,scenePath:m});break}if(I.toolsType===t.Text&&I.opt&&I.opt.workState&&I.opt.workState!==K.Done){const o=I&&this.copyText({viewId:Z,store:I});o&&this.pasteText({...o,viewId:Z,scenePath:m,key:W,store:I});break}}}}copyText(d){const{viewId:b,store:Z}=d,i=this.control.viewContainerManager.getView(b);if(!this.serviceColloctor||!i)return;const m=i==null?void 0:i.cameraOpt,X=m&&[m.centerX,m.centerY],s=Z.opt,G=s.boxPoint&&s.boxSize&&[s.boxPoint[0]+s.boxSize[0]/2,s.boxPoint[1]+s.boxSize[1]/2];return{bgCenter:X,textCenter:G}}pasteText(d){var Y,L;const{bgCenter:b,textCenter:Z,store:i,key:m,viewId:X,scenePath:s}=d,G=this.control.viewContainerManager.getView(X);if(!this.serviceColloctor||!G)return;const p=Math.floor(Math.random()*30+1),W=Date.now(),I=((Y=G.cameraOpt)==null?void 0:Y.scale)||1,o=b&&Z&&[b[0]-Z[0]+p,b[1]-Z[1]+p]||[p/I,p/I],y=(this.serviceColloctor.isLocalId(m)?m:this.serviceColloctor.getLocalId(m.toString()))+"-"+W;if(this.mainEngine.internalMsgEmitter.emit("undoTickerStart",W,X),i.toolsType===t.Text&&i.opt){const n=i.opt;if(n&&n.boxPoint&&n.text){n.workState=K.Done;const a=n.boxPoint;n.boxPoint=[a[0]+o[0],a[1]+o[1]],n.workState=K.Done;const x=this.control.viewContainerManager.transformToOriginPoint(n.boxPoint,X);this.control.textEditorManager.createTextForMasterController({workId:y,x:x[0],y:x[1],opt:n,scale:((L=G.cameraOpt)==null?void 0:L.scale)||1,type:xd.Text,isActive:!1,viewId:X,scenePath:s}),this.collectForServiceWorker([{...i,opt:n,type:N.FullWork,workId:y,viewId:X,scenePath:s,undoTickerId:W}])}}}copySelector(d){var y,Y,L,n,a,x,R,S;const{viewId:b,store:Z}=d,i=this.control.viewContainerManager.getView(b),m=Z.selectIds;if(!this.serviceColloctor||!(m!=null&&m.length)||!i)return;const X=new Map,s={offset:{x:0,y:0},cameraOpt:{centerX:((y=i.cameraOpt)==null?void 0:y.centerX)||0,centerY:((Y=i.cameraOpt)==null?void 0:Y.centerY)||0,scale:((L=i.cameraOpt)==null?void 0:L.scale)||1}},G=(n=i.displayer.canvasBgRef.current)==null?void 0:n.getBoundingClientRect(),p=(x=(a=i.displayer)==null?void 0:a.floatBarCanvasRef.current)==null?void 0:x.getBoundingClientRect(),W=G&&[G.x+G.width/2,G.y+G.height/2],I=p&&[p.x+p.width/2,p.y+p.height/2],o=W&&i.viewData&&i.viewData.convertToPointInWorld({x:W[0],y:W[1]}),u=I&&i.viewData&&i.viewData.convertToPointInWorld({x:I[0],y:I[1]});o&&u&&(s.offset={x:o.x-u.x,y:o.y-u.y});for(const J of m){const F=(S=(R=this.serviceColloctor)==null?void 0:R.getStorageData(i.id,i.focusScenePath))==null?void 0:S[J];F&&X.set(J,F)}return{copyStores:X,copyCoordInfo:s}}pasteSelector(d){var y;const{copyStores:b,copyCoordInfo:Z,viewId:i,scenePath:m}=d,X=this.control.viewContainerManager.getView(i);if(!b.size||!this.serviceColloctor||!X)return;const{offset:s,cameraOpt:G}=Z,p=Math.floor(Math.random()*30+1),W=[s.x+p,s.y+p],I=Date.now(),o=[],u=[];this.mainEngine.internalMsgEmitter.emit("undoTickerStart",I,i);for(const[Y,L]of b.entries()){const a=(this.serviceColloctor.isLocalId(Y)?Y:this.serviceColloctor.getLocalId(Y.toString()))+"-"+I,x={useAnimation:!1};if(L.toolsType===t.Text&&L.opt){const R=L.opt;if(R&&R.boxPoint&&R.text){R.workState=K.Done;const S=R.boxPoint;R.boxPoint=[S[0]+W[0],S[1]+W[1]],R.workState=K.Done;const J=this.control.viewContainerManager.transformToOriginPoint(R.boxPoint,i);this.control.textEditorManager.createTextForMasterController({workId:a,x:J[0],y:J[1],opt:R,scale:((y=X.cameraOpt)==null?void 0:y.scale)||1,type:xd.Text,isActive:!1,viewId:i,scenePath:m})}u.push({...L,opt:R,type:N.FullWork,workId:a,viewId:i,scenePath:m,undoTickerId:I});continue}if(L.toolsType===t.Image&&(L.opt.uuid=a,L.opt.centerX=L.opt.centerX+W[0],L.opt.centerY=L.opt.centerY+W[1]),L.ops){const R=tV(L.ops).map((J,F)=>{const w=F%3;return w===0?J+W[0]:w===1?J+W[1]:J}),S=yV(R);L.ops=S}u.push({...L,updateNodeOpt:x,type:N.FullWork,workId:a,viewId:i,scenePath:m,undoTickerId:I}),o.push([{...L,updateNodeOpt:x,workId:a,msgType:N.FullWork,dataType:r.Local,emitEventType:C.CopyNode,willSyncService:!1,willRefresh:!0,viewId:i,undoTickerId:I},{workId:a,msgType:N.FullWork,emitEventType:C.CopyNode}])}o.length&&this.collectForLocalWorker(o),u.length&&this.collectForServiceWorker(u)}}function Kl(c,l,d){return"#"+((c<<16)+(l<<8)+d).toString(16).padStart(6,"0")}function Wd(c,l=1){return"rgba("+parseInt("0x"+c.slice(1,3))+","+parseInt("0x"+c.slice(3,5))+","+parseInt("0x"+c.slice(5,7))+","+l+")"}function sl(c,l,d,b=1){return`rgba(${c},${l},${d},${b})`}function bb(c){const l=c.split(","),d=parseInt(l[0].split("(")[1]),b=parseInt(l[1]),Z=parseInt(l[2]),i=Number(l[3].split(")")[0]);return[Kl(d,b,Z),i]}function Gl(c){const l=c.split(","),d=parseInt(l[0].split("(")[1]),b=parseInt(l[1]),Z=parseInt(l[2]),i=Number(l[3].split(")")[0]);return[d,b,Z,i]}function rb(c){return c==="transparent"}class Pp extends ad{constructor(){super(...arguments);h(this,"emitEventType",C.SetColorNode)}setTextColor(d,b,Z,i){const{fontColor:m,fontBgColor:X}=Z;b.opt&&(m&&(b.opt.fontColor=m),X&&(b.opt.fontColor=X),this.control.textEditorManager.updateTextForMasterController({workId:d,opt:b.opt,viewId:i,canSync:!0,canWorker:!0}))}collect(d){if(!this.serviceColloctor||!this.mainEngine)return;const{workIds:b,strokeColor:Z,fillColor:i,fontColor:m,fontBgColor:X,viewId:s}=d,G=this.control.viewContainerManager.getView(s);if(!(G!=null&&G.displayer))return;const p=G.focusScenePath,W=[...b],I=this.serviceColloctor.storage,o=[],u={};for(;W.length;){const y=W.pop();if(!y)continue;const Y=y.toString(),L=this.serviceColloctor.isLocalId(Y),n=L?this.serviceColloctor.transformKey(y):Y;let a=Y;!L&&this.serviceColloctor.isOwn(a)&&(a=this.serviceColloctor.getLocalId(a));const x=I[s][p][n]||void 0;if(x){const R=x.updateNodeOpt||{};if(m||X){if(m){R.fontColor=m;const[J,F,w,H]=Gl(m);u.textColor=[J,F,w],u.textOpacity=H}if(X){R.fontBgColor=X;const[J,F,w,H]=Gl(X);u.textBgColor=[J,F,w],u.textBgOpacity=H}if(x.toolsType===t.Text&&x.opt){this.setTextColor(a,Zd(x),R,s);continue}}if(Z){R.strokeColor=Z;const[J,F,w,H]=Gl(Z);u.strokeColor=[J,F,w],u.strokeOpacity=H}if(i)if(R.fillColor=rb(i)?"transparent":i,rb(i))u.fillColor=void 0,u.fillOpacity=void 0;else{const[J,F,w,H]=Gl(i);u.fillColor=[J,F,w],u.fillOpacity=H}const S={workId:a,msgType:N.UpdateNode,dataType:r.Local,updateNodeOpt:R,emitEventType:this.emitEventType,willRefresh:!0,willRefreshSelector:!0,willSyncService:!0,textUpdateForWoker:!0,viewId:s};o.push([S,{workId:a,msgType:N.UpdateNode,emitEventType:this.emitEventType}])}}o.length&&this.collectForLocalWorker(o),Object.keys(u).length&&setTimeout(()=>{var y;(y=this.control.room)==null||y.setMemberState(u)},0)}}class jp extends ad{constructor(){super(...arguments);h(this,"emitEventType",C.ZIndexNode);h(this,"zIndexMap",new Map)}clearZIndex(d){this.zIndexMap.delete(d)}getMinZIndex(d){var b;return((b=this.zIndexMap.get(d))==null?void 0:b.min)||0}getMaxZIndex(d){var b;return((b=this.zIndexMap.get(d))==null?void 0:b.max)||0}setMaxZIndex(d,b){const Z=this.getMinZIndex(b);this.zIndexMap.set(b,{min:Z,max:d})}setMinZIndex(d,b){const Z=this.getMaxZIndex(b);this.zIndexMap.set(b,{min:d,max:Z})}addMaxLayer(d){const b=this.getMaxZIndex(d)+1;this.setMaxZIndex(b,d)}addMinLayer(d){const b=this.getMinZIndex(d)-1;this.setMinZIndex(b,d)}correct(d){const b=d.sort((Z,i)=>Z[1]-i[1]);for(let Z=1;Z<b.length;Z++){const i=b[Z][1],m=b[Z-1][1];i<=m&&(b[Z][1]=m+1)}return b}collect(d){if(!this.serviceColloctor||!this.mainEngine)return;const{workIds:b,layer:Z,viewId:i}=d,m=this.control.viewContainerManager.getView(i);if(!(m!=null&&m.displayer))return;const X=m.focusScenePath,s=[...b],G=this.serviceColloctor.storage,p=[],W=[];for(;s.length;){const o=s.pop();if(!o)continue;const u=o.toString(),y=this.serviceColloctor.isLocalId(u),Y=y?this.serviceColloctor.transformKey(o):u;let L=u;!y&&this.serviceColloctor.isOwn(L)&&(L=this.serviceColloctor.getLocalId(L));const n=Zd(G[i][X][Y]);let a;if(n&&L===k){if(n.selectIds){W.push(...n.selectIds),W.sort((J,F)=>{var M,B,g,_;const w=((B=(M=G[I(J,this.serviceColloctor)])==null?void 0:M.opt)==null?void 0:B.zIndex)||0,H=((_=(g=G[I(J,this.serviceColloctor)])==null?void 0:g.opt)==null?void 0:_.zIndex)||0;return w>H?1:J<F?-1:0});const x=n.updateNodeOpt||{};x.zIndexLayer=Z;const R={workId:o,msgType:N.UpdateNode,dataType:r.Local,updateNodeOpt:x,emitEventType:this.emitEventType,willRefreshSelector:!0,willSyncService:!0,viewId:i},S=new Map;Z===Ed.Top?(this.addMaxLayer(i),a=this.getMaxZIndex(i)):(this.addMinLayer(i),a=this.getMinZIndex(i)),W.forEach(J=>{var M,B,g;const F=(M=this.serviceColloctor)==null?void 0:M.isLocalId(J);let w=F&&((B=this.serviceColloctor)==null?void 0:B.transformKey(J))||J;const H=G[i][X][w];!F&&((g=this.serviceColloctor)!=null&&g.isOwn(w))&&(w=this.serviceColloctor.getLocalId(w)),x.zIndex=a,H!=null&&H.opt&&(H.opt.zIndex=a),H!=null&&H.opt&&S.set(w,{updateNodeOpt:H.updateNodeOpt,opt:H.opt})}),R.selectStore=S,R.willSerializeData=!0,p.push([R,{workId:o,msgType:N.UpdateNode,emitEventType:this.emitEventType}])}continue}}p.length&&this.collectForLocalWorker(p);function I(o,u){return u.isLocalId(o)&&u.transformKey(o)||o}}}class Bp extends ad{constructor(){super(...arguments);h(this,"emitEventType",C.TranslateNode);h(this,"undoTickerId");h(this,"oldRect");h(this,"cachePosition")}collect(d){var Y,L,n,a;if(!this.serviceColloctor||!this.mainEngine)return;const{workIds:b,position:Z,workState:i,viewId:m}=d,X=this.control.viewContainerManager.getView(m);if(!(X!=null&&X.displayer))return;const s=X.focusScenePath,G=[...b],p=(Y=this.serviceColloctor)==null?void 0:Y.storage,W=[],I=(L=X.displayer.canvasBgRef.current)==null?void 0:L.getBoundingClientRect(),o=(a=(n=X.displayer)==null?void 0:n.floatBarCanvasRef.current)==null?void 0:a.getBoundingClientRect();let u=!1;const y=i===K.Start&&Date.now()||void 0;for(y&&(this.undoTickerId=y,this.mainEngine.internalMsgEmitter.emit("undoTickerStart",y,m)),I&&o&&this.oldRect&&(this.oldRect.x<I.x&&o.x>this.oldRect.x||this.oldRect.y<I.y&&o.y>this.oldRect.y||this.oldRect.x+this.oldRect.width>I.x+I.width&&o.x<this.oldRect.x||this.oldRect.y+this.oldRect.height>I.y+I.height&&o.y<this.oldRect.y)&&(u=!0),o&&(this.oldRect=o);G.length;){const x=G.pop();if(!x)continue;const R=x.toString(),S=this.serviceColloctor.isLocalId(R),J=S&&this.serviceColloctor.transformKey(x)||R;let F=R;!S&&this.serviceColloctor.isOwn(F)&&(F=this.serviceColloctor.getLocalId(F));const w=p[m][s][J];if(w&&F===k){if(w.selectIds&&(i===K.Start&&(this.cachePosition=Z),this.cachePosition)){const H=w.updateNodeOpt||{};H.translate=[Z.x-this.cachePosition.x,Z.y-this.cachePosition.y],H.workState=i;const M={workId:x,msgType:N.UpdateNode,dataType:r.Local,updateNodeOpt:H,emitEventType:this.emitEventType,willRefreshSelector:u,willSyncService:!0,textUpdateForWoker:!1,viewId:m};i===K.Done&&(M.willRefreshSelector=!0,M.textUpdateForWoker=!0,M.willSerializeData=!0,M.undoTickerId=this.undoTickerId,this.cachePosition=void 0),W.push([M,{workId:x,msgType:N.UpdateNode,emitEventType:this.emitEventType}])}continue}}i===K.Start?this.mainEngine.unWritable():i===K.Done&&this.mainEngine.abled(),W.length&&this.collectForLocalWorker(W)}}class Ep extends ad{constructor(){super(...arguments);h(this,"emitEventType",C.DeleteNode)}collect(d){if(!this.serviceColloctor||!this.mainEngine)return;const{workIds:b,viewId:Z}=d,i=this.control.viewContainerManager.getView(Z);if(!(i!=null&&i.displayer))return;const m=i.focusScenePath,X=this.serviceColloctor.storage,s=[...b],G=[],p=[],W=Date.now();for(;s.length;){const I=s.pop();if(!I)continue;const o=I.toString(),u=this.serviceColloctor.isLocalId(o),y=u?this.serviceColloctor.transformKey(I):o,Y=X[Z][m][y];if(Y){let L=o;if(!u&&this.serviceColloctor.isOwn(L)&&(L=this.serviceColloctor.getLocalId(L)),Y.toolsType===t.Text){this.control.textEditorManager.delete(L,!0,!0);continue}p.push(L)}}p.length&&(G.push([{msgType:N.RemoveNode,emitEventType:C.DeleteNode,removeIds:p,dataType:r.Local,willSyncService:!0,willRefresh:!0,undoTickerId:W,viewId:Z},void 0]),this.mainEngine.internalMsgEmitter.emit("undoTickerStart",W,Z),this.collectForLocalWorker(G))}}class rp extends ad{constructor(){super(...arguments);h(this,"emitEventType",C.ScaleNode);h(this,"undoTickerId");h(this,"targetBox",new Map);h(this,"targetText",new Map);h(this,"cacheTextInfo",new Map)}async collect(d){var u,y,Y,L,n;if(!this.serviceColloctor||!this.mainEngine)return;const{workIds:b,box:Z,workState:i,viewId:m,dir:X}=d,s=this.control.viewContainerManager.getView(m);if(!(s!=null&&s.displayer))return;const G=s.focusScenePath,p=[...b],W=(u=this.serviceColloctor)==null?void 0:u.storage,I=[],o=i===K.Start&&Date.now()||void 0;for(o&&(this.undoTickerId=o,this.mainEngine.internalMsgEmitter.emit("undoTickerStart",o,m));p.length;){const a=p.pop();if(!a)continue;const x=a.toString(),R=this.serviceColloctor.isLocalId(x),S=R&&this.serviceColloctor.transformKey(a)||x;let J=x;!R&&this.serviceColloctor.isOwn(J)&&(J=this.serviceColloctor.getLocalId(J));const F=W[m][G][S];if(F&&J===k&&F.selectIds){const w=F.updateNodeOpt||{};if(w.dir=X,w.box=Z,w.workState=i,i===K.Start&&Z){for(const M of F.selectIds){const B=(y=this.serviceColloctor)==null?void 0:y.isLocalId(M),g=B&&((Y=this.serviceColloctor)==null?void 0:Y.transformKey(M))||M;let _=g;!B&&((L=this.serviceColloctor)!=null&&L.isOwn(g))&&(_=this.serviceColloctor.getLocalId(g));const q=this.control.textEditorManager.get(_);q&&i===K.Start&&this.targetText.set(_,Zd(q))}this.targetText.size&&this.targetBox.set(J,Z)}if(this.targetText.size&&i!==K.Start){const M=this.targetBox.get(J);if(M){const B=[Z.w/M.w,Z.h/M.h];for(const[g,_]of this.targetText.entries()){const{opt:q}=_,$=Math.floor(q.fontSize*B[0]),O=this.cacheTextInfo.get(g),f=!O&&q.fontSize!==$||O&&O.fontSize!==$||!1,A=(n=this.control.textEditorManager.get(g))==null?void 0:n.opt;if(f&&A&&q.boxSize&&q.boxPoint){const e=await this.control.textEditorManager.updateTextControllerWithEffectAsync({workId:g,opt:{...A,fontSize:$},viewId:m,canSync:!1,canWorker:!1});e&&this.cacheTextInfo.set(g,{fontSize:e.opt.fontSize,boxSize:e.opt.boxSize,boxPoint:e.opt.boxPoint})}}w.textInfos=this.cacheTextInfo}}const H={workId:a,msgType:N.UpdateNode,dataType:r.Local,updateNodeOpt:w,emitEventType:this.emitEventType,willRefreshSelector:!0,willSyncService:!0,viewId:m};i===K.Done&&(H.willSerializeData=!0,H.undoTickerId=this.undoTickerId,this.targetBox.delete(J),this.targetText.clear()),I.push([H,{workId:a,msgType:N.UpdateNode,emitEventType:this.emitEventType}]);continue}}i===K.Start?this.mainEngine.unWritable():i===K.Done&&this.mainEngine.abled(),I.length&&this.collectForLocalWorker(I)}}class Op extends ad{constructor(){super(...arguments);h(this,"emitEventType",C.RotateNode);h(this,"undoTickerId");h(this,"cacheOriginRotate",0)}collect(d){var o,u,y,Y,L;if(!this.serviceColloctor||!this.mainEngine)return;const{workIds:b,angle:Z,workState:i,viewId:m}=d,X=this.control.viewContainerManager.getView(m);if(!(X!=null&&X.displayer))return;const s=X.focusScenePath,G=[...b],p=(o=this.serviceColloctor)==null?void 0:o.storage,W=[],I=i===K.Start&&Date.now()||void 0;for(I&&(this.undoTickerId=I,this.mainEngine.internalMsgEmitter.emit("undoTickerStart",I,m));G.length;){const n=G.pop();if(!n)continue;const a=n.toString(),x=this.serviceColloctor.isLocalId(a),R=x&&this.serviceColloctor.transformKey(n)||a;let S=a;!x&&this.serviceColloctor.isOwn(S)&&(S=this.serviceColloctor.getLocalId(S));const J=p[m][s][R];if(J&&S===k){if(((u=J.selectIds)==null?void 0:u.length)===1){const F=J.selectIds[0];if(i===K.Start){const B=((y=this.serviceColloctor)==null?void 0:y.isLocalId(F))&&((Y=this.serviceColloctor)==null?void 0:Y.transformKey(F))||F,g=p[m][s][B];this.cacheOriginRotate=((L=g==null?void 0:g.opt)==null?void 0:L.rotate)||0}const w=J.updateNodeOpt||{};w.angle=(Z+this.cacheOriginRotate)%360,w.workState=i;const H={workId:n,msgType:N.UpdateNode,dataType:r.Local,updateNodeOpt:w,emitEventType:this.emitEventType,willRefreshSelector:!1,willSyncService:!0,viewId:m};i===K.Done&&(H.willRefreshSelector=!0,H.willSerializeData=!0,H.undoTickerId=this.undoTickerId,this.cacheOriginRotate=0),W.push([H,{workId:n,msgType:N.UpdateNode,emitEventType:this.emitEventType}])}continue}}i===K.Start?this.mainEngine.unWritable():i===K.Done&&this.mainEngine.abled(),W.length&&this.collectForLocalWorker(W)}}function Dp(c){switch(c){case t.Text:return xd.Text;case t.SpeechBalloon:case t.Star:case t.Ellipse:case t.Rectangle:case t.Triangle:case t.Rhombus:case t.Polygon:return xd.Shape}}class fp extends ad{constructor(){super(...arguments);h(this,"emitEventType",C.SetFontStyle)}setTextStyle(d,b,Z,i,m){const{bold:X,underline:s,lineThrough:G,italic:p,fontSize:W}=Z;if(b.toolsType){const I=Dp(b.toolsType);I===xd.Text&&(b.opt&&(X&&(b.opt.bold=X),Ld(s)&&(b.opt.underline=s),Ld(G)&&(b.opt.lineThrough=G),p&&(b.opt.italic=p),W&&(b.opt.fontSize=W)),this.control.textEditorManager.updateTextForMasterController({workId:d,opt:b.opt,viewId:i,canSync:!0,canWorker:!0},m)),xd.Shape}}collect(d){var y,Y,L,n;if(!this.serviceColloctor||!this.mainEngine)return;const{workIds:b,bold:Z,italic:i,lineThrough:m,underline:X,viewId:s,fontSize:G}=d,p=this.control.viewContainerManager.getView(s);if(!(p!=null&&p.displayer))return;const W=p.focusScenePath,I=[...b],o=this.serviceColloctor.storage,u={};for(;I.length;){const a=I.pop();if(!a)continue;const x=a.toString(),R=this.serviceColloctor.isLocalId(x),S=R?this.serviceColloctor.transformKey(a):x;let J=x;!R&&this.serviceColloctor.isOwn(J)&&(J=this.serviceColloctor.getLocalId(J));const F=o[s][W][S]||void 0;if(F){const w=F.updateNodeOpt||{};if(Z&&(w.bold=Z,u.bold=Z==="bold"),i&&(w.italic=i,u.italic=i==="italic"),Ld(m)&&(w.lineThrough=m,u.lineThrough=m),Ld(X)&&(w.underline=X,u.underline=X),G&&(w.fontSize=G,u.textSize=G),F.toolsType===t.Text&&F.opt){this.setTextStyle(J,Zd(F),w,s);continue}if(F&&J===k&&((y=F.selectIds)!=null&&y.length))for(const H of F.selectIds){const M=(Y=this.serviceColloctor)==null?void 0:Y.isLocalId(H);let B=M&&((L=this.serviceColloctor)==null?void 0:L.transformKey(H))||H;const g=o[s][W][B]||void 0;if(!M&&((n=this.serviceColloctor)!=null&&n.isOwn(B))&&(B=this.serviceColloctor.getLocalId(B)),g&&g.toolsType===t.Text&&F.opt){this.setTextStyle(B,Zd(g),w,s);continue}}}}Object.keys(u).length&&setTimeout(()=>{var a;(a=this.control.room)==null||a.setMemberState(u)},0)}}class Ap extends ad{constructor(){super(...arguments);h(this,"emitEventType",C.SetPoint);h(this,"undoTickerId")}collect(d){var n;if(!this.serviceColloctor||!this.mainEngine)return;const{workId:b,pointMap:Z,workState:i,viewId:m}=d,X=this.control.viewContainerManager.getView(m);if(!(X!=null&&X.displayer))return;const s=X.focusScenePath,G=(n=this.serviceColloctor)==null?void 0:n.storage,p=[],W=i===K.Start&&Date.now()||void 0;W&&(this.undoTickerId=W,this.mainEngine.internalMsgEmitter.emit("undoTickerStart",W,m));const I=b;if(!I)return;const o=I.toString(),u=this.serviceColloctor.isLocalId(o),y=u&&this.serviceColloctor.transformKey(I)||o;let Y=o;!u&&this.serviceColloctor.isOwn(Y)&&(Y=this.serviceColloctor.getLocalId(Y));const L=G[m][s][y];if(L&&Y===k&&L.selectIds){const a=L.updateNodeOpt||{};a.pointMap=Z,a.workState=i;const x={workId:I,msgType:N.UpdateNode,dataType:r.Local,updateNodeOpt:a,emitEventType:this.emitEventType,willRefreshSelector:!0,willSyncService:!0,viewId:m};i===K.Done&&(x.undoTickerId=this.undoTickerId),p.push([x,{workId:I,msgType:N.UpdateNode,emitEventType:this.emitEventType}])}i===K.Start?this.mainEngine.unWritable():i===K.Done&&this.mainEngine.abled(),p.length&&this.collectForLocalWorker(p)}}class qp extends ad{constructor(){super(...arguments);h(this,"emitEventType",C.SetLock)}collect(d){if(!this.serviceColloctor||!this.mainEngine)return;const{workIds:b,isLocked:Z,viewId:i}=d,m=this.control.viewContainerManager.getView(i);if(!(m!=null&&m.displayer))return;const X=m.focusScenePath,s=[...b],G=this.serviceColloctor.storage,p=[],W=Date.now();for(;s.length;){const I=s.pop();if(!I)continue;const o=I.toString(),u=this.serviceColloctor.isLocalId(o),y=u?this.serviceColloctor.transformKey(I):o;let Y=o;!u&&this.serviceColloctor.isOwn(Y)&&(Y=this.serviceColloctor.getLocalId(Y));const L=G[i][X][y]||void 0;if(L){const n=L.updateNodeOpt||{};n.isLocked=Z;const a={workId:Y,msgType:N.UpdateNode,dataType:r.Local,updateNodeOpt:n,emitEventType:this.emitEventType,willRefresh:!0,willRefreshSelector:!0,willSyncService:!0,viewId:i};p.push([a,{workId:Y,msgType:N.UpdateNode,emitEventType:this.emitEventType}])}}this.mainEngine.internalMsgEmitter.emit("undoTickerStart",W,i),p.length&&this.collectForLocalWorker(p)}}class $p extends ad{constructor(){super(...arguments);h(this,"emitEventType",C.SetShapeOpt)}collect(d){if(!this.serviceColloctor||!this.mainEngine)return;const{workIds:b,viewId:Z,...i}=d,m=this.control.viewContainerManager.getView(Z);if(!(m!=null&&m.displayer))return;const X=m.focusScenePath,s=[...b],G=this.serviceColloctor.storage,p=[];for(;s.length;){const W=s.pop();if(!W)continue;const I=W.toString(),o=this.serviceColloctor.isLocalId(I),u=o?this.serviceColloctor.transformKey(W):I;let y=I;!o&&this.serviceColloctor.isOwn(y)&&(y=this.serviceColloctor.getLocalId(y));const Y=G[Z][X][u]||void 0;if(Y){const L={...Y.updateNodeOpt,...i,willRefresh:!0};if(Y&&y===k){const n={workId:y,msgType:N.UpdateNode,dataType:r.Local,updateNodeOpt:L,emitEventType:this.emitEventType,willRefresh:!0,willRefreshSelector:!0,willSyncService:!0,viewId:Z};p.push([n,{workId:y,msgType:N.UpdateNode,emitEventType:this.emitEventType}])}}}p.length&&this.collectForLocalWorker(p)}}class j{constructor(l){h(this,"builders",new Map);this.builders=new Map(l.map(d=>[d,this.build(d)]))}build(l){switch(l){case C.TranslateNode:return new Bp;case C.ZIndexNode:return new jp;case C.ZIndexActive:return new wp;case C.CopyNode:return new vp;case C.SetColorNode:return new Pp;case C.DeleteNode:return new Ep;case C.ScaleNode:return new rp;case C.RotateNode:return new Op;case C.SetFontStyle:return new fp;case C.SetPoint:return new Ap;case C.SetLock:return new qp;case C.SetShapeOpt:return new $p}}getBuilder(l){return this.builders.get(l)}registerForMainEngine(l,d){return this.builders.forEach(b=>{b&&b.registerForMainEngine(l,d)}),this}destroy(){this.builders.forEach(l=>{l&&l.destroy()})}static emitMethod(l,d,b){ad.dispatch(l,d,b)}}class _p{constructor(){h(this,"maxLastSyncTime",500)}setCurrentToolsData(l){this.currentToolsData=l}getCurrentToolsData(){return this.currentToolsData}setCurrentLocalWorkData(l){this.currentLocalWorkData=l}getWorkId(){return this.currentLocalWorkData.workId}getWorkState(){return this.currentLocalWorkData.workState}}class lo extends _p{constructor(d){var i,m;super();h(this,"isActive",!1);h(this,"currentToolsData");h(this,"currentLocalWorkData");h(this,"control");h(this,"internalMsgEmitter");h(this,"taskBatchData",new Set);h(this,"fullWorker");h(this,"subWorker");h(this,"methodBuilder");h(this,"zIndexNodeMethod");h(this,"subWorkerDrawCount",0);h(this,"wokerDrawCount",0);h(this,"maxDrawCount",0);h(this,"cacheDrawCount",0);h(this,"reRenders",[]);h(this,"localWorkViewId");h(this,"localPointsBatchData",[]);h(this,"tasksqueue",new Map);h(this,"useTasksqueue",!1);h(this,"useTasksClockId");h(this,"mianTasksqueueCount");h(this,"workerTasksqueueCount");h(this,"snapshotMap",new Map);h(this,"boundingRectMap",new Map);h(this,"clearAllResolve");h(this,"delayWorkStateToDone");h(this,"delayWorkStateToDoneResolve");h(this,"undoTickerId");h(this,"animationId");const{control:b,internalMsgEmitter:Z}=d;this.control=b,this.maxLastSyncTime=(((m=(i=this.control.pluginOptions)==null?void 0:i.syncOpt)==null?void 0:m.interval)||this.maxLastSyncTime)*.5,this.internalMsgEmitter=Z,this.currentLocalWorkData={workState:K.Pending}}get viewContainerManager(){return this.control.viewContainerManager}get collector(){return this.control.collector}get isRunSubWork(){var b;const d=(b=this.currentToolsData)==null?void 0:b.toolsType;return d===t.Pencil||d===t.LaserPen||d===t.Arrow||d===t.Straight||d===t.Ellipse||d===t.Rectangle||d===t.Star||d===t.Polygon||d===t.SpeechBalloon}get isCanDrawWork(){var b;const d=(b=this.currentToolsData)==null?void 0:b.toolsType;return d===t.Pencil||d===t.LaserPen||d===t.Arrow||d===t.Straight||d===t.Ellipse||d===t.Rectangle||d===t.Star||d===t.Polygon||d===t.SpeechBalloon||d===t.Triangle||d===t.Rhombus}get isUseZIndex(){var b;const d=(b=this.currentToolsData)==null?void 0:b.toolsType;return d===t.Pencil||d===t.Arrow||d===t.Straight||d===t.Ellipse||d===t.Rectangle||d===t.Star||d===t.Polygon||d===t.SpeechBalloon||d===t.Text||d===t.Image}get isCanRecordUndoRedo(){var b;const d=(b=this.currentToolsData)==null?void 0:b.toolsType;return d===t.Pencil||d===t.Eraser||d===t.Arrow||d===t.Straight||d===t.Ellipse||d===t.Rectangle||d===t.Star||d===t.Polygon||d===t.SpeechBalloon||d===t.Text||d===t.Image}get isCanSentCursor(){var b;const d=(b=this.currentToolsData)==null?void 0:b.toolsType;return d===t.Pencil||d===t.Text||d===t.LaserPen||d===t.Arrow||d===t.Straight||d===t.Ellipse||d===t.Rectangle||d===t.Star||d===t.Polygon||d===t.SpeechBalloon||d===t.Triangle||d===t.Rhombus}init(){this.on(),this.internalMsgEmitterListener(),this.isActive=!0}on(){this.fullWorker=new gp,this.subWorker=new Up,this.fullWorker.onmessage=d=>{if(d.data){const{render:b,sp:Z,drawCount:i,workerTasksqueueCount:m}=d.data;if(m&&(this.workerTasksqueueCount=m),Z!=null&&Z.length&&this.collectorSyncData(Z),!i&&(b!=null&&b.length)){this.viewContainerManager.render(b);return}i&&(this.wokerDrawCount=i,this.wokerDrawCount<1/0?this.maxDrawCount=Math.max(this.maxDrawCount,this.wokerDrawCount):this.maxDrawCount=0,b!=null&&b.length&&(this.viewContainerManager.render(b),this.wokerDrawCount<this.subWorkerDrawCount&&(this.reRenders.forEach(X=>{X.isUnClose=!1}),this.viewContainerManager.render(this.reRenders),this.reRenders.length=0)))}},this.subWorker.onmessage=d=>{if(d.data){const{render:b,drawCount:Z,sp:i}=d.data;if(i!=null&&i.length&&this.collectorSyncData(i),!Z&&(b!=null&&b.length)){this.viewContainerManager.render(b);return}Z&&(this.subWorkerDrawCount=Z,this.wokerDrawCount<1/0&&(this.maxDrawCount=Math.max(this.maxDrawCount,this.subWorkerDrawCount)),b!=null&&b.length&&(this.subWorkerDrawCount>this.wokerDrawCount&&(b.forEach(m=>m.isUnClose=!0),this.reRenders.push(...b)),this.wokerDrawCount<1/0&&this.viewContainerManager.render(b)))}}}collectorSyncData(d){var Z,i;let b=!1;for(const m of d){const{type:X,selectIds:s,opt:G,selectRect:p,strokeColor:W,fillColor:I,willSyncService:o,isSync:u,undoTickerId:y,imageBitmap:Y,canvasHeight:L,canvasWidth:n,rect:a,op:x,canTextEdit:R,points:S,selectorColor:J,canRotate:F,scaleType:w,textOpt:H,toolsType:M,workId:B,viewId:g,dataType:_,canLock:q,isLocked:$,shapeOpt:O,toolsTypes:f}=m;if(!g){console.error("collectorSyncData",m);return}const A=m.scenePath||this.viewContainerManager.getCurScenePath(g);switch(X){case N.Select:{const e=s!=null&&s.length?{...p,selectIds:s,canvasHeight:L,canvasWidth:n,points:S}:void 0;e&&(G!=null&&G.strokeColor)&&(e.selectorColor=G.strokeColor),e&&J&&(e.selectorColor=J),e&&W&&(e.strokeColor=W),e&&(G!=null&&G.fillColor)&&(e.fillColor=G.fillColor),e&&I&&(e.fillColor=I),e&&Ld(F)&&(e.canRotate=F),e&&w&&(e.scaleType=w),e&&R&&(e.canTextEdit=R),e&&H&&(e.textOpt=H),e&&Ld(q)&&(e.canLock=q),e&&Ld($)&&(e.isLocked=$),e&&O&&(e.shapeOpt=O),e&&f&&(e.toolsTypes=f),g&&this.viewContainerManager.showFloatBar(g,!!e,e),o&&((Z=this.collector)==null||Z.dispatch({type:X,selectIds:s,opt:G,isSync:u,viewId:g,scenePath:A}));break}case N.Snapshot:if(Y&&A){const e=this.snapshotMap.get(A);e&&e(Y)}break;case N.BoundingBox:if(a&&A){const e=this.boundingRectMap.get(A);e&&e(a)}break;case N.Cursor:x&&this.control.cursor.collectServiceCursor({...m});break;case N.Clear:g&&this.viewContainerManager.showFloatBar(g,!1),g&&this.clearAllResolve&&this.clearAllResolve(g);break;case N.TextUpdate:if(M===t.Text&&B&&g){const e=this.viewContainerManager.transformToOriginPoint((G==null?void 0:G.boxPoint)||[0,0],g),U=(G==null?void 0:G.boxSize)||[0,0],P=(i=this.viewContainerManager.getView(g))==null?void 0:i.cameraOpt;G?this.control.textEditorManager.updateTextForWorker({x:e[0],y:e[1],w:U[0],h:U[1],scale:(P==null?void 0:P.scale)||1,workId:B,opt:G,dataType:_,viewId:g,canSync:o||!1,canWorker:!1}):this.control.textEditorManager.delete(B,o||!1,!1)}break;case N.GetTextActive:M===t.Text&&B&&g&&this.control.textEditorManager.updateTextForWorker({workId:B,isActive:!0,viewId:g,dataType:r.Local,canWorker:!1,canSync:!0},Date.now());break;default:b=!0;break}!b&&y&&this.internalMsgEmitter.emit("undoTickerEnd",y,g)}b&&fd(()=>{this.collectorAsyncData(d)},this.maxLastSyncTime)}collectorAsyncData(d){var b,Z,i,m;for(const X of d){const{type:s,op:G,workId:p,index:W,removeIds:I,ops:o,opt:u,updateNodeOpt:y,toolsType:Y,isSync:L,undoTickerId:n,viewId:a}=X;if(!a){console.error("collectorAsyncData",X);return}const x=X.scenePath||this.viewContainerManager.getCurScenePath(a);switch(s){case N.DrawWork:{(b=this.collector)==null||b.dispatch({type:s,op:G,workId:p,index:W,isSync:L,viewId:a,scenePath:x});break}case N.FullWork:{(Z=this.collector)==null||Z.dispatch({type:s,ops:o,workId:p,updateNodeOpt:y,opt:u,toolsType:Y,isSync:L,viewId:a,scenePath:x});break}case N.UpdateNode:{(i=this.collector)==null||i.dispatch({type:s,updateNodeOpt:y,workId:p,opt:u,ops:o,op:G,isSync:L,viewId:a,scenePath:x});break}case N.RemoveNode:{I&&this.control.textEditorManager.deleteBatch(I,!1,!1),(m=this.collector)==null||m.dispatch({type:s,removeIds:I,isSync:L,viewId:a,scenePath:x});break}}n&&this.internalMsgEmitter.emit("undoTickerEnd",n,a)}}async onLocalEventEnd(d,b){var s;const Z=this.currentLocalWorkData.workState,i=this.viewContainerManager.getView(b);if(!i)return;const{focusScenePath:m,cameraOpt:X}=i;if(Z===K.Start||Z===K.Doing){const G=this.viewContainerManager.transformToScenePoint(d,b);this.pushPoint(G),this.setCurrentLocalWorkData({...this.currentLocalWorkData,workState:K.Done}),await new Promise(p=>{this.delayWorkStateToDone=setTimeout(()=>{var I,o;this.delayWorkStateToDone=void 0,this.runAnimation();const W=(I=this.currentLocalWorkData.workId)==null?void 0:I.toString();W&&m&&this.control.runEffectWork(()=>{var u;this.setShapeSelectorByWorkId(W,b),((u=this.currentToolsData)==null?void 0:u.toolsType)===t.Selector&&this.viewContainerManager.activeFloatBar(b)}),this.delayWorkStateToDoneResolve=p,((o=this.currentToolsData)==null?void 0:o.toolsType)===t.Selector&&this.viewContainerManager.activeFloatBar(b)},0)}).then(()=>{this.delayWorkStateToDoneResolve=void 0})}else if(((s=this.currentToolsData)==null?void 0:s.toolsType)===t.Text){const G=this.viewContainerManager.transformToScenePoint(d,b);if(this.localPointsBatchData[0]===G[0]&&this.localPointsBatchData[1]===G[1]){const p=this.currentToolsData.toolsOpt;p.workState=K.Doing,p.boxPoint=G,p.boxSize=[p.fontSize,p.fontSize],this.control.textEditorManager.checkEmptyTextBlur(),this.control.textEditorManager.createTextForMasterController({workId:Date.now().toString(),x:d[0],y:d[1],scale:(X==null?void 0:X.scale)||1,opt:p,type:xd.Text,isActive:!0,viewId:b,scenePath:m},Date.now())}this.clearLocalPointsBatchData()}}onLocalEventDoing(d,b){const Z=this.currentLocalWorkData.workState;if(Z===K.Start&&this.setCurrentLocalWorkData({...this.currentLocalWorkData,workState:K.Doing}),this.delayWorkStateToDone,Z===K.Doing||this.delayWorkStateToDone){const i=this.viewContainerManager.transformToScenePoint(d,b);this.pushPoint(i),this.delayWorkStateToDone,!this.delayWorkStateToDone&&this.runAnimation();return}this.hoverCursor(d,b)}onLocalEventStart(d,b){var X,s,G,p,W,I,o;this.viewContainerManager.focuedViewId!==b&&this.viewContainerManager.setFocuedViewId(b),this.clearLocalPointsBatchData();const Z=this.viewContainerManager.transformToScenePoint(d,b);if(this.pushPoint(Z),((X=this.currentToolsData)==null?void 0:X.toolsType)===t.Text)return;this.control.textEditorManager.checkEmptyTextBlur();const i=((s=this.currentToolsData)==null?void 0:s.toolsType)===t.Selector?k:Date.now(),m=this.setZIndex(b);if(this.setCurrentLocalWorkData({workId:i,workState:K.Start,toolsOpt:m,viewId:b,undoTickerId:this.isCanRecordUndoRedo&&i||void 0}),this.isCanRecordUndoRedo&&this.internalMsgEmitter.emit("undoTickerStart",i,b),this.maxDrawCount=0,this.cacheDrawCount=0,this.wokerDrawCount=0,this.subWorkerDrawCount=0,this.reRenders.length=0,i&&m&&((G=this.currentToolsData)!=null&&G.toolsType)&&this.prepareOnceWork({workId:i,toolsOpt:m,viewId:b},(p=this.currentToolsData)==null?void 0:p.toolsType),this.isCanDrawWork){const u=this.viewContainerManager.getCurScenePath(b);(I=this.collector)==null||I.dispatch({type:N.CreateWork,workId:i,toolsType:(W=this.currentToolsData)==null?void 0:W.toolsType,opt:m,viewId:b,scenePath:u}),u&&this.blurSelector(b,u)}else((o=this.currentToolsData)==null?void 0:o.toolsType)===t.Selector&&this.viewContainerManager.unActiveFloatBar(b);this.consume()}pushPoint(d){this.localPointsBatchData.push(d[0],d[1])}correctStorage(d,b,Z){var s;const i=new Map,m=[];Object.keys(d).forEach(G=>{var W,I;const p=(I=(W=d[G])==null?void 0:W.opt)==null?void 0:I.zIndex;md(p)&&m.push([G,p])});const X=m.length&&((s=this.zIndexNodeMethod)==null?void 0:s.correct(m))||[];this.zIndexNodeMethod&&X.length&&(this.zIndexNodeMethod.setMinZIndex(X[0][1]||0,b),this.zIndexNodeMethod.setMaxZIndex(X[X.length-1][1]||0,b));for(const[G,p]of X){if(!d[G])continue;const W=d[G];W.opt&&md(W.opt.zIndex)&&W.opt.zIndex!==p&&(W.opt.zIndex=p,i.set(G,W))}return i.size&&i.forEach((G,p)=>{var W;console.log("key",G),(W=this.collector)==null||W.updateValue(p,G,{viewId:b,scenePath:Z,isSync:!0}),d[p]=G}),d}async originalEventLintener(d,b,Z){if(this.isAbled())switch(d){case K.Start:this.setLocalWorkViewId(Z),Z&&this.onLocalEventStart(b,Z);break;case K.Doing:Z&&Z===this.getLocalWorkViewId()&&this.onLocalEventDoing(b,Z);break;case K.Done:Z&&Z===this.getLocalWorkViewId()&&await this.onLocalEventEnd(b,Z);break}}getLocalWorkViewId(){return this.localWorkViewId}setLocalWorkViewId(d){this.localWorkViewId=d}setCurrentToolsData(d){var m,X,s;const b=d.toolsType,Z=((m=this.currentToolsData)==null?void 0:m.toolsType)!==d.toolsType;super.setCurrentToolsData(d);const i=(X=this.viewContainerManager)==null?void 0:X.getAllViews();if(Z){for(const G of i)if(G){const{id:p,focusScenePath:W}=G;Z&&p&&W&&((s=this.collector)!=null&&s.hasSelector(p,W)&&this.blurSelector(p,W),this.control.textEditorManager.checkEmptyTextBlur())}this.taskBatchData.add({msgType:N.UpdateTools,dataType:r.Local,toolsType:b,opt:{...d.toolsOpt,syncUnitTime:this.maxLastSyncTime},isRunSubWork:this.isRunSubWork,viewId:nV}),this.runAnimation()}}setCurrentLocalWorkData(d){super.setCurrentLocalWorkData(d);const{workId:b}=d;(!this.isAbled()||!b)&&this.clearLocalPointsBatchData()}prepareOnceWork(d,b){const{workId:Z,toolsOpt:i,viewId:m}=d;this.taskBatchData.add({msgType:N.CreateWork,workId:Z,toolsType:b,opt:{...i,syncUnitTime:this.maxLastSyncTime},dataType:r.Local,isRunSubWork:this.isRunSubWork,viewId:m}),this.runAnimation()}createViewWorker(d,b){const{offscreenCanvasOpt:Z,layerOpt:i,dpr:m,cameraOpt:X}=b;this.taskBatchData.add({msgType:N.Init,dataType:r.Local,viewId:d,offscreenCanvasOpt:Z,layerOpt:i,dpr:m,cameraOpt:X,isRunSubWork:!0,isSafari:navigator.userAgent.indexOf("Safari")!==-1&&navigator.userAgent.indexOf("Chrome")===-1}),this.runAnimation()}destroyViewWorker(d,b=!1){var Z;this.getLocalWorkViewId()===d&&this.setLocalWorkViewId(void 0),this.zIndexNodeMethod&&this.zIndexNodeMethod.clearZIndex(d),this.taskBatchData.add({msgType:N.Destroy,dataType:r.Local,viewId:d,isRunSubWork:!0}),this.runAnimation(),b||(Z=this.collector)==null||Z.dispatch({type:N.Clear,viewId:d})}onServiceDerive(d,b){var o,u,y,Y;const{newValue:Z,oldValue:i,viewId:m,scenePath:X}=b,s=Zd(Z)||{},G=d;let p=s.type;if(!Z&&i&&(p=N.RemoveNode,i.toolsType===t.LaserPen))return;const W=(o=this.viewContainerManager.getView(m))==null?void 0:o.focusScenePath;if(W&&W!==X)return;if(p&&G){const L=s;if(L.workId=(u=this.collector)!=null&&u.isOwn(G)?(y=this.collector)==null?void 0:y.getLocalId(G):G,L.msgType=p,L.dataType=r.Service,L.viewId=m,L.scenePath=X,L.selectIds&&(L.selectIds=L.selectIds.map(n=>{var a,x;return(a=this.collector)!=null&&a.isOwn(n)?(x=this.collector)==null?void 0:x.getLocalId(n):n})),L&&L.toolsType===t.Text||(i==null?void 0:i.toolsType)===t.Text){this.control.textEditorManager.onServiceDerive(L);return}this.taskBatchData.add(L)}this.runAnimation();const I=b.newValue&&((Y=b.newValue.opt)==null?void 0:Y.zIndex);if(this.zIndexNodeMethod&&md(I)){const L=this.zIndexNodeMethod.getMinZIndex(m);this.zIndexNodeMethod.getMaxZIndex(m)<I&&this.zIndexNodeMethod.setMaxZIndex(I,m),L>I&&this.zIndexNodeMethod.setMinZIndex(I,m)}}pullServiceData(d,b){var i,m,X,s;let Z=(i=this.collector)==null?void 0:i.getStorageData(d,b);if(Z){Z=this.correctStorage(Z,d,b);const G=Object.keys(Z);for(const p of G){const W=(m=Z[p])==null?void 0:m.type;if(W&&p){const I=Z[p];if(I.workId=(X=this.collector)!=null&&X.isOwn(p)?(s=this.collector)==null?void 0:s.getLocalId(p):p,I.msgType=W,I.dataType=r.Service,I.viewId=d,I.scenePath=b,I.useAnimation=!1,I.selectIds&&(I.selectIds=I.selectIds.map(o=>{var u,y;return(u=this.collector)!=null&&u.isOwn(o)?(y=this.collector)==null?void 0:y.getLocalId(o):o})),I.toolsType===t.Text){this.control.textEditorManager.onServiceDerive(I);continue}this.taskBatchData.add(I)}this.internalMsgEmitter.emit("excludeIds",G,d)}this.runAnimation()}}runAnimation(){this.animationId||(this.animationId=requestAnimationFrame(this.consume.bind(this)))}consume(){this.animationId=void 0;const{workState:d,viewId:b,workId:Z,undoTickerId:i}=this.currentLocalWorkData;if(!this.isAbled()&&this.clearLocalPointsBatchData(),this.tasksqueue.size){const m=this.consumeQueue();m.size&&(this.post(m),this.tasksqueue.clear())}else if(!this.delayWorkStateToDone){if(d!==K.Pending&&this.localPointsBatchData.length&&b){let m=!1;this.wokerDrawCount!==1/0&&this.wokerDrawCount<=this.subWorkerDrawCount&&this.cacheDrawCount<this.maxDrawCount&&(m=!0),this.maxDrawCount||(m=!0),m&&(this.taskBatchData.add({op:this.localPointsBatchData.map(X=>X),workState:d,workId:Z,dataType:r.Local,msgType:N.DrawWork,isRunSubWork:this.isRunSubWork,undoTickerId:d===K.Done&&i||void 0,viewId:b,scenePath:b&&this.viewContainerManager.getCurScenePath(b)}),this.delayWorkStateToDoneResolve&&d===K.Done&&this.delayWorkStateToDoneResolve(!0),this.clearLocalPointsBatchData(),this.cacheDrawCount=this.maxDrawCount)}this.taskBatchData.size&&(this.post(this.taskBatchData),this.taskBatchData.clear(),i&&d===K.Done&&this.setCurrentLocalWorkData({...this.currentLocalWorkData,undoTickerId:void 0}))}(this.tasksqueue.size||this.taskBatchData.size||this.localPointsBatchData.length)&&(this.animationId=requestAnimationFrame(this.consume.bind(this)))}unWritable(){this.setCurrentLocalWorkData({workState:K.Unwritable,workId:void 0})}abled(){this.setCurrentLocalWorkData({workState:K.Pending,workId:void 0})}isAbled(){return this.currentLocalWorkData.workState!==K.Unwritable}post(d){this.fullWorker.postMessage(d);const b=new Set;for(const Z of d.values()){const i=Z.msgType;(i===N.Init||i===N.Clear||i===N.Destroy||i===N.UpdateCamera||Z.isRunSubWork)&&b.add(Z)}b.size&&this.subWorker.postMessage(b)}destroy(){this.unWritable(),this.taskBatchData.clear(),this.clearLocalPointsBatchData(),this.fullWorker.terminate(),this.subWorker.terminate(),this.isActive=!1}updateNode(d,b,Z,i){this.taskBatchData.add({msgType:N.UpdateNode,workId:d,updateNodeOpt:b,viewId:Z,scenePath:i,dataType:r.Local}),this.runAnimation()}updateCamera(d,b){this.useTasksqueue||(this.useTasksqueue=!0,this.mianTasksqueueCount=1,this.workerTasksqueueCount=1),this.useTasksqueue&&(this.tasksqueue.set(d,{msgType:N.UpdateCamera,dataType:r.Local,cameraOpt:{...b,width:Math.floor(b.width),height:Math.floor(b.height)},isRunSubWork:!0,viewId:d}),this.control.textEditorManager.onCameraChange(b,d),this.runAnimation(),this.useTasksClockId&&clearTimeout(this.useTasksClockId),this.useTasksClockId=setTimeout(()=>{this.useTasksClockId=void 0,this.tasksqueue.clear(),this.useTasksqueue=!1,this.mianTasksqueueCount=void 0,this.workerTasksqueueCount=void 0},this.maxLastSyncTime))}consumeQueue(){const d=new Set;return this.mianTasksqueueCount&&this.workerTasksqueueCount&&this.mianTasksqueueCount===this.workerTasksqueueCount&&(this.mianTasksqueueCount++,d.add({msgType:N.TasksQueue,dataType:r.Local,isRunSubWork:!0,mainTasksqueueCount:this.mianTasksqueueCount,tasksqueue:this.tasksqueue,viewId:""})),d}async clearViewScenePath(d,b){var Z;if(this.control.textEditorManager.clear(d,b),this.taskBatchData.add({dataType:r.Local,msgType:N.Clear,viewId:d}),this.runAnimation(),!b){const i=this.viewContainerManager.getCurScenePath(d);(Z=this.collector)==null||Z.dispatch({type:N.Clear,viewId:d,scenePath:i})}this.zIndexNodeMethod&&this.zIndexNodeMethod.clearZIndex(d),this.clearLocalPointsBatchData(),await new Promise(i=>{this.clearAllResolve=i}).then(()=>{this.clearAllResolve=void 0})}internalMsgEmitterListener(){var d;this.methodBuilder=new j([C.CopyNode,C.SetColorNode,C.DeleteNode,C.RotateNode,C.ScaleNode,C.TranslateNode,C.ZIndexActive,C.ZIndexNode,C.RotateNode,C.SetFontStyle,C.SetPoint,C.SetLock,C.SetShapeOpt]).registerForMainEngine(v.MainEngine,this.control),this.zIndexNodeMethod=(d=this.methodBuilder)==null?void 0:d.getBuilder(C.ZIndexNode)}setZIndex(d){const b=this.currentToolsData&&Zd(this.currentToolsData.toolsOpt);return b&&this.zIndexNodeMethod&&this.isUseZIndex&&(this.zIndexNodeMethod.addMaxLayer(d),b.zIndex=this.zIndexNodeMethod.getMaxZIndex(d)),b}clearLocalPointsBatchData(){this.localPointsBatchData.length=0}hoverCursor(d,b){var Z;if(((Z=this.currentToolsData)==null?void 0:Z.toolsType)===t.Selector){const i=this.viewContainerManager.transformToScenePoint(d,b),m={msgType:N.CursorHover,dataType:r.Local,point:i,toolsType:this.currentToolsData.toolsType,opt:this.currentToolsData.toolsOpt,isRunSubWork:!1,viewId:b};this.queryTaskBatchData({msgType:N.CursorHover,dataType:r.Local,toolsType:this.currentToolsData.toolsType,viewId:b}).forEach(X=>{this.taskBatchData.delete(X)}),this.taskBatchData.add(m),this.runAnimation()}}sendCursorEvent(d,b){if(!this.currentLocalWorkData||this.currentLocalWorkData.workState===K.Unwritable||!this.currentToolsData||!this.isCanSentCursor)return;let Z=[void 0,void 0];this.currentToolsData&&(this.isCanDrawWork||this.currentToolsData.toolsType===t.Text)&&this.currentLocalWorkData.workState!==K.Start&&this.currentLocalWorkData.workState!==K.Doing&&(Z=d,this.control.cursor.sendEvent(Z,b))}getBoundingRect(d){var Z,i;if(!((Z=this.boundingRectMap)==null?void 0:Z.get(d))){const m=(i=this.collector)==null?void 0:i.getScenePathData(d);if(!m)return;if(Object.keys(m).forEach(X=>{var s;((s=this.collector)==null?void 0:s.getLocalId(X))===k&&delete m[X]}),Object.keys(m).length&&this.viewContainerManager.mainView&&this.viewContainerManager.mainView.cameraOpt){const X={msgType:N.BoundingBox,dataType:r.Local,scenePath:d,scenes:m,cameraOpt:{...this.viewContainerManager.mainView.cameraOpt},isRunSubWork:!0,viewId:this.viewContainerManager.mainView.id};return this.taskBatchData.add(X),this.runAnimation(),new Promise(s=>{this.boundingRectMap.set(d,s)}).then(s=>(this.boundingRectMap.delete(d),s))}}}getSnapshot(d,b,Z,i){var X,s,G,p,W,I;if(!((X=this.snapshotMap)==null?void 0:X.get(d))){const o=(s=this.collector)==null?void 0:s.getViewIdBySecenPath(d);if(!o)return;const u=(G=this.collector)==null?void 0:G.getStorageData(o,d);if(!u)return;if(Object.keys(u).forEach(y=>{var Y;((Y=this.collector)==null?void 0:Y.getLocalId(y))===k&&delete u[y]}),Object.keys(u).length){const y=this.viewContainerManager.getView(o)||this.viewContainerManager.focuedView;if(!y)return;const Y=b||((p=y.cameraOpt)==null?void 0:p.width),L=Z||((W=y.cameraOpt)==null?void 0:W.height),n={msgType:N.Snapshot,dataType:r.Local,scenePath:d,scenes:u,w:Y,h:L,cameraOpt:i&&{...i,width:Y,height:L}||y.cameraOpt,isRunSubWork:!0,viewId:o,maxZIndex:(I=this.zIndexNodeMethod)==null?void 0:I.getMaxZIndex(o)};return this.taskBatchData.add(n),this.runAnimation(),new Promise(a=>{this.snapshotMap.set(d,a)}).then(a=>(this.snapshotMap.delete(d),a))}}}queryTaskBatchData(d){const b=[];if(d)for(const Z of this.taskBatchData.values()){let i=!0;for(const[m,X]of Object.entries(d))if(Z[m]!==X){i=!1;break}i&&b.push(Z)}return b}insertImage(d){const b=this.viewContainerManager.mainView,Z=b==null?void 0:b.id,i=b==null?void 0:b.focusScenePath;if(Z&&i){this.setCurrentLocalWorkData({...this.currentLocalWorkData,undoTickerId:Date.now()}),yd.InternalMsgEmitter.emit("undoTickerStart",this.undoTickerId,Z);const m={...d};this.zIndexNodeMethod&&(this.zIndexNodeMethod.addMaxLayer(Z),m.zIndex=this.zIndexNodeMethod.getMaxZIndex(Z)),this.taskBatchData.add({msgType:N.FullWork,dataType:r.Local,toolsType:t.Image,workId:d.uuid,opt:m,viewId:Z,undoTickerId:d.src&&this.undoTickerId||void 0,willRefresh:!0,willSyncService:!0}),this.runAnimation()}}lockImage(d,b){var X,s;const Z=this.viewContainerManager.mainView,i=Z==null?void 0:Z.id,m=Z==null?void 0:Z.focusScenePath;if(i&&m&&this.collector){const G=this.collector.getStorageData(i,m);if(!G)return;for(const[p,W]of Object.entries(G))if(W&&W.toolsType===t.Image&&W.opt.uuid===d){const I=Date.now();yd.InternalMsgEmitter.emit("undoTickerStart",I,i);const o=(X=this.collector)!=null&&X.isOwn(p)?(s=this.collector)==null?void 0:s.getLocalId(p):p,u={...W.opt,locked:b};this.taskBatchData.add({msgType:N.FullWork,dataType:r.Local,toolsType:t.Image,workId:o,opt:u,viewId:i,undoTickerId:I,willRefresh:!0,willSyncService:!0}),this.runAnimation();return}}}completeImageUpload(d,b){var X,s;const Z=this.viewContainerManager.mainView,i=Z==null?void 0:Z.id,m=Z==null?void 0:Z.focusScenePath;if(i&&m&&this.collector){const G=this.collector.getStorageData(i,m);if(!G)return;for(const[p,W]of Object.entries(G))if(W&&W.toolsType===t.Image&&W.opt.uuid===d){const I=(X=this.collector)!=null&&X.isOwn(p)?(s=this.collector)==null?void 0:s.getLocalId(p):p,o={...W.opt,src:b};this.taskBatchData.add({msgType:N.FullWork,dataType:r.Local,toolsType:t.Image,workId:I,opt:o,viewId:i,undoTickerId:this.undoTickerId,willRefresh:!0,willSyncService:!0}),this.runAnimation();break}}}getImagesInformation(d){const b=[];if(this.collector){const Z=this.collector.getScenePathData(d);if(!Z)return b;for(const i of Object.values(Z))if(i&&i.toolsType===t.Image){const m=i.opt;b.push({uuid:m.uuid,centerX:m.centerX,centerY:m.centerY,width:m.width,height:m.height,locked:m.locked,uniformScale:m.uniformScale,crossOrigin:m.crossOrigin})}}return b}setShapeSelectorByWorkId(d,b,Z){this.taskBatchData.add({workId:k,selectIds:[d],msgType:N.Select,dataType:r.Service,viewId:b,willSyncService:!0,undoTickerId:Z}),this.runAnimation()}blurSelector(d,b,Z){this.taskBatchData.add({workId:k,selectIds:[],msgType:N.Select,dataType:r.Service,viewId:d,scenePath:b,undoTickerId:Z}),this.runAnimation()}}var bo=Sd,Zo=function(){return bo.Date.now()},co=Zo,io=/\s/;function mo(c){for(var l=c.length;l--&&io.test(c.charAt(l)););return l}var Xo=mo,so=Xo,Go=/^\s+/;function Wo(c){return c&&c.slice(0,so(c)+1).replace(Go,"")}var Vo=Wo,po=Pd,oo=kd,Io="[object Symbol]";function Lo(c){return typeof c=="symbol"||oo(c)&&po(c)==Io}var ho=Lo,uo=Vo,Ob=gd,ao=ho,Db=NaN,to=/^[-+]0x[0-9a-f]+$/i,yo=/^0b[01]+$/i,no=/^0o[0-7]+$/i,Yo=parseInt;function Ro(c){if(typeof c=="number")return c;if(ao(c))return Db;if(Ob(c)){var l=typeof c.valueOf=="function"?c.valueOf():c;c=Ob(l)?l+"":l}if(typeof c!="string")return c===0?c:+c;c=uo(c);var d=yo.test(c);return d||no.test(c)?Yo(c.slice(2),d?2:8):to.test(c)?Db:+c}var xo=Ro,So=gd,Nl=co,fb=xo,Ko="Expected a function",Co=Math.max,eo=Math.min;function Jo(c,l,d){var b,Z,i,m,X,s,G=0,p=!1,W=!1,I=!0;if(typeof c!="function")throw new TypeError(Ko);l=fb(l)||0,So(d)&&(p=!!d.leading,W="maxWait"in d,i=W?Co(fb(d.maxWait)||0,l):i,I="trailing"in d?!!d.trailing:I);function o(S){var J=b,F=Z;return b=Z=void 0,G=S,m=c.apply(F,J),m}function u(S){return G=S,X=setTimeout(L,l),p?o(S):m}function y(S){var J=S-s,F=S-G,w=l-J;return W?eo(w,i-F):w}function Y(S){var J=S-s,F=S-G;return s===void 0||J>=l||J<0||W&&F>=i}function L(){var S=Nl();if(Y(S))return n(S);X=setTimeout(L,y(S))}function n(S){return X=void 0,I&&b?o(S):(b=Z=void 0,m)}function a(){X!==void 0&&clearTimeout(X),G=0,b=s=Z=X=void 0}function x(){return X===void 0?m:n(Nl())}function R(){var S=Nl(),J=Y(S);if(b=arguments,Z=this,s=S,J){if(X===void 0)return u(s);if(W)return clearTimeout(X),X=setTimeout(L,l),o(s)}return X===void 0&&(X=setTimeout(L,l)),m}return R.cancel=a,R.flush=x,R}var kZ=Jo;const Ab=vd(kZ);var No=kZ,To=gd,Fo="Expected a function";function zo(c,l,d){var b=!0,Z=!0;if(typeof c!="function")throw new TypeError(Fo);return To(d)&&(b="leading"in d?!!d.leading:b,Z="trailing"in d?!!d.trailing:Z),No(c,l,{leading:b,maxWait:l,trailing:Z})}var Ho=zo;const cd=vd(Ho);class ko{constructor(l){h(this,"internalMsgEmitter");h(this,"control");h(this,"roomHotkeyCheckers");h(this,"tmpCopyStore",new Map);h(this,"tmpCopyCoordInfo");var Z;const{control:d,internalMsgEmitter:b}=l;this.control=d,this.internalMsgEmitter=b,this.roomHotkeyCheckers=((Z=this.control.room)==null?void 0:Z.viewsParams.hotKeys.nodes)||[]}get isUseSelf(){var l;return((l=this.control.room)==null?void 0:l.disableDeviceInputs)||!1}get isSelector(){var l;return((l=this.control.worker.currentToolsData)==null?void 0:l.toolsType)===t.Selector}get collector(){return this.control.collector}get mainEngine(){return this.control.worker}get keyboardKind(){return/^Mac/i.test(navigator.platform)?"mac":"windows"}getEventKey(l){switch(l.type){case"keydown":return"KeyDown"}return"KeyUp"}onActiveHotkey(l){var Z,i,m;console.log("onActiveHotkey---sdk",l);const d=this.control.viewContainerManager.focuedViewId,b=(Z=this.control.viewContainerManager.focuedView)==null?void 0:Z.focusScenePath;if(d&&b)switch(l){case"delete":this.isSelector&&((i=this.collector)!=null&&i.hasSelector(d,b))&&j.emitMethod(v.MainEngine,C.DeleteNode,{workIds:[k],viewId:d});break;case"copy":this.isSelector&&((m=this.collector)!=null&&m.hasSelector(d,b))&&this.copySelectorToTemp(d,b);break;case"paste":this.tmpCopyStore.size&&this.pasteTempToFocusView(d,b);break}(l==="changeToPencil"||l==="redo"||l==="undo")&&this.onSelfActiveHotkey(l)}colloctHotkey(l){if(this.isUseSelf){const d=this.checkHotkey(l);d&&this.onSelfActiveHotkey(d)}}onSelfActiveHotkey(l){switch(console.log("onActiveHotkey---self",l),l){case"changeToPencil":this.setMemberState({currentApplianceName:E.pencil,useNewPencil:!0});break;case"changeToArrow":this.setMemberState({currentApplianceName:E.arrow});break;case"changeToClick":this.setMemberState({currentApplianceName:E.clicker});break;case"changeToEllipse":this.setMemberState({currentApplianceName:E.ellipse});break;case"changeToEraser":this.setMemberState({currentApplianceName:E.eraser,isLine:!0});break;case"changeToHand":this.setMemberState({currentApplianceName:E.hand});break;case"changeToLaserPointer":this.setMemberState({currentApplianceName:E.laserPointer});break;case"changeToSelector":this.setMemberState({currentApplianceName:E.selector});break;case"changeToRectangle":this.setMemberState({currentApplianceName:E.rectangle});break;case"changeToStraight":this.setMemberState({currentApplianceName:E.straight});break;case"redo":this.control.room&&!this.control.room.disableSerialization&&this.control.viewContainerManager.redo();break;case"undo":this.control.room&&!this.control.room.disableSerialization&&this.control.viewContainerManager.undo();break;case"changeToText":this.setMemberState({currentApplianceName:E.text});break}}checkHotkey(l){for(const d of this.roomHotkeyCheckers){const{kind:b,checker:Z}=d;if(Z({nativeEvent:l,kind:this.getEventKey(l),key:l.key,altKey:l.altKey,ctrlKey:l.ctrlKey,shiftKey:l.shiftKey},this.keyboardKind))return b}}copySelectorToTemp(l,d){var G,p;const b=this.control.viewContainerManager.getView(l),Z=(p=(G=this.mainEngine)==null?void 0:G.methodBuilder)==null?void 0:p.getBuilder(C.CopyNode);if(!b||!this.collector||!Z)return;const i=this.collector.transformKey(k),m=this.collector.getStorageData(l,d);if(!m)return;const X=m[i],s=X&&Z.copySelector({viewId:l,store:X});s&&(this.tmpCopyCoordInfo=s==null?void 0:s.copyCoordInfo,this.tmpCopyStore=s==null?void 0:s.copyStores)}pasteTempToFocusView(l,d){var i,m;const b=this.control.viewContainerManager.getView(l),Z=(m=(i=this.mainEngine)==null?void 0:i.methodBuilder)==null?void 0:m.getBuilder(C.CopyNode);if(!(!b||!this.tmpCopyCoordInfo||!this.tmpCopyStore.size||!this.collector||!Z)&&b.viewData&&this.tmpCopyCoordInfo){const X=Xb.cloneDeep(this.tmpCopyCoordInfo.offset),s=this.tmpCopyCoordInfo.cameraOpt,G=b.viewData.camera;X.x=X.x+G.centerX-s.centerX,X.y=X.y+G.centerY-s.centerY,Z.pasteSelector({viewId:l,scenePath:d,copyStores:Xb.cloneDeep(this.tmpCopyStore),copyCoordInfo:{offset:X,cameraOpt:G}})}}setMemberState(l){var d;(d=this.control.room)==null||d.setMemberState(l)}}const rd=class rd{constructor(l){h(this,"plugin");h(this,"room");h(this,"play");h(this,"collector");h(this,"hasSwitchToSelectorEffect");h(this,"snapshootStateMap");h(this,"effectResolve");h(this,"hotkeyManager");h(this,"pluginOptions");h(this,"roomMember");h(this,"cursor");h(this,"textEditorManager");h(this,"worker");h(this,"onSceneChange",async(l,d)=>{var m;const b=this.viewContainerManager.getView(d);b!=null&&b.focusScenePath&&(m=this.collector)!=null&&m.hasSelector(d,b.focusScenePath)&&this.worker.blurSelector(d,b.focusScenePath),this.textEditorManager.checkEmptyTextBlur();const Z=b==null?void 0:b.displayer;Z&&(Z.setActive(!1),await Z.stopEventHandler());const i=l;i&&this.viewContainerManager.setViewScenePath(d,i),Z==null||Z.setActive(!0)});h(this,"onRoomMembersChange",l=>{this.roomMember.setRoomMembers(D.toJS(l))});h(this,"onMemberChange",cd(l=>{if(!this.room||!this.worker)return;const d=this.getToolsKey(l),b=this.getToolsOpt(d,l);this.worker.setCurrentToolsData(b),this.effectViewContainer(d),this.effectResolve&&this.effectResolve(!0)},100,{leading:!1}));h(this,"internalSceneChange",(l,d)=>{var b;(b=this.worker)==null||b.clearViewScenePath(l,!0).then(()=>{var Z;(Z=this.worker)==null||Z.pullServiceData(l,d)})});h(this,"internalCameraChange",(l,d)=>{var b;(b=this.worker)==null||b.updateCamera(l,d)});const{displayer:d,plugin:b,options:Z}=l;this.plugin=b,this.room=D.isRoom(d)?d:void 0,this.play=D.isPlayer(d)?d:void 0,this.pluginOptions=Z,this.roomMember=new zp;const i={control:this,internalMsgEmitter:rd.InternalMsgEmitter};this.cursor=new kp(i),this.textEditorManager=new Hp(i),this.worker=new lo(i),this.hotkeyManager=new ko(i)}bindPlugin(l){var d,b;this.plugin=l,this.collector&&this.collector.removeStorageStateListener(),this.collector=new Ql(l,(b=(d=this.pluginOptions)==null?void 0:d.syncOpt)==null?void 0:b.interval),this.cursor.activeCollector(),this.activePlugin()}destroy(){var l,d,b,Z,i;this.roomMember.destroy(),(l=this.collector)==null||l.destroy(),(d=this.worker)==null||d.destroy(),(b=this.viewContainerManager)==null||b.destroy(),(Z=this.cursor)==null||Z.destroy(),(i=this.textEditorManager)==null||i.destory()}cleanCurrentScene(){const l=Date.now(),d=this.worker.getLocalWorkViewId()||this.viewContainerManager.focuedViewId;d&&(rd.InternalMsgEmitter.emit("undoTickerStart",l,d),this.worker.clearViewScenePath(d).then(()=>{rd.InternalMsgEmitter.emit("undoTickerEnd",l,d)}))}onWritableChange(l){var d,b;l?(b=this.worker)==null||b.abled():(d=this.worker)==null||d.unWritable()}getToolsKey(l){const d=l.currentApplianceName;switch(this.hasSwitchToSelectorEffect=!1,d){case E.text:return l.textCompleteToSelector&&(this.hasSwitchToSelectorEffect=!0),t.Text;case E.pencil:return l.useLaserPen?t.LaserPen:t.Pencil;case E.eraser:case E.pencilEraser:return t.Eraser;case E.selector:return t.Selector;case E.arrow:return l.arrowCompleteToSelector&&(this.hasSwitchToSelectorEffect=!0),t.Arrow;case E.straight:return l.straightCompleteToSelector&&(this.hasSwitchToSelectorEffect=!0),t.Straight;case E.ellipse:return l.ellipseCompleteToSelector&&(this.hasSwitchToSelectorEffect=!0),t.Ellipse;case E.rectangle:return l.rectangleCompleteToSelector&&(this.hasSwitchToSelectorEffect=!0),t.Rectangle;case E.shape:if(l.shapeCompleteToSelector&&(this.hasSwitchToSelectorEffect=!0),l.shapeType===Kd.Pentagram||l.shapeType===Kd.Star)return t.Star;if(l.shapeType===Kd.Polygon||l.shapeType===Kd.Triangle||l.shapeType===Kd.Rhombus)return t.Polygon;if(l.shapeType===Kd.SpeechBalloon)return t.SpeechBalloon;break}return t.Clicker}getToolsOpt(l,d){const b=d.currentApplianceName,Z={strokeColor:sl(d.strokeColor[0],d.strokeColor[1],d.strokeColor[2],d.strokeOpacity||1),thickness:d.strokeWidth,isOpacity:(d==null?void 0:d.strokeOpacity)&&d.strokeOpacity<1||(d==null?void 0:d.fillOpacity)&&d.fillOpacity<1||(d==null?void 0:d.textOpacity)&&d.textOpacity<1||(d==null?void 0:d.textBgOpacity)&&d.textBgOpacity<1||!1};switch(l){case t.Text:Z.fontFamily=window.getComputedStyle(document.documentElement).getPropertyValue("font-family"),Z.fontSize=(d==null?void 0:d.textSizeOverride)||(d==null?void 0:d.textSize)||Number(window.getComputedStyle(document.body).fontSize),Z.textAlign=(d==null?void 0:d.textAlign)||"left",Z.verticalAlign=(d==null?void 0:d.verticalAlign)||"middle",Z.fontColor=(d==null?void 0:d.textColor)&&sl(d.textColor[0],d.textColor[1],d.textColor[2],d.textOpacity||1)||Z.strokeColor||"rgba(0,0,0,1)",Z.fontBgColor=Array.isArray(d==null?void 0:d.textBgColor)&&sl(d.textBgColor[0],d.textBgColor[1],d.textBgColor[2],d.textBgOpacity||1)||"transparent",Z.bold=(d==null?void 0:d.bold)&&"bold"||void 0,Z.italic=(d==null?void 0:d.italic)&&"italic"||void 0,Z.underline=(d==null?void 0:d.underline)||void 0,Z.lineThrough=(d==null?void 0:d.lineThrough)||void 0,Z.text="",Z.strokeColor=void 0;break;case t.Pencil:Z.strokeType=(d==null?void 0:d.strokeType)||Fl.Normal;break;case t.Eraser:Z.thickness=Math.min(3,Math.max(1,Math.floor(d.pencilEraserSize||1)))-1,Z.isLine=b===E.eraser&&!0;break;case t.LaserPen:Z.duration=(d==null?void 0:d.duration)||1,Z.strokeType=(d==null?void 0:d.strokeType)||Fl.Normal;break;case t.Ellipse:case t.Rectangle:case t.Star:case t.Polygon:case t.SpeechBalloon:l===t.Star&&(d.shapeType===Kd.Pentagram?(Z.vertices=10,Z.innerVerticeStep=2,Z.innerRatio=.4):d!=null&&d.vertices&&(d!=null&&d.innerVerticeStep)&&(d!=null&&d.innerRatio)&&(Z.vertices=d.vertices,Z.innerVerticeStep=d.innerVerticeStep,Z.innerRatio=d.innerRatio)),l===t.Polygon&&(d.shapeType===Kd.Triangle?Z.vertices=3:d.shapeType===Kd.Rhombus?Z.vertices=4:d.vertices&&(Z.vertices=d.vertices)),Z.fillColor=(d==null?void 0:d.fillColor)&&sl(d.fillColor[0],d.fillColor[1],d.fillColor[2],d==null?void 0:d.fillOpacity)||"transparent",l===t.SpeechBalloon&&(Z.placement=d.placement||"bottomLeft");break}return{toolsType:l,toolsOpt:Z}}effectViewContainer(l){var d,b,Z,i,m;switch(l){case t.Text:case t.Pencil:case t.LaserPen:case t.Arrow:case t.Straight:case t.Rectangle:case t.Ellipse:case t.Star:case t.Polygon:case t.SpeechBalloon:case t.Triangle:case t.Rhombus:this.room.disableDeviceInputs=!0,(d=this.worker)==null||d.abled();break;case t.Eraser:case t.Selector:this.room.disableDeviceInputs=!1,(b=this.cursor)==null||b.unabled(),(Z=this.worker)==null||Z.abled();break;default:this.room.disableDeviceInputs=!1,(i=this.worker)==null||i.unWritable(),(m=this.cursor)==null||m.unabled();break}setTimeout(()=>{this.viewContainerManager.getAllViews().forEach(s=>{s!=null&&s.displayer&&s.displayer.bindToolsClass()})},0)}async getBoundingRect(l){var b,Z,i,m,X;const d=await((b=this.worker)==null?void 0:b.getBoundingRect(l));if(d){const s=((i=(Z=this.viewContainerManager.mainView)==null?void 0:Z.viewData)==null?void 0:i.convertToPointInWorld({x:d.x,y:d.y}))||{x:d.x,y:d.y},G=((X=(m=this.viewContainerManager.mainView)==null?void 0:m.viewData)==null?void 0:X.camera.scale)||1;return{width:Math.floor(d.w/G)+1,height:Math.floor(d.h/G)+1,originX:s.x,originY:s.y}}}async screenshotToCanvas(l,d,b,Z,i,m,X){const s=await this.worker.getSnapshot(d,b,Z,i);s&&(l.drawImage(s,m||0,X||0),s.close())}async scenePreview(l,d){var m,X,s,G;const b=(m=this.collector)==null?void 0:m.getViewIdBySecenPath(l);if(!b)return;const Z=this.viewContainerManager.getView(b);if(!Z||!((X=Z.cameraOpt)!=null&&X.width)||!((s=Z.cameraOpt)!=null&&s.height))return;const i=await((G=this.worker)==null?void 0:G.getSnapshot(l));if(i&&this.worker){const p=document.createElement("canvas"),W=p.getContext("2d"),{width:I,height:o}=Z.cameraOpt;p.width=I,p.height=o,W&&(W.drawImage(i,0,0),d.src=p.toDataURL(),d.onload=()=>{p.remove()},d.onerror=()=>{p.remove(),d.remove()}),i.close()}}setOriginMemberState(){}switchToSelector(){var l;(l=this.room)==null||l.setMemberState({currentApplianceName:E.selector})}async runEffectWork(l){if(this.hasSwitchToSelectorEffect){const d=await new Promise(b=>{this.switchToSelector(),this.effectResolve=b});this.effectResolve=void 0,d&&l&&l()}}setSnapshootData(){var l;this.room&&(this.snapshootStateMap=new Map,this.snapshootStateMap.set("memberState",(l=this.room)==null?void 0:l.state.memberState))}getSnapshootData(l){var d;return(d=this.snapshootStateMap)==null?void 0:d.get(l)}clearSnapshootData(){var l;(l=this.snapshootStateMap)==null||l.clear(),this.snapshootStateMap=void 0}};h(rd,"InternalMsgEmitter",new lZ);let yd=rd;var Mo=eZ,go=4;function Qo(c){return Mo(c,go)}var Uo=Qo;const qb=vd(Uo),Hd=class Hd{constructor(l){h(this,"emitter",new lZ);h(this,"undoStack");h(this,"redoStack");h(this,"worker");h(this,"control");h(this,"room");h(this,"isTicking");h(this,"undoTickerId");h(this,"viewId");h(this,"scenePath");h(this,"tickStartStorerCache");h(this,"excludeIds",new Set);h(this,"undoTickerEnd",Ab((l,d,b)=>{var Z,i;if(l===this.undoTickerId&&b===this.scenePath&&d===this.viewId&&this.tickStartStorerCache){const m=((Z=this.collector)==null?void 0:Z.storage[d])&&((i=this.collector)==null?void 0:i.storage[d][b])||{},X=this.diffFun(this.tickStartStorerCache,new Map(Object.entries(m)));X.size&&(this.undoStack.push({id:l,type:2,data:Zd(X),scenePath:b}),this.undoStack.length>Hd.MaxStackLength&&this.undoStack.shift(),this.emitter.emit("onCanUndoStepsUpdate",this.undoStack.length)),this.redoStack.length&&(this.redoStack.length=0,this.emitter.emit("onCanRedoStepsUpdate",this.redoStack.length)),this.isTicking=!1,this.scenePath=void 0,this.tickStartStorerCache=void 0,this.undoTickerId=void 0,this.excludeIds.clear()}},Hd.waitTime));h(this,"onChangeScene",Ab(()=>{const l=this.control.viewContainerManager.getCurScenePath(this.viewId);if(l){const d=this.undoStack.filter(Z=>Z.scenePath===l).length,b=this.redoStack.filter(Z=>Z.scenePath===l).length;this.emitter.emit("onCanUndoStepsUpdate",d),this.emitter.emit("onCanRedoStepsUpdate",b)}},Hd.waitTime));const{control:d,internalMsgEmitter:b,viewId:Z}=l;this.control=d,this.emitter=b,this.undoStack=[],this.redoStack=[],this.room=d.room,this.worker=d.worker,this.isTicking=!1,this.viewId=Z}get collector(){return this.control.collector}addExcludeIds(l){if(this.isTicking)for(const d of l)this.excludeIds.add(d)}undoTickerStart(l,d){if(this.collector&&(this.undoTickerId!==l||this.scenePath!==d)){this.isTicking=!0,this.excludeIds.clear();const b=this.collector.transformKey(k);this.excludeIds.add(b),this.undoTickerId=l,this.scenePath=d;const Z=this.collector.getStorageData(this.viewId,d)||{};this.tickStartStorerCache=new Map(Object.entries(Zd(Z)))}}undoTickerEndSync(l,d,b,Z){var i,m;if(l===this.undoTickerId&&b===this.scenePath&&d===this.viewId&&this.tickStartStorerCache){const X=((i=this.collector)==null?void 0:i.storage[d])&&((m=this.collector)==null?void 0:m.storage[d][b])||{},s=this.diffFun(this.tickStartStorerCache,new Map(Object.entries(X)));s.size&&(this.undoStack.push({id:l,type:2,data:Zd(s),scenePath:b,tickStartStorerCache:Z&&Zd(this.tickStartStorerCache)||void 0}),this.undoStack.length>Hd.MaxStackLength&&this.undoStack.shift(),this.emitter.emit("onCanUndoStepsUpdate",this.undoStack.length)),this.redoStack.length&&(this.redoStack.length=0,this.emitter.emit("onCanRedoStepsUpdate",this.redoStack.length)),this.isTicking=!1,this.scenePath=void 0,this.tickStartStorerCache=void 0,this.undoTickerId=void 0,this.excludeIds.clear()}}undo(l){this.undoTickerId&&this.tickStartStorerCache&&this.scenePath&&this.undoTickerEndSync(this.undoTickerId,this.viewId,this.scenePath,!0);let d=this.undoStack.length-1;for(;d>=0;){if(this.undoStack[d].scenePath===l){const m=this.undoStack[d];m&&(this.redoStack.push(m),m.type===2&&m.data&&this.refreshPlugin(m)),this.undoStack.splice(d,1);break}d--}const b=this.undoStack.filter(i=>i.scenePath===l).length,Z=this.redoStack.filter(i=>i.scenePath===l).length;return this.emitter.emit("onCanUndoStepsUpdate",b),this.emitter.emit("onCanRedoStepsUpdate",Z),b}redo(l){let d=this.redoStack.length-1;for(;d>=0;){if(this.redoStack[d].scenePath===l){const m=this.redoStack[d];m&&(!this.undoTickerId&&m.tickStartStorerCache?(this.undoTickerId=m.id,this.tickStartStorerCache=m.tickStartStorerCache,this.scenePath=m.scenePath):this.undoStack.push(m),m.type===2&&m.data&&this.refreshPlugin(m,!0)),this.redoStack.splice(d,1);break}d--}const b=this.undoStack.filter(i=>i.scenePath===l).length,Z=this.redoStack.filter(i=>i.scenePath===l).length;return this.emitter.emit("onCanUndoStepsUpdate",b),this.emitter.emit("onCanRedoStepsUpdate",Z),Z}clear(){this.clearUndo(),this.clearRedo()}clearUndo(){this.undoStack.length=0,this.emitter.emit("onCanUndoStepsUpdate",this.undoStack.length)}clearRedo(){this.redoStack.length=0,this.emitter.emit("onCanRedoStepsUpdate",this.redoStack.length)}canUndo(){return!!this.undoStack.length}canRedo(){return!!this.redoStack.length}onFocusView(){const l=this.control.viewContainerManager.getCurScenePath(this.viewId);if(l){const d=this.undoStack.filter(Z=>Z.scenePath===l).length,b=this.redoStack.filter(Z=>Z.scenePath===l).length;this.emitter.emit("onCanUndoStepsUpdate",d),this.emitter.emit("onCanRedoStepsUpdate",b)}}diffFun(l,d){const b=new Set,Z=l.keys(),i=d.keys();for(const m of Z){if(this.excludeIds.has(m))continue;const X=l.get(m),s=d.get(m);if(X&&s){if(sd(s,X))continue;b.add({dataType:3,key:m,data:[X,s]});continue}X&&b.add({dataType:2,key:m,data:X})}for(const m of i){if(this.excludeIds.has(m))continue;const X=d.get(m);X&&!l.has(m)&&b.add({dataType:1,key:m,data:X})}return b}isDrawEffectiveScene(l,d){const{key:b}=l;return!d.includes(b)}isDeleteEffectiveScene(l,d,b){var m;const{key:Z}=l;if(!d.includes(Z))return!1;const i=d.filter(X=>{var s,G;return((s=this.collector)==null?void 0:s.getLocalId(X))===k&&!((G=this.collector)!=null&&G.isOwn(X))}).map(X=>{var s;return(s=this.collector)==null?void 0:s.storage[this.viewId][b][X]});for(const X of i)if((m=X==null?void 0:X.selectIds)!=null&&m.includes(Z))return!1;return!0}isOldEffectiveScene(l,d,b){var m;const{key:Z}=l;if(!d.includes(Z))return!1;const i=d.filter(X=>{var s,G;return((s=this.collector)==null?void 0:s.getLocalId(X))===k&&!((G=this.collector)!=null&&G.isOwn(X))}).map(X=>{var s;return(s=this.collector)==null?void 0:s.storage[this.viewId][b][X]});for(const X of i)if((m=X==null?void 0:X.selectIds)!=null&&m.includes(Z))return!1;return!0}isNewEffectiveScene(l,d){const{key:b}=l;return!!d.includes(b)}refreshPlugin(l,d=!1){var m,X,s,G,p,W,I,o,u,y,Y,L,n,a,x,R,S,J,F,w,H;let b;const{scenePath:Z}=l,i=l.data;if(!(!i||!this.collector))for(const M of i.values()){const{dataType:B,data:g,key:_}=M,q=this.collector.storage[this.viewId]&&this.collector.storage[this.viewId][Z],$=q&&Object.keys(q)||[];switch(B){case 1:if(b=d?this.isDrawEffectiveScene(M,$):this.isDeleteEffectiveScene(M,$,Z),b)if(d&&!Array.isArray(g)){if((m=g.updateNodeOpt)!=null&&m.useAnimation&&(g.updateNodeOpt.useAnimation=!1),((X=this.collector)==null?void 0:X.getLocalId(_))===k&&((s=this.collector)!=null&&s.isOwn(M.key))){const O=g.selectIds;if(O){const f=$.filter(e=>{var U,P;return((U=this.collector)==null?void 0:U.getLocalId(e))===k&&!((P=this.collector)!=null&&P.isOwn(e))}).map(e=>{var U;return(U=this.collector)==null?void 0:U.storage[this.viewId][Z][e]});let A=!1;for(const e of f)for(let U=0;U<O.length;U++)(G=e==null?void 0:e.selectIds)!=null&&G.includes(O[U])&&(delete O[U],A=!0);A&&(g.selectIds=O.filter(e=>!!e))}}(p=this.collector)==null||p.updateValue(M.key,g,{isAfterUpdate:!0,viewId:this.viewId,scenePath:Z,isSync:!0})}else!d&&!Array.isArray(M.data)&&((W=this.collector)==null||W.updateValue(M.key,void 0,{isAfterUpdate:!0,viewId:this.viewId,scenePath:Z,isSync:!0}));break;case 2:if(b=d?this.isDeleteEffectiveScene(M,$,Z):this.isDrawEffectiveScene(M,$),b){if(d&&!Array.isArray(g))(I=this.collector)==null||I.updateValue(_,void 0,{isAfterUpdate:!0,viewId:this.viewId,scenePath:Z,isSync:!0});else if(!d&&!Array.isArray(g)){if((o=g.updateNodeOpt)!=null&&o.useAnimation&&(g.updateNodeOpt.useAnimation=!1),((u=this.collector)==null?void 0:u.getLocalId(M.key))===k&&((y=this.collector)!=null&&y.isOwn(M.key))){const O=g.selectIds;if(O){const f=$.filter(e=>{var U,P;return((U=this.collector)==null?void 0:U.getLocalId(e))===k&&!((P=this.collector)!=null&&P.isOwn(e))}).map(e=>{var U;return(U=this.collector)==null?void 0:U.storage[this.viewId][Z][e]});let A=!1;for(const e of f)for(let U=0;U<O.length;U++)(Y=e==null?void 0:e.selectIds)!=null&&Y.includes(O[U])&&(delete O[U],A=!0);A&&(g.selectIds=O.filter(e=>!!e))}}(L=this.collector)==null||L.updateValue(M.key,M.data,{isAfterUpdate:!0,viewId:this.viewId,scenePath:Z,isSync:!0})}}break;case 3:if(b=d?this.isNewEffectiveScene(M,$):this.isOldEffectiveScene(M,$,Z),b){if(d&&Array.isArray(g)&&g.length===2){const O=g[1];if((n=O.updateNodeOpt)!=null&&n.useAnimation&&(O.updateNodeOpt.useAnimation=!1),((a=this.collector)==null?void 0:a.getLocalId(M.key))===k&&((x=this.collector)!=null&&x.isOwn(M.key))){const f=O.selectIds;if(f){const A=$.filter(U=>{var P,id;return((P=this.collector)==null?void 0:P.getLocalId(U))===k&&!((id=this.collector)!=null&&id.isOwn(U))}).map(U=>{var P;return(P=this.collector)==null?void 0:P.storage[this.viewId][Z][U]});let e=!1;for(const U of A)for(let P=0;P<f.length;P++)U!=null&&U.selectIds&&((R=U.selectIds)!=null&&R.includes(f[P]))&&(delete f[P],e=!0);e&&(O.selectIds=f.filter(U=>!!U))}}(S=this.collector)==null||S.updateValue(_,O,{isAfterUpdate:!0,viewId:this.viewId,scenePath:Z,isSync:!0})}else if(!d&&Array.isArray(g)&&g.length===2){const O=g[0];if((J=O.updateNodeOpt)!=null&&J.useAnimation&&(O.updateNodeOpt.useAnimation=!1),((F=this.collector)==null?void 0:F.getLocalId(M.key))===k&&((w=this.collector)!=null&&w.isOwn(M.key))){const f=O.selectIds;if(f){const A=$.filter(U=>{var P,id;return((P=this.collector)==null?void 0:P.getLocalId(U))===k&&!((id=this.collector)!=null&&id.isOwn(U))}).map(U=>{var P;return(P=this.collector)==null?void 0:P.storage[this.viewId][Z][U]});let e=!1;for(const U of A)for(let P=0;P<f.length;P++)U!=null&&U.selectIds&&U.selectIds.includes(f[P])&&(delete f[P],e=!0);e&&(O.selectIds=f.filter(U=>!!U))}}(H=this.collector)==null||H.updateValue(M.key,O,{isAfterUpdate:!0,viewId:this.viewId,scenePath:Z,isSync:!0})}}break}}}};h(Hd,"sdkCallBack"),h(Hd,"MaxStackLength",20),h(Hd,"waitTime",100);let ul=Hd;function wo(c){return c instanceof TouchEvent||c instanceof window.TouchEvent||(c==null?void 0:c.touches)&&(c==null?void 0:c.touches.length)||(c==null?void 0:c.changedTouches)&&(c==null?void 0:c.changedTouches.length)}function Dd(c){return wo(c)&&(c.touches&&c.touches.length===1||c.changedTouches&&c.changedTouches.length===1)}function MZ(c){return c.touches&&c.touches.length?{x:c.touches[0].pageX,y:c.touches[0].pageY}:c.changedTouches&&c.changedTouches.length?{x:c.changedTouches[0].pageX,y:c.changedTouches[0].pageY}:{x:c.pageX,y:c.pageY}}class bl{constructor(l){h(this,"internalMsgEmitter");h(this,"control");h(this,"mainView");h(this,"appViews",new Map);const{control:d,internalMsgEmitter:b}=l;this.control=d,this.internalMsgEmitter=b,this.internalMsgEmitter.on("undoTickerStart",this.undoTickerStart.bind(this)),this.internalMsgEmitter.on("undoTickerEnd",this.undoTickerEnd.bind(this)),this.internalMsgEmitter.on("excludeIds",this.addExcludeIds.bind(this))}undoTickerStart(l,d){const b=this.getView(d);b&&b.displayer&&b.focusScenePath&&b.displayer.commiter.undoTickerStart(l,b.focusScenePath)}undoTickerEnd(l,d,b){const Z=this.getView(d);if(Z&&Z.displayer&&Z.focusScenePath){if(b){Z.displayer.commiter.undoTickerEndSync(l,d,Z.focusScenePath);return}Z.displayer.commiter.undoTickerEnd(l,d,Z.focusScenePath)}}addExcludeIds(l,d){const b=this.getView(d);b&&b.displayer&&b.focusScenePath&&b.displayer.commiter.addExcludeIds(l)}undo(){const l=this.focuedView;let d=0;if(l){const b=l.focusScenePath;d=l.displayer.commiter.undo(b)||0}return d}redo(){const l=this.focuedView;let d=0;if(l){const b=l.focusScenePath;d=l.displayer.commiter.redo(b)||0}return d}validator(l,d,b){var m;const Z=qb(l[d]),i=qb(b);if(d==="focusScenePath"&&b&&!sd(Z,i)&&(this.control.internalSceneChange(l.id,i),(m=this.focuedView)==null||m.displayer.commiter.onChangeScene()),d==="cameraOpt"&&!sd(Z,i)){if(i.width!==(Z==null?void 0:Z.width)||i.height!==(Z==null?void 0:Z.height)){const X=this.getView(d);X==null||X.displayer.updateSize()}this.control.internalCameraChange(l.id,i)}}destroyAppView(l,d=!1){const b=this.appViews.get(l);b&&(this.control.textEditorManager.clear(l,d),b.displayer.destroy(),this.appViews.delete(l))}createMianView(l){this.mainView=new Proxy(l,{set:(d,b,Z)=>(this.control.worker.isActive&&this.validator(d,b,Z),d[b]=Z,!0)})}createAppView(l){const d=l.id,b=new Proxy(l,{set:(Z,i,m)=>(this.control.worker.isActive&&this.validator(Z,i,m),Z[i]=m,!0)});this.appViews.set(d,b)}isAppView(l){return l!==td.viewId&&this.appViews.has(l)}getView(l){var d;return l===td.viewId?this.mainView:(d=this.appViews)==null?void 0:d.get(l)}getCurScenePath(l){const d=this.getView(l);if(d)return d.focusScenePath}getAllViews(){return[this.mainView,...this.appViews.values()]}setViewScenePath(l,d){var b;if(l===td.viewId&&this.mainView)this.mainView.focusScenePath=d;else{const Z=l&&((b=this.appViews)==null?void 0:b.get(l))||void 0;Z&&(Z.focusScenePath=d)}}setViewData(l,d){var b;if(l===td.viewId&&this.mainView)this.mainView.viewData=d;else{const Z=l&&((b=this.appViews)==null?void 0:b.get(l))||void 0;Z&&(Z.viewData=d)}}setFocuedViewId(l){var d;this.focuedViewId=l,l===td.viewId?this.focuedView=this.mainView:this.focuedView=l&&((d=this.appViews)==null?void 0:d.get(l))||void 0,this.control.cursor.onFocusViewChange(),this.focuedView&&this.focuedView.displayer.commiter.onFocusView()}setViewFocusScenePath(l,d){var Z;let b;l===td.viewId?b=this.mainView:b=(Z=this.appViews)==null?void 0:Z.get(l),b&&(b.focusScenePath=d)}destroy(){var l;this.internalMsgEmitter.removeAllListeners("undoTickerStart"),this.internalMsgEmitter.removeAllListeners("undoTickerEnd"),this.internalMsgEmitter.removeAllListeners("excludeIds"),(l=this.mainView)==null||l.displayer.destroy(),this.appViews.forEach(d=>{this.destroyAppView(d.id,!0),this.control.worker.destroyViewWorker(d.id)})}setFocuedViewCameraOpt(l){this.focuedView&&(this.focuedView.cameraOpt=l)}transformToOriginPoint(l,d){const b=this.getView(d);if(b!=null&&b.viewData){const Z=b.viewData.convertToPointOnScreen(l[0],l[1]);return[Z.x,Z.y]}return l}transformToScenePoint(l,d){const b=this.getView(d);if(b!=null&&b.viewData){const Z=b.viewData.convertToPointInWorld({x:l[0],y:l[1]});return[Z.x,Z.y]}return l}render(l){var d,b,Z,i,m,X,s,G,p,W,I,o,u,y,Y,L,n;for(const a of l){const{rect:x,imageBitmap:R,isClear:S,isUnClose:J,drawCanvas:F,clearCanvas:w,offset:H,viewId:M}=a,B=(d=this.getView(M))==null?void 0:d.displayer;if(B&&x){const{dpr:g,canvasBgRef:_,canvasFloatRef:q,floatBarCanvasRef:$,canvasServiceFloatRef:O}=B,f=x.w*g,A=x.h*g,e=x.x*g,U=x.y*g;if(S)switch(w){case Td.Selector:(Z=(b=$.current)==null?void 0:b.getContext("2d"))==null||Z.clearRect(0,0,f,A);break;case Td.ServiceFloat:(m=(i=O.current)==null?void 0:i.getContext("2d"))==null||m.clearRect(e,U,f,A);break;case Td.Float:(s=(X=q.current)==null?void 0:X.getContext("2d"))==null||s.clearRect(e,U,f,A);break;case Td.Bg:(p=(G=_.current)==null?void 0:G.getContext("2d"))==null||p.clearRect(e,U,f,A);break}if(F&&R)switch(F){case Td.Selector:{const P=((H==null?void 0:H.x)||0)*g,id=((H==null?void 0:H.y)||0)*g;(I=(W=$.current)==null?void 0:W.getContext("2d"))==null||I.drawImage(R,0,0,f,A,P,id,f,A);break}case Td.ServiceFloat:{(u=(o=O.current)==null?void 0:o.getContext("2d"))==null||u.drawImage(R,0,0,f,A,e,U,f,A);break}case Td.Float:{(Y=(y=q.current)==null?void 0:y.getContext("2d"))==null||Y.drawImage(R,0,0,f,A,e,U,f,A);break}case Td.Bg:{(n=(L=_.current)==null?void 0:L.getContext("2d"))==null||n.drawImage(R,0,0,f,A,e,U,f,A);break}}if(J)return;R==null||R.close()}}}showFloatBar(l,d,b){const Z=this.getView(l),i=Z==null?void 0:Z.displayer.vDom;i&&i.showFloatBar(d,b)}activeFloatBar(l){var b;const d=(b=this.getView(l))==null?void 0:b.displayer;d!=null&&d.vDom&&d.vDom.setFloatZIndex(2)}unActiveFloatBar(l){const d=this.getView(l),b=d==null?void 0:d.displayer.vDom;b&&b.setFloatZIndex(-1)}setActiveTextEditor(l,d){const b=this.getView(l),Z=b==null?void 0:b.displayer.vDom;Z&&Z.setActiveTextEditor(d)}}h(bl,"defaultCameraOpt",{centerX:0,centerY:0,scale:1}),h(bl,"defaultScreenCanvasOpt",{autoRender:!1,contextType:cl.Canvas2d}),h(bl,"defaultLayerOpt",{offscreen:!0,handleEvent:!1,depth:!1});class vo{constructor(l,d,b){h(this,"viewId");h(this,"control");h(this,"internalMsgEmitter");h(this,"commiter");h(this,"cachePoint");h(this,"cacheCursorPoint");h(this,"active",!0);h(this,"mousedown",l=>{if(this.active&&l.button===0&&this.viewId){this.reflashContainerOffset();const d=this.getPoint(l);this.cachePoint=d,d&&this.control.worker.originalEventLintener(K.Start,d,this.viewId)}});h(this,"mousemove",l=>{if(this.active&&this.viewId){const d=this.getPoint(l);this.cachePoint=d,d&&this.control.worker.originalEventLintener(K.Doing,d,this.viewId)}});h(this,"mouseup",l=>{if(this.active&&l.button===0&&this.viewId){const d=this.getPoint(l)||this.cachePoint;d&&this.control.worker.originalEventLintener(K.Done,d,this.viewId),this.cachePoint=void 0}});h(this,"touchstart",l=>{if(this.active&&Dd(l)&&this.viewId){this.reflashContainerOffset();const d=this.getPoint(l);this.cachePoint=d,d&&this.control.worker.originalEventLintener(K.Start,d,this.viewId)}});h(this,"touchmove",l=>{if(this.active){if(!Dd(l)){this.control.worker.unWritable(),this.control.worker.clearLocalPointsBatchData();return}if(this.viewId){const d=this.getPoint(l);this.cachePoint=d,d&&this.control.worker.originalEventLintener(K.Doing,d,this.viewId)}}});h(this,"touchend",l=>{if(this.active){if(!Dd(l)||!this.control.worker.isAbled()){this.control.worker.clearLocalPointsBatchData();return}if(this.viewId){const d=this.getPoint(l)||this.cachePoint;d&&this.control.worker.originalEventLintener(K.Done,d,this.viewId),this.cachePoint=void 0}}});h(this,"cursorMouseMove",cd(l=>{const d=this.getPoint(l);this.cacheCursorPoint&&sd(d,this.cacheCursorPoint)||!this.viewId||(this.cacheCursorPoint=d,d&&this.control.worker.sendCursorEvent(d,this.viewId))},30,{leading:!1}));h(this,"cursorMouseLeave",cd(()=>{this.viewId&&(this.cacheCursorPoint=[void 0,void 0],this.control.worker.sendCursorEvent(this.cacheCursorPoint,this.viewId))},30,{leading:!1}));h(this,"keydown",l=>{this.control.hotkeyManager.colloctHotkey(l)});this.viewId=l,this.control=d,this.internalMsgEmitter=b;const Z={control:this.control,internalMsgEmitter:this.internalMsgEmitter,viewId:this.viewId};this.commiter=new ul(Z)}bindToolsClass(){var d,b;const l=(b=(d=this.control.worker)==null?void 0:d.currentToolsData)==null?void 0:b.toolsType;switch(l){case t.Text:case t.Pencil:case t.LaserPen:case t.Arrow:case t.Straight:case t.Rectangle:case t.Ellipse:case t.Star:case t.Polygon:case t.SpeechBalloon:this.eventTragetElement&&(this.eventTragetElement.className=`netless-whiteboard ${l===t.Text?"cursor-text":l===t.Pencil||l===t.LaserPen?"cursor-pencil":"cursor-arrow"}`);break}}mountView(){this.setCanvassStyle(),this.control.viewContainerManager.mountView(this.viewId)}reflashContainerOffset(){this.eventTragetElement&&(this.containerOffset=this.getContainerOffset(this.eventTragetElement,{x:0,y:0}))}updateSize(){this.setCanvassStyle(),this.reflashContainerOffset()}setViewId(l){this.viewId=l}destroy(){this.eventTragetElement&&this.removeDisplayerEvent(this.eventTragetElement),this.vDom=void 0,this.internalMsgEmitter.removeAllListeners([v.Cursor,this.viewId])}getPoint(l){const d=MZ(l);if(d&&md(d.x)&&md(d.y))return[d.x-this.containerOffset.x,d.y-this.containerOffset.y]}setActive(l){this.active=l}async stopEventHandler(){this.cachePoint&&(await this.control.worker.originalEventLintener(K.Done,this.cachePoint,this.viewId),this.cachePoint=void 0)}getTranslate(l){const b=(l.style.WebkitTransform||getComputedStyle(l,"").getPropertyValue("-webkit-transform")||l.style.transform||getComputedStyle(l,"").getPropertyValue("transform")).match(/-?[0-9]+\.?[0-9]*/g),Z=b&&parseInt(b[0])||0,i=b&&parseInt(b[1])||0;return[Z,i]}getContainerOffset(l,d){var i;const b=this.getTranslate(l);let Z={x:d.x+l.offsetLeft+b[0],y:d.y+l.offsetTop+b[1]};return(i=l.offsetParent)!=null&&i.nodeName&&l.offsetParent.nodeName!=="BODY"&&(Z=this.getContainerOffset(l.offsetParent,Z)),Z}bindDisplayerEvent(l){l.addEventListener("mousedown",this.mousedown,!1),l.addEventListener("touchstart",this.touchstart,!1),window.addEventListener("mouseleave",this.mouseup,!1),window.addEventListener("mousemove",this.mousemove,!1),window.addEventListener("mouseup",this.mouseup,!1),window.addEventListener("touchmove",this.touchmove,!1),window.addEventListener("touchend",this.touchend,!1),l.addEventListener("mousemove",this.cursorMouseMove,!1),l.addEventListener("mouseleave",this.cursorMouseLeave,!1),l.addEventListener("keydown",this.keydown,!0)}removeDisplayerEvent(l){l.removeEventListener("mousedown",this.mousedown),l.removeEventListener("touchstart",this.touchstart),window.removeEventListener("mouseleave",this.mouseup),window.removeEventListener("mousemove",this.mousemove),window.removeEventListener("mouseup",this.mouseup),window.removeEventListener("touchmove",this.touchmove),window.removeEventListener("touchend",this.touchend),l.removeEventListener("mousemove",this.cursorMouseMove),l.removeEventListener("mouseleave",this.cursorMouseLeave),l.removeEventListener("keydown",this.keydown)}}class td{constructor(l,d){h(this,"viewId","mainView");h(this,"control");h(this,"internalMsgEmitter");h(this,"commiter");h(this,"cachePoint");h(this,"cacheCursorPoint");h(this,"active",!0);h(this,"mousedown",l=>{if(this.active&&l.button===0){this.reflashContainerOffset();const d=this.getPoint(l);this.cachePoint=d,d&&this.control.worker.originalEventLintener(K.Start,d,this.viewId)}});h(this,"mousemove",l=>{if(!this.active)return;const d=this.getPoint(l);this.cachePoint=d,d&&this.control.worker.originalEventLintener(K.Doing,d,this.viewId)});h(this,"mouseup",l=>{if(this.active&&l.button===0){const d=this.getPoint(l)||this.cachePoint;d&&this.control.worker.originalEventLintener(K.Done,d,this.viewId),this.cachePoint=void 0}});h(this,"touchstart",l=>{if(!this.active||!Dd(l))return;this.reflashContainerOffset();const d=this.getPoint(l);this.cachePoint=d,d&&this.control.worker.originalEventLintener(K.Start,d,this.viewId)});h(this,"touchmove",l=>{if(!this.active)return;if(!Dd(l)){this.control.worker.clearLocalPointsBatchData(),this.control.worker.unWritable();return}const d=this.getPoint(l);this.cachePoint=d,d&&this.control.worker.originalEventLintener(K.Doing,d,this.viewId)});h(this,"touchend",l=>{if(!this.active)return;if(!Dd(l)||!this.control.worker.isAbled()){this.control.worker.clearLocalPointsBatchData();return}const d=this.getPoint(l)||this.cachePoint;d&&this.control.worker.originalEventLintener(K.Done,d,this.viewId),this.cachePoint=void 0});h(this,"cursorMouseMove",cd(l=>{const d=this.getPoint(l);this.cacheCursorPoint&&sd(d,this.cacheCursorPoint)||(this.cacheCursorPoint=d,d&&this.control.worker.sendCursorEvent(d,this.viewId))},30,{leading:!1}));h(this,"cursorMouseLeave",cd(()=>{this.cacheCursorPoint=[void 0,void 0],this.control.worker.sendCursorEvent(this.cacheCursorPoint,this.viewId)},30,{leading:!1}));h(this,"keydown",l=>{this.control.hotkeyManager.colloctHotkey(l)});this.control=l,this.internalMsgEmitter=d;const b={control:this.control,internalMsgEmitter:this.internalMsgEmitter,viewId:this.viewId};this.commiter=new ul(b)}bindToolsClass(){var d,b;const l=(b=(d=this.control.worker)==null?void 0:d.currentToolsData)==null?void 0:b.toolsType;switch(l){case t.Text:case t.Pencil:case t.LaserPen:case t.Arrow:case t.Straight:case t.Rectangle:case t.Ellipse:case t.Star:case t.Polygon:case t.SpeechBalloon:this.eventTragetElement&&(this.eventTragetElement.className=`netless-whiteboard ${l===t.Text?"cursor-text":l===t.Pencil||l===t.LaserPen?"cursor-pencil":"cursor-arrow"}`);break}}mountView(){this.setCanvassStyle(),this.control.viewContainerManager.mountView(this.viewId)}updateSize(){this.setCanvassStyle()}reflashContainerOffset(){this.eventTragetElement&&(this.containerOffset=this.getContainerOffset(this.eventTragetElement,{x:0,y:0}))}destroy(){this.eventTragetElement&&this.removeDisplayerEvent(this.eventTragetElement),this.vDom=void 0,this.internalMsgEmitter.removeAllListeners([v.Cursor,this.viewId])}getPoint(l){const d=MZ(l);if(d&&md(d.x)&&md(d.y))return[d.x-this.containerOffset.x,d.y-this.containerOffset.y]}setActive(l){this.active=l}async stopEventHandler(){this.cachePoint&&(await this.control.worker.originalEventLintener(K.Done,this.cachePoint,this.viewId),this.cachePoint=void 0)}getTranslate(l){const b=(l.style.WebkitTransform||getComputedStyle(l,"").getPropertyValue("-webkit-transform")||l.style.transform||getComputedStyle(l,"").getPropertyValue("transform")).match(/-?[0-9]+\.?[0-9]*/g),Z=b&&parseInt(b[0])||0,i=b&&parseInt(b[1])||0;return[Z,i]}getContainerOffset(l,d){var i;const b=this.getTranslate(l);let Z={x:d.x+l.offsetLeft+b[0],y:d.y+l.offsetTop+b[1]};return(i=l.offsetParent)!=null&&i.nodeName&&l.offsetParent.nodeName!=="BODY"&&(Z=this.getContainerOffset(l.offsetParent,Z)),Z}bindDisplayerEvent(l){l.addEventListener("mousedown",this.mousedown,!1),l.addEventListener("touchstart",this.touchstart,!1),window.addEventListener("mouseleave",this.mouseup,!1),window.addEventListener("mousemove",this.mousemove,!1),window.addEventListener("mouseup",this.mouseup,!1),window.addEventListener("touchmove",this.touchmove,!1),window.addEventListener("touchend",this.touchend,!1),l.addEventListener("mousemove",this.cursorMouseMove,!1),l.addEventListener("mouseleave",this.cursorMouseLeave,!1),l.addEventListener("keydown",this.keydown,!0)}removeDisplayerEvent(l){l.removeEventListener("mousedown",this.mousedown),l.removeEventListener("touchstart",this.touchstart),window.removeEventListener("mouseleave",this.mouseup),window.removeEventListener("mousemove",this.mousemove),window.removeEventListener("mouseup",this.mouseup),window.removeEventListener("touchmove",this.touchmove),window.removeEventListener("touchend",this.touchend),l.removeEventListener("mousemove",this.cursorMouseMove),l.removeEventListener("mouseleave",this.cursorMouseLeave),l.removeEventListener("keydown",this.keydown)}}h(td,"viewId","mainView");const Po="index-module__Container__nLsM3",jo="index-module__CanvasBox__j2Xe-",Bo="index-module__FloatCanvas__d1YR7",Eo="index-module__FloatBar__cm-EL",ro="index-module__RotateBtn__HSSkf",Oo="index-module__ResizeBtn__yjvda",Do="index-module__CursorBox__2UHvI",fo="index-module__TextEditorContainer__Qm8KC",Ao="index-module__ResizeTowBox__HOllX",qo="index-module__FloatBarBtn__FJrOG",Yd={Container:Po,CanvasBox:jo,FloatCanvas:Bo,FloatBar:Eo,RotateBtn:ro,ResizeBtn:Oo,CursorBox:Do,TextEditorContainer:fo,ResizeTowBox:Ao,FloatBarBtn:qo},$o={delete:"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEyIDZ2NmEyIDIgMCAwIDEtMiAySDZhMiAyIDAgMCAxLTItMlY2aDBtMS0yYTIgMiAwIDAgMSAyLTJoMmEyIDIgMCAwIDEgMiAyaDBNMyA0aDEwIiBzdHJva2U9IiM0NDRFNjAiIGZpbGw9Im5vbmUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvc3ZnPg==",duplicate:"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgc3Ryb2tlPSIjNDQ0RTYwIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0xMSAySDZhMSAxIDAgMCAwLTEgMXY4YTEgMSAwIDAgMCAxIDFoNmExIDEgMCAwIDAgMS0xVjRoMGwtMi0yeiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+PHBhdGggZD0iTTExIDJ2MWExIDEgMCAwIDAgMSAxaDFsLTItMnoiLz48cGF0aCBkPSJNOSAxNEg0YTEgMSAwIDAgMS0xLTFWNWgwIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz48L2c+PC9zdmc+","layer-pressed":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTE2IDEwLTYgNCA2IDQgNi00em0tNiA4IDYgNCA2LTQiIHN0cm9rZT0iIzMzODFGRiIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PC9zdmc+",layer:"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTE2IDEwLTYgNCA2IDQgNi00em0tNiA4IDYgNCA2LTQiIHN0cm9rZT0iIzQ0NEU2MCIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PC9zdmc+",rotate:"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjUiIGhlaWdodD0iMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgc3Ryb2tlPSIjNDQ0RTYwIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTEzIDZhNiA2IDAgMSAxLTMuNzA5IDEuMjgzIi8+PHBhdGggZD0ibTEzIDYgMS40MTQgMi40NUwxMyA2bDIuNDUtMS40MTQiLz48L2c+PC9zdmc+","rotation-button":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0iI0ZGRiIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBvcGFjaXR5PSIuMDEiIGQ9Ik0wIDI0VjBoMjR2MjR6Ii8+PHBhdGggZD0iTTUuNzI0IDUuNzI0QTguODQ3IDguODQ3IDAgMCAxIDEyIDMuMTI1YzIuMjcxIDAgNC41NDMuODY2IDYuMjc2IDIuNmE4Ljg0NiA4Ljg0NiAwIDAgMSAyLjU5OCA2LjE0IDguODQ5IDguODQ5IDAgMCAxLTIuNTU5IDYuMzdsLTEuNS0uOTgzQTcuMTA1IDcuMTA1IDAgMCAwIDE5LjEyNSAxMmE3LjEwMyA3LjEwMyAwIDAgMC0yLjA4Ny01LjAzOEE3LjEwMyA3LjEwMyAwIDAgMCAxMiA0Ljg3NWE3LjEwMyA3LjEwMyAwIDAgMC01LjAzOCAyLjA4NyA3LjEwMSA3LjEwMSAwIDAgMC0yLjA4NiA0LjkyIDcuMTAzIDcuMTAzIDAgMCAwIDEuNzY2IDQuODE1bDEuOTQ1LTEuNTg0IDIuMzk0IDcuMTgyLTcuMjIyLTIuNDA4IDEuNzkxLTEuNzlBOC44NDYgOC44NDYgMCAwIDEgMy4xMjUgMTJjMC0yLjI3MS44NjYtNC41NDMgMi42LTYuMjc2eiIgc3Ryb2tlPSIjRkZGIiBzdHJva2Utd2lkdGg9Ii41IiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L2c+PC9zdmc+",rotation:"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48cGF0aCBmaWxsPSIjRkZGIiBvcGFjaXR5PSIuMDEiIGQ9Ik0wIDI0VjBoMjR2MjR6Ii8+PHBhdGggZD0iTTUuNzI0IDUuNzI0QTguODQ3IDguODQ3IDAgMCAxIDEyIDMuMTI1YzIuMjcxIDAgNC41NDMuODY2IDYuMjc2IDIuNmE4Ljg0NiA4Ljg0NiAwIDAgMSAyLjU5OCA2LjE0IDguODQ5IDguODQ5IDAgMCAxLTIuNTU5IDYuMzdsLTEuNS0uOTgzQTcuMTA1IDcuMTA1IDAgMCAwIDE5LjEyNSAxMmE3LjEwMyA3LjEwMyAwIDAgMC0yLjA4Ny01LjAzOEE3LjEwMyA3LjEwMyAwIDAgMCAxMiA0Ljg3NWE3LjEwMyA3LjEwMyAwIDAgMC01LjAzOCAyLjA4NyA3LjEwMSA3LjEwMSAwIDAgMC0yLjA4NiA0LjkyIDcuMTAzIDcuMTAzIDAgMCAwIDEuNzY2IDQuODE1bDEuOTQ1LTEuNTg0IDIuMzk0IDcuMTgyLTcuMjIyLTIuNDA4IDEuNzkxLTEuNzlBOC44NDYgOC44NDYgMCAwIDEgMy4xMjUgMTJjMC0yLjI3MS44NjYtNC41NDMgMi42LTYuMjc2eiIgc3Ryb2tlPSIjRkZGIiBzdHJva2Utd2lkdGg9Ii41IiBmaWxsPSIjMDAwIiBmaWxsLXJ1bGU9Im5vbnplcm8iLz48L2c+PC9zdmc+","font-colors-active":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTQgMTEgNC05IDQgOU02IDdoNCIgc3Ryb2tlPSIjMzM4MUZGIiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=","font-colors":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTQgMTEgNC05IDQgOU02IDdoNCIgc3Ryb2tlPSIjNDQ0RTYwIiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=","to-bottom":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEyIDEwdjhtMCAwLTItMm0yIDIgMi0ybS00IDZoMTJtLTYtNGg2bS02LTRoNm0tNi00aDYiIHN0cm9rZT0iIzQ0NEU2MCIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PC9zdmc+","to-top":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEyIDIydi04bTAgMC0yIDJtMi0yIDIgMm0tNC02aDEybS02IDRoNm0tNiA0aDZtLTYgNGg2IiBzdHJva2U9IiM0NDRFNjAiIGZpbGw9Im5vbmUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvc3ZnPg==","bold-active":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTQuNSAySDhhMi41IDIuNSAwIDAgMSAwIDVINS41aDBtLTEgMGg0YTMgMyAwIDAgMSAwIDZoLTQgMG0wIDFWMiIgc3Ryb2tlPSIjMzM4MUZGIiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=",bold:"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTQuNSAySDhhMi41IDIuNSAwIDAgMSAwIDVINS41aDBtLTEgMGg0YTMgMyAwIDAgMSAwIDZoLTQgMG0wIDFWMiIgc3Ryb2tlPSIjNDQ0RTYwIiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=","underline-active":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEyIDJ2NWE0IDQgMCAxIDEtOCAwVjJoME0zIDE0aDEwIiBzdHJva2U9IiMzMzgxRkYiIGZpbGw9Im5vbmUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvc3ZnPg==",underline:"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTEyIDJ2NWE0IDQgMCAxIDEtOCAwVjJoME0zIDE0aDEwIiBzdHJva2U9IiM0NDRFNjAiIGZpbGw9Im5vbmUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvc3ZnPg==","line-through-active":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTQgOGg4bS0xLTNhMyAzIDAgMCAwLTMtM2gtLjkzOEEyLjY0IDIuNjQgMCAwIDAgNC41IDRhMi41NyAyLjU3IDAgMCAwIDEuMzQ0IDIuOTIybDQuMzEyIDIuMTU2QTIuNTcgMi41NyAwIDAgMSAxMS41IDEyYTIuNjQgMi42NCAwIDAgMS0yLjU2MiAySDdhMyAzIDAgMCAxLTMtM2gwIiBzdHJva2U9IiMzMzgxRkYiIGZpbGw9Im5vbmUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvc3ZnPg==","line-through":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTQgOGg4bS0xLTNhMyAzIDAgMCAwLTMtM2gtLjkzOEEyLjY0IDIuNjQgMCAwIDAgNC41IDRhMi41NyAyLjU3IDAgMCAwIDEuMzQ0IDIuOTIybDQuMzEyIDIuMTU2QTIuNTcgMi41NyAwIDAgMSAxMS41IDEyYTIuNjQgMi42NCAwIDAgMS0yLjU2MiAySDdhMyAzIDAgMCAxLTMtM2gwIiBzdHJva2U9IiM0NDRFNjAiIGZpbGw9Im5vbmUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvc3ZnPg==","italic-active":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTcgMTQgOSAyTTUgMTRoNE03IDJoNCIgc3Ryb2tlPSIjMzM4MUZGIiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=",italic:"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTcgMTQgOSAyTTUgMTRoNE03IDJoNCIgc3Ryb2tlPSIjNDQ0RTYwIiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L3N2Zz4=","unlock-new":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48Y2lyY2xlIGZpbGw9IiMzMzgxRkYiIGN4PSIxNiIgY3k9IjE3IiByPSIxIi8+PHJlY3Qgc3Ryb2tlPSIjMzM4MUZGIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHg9IjExIiB5PSIxNCIgd2lkdGg9IjEwIiBoZWlnaHQ9IjgiIHJ4PSIyIi8+PHBhdGggZD0iTTEzIDE0di0xYTMgMyAwIDAgMSA2IDB2MWgwbS0zIDN2MyIgc3Ryb2tlPSIjMzM4MUZGIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L2c+PC9zdmc+","lock-new":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48Y2lyY2xlIGZpbGw9IiM0NDRFNjAiIGN4PSIxNiIgY3k9IjE3IiByPSIxIi8+PHJlY3Qgc3Ryb2tlPSIjNDQ0RTYwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHg9IjExIiB5PSIxNCIgd2lkdGg9IjEwIiBoZWlnaHQ9IjgiIHJ4PSIyIi8+PHBhdGggZD0iTTEzIDE0di0zYTMgMyAwIDAgMSA2IDB2MWgwbS0zIDV2MyIgc3Ryb2tlPSIjNDQ0RTYwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L2c+PC9zdmc+",shapes:"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTY4Mi42NjY2NjcgMTAyNEM2ODIuNjY2NjY3IDEwMjQgNjgyLjY2NjY2NyAxMDI0IDY4Mi42NjY2NjcgMTAyNEwxNzAuNjY2NjY3IDEwMjRjLTE3LjA2NjY2NyAwLTI5Ljg2NjY2Ny04LjUzMzMzMy0zOC40LTIxLjMzMzMzMy04LjUzMzMzMy0xMi44LTguNTMzMzMzLTI5Ljg2NjY2NyAwLTQyLjY2NjY2N2wyNTYtMzg0YzE3LjA2NjY2Ny0yNS42IDU1LjQ2NjY2Ny0yNS42IDcyLjUzMzMzMyAwbDI1MS43MzMzMzMgMzc5LjczMzMzM2M4LjUzMzMzMyA4LjUzMzMzMyAxMi44IDE3LjA2NjY2NyAxMi44IDI5Ljg2NjY2N0M3MjUuMzMzMzMzIDEwMDYuOTMzMzMzIDcwOC4yNjY2NjcgMTAyNCA2ODIuNjY2NjY3IDEwMjR6TTI1MS43MzMzMzMgOTM4LjY2NjY2N2wzNTQuMTMzMzMzIDBMNDI2LjY2NjY2NyA2NzQuMTMzMzMzIDI1MS43MzMzMzMgOTM4LjY2NjY2N3oiIGZpbGw9IiM0NDRFNjAiPjwvcGF0aD48cGF0aCBkPSJNOTgxLjMzMzMzMyA3MjUuMzMzMzMzbC0zNDEuMzMzMzMzIDBjLTI1LjYgMC00Mi42NjY2NjctMTcuMDY2NjY3LTQyLjY2NjY2Ny00Mi42NjY2NjdMNTk3LjMzMzMzMyAzNDEuMzMzMzMzYzAtMjUuNiAxNy4wNjY2NjctNDIuNjY2NjY3IDQyLjY2NjY2Ny00Mi42NjY2NjdsMzQxLjMzMzMzMyAwYzI1LjYgMCA0Mi42NjY2NjcgMTcuMDY2NjY3IDQyLjY2NjY2NyA0Mi42NjY2NjdsMCAzNDEuMzMzMzMzQzEwMjQgNzA4LjI2NjY2NyAxMDA2LjkzMzMzMyA3MjUuMzMzMzMzIDk4MS4zMzMzMzMgNzI1LjMzMzMzM3pNNjgyLjY2NjY2NyA2NDBsMjU2IDBMOTM4LjY2NjY2NyAzODRsLTI1NiAwTDY4Mi42NjY2NjcgNjQweiIgZmlsbD0iIzQ0NEU2MCI+PC9wYXRoPjxwYXRoIGQ9Ik0yNzcuMzMzMzMzIDU1NC42NjY2NjdDMTIzLjczMzMzMyA1NTQuNjY2NjY3IDAgNDMwLjkzMzMzMyAwIDI3Ny4zMzMzMzNTMTIzLjczMzMzMyAwIDI3Ny4zMzMzMzMgMCA1NTQuNjY2NjY3IDEyMy43MzMzMzMgNTU0LjY2NjY2NyAyNzcuMzMzMzMzIDQzMC45MzMzMzMgNTU0LjY2NjY2NyAyNzcuMzMzMzMzIDU1NC42NjY2Njd6TTI3Ny4zMzMzMzMgODUuMzMzMzMzQzE3MC42NjY2NjcgODUuMzMzMzMzIDg1LjMzMzMzMyAxNzAuNjY2NjY3IDg1LjMzMzMzMyAyNzcuMzMzMzMzUzE3MC42NjY2NjcgNDY5LjMzMzMzMyAyNzcuMzMzMzMzIDQ2OS4zMzMzMzMgNDY5LjMzMzMzMyAzODQgNDY5LjMzMzMzMyAyNzcuMzMzMzMzIDM4NCA4NS4zMzMzMzMgMjc3LjMzMzMzMyA4NS4zMzMzMzN6IiBmaWxsPSIjNDQ0RTYwIj48L3BhdGg+PC9zdmc+","shapes-active":"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTY4Mi42NjY2NjcgMTAyNEM2ODIuNjY2NjY3IDEwMjQgNjgyLjY2NjY2NyAxMDI0IDY4Mi42NjY2NjcgMTAyNEwxNzAuNjY2NjY3IDEwMjRjLTE3LjA2NjY2NyAwLTI5Ljg2NjY2Ny04LjUzMzMzMy0zOC40LTIxLjMzMzMzMy04LjUzMzMzMy0xMi44LTguNTMzMzMzLTI5Ljg2NjY2NyAwLTQyLjY2NjY2N2wyNTYtMzg0YzE3LjA2NjY2Ny0yNS42IDU1LjQ2NjY2Ny0yNS42IDcyLjUzMzMzMyAwbDI1MS43MzMzMzMgMzc5LjczMzMzM2M4LjUzMzMzMyA4LjUzMzMzMyAxMi44IDE3LjA2NjY2NyAxMi44IDI5Ljg2NjY2N0M3MjUuMzMzMzMzIDEwMDYuOTMzMzMzIDcwOC4yNjY2NjcgMTAyNCA2ODIuNjY2NjY3IDEwMjR6TTI1MS43MzMzMzMgOTM4LjY2NjY2N2wzNTQuMTMzMzMzIDBMNDI2LjY2NjY2NyA2NzQuMTMzMzMzIDI1MS43MzMzMzMgOTM4LjY2NjY2N3oiIGZpbGw9IiMzMzgxRkYiPjwvcGF0aD48cGF0aCBkPSJNOTgxLjMzMzMzMyA3MjUuMzMzMzMzbC0zNDEuMzMzMzMzIDBjLTI1LjYgMC00Mi42NjY2NjctMTcuMDY2NjY3LTQyLjY2NjY2Ny00Mi42NjY2NjdMNTk3LjMzMzMzMyAzNDEuMzMzMzMzYzAtMjUuNiAxNy4wNjY2NjctNDIuNjY2NjY3IDQyLjY2NjY2Ny00Mi42NjY2NjdsMzQxLjMzMzMzMyAwYzI1LjYgMCA0Mi42NjY2NjcgMTcuMDY2NjY3IDQyLjY2NjY2NyA0Mi42NjY2NjdsMCAzNDEuMzMzMzMzQzEwMjQgNzA4LjI2NjY2NyAxMDA2LjkzMzMzMyA3MjUuMzMzMzMzIDk4MS4zMzMzMzMgNzI1LjMzMzMzM3pNNjgyLjY2NjY2NyA2NDBsMjU2IDBMOTM4LjY2NjY2NyAzODRsLTI1NiAwTDY4Mi42NjY2NjcgNjQweiIgZmlsbD0iIzMzODFGRiI+PC9wYXRoPjxwYXRoIGQ9Ik0yNzcuMzMzMzMzIDU1NC42NjY2NjdDMTIzLjczMzMzMyA1NTQuNjY2NjY3IDAgNDMwLjkzMzMzMyAwIDI3Ny4zMzMzMzNTMTIzLjczMzMzMyAwIDI3Ny4zMzMzMzMgMCA1NTQuNjY2NjY3IDEyMy43MzMzMzMgNTU0LjY2NjY2NyAyNzcuMzMzMzMzIDQzMC45MzMzMzMgNTU0LjY2NjY2NyAyNzcuMzMzMzMzIDU1NC42NjY2Njd6TTI3Ny4zMzMzMzMgODUuMzMzMzMzQzE3MC42NjY2NjcgODUuMzMzMzMzIDg1LjMzMzMzMyAxNzAuNjY2NjY3IDg1LjMzMzMzMyAyNzcuMzMzMzMzUzE3MC42NjY2NjcgNDY5LjMzMzMzMyAyNzcuMzMzMzMzIDQ2OS4zMzMzMzMgNDY5LjMzMzMzMyAzODQgNDY5LjMzMzMzMyAyNzcuMzMzMzMzIDM4NCA4NS4zMzMzMzMgMjc3LjMzMzMzMyA4NS4zMzMzMzN6IiBmaWxsPSIjMzM4MUZGIj48L3BhdGg+PC9zdmc+","font-style-active":"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTM2MC4yMzQ2NjcgMjEzLjMzMzMzM0w1NTQuNjY2NjY3IDc3Ni4yNzczMzNoLTc2LjU0NGwtNTQuNjEzMzM0LTE3Mi4wMzJIMjE0LjE4NjY2N2wtNTUuNDY2NjY3IDE3Mi4wMzJIODUuMzMzMzMzTDI3OS43NjUzMzMgMjEzLjMzMzMzM2g4MC40NjkzMzR6IG00MTAuMDI2NjY2IDE3My44MjRjOTAuMTEyIDAgMTI4LjM0MTMzMyA2MC43NTczMzMgMTI4LjM0MTMzNCAxNTIuMjM0NjY3djIyOC4wMTA2NjdoLTUxLjJsLTUuNDYxMzM0LTQ0LjM3MzMzNGgtMi4wNDhjLTM1LjQ5ODY2NyAyOS4zNTQ2NjctNzcuMTQxMzMzIDUzLjI0OC0xMjIuODggNTMuMjQ4LTYyLjEyMjY2NyAwLTEwOC41NDQtMzguMjI5MzMzLTEwOC41NDQtMTA1LjEzMDY2NiAwLTgwLjU1NDY2NyA3MC4zMTQ2NjctMTIwLjgzMiAyMjguMDEwNjY3LTEzOC41ODEzMzQgMC00Ny43ODY2NjctMTUuNzAxMzMzLTkzLjUyNTMzMy03Ni40NTg2NjctOTMuNTI1MzMzLTQzLjAwOCAwLTgxLjkyIDE5Ljc5NzMzMy0xMTEuMjc0NjY2IDM5LjU5NDY2N2wtMjQuNTc2LTQzLjAwOGMzNC4xMzMzMzMtMjEuODQ1MzMzIDg2LjY5ODY2Ny00OC40NjkzMzMgMTQ2LjA5MDY2Ni00OC40NjkzMzR6IG02Ni4yMTg2NjcgMTg2LjM2OGMtMTI0LjkyOCAxNS4wMTg2NjctMTY3LjI1MzMzMyA0NS43Mzg2NjctMTY3LjI1MzMzMyA5My41MjUzMzQgMCA0Mi4zMjUzMzMgMjguNjcyIDU5LjM5MiA2NS41MzYgNTkuMzkyIDM2LjE4MTMzMyAwIDY1LjUzNi0xNy4wNjY2NjcgMTAxLjcxNzMzMy00OS4xNTJ6TTMyMC4zODQgMjcwLjkzMzMzM2gtMy4xMTQ2NjdjLTE3Ljk2MjY2NyA2Ni4wNDgtMzYuNjkzMzMzIDEyNi43Mi01Ny4wMDI2NjYgMTkwLjQ2NGwtMjguMTYgODYuMDE2aDE3My4zOTczMzNsLTI3LjMwNjY2Ny04Ni4wMTZBNDkxMy40OTMzMzMgNDkxMy40OTMzMzMgMCAwIDEgMzIwLjM4NCAyNzAuOTMzMzMzeiIgZmlsbD0iIzMzODFGRiI+PC9wYXRoPjwvc3ZnPg==","font-style":"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTM2MC4yMzQ2NjcgMjEzLjMzMzMzM0w1NTQuNjY2NjY3IDc3Ni4yNzczMzNoLTc2LjU0NGwtNTQuNjEzMzM0LTE3Mi4wMzJIMjE0LjE4NjY2N2wtNTUuNDY2NjY3IDE3Mi4wMzJIODUuMzMzMzMzTDI3OS43NjUzMzMgMjEzLjMzMzMzM2g4MC40NjkzMzR6IG00MTAuMDI2NjY2IDE3My44MjRjOTAuMTEyIDAgMTI4LjM0MTMzMyA2MC43NTczMzMgMTI4LjM0MTMzNCAxNTIuMjM0NjY3djIyOC4wMTA2NjdoLTUxLjJsLTUuNDYxMzM0LTQ0LjM3MzMzNGgtMi4wNDhjLTM1LjQ5ODY2NyAyOS4zNTQ2NjctNzcuMTQxMzMzIDUzLjI0OC0xMjIuODggNTMuMjQ4LTYyLjEyMjY2NyAwLTEwOC41NDQtMzguMjI5MzMzLTEwOC41NDQtMTA1LjEzMDY2NiAwLTgwLjU1NDY2NyA3MC4zMTQ2NjctMTIwLjgzMiAyMjguMDEwNjY3LTEzOC41ODEzMzQgMC00Ny43ODY2NjctMTUuNzAxMzMzLTkzLjUyNTMzMy03Ni40NTg2NjctOTMuNTI1MzMzLTQzLjAwOCAwLTgxLjkyIDE5Ljc5NzMzMy0xMTEuMjc0NjY2IDM5LjU5NDY2N2wtMjQuNTc2LTQzLjAwOGMzNC4xMzMzMzMtMjEuODQ1MzMzIDg2LjY5ODY2Ny00OC40NjkzMzMgMTQ2LjA5MDY2Ni00OC40NjkzMzR6IG02Ni4yMTg2NjcgMTg2LjM2OGMtMTI0LjkyOCAxNS4wMTg2NjctMTY3LjI1MzMzMyA0NS43Mzg2NjctMTY3LjI1MzMzMyA5My41MjUzMzQgMCA0Mi4zMjUzMzMgMjguNjcyIDU5LjM5MiA2NS41MzYgNTkuMzkyIDM2LjE4MTMzMyAwIDY1LjUzNi0xNy4wNjY2NjcgMTAxLjcxNzMzMy00OS4xNTJ6TTMyMC4zODQgMjcwLjkzMzMzM2gtMy4xMTQ2NjdjLTE3Ljk2MjY2NyA2Ni4wNDgtMzYuNjkzMzMzIDEyNi43Mi01Ny4wMDI2NjYgMTkwLjQ2NGwtMjguMTYgODYuMDE2aDE3My4zOTczMzNsLTI3LjMwNjY2Ny04Ni4wMTZBNDkxMy40OTMzMzMgNDkxMy40OTMzMzMgMCAwIDEgMzIwLjM4NCAyNzAuOTMzMzMzeiIgZmlsbD0iIzQ0NEU2MCI+PC9wYXRoPjwvc3ZnPg==",polygon:"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTkzMy4xMiA0OTAuNjY2NjY3bC0xOTItMzMyLjM3MzMzNGE0Mi42NjY2NjcgNDIuNjY2NjY3IDAgMCAwLTM3LjEyLTIxLjMzMzMzM2gtMzg0YTQyLjY2NjY2NyA0Mi42NjY2NjcgMCAwIDAtMzcuMTIgMjEuMzMzMzMzbC0xOTIgMzMyLjM3MzMzNGE0Mi42NjY2NjcgNDIuNjY2NjY3IDAgMCAwIDAgNDIuNjY2NjY2bDE5MiAzMzIuMzczMzM0YTQyLjY2NjY2NyA0Mi42NjY2NjcgMCAwIDAgMzcuMTIgMjEuMzMzMzMzaDM4NGE0Mi42NjY2NjcgNDIuNjY2NjY3IDAgMCAwIDM3LjEyLTIxLjMzMzMzM2wxOTItMzMyLjM3MzMzNGE0Mi42NjY2NjcgNDIuNjY2NjY3IDAgMCAwIDAtNDIuNjY2NjY2eiBtLTI1NiAzMTEuMDRIMzQ0Ljc0NjY2N0wxNzcuMDY2NjY3IDUxMmwxNjcuNjgtMjg5LjcwNjY2N2gzMzQuNTA2NjY2TDg0Ni45MzMzMzMgNTEyeiIgZmlsbD0iIzQ0NEU2MCI+PC9wYXRoPjwvc3ZnPg==","polygon-active":"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTkzMy4xMiA0OTAuNjY2NjY3bC0xOTItMzMyLjM3MzMzNGE0Mi42NjY2NjcgNDIuNjY2NjY3IDAgMCAwLTM3LjEyLTIxLjMzMzMzM2gtMzg0YTQyLjY2NjY2NyA0Mi42NjY2NjcgMCAwIDAtMzcuMTIgMjEuMzMzMzMzbC0xOTIgMzMyLjM3MzMzNGE0Mi42NjY2NjcgNDIuNjY2NjY3IDAgMCAwIDAgNDIuNjY2NjY2bDE5MiAzMzIuMzczMzM0YTQyLjY2NjY2NyA0Mi42NjY2NjcgMCAwIDAgMzcuMTIgMjEuMzMzMzMzaDM4NGE0Mi42NjY2NjcgNDIuNjY2NjY3IDAgMCAwIDM3LjEyLTIxLjMzMzMzM2wxOTItMzMyLjM3MzMzNGE0Mi42NjY2NjcgNDIuNjY2NjY3IDAgMCAwIDAtNDIuNjY2NjY2eiBtLTI1NiAzMTEuMDRIMzQ0Ljc0NjY2N0wxNzcuMDY2NjY3IDUxMmwxNjcuNjgtMjg5LjcwNjY2N2gzMzQuNTA2NjY2TDg0Ni45MzMzMzMgNTEyeiIgZmlsbD0iIzMzODFGRiI+PC9wYXRoPjwvc3ZnPg==","polygon-vertex":"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTA3NyAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTU0My40NzQ1MjYgNDIuMzA3MzY4YTExOS4zNzY4NDIgMTE5LjM3Njg0MiAwIDAgMSAxMTAuODA3NTc5IDE2My44NGwxOTAuNTcxNzkgMTM4LjYxNzI2NGExMTkuMzc2ODQyIDExOS4zNzY4NDIgMCAxIDEgODMuMzc1MTU4IDIxOC43MDQ4NDJsLTc0LjMyMDg0MiAyMjguODM3MDUyYTExOS4zMjI5NDcgMTE5LjMyMjk0NyAwIDAgMS02MS4yNzgzMTYgMjIxLjg4NDYzMmMtNDYuNzgwNjMyIDAtODcuMzA5NDc0LTI2Ljk0NzM2OC0xMDYuODczMjYzLTY2LjEyODg0MmgtMjg5LjQxNDczN2ExMTkuMzc2ODQyIDExOS4zNzY4NDIgMCAxIDEtMTc5LjczODk0OC0xNDcuODMzMjYzbC03Mi4yNzI4NDItMjIyLjY5MzA1My0zLjM5NTM2OCAwLjEwNzc4OUExMTkuMzc2ODQyIDExOS4zNzY4NDIgMCAwIDEgMjEuODI3MzY4IDQ2Ni43Mjg0MjFMMjEuNTU3ODk1IDQ1OC4yMTMwNTNhMTE5LjM3Njg0MiAxMTkuMzc2ODQyIDAgMCAxIDE4My44MzQ5NDctMTAwLjUxMzY4NWwyMjMuNTAxNDc0LTE2Mi4zODQ4NDJhMTE5LjQzMDczNyAxMTkuNDMwNzM3IDAgMCAxIDExNC41ODAyMS0xNTMuMDYxMDUyek0yODkuNDE0NzM3IDg0MC4wNTcyNjNhNTQuNzAzMTU4IDU0LjcwMzE1OCAwIDEgMCAwIDEwOS40MDYzMTYgNTQuNzAzMTU4IDU0LjcwMzE1OCAwIDAgMCAwLTEwOS40MDYzMTZ6IG01MDMuMTYxMjYzIDBhNTQuNzAzMTU4IDU0LjcwMzE1OCAwIDEgMCAwIDEwOS40MDYzMTYgNTQuNzAzMTU4IDU0LjcwMzE1OCAwIDAgMCAwLTEwOS40MDYzMTZ6TTQ2Mi42ODYzMTYgMjQ5LjU4NjUyNkwyNDguMTMxMzY4IDQwNS41NTc4OTVhMTE5LjMyMjk0NyAxMTkuMzIyOTQ3IDAgMCAxLTQyLjg0NjMxNSAxNTMuMjIyNzM3bDcwLjcwOTg5NCAyMTcuMzU3NDczYTExOS40MzA3MzcgMTE5LjQzMDczNyAwIDAgMSAxMzIuNDE5MzY5IDEwOC4yMjA2MzJINjczLjY4NDIxMWExMTkuNDMwNzM3IDExOS40MzA3MzcgMCAwIDEgMTE5LjE2MTI2My0xMDguOTc1MTU4bDcxLjE0MTA1Mi0yMTguOTc0MzE2YTExOS40MzA3MzcgMTE5LjQzMDczNyAwIDAgMS02Mi4wODY3MzctMTY0LjIxNzI2M2wtMTg2LjM2OC0xMzUuMjc1Nzg5Yy0xOS45OTQ5NDcgMTUuMDkwNTI2LTQ1LjAwMjEwNSAyNC4xNDQ4NDItNzIuMDU3MjYzIDI0LjE0NDg0MmExMTguOTQ1Njg0IDExOC45NDU2ODQgMCAwIDEtODAuNzg4MjEtMzEuNDc0NTI3eiBtLTMyMS43NTE1NzkgMTUzLjkyMzM2OWE1NC43MDMxNTggNTQuNzAzMTU4IDAgMSAwIDAgMTA5LjQwNjMxNiA1NC43MDMxNTggNTQuNzAzMTU4IDAgMCAwIDAtMTA5LjQwNjMxNnogbTc2Ny43MzA1MjYtMTIuNTU3NDc0YTU0LjcwMzE1OCA1NC43MDMxNTggMCAxIDAgMCAxMDkuNDA2MzE2IDU0LjcwMzE1OCA1NC43MDMxNTggMCAwIDAgMC0xMDkuNDA2MzE2eiBtLTM2NS4xOTA3MzctMjg0LjAyNTI2M2E1NC43MDMxNTggNTQuNzAzMTU4IDAgMSAwIDAgMTA5LjQ2MDIxIDU0LjcwMzE1OCA1NC43MDMxNTggMCAwIDAgMC0xMDkuNDA2MzE1eiIgZmlsbD0iIzQ0NEU2MCI+PC9wYXRoPjwvc3ZnPg==",star:"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTkwOC4xIDM1My4xbC0yNTMuOS0zNi45TDU0MC43IDg2LjFjLTMuMS02LjMtOC4yLTExLjQtMTQuNS0xNC41LTE1LjgtNy44LTM1LTEuMy00Mi45IDE0LjVMMzY5LjggMzE2LjJsLTI1My45IDM2LjljLTcgMS0xMy40IDQuMy0xOC4zIDkuMy0xMi4zIDEyLjctMTIuMSAzMi45IDAuNiA0NS4zbDE4My43IDE3OS4xLTQzLjQgMjUyLjljLTEuMiA2LjktMC4xIDE0LjEgMy4yIDIwLjMgOC4yIDE1LjYgMjcuNiAyMS43IDQzLjIgMTMuNEw1MTIgNzU0bDIyNy4xIDExOS40YzYuMiAzLjMgMTMuNCA0LjQgMjAuMyAzLjIgMTcuNC0zIDI5LjEtMTkuNSAyNi4xLTM2LjlsLTQzLjQtMjUyLjkgMTgzLjctMTc5LjFjNS00LjkgOC4zLTExLjMgOS4zLTE4LjMgMi43LTE3LjUtOS41LTMzLjctMjctMzYuM3pNNjY0LjggNTYxLjZsMzYuMSAyMTAuM0w1MTIgNjcyLjcgMzIzLjEgNzcybDM2LjEtMjEwLjMtMTUyLjgtMTQ5TDQxNy42IDM4MiA1MTIgMTkwLjcgNjA2LjQgMzgybDIxMS4yIDMwLjctMTUyLjggMTQ4Ljl6IiBmaWxsPSIjNDQ0RTYwIj48L3BhdGg+PC9zdmc+","star-active":"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTkwOC4xIDM1My4xbC0yNTMuOS0zNi45TDU0MC43IDg2LjFjLTMuMS02LjMtOC4yLTExLjQtMTQuNS0xNC41LTE1LjgtNy44LTM1LTEuMy00Mi45IDE0LjVMMzY5LjggMzE2LjJsLTI1My45IDM2LjljLTcgMS0xMy40IDQuMy0xOC4zIDkuMy0xMi4zIDEyLjctMTIuMSAzMi45IDAuNiA0NS4zbDE4My43IDE3OS4xLTQzLjQgMjUyLjljLTEuMiA2LjktMC4xIDE0LjEgMy4yIDIwLjMgOC4yIDE1LjYgMjcuNiAyMS43IDQzLjIgMTMuNEw1MTIgNzU0bDIyNy4xIDExOS40YzYuMiAzLjMgMTMuNCA0LjQgMjAuMyAzLjIgMTcuNC0zIDI5LjEtMTkuNSAyNi4xLTM2LjlsLTQzLjQtMjUyLjkgMTgzLjctMTc5LjFjNS00LjkgOC4zLTExLjMgOS4zLTE4LjMgMi43LTE3LjUtOS41LTMzLjctMjctMzYuM3pNNjY0LjggNTYxLjZsMzYuMSAyMTAuM0w1MTIgNjcyLjcgMzIzLjEgNzcybDM2LjEtMjEwLjMtMTUyLjgtMTQ5TDQxNy42IDM4MiA1MTIgMTkwLjcgNjA2LjQgMzgybDIxMS4yIDMwLjctMTUyLjggMTQ4Ljl6IiBmaWxsPSIjMzM4MUZGIj48L3BhdGg+PC9zdmc+","star-innerVertex":"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTg1LjMzMzMzMyAwYTg1LjMzMzMzMyA4NS4zMzMzMzMgMCAwIDEgODEuNDA4IDU5LjczMzMzM2g0OC4yMTMzMzR2ODUuMzMzMzM0TDE3MC42NjY2NjcgMTQ0Ljk4MTMzM1Y4NTMuMzMzMzMzaDY5My4zMzMzMzNsLTI2LjQ1MzMzMy02My40ODggNzguNzYyNjY2LTMyLjc2OCAzMi44NTMzMzQgNzguNzYyNjY3LTQyLjI0IDE3LjQ5MzMzM0g5MzguNjY2NjY3YTg1LjMzMzMzMyA4NS4zMzMzMzMgMCAwIDEgODQuNzM2IDc1LjM0OTMzNEwxMDI0IDkzOC42NjY2NjdhODUuMzMzMzMzIDg1LjMzMzMzMyAwIDAgMS0xNzAuNjY2NjY3IDBIMTcwLjY2NjY2N2E4NS4zMzMzMzMgODUuMzMzMzMzIDAgMSAxLTg1LjMzMzMzNC04NS4zMzMzMzRWMTcwLjY2NjY2N2E4NS4zMzMzMzMgODUuMzMzMzMzIDAgMSAxIDAtMTcwLjY2NjY2N3ogbTc2NS4zNTQ2NjcgNTk5LjQ2NjY2N2wzMi44NTMzMzMgNzguNzYyNjY2LTc4Ljg0OCAzMi44NTMzMzQtMzIuNzY4LTc4Ljc2MjY2NyA3OC43NjI2NjctMzIuODUzMzMzeiBtLTY1LjcwNjY2Ny0xNTcuNTI1MzM0bDMyLjg1MzMzNCA3OC43NjI2NjctNzguNzYyNjY3IDMyLjg1MzMzMy0zMi43NjgtNzguNzYyNjY2IDc4Ljc2MjY2Ny0zMi44NTMzMzR6TTcxOS4zNiAyODQuNDE2bDMyLjg1MzMzMyA3OC43NjI2NjctNzguNzYyNjY2IDMyLjg1MzMzMy0zMi44NTMzMzQtNzguNzYyNjY3IDc4Ljc2MjY2Ny0zMi44NTMzMzN6IG0tNjUuNjIxMzMzLTE1Ny41MjUzMzNsMzIuODUzMzMzIDc4Ljc2MjY2Ni03OC43NjI2NjcgMzIuODUzMzM0LTMyLjg1MzMzMy03OC43NjI2NjcgNzguNzYyNjY3LTMyLjg1MzMzM3pNMzg1LjcwNjY2NyA1OS43MzMzMzN2ODUuMzMzMzM0aC04NS4zMzMzMzR2LTg1LjMzMzMzNGg4NS4zMzMzMzR6IG0xNzAuNjY2NjY2IDB2ODUuMzMzMzM0aC04NS4zMzMzMzN2LTg1LjMzMzMzNGg4NS4zMzMzMzN6IiBmaWxsPSIjNDQ0RTYwIiA+PC9wYXRoPjwvc3ZnPg==","star-innerRatio":"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTU2OS4zNDQgNDQ5LjUzNmwxNDYuOTQ0IDI4LjY3MiAxLjAyNC00LjYwOHY0LjYwOGgxLjAyNGM5LjcyOCAwIDE2Ljg5Ni03LjY4IDIwLjQ4LTE0Ljg0OGwxLjAyNC0yLjA0OHYtMi41NmMwLTUuNjMyIDAtMTEuMjY0LTUuMTItMTYuMzg0LTMuMDcyLTMuMDcyLTcuMTY4LTcuMTY4LTEyLjgtNy42OGwtMTI0LjkyOC0yNC4wNjRMNTQxLjY5NiAyODYuNzJjLTIuMDQ4LTQuNjA4LTYuNjU2LTguMTkyLTExLjc3Ni05LjcyOC01LjEyLTEuNTM2LTEwLjc1Mi0xLjUzNi0xNS4zNiAxLjAyNGwtMS41MzYgMC41MTItMS4wMjQgMS4wMjRjLTguMTkyIDguMTkyLTEwLjc1MiAxOS40NTYtNi42NTYgMjcuMTM2bDY0IDE0Mi44NDh6IiBmaWxsPSIjMzM4MUZGIj48L3BhdGg+PHBhdGggZD0iTTkzMS4zMjggNDAzLjQ1NmMtMTAuMjQtMzUuMzI4LTM4LjQtNjEuNDQtNzEuNjgtNjYuNTZsLTE4NC44MzItMzUuODQtODIuNDMyLTE4Mi43ODRjLTEyLjgtMzMuMjgtNDYuMDgtNTYuMzItODAuMzg0LTU2LjMyLTMzLjc5MiAwLTY0LjUxMiAyMC40OC03OS44NzIgNTMuNzZMMzQ5LjE4NCAyOTkuMDA4bC0xODQuMzIgMzUuMzI4Yy0zMy43OTIgNS4xMi02MS45NTIgMzEuMjMyLTcyLjE5MiA2Ni41Ni05LjcyOCAzNC4zMDQtMS4wMjQgNzIuMTkyIDIzLjA0IDk4LjgxNmwxMzEuNTg0IDEzMy42MzItMzUuODQgMTk2LjYwOGMtNS42MzIgMzQuODE2IDguNzA0IDcxLjY4IDM1Ljg0IDk0LjIwOCAxMy44MjQgMTEuMjY0IDM0LjMwNCAxOC40MzIgNTIuMjI0IDE4LjQzMiAxNi44OTYgMCAyOS42OTYtMy4wNzIgNDEuNDcyLTEwLjI0bDE2OC45Ni05MS4xMzYgMTY2LjkxMiA5MS4xMzYgMS4wMjQgMC41MTJjMTYuODk2IDYuNjU2IDI5LjY5NiA5LjcyOCA0MC40NDggOS43MjggMTQuMzM2IDAgMjcuNjQ4LTQuMDk2IDQwLjQ0OC03LjY4IDQuNjA4LTEuNTM2IDkuNzI4LTMuMDcyIDE0Ljg0OC00LjA5NmwyLjU2LTAuNTEyIDIuMDQ4LTEuNTM2YzI1LjA4OC0yMy4wNCAzNy44ODgtNTguODggMzIuNzY4LTkzLjY5NmwtMzMuMjgtMTk2LjYwOCAxMzEuNTg0LTEzNi4xOTJjMjQuMDY0LTI3LjY0OCAzMi4yNTYtNjIuOTc2IDIyLjAxNi05OC44MTZ6TTI3Ni45OTIgODM2LjA5Nmw0MS45ODQtMjMxLjkzNi0xNTcuMTg0LTE1OS4yMzJjLTUuNjMyLTUuNjMyLTguMTkyLTE3LjQwOC02LjY1Ni0yOS4xODQgMy41ODQtMTAuMjQgMTAuMjQtMTYuMzg0IDE5LjQ1Ni0xNy45MmwyMTguMTEyLTQxLjk4NCA5Ni4yNTYtMjE1LjU1MmMzLjA3Mi03LjE2OCAxMi44LTE0LjMzNiAyMC40OC0xNC4zMzZzMTcuNDA4IDcuMTY4IDIwLjQ4IDE0Ljg0OGw5OC4zMDQgMjE1LjA0IDIxOC4xMTIgNDEuOTg0YzcuMTY4IDEuNTM2IDE1LjM2IDcuMTY4IDE2Ljg5NiAxNi4zODR2My4wNzJjMi4wNDggMTEuNzc2LTAuNTEyIDIyLjUyOC02LjY1NiAzMC43Mkw2OTkuOTA0IDYwOS4yOGwzOS45MzYgMjMxLjQyNGMxLjUzNiAxMC43NTItMi4wNDggMjAuNDgtMTAuMjQgMjcuMTM2bC0xLjAyNCAwLjUxMmMtMi41NiAyLjU2LTYuNjU2IDQuMDk2LTExLjI2NCA0LjA5Ni0yLjA0OCAwLTcuMTY4LTEuNTM2LTExLjI2NC0zLjU4NGwtMTk3LjEyLTEwOC4wMzItMTk5LjE2OCAxMDIuOTEyYy00LjA5NiAyLjA0OC05LjIxNiAzLjU4NC0xMS43NzYgMy41ODQtNC42MDggMC04LjcwNC0xLjUzNi0xMS4yNjQtNC4wOTZsLTEuMDI0LTAuNTEyYy02LjY1Ni02LjE0NC0xMC43NTItMTYuMzg0LTguNzA0LTI2LjYyNHoiIGZpbGw9IiM0NDRFNjAiPjwvcGF0aD48L3N2Zz4=",speechBallon:"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTgzMiA4MzJINDQ4bC0xMjggMTkyLTEyOC0xOTJjLTEwNi4wNDggMC0xOTItODYuMDE2LTE5Mi0xOTJWMTkyYTE5MiAxOTIgMCAwIDEgMTkyLTE5Mmg2NDBjMTA1Ljk4NCAwIDE5MiA4NS45NTIgMTkyIDE5MnY0NDhjMCAxMDUuOTg0LTg2LjAxNiAxOTItMTkyIDE5MnogbTY0LTY0MGE2NCA2NCAwIDAgMC02NC02NEgxOTJDMTU2LjY3MiAxMjggMTI4IDE1Ni42NzIgMTI4IDE5MnY0NDhhNjQgNjQgMCAwIDAgNjQgNjRoNDIuNjg4TDMyMCA4MzJsODUuMzEyLTEyOEg4MzJjMzUuMzkyIDAgNjQtMjguNjA4IDY0LTY0VjE5MnoiIGZpbGw9IiM0NDRFNjAiPjwvcGF0aD48L3N2Zz4=","speechBallon-active":"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTgzMiA4MzJINDQ4bC0xMjggMTkyLTEyOC0xOTJjLTEwNi4wNDggMC0xOTItODYuMDE2LTE5Mi0xOTJWMTkyYTE5MiAxOTIgMCAwIDEgMTkyLTE5Mmg2NDBjMTA1Ljk4NCAwIDE5MiA4NS45NTIgMTkyIDE5MnY0NDhjMCAxMDUuOTg0LTg2LjAxNiAxOTItMTkyIDE5MnogbTY0LTY0MGE2NCA2NCAwIDAgMC02NC02NEgxOTJDMTU2LjY3MiAxMjggMTI4IDE1Ni42NzIgMTI4IDE5MnY0NDhhNjQgNjQgMCAwIDAgNjQgNjRoNDIuNjg4TDMyMCA4MzJsODUuMzEyLTEyOEg4MzJjMzUuMzkyIDAgNjQtMjguNjA4IDY0LTY0VjE5MnoiIGZpbGw9IiMzMzgxRkYiPjwvcGF0aD48L3N2Zz4=","speechBallon-placement":"data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgMTAyNCAxMDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiI+PHBhdGggZD0iTTU3NiAyMTMuMzMzMzMzbDIyLjYxMzMzMyAyMi42MTMzMzRhMzIgMzIgMCAwIDAgMC00NS4yMjY2NjdMNTc2IDIxMy4zMzMzMzN6IG0tNjIuNzItMTA3Ljk0NjY2NmEzMiAzMiAwIDEgMC00NS4yMjY2NjcgNDUuMjI2NjY2bDQ1LjIyNjY2Ny00NS4yMjY2NjZ6IG0tNDUuMjI2NjY3IDE3MC42NjY2NjZhMzIgMzIgMCAwIDAgNDUuMjI2NjY3IDQ1LjIyNjY2N2wtNDUuMjI2NjY3LTQ1LjIyNjY2N3pNNDQ4IDgxMC42NjY2NjdsLTIyLjYxMzMzMy0yMi42MTMzMzRhMzIgMzIgMCAwIDAgMCA0NS4yMjY2NjdsMjIuNjEzMzMzLTIyLjYxMzMzM3ogbTEwNy45NDY2NjctNjIuNzJhMzIgMzIgMCAxIDAtNDUuMjI2NjY3LTQ1LjIyNjY2N2w0NS4yMjY2NjcgNDUuMjI2NjY3eiBtLTQ1LjIyNjY2NyAxNzAuNjY2NjY2YTMyIDMyIDAgMSAwIDQ1LjIyNjY2Ny00NS4yMjY2NjZsLTQ1LjIyNjY2NyA0NS4yMjY2NjZ6TTgxMC42NjY2NjcgNTc2bC0yMi42MTMzMzQgMjIuNjEzMzMzYTMyIDMyIDAgMCAwIDQ1LjIyNjY2NyAwTDgxMC42NjY2NjcgNTc2eiBtMTA3Ljk0NjY2Ni02Mi43MmEzMiAzMiAwIDEgMC00NS4yMjY2NjYtNDUuMjI2NjY3bDQ1LjIyNjY2NiA0NS4yMjY2Njd6IG0tMTcwLjY2NjY2Ni00NS4yMjY2NjdhMzIgMzIgMCAxIDAtNDUuMjI2NjY3IDQ1LjIyNjY2N2w0NS4yMjY2NjctNDUuMjI2NjY3ek0yMTMuMzMzMzMzIDQ0OGwyMi42MTMzMzQtMjIuNjEzMzMzYTMyIDMyIDAgMCAwLTQ1LjIyNjY2NyAwbDIyLjYxMzMzMyAyMi42MTMzMzN6IG02Mi43MiAxMDcuOTQ2NjY3YTMyIDMyIDAgMCAwIDQ1LjIyNjY2Ny00NS4yMjY2NjdsLTQ1LjIyNjY2NyA0NS4yMjY2Njd6IG0tMTcwLjY2NjY2Ni00NS4yMjY2NjdhMzIgMzIgMCAxIDAgNDUuMjI2NjY2IDQ1LjIyNjY2N2wtNDUuMjI2NjY2LTQ1LjIyNjY2N3pNMzA5LjMzMzMzMyAyMTMuMzMzMzMzQTc0LjY2NjY2NyA3NC42NjY2NjcgMCAwIDEgMjM0LjY2NjY2NyAyODh2NjRBMTM4LjY2NjY2NyAxMzguNjY2NjY3IDAgMCAwIDM3My4zMzMzMzMgMjEzLjMzMzMzM2gtNjR6TTIzNC42NjY2NjcgMjg4QTc0LjY2NjY2NyA3NC42NjY2NjcgMCAwIDEgMTYwIDIxMy4zMzMzMzNoLTY0QTEzOC42NjY2NjcgMTM4LjY2NjY2NyAwIDAgMCAyMzQuNjY2NjY3IDM1MnYtNjR6TTE2MCAyMTMuMzMzMzMzYzAtNDEuMjE2IDMzLjQ1MDY2Ny03NC42NjY2NjcgNzQuNjY2NjY3LTc0LjY2NjY2NnYtNjRBMTM4LjY2NjY2NyAxMzguNjY2NjY3IDAgMCAwIDk2IDIxMy4zMzMzMzNoNjR6TTIzNC42NjY2NjcgMTM4LjY2NjY2N2M0MS4yMTYgMCA3NC42NjY2NjcgMzMuNDUwNjY3IDc0LjY2NjY2NiA3NC42NjY2NjZoNjRBMTM4LjY2NjY2NyAxMzguNjY2NjY3IDAgMCAwIDIzNC42NjY2NjcgNzQuNjY2NjY3djY0ek0zNDEuMzMzMzMzIDI0NS4zMzMzMzNoMjM0LjY2NjY2N3YtNjRIMzQxLjMzMzMzM3Y2NHogbTI1Ny4yOC01NC42MTMzMzNsLTg1LjMzMzMzMy04NS4zMzMzMzMtNDUuMjI2NjY3IDQ1LjIyNjY2NiA4NS4zMzMzMzQgODUuMzMzMzM0IDQ1LjIyNjY2Ni00NS4yMjY2Njd6IG0tNDUuMjI2NjY2IDBsLTg1LjMzMzMzNCA4NS4zMzMzMzMgNDUuMjI2NjY3IDQ1LjIyNjY2NyA4NS4zMzMzMzMtODUuMzMzMzMzLTQ1LjIyNjY2Ni00NS4yMjY2Njd6TTY1MC42NjY2NjcgODEwLjY2NjY2N2ExMzguNjY2NjY3IDEzOC42NjY2NjcgMCAwIDAgMTM4LjY2NjY2NiAxMzguNjY2NjY2di02NEE3NC42NjY2NjcgNzQuNjY2NjY3IDAgMCAxIDcxNC42NjY2NjcgODEwLjY2NjY2N2gtNjR6IG0xMzguNjY2NjY2IDEzOC42NjY2NjZBMTM4LjY2NjY2NyAxMzguNjY2NjY3IDAgMCAwIDkyOCA4MTAuNjY2NjY3aC02NGE3NC42NjY2NjcgNzQuNjY2NjY3IDAgMCAxLTc0LjY2NjY2NyA3NC42NjY2NjZ2NjR6TTkyOCA4MTAuNjY2NjY3YTEzOC42NjY2NjcgMTM4LjY2NjY2NyAwIDAgMC0xMzguNjY2NjY3LTEzOC42NjY2Njd2NjRjNDEuMjE2IDAgNzQuNjY2NjY3IDMzLjQ1MDY2NyA3NC42NjY2NjcgNzQuNjY2NjY3aDY0eiBtLTEzOC42NjY2NjctMTM4LjY2NjY2N0ExMzguNjY2NjY3IDEzOC42NjY2NjcgMCAwIDAgNjUwLjY2NjY2NyA4MTAuNjY2NjY3aDY0YzAtNDEuMjE2IDMzLjQ1MDY2Ny03NC42NjY2NjcgNzQuNjY2NjY2LTc0LjY2NjY2N3YtNjR6IG0tMTA2LjY2NjY2NiAxMDYuNjY2NjY3aC0yMzQuNjY2NjY3djY0SDY4Mi42NjY2Njd2LTY0eiBtLTIxMi4wNTMzMzQgNTQuNjEzMzMzbDg1LjMzMzMzNC04NS4zMzMzMzMtNDUuMjI2NjY3LTQ1LjIyNjY2Ny04NS4zMzMzMzMgODUuMzMzMzMzIDQ1LjIyNjY2NiA0NS4yMjY2Njd6IG0tNDUuMjI2NjY2IDBsODUuMzMzMzMzIDg1LjMzMzMzMyA0NS4yMjY2NjctNDUuMjI2NjY2LTg1LjMzMzMzNC04NS4zMzMzMzQtNDUuMjI2NjY2IDQ1LjIyNjY2N3pNNjcyIDIzNC42NjY2NjdBMTM4LjY2NjY2NyAxMzguNjY2NjY3IDAgMCAwIDgxMC42NjY2NjcgMzczLjMzMzMzM3YtNjRhNzQuNjY2NjY3IDc0LjY2NjY2NyAwIDAgMS03NC42NjY2NjctNzQuNjY2NjY2aC02NHpNODEwLjY2NjY2NyAzNzMuMzMzMzMzYTEzOC42NjY2NjcgMTM4LjY2NjY2NyAwIDAgMCAxMzguNjY2NjY2LTEzOC42NjY2NjZoLTY0QTc0LjY2NjY2NyA3NC42NjY2NjcgMCAwIDEgODEwLjY2NjY2NyAzMDkuMzMzMzMzdjY0eiBtMTM4LjY2NjY2Ni0xMzguNjY2NjY2QTEzOC42NjY2NjcgMTM4LjY2NjY2NyAwIDAgMCA4MTAuNjY2NjY3IDk2djY0YzQxLjIxNiAwIDc0LjY2NjY2NyAzMy40NTA2NjcgNzQuNjY2NjY2IDc0LjY2NjY2N2g2NHpNODEwLjY2NjY2NyA5NmExMzguNjY2NjY3IDEzOC42NjY2NjcgMCAwIDAtMTM4LjY2NjY2NyAxMzguNjY2NjY3aDY0YzAtNDEuMjE2IDMzLjQ1MDY2Ny03NC42NjY2NjcgNzQuNjY2NjY3LTc0LjY2NjY2N3YtNjR6TTc3OC42NjY2NjcgMzQxLjMzMzMzM3YyMzQuNjY2NjY3aDY0VjM0MS4zMzMzMzNoLTY0eiBtNTQuNjEzMzMzIDI1Ny4yOGw4NS4zMzMzMzMtODUuMzMzMzMzLTQ1LjIyNjY2Ni00NS4yMjY2NjctODUuMzMzMzM0IDg1LjMzMzMzNCA0NS4yMjY2NjcgNDUuMjI2NjY2eiBtMC00NS4yMjY2NjZsLTg1LjMzMzMzMy04NS4zMzMzMzQtNDUuMjI2NjY3IDQ1LjIyNjY2NyA4NS4zMzMzMzMgODUuMzMzMzMzIDQ1LjIyNjY2Ny00NS4yMjY2NjZ6TTEzOC42NjY2NjcgNzg5LjMzMzMzM2MwLTQxLjIxNiAzMy40NTA2NjctNzQuNjY2NjY3IDc0LjY2NjY2Ni03NC42NjY2NjZ2LTY0YTEzOC42NjY2NjcgMTM4LjY2NjY2NyAwIDAgMC0xMzguNjY2NjY2IDEzOC42NjY2NjZoNjR6TTIxMy4zMzMzMzMgNzE0LjY2NjY2N2M0MS4yMTYgMCA3NC42NjY2NjcgMzMuNDUwNjY3IDc0LjY2NjY2NyA3NC42NjY2NjZoNjRBMTM4LjY2NjY2NyAxMzguNjY2NjY3IDAgMCAwIDIxMy4zMzMzMzMgNjUwLjY2NjY2N3Y2NHogbTc0LjY2NjY2NyA3NC42NjY2NjZBNzQuNjY2NjY3IDc0LjY2NjY2NyAwIDAgMSAyMTMuMzMzMzMzIDg2NHY2NGExMzguNjY2NjY3IDEzOC42NjY2NjcgMCAwIDAgMTM4LjY2NjY2Ny0xMzguNjY2NjY3aC02NHpNMjEzLjMzMzMzMyA4NjRhNzQuNjY2NjY3IDc0LjY2NjY2NyAwIDAgMS03NC42NjY2NjYtNzQuNjY2NjY3aC02NEExMzguNjY2NjY3IDEzOC42NjY2NjcgMCAwIDAgMjEzLjMzMzMzMyA5Mjh2LTY0ek0yNDUuMzMzMzMzIDY4Mi42NjY2Njd2LTIzNC42NjY2NjdoLTY0VjY4Mi42NjY2NjdoNjR6IG0tNTQuNjEzMzMzLTIxMi4wNTMzMzRsODUuMzMzMzMzIDg1LjMzMzMzNCA0NS4yMjY2NjctNDUuMjI2NjY3LTg1LjMzMzMzMy04NS4zMzMzMzMtNDUuMjI2NjY3IDQ1LjIyNjY2NnogbTAtNDUuMjI2NjY2bC04NS4zMzMzMzMgODUuMzMzMzMzIDQ1LjIyNjY2NiA0NS4yMjY2NjcgODUuMzMzMzM0LTg1LjMzMzMzNC00NS4yMjY2NjctNDUuMjI2NjY2eiIgIGZpbGw9IiM0NDRFNjAiPjwvcGF0aD48L3N2Zz4="};function Gd(c){return $o[c]}const _o=c=>{const{workIds:l,maranger:d}=c;return V.createElement("div",{className:"button normal-button",onClick:b=>{b.preventDefault(),b.stopPropagation(),j.emitMethod(v.MainEngine,C.DeleteNode,{workIds:l||[k],viewId:d.viewId})},onTouchEnd:b=>{b.stopPropagation(),j.emitMethod(v.MainEngine,C.DeleteNode,{workIds:l||[k],viewId:d.viewId})}},V.createElement("img",{alt:"icon",src:Gd("delete")}))},dI=c=>{const{workIds:l,viewId:d}=c;return V.createElement("div",{className:"button normal-button",onClick:b=>{b.preventDefault(),b.stopPropagation(),j.emitMethod(v.MainEngine,C.CopyNode,{workIds:l||[k],viewId:d})},onTouchEnd:b=>{b.stopPropagation(),j.emitMethod(v.MainEngine,C.CopyNode,{workIds:l||[k],viewId:d})}},V.createElement("img",{alt:"icon",src:Gd("duplicate")}))},$b=c=>{const{icon:l,onClickHandler:d,onTouchEndHandler:b}=c;return V.createElement("div",{className:"button normal-button",onClick:d,onTouchEnd:b},V.createElement("img",{src:Gd(l)}))},lI=c=>{const{open:l,setOpen:d,style:b}=c,{floatBarData:Z,maranger:i}=V.useContext(Xd),[m,X]=V.useState([]),s=V.useMemo(()=>{if(b&&b.bottom){const I={};return I.top="inherit",I.bottom=50,I}},[b]),G=V.useMemo(()=>l?V.createElement("div",{className:"image-layer-menu",style:s},V.createElement($b,{icon:"to-top",onClickHandler:I=>{I.preventDefault(),I.stopPropagation(),j.emitMethod(v.MainEngine,C.ZIndexNode,{workIds:[k],layer:Ed.Top,viewId:i==null?void 0:i.viewId})},onTouchEndHandler:I=>{I.stopPropagation(),j.emitMethod(v.MainEngine,C.ZIndexNode,{workIds:[k],layer:Ed.Top,viewId:i==null?void 0:i.viewId})}}),V.createElement($b,{icon:"to-bottom",onClickHandler:I=>{I.preventDefault(),I.stopPropagation(),j.emitMethod(v.MainEngine,C.ZIndexNode,{workIds:[k],layer:Ed.Bottom,viewId:i==null?void 0:i.viewId})},onTouchEndHandler:I=>{I.stopPropagation(),j.emitMethod(v.MainEngine,C.ZIndexNode,{workIds:[k],layer:Ed.Bottom,viewId:i==null?void 0:i.viewId})}})):null,[l,s]),p=I=>{I.preventDefault(),I.stopPropagation(),I.nativeEvent.stopImmediatePropagation();const o=!l;d(o),o&&j.emitMethod(v.MainEngine,C.ZIndexActive,{workId:k,isActive:o,viewId:i==null?void 0:i.viewId})},W=I=>{I.stopPropagation(),I.nativeEvent.stopImmediatePropagation();const o=!l;d(o),j.emitMethod(v.MainEngine,C.ZIndexActive,{workId:k,isActive:o,viewId:i==null?void 0:i.viewId})};return V.useEffect(()=>{sd(Z==null?void 0:Z.selectIds,m)||Z!=null&&Z.selectIds&&!sd(Z==null?void 0:Z.selectIds,m)&&(X(Z==null?void 0:Z.selectIds),d(!1))},[l,Z,m,d]),V.useEffect(()=>()=>{l&&j.emitMethod(v.MainEngine,C.ZIndexActive,{workId:k,isActive:!1,viewId:i==null?void 0:i.viewId})},[l]),V.createElement("div",{className:`button normal-button ${l&&"active"}`,onClick:p,onTouchEnd:W},G,V.createElement("img",{alt:"icon",src:Gd(l?"layer-pressed":"layer")}))},bI=c=>{const{activeColor:l,onClickHandler:d,onTouchEndHandler:b}=c;return V.createElement("div",{className:`font-color-button ${l==="transparent"?"active":""}`,onClick:d,onTouchEnd:b},V.createElement("div",{className:"circle none"}))},Zb=c=>{const{color:l,activeColor:d,onClickHandler:b,onTouchEndHandler:Z}=c;return V.createElement("div",{className:`font-color-button ${l===d?"active":""}`,onClick:b,onTouchEnd:Z},V.createElement("div",{className:"circle",style:{backgroundColor:Wd(l,1)}}))},cb=c=>{const{opacity:l,activeColor:d,setCurOpacity:b}=c,[Z,i]=V.useState({x:108,y:0});if(V.useEffect(()=>{i({x:l*100+8,y:0})},[]),!d)return null;const m=cd((G,p)=>{G.preventDefault(),G.stopPropagation(),p.x!==(Z==null?void 0:Z.x)&&i({x:p.x,y:0});const W=Math.min(Math.max(p.x-8,0),100)/100;l!==W&&b(W,d,K.Doing)},100,{leading:!1}),X=G=>{G.preventDefault(),G.stopPropagation(),b(l,d,K.Start)},s=cd((G,p)=>{G.preventDefault(),G.stopPropagation(),p.x!==(Z==null?void 0:Z.x)&&i({x:p.x,y:0});const W=Math.min(Math.max(p.x-8,0),100)/100;b(W,d,K.Done)},100,{leading:!1});return V.createElement("div",{className:"font-color-opacity",style:{marginLeft:"10px"},onClick:G=>{const p=G.nativeEvent.offsetX,W=Math.min(Math.max(p-12,0),100)/100;i({x:W*100+8,y:0}),b(W,d,K.Done)}},V.createElement("div",{className:"range-color",style:{background:`linear-gradient(to right, ${Wd(d,0)}, ${Wd(d,1)})`}}),V.createElement("div",{className:"range-opacity"},V.createElement(Zl,{bounds:"parent",axis:"x",position:Z,onDrag:m,onStart:X,onStop:s},V.createElement("div",{className:"circle",style:{backgroundColor:Wd(d,l)},onClick:G=>{G==null||G.preventDefault(),G==null||G.stopPropagation()}}))))},ZI=c=>{const{open:l,setOpen:d,floatBarRef:b}=c,{floatBarData:Z,floatBarColors:i,maranger:m,position:X,setFloatBarData:s}=V.useContext(Xd),[G,p]=V.useState(),[W,I]=V.useState(1);V.useEffect(()=>{if(Z!=null&&Z.strokeColor){const[L,n]=bb(Z.strokeColor);p(L),I(n)}},[Z]);const o=V.useMemo(()=>{if(b!=null&&b.current&&X&&(m!=null&&m.height)){if(b.current.offsetTop&&b.current.offsetTop+X.y>180){const L={};return L.top="inherit",L.bottom=50,L}else if(!b.current.offsetTop&&(m==null?void 0:m.height)-b.current.offsetTop-X.y<120){const L={};return L.top="inherit",L.bottom=50,L}}},[b,X,m]),u=V.useMemo(()=>V.createElement(cb,{key:"strokeColors",opacity:W,activeColor:G,setCurOpacity:(L,n,a)=>{a===K.Start&&(m!=null&&m.control.room)&&(m.control.room.disableDeviceInputs=!0),a===K.Done&&(m!=null&&m.control.room)&&(m.control.room.disableDeviceInputs=!1),I(L);const x=Wd(n,L);Z!=null&&Z.strokeColor&&(Z.strokeColor=x,s({strokeColor:x})),j.emitMethod(v.MainEngine,C.SetColorNode,{workIds:[k],strokeColor:x,workState:a,viewId:m==null?void 0:m.viewId})}}),[W,G,m==null?void 0:m.control.room,m==null?void 0:m.viewId,Z]),y=V.useMemo(()=>l?V.createElement("div",{className:"font-colors-menu",style:o,onTouchEnd:L=>{L.stopPropagation(),L.nativeEvent.stopImmediatePropagation()},onClick:L=>{L.preventDefault(),L.stopPropagation(),L.nativeEvent.stopImmediatePropagation()}},i.concat().map((L,n)=>{const a=Kl(...L);return V.createElement(Zb,{key:n,color:a,activeColor:G,onTouchEndHandler:x=>{x.stopPropagation(),p(a);const R=Wd(a,W);Z!=null&&Z.strokeColor&&(Z.strokeColor=R,s({strokeColor:R})),j.emitMethod(v.MainEngine,C.SetColorNode,{workIds:[k],strokeColor:R,viewId:m==null?void 0:m.viewId})},onClickHandler:x=>{x.preventDefault(),x.stopPropagation(),p(a);const R=Wd(a,W);Z!=null&&Z.strokeColor&&(Z.strokeColor=R,s({strokeColor:R})),j.emitMethod(v.MainEngine,C.SetColorNode,{workIds:[k],strokeColor:R,viewId:m==null?void 0:m.viewId})}})}),u):null,[l,i,u,G,W,Z,m==null?void 0:m.viewId,o]),Y=V.useMemo(()=>G?V.createElement("div",{className:"color-bar-ring",style:{backgroundColor:Wd(G,W)}},V.createElement("div",{className:"circle"})):null,[G,W]);return V.createElement("div",{className:`button normal-button font-colors-icon ${l&&"active"}`,onTouchEnd:L=>{L.stopPropagation(),L.nativeEvent.stopImmediatePropagation(),d(!l)},onClick:L=>{L.preventDefault(),L.stopPropagation(),L.nativeEvent.stopImmediatePropagation(),d(!l)}},Y,y)},cI=c=>{const{open:l,setOpen:d,floatBarRef:b}=c,{floatBarData:Z,floatBarColors:i,maranger:m,position:X,setFloatBarData:s}=V.useContext(Xd),[G,p]=V.useState(),[W,I]=V.useState(1);V.useEffect(()=>{if(Z!=null&&Z.fillColor){const[L,n]=(Z==null?void 0:Z.fillColor)==="transparent"&&["transparent",1]||bb(Z.fillColor);p(L),I(n)}},[Z]);const o=V.useMemo(()=>{if(b!=null&&b.current&&X&&(m!=null&&m.height)){if(b.current.offsetTop&&b.current.offsetTop+X.y>200){const L={};return L.top="inherit",L.bottom=50,L}else if(!b.current.offsetTop&&(m==null?void 0:m.height)-b.current.offsetTop-X.y<140){const L={};return L.top="inherit",L.bottom=50,L}}},[b,X,m]),u=V.useMemo(()=>G&&G!=="transparent"?V.createElement(cb,{key:"fillColors",opacity:W||0,activeColor:G,setCurOpacity:(L,n,a)=>{a===K.Start&&(m!=null&&m.control.room)&&(m.control.room.disableDeviceInputs=!0),a===K.Done&&(m!=null&&m.control.room)&&(m.control.room.disableDeviceInputs=!1),I(L);const x=Wd(n,L);Z!=null&&Z.fillColor&&(Z.fillColor=x,s({fillColor:x})),j.emitMethod(v.MainEngine,C.SetColorNode,{workIds:[k],fillColor:G&&Wd(n,L),workState:a,viewId:m==null?void 0:m.viewId})}}):null,[G,W,m==null?void 0:m.control.room,m==null?void 0:m.viewId,Z]),y=V.useMemo(()=>l?V.createElement("div",{className:"font-colors-menu",style:o,onTouchEnd:L=>{L.stopPropagation(),L.nativeEvent.stopImmediatePropagation()},onClick:L=>{L.preventDefault(),L.stopPropagation(),L.nativeEvent.stopImmediatePropagation()}},V.createElement(bI,{activeColor:G,onTouchEndHandler:L=>{L.stopPropagation(),p("transparent");const n="transparent";Z!=null&&Z.fillColor&&(Z.fillColor=n,s({fillColor:n})),j.emitMethod(v.MainEngine,C.SetColorNode,{workIds:[k],fillColor:n,viewId:m==null?void 0:m.viewId})},onClickHandler:L=>{L.preventDefault(),L.stopPropagation(),p("transparent");const n="transparent";Z!=null&&Z.fillColor&&(Z.fillColor=n,s({fillColor:n})),j.emitMethod(v.MainEngine,C.SetColorNode,{workIds:[k],fillColor:n,viewId:m==null?void 0:m.viewId})}}),i.map((L,n)=>{const a=Kl(...L);return V.createElement(Zb,{key:n,color:a,activeColor:G,onTouchEndHandler:x=>{x.stopPropagation(),p(a);const R=Wd(a,W);Z!=null&&Z.fillColor&&(Z.fillColor=R,s({fillColor:R})),j.emitMethod(v.MainEngine,C.SetColorNode,{workIds:[k],fillColor:R,viewId:m==null?void 0:m.viewId})},onClickHandler:x=>{x.preventDefault(),x.stopPropagation(),p(a);const R=Wd(a,W);Z!=null&&Z.fillColor&&(Z.fillColor=R,s({fillColor:R})),j.emitMethod(v.MainEngine,C.SetColorNode,{workIds:[k],fillColor:R,viewId:m==null?void 0:m.viewId})}})}),u):null,[l,G,i,u,Z,m==null?void 0:m.viewId,W,o]),Y=V.useMemo(()=>{const L=G&&G!=="transparent"&&Wd(G,W)||"transparent";return V.createElement("div",{className:"color-bar-fill"},V.createElement("div",{className:"circle",style:{backgroundColor:L}}))},[G,W]);return V.createElement("div",{className:`button normal-button font-colors-icon ${l&&"active"}`,onTouchEnd:L=>{L.stopPropagation(),L.nativeEvent.stopImmediatePropagation(),d(!l)},onClick:L=>{L.preventDefault(),L.stopPropagation(),L.nativeEvent.stopImmediatePropagation(),d(!l)}},Y,y)},iI=c=>{const{open:l,setOpen:d,textOpt:b,workIds:Z,floatBarRef:i}=c,{floatBarColors:m,maranger:X,position:s,setFloatBarData:G,floatBarData:p}=V.useContext(Xd),[W,I]=V.useState(),[o,u]=V.useState(1);V.useEffect(()=>{if(b!=null&&b.fontColor){const[a,x]=(b==null?void 0:b.fontColor)==="transparent"&&["transparent",0]||bb(b.fontColor);I(a),u(x)}},[b==null?void 0:b.fontColor]);const y=V.useMemo(()=>{if(i!=null&&i.current&&s&&(X!=null&&X.height)){if(i.current.offsetTop&&i.current.offsetTop+s.y>180){const a={};return a.top="inherit",a.bottom=50,a}else if(!i.current.offsetTop&&(X==null?void 0:X.height)-i.current.offsetTop-s.y<120){const a={};return a.top="inherit",a.bottom=50,a}}},[i,s,X]),Y=V.useMemo(()=>W&&W!=="transparent"?V.createElement(cb,{key:"fontColors",opacity:o,activeColor:W,setCurOpacity:(a,x,R)=>{R===K.Start&&(X!=null&&X.control.room)&&(X.control.room.disableDeviceInputs=!0),R===K.Done&&(X!=null&&X.control.room)&&(X.control.room.disableDeviceInputs=!1),u(a);const S=Wd(x,a);p!=null&&p.textOpt&&(p.textOpt.fontColor=S,G({textOpt:p.textOpt})),j.emitMethod(v.MainEngine,C.SetColorNode,{workIds:Z||[k],fontColor:W&&S,workState:R,viewId:X==null?void 0:X.viewId})}}):null,[W,o,X==null?void 0:X.control.room,X==null?void 0:X.viewId,p==null?void 0:p.textOpt,Z]),L=V.useMemo(()=>l?V.createElement("div",{className:"font-colors-menu",style:y,onTouchEnd:a=>{a.stopPropagation(),a.nativeEvent.stopImmediatePropagation()},onClick:a=>{a.preventDefault(),a.stopPropagation(),a.nativeEvent.stopImmediatePropagation()}},m.map((a,x)=>{const R=Kl(...a);return V.createElement(Zb,{key:x,color:R,activeColor:W,onTouchEndHandler:S=>{S.stopPropagation(),I(R);const J=Wd(R,o);p!=null&&p.textOpt&&(p.textOpt.fontColor=J,G({textOpt:p.textOpt})),j.emitMethod(v.MainEngine,C.SetColorNode,{workIds:Z||[k],fontColor:J,viewId:X==null?void 0:X.viewId})},onClickHandler:S=>{S.preventDefault(),S.stopPropagation(),I(R);const J=Wd(R,o);p!=null&&p.textOpt&&(p.textOpt.fontColor=J,G({textOpt:p.textOpt})),j.emitMethod(v.MainEngine,C.SetColorNode,{workIds:Z||[k],fontColor:J,viewId:X==null?void 0:X.viewId})}})}),Y):null,[l,m,Y,W,o,p==null?void 0:p.textOpt,Z,X==null?void 0:X.viewId,y]),n=V.useMemo(()=>{const a=W&&W!=="transparent"&&Wd(W,o)||"transparent";return V.createElement("div",{className:"color-bar"},V.createElement("div",{className:"color-bar-color",style:{backgroundColor:a}}))},[W,o]);return V.createElement("div",{className:`button normal-button font-colors-icon ${l&&"active"}`,onTouchEnd:a=>{a.stopPropagation(),a.nativeEvent.stopImmediatePropagation(),d(!l)},onClick:a=>{a.preventDefault(),a.stopPropagation(),a.nativeEvent.stopImmediatePropagation(),d(!l)}},V.createElement("img",{alt:"icon",src:Gd("font-colors")}),n,L)},mI=c=>{const{bold:l,setBold:d,workIds:b,viewId:Z}=c,i=m=>{const X=l==="bold"?"normal":"bold";m==null||m.preventDefault(),m==null||m.stopPropagation(),d(X),j.emitMethod(v.MainEngine,C.SetFontStyle,{workIds:b,viewId:Z,bold:X})};return V.createElement("div",{className:"font-style-button",onClick:i,onTouchEnd:i},V.createElement("img",{alt:"icon",src:Gd(l==="bold"?"bold-active":"bold")}))},XI=c=>{const{underline:l,setUnderline:d,workIds:b,viewId:Z}=c,i=m=>{const X=!l;m==null||m.preventDefault(),m==null||m.stopPropagation(),d(X),j.emitMethod(v.MainEngine,C.SetFontStyle,{workIds:b,viewId:Z,underline:X})};return V.createElement("div",{className:"font-style-button",onClick:i,onTouchEnd:i},V.createElement("img",{alt:"icon",src:Gd(l?"underline-active":"underline")}))},sI=c=>{const{lineThrough:l,setLineThrough:d,workIds:b,viewId:Z}=c,i=m=>{const X=!l;m==null||m.preventDefault(),m==null||m.stopPropagation(),d(X),j.emitMethod(v.MainEngine,C.SetFontStyle,{workIds:b,viewId:Z,lineThrough:X})};return V.createElement("div",{className:"font-style-button",onClick:i,onTouchEnd:i},V.createElement("img",{alt:"icon",src:Gd(l?"line-through-active":"line-through")}))},GI=c=>{const{italic:l,setItalic:d,workIds:b,viewId:Z}=c,i=m=>{const X=l==="italic"?"normal":"italic";m==null||m.preventDefault(),m==null||m.stopPropagation(),d(X),j.emitMethod(v.MainEngine,C.SetFontStyle,{workIds:b,viewId:Z,italic:X})};return V.createElement("div",{className:"font-style-button",onClick:i,onTouchEnd:i},V.createElement("img",{alt:"icon",src:Gd(l==="italic"?"italic-active":"italic")}))},WI=c=>{const{open:l,setOpen:d,textOpt:b,workIds:Z,style:i}=c,{maranger:m}=V.useContext(Xd),[X,s]=V.useState("normal"),[G,p]=V.useState("normal"),[W,I]=V.useState(!1),[o,u]=V.useState(!1);V.useEffect(()=>{b!=null&&b.bold&&s(b.bold),Ld(b==null?void 0:b.underline)&&I(b.underline||!1),Ld(b==null?void 0:b.lineThrough)&&u(b.lineThrough||!1),b!=null&&b.italic&&p(b.italic)},[b]);const y=V.useMemo(()=>{if(i&&i.bottom){const L={};return L.top="inherit",L.bottom=50,L}},[i]),Y=V.useMemo(()=>l?V.createElement("div",{className:"font-style-menu",style:y,onTouchEnd:L=>{L.stopPropagation(),L.nativeEvent.stopImmediatePropagation()},onClick:L=>{L.preventDefault(),L.stopPropagation(),L.nativeEvent.stopImmediatePropagation()}},V.createElement(mI,{workIds:Z||[k],bold:X,setBold:s,viewId:m==null?void 0:m.viewId}),V.createElement(XI,{workIds:Z||[k],underline:W,setUnderline:I,viewId:m==null?void 0:m.viewId}),V.createElement(sI,{workIds:Z||[k],lineThrough:o,setLineThrough:u,viewId:m==null?void 0:m.viewId}),V.createElement(GI,{workIds:Z||[k],italic:G,setItalic:p,viewId:m==null?void 0:m.viewId})):null,[l,Z,X,m==null?void 0:m.viewId,W,o,G,y]);return V.createElement("div",{className:`button normal-button ${l&&"active"}`,onTouchEnd:L=>{L.stopPropagation(),L.nativeEvent.stopImmediatePropagation(),d(!l)},onClick:L=>{L.preventDefault(),L.stopPropagation(),L.nativeEvent.stopImmediatePropagation(),d(!l)}},V.createElement("img",{alt:"icon",src:Gd(l?"font-style-active":"font-style")}),Y)},od=Object.freeze([12,14,18,24,36,48,64,80,144,288]),Bd=["top","topLeft","topRight","bottom","bottomLeft","bottomRight","left","leftTop","leftBottom","right","rightTop","rightBottom"],VI=c=>{const{style:l,onClickHandler:d}=c;return V.createElement("div",{className:"font-size-menu",style:l,onTouchEnd:b=>{b.stopPropagation(),b.nativeEvent.stopImmediatePropagation()},onClick:b=>{b.preventDefault(),b.stopPropagation(),b.nativeEvent.stopImmediatePropagation()}},od.map(b=>V.createElement("div",{className:"font-size-btn",key:b,onClick:()=>{d(b)},onTouchEnd:()=>{d(b)}},b)))},pI=c=>{const l=V.useRef(null),{open:d,setOpen:b,textOpt:Z,workIds:i,floatBarRef:m}=c,{maranger:X,position:s}=V.useContext(Xd),[G,p]=V.useState(0),[W,I]=V.useState(),o=od.length-1;V.useEffect(()=>{Z!=null&&Z.fontSize&&(p(Z.fontSize),l.current&&(l.current.value=Z.fontSize.toString()))},[Z==null?void 0:Z.fontSize]);const u=V.useMemo(()=>{if(m!=null&&m.current&&s&&(X!=null&&X.height)){if(m.current.offsetTop&&m.current.offsetTop+s.y>250){const a={};return a.top="inherit",a.bottom=35,a}else if(!m.current.offsetTop&&(X==null?void 0:X.height)-m.current.offsetTop-s.y<180){const a={};return a.top="inherit",a.bottom=35,a}}},[m,s,X]);function y(a){p(a),a&&a>=od[0]&&a<=od[o]&&j.emitMethod(v.MainEngine,C.SetFontStyle,{workIds:i||[k],fontSize:a,viewId:X==null?void 0:X.viewId})}const Y=a=>{var x;p(a),b(!1),(x=l.current)==null||x.blur(),a&&a>=od[0]&&a<=od[o]&&j.emitMethod(v.MainEngine,C.SetFontStyle,{workIds:i||[k],fontSize:a,viewId:X==null?void 0:X.viewId})},L=V.useMemo(()=>d?V.createElement(VI,{onClickHandler:Y,style:u}):null,[d,Y,u]),n=a=>{a>od[o]&&(a=od[o]),a<od[0]&&(a=od[0]),y(a)};return V.useEffect(()=>()=>{X!=null&&X.control.room&&Ld(W)&&(X.control.room.disableDeviceInputs=W)},[X,W]),V.createElement("div",{className:"button normal-button font-size-barBtn",style:{width:50},onTouchEnd:a=>{a.stopPropagation(),a.nativeEvent.stopImmediatePropagation()},onClick:a=>{a.preventDefault(),a.stopPropagation(),a.nativeEvent.stopImmediatePropagation()}},V.createElement("input",{className:"font-size-input",ref:l,onTouchEnd:()=>{l.current&&l.current.focus()},onClick:()=>{b(!d),l.current&&l.current.focus()},onKeyDown:a=>{if(a.key==="Backspace"){const x=window.getSelection(),R=x==null?void 0:x.getRangeAt(0);if(R!=null&&R.collapsed)return a.preventDefault(),document.execCommand("delete",!1),!1}},onKeyUp:()=>{if(l.current){const a=l.current.value,x=parseInt(a);isNaN(x)?l.current.value="0":l.current.value=x.toString()}},onChange:a=>{const x=a.target.value,R=parseInt(x);R&&y(R)},onFocus:()=>{X!=null&&X.control.room&&!X.control.room.disableDeviceInputs&&(I(X.control.room.disableDeviceInputs),X.control.room.disableDeviceInputs=!0)},onBlur:()=>{X!=null&&X.control.room&&Ld(W)&&(X.control.room.disableDeviceInputs=W)}}),V.createElement("div",{className:"font-size-btns"},V.createElement("div",{className:"font-size-add",onClick:()=>{n(G+od[0])},onTouchEnd:()=>{n(G+od[0])}}),V.createElement("div",{className:"font-size-cut",onClick:()=>{n(G-od[0])},onTouchEnd:()=>{n(G-od[0])}})),L)},oI=c=>{const{workIds:l,maranger:d,islocked:b}=c;return V.createElement("div",{className:"button normal-button",onClick:Z=>{Z.preventDefault(),Z.stopPropagation(),j.emitMethod(v.MainEngine,C.SetLock,{workIds:l||[k],isLocked:!b,viewId:d==null?void 0:d.viewId})},onTouchEnd:Z=>{Z.stopPropagation(),j.emitMethod(v.MainEngine,C.SetLock,{workIds:l||[k],isLocked:!b,viewId:d==null?void 0:d.viewId})}},V.createElement("img",{alt:"icon",src:Gd(b?"unlock-new":"lock-new")}))},wl=c=>{const{icon:l,min:d,max:b,step:Z,value:i,onInputHandler:m}=c,[X,s]=V.useState(0),G=V.useRef(null),p=W=>{W>b&&(W=b),W<d&&(W=d),s(W),m(W),G.current&&(G.current.value=W.toString())};return V.useEffect(()=>{i&&(s(i),G.current&&(G.current.value=i.toString()))},[i]),V.createElement("div",{className:"button input-button",onTouchEnd:W=>{W.stopPropagation(),W.nativeEvent.stopImmediatePropagation()},onClick:W=>{W.preventDefault(),W.stopPropagation(),W.nativeEvent.stopImmediatePropagation()}},V.createElement("img",{src:Gd(l)}),V.createElement("input",{className:"input-number",type:"text",ref:G,onTouchEnd:()=>{G.current&&G.current.focus()},onClick:()=>{G.current&&G.current.focus()},onKeyDown:W=>{if(W.key==="Backspace"){const I=window.getSelection(),o=I==null?void 0:I.getRangeAt(0);if(o!=null&&o.collapsed)return W.preventDefault(),document.execCommand("delete",!1),!1}},onKeyUp:()=>{if(G.current){const W=G.current.value,I=parseInt(W);isNaN(I)?G.current.value="0":G.current.value=I.toString()}},onChange:W=>{const I=W.target.value,o=parseInt(I);o&&o&&o>=d&&o<=b&&p(o)}}),V.createElement("div",{className:"input-number-btns"},V.createElement("div",{className:"input-number-add",onClick:()=>{p(X+Z)},onTouchEnd:()=>{p(X+Z)}}),V.createElement("div",{className:"input-number-cut",onClick:()=>{p(X-Z)},onTouchEnd:()=>{p(X-Z)}})))},II=c=>{const{icon:l,min:d,max:b,step:Z,value:i,onInputHandler:m}=c;return V.createElement("div",{className:"button input-button"},V.createElement("img",{src:Gd(l)}),V.createElement(LI,{min:d,max:b,step:Z,value:i,onInputHandler:m}))},LI=c=>{const{value:l,min:d,max:b,onInputHandler:Z}=c,[i,m]=V.useState({x:0,y:0});V.useEffect(()=>{m({x:l*100,y:0})},[]);const X=cd((p,W)=>{p.preventDefault(),p.stopPropagation();let I=Math.floor(Math.max(W.x,d*100));I=Math.floor(Math.min(I,b*100)),W.x!==(i==null?void 0:i.x)&&m({x:I,y:0});const o=I/100;console.log("first1--doing",W,W.x,I,o),l!==o&&Z(o)},100,{leading:!1}),s=p=>{p.preventDefault(),p.stopPropagation()},G=cd((p,W)=>{p.preventDefault(),p.stopPropagation();let I=Math.floor(Math.max(W.x,d*100));I=Math.floor(Math.min(I,b*100)),W.x!==(i==null?void 0:i.x)&&m({x:I,y:0});const o=I/100;console.log("first1--end",W,W.x,I,o),l!==o&&Z(o)},100,{leading:!1});return console.log("position",i),V.createElement("div",{className:"range-number-container",onClick:p=>{const W=p.nativeEvent.offsetX-6;let I=Math.floor(Math.max(W,d*100));I=Math.floor(Math.min(I,b*100)),m({x:I,y:0});const o=I/100;console.log("first1",p.nativeEvent.offsetX,I,o),l!==o&&Z(o)}},V.createElement("div",{className:"range-number-color"}),V.createElement("div",{className:"range-number"},V.createElement(Zl,{bounds:"parent",axis:"x",position:i,onDrag:X,onStart:s,onStop:G},V.createElement("div",{className:"circle",onClick:s}))))},hI=c=>{const{icon:l,value:d,onChangeHandler:b,style:Z}=c,[i,m]=V.useState(0),[X,s]=V.useState(),G=V.useRef(null),p=V.useCallback(o=>{o>=Bd.length&&(o=0),o<0&&(o=Bd.length-1),m(o),b(Bd[o]),s(!1),G.current&&(G.current.value=Bd[o])},[b]),W=V.useMemo(()=>{if(Z&&Z.bottom){const o={};return o.top="inherit",o.bottom=50,o}},[Z]);V.useEffect(()=>{d&&(m(Bd.indexOf(d)),G.current&&(G.current.value=d))},[d]);const I=V.useMemo(()=>X?V.createElement(uI,{options:Bd,onClickHandler:p,style:W}):null,[X,p,W]);return V.createElement("div",{className:"button input-button"},V.createElement("img",{src:Gd(l)}),V.createElement("input",{readOnly:!0,className:"input-number",type:"text",ref:G,onTouchEnd:()=>{G.current&&G.current.focus()},onClick:()=>{G.current&&(G.current.focus(),s(!X))}}),V.createElement("div",{className:"input-number-btns"},V.createElement("div",{className:"input-number-add",onClick:()=>{p(i+1)},onTouchEnd:()=>{p(i+1)}}),V.createElement("div",{className:"input-number-cut",onClick:()=>{p(i-1)},onTouchEnd:()=>{p(i-1)}})),I)},uI=c=>{const{options:l,style:d,onClickHandler:b}=c;return V.createElement("div",{className:"select-option-menu",style:d,onTouchEnd:Z=>{Z.stopPropagation(),Z.nativeEvent.stopImmediatePropagation()},onClick:Z=>{Z.preventDefault(),Z.stopPropagation(),Z.nativeEvent.stopImmediatePropagation()}},l.map((Z,i)=>V.createElement("div",{className:"select-option-btn",key:Z,onClick:()=>{b(i)},onTouchEnd:()=>{b(i)}},Z)))},aI=c=>{const{maranger:l,innerRatio:d,innerVerticeStep:b,vertices:Z}=c,i=s=>{console.log("onInputHandler",s),j.emitMethod(v.MainEngine,C.SetShapeOpt,{workIds:[k],toolsType:t.Star,viewId:l.viewId,vertices:s})},m=s=>{console.log("onInputHandler",s),j.emitMethod(v.MainEngine,C.SetShapeOpt,{workIds:[k],toolsType:t.Star,viewId:l.viewId,innerVerticeStep:s})},X=s=>{console.log("onInputHandler",s),j.emitMethod(v.MainEngine,C.SetShapeOpt,{workIds:[k],toolsType:t.Star,viewId:l.viewId,innerRatio:s})};return V.createElement(V.Fragment,null,V.createElement(wl,{value:Z,icon:"polygon-vertex",min:3,max:100,step:1,onInputHandler:i}),V.createElement(wl,{value:b,icon:"star-innerVertex",min:1,max:100,step:1,onInputHandler:m}),V.createElement(II,{value:d,icon:"star-innerRatio",min:.1,max:1,step:.1,onInputHandler:X}))},tI=c=>{const{maranger:l,vertices:d}=c,b=Z=>{j.emitMethod(v.MainEngine,C.SetShapeOpt,{workIds:[k],toolsType:t.Polygon,viewId:l.viewId,vertices:Z})};return V.createElement(wl,{value:d,icon:"polygon-vertex",min:3,max:100,step:1,onInputHandler:b})},yI=c=>{const{maranger:l,placement:d}=c,b=Z=>{console.log("onChangeHandler-SpeechBalloonFormView",Z),j.emitMethod(v.MainEngine,C.SetShapeOpt,{workIds:[k],toolsType:t.SpeechBalloon,viewId:l.viewId,placement:Z})};return V.createElement(hI,{value:d,icon:"speechBallon-placement",onChangeHandler:b})},Tl=c=>{const{icon:l,isActive:d,onClickHandler:b,onTouchEndHandler:Z}=c;return V.createElement("div",{className:`button tab-button ${d?"active":""}`,onClick:b,onTouchEnd:Z},V.createElement("img",{src:Gd(l)}))},nI=c=>{const{toolsTypes:l,style:d,maranger:b,shapeOpt:Z}=c,[i,m]=V.useState();V.useEffect(()=>{l.includes(t.Polygon)?m(t.Polygon):l.includes(t.Star)?m(t.Star):m(t.SpeechBalloon)},[l]);const X=(W,I)=>{I==null||I.preventDefault(),I==null||I.stopPropagation(),m(W)},s=V.useMemo(()=>i===t.Polygon&&b&&Z.vertices?V.createElement(tI,{vertices:Z.vertices,maranger:b}):null,[b,i,Z]),G=V.useMemo(()=>i===t.Star&&b&&Z.vertices&&Z.innerVerticeStep&&Z.innerRatio?V.createElement(aI,{maranger:b,vertices:Z.vertices,innerVerticeStep:Z.innerVerticeStep,innerRatio:Z.innerRatio}):null,[b,i,Z]),p=V.useMemo(()=>i===t.SpeechBalloon&&b&&Z.placement?V.createElement(yI,{maranger:b,placement:Z.placement}):null,[b,i,Z]);return V.createElement("div",{className:"shapeOpt-sub-menu",style:d,onClick:W=>{W.stopPropagation(),W.nativeEvent.stopImmediatePropagation(),W==null||W.preventDefault()}},V.createElement("div",{className:"shapeOpt-sub-menu-tabs"},l.includes(t.Polygon)&&V.createElement(Tl,{isActive:i===t.Polygon,icon:i===t.Polygon?"polygon-active":"polygon",onClickHandler:X.bind(void 0,t.Polygon),onTouchEndHandler:X.bind(void 0,t.Polygon)})||null,l.includes(t.Star)&&V.createElement(Tl,{isActive:i===t.Star,icon:i===t.Star?"star-active":"star",onClickHandler:X.bind(void 0,t.Star),onTouchEndHandler:X.bind(void 0,t.Star)})||null,l.includes(t.SpeechBalloon)&&V.createElement(Tl,{isActive:i===t.SpeechBalloon,icon:i===t.SpeechBalloon?"speechBallon-active":"speechBallon",onClickHandler:X.bind(void 0,t.SpeechBalloon),onTouchEndHandler:X.bind(void 0,t.SpeechBalloon)})||null),V.createElement("div",{className:"shapeOpt-sub-menu-content"},s,G,p))},YI=c=>{const{open:l,setOpen:d,floatBarRef:b,toolsTypes:Z,shapeOpt:i}=c,{floatBarData:m,maranger:X,position:s}=V.useContext(Xd),[G,p]=V.useState([]),[W,I]=V.useState(),o=V.useMemo(()=>{if(b!=null&&b.current&&s&&(X!=null&&X.height)){if(b.current.offsetTop&&b.current.offsetTop+s.y>200){const L={};return L.top="inherit",L.bottom=50,L}else if(!b.current.offsetTop&&(X==null?void 0:X.height)-b.current.offsetTop-s.y<140){const L={};return L.top="inherit",L.bottom=50,L}}},[b,s,X]),u=V.useMemo(()=>l&&Z&&X&&i?(X.control.room&&!X.control.room.disableDeviceInputs&&(I(X.control.room.disableDeviceInputs),X.control.room.disableDeviceInputs=!0),V.createElement(nI,{shapeOpt:i,style:o,toolsTypes:Z,maranger:X})):(X!=null&&X.control.room&&Ld(W)&&(X.control.room.disableDeviceInputs=W),null),[l,o,Z,X,i]),y=L=>{L.preventDefault(),L.stopPropagation(),L.nativeEvent.stopImmediatePropagation(),d(!l)},Y=L=>{L.stopPropagation(),L.nativeEvent.stopImmediatePropagation(),d(!l)};return V.useEffect(()=>{sd(m==null?void 0:m.selectIds,G)||m!=null&&m.selectIds&&!sd(m==null?void 0:m.selectIds,G)&&(p(m==null?void 0:m.selectIds),d(!1))},[l,m,G,d]),V.useEffect(()=>()=>{l&&X!=null&&X.control.room&&Ld(W)&&(X.control.room.disableDeviceInputs=W)},[l,X,W]),V.createElement("div",{className:`button normal-button ${l&&"active"}`,onClick:y,onTouchEnd:Y},u,V.createElement("img",{alt:"icon",src:Gd(l?"shapes-active":"shapes")}))},gZ=V.memo(c=>{const{textOpt:l,workIds:d,noLayer:b,position:Z}=c,{floatBarData:i,maranger:m}=V.useContext(Xd),[X,s]=V.useState(0),G=V.useRef(null),p=V.useMemo(()=>{var S,J,F;const a={},x=(i==null?void 0:i.w)||((S=l==null?void 0:l.boxSize)==null?void 0:S[0])||0,R=(i==null?void 0:i.h)||((J=l==null?void 0:l.boxSize)==null?void 0:J[1])||0;if(Z&&x&&R&&(m!=null&&m.width)&&(m!=null&&m.height)){if(Z.y<60&&(Z.y+x<m.height-60?a.bottom=-120:Z.y+R<m.height?a.bottom=-58:Z.y>0?a.top=62:a.top=-Z.y+62),Z.x<0)a.left=-Z.x+3;else if(Z.x+(((F=G.current)==null?void 0:F.offsetWidth)||x)>m.width){const w=x+Z.x-m.width;a.left="initial",a.right=w}return a}},[G,Z,i==null?void 0:i.w,i==null?void 0:i.h,m==null?void 0:m.width,m==null?void 0:m.height,l==null?void 0:l.boxSize]),W=V.useMemo(()=>i!=null&&i.fillColor?V.createElement(cI,{floatBarRef:G,open:X===3,setOpen:a=>{s(a===!0?3:0)}}):null,[i==null?void 0:i.fillColor,X,G]),I=V.useMemo(()=>i!=null&&i.strokeColor?V.createElement(ZI,{floatBarRef:G,open:X===2,setOpen:a=>{s(a===!0?2:0)}}):null,[i==null?void 0:i.strokeColor,X,G]),o=V.useMemo(()=>l!=null&&l.fontColor&&(m!=null&&m.viewId)?V.createElement(iI,{floatBarRef:G,open:X===4,setOpen:a=>{s(a===!0?4:0)},textOpt:l,workIds:d}):null,[l,X,d,m,G]),u=V.useMemo(()=>l&&(m!=null&&m.viewId)?V.createElement(WI,{open:X===6,setOpen:a=>{s(a===!0?6:0)},textOpt:l,workIds:d,style:p}):null,[l,X,d,m,p]),y=V.useMemo(()=>l&&(m!=null&&m.viewId)?V.createElement(pI,{open:X===7,setOpen:a=>{s(a===!0?7:0)},textOpt:l,workIds:d,floatBarRef:G}):null,[l,X,d,m,G]),Y=V.useMemo(()=>b?null:V.createElement(lI,{open:X===1,setOpen:a=>{s(a===!0?1:0)},floatBarRef:G}),[b,X,G]),L=V.useMemo(()=>i!=null&&i.canLock&&m?V.createElement(oI,{workIds:d,maranger:m,islocked:i.isLocked}):null,[i,m,d]),n=V.useMemo(()=>m&&(m!=null&&m.viewId)&&p&&(i!=null&&i.shapeOpt)&&(i!=null&&i.toolsTypes)?V.createElement(YI,{open:X===8,setOpen:a=>{s(a===!0?8:0)},floatBarRef:G,workIds:d,toolsTypes:i.toolsTypes,shapeOpt:i.shapeOpt}):null,[i,m,X,p,d,G]);return V.createElement("div",{className:"bezier-pencil-plugin-floatbtns",style:p,ref:G},m&&V.createElement(_o,{workIds:d,maranger:m}),Y,L,!!(m!=null&&m.viewId)&&V.createElement(dI,{workIds:d,viewId:m.viewId}),n,y,u,o,I,W)}),RI=c=>{const{data:l,isActive:d,manager:b,workId:Z}=c,{opt:i,scale:m,translate:X,x:s,y:G}=l,p=`scale(${m||1}) ${X&&"translate("+X[0]+"px,"+X[1]+"px)"||""}`,{fontSize:W,fontFamily:I,underline:o,fontColor:u,lineThrough:y,textAlign:Y,strokeColor:L,lineHeight:n,bold:a,italic:x,uid:R}=i,S=W,J=n||S*1.2,F={fontSize:`${S}px`,lineHeight:`${J}px`,color:u,borderColor:L,minHeight:`${J}px`};I&&(F.fontFamily=`${I}`),(y||o)&&(F.textDecoration=`${y&&"line-through"||""}${o&&" underline"||""}`),a&&(F.fontWeight=`${a}`),x&&(F.fontStyle=`${x}`),Y&&(F.textAlign=`${Y}`);let w="";i!=null&&i.text&&(w=i.text.split(",").reduce((B,g,_)=>{const q=g===""?"<br/>":g;return _===0?q:`${B}<div>${q}</div>`},""));function H(){var M,B;console.log("onServiceDerive---handleClick",d,R,(M=b.control.collector)==null?void 0:M.uid),d&&(R&&R===((B=b.control.collector)==null?void 0:B.uid)||!R)&&b.control.textEditorManager.active(Z)}return V.createElement("div",{className:"editor-box",style:{left:`${s}px`,top:`${G}px`,transform:p,transformOrigin:"left top",pointerEvents:"none"}},V.createElement("div",{className:`editor ${d?"":"readOnly"}`,style:F,dangerouslySetInnerHTML:{__html:w},onClick:H}))},xI=V.memo(c=>{const{data:l,position:d,workId:b,selectIds:Z,updateOptInfo:i}=c,[m,X]=V.useState([0,0]),{opt:s,scale:G,translate:p,x:W,y:I}=l,o=V.useRef(null);V.useEffect(()=>{md(W)&&md(I)&&X([W-((d==null?void 0:d.x)||0),I-((d==null?void 0:d.y)||0)])},[W,I,Z,b]),V.useEffect(()=>{var g,_;if((g=o.current)!=null&&g.offsetWidth&&((_=o.current)!=null&&_.offsetHeight)){const q=s.boxSize;((q==null?void 0:q[0])!==o.current.offsetWidth||q[1]!==o.current.offsetHeight||!q)&&(console.log("updateForViewEdited---1--0",b,q,[o.current.offsetWidth,o.current.offsetHeight]),i({activeTextId:b,update:{boxSize:[o.current.offsetWidth,o.current.offsetHeight],workState:K.Done},syncData:{canSync:!0,canWorker:!0}}))}},[s.fontSize]);const u=`scale(${G||1}) ${p&&"translate("+p[0]+"px,"+p[1]+"px)"||""}`,{fontSize:y,fontFamily:Y,underline:L,fontColor:n,lineThrough:a,textAlign:x,strokeColor:R,lineHeight:S,bold:J,italic:F}=s,w=y,H=S||w*1.2,M={fontSize:`${w}px`,lineHeight:`${H}px`,color:n,borderColor:R,minHeight:`${H}px`,pointerEvents:"none"};Y&&(M.fontFamily=`${Y}`),(a||L)&&(M.textDecoration=`${a&&"line-through"||""}${L&&" underline"||""}`),x&&(M.textAlign=`${x}`),J&&(M.fontWeight=`${J}`),F&&(M.fontStyle=`${F}`);let B="";return s!=null&&s.text&&(B=s.text.split(",").reduce((_,q,$)=>{const O=q===""?"<br/>":q;return $===0?O:`${_}<div>${O}</div>`},"")),V.createElement("div",{className:"editor-box",style:{left:`${m[0]}px`,top:`${m[1]}px`,transform:u,transformOrigin:"left top",zIndex:1,pointerEvents:"none"}},V.createElement("div",{className:"editor readOnly",ref:o,style:M,dangerouslySetInnerHTML:{__html:B}}))}),SI=c=>{const{data:l,workId:d,isSelect:b,handleKeyUp:Z,handleFocus:i,updateOptInfo:m,showFloatBtns:X,manager:s}=c,[G,p]=V.useState(),{opt:W,scale:I,translate:o,x:u,y}=l,[Y,L]=V.useState(""),n=V.useRef(null);V.useEffect(()=>{let e="";W!=null&&W.text&&(e=W.text.split(",").reduce((P,id,Vd)=>{const nd=id===""?"<br/>":id;return Vd===0?nd:`${P}<div>${nd}</div>`},"")),L(e),Promise.resolve().then(()=>{n.current&&n.current.click()})},[]),V.useEffect(()=>{var e,U;(e=n.current)!=null&&e.offsetWidth&&((U=n.current)!=null&&U.offsetHeight)&&m({activeTextId:d,update:{boxSize:[n.current.offsetWidth,n.current.offsetHeight],workState:K.Doing}})});const a=`scale(${I||1}) ${o&&"translate("+o[0]+"px,"+o[1]+"px)"||""}`,{fontSize:x,fontFamily:R,underline:S,fontColor:J,lineThrough:F,textAlign:w,strokeColor:H,lineHeight:M,bold:B,italic:g}=W,_=x,q=M||_*1.2,$={transform:a,transformOrigin:"left top",fontSize:`${_}px`,lineHeight:`${q}px`,color:J,borderColor:H,minHeight:`${q}px`};R&&($.fontFamily=`${R}`),(F||S)&&($.textDecoration=`${F&&"line-through"||""} ${S&&" underline"||""}`),w&&($.textAlign=`${w}`),B&&($.fontWeight=`${B}`),g&&($.fontStyle=`${g}`);function O(){var e;if(n.current){n.current.focus();const U=window==null?void 0:window.getSelection(),P=n.current.lastChild;if(U&&P){const id=document.createRange(),Vd=((e=P.textContent)==null?void 0:e.length)||0;(P==null?void 0:P.nodeName)==="#text"?id.setStart(P,Vd):id.setStart(P,Vd&&1||0),id.collapse(!0),U.removeAllRanges(),U.addRange(id)}}}function f(e){if(e.key==="Backspace"){const U=window.getSelection(),P=U==null?void 0:U.getRangeAt(0);if(P!=null&&P.collapsed)return e.preventDefault(),document.execCommand("delete",!1),!1}return!1}function A(e){var U,P;if(e.preventDefault(),n.current){let id=(e.clipboardData||window.clipboardData).getData("text");id=id.toUpperCase();const Vd=window==null?void 0:window.getSelection();if(!(Vd!=null&&Vd.rangeCount))return;const nd=id.split(/\n/);if(Vd&&nd.length){Vd.deleteFromDocument();const Jd=document.createRange();let pd=n.current.lastChild;if(!pd){const Nd=document.createTextNode(nd[0]);if(n.current.appendChild(Nd),nd.length===1){const il=((U=Nd.textContent)==null?void 0:U.length)||0;Jd.setStart(Nd,il),Jd.collapse(!0),Vd.removeAllRanges(),Vd.addRange(Jd);return}}if((pd==null?void 0:pd.nodeName)==="#text"&&(pd.textContent=pd.textContent+nd[0],nd.length===1)){const Nd=((P=pd.textContent)==null?void 0:P.length)||0;Jd.setStart(pd,Nd),Jd.collapse(!0),Vd.removeAllRanges(),Vd.addRange(Jd);return}(pd==null?void 0:pd.nodeName)==="DIV"&&(pd.innerText=pd.innerText+nd[0]);for(let Nd=1;Nd<nd.length;Nd++){const il=nd[Nd];if(il){const mb=document.createElement("div");mb.innerText=il,n.current.appendChild(mb)}}pd=n.current.lastChild,pd&&Jd.setStart(pd,1),Jd.collapse(!0),Vd.removeAllRanges(),Vd.addRange(Jd)}}}return V.createElement("div",{className:"editor-box",style:{left:`${u}px`,top:`${y}px`,zIndex:2,pointerEvents:"none"},onFocus:()=>{s.control.room&&!s.control.room.disableDeviceInputs&&(p(s.control.room.disableDeviceInputs),s.control.room.disableDeviceInputs=!0)},onBlur:()=>{s!=null&&s.control.room&&Ld(G)&&(s.control.room.disableDeviceInputs=G)},onKeyDown:e=>(e.stopPropagation(),!0),onMouseMove:e=>(e.stopPropagation(),e.preventDefault(),!0)},!b&&X&&V.createElement(gZ,{textOpt:W,workIds:[d],noLayer:!0,position:{x:u,y}}),V.createElement("div",{id:d,contentEditable:!0,className:"editor",ref:n,style:$,dangerouslySetInnerHTML:{__html:Y},onKeyDown:f,onKeyUp:Z,onClick:O,onTouchEnd:O,onFocus:i,onPaste:A}))};class QZ extends V.Component{constructor(l){super(l)}getInnerText(l){const d=[];for(let b=0;b<l.childNodes.length;b++){const Z=l.childNodes[b];if(Z.nodeName==="#text"&&b===0){const i=Z.textContent.split(/\n/),m=i.pop();d.push(...i),m&&d.push(m)}else if(Z.nodeName==="DIV"){const i=Z.innerText.split(/\n/);if(i.length===2&&i[0]===""&&i[1]==="")d.push("");else{const m=i.shift();m&&d.push(m);const X=i.pop();d.push(...i),X&&d.push(X)}}}return d}updateOptInfo(l){var m,X;const{activeTextId:d,update:b,syncData:Z}=l,i=d&&Zd(((m=this.props.manager.control.textEditorManager)==null?void 0:m.get(d))||((X=this.props.editors)==null?void 0:X.get(d)));i&&i.opt&&(i.opt={...i.opt,...b},Z&&(i.canSync=Z.canSync,i.canWorker=Z.canWorker),this.props.manager.control.textEditorManager.updateForViewEdited(d,i))}get editorUI(){var l;if((l=this.props.editors)!=null&&l.size){const d=[];return this.props.editors.forEach((b,Z)=>{if(this.props.selectIds.includes(Z)&&!(this.props.activeTextId==Z)){const m=V.createElement(xI,{key:Z,data:b,workId:Z,isSelect:!0,position:this.props.position,selectIds:this.props.selectIds,updateOptInfo:this.updateOptInfo.bind(this),manager:this.props.manager});d.push(m)}}),d}return null}render(){return V.createElement("div",{ref:this.props.textRef},this.editorUI)}}class KI extends QZ{constructor(l){super(l)}handleKeyUp(l){const d=this.getInnerText(l.nativeEvent.target),b=this.props.activeTextId;b&&this.updateOptInfo({activeTextId:b,update:{text:d.toString(),boxSize:[l.nativeEvent.target.offsetWidth,l.nativeEvent.target.offsetHeight],workState:K.Doing},syncData:{canSync:!0,canWorker:!0}})}handleFocus(l){const d=this.props.activeTextId;d&&this.updateOptInfo({activeTextId:d,update:{boxSize:[l.nativeEvent.target.offsetWidth,l.nativeEvent.target.offsetHeight],workState:K.Doing},syncData:{canSync:!0,canWorker:!0}})}get editorUI(){var l;if((l=this.props.editors)!=null&&l.size){const d=[];return this.props.editors.forEach((b,Z)=>{if(!(this.props.selectIds.includes(Z)&&this.props.activeTextId!==Z)){const X=this.props.activeTextId==Z?V.createElement(SI,{key:Z,data:b,workId:Z,showFloatBtns:this.props.showFloatBtns||!1,handleFocus:this.handleFocus.bind(this),handleKeyUp:this.handleKeyUp.bind(this),updateOptInfo:this.updateOptInfo.bind(this),manager:this.props.manager}):V.createElement(RI,{manager:this.props.manager,isActive:b.opt.workState===K.Doing||b.opt.workState===K.Start||!1,key:Z,data:b,workId:Z});d.push(X)}}),d}return null}render(){return V.createElement("div",{className:`${this.props.className}`},this.editorUI)}}const CI=()=>{const{floatBarData:c}=V.useContext(Xd);return V.createElement("div",{className:"bezier-pencil-plugin-hightlight-box",style:{borderColor:c==null?void 0:c.selectorColor}},V.createElement("div",{className:"point LT nwse-resize",style:{backgroundColor:c==null?void 0:c.selectorColor}}),V.createElement("div",{className:"point LC ew-resize",style:{backgroundColor:c==null?void 0:c.selectorColor}}),V.createElement("div",{className:"point LB nesw-resize",style:{backgroundColor:c==null?void 0:c.selectorColor}}),V.createElement("div",{className:"point TC ns-resize",style:{backgroundColor:c==null?void 0:c.selectorColor}}),V.createElement("div",{className:"point RT nesw-resize",style:{backgroundColor:c==null?void 0:c.selectorColor}}),V.createElement("div",{className:"point RC ew-resize",style:{backgroundColor:c==null?void 0:c.selectorColor}}),V.createElement("div",{className:"point RB nwse-resize",style:{backgroundColor:c==null?void 0:c.selectorColor}}),V.createElement("div",{className:"point BC ns-resize",style:{backgroundColor:c==null?void 0:c.selectorColor}}))},eI=()=>{const{floatBarData:c}=V.useContext(Xd);return V.createElement("div",{className:"bezier-pencil-plugin-hightlight-box",style:{borderColor:c==null?void 0:c.selectorColor}})},JI=()=>{const{floatBarData:c}=V.useContext(Xd);return V.createElement("div",{className:"bezier-pencil-plugin-hightlight-box",style:{borderColor:c==null?void 0:c.selectorColor}},V.createElement("div",{className:"point LT nwse-resize",style:{backgroundColor:c==null?void 0:c.selectorColor}}),V.createElement("div",{className:"point LB nesw-resize",style:{backgroundColor:c==null?void 0:c.selectorColor}}),V.createElement("div",{className:"point RT nesw-resize",style:{backgroundColor:c==null?void 0:c.selectorColor}}),V.createElement("div",{className:"point RB nwse-resize",style:{backgroundColor:c==null?void 0:c.selectorColor}}))},NI=()=>{const{floatBarData:c}=V.useContext(Xd);return V.createElement("div",{className:"bezier-pencil-plugin-hightlight-box",style:{borderColor:c==null?void 0:c.selectorColor}},V.createElement("img",{className:"lock",alt:"lock",src:"https://sdk.netless.link/resource/icons/lock.svg"}))},TI=V.forwardRef((c,l)=>{const{floatBarData:d,zIndex:b,position:Z,angle:i,operationType:m,setPosition:X,setOperationType:s,maranger:G}=V.useContext(Xd),{className:p,editors:W,activeTextId:I}=c,o=V.useRef(null),[u,y]=V.useState(K.Pending),[Y,L]=V.useState(),n=H=>{H.preventDefault(),H.stopPropagation(),s(C.TranslateNode),y(K.Start),L(Z),G!=null&&G.control.room&&(G.control.room.disableDeviceInputs=!0),j.emitMethod(v.MainEngine,C.TranslateNode,{workIds:[k],position:Z,workState:K.Start,viewId:G==null?void 0:G.viewId})},a=cd((H,M)=>{H.preventDefault(),H.stopPropagation();const B={x:M.x,y:M.y};X(B),s(C.None),y(K.Done),G!=null&&G.control.room&&(G.control.room.disableDeviceInputs=!1),console.log("onDragEndHandler"),j.emitMethod(v.MainEngine,C.TranslateNode,{workIds:[k],position:B,workState:K.Done,viewId:G==null?void 0:G.viewId})},100,{leading:!1}),x=cd((H,M)=>{H.preventDefault(),H.stopPropagation();const B={x:M.x,y:M.y};(M.x!==(Z==null?void 0:Z.x)||M.y!==(Z==null?void 0:Z.y))&&(X(B),y(K.Doing),j.emitMethod(v.MainEngine,C.TranslateNode,{workIds:[k],position:B,workState:K.Doing,viewId:G==null?void 0:G.viewId}))},100,{leading:!1}),R=V.useMemo(()=>(d==null?void 0:d.scaleType)!==ud.all||m===C.RotateNode?null:V.createElement(CI,null),[d,m]),S=V.useMemo(()=>(d==null?void 0:d.scaleType)!==ud.both||m===C.RotateNode?null:V.createElement(eI,null),[d,m]),J=V.useMemo(()=>(d==null?void 0:d.scaleType)!==ud.proportional||m===C.RotateNode?null:V.createElement(JI,null),[d,m]),F=V.useMemo(()=>(d==null?void 0:d.scaleType)===ud.none&&(d!=null&&d.canLock)?V.createElement(NI,null):null,[d]),w=V.useMemo(()=>{const H=(d==null?void 0:d.selectIds)||[];return W&&G&&H?V.createElement(QZ,{manager:G,textRef:o,selectIds:H,position:Z,activeTextId:I,editors:W}):null},[d==null?void 0:d.selectIds,W,G,I]);return V.createElement(Zl,{disabled:!!(d!=null&&d.isLocked),position:Z,onStart:n,onDrag:x,onStop:a,handle:"canvas"},V.createElement("div",{className:`${p}`,style:d?{width:d.w,height:d.h,zIndex:b,pointerEvents:b<2||F?"none":"auto"}:void 0,onClick:cd(H=>{if(H.stopPropagation(),H.preventDefault(),G&&(W!=null&&W.size)&&o.current&&sd(Y,Z)){const M=G.getPoint(H.nativeEvent);M&&G.control.textEditorManager.computeTextActive(M,G.viewId)}return!1},100,{leading:!1}),onTouchEndCapture:cd(H=>{if(H.stopPropagation(),H.preventDefault(),G&&(W!=null&&W.size)&&o.current&&u!==K.Doing){const M=G.getPoint(H.nativeEvent);M&&G.control.textEditorManager.computeTextActive(M,G.viewId)}return!1},100,{leading:!1})},V.createElement("div",{className:"bezier-pencil-plugin-floatCanvas-box",style:{width:"100%",height:"100%",transform:`rotate(${i}deg)`}},V.createElement("canvas",{ref:l,className:"bezier-pencil-plugin-floatCanvas"})),F,R,S,J,w))}),FI=V.memo(TI,(c,l)=>sd(c,l)?!0:(console.log("FloatBar-----isEqual",!1),!1)),zI=c=>{const{floatBarData:l,position:d,operationType:b}=V.useContext(Xd),{className:Z}=c;return b===C.None?V.createElement("div",{className:`${Z}`,style:l?{left:d==null?void 0:d.x,top:d==null?void 0:d.y,width:l.w,height:l.h}:void 0},V.createElement(gZ,{textOpt:l==null?void 0:l.textOpt,position:d,noLayer:l==null?void 0:l.isLocked})):null},HI=c=>{const{className:l}=c,{floatBarData:d,angle:b,setAngle:Z,position:i,setOperationType:m,maranger:X}=V.useContext(Xd),[s,G]=V.useState(!1),[p,W]=V.useState(new bd),[I,o]=V.useState(new bd);V.useEffect(()=>{if(d){const L=Math.floor(d.w/2),n=Math.floor(-d.h/2);o(new bd(L,n)),W(new bd)}},[d,i]);const u=(L,n)=>{L.preventDefault(),L.stopPropagation(),G(!0);const a=Math.round(bd.GetAngleByPoints(p,I,new bd(n.x,n.y)))||0;Z(a),m(C.RotateNode),X!=null&&X.control.room&&(X.control.room.disableDeviceInputs=!0),j.emitMethod(v.MainEngine,C.RotateNode,{workIds:[k],angle:a,workState:K.Start,viewId:X==null?void 0:X.viewId})},y=cd((L,n)=>{L.preventDefault(),L.stopPropagation(),G(!1);const a=Math.round(bd.GetAngleByPoints(p,I,new bd(n.x,n.y)))||0;Z(a),m(C.None),X!=null&&X.control.room&&(X.control.room.disableDeviceInputs=!1),j.emitMethod(v.MainEngine,C.RotateNode,{workIds:[k],angle:a,workState:K.Done,viewId:X==null?void 0:X.viewId})},100,{leading:!1}),Y=cd((L,n)=>{L.preventDefault(),L.stopPropagation(),G(!0);const a=Math.round(bd.GetAngleByPoints(p,I,new bd(n.x,n.y)))||0;Z(a),m(C.RotateNode),j.emitMethod(v.MainEngine,C.RotateNode,{workIds:[k],angle:a,workState:K.Doing,viewId:X==null?void 0:X.viewId})},100,{leading:!1});return V.createElement(Zl,{handle:".bezier-pencil-plugin-rotate-mouse-pointer",onStart:u,onDrag:Y,onStop:y},V.createElement("div",{className:`${l}`,style:i&&d?{left:i.x-30,top:i.y+d.h+20}:void 0},!s&&V.createElement("div",{className:"bezier-pencil-plugin-rotate-btn",style:{backgroundColor:d==null?void 0:d.selectorColor}},V.createElement("img",{alt:"icon",src:Gd("rotation-button")})),V.createElement("div",{className:`bezier-pencil-plugin-rotate-mouse-pointer ${s?"active":""}`},V.createElement("img",{alt:"icon",src:Gd("rotation")}),V.createElement("div",{className:"angle-icon"},b,"°"))))},kI="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQAAAA0CAYAAADFeBvrAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAYISURBVHgB7ZpNSCtXFIBPEuvz+dMGpYUKD/sWFX+Qti6kK7Hqpm6e9q0rIoIUFUShPLV10VZx4+JZqa9v20LBhdq9fyBUCtKNPH8qYl2IOw3G38Rkek4y15y5uTOZJDOWggcOSSYzN/ebc+45554JwIM8iBCPyTEP+86T4vyMfsRN4b+nQTKIJp0vzuGvlpID7os8EQNEIBD4oKio6Bm9DwaDv/v9/n/076JgbtWUYPchwrW8qD7UnOvr6wFNkpubm+/wu7f0c7y6mrnlvQufxB0Iau7V1dX3BDA/P6/V1dVpzc3N2uLiIofK1c8VYHys/wRKBUN3/hGHqaysNOjc3FwMis6hc0FtLTHuvYLxCCZgci8uLn4wg5Gh6Fy8Jk+/NkcCAlAAuUkoW4g0B+d5tLS05O/r67O8eGxsDNra2uDy8nKsoKCAwCIQDxQa0yTxgrvCYXyTk5Ml+Orf2dlJeeHIyAigFSE/P38ELfUNqNdSkjgF5FF89jL1TU1NlQwODl5gZPujp6cHWltbUw7Koc7Pz8mkZpHPFeFrJuZeqLnoMoPoZqe0JjDP/IZgnyLUG/o8NDRkuo5Ua2pjY6MC4oFCFf1cA0oKzRSOp6enRfTaGh0d/QxBt+1CUVgnOTs7+xrHfQzGyOcKkK3QTJMnQffZ6e/v/xwttmsHqqmpKXbdycnJCxy7ABLh3FEgVZ6hZJhnFZoFFMF0d3c/w7v+dyookXBnZ2c/xvHfhriVcvXfdBRItsxjnOhYqjwjoAimq6vrCysoGofk+Ph4Esd/F/UdiFtJAGUd2DygTpp5dmBUUJ2dnc9VUALm8PDwJY7/BPU9VD8k3M4RC6kskxZMKigKIMLN9vf3p3H8DyWgfEhEOwOQD9IXOTz7EObbwsLC4YWFBRgeHrY9ECXYo6MjaGlpKWlsbPxkYGDgRW1tbSEWquVlZWXBzc3Nl1VVVa8hXiXc6ioqBqGaPDk7AACJTRZ3NS9lcUp86cJwoSQ7Pj4Op6enfxUXF3/V0NCQv7q6GsCvwrqGUG/01xAD4+VQTOxaSF43d5bBOisrGBJRCtXX17+/trb268rKSgASFgmz97KFkmo6OztWuVyPweiWGc4WRkhFRQVEIpHg8vJyQAIQVlLBROVxvBYQHsXnO8tk62ZcyN0wecLBwcEvYHSzEPscBqOLCRhLC4n9uqaA8UAWAcAKhtbQ3t7eTHl5+Y9gtAp3twhT056CDMQ7MRzIFTeTYKb1yYYVQFH9VdzsqNmYKpfTJBDX3Ixgdnd3XyHMT2AMALJlBBSPaMpNngrIsTyTCgaj288YDGakictrxizvKFNOjgSSBLS+vv6UYHDb7DgMVgsChjTEgCIKGG4ZU+EWkgNBzN1qamq+pAMTExPgFMzW1tZrhHkFyWE5KxgSszx0527RaDRmOSpRshEOU11dPQPG8CwHARHJlMnTSrwSRFIlfXt7m3V5ngJGuJtqzaQtZkFBVNJezN5ZAdmwjKo2k9tVtrcI3OXk4tPgcg7ChCDZ1URgMOu72Xa5VFHOkymQhWVU60YVmjN6wiC7k6p+S1syCACOwJBYFaexV+yhBekNPsMBO6KAEeE4BMaCU67RsoYhSbXgaT//ht709vZCaWmp6YkEbLFmVJWzas04+iBL7EKpm0J7duqu0B7+CTUpNJuyvb1NCfMj1CqI9wLKUOlOUMeG+gGFkHii4HizUF4z/KFUrPsJ8WbEIyx7nnZ0dDynME6BAuce09iFHo+GrnmGltltb2//E4wVAN82y7vOjKOZXSBhJdHNiT3TYWD8OY2PTUJkdd7MkJMnT5wZVQF2RFX6yBMUdzPMvvfqxz3sXHF+GNT9ANXit/10O1sgHkZvdQAOKvs9B5L7ARELGAAXLSTvM8QExTE+YbHe+HURhZp1aRyF4CJXClbbWwGketgkW9VsY+YaiBCVhfgE+XvxRwgZSM4jUVCDZFQ9pytmXR8hUTB2gnidx4XffVWydN0yQjwmx/jkAZJBrIBI5J7ZvQGZWUgVSuU/EqmOAzicKNMVu816DdRWUV1/7xAP8n+SfwF3Du3NF2sYhwAAAABJRU5ErkJggg==",MI="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3csvg%20width='40px'%20height='40px'%20viewBox='0%200%2040%2040'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%3e%3c!--%20Generator:%20Sketch%2060.1%20(88133)%20-%20https://sketch.com%20--%3e%3ctitle%3eshape-cursor%3c/title%3e%3cdesc%3eCreated%20with%20Sketch.%3c/desc%3e%3cdefs%3e%3cpath%20d='M20,21.5%20C20.2454599,21.5%2020.4496084,21.6768752%2020.4919443,21.9101244%20L20.5,22%20L20.5,27%20C20.5,27.2761424%2020.2761424,27.5%2020,27.5%20C19.7545401,27.5%2019.5503916,27.3231248%2019.5080557,27.0898756%20L19.5,27%20L19.5,22%20C19.5,21.7238576%2019.7238576,21.5%2020,21.5%20Z%20M27,19.5%20C27.2761424,19.5%2027.5,19.7238576%2027.5,20%20C27.5,20.2454599%2027.3231248,20.4496084%2027.0898756,20.4919443%20L27,20.5%20L22,20.5%20C21.7238576,20.5%2021.5,20.2761424%2021.5,20%20C21.5,19.7545401%2021.6768752,19.5503916%2021.9101244,19.5080557%20L22,19.5%20L27,19.5%20Z%20M18,19.5%20C18.2761424,19.5%2018.5,19.7238576%2018.5,20%20C18.5,20.2454599%2018.3231248,20.4496084%2018.0898756,20.4919443%20L18,20.5%20L13,20.5%20C12.7238576,20.5%2012.5,20.2761424%2012.5,20%20C12.5,19.7545401%2012.6768752,19.5503916%2012.9101244,19.5080557%20L13,19.5%20L18,19.5%20Z%20M20,12.5%20C20.2454599,12.5%2020.4496084,12.6768752%2020.4919443,12.9101244%20L20.5,13%20L20.5,18%20C20.5,18.2761424%2020.2761424,18.5%2020,18.5%20C19.7545401,18.5%2019.5503916,18.3231248%2019.5080557,18.0898756%20L19.5,18%20L19.5,13%20C19.5,12.7238576%2019.7238576,12.5%2020,12.5%20Z'%20id='path-1'%3e%3c/path%3e%3cfilter%20x='-64.6%25'%20y='-59.5%25'%20width='229.3%25'%20height='246.1%25'%20filterUnits='objectBoundingBox'%20id='filter-2'%3e%3cfeMorphology%20radius='1'%20operator='dilate'%20in='SourceAlpha'%20result='shadowSpreadOuter1'%3e%3c/feMorphology%3e%3cfeOffset%20dx='0'%20dy='2'%20in='shadowSpreadOuter1'%20result='shadowOffsetOuter1'%3e%3c/feOffset%3e%3cfeGaussianBlur%20stdDeviation='3'%20in='shadowOffsetOuter1'%20result='shadowBlurOuter1'%3e%3c/feGaussianBlur%3e%3cfeComposite%20in='shadowBlurOuter1'%20in2='SourceAlpha'%20operator='out'%20result='shadowBlurOuter1'%3e%3c/feComposite%3e%3cfeColorMatrix%20values='0%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200.16%200'%20type='matrix'%20in='shadowBlurOuter1'%3e%3c/feColorMatrix%3e%3c/filter%3e%3c/defs%3e%3cg%20id='页面-4'%20stroke='none'%20stroke-width='1'%20fill='none'%20fill-rule='evenodd'%3e%3cg%20id='Whiteboard-Guidelines'%20transform='translate(-344.000000,%20-751.000000)'%3e%3cg%20id='shape-cursor'%20transform='translate(344.000000,%20751.000000)'%3e%3crect%20id='矩形备份-44'%20fill='%23FFFFFF'%20opacity='0.01'%20x='0'%20y='0'%20width='40'%20height='40'%20rx='2'%3e%3c/rect%3e%3cg%20id='形状结合'%20fill-rule='nonzero'%3e%3cuse%20fill='black'%20fill-opacity='1'%20filter='url(%23filter-2)'%20xlink:href='%23path-1'%3e%3c/use%3e%3cpath%20stroke='%23FFFFFF'%20stroke-width='1'%20d='M20,21%20C20.4854103,21%2020.898085,21.3479993%2020.9899479,21.8654877%20L21,22%20L21,27%20C21,27.5522847%2020.5522847,28%2020,28%20C19.5145897,28%2019.101915,27.6520007%2019.0100521,27.1345123%20L19,27%20L19,22%20C19,21.4477153%2019.4477153,21%2020,21%20Z%20M27,19%20C27.5522847,19%2028,19.4477153%2028,20%20C28,20.4854103%2027.6520007,20.898085%2027.1345123,20.9899479%20L27,21%20L22,21%20C21.4477153,21%2021,20.5522847%2021,20%20C21,19.5145897%2021.3479993,19.101915%2021.8654877,19.0100521%20L22,19%20L27,19%20Z%20M18,19%20C18.5522847,19%2019,19.4477153%2019,20%20C19,20.4854103%2018.6520007,20.898085%2018.1345123,20.9899479%20L18,21%20L13,21%20C12.4477153,21%2012,20.5522847%2012,20%20C12,19.5145897%2012.3479993,19.101915%2012.8654877,19.0100521%20L13,19%20L18,19%20Z%20M20,12%20C20.4854103,12%2020.898085,12.3479993%2020.9899479,12.8654877%20L21,13%20L21,18%20C21,18.5522847%2020.5522847,19%2020,19%20C19.5145897,19%2019.101915,18.6520007%2019.0100521,18.1345123%20L19,18%20L19,13%20C19,12.4477153%2019.4477153,12%2020,12%20Z'%20fill='%23212324'%20fill-rule='evenodd'%3e%3c/path%3e%3c/g%3e%3crect%20id='矩形'%20fill='%23FFFFFF'%20x='18.5'%20y='17'%20width='3'%20height='6'%3e%3c/rect%3e%3crect%20id='矩形'%20fill='%23FFFFFF'%20x='17'%20y='18.5'%20width='6'%20height='3'%3e%3c/rect%3e%3cpath%20d='M20,21.5%20C20.2454599,21.5%2020.4496084,21.6768752%2020.4919443,21.9101244%20L20.5,22%20L20.5,27%20C20.5,27.2761424%2020.2761424,27.5%2020,27.5%20C19.7545401,27.5%2019.5503916,27.3231248%2019.5080557,27.0898756%20L19.5,27%20L19.5,22%20C19.5,21.7238576%2019.7238576,21.5%2020,21.5%20Z%20M27,19.5%20C27.2761424,19.5%2027.5,19.7238576%2027.5,20%20C27.5,20.2454599%2027.3231248,20.4496084%2027.0898756,20.4919443%20L27,20.5%20L22,20.5%20C21.7238576,20.5%2021.5,20.2761424%2021.5,20%20C21.5,19.7545401%2021.6768752,19.5503916%2021.9101244,19.5080557%20L22,19.5%20L27,19.5%20Z%20M18,19.5%20C18.2761424,19.5%2018.5,19.7238576%2018.5,20%20C18.5,20.2454599%2018.3231248,20.4496084%2018.0898756,20.4919443%20L18,20.5%20L13,20.5%20C12.7238576,20.5%2012.5,20.2761424%2012.5,20%20C12.5,19.7545401%2012.6768752,19.5503916%2012.9101244,19.5080557%20L13,19.5%20L18,19.5%20Z%20M20,12.5%20C20.2454599,12.5%2020.4496084,12.6768752%2020.4919443,12.9101244%20L20.5,13%20L20.5,18%20C20.5,18.2761424%2020.2761424,18.5%2020,18.5%20C19.7545401,18.5%2019.5503916,18.3231248%2019.5080557,18.0898756%20L19.5,18%20L19.5,13%20C19.5,12.7238576%2019.7238576,12.5%2020,12.5%20Z'%20id='形状结合'%20fill='%23212324'%20fill-rule='nonzero'%3e%3c/path%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e",gI="data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3csvg%20width='47px'%20height='40px'%20viewBox='0%200%2047%2040'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%3e%3c!--%20Generator:%20Sketch%2060.1%20(88133)%20-%20https://sketch.com%20--%3e%3ctitle%3etext-cursor%3c/title%3e%3cdesc%3eCreated%20with%20Sketch.%3c/desc%3e%3cdefs%3e%3cpath%20d='M16,26.5%20C15.7238576,26.5%2015.5,26.2761424%2015.5,26%20C15.5,25.7545401%2015.6768752,25.5503916%2015.9101244,25.5080557%20L16,25.5%20L19.5,25.5%20L19.5,14.5%20L16,14.5%20C15.7238576,14.5%2015.5,14.2761424%2015.5,14%20C15.5,13.7545401%2015.6768752,13.5503916%2015.9101244,13.5080557%20L16,13.5%20L24,13.5%20C24.2761424,13.5%2024.5,13.7238576%2024.5,14%20C24.5,14.2454599%2024.3231248,14.4496084%2024.0898756,14.4919443%20L24,14.5%20L20.5,14.5%20L20.5,25.5%20L24,25.5%20C24.2761424,25.5%2024.5,25.7238576%2024.5,26%20C24.5,26.2454599%2024.3231248,26.4496084%2024.0898756,26.4919443%20L24,26.5%20L16,26.5%20Z'%20id='path-1'%3e%3c/path%3e%3cfilter%20x='-284.0%25'%20y='-81.5%25'%20width='668.1%25'%20height='293.9%25'%20filterUnits='objectBoundingBox'%20id='filter-2'%3e%3cfeMorphology%20radius='1'%20operator='dilate'%20in='SourceAlpha'%20result='shadowSpreadOuter1'%3e%3c/feMorphology%3e%3cfeOffset%20dx='0'%20dy='2'%20in='shadowSpreadOuter1'%20result='shadowOffsetOuter1'%3e%3c/feOffset%3e%3cfeGaussianBlur%20stdDeviation='3'%20in='shadowOffsetOuter1'%20result='shadowBlurOuter1'%3e%3c/feGaussianBlur%3e%3cfeComposite%20in='shadowBlurOuter1'%20in2='SourceAlpha'%20operator='out'%20result='shadowBlurOuter1'%3e%3c/feComposite%3e%3cfeColorMatrix%20values='0%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200%200.16%200'%20type='matrix'%20in='shadowBlurOuter1'%3e%3c/feColorMatrix%3e%3c/filter%3e%3c/defs%3e%3cg%20id='页面-4'%20stroke='none'%20stroke-width='1'%20fill='none'%20fill-rule='evenodd'%3e%3cg%20id='Whiteboard-Guidelines'%20transform='translate(-388.000000,%20-672.000000)'%3e%3cg%20id='text-cursor'%20transform='translate(392.000000,%20672.000000)'%3e%3crect%20id='矩形备份-40'%20fill='%23FFFFFF'%20opacity='0.01'%20x='0'%20y='0'%20width='40'%20height='40'%20rx='2'%3e%3c/rect%3e%3cg%20id='形状结合'%20fill-rule='nonzero'%3e%3cuse%20fill='black'%20fill-opacity='1'%20filter='url(%23filter-2)'%20xlink:href='%23path-1'%3e%3c/use%3e%3cpath%20stroke='%23FFFFFF'%20stroke-width='1'%20d='M19,25%20L19,15%20L16,15%20C15.4477153,15%2015,14.5522847%2015,14%20C15,13.5145897%2015.3479993,13.101915%2015.8654877,13.0100521%20L16,13%20L24,13%20C24.5522847,13%2025,13.4477153%2025,14%20C25,14.4854103%2024.6520007,14.898085%2024.1345123,14.9899479%20L24,15%20L21,15%20L21,25%20L24,25%20C24.5522847,25%2025,25.4477153%2025,26%20C25,26.4854103%2024.6520007,26.898085%2024.1345123,26.9899479%20L24,27%20L16,27%20C15.4477153,27%2015,26.5522847%2015,26%20C15,25.5145897%2015.3479993,25.101915%2015.8654877,25.0100521%20L16,25%20L19,25%20Z'%20fill='%23212324'%20fill-rule='evenodd'%3e%3c/path%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/g%3e%3c/svg%3e";class QI extends V.Component{constructor(d){super(d);h(this,"renderAvatar",d=>{var Z;const b=`rgb(${d.memberState.strokeColor[0]}, ${d.memberState.strokeColor[1]}, ${d.memberState.strokeColor[2]})`;if(this.detectAvatar(d)){const i=this.detectCursorName(d);return V.createElement("img",{className:"cursor-selector-avatar",style:{width:i?19:28,height:i?19:28,position:i?"initial":"absolute",borderColor:i?"white":b,marginRight:i?4:0},src:(Z=d.payload)==null?void 0:Z.avatar,alt:"avatar"})}else return null});h(this,"getOpacity",d=>{const b=this.getCursorName(d),Z=this.detectAvatar(d);return b===void 0&&Z===void 0?0:1});h(this,"getCursorName",d=>{if(d.payload&&d.payload.cursorName)return d.payload.cursorName});h(this,"getThemeClass",d=>d.payload&&d.payload.theme?"cursor-inner-mellow":"cursor-inner");h(this,"getCursorBackgroundColor",d=>{const b=this.detectCursorName(d);return d.payload&&d.payload.cursorBackgroundColor?d.payload.cursorBackgroundColor:b?`rgb(${d.memberState.strokeColor[0]}, ${d.memberState.strokeColor[1]}, ${d.memberState.strokeColor[2]})`:void 0});h(this,"getCursorTextColor",d=>d.payload&&d.payload.cursorTextColor?d.payload.cursorTextColor:"#FFFFFF");h(this,"getCursorTagBackgroundColor",d=>d.payload&&d.payload.cursorTagBackgroundColor?d.payload.cursorTagBackgroundColor:this.getCursorBackgroundColor(d));h(this,"detectCursorName",d=>!!(d.payload&&d.payload.cursorName));h(this,"detectAvatar",d=>!!(d.payload&&d.payload.avatar));h(this,"renderTag",d=>{if(d.payload&&d.payload.cursorTagName)return V.createElement("span",{className:"cursor-tag-name",style:{backgroundColor:this.getCursorTagBackgroundColor(d)}},d.payload.cursorTagName)})}render(){const{roomMember:d}=this.props,b=this.getCursorName(d);switch(d.memberState.currentApplianceName){case E.pencil:return V.createElement("div",{className:"cursor-box"},V.createElement("div",{className:"cursor-mid cursor-pencil-offset",style:{transform:"translate(-50%, -90%)",marginLeft:"10px"}},V.createElement("div",{className:"cursor-name"},V.createElement("div",{style:{opacity:this.getOpacity(d),backgroundColor:this.getCursorBackgroundColor(d),color:this.getCursorTextColor(d)},className:this.getThemeClass(d)},this.renderAvatar(d),b,this.renderTag(d))),V.createElement("div",null,V.createElement("img",{className:"cursor-pencil-image",src:kI,alt:"pencilCursor"}))));case E.text:return V.createElement("div",{className:"cursor-box"},V.createElement("div",{className:"cursor-mid cursor-pencil-offset",style:{transform:"translate(-50%, -65%)",marginLeft:"0px"}},V.createElement("div",{className:"cursor-name"},V.createElement("div",{style:{opacity:this.getOpacity(d),backgroundColor:this.getCursorBackgroundColor(d),color:this.getCursorTextColor(d)},className:this.getThemeClass(d)},this.renderAvatar(d),b,this.renderTag(d))),V.createElement("div",null,V.createElement("img",{className:"cursor-arrow-image",src:gI,alt:"textCursor"}))));case E.rectangle:case E.arrow:case E.straight:case E.shape:case E.ellipse:return V.createElement("div",{className:"cursor-box"},V.createElement("div",{className:"cursor-mid cursor-pencil-offset",style:{transform:"translate(-50%, -65%)",marginLeft:"0px"}},V.createElement("div",{className:"cursor-name"},V.createElement("div",{style:{opacity:this.getOpacity(d),backgroundColor:this.getCursorBackgroundColor(d),color:this.getCursorTextColor(d)},className:this.getThemeClass(d)},this.renderAvatar(d),b,this.renderTag(d))),V.createElement("div",null,V.createElement("img",{className:"cursor-arrow-image",src:MI,alt:"shapeCursor"}))));default:return null}}}const UI=c=>{const{className:l,info:d}=c,{roomMember:b,...Z}=d||{};return V.createElement("div",{className:`${l}`,style:Z?{transform:`translate(${Z.x}px, ${Z.y}px)`}:{display:"none"}},b&&V.createElement(QI,{roomMember:b}))},wI=c=>{const{className:l,manager:d}=c,[b,Z]=V.useState();V.useEffect(()=>(d.internalMsgEmitter.on([v.Cursor,d.viewId],i),()=>{d.internalMsgEmitter.off([v.Cursor,d.viewId],i)}),[d]);function i(X){Z(X)}return V.useMemo(()=>{if(b!=null&&b.length){const X=b.map(s=>{var G;return s.roomMember?V.createElement(UI,{key:(G=s.roomMember)==null?void 0:G.memberId,className:l,info:s}):null});return V.createElement(V.Fragment,null,X)}return null},[b])},vI=c=>{const{className:l}=c,[d,b]=V.useState({x:0,y:0,h:0,w:0}),{floatBarData:Z,position:i,maranger:m}=V.useContext(Xd);V.useEffect(()=>{Z&&b({x:Z.x,y:Z.y,w:Z.w,h:Z.h})},[]);const X=p=>{if(p.preventDefault(),p.stopPropagation(),Z!=null&&Z.w&&(Z!=null&&Z.h)){const W={x:(i==null?void 0:i.x)||0,y:(i==null?void 0:i.y)||0,w:Z.w,h:Z.h};b(W),m!=null&&m.control.room&&(m.control.room.disableDeviceInputs=!0),j.emitMethod(v.MainEngine,C.ScaleNode,{workIds:[k],box:W,workState:K.Start,viewId:m==null?void 0:m.viewId})}},s=cd((p,W,I,o)=>{p.preventDefault(),p.stopPropagation();const u={x:d.x,y:d.y,w:d.w,h:d.h};switch(u.w+=o.width,u.h+=o.height,W){case"bottomLeft":case"left":u.x-=o.width;break;case"topLeft":u.x-=o.width,u.y-=o.height;break;case"top":case"topRight":u.y-=o.height;break}(o.width!==0||o.height!==0)&&j.emitMethod(v.MainEngine,C.ScaleNode,{workIds:[k],box:u,dir:W,workState:K.Doing,viewId:m==null?void 0:m.viewId})},100,{leading:!1}),G=cd((p,W,I,o)=>{p.preventDefault(),p.stopPropagation();const u={x:d.x,y:d.y,w:d.w,h:d.h};switch(u.w+=o.width,u.h+=o.height,W){case"bottomLeft":case"left":u.x-=o.width;break;case"topLeft":u.x-=o.width,u.y-=o.height;break;case"top":case"topRight":u.y-=o.height;break}m!=null&&m.control.room&&(m.control.room.disableDeviceInputs=!1),j.emitMethod(v.MainEngine,C.ScaleNode,{workIds:[k],box:u,dir:W,workState:K.Done,viewId:m==null?void 0:m.viewId})},100,{leading:!1});return V.createElement(vZ.Resizable,{className:`${l}`,boundsByDirection:!0,size:{width:(Z==null?void 0:Z.w)||0,height:(Z==null?void 0:Z.h)||0},style:{position:"absolute",pointerEvents:"auto",left:i==null?void 0:i.x,top:i==null?void 0:i.y},enable:{top:(Z==null?void 0:Z.scaleType)===ud.all&&!0||!1,right:(Z==null?void 0:Z.scaleType)===ud.all&&!0||!1,bottom:(Z==null?void 0:Z.scaleType)===ud.all&&!0||!1,left:(Z==null?void 0:Z.scaleType)===ud.all&&!0||!1,topRight:!0,bottomRight:!0,bottomLeft:!0,topLeft:!0},lockAspectRatio:(Z==null?void 0:Z.scaleType)===ud.proportional,onResizeStart:X,onResize:s,onResizeStop:G})},_b=c=>{const{id:l,pos:d,pointMap:b,type:Z}=c,{setOperationType:i,maranger:m,floatBarData:X}=V.useContext(Xd),[s,G]=V.useState({x:0,y:0}),[p,W]=V.useState(K.Pending);V.useEffect(()=>{(p===K.Pending||p===K.Done)&&G(d)},[d,p]);const I=y=>{y.preventDefault(),y.stopPropagation(),i(C.SetPoint),W(K.Start),m!=null&&m.control.room&&(m.control.room.disableDeviceInputs=!0),j.emitMethod(v.MainEngine,C.SetPoint,{workId:k,pointMap:b,workState:K.Start,viewId:m==null?void 0:m.viewId})},o=cd((y,Y)=>{if(y.preventDefault(),y.stopPropagation(),i(C.SetPoint),W(K.Doing),Y.x!==(s==null?void 0:s.x)||Y.y!==(s==null?void 0:s.y)){const L=b.get(l);L&&Z==="start"&&(m!=null&&m.control.viewContainerManager)?L[0]=m.control.viewContainerManager.transformToScenePoint([Y.x,Y.y],m.viewId):L&&Z==="end"&&(m!=null&&m.control.viewContainerManager)&&(L[1]=m.control.viewContainerManager.transformToScenePoint([Y.x,Y.y],m.viewId)),j.emitMethod(v.MainEngine,C.SetPoint,{workId:k,pointMap:b,workState:K.Doing,viewId:m==null?void 0:m.viewId})}},50,{leading:!1}),u=cd((y,Y)=>{if(y.preventDefault(),y.stopPropagation(),i(C.None),W(K.Done),Y.x!==(s==null?void 0:s.x)||Y.y!==(s==null?void 0:s.y)){G(Y);const L=b.get(l);L&&Z==="start"&&(m!=null&&m.control.viewContainerManager)?L[0]=m.control.viewContainerManager.transformToScenePoint([Y.x,Y.y],m.viewId):L&&Z==="end"&&(m!=null&&m.control.viewContainerManager)&&(L[1]=m.control.viewContainerManager.transformToScenePoint([Y.x,Y.y],m.viewId)),j.emitMethod(v.MainEngine,C.SetPoint,{workId:k,pointMap:b,workState:K.Done,viewId:m==null?void 0:m.viewId})}},100,{leading:!1});return V.createElement(Zl,{position:s,onStart:I,onDrag:o,onStop:u},V.createElement("div",{className:"bezier-pencil-plugin-point-draggable-btn"},V.createElement("div",{className:"bezier-pencil-plugin-point-draggable-btn-inner",style:{borderColor:X==null?void 0:X.selectorColor}})))},PI=c=>{const{className:l}=c,{floatBarData:d,maranger:b}=V.useContext(Xd),[Z,i]=V.useState(),[m,X]=V.useState(),[s,G]=V.useState(new Map);V.useEffect(()=>{const I=[];if(b&&(d!=null&&d.points)){const o=b.viewId;if(b.control.viewContainerManager.getView(o))for(const y of d.points){const Y=b.control.viewContainerManager.transformToOriginPoint(y,o);I.push(Y)}d!=null&&d.selectIds&&d.selectIds.length===1&&(s.set(d.selectIds[0],d.points),G(s))}I[0]&&i({x:I[0][0],y:I[0][1]}),I[1]&&X({x:I[1][0],y:I[1][1]})},[b,d==null?void 0:d.points,d==null?void 0:d.selectIds,s]);const p=V.useMemo(()=>Z&&(d!=null&&d.selectIds)?V.createElement(_b,{pos:Z,type:"start",id:d.selectIds[0],pointMap:s}):null,[Z,d==null?void 0:d.selectIds,s]),W=V.useMemo(()=>m&&(d!=null&&d.selectIds)?V.createElement(_b,{pos:m,type:"end",id:d.selectIds[0],pointMap:s}):null,[m,d==null?void 0:d.selectIds,s]);return V.createElement("div",{className:`${l}`},p,W)},Xd=V.createContext({maranger:void 0,floatBarColors:[],floatBarData:void 0,zIndex:-1,dpr:1,position:void 0,angle:0,operationType:C.None,scale:[1,1],setPosition:()=>{},setAngle:()=>{},setOperationType:()=>{},setFloatBarData:()=>{}});class ib extends V.Component{constructor(d){var b;super(d);h(this,"setPosition",d=>{this.setState({position:d})});h(this,"setAngle",d=>{this.setState({angle:d})});h(this,"setOperationType",d=>{this.setState({operationType:d})});this.state={floatBarData:void 0,showFloatBar:!1,zIndex:-1,dpr:1,position:void 0,angle:0,operationType:C.None,scale:[1,1],editors:this.editors,activeTextId:(b=this.props.maranger.control.textEditorManager)==null?void 0:b.activeId}}get editors(){return Zd(this.props.maranger.control.textEditorManager.filterEditor(this.props.maranger.viewId))}componentDidMount(){this.props.maranger.vDom=this,this.props.maranger.mountView(),this.setState({dpr:this.props.maranger.dpr})}componentWillUnmount(){}showFloatBar(d,b){const Z=d&&b&&{...this.state.floatBarData,...b}||void 0;this.setState({showFloatBar:d,floatBarData:Z,position:Z&&{x:Z.x,y:Z.y},angle:0}),Z&&this.props.refs.floatBarCanvasRef.current&&(Z.canvasHeight&&Z.canvasWidth?(this.props.refs.floatBarCanvasRef.current.width=Z.canvasWidth*this.state.dpr,this.props.refs.floatBarCanvasRef.current.height=Z.canvasHeight*this.state.dpr,this.props.refs.floatBarCanvasRef.current.style.width=Z.canvasWidth+"px",this.props.refs.floatBarCanvasRef.current.style.height=Z.canvasHeight+"px"):(this.props.refs.floatBarCanvasRef.current.width=Z.w*this.state.dpr,this.props.refs.floatBarCanvasRef.current.height=Z.h*this.state.dpr,this.props.refs.floatBarCanvasRef.current.style.width="100%",this.props.refs.floatBarCanvasRef.current.style.height="100%"))}setActiveTextEditor(d){this.setState({activeTextId:d,editors:this.editors})}setFloatZIndex(d){this.setState({zIndex:d})}setFloatBarData(d){this.state.floatBarData&&this.setState({floatBarData:{...this.state.floatBarData,...d}})}render(){var b,Z,i,m,X,s,G,p,W,I,o,u,y;const d=!!((Z=(b=this.props.maranger.control)==null?void 0:b.room)!=null&&Z.floatBarOptions);return V.createElement(V.Fragment,null,V.createElement("div",{className:Yd.Container,onMouseDown:Y=>{Y.preventDefault(),Y.stopPropagation()},onTouchStart:Y=>{Y.stopPropagation()},onMouseMove:Y=>{this.props.maranger.cursorMouseMove(Y)}},V.createElement("div",{className:Yd.CanvasBox},V.createElement("canvas",{id:"bgCanvas",ref:this.props.refs.canvasBgRef}),V.createElement("canvas",{id:"serviceCanvas",className:Yd.FloatCanvas,ref:this.props.refs.canvasServiceFloatRef}),V.createElement("canvas",{id:"localCanvas",className:Yd.FloatCanvas,ref:this.props.refs.canvasFloatRef})),V.createElement(Xd.Provider,{value:{maranger:this.props.maranger,floatBarColors:d&&((X=(m=(i=this.props.maranger.control)==null?void 0:i.room)==null?void 0:m.floatBarOptions)==null?void 0:X.colors)||[],floatBarData:this.state.floatBarData,zIndex:this.state.zIndex,dpr:this.state.dpr,position:this.state.position,angle:this.state.angle,operationType:this.state.operationType,scale:this.state.scale,setPosition:this.setPosition.bind(this),setAngle:this.setAngle.bind(this),setOperationType:this.setOperationType.bind(this),setFloatBarData:this.setFloatBarData.bind(this)}},this.state.showFloatBar&&V.createElement(FI,{className:Yd.FloatBar,ref:this.props.refs.floatBarCanvasRef,editors:this.state.editors,activeTextId:this.state.activeTextId})||null,((s=this.state.editors)==null?void 0:s.size)&&V.createElement(KI,{className:Yd.TextEditorContainer,showFloatBtns:d,manager:this.props.maranger,selectIds:((G=this.state.floatBarData)==null?void 0:G.selectIds)||[],editors:this.state.editors,activeTextId:this.state.activeTextId})||null,((p=this.state.floatBarData)==null?void 0:p.canRotate)&&((I=(W=this.state.floatBarData)==null?void 0:W.selectIds)==null?void 0:I.length)===1&&(this.state.operationType===C.None||this.state.operationType===C.RotateNode)&&V.createElement(HI,{className:Yd.RotateBtn})||null,(((o=this.state.floatBarData)==null?void 0:o.scaleType)===ud.all||((u=this.state.floatBarData)==null?void 0:u.scaleType)===ud.proportional)&&this.state.showFloatBar&&(this.state.operationType===C.None||this.state.operationType===C.ScaleNode)&&V.createElement(vI,{className:Yd.ResizeBtn})||null,((y=this.state.floatBarData)==null?void 0:y.scaleType)===ud.both&&this.state.showFloatBar&&(this.state.operationType===C.None||this.state.operationType===C.SetPoint)&&V.createElement(PI,{className:Yd.ResizeTowBox})||null,this.state.showFloatBar&&d&&V.createElement(zI,{className:Yd.FloatBarBtn})||null),V.createElement(wI,{className:Yd.CursorBox,manager:this.props.maranger})))}}class Wl extends td{constructor(d,b){super(d,b);h(this,"width",1e3);h(this,"height",1e3);h(this,"dpr",1);h(this,"vDom");h(this,"eventTragetElement");h(this,"canvasServiceFloatRef",V.createRef());h(this,"canvasFloatRef",V.createRef());h(this,"canvasBgRef",V.createRef());h(this,"floatBarRef",V.createRef());h(this,"floatBarCanvasRef",V.createRef());h(this,"containerOffset",{x:0,y:0})}setCanvassStyle(){if(this.eventTragetElement){const d=this.eventTragetElement.offsetWidth||this.width,b=this.eventTragetElement.offsetHeight||this.height;d&&b&&this.canvasBgRef.current&&(this.dpr=lb(this.canvasBgRef.current.getContext("2d")),this.width=d,this.height=b,this.canvasBgRef.current.style.width=`${d}px`,this.canvasBgRef.current.style.height=`${b}px`,this.canvasBgRef.current.width=d*this.dpr,this.canvasBgRef.current.height=b*this.dpr,this.canvasFloatRef.current&&(this.canvasFloatRef.current.style.width=`${d}px`,this.canvasFloatRef.current.style.height=`${b}px`,this.canvasFloatRef.current.width=d*this.dpr,this.canvasFloatRef.current.height=b*this.dpr),this.canvasServiceFloatRef.current&&(this.canvasServiceFloatRef.current.style.width=`${d}px`,this.canvasServiceFloatRef.current.style.height=`${b}px`,this.canvasServiceFloatRef.current.width=d*this.dpr,this.canvasServiceFloatRef.current.height=b*this.dpr))}}destroy(){if(super.destroy(),this.eventTragetElement){const d=this.eventTragetElement.parentElement;if(d){const b=d.querySelectorAll(".teaching-aids-plugin-main-view-displayer");for(const Z of b)Z.remove()}}}createMainViewDisplayer(d){const b=document.createElement("div");return b.className="teaching-aids-plugin-main-view-displayer",d.appendChild(b),this.eventTragetElement=d.children[0],this.containerOffset=this.getContainerOffset(this.eventTragetElement,this.containerOffset),this.bindToolsClass(),Bl.render(V.createElement(ib,{viewId:this.viewId,maranger:this,refs:{canvasServiceFloatRef:this.canvasServiceFloatRef,canvasFloatRef:this.canvasFloatRef,canvasBgRef:this.canvasBgRef,floatBarRef:this.floatBarRef,floatBarCanvasRef:this.floatBarCanvasRef}}),b),this.control.room&&this.bindDisplayerEvent(this.eventTragetElement),this}}class jI extends vo{constructor(d,b,Z){super(d,b,Z);h(this,"dpr",1);h(this,"width",1e3);h(this,"height",1e3);h(this,"vDom");h(this,"eventTragetElement");h(this,"canvasServiceFloatRef",V.createRef());h(this,"canvasFloatRef",V.createRef());h(this,"canvasBgRef",V.createRef());h(this,"floatBarRef",V.createRef());h(this,"floatBarCanvasRef",V.createRef());h(this,"containerOffset",{x:0,y:0})}setCanvassStyle(){if(this.eventTragetElement&&this.canvasBgRef.current){this.dpr=lb(this.canvasBgRef.current.getContext("2d"));const d=this.eventTragetElement.offsetWidth||this.width,b=this.eventTragetElement.offsetHeight||this.height;d&&b&&(this.width=d,this.height=b,this.canvasBgRef.current.style.width=`${d}px`,this.canvasBgRef.current.style.height=`${b}px`,this.canvasBgRef.current.width=d*this.dpr,this.canvasBgRef.current.height=b*this.dpr,this.canvasFloatRef.current&&(this.canvasFloatRef.current.style.width=`${d}px`,this.canvasFloatRef.current.style.height=`${b}px`,this.canvasFloatRef.current.width=d*this.dpr,this.canvasFloatRef.current.height=b*this.dpr),this.canvasServiceFloatRef.current&&(this.canvasServiceFloatRef.current.style.width=`${d}px`,this.canvasServiceFloatRef.current.style.height=`${b}px`,this.canvasServiceFloatRef.current.width=d*this.dpr,this.canvasServiceFloatRef.current.height=b*this.dpr))}}createAppViewDisplayer(d,b){const Z=document.createElement("div");return Z.className="teaching-aids-plugin-app-view-displayer",b.appendChild(Z),this.eventTragetElement=b.children[0],this.containerOffset=this.getContainerOffset(this.eventTragetElement,this.containerOffset),this.bindToolsClass(),Bl.render(V.createElement(ib,{viewId:d,maranger:this,refs:{canvasServiceFloatRef:this.canvasServiceFloatRef,canvasFloatRef:this.canvasFloatRef,canvasBgRef:this.canvasBgRef,floatBarRef:this.floatBarRef,floatBarCanvasRef:this.floatBarCanvasRef}}),Z),this.control.room&&this.bindDisplayerEvent(this.eventTragetElement),this}}class Rd extends bl{constructor(d){super(d);h(this,"focuedViewId");h(this,"focuedView");h(this,"control");h(this,"tmpFocusedViewId");h(this,"checkScaleTimer");h(this,"onMainViewRelease",d=>{this.control.textEditorManager.clear(Wl.viewId,!0),console.log("onMainViewRelease",d),this.onMainViewMounted(d);const b=this.control.getSnapshootData("memberState");this.control.room&&this.control.onMemberChange(b),this.control.clearSnapshootData()});h(this,"onMainViewMounted",d=>{var I;const b=d.divElement;if(!b||!d.focusScenePath||!(d.focusScenePath||d.scenePath))return;if(this.mainView&&this.mainView.displayer){this.mainView.displayer.destroy();const o=b.getElementsByClassName("teaching-aids-plugin-main-view-displayer");for(const u of o)u.remove();(I=this.control.worker)==null||I.destroyViewWorker(this.mainView.id,!0),this.mainView=void 0}const i=new Wl(this.control,yd.InternalMsgEmitter),m=d.size.width||i.width,X=d.size.height||i.height,G={dpr:i.dpr,originalPoint:[m/2,X/2],offscreenCanvasOpt:{...Rd.defaultScreenCanvasOpt,width:m,height:X},layerOpt:{...Rd.defaultLayerOpt,width:m,height:X},cameraOpt:{...Rd.defaultCameraOpt,width:m,height:X}},{scale:p,...W}=d.camera;G.cameraOpt={...G.cameraOpt,...W,scale:p===1/0?1:p},this.focuedViewId=Wl.viewId,this.createMianView({id:Wl.viewId,container:b,displayer:i,focusScenePath:d.focusScenePath,cameraOpt:G.cameraOpt,viewData:d}),this.focuedView=this.mainView,i.createMainViewDisplayer(b),d.callbacks.on("onSizeUpdated",this.onMainViewSizeUpdated),d.callbacks.on("onCameraUpdated",this.onMainViewCameraUpdated),d.callbacks.on("onActiveHotkey",this.onActiveHotkeyChange.bind(this))});h(this,"onMainViewSizeUpdated",async()=>{Promise.resolve().then(()=>{if(this.mainView&&this.mainView.viewData){const d=this.mainView.viewData.size,b=this.mainView.cameraOpt;b&&(this.mainView.displayer.updateSize(),this.mainView.cameraOpt={...b,...d})}})});h(this,"onMainViewCameraUpdated",async()=>{Promise.resolve().then(()=>{if(this.mainView&&this.mainView.viewData){const d=this.mainView.viewData.camera,b=this.mainView.cameraOpt;if(b){const Z=d.scale===1/0?1:d.scale,i=d.centerX||0,m=d.centerY||0;this.mainView.cameraOpt={...b,scale:Z,centerX:i,centerY:m},this.checkScaleTimer&&d.scale==1/0&&(clearTimeout(this.checkScaleTimer),this.checkScaleTimer=void 0),!this.checkScaleTimer&&d.scale===1/0&&this.mainView.viewData&&this.mainView.viewData.camera.scale===1/0&&(this.checkScaleTimer=setTimeout(()=>{var X,s;(s=(X=this.mainView)==null?void 0:X.viewData)==null||s.moveCamera({scale:Z,centerX:i,centerY:m,animationMode:"immediately"}),this.checkScaleTimer=void 0},500))}}})});h(this,"onAppViewMounted",d=>{var I;const{appId:b,view:Z}=d,i=Z.divElement;if(!i||!Z.focusScenePath)return;const m=this.appViews.get(b);if(m&&m.displayer){const o=i.getElementsByClassName("teaching-aids-plugin-app-view-displayer");for(const u of o)u.remove();this.destroyAppView(d.appId,!0),(I=this.control.worker)==null||I.destroyViewWorker(b,!0)}const X=new jI(b,this.control,yd.InternalMsgEmitter),s=Z.size.width||X.width,G=Z.size.height||X.height,W={dpr:X.dpr,originalPoint:[s/2,G/2],offscreenCanvasOpt:{...Rd.defaultScreenCanvasOpt,width:s,height:G},layerOpt:{...Rd.defaultLayerOpt,width:s,height:G},cameraOpt:{...Rd.defaultCameraOpt,...Z.camera,width:s,height:G}};if(this.createAppView({id:b,container:i,displayer:X,cameraOpt:W.cameraOpt,focusScenePath:Z.focusScenePath,viewData:Z}),X.createAppViewDisplayer(b,i),Z.callbacks.on("onSizeUpdated",this.onAppViewSizeUpdated.bind(this,b)),Z.callbacks.on("onCameraUpdated",this.onAppViewCameraUpdated.bind(this,b)),Z.callbacks.on("onActiveHotkey",this.onActiveHotkeyChange.bind(this)),this.tmpFocusedViewId===b){const o=this.control.worker.getLocalWorkViewId();o&&o!==b?this.setFocuedViewId(o):this.setFocuedViewId(b),this.tmpFocusedViewId=void 0}});h(this,"onAppViewSizeUpdated",async d=>{Promise.resolve().then(()=>{const b=this.appViews.get(d);if(b&&b.viewData){const Z=b.viewData.size,i=b.cameraOpt;i&&(b.displayer.updateSize(),b.cameraOpt={...i,...Z})}})});h(this,"onAppViewCameraUpdated",async d=>{Promise.resolve().then(()=>{const b=this.appViews.get(d);if(b&&b.viewData){const Z=b.viewData.camera,i=b.cameraOpt;if(i){const m=Z.scale===1/0?1:Z.scale,X=Z.centerX||0,s=Z.centerY||0;b.cameraOpt={...i,scale:m,centerX:X,centerY:s}}}})});this.control=d.control}mountView(d){var Z,i;const b=this.getView(d);if(b){const{width:m,height:X,dpr:s}=b.displayer,G={dpr:s,originalPoint:[m/2,X/2],offscreenCanvasOpt:{...Rd.defaultScreenCanvasOpt,width:m,height:X},layerOpt:{...Rd.defaultLayerOpt,width:m,height:X},cameraOpt:{...Rd.defaultCameraOpt,width:m,height:X}};if(b.viewData){const{scale:p,...W}=b.viewData.camera;G.cameraOpt={...G.cameraOpt,...W,scale:p===1/0?1:p}}d===((Z=this.mainView)==null?void 0:Z.id)&&this.control.activeWorker(),(i=this.control.worker)==null||i.createViewWorker(d,G),b.focusScenePath&&this.control.collector&&this.control.worker.pullServiceData(d,b.focusScenePath)}}listenerWindowManager(d){d.emitter.on("focusedChange",b=>{const Z=b||td.viewId;if(this.focuedViewId!==Z)if(this.getView(Z)){const m=this.control.worker.getLocalWorkViewId();m&&m!==Z?this.setFocuedViewId(m):this.setFocuedViewId(Z)}else this.tmpFocusedViewId=Z}),d.emitter.on("mainViewScenePathChange",b=>{console.log("ContainerManager mainViewScenePathChange",b),this.control.onSceneChange(b,"mainView")}),d.emitter.on("onMainViewMounted",this.onMainViewMounted),d.emitter.on("onAppViewMounted",this.onAppViewMounted),d.emitter.on("onMainViewRebind",this.onMainViewRelease),d.emitter.on("onBoxClose",b=>{this.appViews.get(b.appId)&&(this.destroyAppView(b.appId),this.control.worker.destroyViewWorker(b.appId))}),d.emitter.on("onAppScenePathChange",b=>{const{appId:Z,view:i}=b;this.control.onSceneChange(i.focusScenePath,Z)})}onActiveHotkeyChange(d){this.control.hotkeyManager.onActiveHotkey(d)}}class Vl extends yd{constructor(d){super(d);h(this,"windowManager");h(this,"viewContainerManager");const b={control:this,internalMsgEmitter:yd.InternalMsgEmitter};this.viewContainerManager=new Rd(b)}init(){}destroy(){var d,b,Z,i;this.roomMember.destroy(),(d=this.collector)==null||d.destroy(),(b=this.worker)==null||b.destroy(),(Z=this.viewContainerManager)==null||Z.destroy(),(i=this.cursor)==null||i.destroy()}activePlugin(){this.collector&&(this.collector.addStorageStateListener(d=>{var b,Z;if((b=this.collector)!=null&&b.storage&&Object.keys(this.collector.storage).length===0){(Z=this.worker)==null||Z.clearViewScenePath("mainView",!0);return}if(d){const i=new Map;Object.keys(d).forEach(m=>{var s;const X=d[m];if(X){const G=X.viewId,p=i.get(G)||new Set;p.add(m),i.set(G,p),(s=this.worker)==null||s.onServiceDerive(m,X)}});for(const[m,X]of i.entries())yd.InternalMsgEmitter.emit("excludeIds",[...X],m)}}),this.room&&this.roomMember.onUidChangeHook(d=>{var b,Z,i,m;if((b=this.collector)!=null&&b.serviceStorage){const X=[];this.viewContainerManager.getAllViews().forEach(s=>{var G;if(s&&s.focusScenePath&&((G=this.collector)!=null&&G.serviceStorage[s.id])&&this.collector.serviceStorage[s.id][s.focusScenePath]){const p=Object.keys(this.collector.serviceStorage[s.id][s.focusScenePath]).filter(W=>{var I;return(I=this.collector)==null?void 0:I.isSelector(W)}).map(W=>({viewId:s.id,scenePath:s.focusScenePath,key:W}));p.length&&X.push(...p)}}),X.forEach(({key:s,viewId:G,scenePath:p})=>{var I,o;const W=(I=this.collector)==null?void 0:I.getUidFromKey(s);W&&!d.online.includes(W)&&((o=this.collector)==null||o.updateValue(s,void 0,{isAfterUpdate:!0,viewId:G,scenePath:p}))})}(i=(Z=this.cursor)==null?void 0:Z.eventCollector)!=null&&i.serviceStorage&&Object.keys((m=this.cursor)==null?void 0:m.eventCollector.serviceStorage).forEach(s=>{var G,p;d.online.includes(s)||(p=(G=this.cursor)==null?void 0:G.eventCollector)==null||p.clearValue(s)})}),this.worker.isActive&&this.viewContainerManager.getAllViews().forEach(d=>{d&&d.focusScenePath&&this.worker.pullServiceData(d.id,d.focusScenePath)}))}activeWorker(){this.worker.init()}setWindowManager(d){var b,Z,i,m,X;this.windowManager=d,(Z=(b=this.windowManager)==null?void 0:b.mainView)!=null&&Z.divElement&&this.viewContainerManager.onMainViewMounted(this.windowManager.mainView),(X=(m=(i=this.windowManager.appManager)==null?void 0:i.viewManager)==null?void 0:m.views)!=null&&X.size&&this.windowManager.appManager.viewManager.views.forEach((s,G)=>{this.viewContainerManager.onAppViewMounted({appId:G,view:s})}),this.viewContainerManager.listenerWindowManager(this.windowManager)}}const Q=class Q extends D.InvisiblePlugin{constructor(){super(...arguments);h(this,"onPhaseChanged",d=>{var b;d===D.RoomPhase.Reconnecting&&((b=Q.currentManager)==null||b.setSnapshootData())});h(this,"updateRoomWritable",()=>{var d;(d=Q.currentManager)==null||d.onWritableChange(this.displayer.isWritable)});h(this,"roomStateChangeListener",async d=>{var b,Z;D.isRoom(this.displayer)&&!this.displayer.isWritable||(d.memberState&&((b=Q.currentManager)==null||b.onMemberChange(d.memberState)),d!=null&&d.roomMembers&&((Z=Q.currentManager)==null||Z.onRoomMembersChange(d.roomMembers)))})}static async getInstance(d,b){const Z=d.displayer,i=Z.callbacks.on,m=Z.callbacks.off,X=Z.callbacks.once,s=d.cleanCurrentScene,G=d.mainView.setMemberState,p=Z.setMemberState,W={displayer:Z,windowManager:d,maxScreenshotWidth:10*1024,maxScreenshotHeight:10*1024,_injectTargetObject:void 0,getBoundingRectAsync:async function(o){var Y;Q.logger.info("[ApplianceMultiPlugin] getBoundingRectAsync");const u=(this.windowManager&&this.windowManager.mainView||this.displayer).getBoundingRect(o),y=await((Y=Q.currentManager)==null?void 0:Y.getBoundingRect(o));return!u.width||!u.height?y:TZ(u,y)},screenshotToCanvasAsync:async function(o,u,y,Y,L,n){var F;Q.logger.info("[ApplianceMultiPlugin] screenshotToCanvasAsync");let a=y,x=Y,R=L.scale;a>this.maxScreenshotWidth&&(R=this.maxScreenshotWidth/a*R,a=this.maxScreenshotWidth),x>this.maxScreenshotHeight&&(R=Math.min(this.maxScreenshotHeight/x*R,R),x=this.maxScreenshotHeight),L.scale=R;const S=document.createElement("canvas"),J=S.getContext("2d");S.width=a*(n||1),S.height=x*(n||1),J&&((this.windowManager&&this.windowManager.mainView||this.displayer).screenshotToCanvas(J,u,a,x,L,n),o.drawImage(S,Math.floor((y-a)/2),Math.floor((Y-x)/2),a*(n||1),x*(n||1),0,0,a,x),S.remove()),Q.currentManager&&await((F=Q.currentManager)==null?void 0:F.screenshotToCanvas(o,u,a,x,L,Math.floor((y-a)/2),Math.floor((Y-x)/2)))},scenePreviewAsync:async function(o,u,y,Y,L){Q.logger.info("[ApplianceMultiPlugin] scenePreview"),(this.windowManager&&this.windowManager.mainView||this.displayer).scenePreview(o,u,y,Y,L);const n=document.createElement("img");n.style.position="absolute",n.style.top="0px",n.style.left="0px",n.style.width="100%",n.style.height="100%",n.style.pointerEvents="none",u.append(n),getComputedStyle(u).position||(u.style.position="relative"),Q.currentManager&&await Q.currentManager.scenePreview(o,n)},_callbacksOn:function(o,u){Q.logger.info(`[ApplianceMultiPlugin] callbacks ${o}`),(o==="onCanUndoStepsUpdate"||o==="onCanRedoStepsUpdate")&&D.isRoom(this.displayer)&&this.displayer.isWritable?Vl.InternalMsgEmitter.on(o,u):i.call(Z.callbacks,o,u)},_callbacksOnce:function(o,u){Q.logger.info(`[ApplianceMultiPlugin] callbacks ${o}`),(o==="onCanUndoStepsUpdate"||o==="onCanRedoStepsUpdate")&&D.isRoom(this.displayer)&&this.displayer.isWritable?Vl.InternalMsgEmitter.on(o,u):X.call(Z.callbacks,o,u)},_callbacksOff:function(o,u){Q.logger.info(`[ApplianceMultiPlugin] callbacks ${o}`),(o==="onCanUndoStepsUpdate"||o==="onCanRedoStepsUpdate")&&D.isRoom(this.displayer)&&this.displayer.isWritable?Vl.InternalMsgEmitter.off(o,u):m.call(Z.callbacks,o,u)},undo:function(){return Q.logger.info("[ApplianceMultiPlugin] undo"),Q.currentManager&&D.isRoom(this.displayer)&&!this.displayer.disableSerialization?Q.currentManager.viewContainerManager.undo():0},redo:function(){return Q.logger.info("[ApplianceMultiPlugin] redo"),Q.currentManager&&D.isRoom(this.displayer)&&!this.displayer.disableSerialization?Q.currentManager.viewContainerManager.redo():0},cleanCurrentScene:function(){Q.logger.info("[ApplianceMultiPlugin] cleanCurrentScene"),Q.currentManager&&D.isRoom(this.displayer)&&this.displayer.isWritable&&(Q.currentManager.cleanCurrentScene(),s.call(d))},insertImage:function(o){Q.logger.info("[ApplianceMultiPlugin] insertImage"),Q.currentManager&&D.isRoom(this.displayer)&&this.displayer.isWritable&&Q.currentManager.worker.insertImage(o)},lockImage:function(o,u){Q.logger.info("[ApplianceMultiPlugin] lockImage"),Q.currentManager&&D.isRoom(this.displayer)&&this.displayer.isWritable&&Q.currentManager.worker.lockImage(o,u)},completeImageUpload:function(o,u){Q.logger.info("[ApplianceMultiPlugin] completeImageUpload"),Q.currentManager&&D.isRoom(this.displayer)&&this.displayer.isWritable&&Q.currentManager.worker.completeImageUpload(o,u)},getImagesInformation:function(o){return Q.logger.info("[ApplianceMultiPlugin] completeImageUpload"),Q.currentManager&&D.isRoom(this.displayer)&&this.displayer.isWritable?Q.currentManager.worker.getImagesInformation(o):[]},callbacks:()=>(Q.logger.info("[ApplianceMultiPlugin] callbacks bind"),{...Z.callbacks,on:W._callbacksOn.bind(W),once:W._callbacksOnce.bind(W),off:W._callbacksOff.bind(W)}),destroy(){Q.currentManager&&(Q.logger.info("[ApplianceMultiPlugin] destroy"),Q.currentManager.destroy(),Q.currentManager=void 0)},setMemberState(o){if(Q.logger.info("[ApplianceMultiPlugin] setMemberState"),Object.keys(o).includes("currentApplianceName")&&(o.currentApplianceName&&o.currentApplianceName===E.laserPen?(o.currentApplianceName=E.pencil,o.useLaserPen=!0):o.currentApplianceName&&o.currentApplianceName===E.pencil&&(o.useLaserPen=!1)),W._injectTargetObject===d.mainView){G.call(W._injectTargetObject,o);return}p.call(Z,o)}};b!=null&&b.logger&&(Q.logger=b.logger),b!=null&&b.options&&(Q.options=b.options);let I=Z.getInvisiblePlugin(Q.kind);return Z&&I&&Q.createCurrentManager(d,Q.options,I),!I&&D.isRoom(Z)&&(I=await Q.createApplianceMultiPlugin(Z,Q.kind)),I&&Q.currentManager&&(Q.currentManager.bindPlugin(I),I.init(Z)),{...W,callbacks:W.callbacks(),injectMethodToObject:function(o,u){if(Q.logger.info(`[ApplianceMultiPlugin] injectMethodToObject ${u}`),typeof o[u]=="function"||typeof o[u]>"u"){u==="setMemberState"&&(W._injectTargetObject=o),o[u]=W[u].bind(W);return}u==="callbacks"&&(o.callbacks.on=W._callbacksOn.bind(W),o.callbacks.off=W._callbacksOff.bind(W),o.callbacks.once=W._callbacksOnce.bind(W))}}}static onCreate(d){d&&Q.currentManager&&(Q.currentManager.bindPlugin(d),d.init(d.displayer))}static async createApplianceMultiPlugin(d,b){await d.createInvisiblePlugin(Q,{});let Z=d.getInvisiblePlugin(b);return Z||(Z=await Q.createApplianceMultiPlugin(d,b)),Z}get isReplay(){return D.isPlayer(this.displayer)}get callbackName(){return this.isReplay?"onPlayerStateChanged":"onRoomStateChanged"}init(d){var b,Z;if(D.isRoom(d)){const i=d.state;(b=Q.currentManager)==null||b.onMemberChange(i.memberState),(Z=Q.currentManager)==null||Z.onRoomMembersChange(i.roomMembers)}this.displayer.callbacks.on(this.callbackName,this.roomStateChangeListener),this.displayer.callbacks.on("onEnableWriteNowChanged",this.updateRoomWritable),this.displayer.callbacks.on("onPhaseChanged",this.onPhaseChanged)}destroy(){var d;Q.logger.info("[ApplianceMultiPlugin] passive destroy"),(d=Q.currentManager)==null||d.destroy(),Q.currentManager=void 0}};h(Q,"kind","appliance-multi-plugin"),h(Q,"currentManager"),h(Q,"logger",{info:console.log,warn:console.warn,error:console.error}),h(Q,"options",{syncOpt:{interval:300},canvasOpt:{contextType:cl.Canvas2d}}),h(Q,"createCurrentManager",(d,b,Z)=>{if(Q.currentManager&&Q.currentManager.destroy(),b&&d){const i={plugin:Z,displayer:d.displayer,options:b},m=new Vl(i);Q.logger.info("[ApplianceMultiPlugin] refresh ApplianceMultiManager object"),m.setWindowManager(d),Q.currentManager=m}});let vl=Q;class BI extends td{constructor(d,b){super(d,b);h(this,"width",1e3);h(this,"height",1e3);h(this,"dpr",1);h(this,"vDom");h(this,"viewId","mainView");h(this,"eventTragetElement");h(this,"canvasServiceFloatRef",V.createRef());h(this,"canvasFloatRef",V.createRef());h(this,"canvasBgRef",V.createRef());h(this,"floatBarRef",V.createRef());h(this,"floatBarCanvasRef",V.createRef());h(this,"containerOffset",{x:0,y:0})}setCanvassStyle(){if(this.eventTragetElement){const d=this.eventTragetElement.offsetWidth,b=this.eventTragetElement.offsetHeight;d&&b&&this.canvasBgRef.current&&(this.dpr=lb(this.canvasBgRef.current.getContext("2d")),this.width=d,this.height=b,this.canvasBgRef.current.style.width=`${d}px`,this.canvasBgRef.current.style.height=`${b}px`,this.canvasBgRef.current.width=d*this.dpr,this.canvasBgRef.current.height=b*this.dpr,this.canvasFloatRef.current&&(this.canvasFloatRef.current.style.width=`${d}px`,this.canvasFloatRef.current.style.height=`${b}px`,this.canvasFloatRef.current.width=d*this.dpr,this.canvasFloatRef.current.height=b*this.dpr),this.canvasServiceFloatRef.current&&(this.canvasServiceFloatRef.current.style.width=`${d}px`,this.canvasServiceFloatRef.current.style.height=`${b}px`,this.canvasServiceFloatRef.current.width=d*this.dpr,this.canvasServiceFloatRef.current.height=b*this.dpr))}}createMainViewDisplayer(d){return this.vDom||(this.containerOffset=this.getContainerOffset(d,this.containerOffset),this.eventTragetElement=d.parentElement.children[0],d.innerHTML="",Bl.render(V.createElement(ib,{viewId:this.viewId,maranger:this,refs:{canvasServiceFloatRef:this.canvasServiceFloatRef,canvasFloatRef:this.canvasFloatRef,canvasBgRef:this.canvasBgRef,floatBarRef:this.floatBarRef,floatBarCanvasRef:this.floatBarCanvasRef}}),d),this.control.room&&this.bindDisplayerEvent(this.eventTragetElement)),this}}class Md extends bl{constructor(d){super(d);h(this,"focuedViewId");h(this,"control");h(this,"focuedView");this.control=d.control}bindMainView(){if(!this.control.divMainView)return;const d=new BI(this.control,yd.InternalMsgEmitter);this.focuedViewId=td.viewId;const{width:b,height:Z,dpr:i}=d,m={dpr:i,originalPoint:[b/2,Z/2],offscreenCanvasOpt:{...Md.defaultScreenCanvasOpt,width:b,height:Z},layerOpt:{...Md.defaultLayerOpt,width:b,height:Z},cameraOpt:{...Md.defaultCameraOpt,width:b,height:Z}},X=this.control.room&&this.control.room.mainView||this.control.play&&this.control.play.mainView;if(X){const{scale:s,...G}=X.camera;m.cameraOpt={...m.cameraOpt,...G,scale:s===1/0?1:s},this.createMianView({id:td.viewId,displayer:d,focusScenePath:X.focusScenePath||X.scenePath,cameraOpt:m.cameraOpt,viewData:X}),this.focuedView=this.mainView,d.createMainViewDisplayer(this.control.divMainView)}}mountView(d){var Z;const b=this.getView(d);if(b){const{width:i,height:m,dpr:X}=b.displayer,s={dpr:X,originalPoint:[i/2,m/2],offscreenCanvasOpt:{...Md.defaultScreenCanvasOpt,width:i,height:m},layerOpt:{...Md.defaultLayerOpt,width:i,height:m},cameraOpt:{...Md.defaultCameraOpt,width:i,height:m}};if(b.viewData){const{scale:G,...p}=b.viewData.camera;s.cameraOpt={...s.cameraOpt,...p,scale:G===1/0?1:G}}this.control.worker.isActive||this.control.activeWorker(),(Z=this.control.worker)==null||Z.createViewWorker(d,s),b.focusScenePath&&this.control.collector&&this.control.worker.pullServiceData(d,b.focusScenePath)}}}class Cd extends yd{constructor(d){super(d);h(this,"viewContainerManager");h(this,"divMainView");h(this,"onCameraChange",cd(d=>{this.viewContainerManager.setFocuedViewCameraOpt(d)},20,{leading:!1}));const b={control:this,internalMsgEmitter:Cd.InternalMsgEmitter};this.viewContainerManager=new Md(b)}init(){Cd.InternalMsgEmitter.on(v.BindMainView,d=>{this.divMainView=d,this.plugin&&!this.viewContainerManager.mainView&&this.viewContainerManager.bindMainView()})}activePlugin(){this.plugin&&this.divMainView&&!this.viewContainerManager.mainView&&this.viewContainerManager.bindMainView(),this.collector&&(this.collector.addStorageStateListener(d=>{var b,Z;if((b=this.collector)!=null&&b.storage&&Object.keys(this.collector.storage).length===0){(Z=this.worker)==null||Z.clearViewScenePath("mainView",!0);return}if(d){const i=new Map;Object.keys(d).forEach(m=>{var s;const X=d[m];if(X){const G=X.viewId,p=i.get(G)||new Set;p.add(m),i.set(G,p),(s=this.worker)==null||s.onServiceDerive(m,X)}});for(const[m,X]of i.entries())Cd.InternalMsgEmitter.emit("excludeIds",[...X],m)}}),this.room&&(this.roomMember.onUidChangeHook(d=>{var b,Z,i,m;if((b=this.collector)!=null&&b.serviceStorage){const X=[];this.viewContainerManager.getAllViews().forEach(s=>{var G,p,W;if(s&&s.focusScenePath&&((G=this.collector)!=null&&G.serviceStorage[s.id])&&((p=this.collector)!=null&&p.serviceStorage[s.id][s.focusScenePath])){const I=Object.keys((W=this.collector)==null?void 0:W.serviceStorage[s.id][s.focusScenePath]).filter(o=>{var u;return(u=this.collector)==null?void 0:u.isSelector(o)}).map(o=>({viewId:s.id,scenePath:s.focusScenePath,key:o}));I.length&&X.push(...I)}}),X.forEach(({key:s,viewId:G,scenePath:p})=>{var I,o;const W=(I=this.collector)==null?void 0:I.getUidFromKey(s);W&&!d.online.includes(W)&&((o=this.collector)==null||o.updateValue(s,void 0,{isAfterUpdate:!0,viewId:G,scenePath:p}))})}(i=(Z=this.cursor)==null?void 0:Z.eventCollector)!=null&&i.serviceStorage&&Object.keys((m=this.cursor)==null?void 0:m.eventCollector.serviceStorage).forEach(s=>{var G,p;d.online.includes(s)||(p=(G=this.cursor)==null?void 0:G.eventCollector)==null||p.clearValue(s)})}),this.worker.isActive&&this.viewContainerManager.getAllViews().forEach(d=>{d&&d.focusScenePath&&this.worker.pullServiceData(d.id,d.focusScenePath)})))}activeWorker(){this.worker.init()}}const z=class z extends D.InvisiblePlugin{constructor(){super(...arguments);h(this,"updateRoomWritable",()=>{var d;(d=z.currentManager)==null||d.onWritableChange(this.displayer.isWritable)});h(this,"roomStateChangeListener",async d=>{var b,Z;z.currentManager instanceof Cd&&(d.cameraState&&z.currentManager.onCameraChange(d.cameraState),d.sceneState&&z.currentManager.onSceneChange(d.sceneState.scenePath,"mainView")),!(D.isRoom(this.displayer)&&!this.displayer.isWritable)&&(d.memberState&&((b=z.currentManager)==null||b.onMemberChange(d.memberState)),d!=null&&d.roomMembers&&((Z=z.currentManager)==null||Z.onRoomMembersChange(d.roomMembers)))})}static async getInstance(d,b){const Z=d.callbacks.on,i=d.callbacks.off,m=d.callbacks.once,X=d.cleanCurrentScene,s=d.setMemberState,G={displayer:d,maxScreenshotWidth:10*1024,maxScreenshotHeight:10*1024,_injectTargetObject:void 0,getBoundingRectAsync:async function(W){var u;z.logger.info("[ApplianceSinglePlugin] getBoundingRectAsync");const I=this.displayer.getBoundingRect(W),o=await((u=z.currentManager)==null?void 0:u.getBoundingRect(W));return!I.width||!I.height?o:TZ(I,o)},screenshotToCanvasAsync:async function(W,I,o,u,y,Y){var S;z.logger.info("[ApplianceSinglePlugin] screenshotToCanvasAsync");let L=o,n=u,a=y.scale;L>this.maxScreenshotWidth&&(a=this.maxScreenshotWidth/L*a,L=this.maxScreenshotWidth),n>this.maxScreenshotHeight&&(a=Math.min(this.maxScreenshotHeight/n*a,a),n=this.maxScreenshotHeight),y.scale=a;const x=document.createElement("canvas"),R=x.getContext("2d");x.width=L*(Y||1),x.height=n*(Y||1),R&&(this.displayer.screenshotToCanvas(R,I,L,n,y,Y),W.drawImage(x,Math.floor((o-L)/2),Math.floor((u-n)/2),L*(Y||1),n*(Y||1),0,0,L,n),x.remove()),z.currentManager&&await((S=z.currentManager)==null?void 0:S.screenshotToCanvas(W,I,L,n,y,Math.floor((o-L)/2),Math.floor((u-n)/2)))},scenePreviewAsync:async function(W,I,o,u,y){z.logger.info("[ApplianceSinglePlugin] scenePreview"),this.displayer.scenePreview(W,I,o,u,y);const Y=document.createElement("img");Y.style.position="absolute",Y.style.top="0px",Y.style.left="0px",Y.style.width="100%",Y.style.height="100%",Y.style.pointerEvents="none",I.append(Y),getComputedStyle(I).position||(I.style.position="relative"),z.currentManager&&await z.currentManager.scenePreview(W,Y)},_callbacksOn:function(W,I){z.logger.info(`[ApplianceSinglePlugin] callbacks ${W}`),(W==="onCanUndoStepsUpdate"||W==="onCanRedoStepsUpdate")&&D.isRoom(this.displayer)&&this.displayer.isWritable?Cd.InternalMsgEmitter.on(W,I):Z.call(d.callbacks,W,I)},_callbacksOnce:function(W,I){z.logger.info(`[ApplianceSinglePlugin] callbacks ${W}`),(W==="onCanUndoStepsUpdate"||W==="onCanRedoStepsUpdate")&&D.isRoom(this.displayer)&&this.displayer.isWritable?Cd.InternalMsgEmitter.on(W,I):m.call(d.callbacks,W,I)},_callbacksOff:function(W,I){z.logger.info(`[ApplianceSinglePlugin] callbacks ${W}`),(W==="onCanUndoStepsUpdate"||W==="onCanRedoStepsUpdate")&&D.isRoom(this.displayer)&&this.displayer.isWritable?Cd.InternalMsgEmitter.off(W,I):i.call(d.callbacks,W,I)},undo:function(){return z.logger.info("[ApplianceSinglePlugin] undo"),z.currentManager&&D.isRoom(this.displayer)&&!this.displayer.disableSerialization?z.currentManager.viewContainerManager.undo():0},redo:function(){return z.logger.info("[ApplianceSinglePlugin] redo"),z.currentManager&&D.isRoom(this.displayer)&&!this.displayer.disableSerialization?z.currentManager.viewContainerManager.redo():0},cleanCurrentScene:function(W){z.logger.info("[ApplianceSinglePlugin] cleanCurrentScene"),z.currentManager&&D.isRoom(this.displayer)&&this.displayer.isWritable&&(z.currentManager.cleanCurrentScene(),X.call(d,W))},insertImage:function(W){z.logger.info("[ApplianceSinglePlugin] insertImage"),z.currentManager&&D.isRoom(this.displayer)&&this.displayer.isWritable&&z.currentManager.worker.insertImage(W)},lockImage:function(W,I){z.logger.info("[ApplianceSinglePlugin] lockImage"),z.currentManager&&D.isRoom(this.displayer)&&this.displayer.isWritable&&z.currentManager.worker.lockImage(W,I)},completeImageUpload:function(W,I){z.logger.info("[ApplianceSinglePlugin] completeImageUpload"),z.currentManager&&D.isRoom(this.displayer)&&this.displayer.isWritable&&z.currentManager.worker.completeImageUpload(W,I)},getImagesInformation:function(W){return z.logger.info("[ApplianceSinglePlugin] completeImageUpload"),z.currentManager&&D.isRoom(this.displayer)&&this.displayer.isWritable?z.currentManager.worker.getImagesInformation(W):[]},callbacks:()=>({...d.callbacks,on:G._callbacksOn.bind(G),once:G._callbacksOnce.bind(G),off:G._callbacksOff.bind(G)}),destroy(){z.currentManager&&(z.logger.info("[ApplianceSinglePlugin] destroy"),z.currentManager.destroy(),z.currentManager=void 0,z.cursorAdapter=void 0)},setMemberState(W){z.logger.info("[ApplianceSinglePlugin] setMemberState"),Object.keys(W).includes("currentApplianceName")&&(W.currentApplianceName&&W.currentApplianceName===E.laserPen&&(W.currentApplianceName=E.pencil,W.useLaserPen=!0),W.currentApplianceName&&W.currentApplianceName===E.pencil&&(W.useLaserPen=!1)),s(W)}};b!=null&&b.logger&&(z.logger=b.logger),b!=null&&b.options&&(z.options=b.options);let p=d.getInvisiblePlugin(z.kind);return d&&p&&z.createCurrentManager(d,z.options,p),!p&&D.isRoom(d)&&(p=await z.createAppliancePlugin(d,z.kind)),p&&z.currentManager&&(z.currentManager.bindPlugin(p),p.init(d)),b!=null&&b.cursorAdapter&&(z.cursorAdapter=b.cursorAdapter),z.effectInstance(),{...G,callbacks:G.callbacks(),injectMethodToObject:function(W,I){if(z.logger.info(`[ApplianceSinglePlugin] injectMethodToObject ${I}`),typeof W[I]=="function"||typeof W[I]>"u"){W[I]=G[I].bind(G);return}I==="callbacks"&&(W.callbacks.on=G._callbacksOn.bind(G),W.callbacks.off=G._callbacksOff.bind(G),W.callbacks.once=G._callbacksOnce.bind(G))}}}static onCreate(d){d&&z.currentManager&&(z.currentManager.bindPlugin(d),d.init(d.displayer))}static async createAppliancePlugin(d,b){await d.createInvisiblePlugin(z,{});let Z=d.getInvisiblePlugin(b);return Z||(Z=await z.createAppliancePlugin(d,b)),Z}static effectInstance(){if(z.cursorAdapter){const d=z.cursorAdapter.onAddedCursor;z.cursorAdapter.onAddedCursor=function(b){b.onCursorMemberChanged=Z=>{try{Z.appliance===E.pencil||Z.appliance===E.shape||Z.appliance===E.text||Z.appliance===E.arrow||Z.appliance===E.straight||Z.appliance===E.rectangle||Z.appliance===E.ellipse?b!=null&&b.divElement&&(b.divElement.style.display="none"):b!=null&&b.divElement&&(b.divElement.style.display="block")}catch{}},d.call(z.cursorAdapter,b)}}}get isReplay(){return D.isPlayer(this.displayer)}get callbackName(){return this.isReplay?"onPlayerStateChanged":"onRoomStateChanged"}init(d){var b;if(D.isRoom(d)){const Z=d.state;Z!=null&&Z.memberState&&((b=z.currentManager)==null||b.onMemberChange(Z.memberState))}this.displayer.callbacks.on(this.callbackName,this.roomStateChangeListener),this.displayer.callbacks.on("onEnableWriteNowChanged",this.updateRoomWritable)}destroy(){var d;z.logger.info("[ApplianceSinglePlugin] passive destroy"),(d=z.currentManager)==null||d.destroy(),z.currentManager=void 0,z.cursorAdapter=void 0}};h(z,"kind","teaching-aids-single-plugin"),h(z,"cursorAdapter"),h(z,"currentManager"),h(z,"logger",{info:console.log,warn:console.warn,error:console.error}),h(z,"options",{syncOpt:{interval:300},canvasOpt:{contextType:cl.Canvas2d}}),h(z,"createCurrentManager",(d,b,Z)=>{z.currentManager&&z.currentManager.destroy();const i={plugin:Z,displayer:d,options:b},m=new Cd(i);m.init(),z.logger.info("[ApplianceSinglePlugin] refresh ApplianceSingleManager object"),z.currentManager=m});let Pl=z;const wd=class wd extends V.Component{constructor(){super(...arguments);h(this,"mainViewRef",null)}componentDidMount(){wd.emiter||(wd.emiter=Cd.InternalMsgEmitter),wd.emiter.emit(v.BindMainView,this.mainViewRef)}componentWillUnmount(){wd.emiter.emit(v.DisplayState,bZ.unmounted)}render(){return V.createElement(V.Fragment,null,this.props.children,V.createElement("div",{className:"teaching-aids-plugin-main-view-displayer",ref:d=>this.mainViewRef=d}))}};h(wd,"emiter");let jl=wd;exports.ApplianceMultiPlugin=vl;exports.ApplianceSigleWrapper=jl;exports.ApplianceSinglePlugin=Pl;exports.ECanvasContextType=cl;
|