From d86f3c45a2df85a3251e17a893cf9443241c7f2a Mon Sep 17 00:00:00 2001 From: Martin Date: Wed, 20 Mar 2024 12:54:53 +0100 Subject: [PATCH] [GoldenLayout] Implement layout deserializer This commit makes it possible to obtain the current layout (including popouts) as a deserialized model type. Also adds builders to easily define multi-window layouts. --- .../Aardvark.UI.Primitives.fsproj | 2 + .../Golden/GoldenLayout.fs | 329 +++--------------- .../Golden/GoldenLayoutBuilders.fs | 245 +++++++++++++ .../Golden/GoldenLayoutJson.fs | 304 ++++++++++++++++ .../Golden/GoldenLayoutModel.fs | 29 +- .../golden-layout/bundle/umd/golden-layout.js | 233 ++++++++----- .../bundle/umd/golden-layout.min.js | 2 +- .../golden-layout/golden-layout-aard.js | 32 +- .../27 - GoldenLayout/App.fs | 21 +- 9 files changed, 803 insertions(+), 394 deletions(-) create mode 100644 src/Aardvark.UI.Primitives/Golden/GoldenLayoutBuilders.fs create mode 100644 src/Aardvark.UI.Primitives/Golden/GoldenLayoutJson.fs diff --git a/src/Aardvark.UI.Primitives/Aardvark.UI.Primitives.fsproj b/src/Aardvark.UI.Primitives/Aardvark.UI.Primitives.fsproj index 671ee9c2..6c928747 100644 --- a/src/Aardvark.UI.Primitives/Aardvark.UI.Primitives.fsproj +++ b/src/Aardvark.UI.Primitives/Aardvark.UI.Primitives.fsproj @@ -61,7 +61,9 @@ + + diff --git a/src/Aardvark.UI.Primitives/Golden/GoldenLayout.fs b/src/Aardvark.UI.Primitives/Golden/GoldenLayout.fs index f7ec5380..a6665850 100644 --- a/src/Aardvark.UI.Primitives/Golden/GoldenLayout.fs +++ b/src/Aardvark.UI.Primitives/Golden/GoldenLayout.fs @@ -54,183 +54,37 @@ module Layout = let inline ofRoot (item : ^T) = ofRootAux Unchecked.defaultof item +[] +module WindowLayout = + + [] + type Converter = + static member inline ToWindowLayout(layout : WindowLayout) = layout + static member inline ToWindowLayout(layout : Layout) = { Root = Some layout; PopoutWindows = [] } + static member inline ToWindowLayout(root : Element) = Converter.ToWindowLayout(Layout.Element root) + static member inline ToWindowLayout(root : Stack) = Converter.ToWindowLayout(Layout.Stack root) + static member inline ToWindowLayout(root : RowOrColumn) = Converter.ToWindowLayout(Layout.RowOrColumn root) + + let inline private ofRootAux (_ : ^Z) (item : ^T) = + ((^Z or ^T) : (static member ToWindowLayout : ^T -> WindowLayout) (item)) + + let inline ofRoot (item : ^T) = + ofRootAux Unchecked.defaultof item + [] -module Builders = - - module ElementError = - type IdMustBeSpecified = IdMustBeSpecified - - type ElementBuilder() = - member inline x.Yield(()) = ElementError.IdMustBeSpecified - - /// Unique name to identify the element in the view function. - [] - member inline x.Id(_ : ElementError.IdMustBeSpecified, id : string) = - { Id = id - Title = "Untitled" - Closable = true - Header = Some Header.Top - Buttons = None - MinSize = None - Size = Size.Weight 1 - KeepAlive = true } - - /// Title shown in the header tab. Default is "Untitled". - [] - member inline x.Title(e : Element, title : string) = - { e with Title = title } - - /// Determines if the element can be closed via buttons in the header and tab. - [] - member inline x.Closable(e : Element, closable : bool) = - { e with Closable = closable } - - /// Determines the position of the header or if one is shown at all. Default is Header.Top. - [] - member inline x.Header(e : Element, header : Header option) = - { e with Header = header } - - /// Determines the position of the header. Default is Header.Top. - [] - member inline x.Header(e : Element, header : Header) = - { e with Header = Some header } - - /// Buttons to display in the header. - [] - member inline x.Buttons(e : Element, buttons : Buttons) = - { e with Buttons = Some buttons } - - /// Minimum size (in pixels) of the element in any dimension. - [] - member inline x.MinSize(e : Element, sizeInPixels : int) = - { e with MinSize = Some sizeInPixels } - - /// Size of the element in case the parent is a row or column container. - [] - member inline x.Size(e : Element, size : Size) = - { e with Size = size } - - /// Size of the element (in percent) in case the parent is a row or column container. - [] - member inline x.Size(e : Element, sizeInPercent : int) = - { e with Size = Size.Percentage sizeInPercent } - - /// Size as weight relative to siblings in case the parent is a row or column container. - [] - member inline x.Weight(e : Element, weight : int) = - { e with Size = Size.Weight weight } - - /// If true the DOM element is hidden rather than destroyed if it is removed from the layout. - /// This allows for faster restoring of the element but may come with a performance penalty. Default is true. - [] - member inline x.KeepAlive(e : Element, keepAlive : bool) = - { e with KeepAlive = keepAlive } - - type StackBuilder() = - static let empty = - { Header = Header.Top - Buttons = None - Content = [] - Size = Size.Weight 1 } - - member x.Yield(()) = empty - member x.Yield(e : Element) = { empty with Content = [e] } - member x.Yield(e : Element seq) = { empty with Content = List.ofSeq e } - - member x.Delay(f : unit -> Stack) = f() - member x.Combine(a : Stack, b : Stack) = { a with Content = a.Content @ b.Content } - member x.For(s: Stack, f: unit -> Stack) = x.Combine(s, f()) - - /// Determines the position of the header. - [] - member inline x.Header(s : Stack, header : Header) = - { s with Header = header } - - /// Buttons to display in the header. - [] - member inline x.Buttons(s : Stack, buttons : Buttons) = - { s with Buttons = Some buttons } - - /// Size of the stack in case the parent is a row or column container. - [] - member inline x.Size(s : Stack, size : Size) = - { s with Size = size } - - /// Size of the stack (in percent) in case the parent is a row or column container. - [] - member inline x.Size(s : Stack, sizeInPercent : int) = - { s with Size = Size.Percentage sizeInPercent } - - /// Size as weight relative to siblings in case the parent is a row or column container. - [] - member inline x.Weight(s : Stack, weight : int) = - { s with Size = Size.Weight weight } - - /// Content of the stack. - [] - member inline x.Content(s : Stack, c : Element seq) = - { s with Content = List.ofSeq c } - - type RowOrColumnBuilder(isRow : bool) = - let empty = - { IsRow = isRow - Content = [] - Size = Size.Weight 1 } - - member x.Yield(()) = empty - member x.Yield(l : Layout) = { empty with Content = [l] } - member x.Yield(e : Element) = x.Yield(Layout.Element e) - member x.Yield(s : Stack) = x.Yield(Layout.Stack s) - member x.Yield(rc : RowOrColumn) = x.Yield(Layout.RowOrColumn rc) - member x.Yield(l : Layout seq) = { empty with Content = List.ofSeq l } - member x.Yield(e : Element seq) = x.Yield(e |> Seq.map Layout.Element) - member x.Yield(s : Stack seq) = x.Yield(s |> Seq.map Layout.Stack) - member x.Yield(rc : RowOrColumn seq) = x.Yield(rc |> Seq.map Layout.RowOrColumn) - - member x.Delay(f : unit -> RowOrColumn) = f() - member x.Combine(a : RowOrColumn, b : RowOrColumn) = { a with Content = a.Content @ b.Content } - member x.For(rc: RowOrColumn, f: unit -> RowOrColumn) = x.Combine(rc, f()) - - /// Size of the container in case the parent is a row or column container. - [] - member inline x.Size(rc : RowOrColumn, size : Size) = - { rc with Size = size } - - /// Size of the container (in percent) in case the parent is a row or column container. - [] - member inline x.Size(rc : RowOrColumn, sizeInPercent : int) = - { rc with Size = Size.Percentage sizeInPercent } - - /// Size as weight relative to siblings in case the parent is a row or column container. - [] - member inline x.Weight(rc : RowOrColumn, weight : int) = - { rc with Size = Size.Weight weight } - - /// Content of the container. - [] - member inline x.Content(rc : RowOrColumn, c : Layout seq) = - { rc with Content = List.ofSeq c } - - /// Content of the container. - [] - member inline x.Content(rc : RowOrColumn, c : Element seq) = - x.Content(rc, c |> Seq.map Layout.Element) - - /// Content of the container. - [] - member inline x.Content(rc : RowOrColumn, c : Stack seq) = - x.Content(rc, c |> Seq.map Layout.Stack) - - /// Content of the container. - [] - member inline x.Content(rc : RowOrColumn, c : RowOrColumn seq) = - x.Content(rc, c |> Seq.map Layout.RowOrColumn) - - let element = ElementBuilder() - let stack = StackBuilder() - let row = RowOrColumnBuilder true - let column = RowOrColumnBuilder false +module Events = + /// Fired whenever the layout changes. Does not serialize and pass the layout to the callback. + let inline onLayoutChanged' (callback : unit -> 'msg) = + onEvent "onLayoutChanged" [] (ignore >> callback) + + /// Fired whenever the layout changes. The first parameter of the callback contains the serialized layout. + let inline onLayoutChangedRaw (callback : string -> 'msg) = + onEvent "onSerializedLayoutChanged" [] (List.head >> callback) + + /// Fired whenever the layout changes. The first parameter of the callback contains the new layout. + let inline onLayoutChanged (callback : WindowLayout -> 'msg) = + onLayoutChangedRaw (GoldenLayout.Json.deserialize >> callback) [] module GoldenLayoutApp = @@ -255,9 +109,6 @@ module GoldenLayoutApp = new (data : aval<('T * int) option>) = TaggedChannel(data, Pickler.jsonToString) override x.GetReader() = new TaggedChannelReader<_>(data, pickle) :> ChannelReader - let onLayoutChanged (callback : unit -> 'msg) = - onEvent "onLayoutChanged" [] (ignore >> callback) - module GoldenLayout = open Suave open Suave.Filters @@ -265,107 +116,8 @@ module GoldenLayoutApp = open Suave.Successful open System.IO - module Json = - open Newtonsoft.Json - open Newtonsoft.Json.Linq - - module private JObject = - - let private ofHeader (config : LayoutConfig) (buttons : Buttons option) (header : Header option) = - let o = JObject() - - let show = - match header with - | Some Header.Top -> JToken.op_Implicit "top" - | Some Header.Left -> JToken.op_Implicit "left" - | Some Header.Right -> JToken.op_Implicit "right" - | Some Header.Bottom -> JToken.op_Implicit "bottom" - | _ -> JToken.op_Implicit false - - let buttons = buttons |> Option.defaultValue config.HeaderButtons - - let button (property : string) (flag : Buttons) = - if not <| buttons.HasFlag flag then - o.[property] <- JToken.op_Implicit false - - o.["show"] <- show - button "close" Buttons.Close - button "popout" Buttons.Popout - button "maximise" Buttons.Maximize - o - - let rec ofLayout (config : LayoutConfig) (layout : Layout) : JObject = - let o = JObject() - - match layout with - | Layout.Element e -> - o.["type"] <- JToken.op_Implicit "component" - o.["title"] <- JToken.op_Implicit e.Title - o.["componentType"] <- JToken.op_Implicit e.Id - o.["isClosable"] <- JToken.op_Implicit e.Closable - o.["header"] <- ofHeader config e.Buttons e.Header - o.["size"] <- JToken.op_Implicit (string e.Size) - - match e.MinSize with - | Some s -> o.["minSize"] <- JToken.op_Implicit $"%d{s}px" - | _ -> () - - let s = JObject() - s.["keepAlive"] <- JToken.op_Implicit e.KeepAlive - o.["componentState"] <- s - - | Layout.Stack s -> - let content = s.Content |> List.map (Layout.Element >> ofLayout config >> box) - o.["type"] <- JToken.op_Implicit "stack" - o.["header"] <- ofHeader config s.Buttons (Some s.Header) - o.["size"] <- JToken.op_Implicit (string s.Size) - o.["content"] <- JArray(List.toArray content) - - | Layout.RowOrColumn rc -> - let content = rc.Content |> List.map (ofLayout config >> box) - o.["type"] <- JToken.op_Implicit (if rc.IsRow then "row" else "column") - o.["size"] <- JToken.op_Implicit (string rc.Size) - o.["content"] <- JArray(List.toArray content) - - o - - let ofConfigLabels (config : LayoutConfig) = - let o = JObject() - o.["close"] <- JToken.op_Implicit config.LabelClose - o.["maximise"] <- JToken.op_Implicit config.LabelMaximize - o.["minimise"] <- JToken.op_Implicit config.LabelMinimize - o.["popout"] <- JToken.op_Implicit config.LabelPopOut - o.["popin"] <- JToken.op_Implicit config.LabelPopIn - o.["tabDropdown"] <- JToken.op_Implicit config.LabelTabDropdown - o - - let ofConfigSettings (config : LayoutConfig) = - let o = JObject() - o.["popInOnClose"] <- JToken.op_Implicit config.PopInOnClose - o.["popoutWholeStack"] <- JToken.op_Implicit config.PopOutWholeStack - o.["dragBetweenWindows"] <- JToken.op_Implicit config.DragBetweenWindows - o.["dragToNewWindow"] <- JToken.op_Implicit config.DragToNewWindow - o.["setPopoutTitle"] <- JToken.op_Implicit config.SetPopoutTitle - o - - let ofConfigDimensions (config : LayoutConfig) = - let o = JObject() - o.["defaultMinItemWidth"] <- JToken.op_Implicit $"{config.MinItemWidth}px" - o.["defaultMinItemHeight"] <- JToken.op_Implicit $"{config.MinItemHeight}px" - o.["dragProxyWidth"] <- JToken.op_Implicit config.DragProxyWidth - o.["dragProxyHeight"] <- JToken.op_Implicit config.DragProxyHeight - o - - let ofLayoutConfig (config : LayoutConfig) (layout : Layout) = - let o = JObject() - o.["root"] <- JObject.ofLayout config layout - o.["settings"] <- JObject.ofConfigSettings config - o.["dimensions"] <- JObject.ofConfigDimensions config - o.["header"] <- JObject.ofConfigLabels config - o.ToString Formatting.None - let inline create (config : LayoutConfig) (root : ^LayoutRoot) = - let layout = Layout.ofRoot root + let layout = WindowLayout.ofRoot root { DefaultLayout = layout Config = config @@ -376,9 +128,13 @@ module GoldenLayoutApp = let rec update (message : GoldenLayout.Message) (model : GoldenLayout) = match message with | GoldenLayout.Message.ResetLayout -> - model |> update (GoldenLayout.Message.SetLayout model.DefaultLayout) + model |> update (GoldenLayout.Message.SetWindowLayout model.DefaultLayout) | GoldenLayout.Message.SetLayout layout -> + let layout = WindowLayout.ofRoot layout + model |> update (GoldenLayout.Message.SetWindowLayout layout) + + | GoldenLayout.Message.SetWindowLayout layout -> let version = model.SetLayout |> Option.map snd |> Option.defaultValue 0 { model with SetLayout = Some (layout, version + 1) } @@ -414,18 +170,25 @@ module GoldenLayoutApp = attribute "data-theme" model.Config.Theme.Path ] + let serializeLayout = + attributes |> List.exists (function + | "onSerializedLayoutChanged", AttributeValue.Event _ -> true + | _ -> false + ) + |> fun r -> if r then "true" else "false" + let channels : (string * Channel) list = [ - "channelSet", TaggedChannel (model.SetLayout, Json.ofLayoutConfig model.Config >> Pickler.jsonToString) + "channelSet", TaggedChannel (model.SetLayout, GoldenLayout.Json.serialize model.Config) "channelSave", TaggedChannel model.SaveLayout "channelLoad", TaggedChannel model.LoadLayout ] let boot = - let configJson = Json.ofLayoutConfig model.Config model.DefaultLayout + let configJson = GoldenLayout.Json.serialize model.Config model.DefaultLayout String.concat "" [ "const self = $('#__ID__')[0];" - $"aardvark.golden.createLayout(self, {configJson});" - "channelSet.onmessage = (layout) => aardvark.golden.setLayout(self, JSON.parse(layout));" + $"aardvark.golden.createLayout(self, {configJson}, {serializeLayout});" + "channelSet.onmessage = (layout) => aardvark.golden.setLayout(self, layout);" "channelSave.onmessage = (key) => aardvark.golden.saveLayout(self, key);" "channelLoad.onmessage = (key) => aardvark.golden.loadLayout(self, key);" ] diff --git a/src/Aardvark.UI.Primitives/Golden/GoldenLayoutBuilders.fs b/src/Aardvark.UI.Primitives/Golden/GoldenLayoutBuilders.fs new file mode 100644 index 00000000..09121c61 --- /dev/null +++ b/src/Aardvark.UI.Primitives/Golden/GoldenLayoutBuilders.fs @@ -0,0 +1,245 @@ +namespace Aardvark.UI.Primitives.Golden + +open Aardvark.Base + +[] +module Builders = + + module ElementError = + type IdMustBeSpecified = IdMustBeSpecified + + type ElementBuilder() = + member inline x.Yield(()) = ElementError.IdMustBeSpecified + + /// Unique name to identify the element in the view function. + [] + member inline x.Id(_ : ElementError.IdMustBeSpecified, id : string) = + { Id = id + Title = "Untitled" + Closable = true + Header = Some Header.Top + Buttons = None + MinSize = None + Size = Size.Weight 1 + KeepAlive = true } + + /// Title shown in the header tab. Default is "Untitled". + [] + member inline x.Title(e : Element, title : string) = + { e with Title = title } + + /// Determines if the element can be closed via buttons in the header and tab. + [] + member inline x.Closable(e : Element, closable : bool) = + { e with Closable = closable } + + /// Determines the position of the header or if one is shown at all. Default is Header.Top. + [] + member inline x.Header(e : Element, header : Header option) = + { e with Header = header } + + /// Determines the position of the header. Default is Header.Top. + [] + member inline x.Header(e : Element, header : Header) = + { e with Header = Some header } + + /// Buttons to display in the header. + [] + member inline x.Buttons(e : Element, buttons : Buttons) = + { e with Buttons = Some buttons } + + /// Minimum size (in pixels) of the element in any dimension. + [] + member inline x.MinSize(e : Element, sizeInPixels : int) = + { e with MinSize = Some sizeInPixels } + + /// Size of the element in case the parent is a row or column container. + [] + member inline x.Size(e : Element, size : Size) = + { e with Size = size } + + /// Size of the element (in percent) in case the parent is a row or column container. + [] + member inline x.Size(e : Element, sizeInPercent : int) = + { e with Size = Size.Percentage sizeInPercent } + + /// Size as weight relative to siblings in case the parent is a row or column container. + [] + member inline x.Weight(e : Element, weight : int) = + { e with Size = Size.Weight weight } + + /// If true the DOM element is hidden rather than destroyed if it is removed from the layout. + /// This allows for faster restoring of the element but may come with a performance penalty. Default is true. + [] + member inline x.KeepAlive(e : Element, keepAlive : bool) = + { e with KeepAlive = keepAlive } + + type StackBuilder() = + static let empty = + { Header = Header.Top + Buttons = None + Content = [] + Size = Size.Weight 1 } + + member x.Yield(()) = empty + member x.Yield(e : Element) = { empty with Content = [e] } + member x.Yield(e : Element seq) = { empty with Content = List.ofSeq e } + + member x.Delay(f : unit -> Stack) = f() + member x.Combine(a : Stack, b : Stack) = { a with Content = a.Content @ b.Content } + member x.For(s: Stack, f: unit -> Stack) = x.Combine(s, f()) + + /// Determines the position of the header. + [] + member inline x.Header(s : Stack, header : Header) = + { s with Header = header } + + /// Buttons to display in the header. + [] + member inline x.Buttons(s : Stack, buttons : Buttons) = + { s with Buttons = Some buttons } + + /// Size of the stack in case the parent is a row or column container. + [] + member inline x.Size(s : Stack, size : Size) = + { s with Size = size } + + /// Size of the stack (in percent) in case the parent is a row or column container. + [] + member inline x.Size(s : Stack, sizeInPercent : int) = + { s with Size = Size.Percentage sizeInPercent } + + /// Size as weight relative to siblings in case the parent is a row or column container. + [] + member inline x.Weight(s : Stack, weight : int) = + { s with Size = Size.Weight weight } + + /// Content of the stack. + [] + member inline x.Content(s : Stack, c : Element seq) = + { s with Content = List.ofSeq c } + + type RowOrColumnBuilder(isRow : bool) = + let empty = + { IsRow = isRow + Content = [] + Size = Size.Weight 1 } + + member x.Yield(()) = empty + member x.Yield(l : Layout) = { empty with Content = [l] } + member x.Yield(e : Element) = x.Yield(Layout.Element e) + member x.Yield(s : Stack) = x.Yield(Layout.Stack s) + member x.Yield(rc : RowOrColumn) = x.Yield(Layout.RowOrColumn rc) + member x.Yield(l : Layout seq) = { empty with Content = List.ofSeq l } + member x.Yield(e : Element seq) = x.Yield(e |> Seq.map Layout.Element) + member x.Yield(s : Stack seq) = x.Yield(s |> Seq.map Layout.Stack) + member x.Yield(rc : RowOrColumn seq) = x.Yield(rc |> Seq.map Layout.RowOrColumn) + + member x.Delay(f : unit -> RowOrColumn) = f() + member x.Combine(a : RowOrColumn, b : RowOrColumn) = { a with Content = a.Content @ b.Content } + member x.For(rc: RowOrColumn, f: unit -> RowOrColumn) = x.Combine(rc, f()) + + /// Size of the container in case the parent is a row or column container. + [] + member inline x.Size(rc : RowOrColumn, size : Size) = + { rc with Size = size } + + /// Size of the container (in percent) in case the parent is a row or column container. + [] + member inline x.Size(rc : RowOrColumn, sizeInPercent : int) = + { rc with Size = Size.Percentage sizeInPercent } + + /// Size as weight relative to siblings in case the parent is a row or column container. + [] + member inline x.Weight(rc : RowOrColumn, weight : int) = + { rc with Size = Size.Weight weight } + + /// Content of the container. + [] + member inline x.Content(rc : RowOrColumn, c : Layout seq) = + { rc with Content = List.ofSeq c } + + /// Content of the container. + [] + member inline x.Content(rc : RowOrColumn, c : Element seq) = + x.Content(rc, c |> Seq.map Layout.Element) + + /// Content of the container. + [] + member inline x.Content(rc : RowOrColumn, c : Stack seq) = + x.Content(rc, c |> Seq.map Layout.Stack) + + /// Content of the container. + [] + member inline x.Content(rc : RowOrColumn, c : RowOrColumn seq) = + x.Content(rc, c |> Seq.map Layout.RowOrColumn) + + module PopoutWindowError = + type RootLayoutMustBeSpecified = RootLayoutMustBeSpecified + + type PopoutWindowState<'T> = 'T * V2i option * V2i option + + type PopoutWindowBuilder() = + member inline x.Yield(()) : PopoutWindowState = PopoutWindowError.RootLayoutMustBeSpecified, None, None + member inline x.Yield(r : ^Layout) : PopoutWindowState = Layout.ofRoot r, None, None + + member inline x.Delay(f : unit -> PopoutWindowState<'T>) = f() + + member inline x.Combine((l, p1, s1) : PopoutWindowState<'T1>, (_, p2, s2) : PopoutWindowState<'T2>) : PopoutWindowState<'T1> = + (l, p2 |> Option.orElse p1, s2 |> Option.orElse s1 ) + + member inline x.For(s : PopoutWindowState<'T1>, f: unit -> PopoutWindowState<'T2>) = x.Combine(s, f()) + + // Layout of the window contents. + [] + member inline x.Root((_, position, size) : PopoutWindowState<'T>, root : ^Root) : PopoutWindowState = + Layout.ofRoot root, position, size + + /// Determines the position of the popout window. + [] + member inline x.Position((root, _, size) : PopoutWindowState<'T>, position : V2i) : PopoutWindowState<'T> = + root, Some position, size + + /// Determines the size of the popout window. + [] + member inline x.Size((root, position, _) : PopoutWindowState<'T>, size : V2i) : PopoutWindowState<'T> = + root, position, Some size + + /// Determines the width of the popout window. + [] + member inline x.Width((root, position, size) : PopoutWindowState<'T>, width : int) : PopoutWindowState<'T> = + let size = size |> Option.defaultValue (V2i(300)) |> (fun s -> Some <| V2i(width, s.Y)) + root, position, size + + /// Determines the width of the popout window. + [] + member inline x.Height((root, position, size) : PopoutWindowState<'T>, height : int) : PopoutWindowState<'T> = + let size = size |> Option.defaultValue (V2i(300)) |> (fun s -> Some <| V2i(s.X, height)) + root, position, size + + member inline x.Run((root, position, size) : PopoutWindowState) = + { Root = root; Position = position; Size = size } + + type WindowLayoutBuilder() = + member inline x.Yield(()) = { Root = None; PopoutWindows = [] } + member inline x.Yield(r : ^Layout) = { Root = Some <| Layout.ofRoot r; PopoutWindows = [] } + member inline x.Yield(p : PopoutWindow) = { Root = None; PopoutWindows = [p] } + + member inline x.Delay(f : unit -> WindowLayout) = f() + member inline x.Combine(a : WindowLayout, b : WindowLayout) = { a with PopoutWindows = a.PopoutWindows @ b.PopoutWindows } + member inline x.For(l: WindowLayout, f: unit -> WindowLayout) = x.Combine(l, f()) + + // Layout of the main window. + [] + member inline x.Root(l : WindowLayout, root : ^Root) = { l with Root = Some <| Layout.ofRoot root } + + // Sequence of popout windows. + [] + member inline x.Popouts(l : WindowLayout, popouts : PopoutWindow seq) = { l with PopoutWindows = List.ofSeq popouts } + + let element = ElementBuilder() + let stack = StackBuilder() + let row = RowOrColumnBuilder true + let column = RowOrColumnBuilder false + let popout = PopoutWindowBuilder() + let layout = WindowLayoutBuilder() \ No newline at end of file diff --git a/src/Aardvark.UI.Primitives/Golden/GoldenLayoutJson.fs b/src/Aardvark.UI.Primitives/Golden/GoldenLayoutJson.fs new file mode 100644 index 00000000..83675546 --- /dev/null +++ b/src/Aardvark.UI.Primitives/Golden/GoldenLayoutJson.fs @@ -0,0 +1,304 @@ +namespace Aardvark.UI.Primitives.Golden + +open Newtonsoft.Json +open Newtonsoft.Json.Linq +open Aardvark.Base + +[] +module GoldenLayoutJson = + + module GoldenLayout = + + module Json = + + [] + module private Extensions = + + let inline private (|JValue|_|) (v : JValue) = + if v.Value.GetType() = typeof<'T> then Some <| unbox<'T> v.Value + else None + + let private (|JFloat|_|) : JValue -> float option = (|JValue|_|) + let private (|JFloat32|_|) : JValue -> float32 option = (|JValue|_|) + let private (|JInt32|_|) : JValue -> int32 option = (|JValue|_|) + let private (|JUInt32|_|) : JValue -> uint32 option = (|JValue|_|) + let private (|JInt64|_|) : JValue -> int64 option = (|JValue|_|) + let private (|JUInt64|_|) : JValue -> uint64 option = (|JValue|_|) + + type JObject with + member inline x.TryGetProperty<'T when 'T :> JToken>(key : string) = + match x.TryGetValue key with + | (true, (:? 'T as value)) -> ValueSome value + | _ -> ValueNone + + member inline x.TryValue<'T>(key : string) : 'T voption = + match x.TryGetProperty key with + | ValueSome (JValue value) -> ValueSome value + | _ -> ValueNone + + member inline x.TryGetNumber(key : string) = + match x.TryGetProperty key with + | ValueSome (JFloat value) -> ValueSome value + | ValueSome (JFloat32 value) -> ValueSome (float value) + | ValueSome (JInt32 value) -> ValueSome (float value) + | ValueSome (JInt64 value) -> ValueSome (float value) + | ValueSome (JUInt32 value) -> ValueSome (float value) + | ValueSome (JUInt64 value) -> ValueSome (float value) + | _ -> ValueNone + + module private Header = + + let serialize (config : LayoutConfig) (buttons : Buttons option) (header : Header option) = + let o = JObject() + + let show = + match header with + | Some Header.Top -> JToken.op_Implicit "top" + | Some Header.Left -> JToken.op_Implicit "left" + | Some Header.Right -> JToken.op_Implicit "right" + | Some Header.Bottom -> JToken.op_Implicit "bottom" + | _ -> JToken.op_Implicit false + + let buttons = buttons |> Option.defaultValue config.HeaderButtons + + let button (property : string) (flag : Buttons) = + if not <| buttons.HasFlag flag then + o.[property] <- JToken.op_Implicit false + + o.["show"] <- show + button "close" Buttons.Close + button "popout" Buttons.Popout + button "maximise" Buttons.Maximize + o + + let deserialize (o : JObject) : Header option * Buttons = + let header = + match o.TryValue "show" with + | ValueSome "top" -> Some Header.Top + | ValueSome "left" -> Some Header.Left + | ValueSome "right" -> Some Header.Right + | ValueSome "bottom" -> Some Header.Bottom + | _ -> None + + let mutable buttons = Buttons.All + + let check (name : string) (value : Buttons) = + match o.TryValue name with + | ValueSome false -> buttons <- buttons &&& ~~~value + | _ -> () + + check "close" Buttons.Close + check "popout" Buttons.Popout + check "maximise" Buttons.Maximize + + header, buttons + + module private Size = + + let deserialize (o : JObject) : Size = + let ctor = + match o.TryValue "sizeUnit" with + | ValueSome "%" -> ValueSome Size.Percentage + | ValueSome "fr" -> ValueSome Size.Weight + | _ -> ValueNone + + ctor |> ValueOption.bind (fun ctor -> + match o.TryGetNumber "size" with + | ValueSome size -> ValueSome <| ctor (int size) + | _ -> ValueNone + ) + |> ValueOption.defaultValue (Size.Weight 1) + + module private Layout = + + let rec serialize (config : LayoutConfig) (layout : Layout) : JObject = + let o = JObject() + + match layout with + | Layout.Element e -> + o.["type"] <- JToken.op_Implicit "component" + o.["title"] <- JToken.op_Implicit e.Title + o.["componentType"] <- JToken.op_Implicit e.Id + o.["isClosable"] <- JToken.op_Implicit e.Closable + o.["header"] <- Header.serialize config e.Buttons e.Header + o.["size"] <- JToken.op_Implicit (string e.Size) + + match e.MinSize with + | Some s -> o.["minSize"] <- JToken.op_Implicit $"%d{s}px" + | _ -> () + + let s = JObject() + s.["keepAlive"] <- JToken.op_Implicit e.KeepAlive + o.["componentState"] <- s + + | Layout.Stack s -> + let content = s.Content |> List.map (Layout.Element >> serialize config >> box) + o.["type"] <- JToken.op_Implicit "stack" + o.["header"] <- Header.serialize config s.Buttons (Some s.Header) + o.["size"] <- JToken.op_Implicit (string s.Size) + o.["content"] <- JArray(List.toArray content) + + | Layout.RowOrColumn rc -> + let content = rc.Content |> List.map (serialize config >> box) + o.["type"] <- JToken.op_Implicit (if rc.IsRow then "row" else "column") + o.["size"] <- JToken.op_Implicit (string rc.Size) + o.["content"] <- JArray(List.toArray content) + + o + + let rec deserialize (o : JObject) : Layout = + match o.TryValue "type" with + | ValueSome "component" -> + let header = + o.TryGetProperty "header" + |> ValueOption.map Header.deserialize + |> ValueOption.toOption + + let keepAlive = + o.TryGetProperty "componentState" + |> ValueOption.bind (fun s -> s.TryValue "keepAlive") + |> ValueOption.defaultValue true + + Layout.Element { + Id = o.Value "componentType" + Title = o.Value "title" + Closable = o.TryValue "isClosable" |> ValueOption.defaultValue true + Header = header |> Option.bind fst + Buttons = header |> Option.map snd + MinSize = o.TryGetNumber "minSize" |> ValueOption.map int |> ValueOption.toOption + Size = Size.deserialize o + KeepAlive = keepAlive + } + + | ValueSome "stack" -> + let header = + o.TryGetProperty "header" + |> ValueOption.map Header.deserialize + |> ValueOption.toOption + + let content = + o.TryGetProperty "content" + |> ValueOption.map (List.ofSeq >> List.map (unbox >> deserialize >> function + | Layout.Element e -> e + | l -> failwithf "[Golden] Expected element but got %A" l + )) + |> ValueOption.defaultValue [] + + Layout.Stack { + Header = header |> Option.bind fst |> Option.defaultValue Header.Top + Buttons = header |> Option.map snd + Size = Size.deserialize o + Content = content + } + + | ValueSome rowOrColumn when rowOrColumn = "row" || rowOrColumn = "column" -> + let content = + o.TryGetProperty "content" + |> ValueOption.map (List.ofSeq >> List.map (unbox >> deserialize)) + |> ValueOption.defaultValue [] + + Layout.RowOrColumn { + IsRow = rowOrColumn = "row" + Size = Size.deserialize o + Content = content + } + + | _ -> + failwithf "[Golden] Cannot determine type of %A" o + + module private PopoutWindow = + + let serialize (config : LayoutConfig) (popout : PopoutWindow) = + let window = JObject() + + popout.Position |> Option.iter (fun p -> + window.["left"] <- JToken.op_Implicit p.X + window.["top"] <- JToken.op_Implicit p.Y + ) + + popout.Size |> Option.iter (fun s -> + window.["width"] <- JToken.op_Implicit s.X + window.["height"] <- JToken.op_Implicit s.Y + ) + + let o = JObject() + o.["root"] <- Layout.serialize config popout.Root + o.["window"] <- window + o + + let tryDeserialize (o : JObject) : PopoutWindow option = + match o.TryGetProperty "root" with + | ValueSome root -> + let getV2i = + match o.TryGetProperty "window" with + | ValueSome w -> + fun x y -> + match w.TryGetNumber x, w.TryGetNumber y with + | ValueSome x, ValueSome y -> Some <| V2i(x, y) + | _ -> None + + | _ -> fun _ _ -> None + + Some { + Root = Layout.deserialize root + Position = getV2i "left" "top" + Size = getV2i "width" "height" + } + + | _ -> None + + let serialize (config : LayoutConfig) (layout : WindowLayout) = + let labels = JObject() + labels.["close"] <- JToken.op_Implicit config.LabelClose + labels.["maximise"] <- JToken.op_Implicit config.LabelMaximize + labels.["minimise"] <- JToken.op_Implicit config.LabelMinimize + labels.["popout"] <- JToken.op_Implicit config.LabelPopOut + labels.["popin"] <- JToken.op_Implicit config.LabelPopIn + labels.["tabDropdown"] <- JToken.op_Implicit config.LabelTabDropdown + + let settings = JObject() + settings.["popInOnClose"] <- JToken.op_Implicit config.PopInOnClose + settings.["popoutWholeStack"] <- JToken.op_Implicit config.PopOutWholeStack + settings.["dragBetweenWindows"] <- JToken.op_Implicit config.DragBetweenWindows + settings.["dragToNewWindow"] <- JToken.op_Implicit config.DragToNewWindow + settings.["setPopoutTitle"] <- JToken.op_Implicit config.SetPopoutTitle + + let dimensions = JObject() + dimensions.["defaultMinItemWidth"] <- JToken.op_Implicit $"{config.MinItemWidth}px" + dimensions.["defaultMinItemHeight"] <- JToken.op_Implicit $"{config.MinItemHeight}px" + dimensions.["dragProxyWidth"] <- JToken.op_Implicit config.DragProxyWidth + dimensions.["dragProxyHeight"] <- JToken.op_Implicit config.DragProxyHeight + + let popouts = + layout.PopoutWindows + |> List.map (PopoutWindow.serialize config) + |> Array.ofList + |> JArray + + let result = JObject() + + layout.Root |> Option.iter (fun root -> + result.["root"] <- Layout.serialize config root + ) + + result.["settings"] <- settings + result.["dimensions"] <- dimensions + result.["header"] <- labels + result.["openPopouts"] <- popouts + result.ToString Formatting.None + + let deserialize (json : string) : WindowLayout = + let o = JObject.Parse json + + let root = + o.TryGetProperty "root" + |> ValueOption.map Layout.deserialize + |> ValueOption.toOption + + let popouts = + o.TryGetProperty "openPopouts" + |> ValueOption.map (List.ofSeq >> List.choose (unbox >> PopoutWindow.tryDeserialize)) + |> ValueOption.defaultValue [] + + { Root = root + PopoutWindows = popouts } \ No newline at end of file diff --git a/src/Aardvark.UI.Primitives/Golden/GoldenLayoutModel.fs b/src/Aardvark.UI.Primitives/Golden/GoldenLayoutModel.fs index 1dfa4d71..0e608292 100644 --- a/src/Aardvark.UI.Primitives/Golden/GoldenLayoutModel.fs +++ b/src/Aardvark.UI.Primitives/Golden/GoldenLayoutModel.fs @@ -2,6 +2,7 @@ open Adaptify open System +open Aardvark.Base [] type Size = @@ -87,6 +88,27 @@ and [] Layout = | Stack of Stack | RowOrColumn of RowOrColumn +type PopoutWindow = + { + // Layout of the window contents. + Root : Layout + + // Position on the screen. + Position : V2i option + + // Size in pixels. + Size : V2i option + } + +type WindowLayout = + { + // Layout of the main window. + Root : Layout option + + // List of popout windows. + PopoutWindows : PopoutWindow list + } + type Theme = | Theme of resourcePath: string member inline x.Path = let (Theme p) = x in p @@ -152,13 +174,13 @@ type LayoutConfig = type GoldenLayout = { [] - DefaultLayout : Layout + DefaultLayout : WindowLayout [] Config : LayoutConfig [] - SetLayout : Option + SetLayout : Option [] SaveLayout : Option @@ -178,6 +200,9 @@ module GoldenLayout = /// Sets the given layout. | SetLayout of layout: Layout + /// Sets the given window layout. + | SetWindowLayout of layout: WindowLayout + /// Saves the current layout in local storage with the given key. | SaveLayout of key: string diff --git a/src/Aardvark.UI.Primitives/resources/golden-layout/bundle/umd/golden-layout.js b/src/Aardvark.UI.Primitives/resources/golden-layout/bundle/umd/golden-layout.js index bdc45d1f..8856d7d9 100644 --- a/src/Aardvark.UI.Primitives/resources/golden-layout/bundle/umd/golden-layout.js +++ b/src/Aardvark.UI.Primitives/resources/golden-layout/bundle/umd/golden-layout.js @@ -1890,6 +1890,7 @@ class BrowserPopout extends _utils_event_emitter__WEBPACK_IMPORTED_MODULE_0__.Ev this._preventPopInOnClose = false; this.createWindow(); } + get isInitialised() { return this._isInitialised; } toConfig() { var _a, _b; if (this._isInitialised === false) { @@ -1964,11 +1965,8 @@ class BrowserPopout extends _utils_event_emitter__WEBPACK_IMPORTED_MODULE_0__.Ev * parent isn't available anymore it falls back to the layout's topmost element */ popIn() { - let parentItem; + let parentItem = null; let index = this._config.indexInParent; - if (!this._config.parentId) { - return; - } /* * The deepExtend call seems a bit pointless, but it's crucial to * copy the config returned by this.getGlInstance().toConfig() @@ -1988,7 +1986,9 @@ class BrowserPopout extends _utils_event_emitter__WEBPACK_IMPORTED_MODULE_0__.Ev if (groundItem === undefined) { throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_1__.UnexpectedUndefinedError('BPPIG34972'); } - parentItem = groundItem.getItemsByPopInParentId(this._config.parentId)[0]; + if (this._config.parentId) { + parentItem = groundItem.getItemsByPopInParentId(this._config.parentId)[0]; + } /* * Fallback if parentItem is not available. Either add it to the topmost * item or make it the topmost item if the layout is empty @@ -5357,11 +5357,11 @@ __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ RowOrColumn: () => (/* binding */ RowOrColumn) /* harmony export */ }); -/* harmony import */ var _config_config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../config/config */ "./src/ts/config/config.ts"); +/* harmony import */ var _config_config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../config/config */ "./src/ts/config/config.ts"); /* harmony import */ var _controls_splitter__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../controls/splitter */ "./src/ts/controls/splitter.ts"); -/* harmony import */ var _errors_internal_error__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../errors/internal-error */ "./src/ts/errors/internal-error.ts"); -/* harmony import */ var _utils_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/types */ "./src/ts/utils/types.ts"); -/* harmony import */ var _utils_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/utils */ "./src/ts/utils/utils.ts"); +/* harmony import */ var _errors_internal_error__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../errors/internal-error */ "./src/ts/errors/internal-error.ts"); +/* harmony import */ var _utils_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/types */ "./src/ts/utils/types.ts"); +/* harmony import */ var _utils_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/utils */ "./src/ts/utils/utils.ts"); /* harmony import */ var _content_item__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./content-item */ "./src/ts/items/content-item.ts"); @@ -5379,6 +5379,8 @@ class RowOrColumn extends _content_item__WEBPACK_IMPORTED_MODULE_0__.ContentItem this._rowOrColumnParent = _rowOrColumnParent; /** @internal */ this._splitter = []; + /** @internal */ + this._debouncedEmitStateChangedEvent = (0,_utils_utils__WEBPACK_IMPORTED_MODULE_1__.debounce)(() => this.emitBaseBubblingEvent('stateChanged')); this.isRow = !isColumn; this.isColumn = isColumn; this._childElementContainer = this.element; @@ -5390,12 +5392,12 @@ class RowOrColumn extends _content_item__WEBPACK_IMPORTED_MODULE_0__.ContentItem this._splitterMinPosition = null; this._splitterMaxPosition = null; switch (config.type) { - case _utils_types__WEBPACK_IMPORTED_MODULE_1__.ItemType.row: - case _utils_types__WEBPACK_IMPORTED_MODULE_1__.ItemType.column: + case _utils_types__WEBPACK_IMPORTED_MODULE_2__.ItemType.row: + case _utils_types__WEBPACK_IMPORTED_MODULE_2__.ItemType.column: this._configType = config.type; break; default: - throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_2__.AssertError('ROCCCT00925'); + throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_3__.AssertError('ROCCCT00925'); } } newComponent(componentType, componentState, title, index) { @@ -5419,7 +5421,7 @@ class RowOrColumn extends _content_item__WEBPACK_IMPORTED_MODULE_0__.ContentItem newItem(itemConfig, index) { index = this.addItem(itemConfig, index); const createdItem = this.contentItems[index]; - if (_content_item__WEBPACK_IMPORTED_MODULE_0__.ContentItem.isStack(createdItem) && (_config_config__WEBPACK_IMPORTED_MODULE_3__.ItemConfig.isComponent(itemConfig))) { + if (_content_item__WEBPACK_IMPORTED_MODULE_0__.ContentItem.isStack(createdItem) && (_config_config__WEBPACK_IMPORTED_MODULE_4__.ItemConfig.isComponent(itemConfig))) { // createdItem is a Stack which was created to hold wanted component. Return component return createdItem.contentItems[0]; } @@ -5429,7 +5431,7 @@ class RowOrColumn extends _content_item__WEBPACK_IMPORTED_MODULE_0__.ContentItem } addItem(itemConfig, index) { this.layoutManager.checkMinimiseMaximisedStack(); - const resolvedItemConfig = _config_config__WEBPACK_IMPORTED_MODULE_3__.ItemConfig.resolve(itemConfig, false); + const resolvedItemConfig = _config_config__WEBPACK_IMPORTED_MODULE_4__.ItemConfig.resolve(itemConfig, false); const contentItem = this.layoutManager.createAndInitContentItem(resolvedItemConfig, this); return this.addChild(contentItem, index, false); } @@ -5467,7 +5469,7 @@ class RowOrColumn extends _content_item__WEBPACK_IMPORTED_MODULE_0__.ContentItem super.addChild(contentItem, index); const newItemSize = (1 / this.contentItems.length) * 100; if (suspendResize === true) { - this.emitBaseBubblingEvent('stateChanged'); + this.emitStateChangedEvent(); return index; } for (let i = 0; i < this.contentItems.length; i++) { @@ -5481,7 +5483,7 @@ class RowOrColumn extends _content_item__WEBPACK_IMPORTED_MODULE_0__.ContentItem } } this.updateSize(false); - this.emitBaseBubblingEvent('stateChanged'); + this.emitStateChangedEvent(); return index; } /** @@ -5512,7 +5514,7 @@ class RowOrColumn extends _content_item__WEBPACK_IMPORTED_MODULE_0__.ContentItem // this._rowOrColumnParent.replaceChild(this, childItem, true); // } else { this.updateSize(false); - this.emitBaseBubblingEvent('stateChanged'); + this.emitStateChangedEvent(); // } } /** @@ -5523,7 +5525,7 @@ class RowOrColumn extends _content_item__WEBPACK_IMPORTED_MODULE_0__.ContentItem super.replaceChild(oldChild, newChild); newChild.size = size; this.updateSize(false); - this.emitBaseBubblingEvent('stateChanged'); + this.emitStateChangedEvent(); } /** * Called whenever the dimensions of this item or one of its parents change @@ -5581,7 +5583,7 @@ class RowOrColumn extends _content_item__WEBPACK_IMPORTED_MODULE_0__.ContentItem this.calculateRelativeSizes(); this.setAbsoluteSizes(); } - this.emitBaseBubblingEvent('stateChanged'); + this.emitStateChangedEvent(true); this.emit('resize'); } /** @@ -5598,12 +5600,12 @@ class RowOrColumn extends _content_item__WEBPACK_IMPORTED_MODULE_0__.ContentItem absoluteSizes.itemSizes[i]++; } if (this._isColumn) { - (0,_utils_utils__WEBPACK_IMPORTED_MODULE_4__.setElementWidth)(this.contentItems[i].element, absoluteSizes.crossAxisSize); - (0,_utils_utils__WEBPACK_IMPORTED_MODULE_4__.setElementHeight)(this.contentItems[i].element, absoluteSizes.itemSizes[i]); + (0,_utils_utils__WEBPACK_IMPORTED_MODULE_1__.setElementWidth)(this.contentItems[i].element, absoluteSizes.crossAxisSize); + (0,_utils_utils__WEBPACK_IMPORTED_MODULE_1__.setElementHeight)(this.contentItems[i].element, absoluteSizes.itemSizes[i]); } else { - (0,_utils_utils__WEBPACK_IMPORTED_MODULE_4__.setElementWidth)(this.contentItems[i].element, absoluteSizes.itemSizes[i]); - (0,_utils_utils__WEBPACK_IMPORTED_MODULE_4__.setElementHeight)(this.contentItems[i].element, absoluteSizes.crossAxisSize); + (0,_utils_utils__WEBPACK_IMPORTED_MODULE_1__.setElementWidth)(this.contentItems[i].element, absoluteSizes.itemSizes[i]); + (0,_utils_utils__WEBPACK_IMPORTED_MODULE_1__.setElementHeight)(this.contentItems[i].element, absoluteSizes.crossAxisSize); } } } @@ -5614,7 +5616,7 @@ class RowOrColumn extends _content_item__WEBPACK_IMPORTED_MODULE_0__.ContentItem */ calculateAbsoluteSizes() { const totalSplitterSize = (this.contentItems.length - 1) * this._splitterSize; - const { width: elementWidth, height: elementHeight } = (0,_utils_utils__WEBPACK_IMPORTED_MODULE_4__.getElementWidthAndHeight)(this.element); + const { width: elementWidth, height: elementHeight } = (0,_utils_utils__WEBPACK_IMPORTED_MODULE_1__.getElementWidthAndHeight)(this.element); let totalSize; let crossAxisSize; if (this._isColumn) { @@ -5630,11 +5632,11 @@ class RowOrColumn extends _content_item__WEBPACK_IMPORTED_MODULE_0__.ContentItem for (let i = 0; i < this.contentItems.length; i++) { const contentItem = this.contentItems[i]; let itemSize; - if (contentItem.sizeUnit === _utils_types__WEBPACK_IMPORTED_MODULE_1__.SizeUnitEnum.Percent) { + if (contentItem.sizeUnit === _utils_types__WEBPACK_IMPORTED_MODULE_2__.SizeUnitEnum.Percent) { itemSize = Math.floor(totalSize * (contentItem.size / 100)); } else { - throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_2__.AssertError('ROCCAS6692'); + throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_3__.AssertError('ROCCAS6692'); } totalAssigned += itemSize; itemSizes.push(itemSize); @@ -5675,17 +5677,17 @@ class RowOrColumn extends _content_item__WEBPACK_IMPORTED_MODULE_0__.ContentItem const contentItem = this.contentItems[i]; const sizeUnit = contentItem.sizeUnit; switch (sizeUnit) { - case _utils_types__WEBPACK_IMPORTED_MODULE_1__.SizeUnitEnum.Percent: { + case _utils_types__WEBPACK_IMPORTED_MODULE_2__.SizeUnitEnum.Percent: { total += contentItem.size; break; } - case _utils_types__WEBPACK_IMPORTED_MODULE_1__.SizeUnitEnum.Fractional: { + case _utils_types__WEBPACK_IMPORTED_MODULE_2__.SizeUnitEnum.Fractional: { itemsWithFractionalSize.push(contentItem); totalFractionalSize += contentItem.size; break; } default: - throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_2__.AssertError('ROCCRS49110', JSON.stringify(contentItem)); + throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_3__.AssertError('ROCCRS49110', JSON.stringify(contentItem)); } } /** @@ -5704,7 +5706,7 @@ class RowOrColumn extends _content_item__WEBPACK_IMPORTED_MODULE_0__.ContentItem for (let i = 0; i < itemsWithFractionalSize.length; i++) { const contentItem = itemsWithFractionalSize[i]; contentItem.size = fractionalAllocatedSize * (contentItem.size / totalFractionalSize); - contentItem.sizeUnit = _utils_types__WEBPACK_IMPORTED_MODULE_1__.SizeUnitEnum.Percent; + contentItem.sizeUnit = _utils_types__WEBPACK_IMPORTED_MODULE_2__.SizeUnitEnum.Percent; } this.respectMinItemSize(); return; @@ -5720,7 +5722,7 @@ class RowOrColumn extends _content_item__WEBPACK_IMPORTED_MODULE_0__.ContentItem for (let i = 0; i < itemsWithFractionalSize.length; i++) { const contentItem = itemsWithFractionalSize[i]; contentItem.size = 50 * (contentItem.size / totalFractionalSize); - contentItem.sizeUnit = _utils_types__WEBPACK_IMPORTED_MODULE_1__.SizeUnitEnum.Percent; + contentItem.sizeUnit = _utils_types__WEBPACK_IMPORTED_MODULE_2__.SizeUnitEnum.Percent; } total += 50; } @@ -5843,11 +5845,11 @@ class RowOrColumn extends _content_item__WEBPACK_IMPORTED_MODULE_0__.ContentItem calculateContentItemMinSize(contentItem) { const minSize = contentItem.minSize; if (minSize !== undefined) { - if (contentItem.minSizeUnit === _utils_types__WEBPACK_IMPORTED_MODULE_1__.SizeUnitEnum.Pixel) { + if (contentItem.minSizeUnit === _utils_types__WEBPACK_IMPORTED_MODULE_2__.SizeUnitEnum.Pixel) { return minSize; } else { - throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_2__.AssertError('ROCGMD98831', JSON.stringify(contentItem)); + throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_3__.AssertError('ROCGMD98831', JSON.stringify(contentItem)); } } else { @@ -5880,8 +5882,8 @@ class RowOrColumn extends _content_item__WEBPACK_IMPORTED_MODULE_0__.ContentItem */ onSplitterDragStart(splitter) { const items = this.getSplitItems(splitter); - const beforeWidth = (0,_utils_utils__WEBPACK_IMPORTED_MODULE_4__.pixelsToNumber)(items.before.element.style[this._dimension]); - const afterSize = (0,_utils_utils__WEBPACK_IMPORTED_MODULE_4__.pixelsToNumber)(items.after.element.style[this._dimension]); + const beforeWidth = (0,_utils_utils__WEBPACK_IMPORTED_MODULE_1__.pixelsToNumber)(items.before.element.style[this._dimension]); + const afterSize = (0,_utils_utils__WEBPACK_IMPORTED_MODULE_1__.pixelsToNumber)(items.after.element.style[this._dimension]); const beforeMinSize = this.calculateContentItemsTotalMinSize(items.before); const afterMinSize = this.calculateContentItemsTotalMinSize(items.after); this._splitterPosition = 0; @@ -5900,12 +5902,12 @@ class RowOrColumn extends _content_item__WEBPACK_IMPORTED_MODULE_0__.ContentItem onSplitterDrag(splitter, offsetX, offsetY) { let offset = this._isColumn ? offsetY : offsetX; if (this._splitterMinPosition === null || this._splitterMaxPosition === null) { - throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_2__.UnexpectedNullError('ROCOSD59226'); + throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_3__.UnexpectedNullError('ROCOSD59226'); } offset = Math.max(offset, this._splitterMinPosition); offset = Math.min(offset, this._splitterMaxPosition); this._splitterPosition = offset; - const offsetPixels = (0,_utils_utils__WEBPACK_IMPORTED_MODULE_4__.numberToPixels)(offset); + const offsetPixels = (0,_utils_utils__WEBPACK_IMPORTED_MODULE_1__.numberToPixels)(offset); if (this._isColumn) { splitter.element.style.top = offsetPixels; } @@ -5921,41 +5923,50 @@ class RowOrColumn extends _content_item__WEBPACK_IMPORTED_MODULE_0__.ContentItem */ onSplitterDragStop(splitter) { if (this._splitterPosition === null) { - throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_2__.UnexpectedNullError('ROCOSDS66932'); + throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_3__.UnexpectedNullError('ROCOSDS66932'); } else { const items = this.getSplitItems(splitter); - const sizeBefore = (0,_utils_utils__WEBPACK_IMPORTED_MODULE_4__.pixelsToNumber)(items.before.element.style[this._dimension]); - const sizeAfter = (0,_utils_utils__WEBPACK_IMPORTED_MODULE_4__.pixelsToNumber)(items.after.element.style[this._dimension]); + const sizeBefore = (0,_utils_utils__WEBPACK_IMPORTED_MODULE_1__.pixelsToNumber)(items.before.element.style[this._dimension]); + const sizeAfter = (0,_utils_utils__WEBPACK_IMPORTED_MODULE_1__.pixelsToNumber)(items.after.element.style[this._dimension]); const splitterPositionInRange = (this._splitterPosition + sizeBefore) / (sizeBefore + sizeAfter); const totalRelativeSize = items.before.size + items.after.size; items.before.size = splitterPositionInRange * totalRelativeSize; items.after.size = (1 - splitterPositionInRange) * totalRelativeSize; - splitter.element.style.top = (0,_utils_utils__WEBPACK_IMPORTED_MODULE_4__.numberToPixels)(0); - splitter.element.style.left = (0,_utils_utils__WEBPACK_IMPORTED_MODULE_4__.numberToPixels)(0); + splitter.element.style.top = (0,_utils_utils__WEBPACK_IMPORTED_MODULE_1__.numberToPixels)(0); + splitter.element.style.left = (0,_utils_utils__WEBPACK_IMPORTED_MODULE_1__.numberToPixels)(0); globalThis.requestAnimationFrame(() => this.updateSize(false)); } } + /** @internal */ + emitStateChangedEvent(debounce = false) { + if (debounce) { + this._debouncedEmitStateChangedEvent(); + } + else { + this.emitBaseBubblingEvent('stateChanged'); + } + } } /** @public */ (function (RowOrColumn) { /** @internal */ function getElementDimensionSize(element, dimension) { if (dimension === 'width') { - return (0,_utils_utils__WEBPACK_IMPORTED_MODULE_4__.getElementWidth)(element); + return (0,_utils_utils__WEBPACK_IMPORTED_MODULE_1__.getElementWidth)(element); } else { - return (0,_utils_utils__WEBPACK_IMPORTED_MODULE_4__.getElementHeight)(element); + return (0,_utils_utils__WEBPACK_IMPORTED_MODULE_1__.getElementHeight)(element); } } RowOrColumn.getElementDimensionSize = getElementDimensionSize; /** @internal */ function setElementDimensionSize(element, dimension, value) { if (dimension === 'width') { - return (0,_utils_utils__WEBPACK_IMPORTED_MODULE_4__.setElementWidth)(element, value); + return (0,_utils_utils__WEBPACK_IMPORTED_MODULE_1__.setElementWidth)(element, value); } else { - return (0,_utils_utils__WEBPACK_IMPORTED_MODULE_4__.setElementHeight)(element, value); + return (0,_utils_utils__WEBPACK_IMPORTED_MODULE_1__.setElementHeight)(element, value); } } RowOrColumn.setElementDimensionSize = setElementDimensionSize; @@ -5987,16 +5998,16 @@ __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ Stack: () => (/* binding */ Stack) /* harmony export */ }); -/* harmony import */ var _config_config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../config/config */ "./src/ts/config/config.ts"); -/* harmony import */ var _config_resolved_config__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../config/resolved-config */ "./src/ts/config/resolved-config.ts"); -/* harmony import */ var _controls_header__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../controls/header */ "./src/ts/controls/header.ts"); -/* harmony import */ var _errors_internal_error__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../errors/internal-error */ "./src/ts/errors/internal-error.ts"); +/* harmony import */ var _config_config__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../config/config */ "./src/ts/config/config.ts"); +/* harmony import */ var _config_resolved_config__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../config/resolved-config */ "./src/ts/config/resolved-config.ts"); +/* harmony import */ var _controls_header__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../controls/header */ "./src/ts/controls/header.ts"); +/* harmony import */ var _errors_internal_error__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../errors/internal-error */ "./src/ts/errors/internal-error.ts"); /* harmony import */ var _utils_event_emitter__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/event-emitter */ "./src/ts/utils/event-emitter.ts"); -/* harmony import */ var _utils_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/types */ "./src/ts/utils/types.ts"); -/* harmony import */ var _utils_utils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../utils/utils */ "./src/ts/utils/utils.ts"); -/* harmony import */ var _component_item__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./component-item */ "./src/ts/items/component-item.ts"); +/* harmony import */ var _utils_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/types */ "./src/ts/utils/types.ts"); +/* harmony import */ var _utils_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/utils */ "./src/ts/utils/utils.ts"); +/* harmony import */ var _component_item__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./component-item */ "./src/ts/items/component-item.ts"); /* harmony import */ var _component_parentable_item__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./component-parentable-item */ "./src/ts/items/component-parentable-item.ts"); -/* harmony import */ var _content_item__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./content-item */ "./src/ts/items/content-item.ts"); +/* harmony import */ var _content_item__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./content-item */ "./src/ts/items/content-item.ts"); @@ -6021,6 +6032,8 @@ class Stack extends _component_parentable_item__WEBPACK_IMPORTED_MODULE_0__.Comp this._maximisedListener = () => this.handleMaximised(); /** @internal */ this._minimisedListener = () => this.handleMinimised(); + /** @internal */ + this._debouncedEmitStateChangedEvent = (0,_utils_utils__WEBPACK_IMPORTED_MODULE_1__.debounce)(() => this.emitBaseBubblingEvent('stateChanged')); this._headerConfig = config.header; const layoutHeaderConfig = layoutManager.layoutConfig.header; const configContent = config.content; @@ -6045,7 +6058,7 @@ class Stack extends _component_parentable_item__WEBPACK_IMPORTED_MODULE_0__.Comp this._maximisedEnabled = maximise !== false; const headerSettings = { show: show !== false, - side: show === false ? _utils_types__WEBPACK_IMPORTED_MODULE_1__.Side.top : show, + side: show === false ? _utils_types__WEBPACK_IMPORTED_MODULE_2__.Side.top : show, popoutEnabled: popout !== false, popoutLabel: popout === false ? '' : popout, maximiseEnabled: this._maximisedEnabled, @@ -6057,7 +6070,7 @@ class Stack extends _component_parentable_item__WEBPACK_IMPORTED_MODULE_0__.Comp tabDropdownEnabled: tabDropdown !== false, tabDropdownLabel: tabDropdown === false ? '' : tabDropdown, }; - this._header = new _controls_header__WEBPACK_IMPORTED_MODULE_2__.Header(layoutManager, this, headerSettings, () => this.getActiveComponentItem(), () => this.remove(), () => this.handlePopoutEvent(), () => this.toggleMaximise(), (ev) => this.handleHeaderClickEvent(ev), (ev) => this.handleHeaderTouchStartEvent(ev), (item) => this.handleHeaderComponentRemoveEvent(item), (item) => this.handleHeaderComponentFocusEvent(item), (x, y, dragListener, item) => this.handleHeaderComponentStartDragEvent(x, y, dragListener, item)); + this._header = new _controls_header__WEBPACK_IMPORTED_MODULE_3__.Header(layoutManager, this, headerSettings, () => this.getActiveComponentItem(), () => this.remove(), () => this.handlePopoutEvent(), () => this.toggleMaximise(), (ev) => this.handleHeaderClickEvent(ev), (ev) => this.handleHeaderTouchStartEvent(ev), (item) => this.handleHeaderComponentRemoveEvent(item), (item) => this.handleHeaderComponentFocusEvent(item), (x, y, dragListener, item) => this.handleHeaderComponentStartDragEvent(x, y, dragListener, item)); // this._dropZones = {}; this.isStack = true; this._childElementContainer = document.createElement('section'); @@ -6116,7 +6129,7 @@ class Stack extends _component_parentable_item__WEBPACK_IMPORTED_MODULE_0__.Comp else { for (let i = 0; i < contentItemCount; i++) { const contentItem = contentItems[i]; - if (!(contentItem instanceof _component_item__WEBPACK_IMPORTED_MODULE_3__.ComponentItem)) { + if (!(contentItem instanceof _component_item__WEBPACK_IMPORTED_MODULE_4__.ComponentItem)) { throw new Error(`Stack Content Item is not of type ComponentItem: ${i} id: ${this.id}`); } else { @@ -6133,7 +6146,7 @@ class Stack extends _component_parentable_item__WEBPACK_IMPORTED_MODULE_0__.Comp } /** @deprecated Use {@link (Stack:class).setActiveComponentItem} */ setActiveContentItem(item) { - if (!_content_item__WEBPACK_IMPORTED_MODULE_4__.ContentItem.isComponentItem(item)) { + if (!_content_item__WEBPACK_IMPORTED_MODULE_5__.ContentItem.isComponentItem(item)) { throw new Error('Stack.setActiveContentItem: item is not a ComponentItem'); } else { @@ -6209,17 +6222,17 @@ class Stack extends _component_parentable_item__WEBPACK_IMPORTED_MODULE_0__.Comp } addItem(itemConfig, index) { this.layoutManager.checkMinimiseMaximisedStack(); - const resolvedItemConfig = _config_config__WEBPACK_IMPORTED_MODULE_5__.ItemConfig.resolve(itemConfig, false); + const resolvedItemConfig = _config_config__WEBPACK_IMPORTED_MODULE_6__.ItemConfig.resolve(itemConfig, false); const contentItem = this.layoutManager.createAndInitContentItem(resolvedItemConfig, this); return this.addChild(contentItem, index); } addChild(contentItem, index, focus = false) { if (index !== undefined && index > this.contentItems.length) { index -= 1; - throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_6__.AssertError('SAC99728'); // undisplayChild() removed so this condition should no longer occur + throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_7__.AssertError('SAC99728'); // undisplayChild() removed so this condition should no longer occur } - if (!(contentItem instanceof _component_item__WEBPACK_IMPORTED_MODULE_3__.ComponentItem)) { - throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_6__.AssertError('SACC88532'); // Stacks can only have Component children + if (!(contentItem instanceof _component_item__WEBPACK_IMPORTED_MODULE_4__.ComponentItem)) { + throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_7__.AssertError('SACC88532'); // Stacks can only have Component children } else { index = super.addChild(contentItem, index); @@ -6271,11 +6284,11 @@ class Stack extends _component_parentable_item__WEBPACK_IMPORTED_MODULE_0__.Comp const contentItemCount = contentItems.length; for (let i = 0; i < contentItemCount; i++) { const contentItem = contentItems[i]; - if (contentItem instanceof _component_item__WEBPACK_IMPORTED_MODULE_3__.ComponentItem) { + if (contentItem instanceof _component_item__WEBPACK_IMPORTED_MODULE_4__.ComponentItem) { contentItem.enterStackMaximised(); } else { - throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_6__.AssertError('SMAXI87773'); + throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_7__.AssertError('SMAXI87773'); } } this.emitStateChangedEvent(); @@ -6288,11 +6301,11 @@ class Stack extends _component_parentable_item__WEBPACK_IMPORTED_MODULE_0__.Comp const contentItemCount = contentItems.length; for (let i = 0; i < contentItemCount; i++) { const contentItem = contentItems[i]; - if (contentItem instanceof _component_item__WEBPACK_IMPORTED_MODULE_3__.ComponentItem) { + if (contentItem instanceof _component_item__WEBPACK_IMPORTED_MODULE_4__.ComponentItem) { contentItem.exitStackMaximised(); } else { - throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_6__.AssertError('SMINI87773'); + throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_7__.AssertError('SMINI87773'); } } this.emitStateChangedEvent(); @@ -6368,7 +6381,7 @@ class Stack extends _component_parentable_item__WEBPACK_IMPORTED_MODULE_0__.Comp if (this._dropSegment === "header" /* Header */) { this.resetHeaderDropZone(); if (this._dropIndex === undefined) { - throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_6__.UnexpectedUndefinedError('SODDI68990'); + throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_7__.UnexpectedUndefinedError('SODDI68990'); } else { this.addChild(contentItem, this._dropIndex); @@ -6394,7 +6407,7 @@ class Stack extends _component_parentable_item__WEBPACK_IMPORTED_MODULE_0__.Comp * The content item can be either a component or a stack. If it is a component, wrap it into a stack */ if (contentItem.isComponent) { - const itemConfig = _config_resolved_config__WEBPACK_IMPORTED_MODULE_7__.ResolvedStackItemConfig.createDefault(); + const itemConfig = _config_resolved_config__WEBPACK_IMPORTED_MODULE_8__.ResolvedStackItemConfig.createDefault(); itemConfig.header = contentItem.headerConfig; const stack = this.layoutManager.createAndInitContentItem(itemConfig, this); stack.addChild(contentItem); @@ -6405,8 +6418,8 @@ class Stack extends _component_parentable_item__WEBPACK_IMPORTED_MODULE_0__.Comp * which would wrap the contentItem in a Stack) we need to check whether contentItem is a RowOrColumn. * If it is, we need to re-wrap it in a Stack like it was when it was dragged by its Tab (it was dragged!). */ - if (contentItem.type === _utils_types__WEBPACK_IMPORTED_MODULE_1__.ItemType.row || contentItem.type === _utils_types__WEBPACK_IMPORTED_MODULE_1__.ItemType.column) { - const itemConfig = _config_resolved_config__WEBPACK_IMPORTED_MODULE_7__.ResolvedStackItemConfig.createDefault(); + if (contentItem.type === _utils_types__WEBPACK_IMPORTED_MODULE_2__.ItemType.row || contentItem.type === _utils_types__WEBPACK_IMPORTED_MODULE_2__.ItemType.column) { + const itemConfig = _config_resolved_config__WEBPACK_IMPORTED_MODULE_8__.ResolvedStackItemConfig.createDefault(); itemConfig.header = this.createHeaderConfig(); const stack = this.layoutManager.createContentItem(itemConfig, this); stack.addChild(contentItem); @@ -6429,15 +6442,15 @@ class Stack extends _component_parentable_item__WEBPACK_IMPORTED_MODULE_0__.Comp */ } else { - const type = isVertical ? _utils_types__WEBPACK_IMPORTED_MODULE_1__.ItemType.column : _utils_types__WEBPACK_IMPORTED_MODULE_1__.ItemType.row; - const itemConfig = _config_resolved_config__WEBPACK_IMPORTED_MODULE_7__.ResolvedItemConfig.createDefault(type); + const type = isVertical ? _utils_types__WEBPACK_IMPORTED_MODULE_2__.ItemType.column : _utils_types__WEBPACK_IMPORTED_MODULE_2__.ItemType.row; + const itemConfig = _config_resolved_config__WEBPACK_IMPORTED_MODULE_8__.ResolvedItemConfig.createDefault(type); const rowOrColumn = this.layoutManager.createContentItem(itemConfig, this); this.stackParent.replaceChild(this, rowOrColumn); rowOrColumn.addChild(contentItem, insertBefore ? 0 : undefined, true); rowOrColumn.addChild(this, insertBefore ? undefined : 0, true); this.size = 50; contentItem.size = 50; - contentItem.sizeUnit = _utils_types__WEBPACK_IMPORTED_MODULE_1__.SizeUnitEnum.Percent; + contentItem.sizeUnit = _utils_types__WEBPACK_IMPORTED_MODULE_2__.SizeUnitEnum.Percent; rowOrColumn.updateSize(false); } } @@ -6474,7 +6487,7 @@ class Stack extends _component_parentable_item__WEBPACK_IMPORTED_MODULE_0__.Comp const headerArea = super.getElementArea(this._header.element); const contentArea = super.getElementArea(this._childElementContainer); if (headerArea === null || contentArea === null) { - throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_6__.UnexpectedNullError('SGAHC13086'); + throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_7__.UnexpectedNullError('SGAHC13086'); } const contentWidth = contentArea.x2 - contentArea.x1; const contentHeight = contentArea.y2 - contentArea.y1; @@ -6592,19 +6605,19 @@ class Stack extends _component_parentable_item__WEBPACK_IMPORTED_MODULE_0__.Comp /** @internal */ updateNodeSize() { if (this.element.style.display !== 'none') { - const content = (0,_utils_utils__WEBPACK_IMPORTED_MODULE_8__.getElementWidthAndHeight)(this.element); + const content = (0,_utils_utils__WEBPACK_IMPORTED_MODULE_1__.getElementWidthAndHeight)(this.element); if (this._header.show) { - const dimension = this._header.leftRightSided ? _utils_types__WEBPACK_IMPORTED_MODULE_1__.WidthOrHeightPropertyName.width : _utils_types__WEBPACK_IMPORTED_MODULE_1__.WidthOrHeightPropertyName.height; + const dimension = this._header.leftRightSided ? _utils_types__WEBPACK_IMPORTED_MODULE_2__.WidthOrHeightPropertyName.width : _utils_types__WEBPACK_IMPORTED_MODULE_2__.WidthOrHeightPropertyName.height; content[dimension] -= this.layoutManager.layoutConfig.dimensions.headerHeight; } - (0,_utils_utils__WEBPACK_IMPORTED_MODULE_8__.setElementWidth)(this._childElementContainer, content.width); - (0,_utils_utils__WEBPACK_IMPORTED_MODULE_8__.setElementHeight)(this._childElementContainer, content.height); + (0,_utils_utils__WEBPACK_IMPORTED_MODULE_1__.setElementWidth)(this._childElementContainer, content.width); + (0,_utils_utils__WEBPACK_IMPORTED_MODULE_1__.setElementHeight)(this._childElementContainer, content.height); for (let i = 0; i < this.contentItems.length; i++) { - (0,_utils_utils__WEBPACK_IMPORTED_MODULE_8__.setElementWidth)(this.contentItems[i].element, content.width); - (0,_utils_utils__WEBPACK_IMPORTED_MODULE_8__.setElementHeight)(this.contentItems[i].element, content.height); + (0,_utils_utils__WEBPACK_IMPORTED_MODULE_1__.setElementWidth)(this.contentItems[i].element, content.width); + (0,_utils_utils__WEBPACK_IMPORTED_MODULE_1__.setElementHeight)(this.contentItems[i].element, content.height); } this.emit('resize'); - this.emitStateChangedEvent(); + this.emitStateChangedEvent(true); } } /** @internal */ @@ -6624,7 +6637,7 @@ class Stack extends _component_parentable_item__WEBPACK_IMPORTED_MODULE_0__.Comp } const dropTargetIndicator = this.layoutManager.dropTargetIndicator; if (dropTargetIndicator === null) { - throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_6__.UnexpectedNullError('SHHDZDTI97110'); + throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_7__.UnexpectedNullError('SHHDZDTI97110'); } let area; // Empty stack @@ -6716,9 +6729,9 @@ class Stack extends _component_parentable_item__WEBPACK_IMPORTED_MODULE_0__.Comp } /** @internal */ setupHeaderPosition() { - (0,_utils_utils__WEBPACK_IMPORTED_MODULE_8__.setElementDisplayVisibility)(this._header.element, this._header.show); + (0,_utils_utils__WEBPACK_IMPORTED_MODULE_1__.setElementDisplayVisibility)(this._header.element, this._header.show); this.element.classList.remove("lm_left" /* Left */, "lm_right" /* Right */, "lm_bottom" /* Bottom */); - if (this._header.side !== _utils_types__WEBPACK_IMPORTED_MODULE_1__.Side.top) { + if (this._header.side !== _utils_types__WEBPACK_IMPORTED_MODULE_2__.Side.top) { this.element.classList.add('lm_' + this._header.side); } //if ([Side.right, Side.bottom].includes(this._header.side)) { @@ -6730,13 +6743,13 @@ class Stack extends _component_parentable_item__WEBPACK_IMPORTED_MODULE_0__.Comp /** @internal */ highlightBodyDropZone(segment) { if (this._contentAreaDimensions === undefined) { - throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_6__.UnexpectedUndefinedError('SHBDZC82265'); + throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_7__.UnexpectedUndefinedError('SHBDZC82265'); } else { const highlightArea = this._contentAreaDimensions[segment].highlightArea; const dropTargetIndicator = this.layoutManager.dropTargetIndicator; if (dropTargetIndicator === null) { - throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_6__.UnexpectedNullError('SHBDZD96110'); + throw new _errors_internal_error__WEBPACK_IMPORTED_MODULE_7__.UnexpectedNullError('SHBDZD96110'); } else { dropTargetIndicator.highlightArea(highlightArea, 1); @@ -6790,11 +6803,11 @@ class Stack extends _component_parentable_item__WEBPACK_IMPORTED_MODULE_0__.Comp /** @internal */ createHeaderConfig() { if (!this._headerSideChanged) { - return _config_resolved_config__WEBPACK_IMPORTED_MODULE_7__.ResolvedHeaderedItemConfig.Header.createCopy(this._headerConfig); + return _config_resolved_config__WEBPACK_IMPORTED_MODULE_8__.ResolvedHeaderedItemConfig.Header.createCopy(this._headerConfig); } else { const show = this._header.show ? this._header.side : false; - let result = _config_resolved_config__WEBPACK_IMPORTED_MODULE_7__.ResolvedHeaderedItemConfig.Header.createCopy(this._headerConfig, show); + let result = _config_resolved_config__WEBPACK_IMPORTED_MODULE_8__.ResolvedHeaderedItemConfig.Header.createCopy(this._headerConfig, show); if (result === undefined) { result = { show, @@ -6809,8 +6822,13 @@ class Stack extends _component_parentable_item__WEBPACK_IMPORTED_MODULE_0__.Comp } } /** @internal */ - emitStateChangedEvent() { - this.emitBaseBubblingEvent('stateChanged'); + emitStateChangedEvent(debounce = false) { + if (debounce) { + this._debouncedEmitStateChangedEvent(); + } + else { + this.emitBaseBubblingEvent('stateChanged'); + } } } /** @public */ @@ -7158,8 +7176,10 @@ class LayoutManager extends _utils_event_emitter__WEBPACK_IMPORTED_MODULE_0__.Ev */ this.reconcilePopoutWindows(); const openPopouts = []; - for (let i = 0; i < this._openPopouts.length; i++) { - openPopouts.push(this._openPopouts[i].toConfig()); + for (const popout of this._openPopouts) { + if (popout.isInitialised) { + openPopouts.push(popout.toConfig()); + } } const config = { root: rootItemConfig, @@ -8058,9 +8078,20 @@ class LayoutManager extends _utils_event_emitter__WEBPACK_IMPORTED_MODULE_0__.Ev * @internal */ createSubWindows() { - for (let i = 0; i < this.layoutConfig.openPopouts.length; i++) { - const popoutConfig = this.layoutConfig.openPopouts[i]; - this.createPopoutFromPopoutLayoutConfig(popoutConfig); + for (const config of this.layoutConfig.openPopouts) { + const parentConfig = this.saveLayout(); + const popoutLayoutConfig = { + root: config.root, + openPopouts: config.openPopouts, + settings: parentConfig.settings, + dimensions: parentConfig.dimensions, + header: parentConfig.header, + window: config.window, + parentId: config.parentId, + indexInParent: config.indexInParent, + resolved: true, + }; + this.createPopoutFromPopoutLayoutConfig(popoutLayoutConfig); } } /** @@ -9437,6 +9468,7 @@ var SizeUnitEnum; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ debounce: () => (/* binding */ debounce), /* harmony export */ deepExtend: () => (/* binding */ deepExtend), /* harmony export */ deepExtendValue: () => (/* binding */ deepExtendValue), /* harmony export */ ensureElementPositionAbsolute: () => (/* binding */ ensureElementPositionAbsolute), @@ -9681,6 +9713,15 @@ function getErrorMessage(e) { } } } +/** @internal */ +function debounce(func, waitFor = 150) { + let timeout; + const debounced = (...args) => { + clearTimeout(timeout); + timeout = setTimeout(() => func(...args), waitFor); + }; + return debounced; +} /***/ }), @@ -10109,4 +10150,4 @@ __webpack_require__.r(__webpack_exports__); /******/ })() ; }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9idW5kbGUvdW1kL2dvbGRlbi1sYXlvdXQuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1Y4RDtBQUN5QztBQUNyQztBQUN1QjtBQUNOO0FBVXhEO0FBbUYzQixjQUFjO0FBQ1AsSUFBVSxVQUFVLENBMEkxQjtBQTFJRCxXQUFpQixVQUFVO0lBUXZCLGdCQUFnQjtJQUNoQixTQUFnQixPQUFPLENBQUMsVUFBc0IsRUFBRSxrQ0FBMkM7UUFDdkYsUUFBUSxVQUFVLENBQUMsSUFBSSxFQUFFO1lBQ3JCLEtBQUssa0RBQVEsQ0FBQyxNQUFNO2dCQUNoQixNQUFNLElBQUksc0VBQWtCLENBQUMsdUNBQXVDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ3RHLEtBQUssa0RBQVEsQ0FBQyxHQUFHLENBQUM7WUFDbEIsS0FBSyxrREFBUSxDQUFDLE1BQU07Z0JBQ2hCLE9BQU8scUJBQXFCLENBQUMsT0FBTyxDQUFDLFVBQW1DLEVBQUUsa0NBQWtDLENBQUMsQ0FBQztZQUVsSCxLQUFLLGtEQUFRLENBQUMsS0FBSztnQkFDZixPQUFPLGVBQWUsQ0FBQyxPQUFPLENBQUMsVUFBNkIsRUFBRSxrQ0FBa0MsQ0FBQyxDQUFDO1lBRXRHLEtBQUssa0RBQVEsQ0FBQyxTQUFTO2dCQUNuQixPQUFPLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxVQUFpQyxFQUFFLGtDQUFrQyxDQUFDLENBQUM7WUFFOUc7Z0JBQ0ksTUFBTSxJQUFJLHdFQUFvQixDQUFDLGFBQWEsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdEU7SUFDTCxDQUFDO0lBakJlLGtCQUFPLFVBaUJ0QjtJQUVELGdCQUFnQjtJQUNoQixTQUFnQixjQUFjLENBQUMsT0FBaUM7UUFDNUQsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFO1lBQ3ZCLE9BQU8sRUFBRSxDQUFDO1NBQ2I7YUFBTTtZQUNILE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFDN0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQXFCLEtBQUssQ0FBQyxDQUFDO1lBQ3BELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzVCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUNyRDtZQUNELE9BQU8sTUFBTSxDQUFDO1NBQ2pCO0lBQ0wsQ0FBQztJQVhlLHlCQUFjLGlCQVc3QjtJQUVELGdCQUFnQjtJQUNoQixTQUFnQixTQUFTLENBQUMsRUFBaUM7UUFDdkQsSUFBSSxFQUFFLEtBQUssU0FBUyxFQUFFO1lBQ2xCLE9BQU8sZ0VBQWtCLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztTQUN6QzthQUFNO1lBQ0gsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUNuQixJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO29CQUNqQixPQUFPLGdFQUFrQixDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7aUJBQ3pDO3FCQUFNO29CQUNILE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNoQjthQUNKO2lCQUFNO2dCQUNILE9BQU8sRUFBRSxDQUFDO2FBQ2I7U0FDSjtJQUNMLENBQUM7SUFkZSxvQkFBUyxZQWN4QjtJQUVELGdCQUFnQjtJQUNoQixTQUFnQixXQUFXLENBQ3ZCLElBQXdCLEVBQ3hCLEtBQXlCLEVBQ3pCLE1BQTBCLEVBQzFCLGtDQUEyQztRQUUzQyxtRkFBbUY7UUFFbkYsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQ3BCLE9BQU8sU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLHNEQUFZLENBQUMsT0FBTyxFQUFFLHNEQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztTQUMzRTthQUFNO1lBQ0gsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7Z0JBQzdDLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtvQkFDckIsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLHNEQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7aUJBQzFEO3FCQUFNO29CQUNILElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTt3QkFDdEIsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLHNEQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7cUJBQzNEO3lCQUFNO3dCQUNILE1BQU0sSUFBSSw0RUFBd0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztxQkFDbEQ7aUJBQ0o7YUFDSjtpQkFBTTtnQkFDSCxJQUFJLGtDQUFrQyxFQUFFO29CQUNwQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsc0RBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztpQkFDdkQ7cUJBQU07b0JBQ0gsT0FBTyxFQUFFLElBQUksRUFBRSxnRUFBa0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxnRUFBa0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7aUJBQ3JHO2FBQ0o7U0FDSjtJQUNMLENBQUM7SUE3QmUsc0JBQVcsY0E2QjFCO0lBRUQsZ0JBQWdCO0lBQ2hCLFNBQWdCLGNBQWMsQ0FBQyxPQUEyQixFQUFFLFFBQTRCLEVBQUUsU0FBNkI7UUFDbkgsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFO1lBQ3ZCLE9BQU8sU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLHNEQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUNuRDthQUFNO1lBQ0gsTUFBTSxlQUFlLEdBQUcsUUFBUSxLQUFLLFNBQVMsQ0FBQztZQUMvQyxNQUFNLGdCQUFnQixHQUFHLFNBQVMsS0FBSyxTQUFTLENBQUM7WUFDakQsSUFBSSxlQUFlLElBQUksZ0JBQWdCLEVBQUU7Z0JBQ3JDLElBQUksZUFBZSxFQUFFO29CQUNqQixPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsc0RBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDM0Q7cUJBQU07b0JBQ0gsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLHNEQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7aUJBQzVEO2FBQ0o7aUJBQU07Z0JBQ0gsT0FBTyxFQUFFLElBQUksRUFBRSxnRUFBa0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxnRUFBa0IsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7YUFDM0c7U0FDSjtJQUNMLENBQUM7SUFoQmUseUJBQWMsaUJBZ0I3QjtJQUVELGdCQUFnQjtJQUNoQixTQUFnQix5Q0FBeUMsQ0FBQyxNQUFrQjtRQUN4RSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQzNCLG9CQUE2QztTQUNoRDthQUFNO1lBQ0gsSUFBSSxNQUFNLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRTtnQkFDM0QsNkJBQXNEO2FBQ3pEO2lCQUFNO2dCQUNILG9CQUE2QzthQUNoRDtTQUNKO0lBQ0wsQ0FBQztJQVZlLG9EQUF5Qyw0Q0FVeEQ7SUFFRCxTQUFnQixRQUFRLENBQUMsTUFBa0I7UUFDdkMsT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLGtEQUFRLENBQUMsTUFBTSxDQUFDO0lBQzNDLENBQUM7SUFGZSxtQkFBUSxXQUV2QjtJQUNELFNBQWdCLEtBQUssQ0FBQyxNQUFrQjtRQUNwQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLEtBQUssa0RBQVEsQ0FBQyxHQUFHLENBQUM7SUFDeEMsQ0FBQztJQUZlLGdCQUFLLFFBRXBCO0lBQ0QsU0FBZ0IsUUFBUSxDQUFDLE1BQWtCO1FBQ3ZDLE9BQU8sTUFBTSxDQUFDLElBQUksS0FBSyxrREFBUSxDQUFDLE1BQU0sQ0FBQztJQUMzQyxDQUFDO0lBRmUsbUJBQVEsV0FFdkI7SUFDRCxTQUFnQixPQUFPLENBQUMsTUFBa0I7UUFDdEMsT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLGtEQUFRLENBQUMsS0FBSyxDQUFDO0lBQzFDLENBQUM7SUFGZSxrQkFBTyxVQUV0QjtJQUNELFNBQWdCLFdBQVcsQ0FBQyxNQUFrQjtRQUMxQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLEtBQUssa0RBQVEsQ0FBQyxTQUFTLENBQUM7SUFDOUMsQ0FBQztJQUZlLHNCQUFXLGNBRTFCO0FBQ0wsQ0FBQyxFQTFJZ0IsVUFBVSxLQUFWLFVBQVUsUUEwSTFCO0FBV0QsY0FBYztBQUNQLElBQVUsa0JBQWtCLENBaUVsQztBQWpFRCxXQUFpQixrQkFBa0I7SUFDL0IsTUFBTSxpQkFBaUIsR0FBRyxlQUFlLENBQUM7SUFZMUMsSUFBaUIsTUFBTSxDQWdCdEI7SUFoQkQsV0FBaUIsTUFBTTtRQUNuQixTQUFnQixPQUFPLENBQUMsTUFBMEIsRUFBRSxVQUErQjs7WUFDL0UsSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUU7Z0JBQ2xELE9BQU8sU0FBUyxDQUFDO2FBQ3BCO2lCQUFNO2dCQUNILE1BQU0sTUFBTSxHQUFzQztvQkFDOUMsSUFBSSxFQUFFLFlBQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxJQUFJLG1DQUFJLENBQUMsVUFBVSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGtFQUFvQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7b0JBQzdILE1BQU0sRUFBRSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsTUFBTTtvQkFDdEIsUUFBUSxFQUFFLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxRQUFRO29CQUMxQixLQUFLLEVBQUUsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLEtBQUs7b0JBQ3BCLFFBQVEsRUFBRSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsUUFBUTtvQkFDMUIsV0FBVyxFQUFFLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxXQUFXO2lCQUNuQztnQkFDRCxPQUFPLE1BQU0sQ0FBQzthQUNqQjtRQUNMLENBQUM7UUFkZSxjQUFPLFVBY3RCO0lBQ0wsQ0FBQyxFQWhCZ0IsTUFBTSxHQUFOLHlCQUFNLEtBQU4seUJBQU0sUUFnQnRCO0lBRUQsZ0JBQWdCO0lBQ2hCLFNBQWdCLHFCQUFxQixDQUFDLE1BQTBCO1FBQzVELElBQUksRUFBVSxDQUFDO1FBQ2Ysd0hBQXdIO1FBQ3hILElBQUksUUFBUSxHQUFrQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ3hELElBQUksZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM1QixJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDeEIsRUFBRSxHQUFHLGdFQUFrQixDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7U0FDdkM7YUFBTTtZQUNILElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDekIsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLGlCQUFpQixDQUFDO2dCQUNoRSxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUU7b0JBQ1QsZUFBZSxHQUFHLElBQUksQ0FBQztvQkFDdkIsUUFBUSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUN0QztnQkFDRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUNyQixFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNwQjtxQkFBTTtvQkFDSCxFQUFFLEdBQUcsZ0VBQWtCLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztpQkFDdkM7YUFDSjtpQkFBTTtnQkFDSCxFQUFFLEdBQUcsUUFBUSxDQUFDO2FBQ2pCO1NBQ0o7UUFFRCxJQUFJLFNBQWtCLENBQUM7UUFDdkIsSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRTtZQUNoQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztTQUNoQzthQUFNO1lBQ0gsU0FBUyxHQUFHLGVBQWUsQ0FBQztTQUMvQjtRQUVELE9BQU8sRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFO0lBQzVCLENBQUM7SUFoQ2Usd0NBQXFCLHdCQWdDcEM7QUFDTCxDQUFDLEVBakVnQixrQkFBa0IsS0FBbEIsa0JBQWtCLFFBaUVsQztBQVVELGNBQWM7QUFDUCxJQUFVLGVBQWUsQ0FzRS9CO0FBdEVELFdBQWlCLGVBQWU7SUFDNUIsZ0JBQWdCO0lBQ2hCLFNBQWdCLE9BQU8sQ0FBQyxVQUEyQixFQUFFLGtDQUEyQzs7UUFDNUYsTUFBTSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsa0NBQWtDLENBQUMsQ0FBQztRQUM1SSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTFJLE1BQU0sTUFBTSxHQUE0QjtZQUNwQyxJQUFJLEVBQUUsa0RBQVEsQ0FBQyxLQUFLO1lBQ3BCLE9BQU8sRUFBRSxjQUFjLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQztZQUMzQyxJQUFJO1lBQ0osUUFBUTtZQUNSLE9BQU87WUFDUCxXQUFXO1lBQ1gsRUFBRTtZQUNGLFNBQVM7WUFDVCxVQUFVLEVBQUUsZ0JBQVUsQ0FBQyxVQUFVLG1DQUFJLGdFQUFrQixDQUFDLFFBQVEsQ0FBQyxVQUFVO1lBQzNFLGVBQWUsRUFBRSxnQkFBVSxDQUFDLGVBQWUsbUNBQUkscUVBQXVCLENBQUMsc0JBQXNCO1lBQzdGLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQztTQUN0RixDQUFDO1FBQ0YsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQW5CZSx1QkFBTyxVQW1CdEI7SUFFRCxnQkFBZ0I7SUFDaEIsU0FBZ0IsWUFBWSxDQUFDLGNBQXVDO1FBQ2hFLE1BQU0sTUFBTSxHQUFvQjtZQUM1QixJQUFJLEVBQUUsa0RBQVEsQ0FBQyxLQUFLO1lBQ3BCLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDO1lBQ3BELElBQUksRUFBRSxVQUFVLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsUUFBUSxDQUFDO1lBQzlELE9BQU8sRUFBRSxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxXQUFXLENBQUM7WUFDbEYsRUFBRSxFQUFFLGNBQWMsQ0FBQyxFQUFFO1lBQ3JCLFNBQVMsRUFBRSxjQUFjLENBQUMsU0FBUztZQUNuQyxVQUFVLEVBQUUsY0FBYyxDQUFDLFVBQVU7WUFDckMsZUFBZSxFQUFFLGNBQWMsQ0FBQyxlQUFlO1lBQy9DLE1BQU0sRUFBRSx3RUFBMEIsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUM7U0FDOUUsQ0FBQztRQUVGLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFkZSw0QkFBWSxlQWMzQjtJQUVELGdCQUFnQjtJQUNoQixTQUFTLGNBQWMsQ0FBQyxPQUEwQztRQUM5RCxJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUU7WUFDdkIsT0FBTyxFQUFFLENBQUM7U0FDYjthQUFNO1lBQ0gsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztZQUM3QixNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBOEIsS0FBSyxDQUFDLENBQUM7WUFDN0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDNUIsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuQyxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDOUQsSUFBSSxDQUFDLGdFQUFrQixDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsRUFBRTtvQkFDakQsTUFBTSxJQUFJLCtEQUFXLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztpQkFDdEU7cUJBQU07b0JBQ0gsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQztpQkFDMUI7YUFDSjtZQUNELE9BQU8sTUFBTSxDQUFDO1NBQ2pCO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixTQUFTLG1CQUFtQixDQUFDLGVBQThDO1FBQ3ZFLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUM7UUFDckMsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQXNCLEtBQUssQ0FBQyxDQUFDO1FBQ3JELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDNUIsTUFBTSxxQkFBcUIsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakQsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1NBQ3ZFO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztBQUNMLENBQUMsRUF0RWdCLGVBQWUsS0FBZixlQUFlLFFBc0UvQjtBQXdDRCxjQUFjO0FBQ1AsSUFBVSxtQkFBbUIsQ0FtRW5DO0FBbkVELFdBQWlCLG1CQUFtQjtJQUNoQyxnQkFBZ0I7SUFDaEIsU0FBZ0IsT0FBTyxDQUFDLFVBQStCLEVBQUUsa0NBQTJDOztRQUNoRyxJQUFJLGFBQWEsR0FBMEIsVUFBVSxDQUFDLGFBQWEsQ0FBQztRQUNwRSxJQUFJLGFBQWEsS0FBSyxTQUFTLEVBQUU7WUFDN0IsYUFBYSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUM7U0FDNUM7UUFDRCxJQUFJLGFBQWEsS0FBSyxTQUFTLEVBQUU7WUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO1NBQ3JFO2FBQU07WUFDSCxNQUFNLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLGtCQUFrQixDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQy9FLElBQUksS0FBYSxDQUFDO1lBQ2xCLElBQUksVUFBVSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksVUFBVSxDQUFDLEtBQUssS0FBSyxFQUFFLEVBQUU7Z0JBQzNELEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUNuRTtpQkFBTTtnQkFDSCxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQzthQUM1QjtZQUNELE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLE1BQU0sRUFBRSxrQ0FBa0MsQ0FBQyxDQUFDO1lBQzVJLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUksTUFBTSxNQUFNLEdBQWdDO2dCQUN4QyxJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7Z0JBQ3JCLE9BQU8sRUFBRSxFQUFFO2dCQUNYLElBQUk7Z0JBQ0osUUFBUTtnQkFDUixPQUFPO2dCQUNQLFdBQVc7Z0JBQ1gsRUFBRTtnQkFDRixTQUFTO2dCQUNULFVBQVUsRUFBRSxnQkFBVSxDQUFDLFVBQVUsbUNBQUksZ0VBQWtCLENBQUMsUUFBUSxDQUFDLFVBQVU7Z0JBQzNFLGNBQWMsRUFBRSxnQkFBVSxDQUFDLGNBQWMsbUNBQUkseUVBQTJCLENBQUMscUJBQXFCO2dCQUM5RixLQUFLO2dCQUNMLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQztnQkFDbkYsYUFBYTtnQkFDYixjQUFjLEVBQUUsZ0JBQVUsQ0FBQyxjQUFjLG1DQUFJLEVBQUU7YUFDbEQsQ0FBQztZQUNGLE9BQU8sTUFBTSxDQUFDO1NBQ2pCO0lBQ0wsQ0FBQztJQW5DZSwyQkFBTyxVQW1DdEI7SUFFRCxnQkFBZ0I7SUFDaEIsU0FBZ0IsWUFBWSxDQUFDLGNBQTJDO1FBQ3BFLE1BQU0sTUFBTSxHQUF3QjtZQUNoQyxJQUFJLEVBQUUsa0RBQVEsQ0FBQyxTQUFTO1lBQ3hCLElBQUksRUFBRSxVQUFVLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsUUFBUSxDQUFDO1lBQzlELE9BQU8sRUFBRSxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxXQUFXLENBQUM7WUFDbEYsRUFBRSxFQUFFLGNBQWMsQ0FBQyxFQUFFO1lBQ3JCLFNBQVMsRUFBRSxjQUFjLENBQUMsU0FBUztZQUNuQyxVQUFVLEVBQUUsY0FBYyxDQUFDLFVBQVU7WUFDckMsY0FBYyxFQUFFLGNBQWMsQ0FBQyxjQUFjO1lBQzdDLEtBQUssRUFBRSxjQUFjLENBQUMsS0FBSztZQUMzQixNQUFNLEVBQUUsd0VBQTBCLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDO1lBQzNFLGFBQWEsRUFBRSxjQUFjLENBQUMsYUFBYTtZQUMzQyxjQUFjLEVBQUUsNkRBQWUsQ0FBQyxTQUFTLEVBQUUsY0FBYyxDQUFDLGNBQWMsQ0FBYztTQUN6RjtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFoQmUsZ0NBQVksZUFnQjNCO0lBRUQsU0FBZ0Isb0JBQW9CLENBQUMsYUFBd0I7UUFDekQsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLGFBQWEsQ0FBQztRQUMvQyxRQUFRLGlCQUFpQixFQUFFO1lBQ3ZCLEtBQUssUUFBUSxDQUFDLENBQUMsT0FBTyxhQUF1QixDQUFDO1lBQzlDLEtBQUssUUFBUSxDQUFDLENBQUMsT0FBUSxhQUF3QixDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzNELEtBQUssU0FBUyxDQUFDLENBQUMsT0FBUSxhQUF5QixDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzdELE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ3RCO0lBQ0wsQ0FBQztJQVJlLHdDQUFvQix1QkFRbkM7QUFDTCxDQUFDLEVBbkVnQixtQkFBbUIsS0FBbkIsbUJBQW1CLFFBbUVuQztBQVNELGNBQWM7QUFDUCxJQUFVLHFCQUFxQixDQW9JckM7QUFwSUQsV0FBaUIscUJBQXFCO0lBR2xDLFNBQWdCLGlCQUFpQixDQUFDLFVBQXNCO1FBQ3BELFFBQVEsVUFBVSxDQUFDLElBQUksRUFBRTtZQUNyQixLQUFLLGtEQUFRLENBQUMsR0FBRyxDQUFDO1lBQ2xCLEtBQUssa0RBQVEsQ0FBQyxNQUFNLENBQUM7WUFDckIsS0FBSyxrREFBUSxDQUFDLEtBQUssQ0FBQztZQUNwQixLQUFLLGtEQUFRLENBQUMsU0FBUztnQkFDbkIsT0FBTyxJQUFJLENBQUM7WUFDaEIsS0FBSyxrREFBUSxDQUFDLE1BQU07Z0JBQ2hCLE9BQU8sS0FBSyxDQUFDO1lBQ2pCO2dCQUNJLE1BQU0sSUFBSSx3RUFBb0IsQ0FBQyxtQkFBbUIsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDNUU7SUFDTCxDQUFDO0lBWmUsdUNBQWlCLG9CQVloQztJQUVELGdCQUFnQjtJQUNoQixTQUFnQixPQUFPLENBQUMsVUFBaUMsRUFBRSxrQ0FBMkM7O1FBQ2xHLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLE1BQU0sRUFBRSxrQ0FBa0MsQ0FBQyxDQUFDO1FBQzVJLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUksTUFBTSxNQUFNLEdBQWtDO1lBQzFDLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSTtZQUNyQixPQUFPLEVBQUUscUJBQXFCLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7WUFDakUsSUFBSTtZQUNKLFFBQVE7WUFDUixPQUFPO1lBQ1AsV0FBVztZQUNYLEVBQUUsRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDdkMsVUFBVSxFQUFFLGdCQUFVLENBQUMsVUFBVSxtQ0FBSSxnRUFBa0IsQ0FBQyxRQUFRLENBQUMsVUFBVTtTQUM5RTtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFkZSw2QkFBTyxVQWN0QjtJQUVELGdCQUFnQjtJQUNoQixTQUFnQixZQUFZLENBQUMsY0FBNkM7UUFDdEUsTUFBTSxNQUFNLEdBQTBCO1lBQ2xDLElBQUksRUFBRSxjQUFjLENBQUMsSUFBSTtZQUN6QixPQUFPLEVBQUUsbUJBQW1CLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQztZQUNwRCxJQUFJLEVBQUUsVUFBVSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLFFBQVEsQ0FBQztZQUM5RCxPQUFPLEVBQUUscUJBQXFCLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsV0FBVyxDQUFDO1lBQ2xGLEVBQUUsRUFBRSxjQUFjLENBQUMsRUFBRTtZQUNyQixVQUFVLEVBQUUsY0FBYyxDQUFDLFVBQVU7U0FDeEM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBWGUsa0NBQVksZUFXM0I7SUFFRCxnQkFBZ0I7SUFDaEIsU0FBZ0IsY0FBYyxDQUFDLE9BQXNDO1FBQ2pFLElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRTtZQUN2QixPQUFPLEVBQUUsQ0FBQztTQUNiO2FBQU07WUFDSCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1lBQzdCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxLQUFLLENBQXdDLEtBQUssQ0FBQyxDQUFDO1lBQ2pGLElBQUksaUNBQWlDLEdBQUcsS0FBSyxDQUFDO1lBQzlDLElBQUksd0JBQXdCLEdBQUcsS0FBSyxDQUFDO1lBQ3JDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzVCLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxFQUFFO29CQUMzRCxNQUFNLElBQUksc0VBQWtCLENBQUMsd0NBQXdDLEVBQUUsZUFBZSxDQUFDLENBQUM7aUJBQzNGO3FCQUFNO29CQUNILElBQUksQ0FBQyx3QkFBd0IsRUFBRTt3QkFDM0IsTUFBTSxnQ0FBZ0MsR0FBRyxVQUFVLENBQUMseUNBQXlDLENBQUMsZUFBZSxDQUFDLENBQUM7d0JBQy9HLFFBQVEsZ0NBQWdDLEVBQUU7NEJBQ3RDO2dDQUNJLE1BQU07NEJBQ1Y7Z0NBQ0ksaUNBQWlDLEdBQUcsSUFBSSxDQUFDO2dDQUN6QyxNQUFNOzRCQUNWO2dDQUNJLHdCQUF3QixHQUFHLElBQUksQ0FBQztnQ0FDaEMsTUFBTTs0QkFDVjtnQ0FDSSxNQUFNLElBQUksd0VBQW9CLENBQUMsY0FBYyxFQUFFLGdDQUFnQyxDQUFDLENBQUM7eUJBQ3hGO3FCQUNKO29CQUNELGdCQUFnQixDQUFDLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQztpQkFDekM7YUFDSjtZQUVELElBQUksaUJBQTBCLENBQUM7WUFDL0IsSUFBSSx3QkFBd0IsRUFBRTtnQkFDMUIsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO2FBQzdCO2lCQUFNO2dCQUNILElBQUksaUNBQWlDLEVBQUU7b0JBQ25DLGlCQUFpQixHQUFHLElBQUksQ0FBQztpQkFDNUI7cUJBQU07b0JBQ0gsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO2lCQUM3QjthQUNKO1lBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQWdELEtBQUssQ0FBQyxDQUFDO1lBQy9FLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzVCLE1BQU0sZUFBZSxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1QyxNQUFNLHVCQUF1QixHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLGlCQUFpQixDQUFDLENBQUM7Z0JBQ3ZGLElBQUksQ0FBQywyRUFBNkIsQ0FBQyxpQkFBaUIsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFO29CQUMzRSxNQUFNLElBQUksK0RBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQztpQkFDcEY7cUJBQU07b0JBQ0gsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLHVCQUF1QixDQUFDO2lCQUN2QzthQUNKO1lBQ0QsT0FBTyxNQUFNLENBQUM7U0FDakI7SUFDTCxDQUFDO0lBdkRlLG9DQUFjLGlCQXVEN0I7SUFFRCxnQkFBZ0I7SUFDaEIsU0FBUyxtQkFBbUIsQ0FBQyxlQUF5RTtRQUNsRyxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxDQUF3QyxLQUFLLENBQUMsQ0FBQztRQUN2RSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzVCLE1BQU0scUJBQXFCLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sSUFBSSxHQUFHLHFCQUFxQixDQUFDLElBQUksQ0FBQztZQUN4QyxJQUFJLGFBQW9ELENBQUM7WUFDekQsUUFBUSxJQUFJLEVBQUU7Z0JBQ1YsS0FBSyxrREFBUSxDQUFDLEdBQUcsQ0FBQztnQkFDbEIsS0FBSyxrREFBUSxDQUFDLE1BQU07b0JBQ2hCLGFBQWEsR0FBRyxxQkFBcUIsQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsQ0FBQztvQkFDMUUsTUFBTTtnQkFDVixLQUFLLGtEQUFRLENBQUMsS0FBSztvQkFDZixhQUFhLEdBQUcsZUFBZSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO29CQUNwRSxNQUFNO2dCQUNWLEtBQUssa0RBQVEsQ0FBQyxTQUFTO29CQUNuQixhQUFhLEdBQUcsbUJBQW1CLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUFDLENBQUM7b0JBQ3hFLE1BQU07Z0JBQ1Y7b0JBQ0ksTUFBTSxJQUFJLHdFQUFvQixDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUM3RDtZQUNELE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUM7U0FDN0I7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0FBQ0wsQ0FBQyxFQXBJZ0IscUJBQXFCLEtBQXJCLHFCQUFxQixRQW9JckM7QUFLRCxjQUFjO0FBQ1AsSUFBVSxjQUFjLENBZ0Q5QjtBQWhERCxXQUFpQixjQUFjO0lBQzNCLFNBQWdCLGdCQUFnQixDQUFDLFVBQXNCO1FBQ25ELFFBQVEsVUFBVSxDQUFDLElBQUksRUFBRTtZQUNyQixLQUFLLGtEQUFRLENBQUMsR0FBRyxDQUFDO1lBQ2xCLEtBQUssa0RBQVEsQ0FBQyxNQUFNLENBQUM7WUFDckIsS0FBSyxrREFBUSxDQUFDLEtBQUssQ0FBQztZQUNwQixLQUFLLGtEQUFRLENBQUMsU0FBUztnQkFDbkIsT0FBTyxJQUFJLENBQUM7WUFDaEIsS0FBSyxrREFBUSxDQUFDLE1BQU07Z0JBQ2hCLE9BQU8sS0FBSyxDQUFDO1lBQ2pCO2dCQUNJLE1BQU0sSUFBSSx3RUFBb0IsQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3RFO0lBQ0wsQ0FBQztJQVplLCtCQUFnQixtQkFZL0I7SUFFRCxnQkFBZ0I7SUFDaEIsU0FBZ0IsT0FBTyxDQUFDLFVBQXNDO1FBQzFELElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTtZQUMxQixPQUFPLFNBQVMsQ0FBQztTQUNwQjthQUFNO1lBQ0gsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLG9FQUFzQixDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNsRCxNQUFNLElBQUksc0VBQWtCLENBQUMsd0NBQXdDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2FBQ3RHO2lCQUFNO2dCQUNILE9BQU8sTUFBTSxDQUFDO2FBQ2pCO1NBQ0o7SUFDTCxDQUFDO0lBWGUsc0JBQU8sVUFXdEI7SUFFRCxnQkFBZ0I7SUFDaEIsU0FBZ0IsdUJBQXVCLENBQUMsa0JBQXNEO1FBQzFGLElBQUksa0JBQWtCLEtBQUssU0FBUyxFQUFFO1lBQ2xDLE9BQU8sU0FBUyxDQUFDO1NBQ3BCO2FBQU07WUFDSCxNQUFNLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7WUFDckMsUUFBUSxJQUFJLEVBQUU7Z0JBQ1YsS0FBSyxrREFBUSxDQUFDLEdBQUcsQ0FBQztnQkFDbEIsS0FBSyxrREFBUSxDQUFDLE1BQU07b0JBQ2hCLE9BQU8scUJBQXFCLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBQ2xFLEtBQUssa0RBQVEsQ0FBQyxLQUFLO29CQUNmLE9BQU8sZUFBZSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2dCQUM1RCxLQUFLLGtEQUFRLENBQUMsU0FBUztvQkFDbkIsT0FBTyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsQ0FBQztnQkFDaEU7b0JBQ0ksTUFBTSxJQUFJLHdFQUFvQixDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUM1RDtTQUNKO0lBQ0wsQ0FBQztJQWpCZSxzQ0FBdUIsMEJBaUJ0QztBQUNMLENBQUMsRUFoRGdCLGNBQWMsS0FBZCxjQUFjLFFBZ0Q5QjtBQWVEOzs7O0dBSUc7QUFDSSxJQUFVLFlBQVksQ0FzWTVCO0FBdFlELFdBQWlCLFlBQVk7SUFpR3pCLElBQWlCLFFBQVEsQ0FpQnhCO0lBakJELFdBQWlCLFFBQVE7UUFDckIsU0FBZ0IsT0FBTyxDQUFDLFFBQThCOztZQUNsRCxNQUFNLE1BQU0sR0FBa0M7Z0JBQzFDLGtCQUFrQixFQUFFLGNBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxrQkFBa0IsbUNBQUksa0VBQW9CLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0I7Z0JBQzdHLGVBQWUsRUFBRSxjQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsZUFBZSxtQ0FBSSxrRUFBb0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGVBQWU7Z0JBQ3BHLGNBQWMsRUFBRSxjQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsY0FBYyxtQ0FBSSxrRUFBb0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGNBQWM7Z0JBQ2pHLGdCQUFnQixFQUFFLGNBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxnQkFBZ0IsbUNBQUksa0VBQW9CLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0I7Z0JBQ3ZHLHdCQUF3QixFQUFFLGNBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSx3QkFBd0IsbUNBQUksa0VBQW9CLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyx3QkFBd0I7Z0JBQy9ILG9CQUFvQixFQUFFLGNBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxvQkFBb0IsbUNBQUksa0VBQW9CLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0I7Z0JBQ25ILGNBQWMsRUFBRSxjQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsY0FBYyxtQ0FBSSxrRUFBb0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGNBQWM7Z0JBQ2pHLG1CQUFtQixFQUFFLGNBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxtQkFBbUIsbUNBQUksa0VBQW9CLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUI7Z0JBQ2hILHFCQUFxQixFQUFFLGNBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxxQkFBcUIsbUNBQUksa0VBQW9CLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUI7Z0JBQ3RILGdCQUFnQixFQUFFLGNBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxnQkFBZ0IsbUNBQUksa0VBQW9CLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0I7Z0JBQ3ZHLFlBQVksRUFBRSxjQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsWUFBWSxtQ0FBSSxrRUFBb0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFlBQVk7YUFDOUY7WUFDRCxPQUFPLE1BQU0sQ0FBQztRQUNsQixDQUFDO1FBZmUsZ0JBQU8sVUFldEI7SUFDTCxDQUFDLEVBakJnQixRQUFRLEdBQVIscUJBQVEsS0FBUixxQkFBUSxRQWlCeEI7SUEyREQsSUFBaUIsVUFBVSxDQXFEMUI7SUFyREQsV0FBaUIsVUFBVTtRQUN2QixnQkFBZ0I7UUFDaEIsU0FBZ0IsT0FBTyxDQUFDLFVBQWtDOztZQUN0RCxNQUFNLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFFLFFBQVEsRUFBRSx3QkFBd0IsRUFBRSxHQUFHLFVBQVUsQ0FBQywyQkFBMkIsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM5SCxNQUFNLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLFFBQVEsRUFBRSx1QkFBdUIsRUFBRSxHQUFHLFVBQVUsQ0FBQywwQkFBMEIsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMzSCxNQUFNLE1BQU0sR0FBb0M7Z0JBQzVDLFdBQVcsRUFBRSxnQkFBVSxhQUFWLFVBQVUsdUJBQVYsVUFBVSxDQUFFLFdBQVcsbUNBQUksa0VBQW9CLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxXQUFXO2dCQUM1RixlQUFlLEVBQUUsZ0JBQVUsYUFBVixVQUFVLHVCQUFWLFVBQVUsQ0FBRSxlQUFlLG1DQUFJLGtFQUFvQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsZUFBZTtnQkFDeEcsb0JBQW9CO2dCQUNwQix3QkFBd0I7Z0JBQ3hCLG1CQUFtQjtnQkFDbkIsdUJBQXVCO2dCQUN2QixZQUFZLEVBQUUsZ0JBQVUsYUFBVixVQUFVLHVCQUFWLFVBQVUsQ0FBRSxZQUFZLG1DQUFJLGtFQUFvQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsWUFBWTtnQkFDL0YsY0FBYyxFQUFFLGdCQUFVLGFBQVYsVUFBVSx1QkFBVixVQUFVLENBQUUsY0FBYyxtQ0FBSSxrRUFBb0IsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLGNBQWM7Z0JBQ3JHLGVBQWUsRUFBRSxnQkFBVSxhQUFWLFVBQVUsdUJBQVYsVUFBVSxDQUFFLGVBQWUsbUNBQUksa0VBQW9CLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxlQUFlO2FBQzNHO1lBQ0QsT0FBTyxNQUFNLENBQUM7UUFDbEIsQ0FBQztRQWZlLGtCQUFPLFVBZXRCO1FBRUQsZ0JBQWdCO1FBQ2hCLFNBQWdCLFlBQVksQ0FBQyxrQkFBbUQ7WUFDNUUsTUFBTSxNQUFNLEdBQWU7Z0JBQ3ZCLFdBQVcsRUFBRSxrQkFBa0IsQ0FBQyxXQUFXO2dCQUMzQyxlQUFlLEVBQUUsa0JBQWtCLENBQUMsZUFBZTtnQkFDbkQsb0JBQW9CLEVBQUUsVUFBVSxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixFQUFFLGtCQUFrQixDQUFDLHdCQUF3QixDQUFDO2dCQUN0SCxtQkFBbUIsRUFBRSxVQUFVLENBQUMsa0JBQWtCLENBQUMsbUJBQW1CLEVBQUUsa0JBQWtCLENBQUMsdUJBQXVCLENBQUM7Z0JBQ25ILFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxZQUFZO2dCQUM3QyxjQUFjLEVBQUUsa0JBQWtCLENBQUMsY0FBYztnQkFDakQsZUFBZSxFQUFFLGtCQUFrQixDQUFDLGVBQWU7YUFDdEQsQ0FBQztZQUVGLE9BQU8sTUFBTSxDQUFDO1FBQ2xCLENBQUM7UUFaZSx1QkFBWSxlQVkzQjtRQUVELGdCQUFnQjtRQUNoQixTQUFnQiwyQkFBMkIsQ0FBQyxVQUFrQztZQUMxRSxNQUFNLE1BQU0sR0FBRyxVQUFVLGFBQVYsVUFBVSx1QkFBVixVQUFVLENBQUUsb0JBQW9CLENBQUM7WUFDaEQsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO2dCQUN0QixPQUFPLEVBQUUsSUFBSSxFQUFFLGtFQUFvQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLGtFQUFvQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsd0JBQXdCLEVBQUUsQ0FBQzthQUMvSjtpQkFBTTtnQkFDSCxPQUFPLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxzREFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDbEQ7UUFDTCxDQUFDO1FBUGUsc0NBQTJCLDhCQU8xQztRQUVELGdCQUFnQjtRQUNoQixTQUFnQiwwQkFBMEIsQ0FBQyxVQUFrQztZQUN6RSxNQUFNLEtBQUssR0FBRyxVQUFVLGFBQVYsVUFBVSx1QkFBVixVQUFVLENBQUUsbUJBQW1CLENBQUM7WUFDOUMsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO2dCQUNyQixPQUFPLEVBQUUsSUFBSSxFQUFFLGtFQUFvQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLGtFQUFvQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsdUJBQXVCLEVBQUUsQ0FBQzthQUM3SjtpQkFBTTtnQkFDSCxPQUFPLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxzREFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDakQ7UUFDTCxDQUFDO1FBUGUscUNBQTBCLDZCQU96QztJQUNMLENBQUMsRUFyRGdCLFVBQVUsR0FBVix1QkFBVSxLQUFWLHVCQUFVLFFBcUQxQjtJQXlFRCxJQUFpQixNQUFNLENBNkJ0QjtJQTdCRCxXQUFpQixNQUFNO1FBQ25CLGdCQUFnQjtRQUNoQixTQUFnQixPQUFPLENBQUMsTUFBMEIsRUFDOUMsUUFBMkMsRUFBRSxNQUF1Qzs7WUFFcEYsSUFBSSxJQUFrQixDQUFDO1lBQ3ZCLElBQUksT0FBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLElBQUksTUFBSyxTQUFTLEVBQUU7Z0JBQzVCLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO2FBQ3RCO2lCQUFNO2dCQUNILElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRTtvQkFDN0QsSUFBSSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGtFQUFvQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7aUJBQ2xGO3FCQUFNO29CQUNILElBQUksR0FBRyxrRUFBb0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztpQkFDcEQ7YUFDSjtZQUNELE1BQU0sTUFBTSxHQUFnQztnQkFDeEMsSUFBSTtnQkFDSixNQUFNLEVBQUUsa0JBQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxNQUFNLG1DQUFJLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxNQUFNLG1DQUNwQyxDQUFDLFNBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxjQUFjLE1BQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGtFQUFvQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO2dCQUM5RixLQUFLLEVBQUUsa0JBQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxLQUFLLG1DQUFJLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxLQUFLLG1DQUFJLGtFQUFvQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSztnQkFDbkYsUUFBUSxFQUFFLGtCQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsUUFBUSxtQ0FBSSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsUUFBUSxtQ0FDMUMsQ0FBQyxTQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsZ0JBQWdCLE1BQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGtFQUFvQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO2dCQUNsRyxLQUFLLEVBQUUsa0JBQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxLQUFLLG1DQUFJLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxLQUFLLG1DQUNqQyxDQUFDLFNBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxhQUFhLE1BQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGtFQUFvQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2dCQUM1RixRQUFRLEVBQUUsa0JBQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxRQUFRLG1DQUFJLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxRQUFRLG1DQUFJLGtFQUFvQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUTtnQkFDL0YsV0FBVyxFQUFFLGtCQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsV0FBVyxtQ0FBSSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsV0FBVyxtQ0FBSSxrRUFBb0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVc7YUFDOUc7WUFDRCxPQUFPLE1BQU0sQ0FBQztRQUNsQixDQUFDO1FBMUJlLGNBQU8sVUEwQnRCO0lBQ0wsQ0FBQyxFQTdCZ0IsTUFBTSxHQUFOLG1CQUFNLEtBQU4sbUJBQU0sUUE2QnRCO0lBRUQsU0FBZ0IsUUFBUSxDQUFDLE1BQW9CO1FBQ3pDLE9BQU8sVUFBVSxJQUFJLE1BQU0sSUFBSSxlQUFlLElBQUksTUFBTSxJQUFJLFFBQVEsSUFBSSxNQUFNLENBQUM7SUFDbkYsQ0FBQztJQUZlLHFCQUFRLFdBRXZCO0lBRUQsZ0JBQWdCO0lBQ2hCLFNBQWdCLE9BQU8sQ0FBQyxZQUEwQjtRQUM5QyxJQUFJLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUN4QixPQUFPLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNuRDthQUFNO1lBQ0gsSUFBSSxJQUFnQyxDQUFDO1lBQ3JDLElBQUksWUFBWSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7Z0JBQ2pDLElBQUksR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDO2FBQzVCO2lCQUFNO2dCQUNILElBQUksWUFBWSxDQUFDLE9BQU8sS0FBSyxTQUFTLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUN2RSxJQUFJLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDbEM7cUJBQU07b0JBQ0gsSUFBSSxHQUFHLFNBQVMsQ0FBQztpQkFDcEI7YUFDSjtZQUNELE1BQU0sTUFBTSxHQUF5QjtnQkFDakMsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsSUFBSSxFQUFFLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUNsQyxXQUFXLEVBQUUsWUFBWSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUM7Z0JBQ3RFLFVBQVUsRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO2dCQUNwRSxRQUFRLEVBQUUsWUFBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQztnQkFDOUQsTUFBTSxFQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsTUFBTSxDQUFDO2FBQ3ZHO1lBQ0QsT0FBTyxNQUFNLENBQUM7U0FDakI7SUFDTCxDQUFDO0lBeEJlLG9CQUFPLFVBd0J0QjtJQUVELFNBQWdCLFlBQVksQ0FBQyxNQUE0QjtRQUNyRCxNQUFNLE1BQU0sR0FBaUI7WUFDekIsSUFBSSxFQUFFLGNBQWMsQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ3pELFdBQVcsRUFBRSxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1lBQ3JFLFFBQVEsRUFBRSxrRUFBb0IsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFDbkUsVUFBVSxFQUFFLFlBQVksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7WUFDbkUsTUFBTSxFQUFFLGtFQUFvQixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztTQUNoRSxDQUFDO1FBQ0YsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQVRlLHlCQUFZLGVBUzNCO0lBRUQsU0FBZ0IsVUFBVSxDQUFDLHNCQUEyRDtRQUNsRixNQUFNLE1BQU0sR0FBRyxzQkFBOEMsQ0FBQztRQUM5RCxPQUFPLE1BQU0sQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBSGUsdUJBQVUsYUFHekI7SUFFRCxnQkFBZ0I7SUFDaEIsU0FBZ0Isa0JBQWtCLENBQUMsYUFBK0M7UUFDOUUsSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFO1lBQzdCLE9BQU8sRUFBRSxDQUFDO1NBQ2I7YUFBTTtZQUNILE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUM7WUFDbkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQTZCLEtBQUssQ0FBQyxDQUFDO1lBQzVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzVCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDNUQ7WUFDRCxPQUFPLE1BQU0sQ0FBQztTQUNqQjtJQUNMLENBQUM7SUFYZSwrQkFBa0IscUJBV2pDO0FBQ0wsQ0FBQyxFQXRZZ0IsWUFBWSxLQUFaLFlBQVksUUFzWTVCO0FBaUJELGNBQWM7QUFDUCxJQUFVLGtCQUFrQixDQWlIbEM7QUFqSEQsV0FBaUIsa0JBQWtCO0lBcUIvQixJQUFpQixNQUFNLENBb0N0QjtJQXBDRCxXQUFpQixNQUFNO1FBQ25CLGdCQUFnQjtRQUNoQixTQUFnQixPQUFPLENBQUMsTUFBMEIsRUFDOUMsVUFBa0M7O1lBRWxDLElBQUksTUFBeUMsQ0FBQztZQUM5QyxNQUFNLFFBQVEsR0FBRyx3RUFBMEIsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1lBQzVELElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtnQkFDdEIsTUFBTSxHQUFHO29CQUNMLEtBQUssRUFBRSxZQUFNLENBQUMsS0FBSyxtQ0FBSSxRQUFRLENBQUMsS0FBSztvQkFDckMsTUFBTSxFQUFFLFlBQU0sQ0FBQyxNQUFNLG1DQUFJLFFBQVEsQ0FBQyxNQUFNO29CQUN4QyxJQUFJLEVBQUUsWUFBTSxDQUFDLElBQUksbUNBQUksUUFBUSxDQUFDLElBQUk7b0JBQ2xDLEdBQUcsRUFBRSxZQUFNLENBQUMsR0FBRyxtQ0FBSSxRQUFRLENBQUMsR0FBRztpQkFDbEM7YUFDSjtpQkFBTTtnQkFDSCxNQUFNLEdBQUc7b0JBQ0wsS0FBSyxFQUFFLGdCQUFVLGFBQVYsVUFBVSx1QkFBVixVQUFVLENBQUUsS0FBSyxtQ0FBSSxRQUFRLENBQUMsS0FBSztvQkFDMUMsTUFBTSxFQUFFLGdCQUFVLGFBQVYsVUFBVSx1QkFBVixVQUFVLENBQUUsTUFBTSxtQ0FBSSxRQUFRLENBQUMsTUFBTTtvQkFDN0MsSUFBSSxFQUFFLGdCQUFVLGFBQVYsVUFBVSx1QkFBVixVQUFVLENBQUUsSUFBSSxtQ0FBSSxRQUFRLENBQUMsSUFBSTtvQkFDdkMsR0FBRyxFQUFFLGdCQUFVLGFBQVYsVUFBVSx1QkFBVixVQUFVLENBQUUsR0FBRyxtQ0FBSSxRQUFRLENBQUMsR0FBRztpQkFDdkM7YUFDSjtZQUNELE9BQU8sTUFBTSxDQUFDO1FBQ2xCLENBQUM7UUFyQmUsY0FBTyxVQXFCdEI7UUFFRCxnQkFBZ0I7UUFDaEIsU0FBZ0IsWUFBWSxDQUFDLGNBQWlEO1lBQzFFLE1BQU0sTUFBTSxHQUFXO2dCQUNuQixLQUFLLEVBQUUsY0FBYyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEtBQUs7Z0JBQ3ZFLE1BQU0sRUFBRSxjQUFjLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsTUFBTTtnQkFDMUUsSUFBSSxFQUFFLGNBQWMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJO2dCQUNwRSxHQUFHLEVBQUUsY0FBYyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEdBQUc7YUFDcEU7WUFFRCxPQUFPLE1BQU0sQ0FBQztRQUNsQixDQUFDO1FBVGUsbUJBQVksZUFTM0I7SUFDTCxDQUFDLEVBcENnQixNQUFNLEdBQU4seUJBQU0sS0FBTix5QkFBTSxRQW9DdEI7SUFFRCxnQkFBZ0I7SUFDaEIsU0FBZ0IsT0FBTyxDQUFDLFlBQWdDOztRQUNwRCxJQUFJLElBQWdDLENBQUM7UUFDckMsSUFBSSxZQUFZLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtZQUNqQyxJQUFJLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQztTQUM1QjthQUFNO1lBQ0gsSUFBSSxZQUFZLENBQUMsT0FBTyxLQUFLLFNBQVMsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3ZFLElBQUksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2xDO2lCQUFNO2dCQUNILElBQUksR0FBRyxTQUFTLENBQUM7YUFDcEI7U0FDSjtRQUVELE1BQU0sTUFBTSxHQUErQjtZQUN2QyxJQUFJLEVBQUUsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDbEMsV0FBVyxFQUFFLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDO1lBQ3RFLFVBQVUsRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO1lBQ3BFLFFBQVEsRUFBRSxZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO1lBQzlELE1BQU0sRUFBRSxZQUFZLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLE1BQU0sQ0FBQztZQUNwRyxRQUFRLEVBQUUsa0JBQVksQ0FBQyxRQUFRLG1DQUFJLElBQUk7WUFDdkMsYUFBYSxFQUFFLGtCQUFZLENBQUMsYUFBYSxtQ0FBSSxJQUFJO1lBQ2pELE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLFVBQVUsQ0FBQztZQUN2RixRQUFRLEVBQUUsSUFBSTtTQUNqQjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUF4QmUsMEJBQU8sVUF3QnRCO0lBRUQsZ0JBQWdCO0lBQ2hCLFNBQWdCLFlBQVksQ0FBQyxjQUEwQztRQUNuRSxNQUFNLE1BQU0sR0FBdUI7WUFDL0IsSUFBSSxFQUFFLGNBQWMsQ0FBQyx1QkFBdUIsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO1lBQ2pFLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO1lBQzFELFVBQVUsRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDO1lBQzNFLFFBQVEsRUFBRSxrRUFBb0IsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUM7WUFDM0UsTUFBTSxFQUFFLGtFQUFvQixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQztZQUNyRSxRQUFRLEVBQUUsY0FBYyxDQUFDLFFBQVE7WUFDakMsYUFBYSxFQUFFLGNBQWMsQ0FBQyxhQUFhO1lBQzNDLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUM7U0FDeEU7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBYmUsK0JBQVksZUFhM0I7SUFFRCxnQkFBZ0I7SUFDaEIsU0FBZ0IsaUJBQWlCLENBQUMsYUFBMkM7UUFDekUsTUFBTSx1QkFBdUIsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDO1FBQ3JELE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxDQUFxQix1QkFBdUIsQ0FBQyxDQUFDO1FBQ3RFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyx1QkFBdUIsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM5QyxNQUFNLGtCQUFrQixHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUM7U0FDbkU7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBVGUsb0NBQWlCLG9CQVNoQztBQUNMLENBQUMsRUFqSGdCLGtCQUFrQixLQUFsQixrQkFBa0IsUUFpSGxDO0FBY0QsZ0JBQWdCO0FBQ1QsU0FBUyxTQUFTLENBQUMsVUFBa0IsRUFBRSxrQkFBMkM7SUFDckYsTUFBTSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyw4RUFBZ0MsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM3SCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM3QyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNiLE1BQU0sSUFBSSxzRUFBa0IsQ0FBQyxHQUFHLDREQUFXLHVDQUE0QyxLQUFLLFVBQVUsRUFBRSxDQUFDLENBQUM7S0FDN0c7U0FBTTtRQUNILE1BQU0sUUFBUSxHQUFHLHNEQUFZLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDMUQsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFO1lBQ3hCLE1BQU0sSUFBSSxzRUFBa0IsQ0FBQyxHQUFHLDREQUFXLGlDQUFzQyxLQUFLLFVBQVUsRUFBRSxDQUFDO1NBQ3RHO2FBQU07WUFDSCxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUN4QyxNQUFNLElBQUksc0VBQWtCLENBQUMsR0FBRyw0REFBVyxxQ0FBMEMsS0FBSyxVQUFVLEVBQUUsQ0FBQzthQUMxRztpQkFBTTtnQkFDSCxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDO2FBQzdCO1NBQ0o7S0FDSjtBQUNMLENBQUM7QUFFRCxnQkFBZ0I7QUFDVCxTQUFTLFVBQVUsQ0FBQyxJQUFZLEVBQUUsUUFBc0I7SUFDM0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxHQUFHLHNEQUFZLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzdELENBQUM7QUFFRCxnQkFBZ0I7QUFDVCxTQUFTLHFCQUFxQixDQUFDLElBQXVCLEVBQUUsUUFBc0I7SUFDakYsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO1FBQ3BCLE9BQU8sU0FBUyxDQUFDO0tBQ3BCO1NBQU07UUFDSCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsc0RBQVksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDNUQ7QUFDTCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyd0M0RTtBQUNuQjtBQUMrQjtBQUN4QztBQWdCakQsY0FBYztBQUNQLElBQVUsa0JBQWtCLENBK0RsQztBQS9ERCxXQUFpQixrQkFBa0I7SUFDbEIsMkJBQVEsR0FBdUI7UUFDeEMsSUFBSSxFQUFFLGtEQUFRLENBQUMsTUFBTTtRQUNyQixPQUFPLEVBQUUsRUFBRTtRQUNYLElBQUksRUFBRSxDQUFDO1FBQ1AsUUFBUSxFQUFFLHNEQUFZLENBQUMsVUFBVTtRQUNqQyxPQUFPLEVBQUUsU0FBUztRQUNsQixXQUFXLEVBQUUsc0RBQVksQ0FBQyxLQUFLO1FBQy9CLEVBQUUsRUFBRSxFQUFFO1FBQ04sVUFBVSxFQUFFLElBQUk7S0FDVixDQUFDO0lBRVgsa0dBQWtHO0lBQ2xHLFNBQWdCLFVBQVUsQ0FBQyxRQUE0QixFQUFFLE9BQThCO1FBQ25GLFFBQVEsUUFBUSxDQUFDLElBQUksRUFBRTtZQUNuQixLQUFLLGtEQUFRLENBQUMsTUFBTSxDQUFDO1lBQ3JCLEtBQUssa0RBQVEsQ0FBQyxHQUFHLENBQUM7WUFDbEIsS0FBSyxrREFBUSxDQUFDLE1BQU07Z0JBQ2hCLE9BQU8sNkJBQTZCLENBQUMsVUFBVSxDQUFDLFFBQXlDLEVBQ3JGLE9BQTBELENBQUMsQ0FBQztZQUVwRSxLQUFLLGtEQUFRLENBQUMsS0FBSztnQkFDZixPQUFPLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxRQUFtQyxFQUFFLE9BQXdDLENBQUMsQ0FBQztZQUU3SCxLQUFLLGtEQUFRLENBQUMsU0FBUztnQkFDbkIsT0FBTywyQkFBMkIsQ0FBQyxVQUFVLENBQUMsUUFBdUMsQ0FBQyxDQUFDO1lBRTNGO2dCQUNJLE1BQU0sSUFBSSx3RUFBb0IsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxvQ0FBb0MsQ0FBQyxDQUFDO1NBQ3hHO0lBQ0wsQ0FBQztJQWpCZSw2QkFBVSxhQWlCekI7SUFFRCxTQUFnQixhQUFhLENBQUMsSUFBYztRQUN4QyxRQUFRLElBQUksRUFBRTtZQUNWLEtBQUssa0RBQVEsQ0FBQyxNQUFNO2dCQUNoQixNQUFNLElBQUksK0RBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLHFDQUFxQztZQUMvRSxLQUFLLGtEQUFRLENBQUMsR0FBRyxDQUFDO1lBQ2xCLEtBQUssa0RBQVEsQ0FBQyxNQUFNO2dCQUNoQixPQUFPLDZCQUE2QixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUU3RCxLQUFLLGtEQUFRLENBQUMsS0FBSztnQkFDZixPQUFPLHVCQUF1QixDQUFDLGFBQWEsRUFBRSxDQUFDO1lBRW5ELEtBQUssa0RBQVEsQ0FBQyxTQUFTO2dCQUNuQixPQUFPLDJCQUEyQixDQUFDLGFBQWEsRUFBRSxDQUFDO1lBRXZEO2dCQUNJLE1BQU0sSUFBSSx3RUFBb0IsQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLG9DQUFvQyxDQUFDLENBQUM7U0FDakc7SUFDTCxDQUFDO0lBakJlLGdDQUFhLGdCQWlCNUI7SUFFRCxTQUFnQixlQUFlLENBQUMsVUFBOEI7UUFDMUQsT0FBTyxVQUFVLENBQUMsSUFBSSxLQUFLLGtEQUFRLENBQUMsU0FBUyxDQUFDO0lBQ2xELENBQUM7SUFGZSxrQ0FBZSxrQkFFOUI7SUFFRCxTQUFnQixXQUFXLENBQUMsVUFBOEI7UUFDdEQsT0FBTyxVQUFVLENBQUMsSUFBSSxLQUFLLGtEQUFRLENBQUMsS0FBSyxDQUFDO0lBQzlDLENBQUM7SUFGZSw4QkFBVyxjQUUxQjtJQUVELGdCQUFnQjtJQUNoQixTQUFnQixZQUFZLENBQUMsVUFBOEI7UUFDdkQsT0FBTyxVQUFVLENBQUMsSUFBSSxLQUFLLGtEQUFRLENBQUMsTUFBTSxDQUFDO0lBQy9DLENBQUM7SUFGZSwrQkFBWSxlQUUzQjtBQUNMLENBQUMsRUEvRGdCLGtCQUFrQixLQUFsQixrQkFBa0IsUUErRGxDO0FBU0QsY0FBYztBQUNQLElBQVUsMEJBQTBCLENBNkIxQztBQTdCRCxXQUFpQiwwQkFBMEI7SUFDMUIsMkNBQWdCLEdBQUcsS0FBSyxDQUFDO0lBWXRDLElBQWlCLE1BQU0sQ0FldEI7SUFmRCxXQUFpQixNQUFNO1FBQ25CLFNBQWdCLFVBQVUsQ0FBQyxRQUE0QixFQUFFLElBQW1CO1lBQ3hFLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtnQkFDeEIsT0FBTyxTQUFTLENBQUM7YUFDcEI7aUJBQU07Z0JBQ0gsT0FBTztvQkFDSCxJQUFJLEVBQUUsSUFBSSxhQUFKLElBQUksY0FBSixJQUFJLEdBQUksUUFBUSxDQUFDLElBQUk7b0JBQzNCLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTtvQkFDdkIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLO29CQUNyQixRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7b0JBQzNCLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUTtvQkFDM0IsV0FBVyxFQUFFLFFBQVEsQ0FBQyxXQUFXO2lCQUNwQzthQUNKO1FBQ0wsQ0FBQztRQWJlLGlCQUFVLGFBYXpCO0lBQ0wsQ0FBQyxFQWZnQixNQUFNLEdBQU4saUNBQU0sS0FBTixpQ0FBTSxRQWV0QjtBQUNMLENBQUMsRUE3QmdCLDBCQUEwQixLQUExQiwwQkFBMEIsUUE2QjFDO0FBVUQsY0FBYztBQUNQLElBQVUsdUJBQXVCLENBNkN2QztBQTdDRCxXQUFpQix1QkFBdUI7SUFDdkIsOENBQXNCLEdBQUcsQ0FBQyxDQUFDO0lBRXhDLFNBQWdCLFVBQVUsQ0FBQyxRQUFpQyxFQUFFLE9BQXVDO1FBQ2pHLE1BQU0sTUFBTSxHQUE0QjtZQUNwQyxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7WUFDbkIsT0FBTyxFQUFFLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDckYsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO1lBQ25CLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUTtZQUMzQixPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU87WUFDekIsV0FBVyxFQUFFLFFBQVEsQ0FBQyxXQUFXO1lBQ2pDLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRTtZQUNmLFNBQVMsRUFBRSxRQUFRLENBQUMsU0FBUztZQUM3QixVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVU7WUFDL0IsZUFBZSxFQUFFLFFBQVEsQ0FBQyxlQUFlO1lBQ3pDLE1BQU0sRUFBRSwwQkFBMEIsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7U0FDeEU7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBZmUsa0NBQVUsYUFlekI7SUFFRCxTQUFnQixXQUFXLENBQUMsUUFBdUM7UUFDL0QsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUM5QixNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBOEIsS0FBSyxDQUFDLENBQUM7UUFDN0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM1QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBZ0MsQ0FBQztTQUN6RjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFQZSxtQ0FBVyxjQU8xQjtJQUVELFNBQWdCLGFBQWE7UUFDekIsTUFBTSxNQUFNLEdBQTRCO1lBQ3BDLElBQUksRUFBRSxrREFBUSxDQUFDLEtBQUs7WUFDcEIsT0FBTyxFQUFFLEVBQUU7WUFDWCxJQUFJLEVBQUUsa0JBQWtCLENBQUMsUUFBUSxDQUFDLElBQUk7WUFDdEMsUUFBUSxFQUFFLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxRQUFRO1lBQzlDLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsT0FBTztZQUM1QyxXQUFXLEVBQUUsa0JBQWtCLENBQUMsUUFBUSxDQUFDLFdBQVc7WUFDcEQsRUFBRSxFQUFFLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ2xDLFNBQVMsRUFBRSwwQkFBMEIsQ0FBQyxnQkFBZ0I7WUFDdEQsVUFBVSxFQUFFLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxVQUFVO1lBQ2xELGVBQWUsRUFBRSw4Q0FBc0I7WUFDdkMsTUFBTSxFQUFFLFNBQVM7U0FDcEI7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBZmUscUNBQWEsZ0JBZTVCO0FBQ0wsQ0FBQyxFQTdDZ0IsdUJBQXVCLEtBQXZCLHVCQUF1QixRQTZDdkM7QUFnQkQsY0FBYztBQUNQLElBQVUsMkJBQTJCLENBdUQzQztBQXZERCxXQUFpQiwyQkFBMkI7SUFDM0IsaURBQXFCLEdBQUcsSUFBSSxDQUFDO0lBRTFDLFNBQWdCLHdCQUF3QixDQUFDLFVBQXVDO1FBQzVFLE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUM7UUFDL0MsSUFBSSxPQUFPLGFBQWEsS0FBSyxRQUFRLEVBQUU7WUFDbkMsT0FBTyxhQUFhLENBQUM7U0FDeEI7YUFBTTtZQUNILE9BQU8sU0FBUyxDQUFDO1NBQ3BCO0lBQ0wsQ0FBQztJQVBlLG9EQUF3QiwyQkFPdkM7SUFFRCxTQUFnQixVQUFVLENBQUMsUUFBcUM7UUFDNUQsTUFBTSxNQUFNLEdBQWdDO1lBQ3hDLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtZQUNuQixPQUFPLEVBQUUsRUFBRTtZQUNYLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtZQUNuQixRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7WUFDM0IsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPO1lBQ3pCLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVztZQUNqQyxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUU7WUFDZixTQUFTLEVBQUUsUUFBUSxDQUFDLFNBQVM7WUFDN0IsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVO1lBQy9CLGNBQWMsRUFBRSxRQUFRLENBQUMsY0FBYztZQUN2QyxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUs7WUFDckIsTUFBTSxFQUFFLDBCQUEwQixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUNyRSxhQUFhLEVBQUUsUUFBUSxDQUFDLGFBQWE7WUFDckMsY0FBYyxFQUFFLDZEQUFlLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxjQUFjLENBQWM7U0FDbkY7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBbEJlLHNDQUFVLGFBa0J6QjtJQUVELFNBQWdCLGFBQWEsQ0FBQyxnQkFBMkIsRUFBRSxFQUFFLGNBQTBCLEVBQUUsS0FBSyxHQUFHLEVBQUU7UUFDL0YsTUFBTSxNQUFNLEdBQWdDO1lBQ3hDLElBQUksRUFBRSxrREFBUSxDQUFDLFNBQVM7WUFDeEIsT0FBTyxFQUFFLEVBQUU7WUFDWCxJQUFJLEVBQUUsa0JBQWtCLENBQUMsUUFBUSxDQUFDLElBQUk7WUFDdEMsUUFBUSxFQUFFLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxRQUFRO1lBQzlDLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsT0FBTztZQUM1QyxXQUFXLEVBQUUsa0JBQWtCLENBQUMsUUFBUSxDQUFDLFdBQVc7WUFDcEQsRUFBRSxFQUFFLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ2xDLFNBQVMsRUFBRSwwQkFBMEIsQ0FBQyxnQkFBZ0I7WUFDdEQsVUFBVSxFQUFFLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxVQUFVO1lBQ2xELGNBQWMsRUFBRSwyQkFBMkIsQ0FBQyxxQkFBcUI7WUFDakUsS0FBSztZQUNMLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLGFBQWE7WUFDYixjQUFjO1NBQ2pCO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQWxCZSx5Q0FBYSxnQkFrQjVCO0lBRUQsU0FBZ0IsaUJBQWlCLENBQUMsYUFBd0I7UUFDdEQsT0FBTyw2REFBZSxDQUFDLEVBQUUsRUFBRSxhQUFhLENBQWM7SUFDMUQsQ0FBQztJQUZlLDZDQUFpQixvQkFFaEM7QUFDTCxDQUFDLEVBdkRnQiwyQkFBMkIsS0FBM0IsMkJBQTJCLFFBdUQzQztBQWFELGNBQWM7QUFDUCxJQUFVLDZCQUE2QixDQXFEN0M7QUFyREQsV0FBaUIsNkJBQTZCO0lBRzFDLFNBQWdCLGlCQUFpQixDQUFDLFVBQThCO1FBQzVELFFBQVEsVUFBVSxDQUFDLElBQUksRUFBRTtZQUNyQixLQUFLLGtEQUFRLENBQUMsR0FBRyxDQUFDO1lBQ2xCLEtBQUssa0RBQVEsQ0FBQyxNQUFNLENBQUM7WUFDckIsS0FBSyxrREFBUSxDQUFDLEtBQUssQ0FBQztZQUNwQixLQUFLLGtEQUFRLENBQUMsU0FBUztnQkFDbkIsT0FBTyxJQUFJLENBQUM7WUFDaEIsS0FBSyxrREFBUSxDQUFDLE1BQU07Z0JBQ2hCLE9BQU8sS0FBSyxDQUFDO1lBQ2pCO2dCQUNJLE1BQU0sSUFBSSx3RUFBb0IsQ0FBQyxtQkFBbUIsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDNUU7SUFDTCxDQUFDO0lBWmUsK0NBQWlCLG9CQVloQztJQUVELFNBQWdCLFVBQVUsQ0FBQyxRQUF1QyxFQUFFLE9BQTJCO1FBQzNGLE1BQU0sTUFBTSxHQUFrQztZQUMxQyxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7WUFDbkIsT0FBTyxFQUFFLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDckYsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO1lBQ25CLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUTtZQUMzQixPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU87WUFDekIsV0FBVyxFQUFFLFFBQVEsQ0FBQyxXQUFXO1lBQ2pDLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRTtZQUNmLFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVTtTQUNsQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFaZSx3Q0FBVSxhQVl6QjtJQUVELFNBQWdCLFdBQVcsQ0FBQyxRQUFvQztRQUM1RCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQzlCLE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxDQUFrQixLQUFLLENBQUMsQ0FBQztRQUNqRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzVCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFvQixDQUFDO1NBQzdFO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQVBlLHlDQUFXLGNBTzFCO0lBRUQsU0FBZ0IsYUFBYSxDQUFDLElBQXNCO1FBQ2hELE1BQU0sTUFBTSxHQUFrQztZQUMxQyxJQUFJO1lBQ0osT0FBTyxFQUFFLEVBQUU7WUFDWCxJQUFJLEVBQUUsa0JBQWtCLENBQUMsUUFBUSxDQUFDLElBQUk7WUFDdEMsUUFBUSxFQUFFLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxRQUFRO1lBQzlDLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsT0FBTztZQUM1QyxXQUFXLEVBQUUsa0JBQWtCLENBQUMsUUFBUSxDQUFDLFdBQVc7WUFDcEQsRUFBRSxFQUFFLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ2xDLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsVUFBVTtTQUNyRDtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFaZSwyQ0FBYSxnQkFZNUI7QUFDTCxDQUFDLEVBckRnQiw2QkFBNkIsS0FBN0IsNkJBQTZCLFFBcUQ3QztBQVdELGNBQWM7QUFDUCxJQUFVLHNCQUFzQixDQWtCdEM7QUFsQkQsV0FBaUIsc0JBQXNCO0lBQ25DLFNBQWdCLFVBQVUsQ0FBQyxNQUE4QjtRQUNyRCxPQUFPLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQTJCLENBQUM7SUFDM0UsQ0FBQztJQUZlLGlDQUFVLGFBRXpCO0lBRUQsU0FBZ0IsZ0JBQWdCLENBQUMsVUFBOEI7UUFDM0QsUUFBUSxVQUFVLENBQUMsSUFBSSxFQUFFO1lBQ3JCLEtBQUssa0RBQVEsQ0FBQyxHQUFHLENBQUM7WUFDbEIsS0FBSyxrREFBUSxDQUFDLE1BQU0sQ0FBQztZQUNyQixLQUFLLGtEQUFRLENBQUMsS0FBSyxDQUFDO1lBQ3BCLEtBQUssa0RBQVEsQ0FBQyxTQUFTO2dCQUNuQixPQUFPLElBQUksQ0FBQztZQUNoQixLQUFLLGtEQUFRLENBQUMsTUFBTTtnQkFDaEIsT0FBTyxLQUFLLENBQUM7WUFDakI7Z0JBQ0ksTUFBTSxJQUFJLHdFQUFvQixDQUFDLG1CQUFtQixFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM1RTtJQUNMLENBQUM7SUFaZSx1Q0FBZ0IsbUJBWS9CO0FBQ0wsQ0FBQyxFQWxCZ0Isc0JBQXNCLEtBQXRCLHNCQUFzQixRQWtCdEM7QUFlRCxnQkFBZ0I7QUFDVCxJQUFVLHdCQUF3QixDQWdCeEM7QUFoQkQsV0FBaUIsd0JBQXdCO0lBQ3JDLFNBQWdCLE1BQU0sQ0FBQyxjQUFrRDtRQUNyRSxNQUFNLE9BQU8sR0FBRyxjQUFjLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDckUsT0FBTztZQUNILElBQUksRUFBRSxrREFBUSxDQUFDLE1BQU07WUFDckIsT0FBTztZQUNQLElBQUksRUFBRSxHQUFHO1lBQ1QsUUFBUSxFQUFFLHNEQUFZLENBQUMsT0FBTztZQUM5QixPQUFPLEVBQUUsQ0FBQztZQUNWLFdBQVcsRUFBRSxzREFBWSxDQUFDLEtBQUs7WUFDL0IsRUFBRSxFQUFFLEVBQUU7WUFDTixVQUFVLEVBQUUsS0FBSztZQUNqQixLQUFLLEVBQUUsRUFBRTtZQUNULGNBQWMsRUFBRSxLQUFLO1NBQ3hCO0lBQ0wsQ0FBQztJQWRlLCtCQUFNLFNBY3JCO0FBQ0wsQ0FBQyxFQWhCZ0Isd0JBQXdCLEtBQXhCLHdCQUF3QixRQWdCeEM7QUFZRCxjQUFjO0FBQ1AsSUFBVSxvQkFBb0IsQ0FxTHBDO0FBckxELFdBQWlCLG9CQUFvQjtJQWlCakMsSUFBaUIsUUFBUSxDQThCeEI7SUE5QkQsV0FBaUIsUUFBUTtRQUNSLGlCQUFRLEdBQWtDO1lBQ25ELGtCQUFrQixFQUFFLElBQUk7WUFDeEIsZUFBZSxFQUFFLElBQUk7WUFDckIsY0FBYyxFQUFFLElBQUk7WUFDcEIsZ0JBQWdCLEVBQUUsS0FBSztZQUN2Qix3QkFBd0IsRUFBRSxJQUFJO1lBQzlCLG9CQUFvQixFQUFFLElBQUk7WUFDMUIsY0FBYyxFQUFFLHdEQUFjLENBQUMsSUFBSTtZQUNuQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3RCLHFCQUFxQixFQUFFLElBQUk7WUFDM0IsZ0JBQWdCLEVBQUUsRUFBRTtZQUNwQixZQUFZLEVBQUUsS0FBSztTQUNiLENBQUM7UUFFWCxTQUFnQixVQUFVLENBQUMsUUFBa0I7WUFDekMsT0FBTztnQkFDSCxrQkFBa0IsRUFBRSxRQUFRLENBQUMsa0JBQWtCO2dCQUMvQyxlQUFlLEVBQUUsUUFBUSxDQUFDLGVBQWU7Z0JBQ3pDLGNBQWMsRUFBRSxRQUFRLENBQUMsY0FBYztnQkFDdkMsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLGdCQUFnQjtnQkFDM0Msd0JBQXdCLEVBQUUsUUFBUSxDQUFDLHdCQUF3QjtnQkFDM0Qsb0JBQW9CLEVBQUUsUUFBUSxDQUFDLG9CQUFvQjtnQkFDbkQsY0FBYyxFQUFFLFFBQVEsQ0FBQyxjQUFjO2dCQUN2QyxtQkFBbUIsRUFBRSxRQUFRLENBQUMsbUJBQW1CO2dCQUNqRCxxQkFBcUIsRUFBRSxRQUFRLENBQUMscUJBQXFCO2dCQUNyRCxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsZ0JBQWdCO2dCQUMzQyxZQUFZLEVBQUUsUUFBUSxDQUFDLFlBQVk7YUFDdEM7UUFDTCxDQUFDO1FBZGUsbUJBQVUsYUFjekI7SUFDTCxDQUFDLEVBOUJnQixRQUFRLEdBQVIsNkJBQVEsS0FBUiw2QkFBUSxRQThCeEI7SUFlRCxJQUFpQixVQUFVLENBMEIxQjtJQTFCRCxXQUFpQixVQUFVO1FBQ3ZCLFNBQWdCLFVBQVUsQ0FBQyxRQUFvQjtZQUMzQyxPQUFPO2dCQUNILFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVztnQkFDakMsZUFBZSxFQUFFLFFBQVEsQ0FBQyxlQUFlO2dCQUN6QyxvQkFBb0IsRUFBRSxRQUFRLENBQUMsb0JBQW9CO2dCQUNuRCx3QkFBd0IsRUFBRSxRQUFRLENBQUMsd0JBQXdCO2dCQUMzRCxtQkFBbUIsRUFBRSxRQUFRLENBQUMsbUJBQW1CO2dCQUNqRCx1QkFBdUIsRUFBRSxRQUFRLENBQUMsdUJBQXVCO2dCQUN6RCxZQUFZLEVBQUUsUUFBUSxDQUFDLFlBQVk7Z0JBQ25DLGNBQWMsRUFBRSxRQUFRLENBQUMsY0FBYztnQkFDdkMsZUFBZSxFQUFFLFFBQVEsQ0FBQyxlQUFlO2FBQzVDO1FBQ0wsQ0FBQztRQVplLHFCQUFVLGFBWXpCO1FBRVksbUJBQVEsR0FBb0M7WUFDckQsV0FBVyxFQUFFLENBQUM7WUFDZCxlQUFlLEVBQUUsQ0FBQztZQUNsQixvQkFBb0IsRUFBRSxDQUFDO1lBQ3ZCLHdCQUF3QixFQUFFLHNEQUFZLENBQUMsS0FBSztZQUM1QyxtQkFBbUIsRUFBRSxFQUFFO1lBQ3ZCLHVCQUF1QixFQUFFLHNEQUFZLENBQUMsS0FBSztZQUMzQyxZQUFZLEVBQUUsRUFBRTtZQUNoQixjQUFjLEVBQUUsR0FBRztZQUNuQixlQUFlLEVBQUUsR0FBRztTQUNkLENBQUM7SUFDZixDQUFDLEVBMUJnQixVQUFVLEdBQVYsK0JBQVUsS0FBViwrQkFBVSxRQTBCMUI7SUFZRCxJQUFpQixNQUFNLENBc0J0QjtJQXRCRCxXQUFpQixNQUFNO1FBQ25CLFNBQWdCLFVBQVUsQ0FBQyxRQUFnQjtZQUN2QyxPQUFPO2dCQUNILElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtnQkFDbkIsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO2dCQUN2QixLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUs7Z0JBQ3JCLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSztnQkFDckIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRO2dCQUMzQixRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7Z0JBQzNCLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVzthQUNwQztRQUNMLENBQUM7UUFWZSxpQkFBVSxhQVV6QjtRQUVZLGVBQVEsR0FBZ0M7WUFDakQsSUFBSSxFQUFFLDhDQUFJLENBQUMsR0FBRztZQUNkLE1BQU0sRUFBRSxvQkFBb0I7WUFDNUIsS0FBSyxFQUFFLE1BQU07WUFDYixRQUFRLEVBQUUsVUFBVTtZQUNwQixRQUFRLEVBQUUsVUFBVTtZQUNwQixLQUFLLEVBQUUsT0FBTztZQUNkLFdBQVcsRUFBRSxpQkFBaUI7U0FDeEIsQ0FBQztJQUNmLENBQUMsRUF0QmdCLE1BQU0sR0FBTiwyQkFBTSxLQUFOLDJCQUFNLFFBc0J0QjtJQUVELFNBQWdCLFFBQVEsQ0FBQyxNQUE0QjtRQUNqRCxPQUFPLFVBQVUsSUFBSSxNQUFNLENBQUM7SUFDaEMsQ0FBQztJQUZlLDZCQUFRLFdBRXZCO0lBRUQsU0FBZ0IsYUFBYTtRQUN6QixNQUFNLE1BQU0sR0FBeUI7WUFDakMsSUFBSSxFQUFFLFNBQVM7WUFDZixXQUFXLEVBQUUsRUFBRTtZQUNmLFVBQVUsRUFBRSxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsUUFBUTtZQUNwRCxRQUFRLEVBQUUsb0JBQW9CLENBQUMsUUFBUSxDQUFDLFFBQVE7WUFDaEQsTUFBTSxFQUFFLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxRQUFRO1lBQzVDLFFBQVEsRUFBRSxJQUFJO1NBQ2pCO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQVZlLGtDQUFhLGdCQVU1QjtJQUVELFNBQWdCLFVBQVUsQ0FBQyxNQUE0QjtRQUNuRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNsQixPQUFPLDBCQUEwQixDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN4RDthQUFNO1lBQ0gsTUFBTSxNQUFNLEdBQXlCO2dCQUNqQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQzVGLFdBQVcsRUFBRSxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztnQkFDckUsUUFBUSxFQUFFLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztnQkFDbkUsVUFBVSxFQUFFLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztnQkFDekUsTUFBTSxFQUFFLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDN0QsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO2FBQzVCO1lBQ0QsT0FBTyxNQUFNLENBQUM7U0FDakI7SUFDTCxDQUFDO0lBZGUsK0JBQVUsYUFjekI7SUFFRCxTQUFnQixlQUFlLENBQUMsUUFBc0M7UUFDbEUsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUM5QixNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBNkIsS0FBSyxDQUFDLENBQUM7UUFDNUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM1QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsMEJBQTBCLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2xFO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQVBlLG9DQUFlLGtCQU85QjtJQUVEOzs7O09BSUc7SUFDSCxTQUFnQixZQUFZLENBQUMsWUFBa0M7UUFDM0QsT0FBTyxrRUFBYyxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUF5QixDQUFDO0lBQ3RGLENBQUM7SUFGZSxpQ0FBWSxlQUUzQjtJQUVEOzs7T0FHRztJQUNILFNBQWdCLGNBQWMsQ0FBQyxjQUFvQztRQUMvRCxPQUFPLGtFQUFjLENBQUMsZUFBZSxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQXlCLENBQUM7SUFDekYsQ0FBQztJQUZlLG1DQUFjLGlCQUU3QjtBQUNMLENBQUMsRUFyTGdCLG9CQUFvQixLQUFwQixvQkFBb0IsUUFxTHBDO0FBU0QsY0FBYztBQUNQLElBQVUsMEJBQTBCLENBd0MxQztBQXhDRCxXQUFpQiwwQkFBMEI7SUFRdkMsSUFBaUIsTUFBTSxDQWdCdEI7SUFoQkQsV0FBaUIsTUFBTTtRQUNuQixTQUFnQixVQUFVLENBQUMsUUFBZ0I7WUFDdkMsT0FBTztnQkFDSCxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUs7Z0JBQ3JCLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTtnQkFDdkIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO2dCQUNuQixHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUc7YUFDcEI7UUFDTCxDQUFDO1FBUGUsaUJBQVUsYUFPekI7UUFFWSxlQUFRLEdBQXNDO1lBQ3ZELEtBQUssRUFBRSxJQUFJO1lBQ1gsTUFBTSxFQUFFLElBQUk7WUFDWixJQUFJLEVBQUUsSUFBSTtZQUNWLEdBQUcsRUFBRSxJQUFJO1NBQ0gsQ0FBQztJQUNmLENBQUMsRUFoQmdCLE1BQU0sR0FBTixpQ0FBTSxLQUFOLGlDQUFNLFFBZ0J0QjtJQUVELFNBQWdCLFVBQVUsQ0FBQyxRQUFvQztRQUMzRCxNQUFNLE1BQU0sR0FBK0I7WUFDdkMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ2hHLFdBQVcsRUFBRSxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztZQUN2RSxRQUFRLEVBQUUsb0JBQW9CLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1lBQ3JFLFVBQVUsRUFBRSxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7WUFDM0UsTUFBTSxFQUFFLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUMvRCxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7WUFDM0IsYUFBYSxFQUFFLFFBQVEsQ0FBQyxhQUFhO1lBQ3JDLE1BQU0sRUFBRSwwQkFBMEIsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFDckUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRO1NBQzlCO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQWJlLHFDQUFVLGFBYXpCO0FBQ0wsQ0FBQyxFQXhDZ0IsMEJBQTBCLEtBQTFCLDBCQUEwQixRQXdDMUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDL21Ca0U7QUFHUztBQUl0QjtBQUMrQjtBQUNOO0FBRS9FLGNBQWM7QUFDUCxNQUFNLGtCQUFtQixTQUFRLDhEQUFZO0lBa0RoRCxnQkFBZ0I7SUFDaEI7SUFDSSxnQkFBZ0I7SUFDQyxPQUFvQztJQUNyRCxnQkFBZ0I7SUFDQyxPQUFzQjtJQUN2QyxnQkFBZ0I7SUFDQyxjQUE2QjtJQUM5QyxnQkFBZ0I7SUFDQyxRQUFxQjtJQUN0QyxnQkFBZ0I7SUFDQyxzQkFBdUU7SUFDeEYsZ0JBQWdCO0lBQ0MsVUFBK0M7SUFDaEUsZ0JBQWdCO0lBQ0MsVUFBK0M7SUFDaEUsZ0JBQWdCO0lBQ0MsV0FBaUQ7SUFDbEUsZ0JBQWdCO0lBQ0MsVUFBK0M7UUFFaEUsS0FBSyxFQUFFLENBQUM7UUFsQlMsWUFBTyxHQUFQLE9BQU8sQ0FBNkI7UUFFcEMsWUFBTyxHQUFQLE9BQU8sQ0FBZTtRQUV0QixtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUU3QixhQUFRLEdBQVIsUUFBUSxDQUFhO1FBRXJCLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBaUQ7UUFFdkUsZUFBVSxHQUFWLFVBQVUsQ0FBcUM7UUFFL0MsZUFBVSxHQUFWLFVBQVUsQ0FBcUM7UUFFL0MsZ0JBQVcsR0FBWCxXQUFXLENBQXNDO1FBRWpELGVBQVUsR0FBVixVQUFVLENBQXFDO1FBaERwRSxnQkFBZ0I7UUFDUixvQkFBZSxHQUFHLEtBQUssQ0FBQztRQW1ENUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQztRQUV2QyxJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7UUFDNUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztRQUM1QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFFakMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFdkUsSUFBSSxDQUFDLCtDQUErQyxFQUFFLENBQUM7SUFDM0QsQ0FBQztJQXZERCxJQUFJLEtBQUssS0FBYSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzNDLElBQUksTUFBTSxLQUFhLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDN0MsSUFBSSxNQUFNLEtBQW9CLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDcEQsaUZBQWlGO0lBQ2pGLElBQUksYUFBYSxLQUFnQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQzlELElBQUksYUFBYSxLQUFnQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQzlELElBQUksT0FBTyxLQUFjLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQy9ELElBQUksU0FBUyxLQUFtQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUN4RixJQUFJLEdBQUcsS0FBVSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLElBQUksS0FBSyxLQUFhLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2xELElBQUksYUFBYSxLQUFvQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLElBQUksUUFBUSxLQUFjLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNsRCxJQUFJLE9BQU8sS0FBYyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ2hELElBQUksS0FBSyxLQUE0QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzFELHlDQUF5QztJQUN6QyxJQUFJLFlBQVksS0FBNEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUN4RSxpRkFBaUY7SUFDakYsSUFBSSxPQUFPLEtBQWtCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUF3Q3BELGdCQUFnQjtJQUNoQixPQUFPO1FBQ0gsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztRQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxrRUFBa0U7SUFDbEUsVUFBVTtRQUNOLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSTtRQUNBLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSTtRQUNBLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsYUFBYSxHQUFHLEtBQUs7UUFDdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUs7UUFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNILE9BQU8sQ0FBQyxLQUFhLEVBQUUsTUFBYztRQUNqQyxJQUFJLFlBQVksR0FBdUIsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUNwRCxJQUFJLFlBQVksQ0FBQyxRQUFRLElBQUksWUFBWSxDQUFDLEtBQUssSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRTtZQUM3RSxNQUFNLElBQUksK0RBQVcsQ0FBQyxTQUFTLEVBQUUsaURBQWlELENBQUMsQ0FBQztTQUN2RjthQUFNO1lBQ0gsSUFBSSxpQkFBOEIsQ0FBQztZQUNuQyxHQUFHO2dCQUNDLGlCQUFpQixHQUFHLFlBQVksQ0FBQztnQkFDakMsWUFBWSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUM7YUFDdEMsUUFBUSxZQUFZLEtBQUssSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUU7WUFFakYsSUFBSSxZQUFZLEtBQUssSUFBSSxFQUFFO2dCQUN2Qix5QkFBeUI7Z0JBQ3pCLE9BQU8sS0FBSyxDQUFDO2FBQ2hCO2lCQUFNO2dCQUNILGdDQUFnQztnQkFDaEMsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQzdELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDcEMsSUFBSSxXQUFXLEtBQUssSUFBSSxFQUFFO29CQUN0QixNQUFNLElBQUksdUVBQW1CLENBQUMsYUFBYSxDQUFDLENBQUM7aUJBQ2hEO3FCQUFNO29CQUNILE1BQU0sT0FBTyxHQUFHLFNBQVMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO29CQUV4RCxNQUFNLFVBQVUsR0FBRyxXQUFXLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDdEUsTUFBTSxVQUFVLEdBQUcsQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLEdBQUcsR0FBRyxDQUFDO29CQUNoRCxNQUFNLEtBQUssR0FBRyxDQUFDLGlCQUFpQixDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUU3RixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7d0JBQ3ZELE1BQU0sdUJBQXVCLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDN0QsSUFBSSx1QkFBdUIsS0FBSyxpQkFBaUIsRUFBRTs0QkFDL0MsdUJBQXVCLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQzt5QkFDN0M7NkJBQU07NEJBQ0gsdUJBQXVCLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQzt5QkFDekM7cUJBQ0o7b0JBRUQsWUFBWSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFFL0IsT0FBTyxJQUFJLENBQUM7aUJBQ2Y7YUFDSjtTQUNKO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUN4QjtJQUNMLENBQUM7SUFFRCxrREFBa0Q7SUFDbEQsZ0JBQWdCLENBQUMsVUFBK0I7UUFDNUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFeEIsSUFBSSxDQUFDLHNEQUFVLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUM7U0FDeEU7YUFBTTtZQUNILE1BQU0sTUFBTSxHQUFHLCtEQUFtQixDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDOUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDO1lBQzNDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUNqQyxJQUFJLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7WUFFM0MsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRXBDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3RFLElBQUksQ0FBQywrQ0FBK0MsRUFBRSxDQUFDO1lBRXZELElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUU7Z0JBQzlCLElBQUksSUFBSSxDQUFDLG9DQUFvQyxLQUFLLFNBQVMsRUFBRTtvQkFDekQsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ2xFO2dCQUNELElBQUksSUFBSSxDQUFDLDJCQUEyQixLQUFLLFNBQVMsRUFBRTtvQkFDaEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDckQsSUFBSTt3QkFDQSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3FCQUNyRTs0QkFBUzt3QkFDTixJQUFJLENBQUMsY0FBYyxDQUFDLDRCQUE0QixFQUFFLENBQUM7cUJBQ3REO2lCQUNKO2dCQUNELElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2FBQy9CO1lBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUM3QjtJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsUUFBUTtRQUNKLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsV0FBVyxDQUFDLEtBQThCO1FBQ3RDLE1BQU0sYUFBYSxHQUFHLHdEQUFVLENBQUMsSUFBSSxDQUFDLE1BQWlDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDaEYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUEwQixDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7T0FHRztJQUNILFFBQVEsQ0FBQyxLQUFnQjtRQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVEsQ0FBQyxLQUFhO1FBQ2xCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsTUFBTSxDQUFDLEdBQVE7UUFDWCxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7SUFDekIsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixhQUFhLENBQUMsS0FBYztRQUN4QixJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFO1lBQzlCLElBQUksSUFBSSxDQUFDLG9DQUFvQyxLQUFLLFNBQVMsRUFBRTtnQkFDekQsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQzthQUMxRDtTQUNKO1FBRUQsSUFBSSxLQUFLLEVBQUU7WUFDUCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDaEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7Z0JBQ3JCLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7b0JBQ3pDLElBQUksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLENBQUM7aUJBQzFDO3FCQUFNO29CQUNILElBQUksQ0FBQywwQkFBMEIsR0FBRyxLQUFLLENBQUM7b0JBQ3hDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ3hELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztpQkFDbkI7YUFDSjtpQkFBTTtnQkFDSCxJQUFJLElBQUksQ0FBQywwQkFBMEIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLEVBQUU7b0JBQzlFLElBQUksQ0FBQywwQkFBMEIsR0FBRyxLQUFLLENBQUM7b0JBQ3hDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ3hELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztpQkFDbkI7YUFDSjtTQUNKO2FBQU07WUFDSCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7Z0JBQ3RCLElBQUksQ0FBQywwQkFBMEIsR0FBRyxLQUFLLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzthQUNuQjtTQUNKO0lBQ0wsQ0FBQztJQUVELG9CQUFvQjtRQUNoQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsdURBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsYUFBNEI7UUFDekMsSUFBSSxhQUFhLEtBQUssSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QyxJQUFJLENBQUMsY0FBYyxHQUFHLGFBQWEsQ0FBQztZQUVwQyxJQUFJLENBQUMsaUNBQWlDLEVBQUUsQ0FBQztTQUM1QztJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsYUFBYSxDQUFDLEtBQWEsRUFBRSxNQUFjO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQ3RCLDZEQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN0Qyw4REFBZ0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXhDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx1REFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNoQixDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLFlBQVk7UUFDUixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLG1CQUFtQjtRQUNmLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx1REFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsa0JBQWtCO1FBQ2QsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFDakMsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixJQUFJO1FBQ0EsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRTtZQUM5QixJQUFJLElBQUksQ0FBQywyQkFBMkIsS0FBSyxTQUFTLEVBQUU7Z0JBQ2hELElBQUksQ0FBQyxjQUFjLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JELElBQUk7b0JBQ0EsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDckU7d0JBQVM7b0JBQ04sSUFBSSxDQUFDLGNBQWMsQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO2lCQUN0RDthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxpQkFBaUIsQ0FBQyxLQUFhLEVBQUUsTUFBYyxFQUFFLEtBQWM7UUFDM0QsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLE1BQU0sSUFBSSxNQUFNLEtBQUssSUFBSSxDQUFDLE9BQU8sSUFBSSxLQUFLLEVBQUU7WUFDM0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFDcEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7WUFDdEIsNkRBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLDhEQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFeEMsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRTtnQkFDOUIsSUFBSSxDQUFDLHVDQUF1QyxFQUFFLENBQUM7YUFDbEQ7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7YUFDdkM7U0FDSjtJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsNEJBQTRCO1FBQ3hCLElBQUksSUFBSSxDQUFDLDJCQUEyQixLQUFLLFNBQVMsRUFBRTtZQUNoRCxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2xFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDcEIsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7U0FDdkM7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IsaUNBQWlDO1FBQ3JDLElBQUksSUFBSSxDQUFDLGdDQUFnQyxLQUFLLFNBQVMsRUFBRTtZQUNyRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQzFDLE1BQU0sYUFBYSxHQUFHLG1FQUF5QixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQy9ELElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1NBQzdFO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNSLCtDQUErQztRQUNuRCxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFO1lBQzlCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7U0FDM0M7YUFBTTtZQUNILElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUMsQ0FBQyxpQ0FBaUM7U0FDdkU7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IsdUNBQXVDO1FBQzNDLElBQUksQ0FBQyxjQUFjLENBQUMsZ0NBQWdDLEVBQUUsQ0FBQztRQUN2RCxJQUFJO1lBQ0EsSUFBSSxDQUFDLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN0RDtnQkFBUztZQUNOLElBQUksQ0FBQyxjQUFjLENBQUMsOEJBQThCLEVBQUUsQ0FBQztTQUN4RDtJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDUiw0QkFBNEI7UUFDaEMsSUFBSSxJQUFJLENBQUMsMEJBQTBCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQzlFLElBQUksQ0FBQywwQkFBMEIsR0FBRyxLQUFLLENBQUM7WUFDeEMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ25CO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNSLFFBQVE7UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUVELGdCQUFnQjtJQUNSLFFBQVE7UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxnQkFBZ0I7SUFDUixnQkFBZ0I7UUFDcEIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1NBQzdCO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzNHLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3RkMkg7QUFDOUQ7QUFDMkI7QUFFcEM7QUFFQztBQUNOO0FBQ2tEO0FBRWxHOzs7Ozs7Ozs7O0dBVUc7QUFFSSxNQUFNLGFBQWMsU0FBUSw4REFBWTtJQVUzQzs7OztPQUlHO0lBQ0g7SUFDSSxnQkFBZ0I7SUFDUixPQUFtQztJQUMzQyxnQkFBZ0I7SUFDUixrQkFBd0I7SUFDaEMsZ0JBQWdCO0lBQ1IsY0FBNkI7UUFFckMsS0FBSyxFQUFFLENBQUM7UUFOQSxZQUFPLEdBQVAsT0FBTyxDQUE0QjtRQUVuQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQU07UUFFeEIsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFJckMsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDNUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztRQUNsQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVELFFBQVE7O1FBQ0osSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLEtBQUssRUFBRTtZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxDQUFDLENBQUM7U0FDdkU7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDeEMsTUFBTSxnQkFBZ0IsR0FBRyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUM7UUFFakQsSUFBSSxJQUFtQixDQUFDO1FBQ3hCLElBQUksR0FBa0IsQ0FBQztRQUN2QixJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSSxFQUFFO1lBQzdCLElBQUksR0FBRyxJQUFJLENBQUM7WUFDWixHQUFHLEdBQUcsSUFBSSxDQUFDO1NBQ2Q7YUFBTTtZQUNILElBQUksR0FBRyxVQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sbUNBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUM7WUFDbkUsR0FBRyxHQUFHLFVBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxtQ0FBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQztTQUNwRTtRQUVELE1BQU0sTUFBTSxHQUFzQztZQUM5QyxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLEtBQUs7WUFDakMsTUFBTSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxNQUFNO1lBQ25DLElBQUk7WUFDSixHQUFHO1NBQ04sQ0FBQztRQUVGLE1BQU0sTUFBTSxHQUErQjtZQUN2QyxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsSUFBSTtZQUMzQixXQUFXLEVBQUUsZ0JBQWdCLENBQUMsV0FBVztZQUN6QyxRQUFRLEVBQUUsZ0JBQWdCLENBQUMsUUFBUTtZQUNuQyxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsVUFBVTtZQUN2QyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsTUFBTTtZQUMvQixNQUFNO1lBQ04sUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUTtZQUMvQixhQUFhLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhO1lBQ3pDLFFBQVEsRUFBRSxJQUFJO1NBQ2pCLENBQUM7UUFFRixPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQsYUFBYTtRQUNULElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxJQUFJLEVBQUU7WUFDN0IsTUFBTSxJQUFJLHVFQUFtQixDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQy9DO1FBQ0QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQztJQUMzQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFNBQVM7UUFDTCxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSSxFQUFFO1lBQzdCLE1BQU0sSUFBSSx1RUFBbUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUMvQztRQUNELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM5QixDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVksR0FBRyxLQUFLO1FBQ3RCLElBQUksWUFBWSxFQUFFO1lBQ2QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztTQUNwQztRQUVELElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUN0QzthQUFNO1lBQ0gsSUFBSTtnQkFDQSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDNUI7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDUixFQUFFO2FBQ0w7U0FDSjtJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLO1FBQ0QsSUFBSSxVQUF1QixDQUFDO1FBQzVCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO1FBRXZDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRTtZQUN4QixPQUFPO1NBQ1Y7UUFFRDs7Ozs7Ozs7VUFRRTtRQUNGLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2pFLE1BQU0sNEJBQTRCLEdBQUcsd0RBQVUsQ0FBQyxFQUFFLEVBQUUsc0JBQXNCLENBQXlCLENBQUM7UUFDcEcsSUFBSSxVQUFVLEdBQUcsNEJBQTRCLENBQUMsSUFBSSxDQUFDO1FBQ25ELElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTtZQUMxQixPQUFPO1NBQ1Y7UUFDRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQztRQUNsRCxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUU7WUFDMUIsTUFBTSxJQUFJLDRFQUF3QixDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ3BEO1FBQ0QsVUFBVSxHQUFHLFVBQVUsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTFFOzs7VUFHRTtRQUNGLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDYixJQUFJLFVBQVUsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDcEMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDM0M7aUJBQU07Z0JBQ0gsVUFBVSxHQUFHLFVBQVUsQ0FBQzthQUMzQjtZQUNELEtBQUssR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztTQUMxQztRQUVELElBQUksVUFBVSxDQUFDLE9BQU8sRUFBRTtZQUNwQix1R0FBdUc7WUFDdkcsT0FBTyxVQUFVLENBQUMsSUFBSSxLQUFLLGtEQUFRLENBQUMsU0FBUyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDOUUsVUFBVSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdEM7WUFFRCw2RkFBNkY7WUFDN0YsSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLGtEQUFRLENBQUMsU0FBUyxFQUFFO2dCQUN4QyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssSUFBSSxFQUFFO29CQUM1QixNQUFNLElBQUksdUVBQW1CLENBQUMsWUFBWSxDQUFDLENBQUM7aUJBQy9DO2dCQUVELE1BQU0sR0FBRyxHQUFHLElBQUksNkRBQVcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxrRkFBNkIsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUMvSCxVQUFVLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUN2RCxHQUFHLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN6QixVQUFVLEdBQUcsR0FBRyxDQUFDO2dCQUNqQixLQUFLLEdBQUcsQ0FBQyxDQUFDO2FBQ2I7U0FDSjtRQUVELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsd0JBQXdCLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRTVGLEtBQUssR0FBRyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDL0YsVUFBVSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDM0MsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFO1lBQ3hELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUNuQjthQUFNO1lBQ0gsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2hCO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxZQUFZO1FBQ2hCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUU3Qjs7OztXQUlHO1FBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRWhFOztXQUVHO1FBQ0gsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1lBQzFDLElBQUksRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSTtZQUNsQyxHQUFHLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUc7WUFDaEMsS0FBSyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLO1lBQ3BDLE1BQU0sRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTTtZQUN0QyxVQUFVLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUs7WUFDekMsV0FBVyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNO1lBQzNDLE9BQU8sRUFBRSxJQUFJO1lBQ2IsT0FBTyxFQUFFLElBQUk7WUFDYixRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLE1BQU0sRUFBRSxJQUFJO1NBQ2YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFNUQsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDckIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsd0JBQXdCLEtBQUssSUFBSSxFQUFFO2dCQUM3RSxNQUFNLEtBQUssR0FBRyxJQUFJLHNFQUFrQixDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3ZELE1BQU0sS0FBSyxDQUFDO2FBQ2Y7aUJBQU07Z0JBQ0gsT0FBTzthQUNWO1NBQ0o7UUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUU7WUFDN0MsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFFL0IsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUNwQixJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7b0JBQ3JELElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRTt3QkFDdEYsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO3FCQUNoQjt5QkFBTTt3QkFDSCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7cUJBQ25CO2dCQUNMLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2FBQ3pCO1FBQ0wsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFdEI7Ozs7O1dBS0c7UUFDSCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IsVUFBVTtRQUNkLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxJQUFJLEVBQUU7WUFDN0IsTUFBTSxJQUFJLHVFQUFtQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQzlDO2FBQU07WUFDSCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRTtnQkFDbEYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7Z0JBQzdELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEtBQUssU0FBUyxFQUFFO29CQUN4QyxhQUFhLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7b0JBQ3hDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxTQUFTLENBQUM7aUJBQ3hDO2FBQ0o7U0FDSjtJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNLLHVCQUF1QjtRQUMzQixJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSSxFQUFFO1lBQzdCLE1BQU0sSUFBSSx1RUFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUM1QztRQUVELGdGQUFnRjtRQUNoRiwwRkFBMEY7UUFDMUYsb0VBQW9FO1FBQ3BFLHdHQUF3RztRQUN4RyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsR0FBRyxDQUFDO1lBQ3ZFLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsR0FBRyxDQUFDO1lBQ3ZFLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVTtZQUM5RCxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRTtZQUVsRSxNQUFNLE1BQU0sR0FBRyxvRUFBc0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQ3JCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFDM0MsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUM5QztZQUVELElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUN2QixJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsRUFDL0YsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQ3JHLENBQUM7U0FDTDtRQUVELElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSyx1QkFBdUIsQ0FBQyxhQUE4QztRQUMxRSxNQUFNLG1CQUFtQixHQUFhLEVBQUUsQ0FBQztRQUV6QyxLQUFLLE1BQU0sR0FBRyxJQUFJLGFBQWEsRUFBRTtZQUM3QixtQkFBbUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUN2RTtRQUVELE9BQU8sbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxTQUFTO1FBQ2IsTUFBTSxVQUFVLEdBQUcsbUJBQW1CLEdBQUcseURBQVcsRUFBRSxDQUFDO1FBQ3ZELE1BQU0sTUFBTSxHQUFHLHlFQUFvQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFL0QsSUFBSTtZQUNBLFlBQVksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUM1RDtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1IsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsR0FBRyw2REFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDaEY7UUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUU5QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQzFELElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUNyQixHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDM0M7UUFFRCxPQUFPLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGFBQWE7UUFDakIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDM0IsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssUUFBUTtRQUNaLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqWXdDO0FBRWdEO0FBQ25DO0FBRUU7QUFFTTtBQUU5RCxnQkFBZ0I7QUFDaEIsTUFBTSxVQUFVO0lBQ1osWUFDcUIsTUFBa0IsRUFDbEIsS0FBdUIsRUFDdkIsTUFBYyxFQUNkLE1BQWM7UUFIZCxXQUFNLEdBQU4sTUFBTSxDQUFZO1FBQ2xCLFVBQUssR0FBTCxLQUFLLENBQWtCO1FBQ3ZCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQy9CLElBQUksTUFBTSxDQUFDLGFBQWEsS0FBSyxLQUFLLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRTtZQUMxRCxNQUFNLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO1NBQ2pFO0lBQ0wsQ0FBQztJQUVELElBQUksS0FBSyxLQUFpQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQy9DLElBQUksSUFBSSxLQUF1QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBRW5ELElBQUksQ0FBQyxJQUFtQjtRQUNwQixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsaUJBQWlCO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsRixDQUFDO0NBQ0o7QUFFRCxnQkFBZ0I7QUFDVCxNQUFNLFVBQVcsU0FBUSw4REFBWTtJQWlCeEMsWUFDcUIsY0FBNkIsRUFDN0IsZUFBd0IsS0FBSyxFQUM3QixVQUE2QixJQUFJO1FBRWxELEtBQUssRUFBRSxDQUFDO1FBSlMsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFDN0IsaUJBQVksR0FBWixZQUFZLENBQWlCO1FBQzdCLFlBQU8sR0FBUCxPQUFPLENBQTBCO1FBbkI5QyxlQUFVLEdBQXFCLElBQUksQ0FBQztRQUNwQyxtQkFBYyxHQUFzQixJQUFJLENBQUM7UUFDekMsa0JBQWEsR0FBd0IsSUFBSSxDQUFDO1FBRTFDLGFBQVEsR0FBaUIsRUFBRSxDQUFDO1FBRW5CLHNCQUFpQixHQUFHLENBQUMsUUFBZ0IsRUFBRSxRQUFnQixFQUFFLEtBQTZCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUcsMEJBQXFCLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBZTdELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDaEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFmRCxJQUFJLGFBQWEsS0FBb0IsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztJQUNsRSxJQUFJLE1BQU0sS0FBd0IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN4RCxJQUFJLEtBQUssS0FBdUIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUN6RCxJQUFZLFlBQVksYUFBaUIsT0FBTyxVQUFJLENBQUMsT0FBTyxtQ0FBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLElBQUksYUFBYSxLQUF3QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztJQUNuRixJQUFZLGFBQWEsQ0FBQyxLQUF5QixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFZMUYsbUJBQW1CO1FBQ3ZCLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUFFO1lBQzlDLE1BQU0sSUFBSSw0RUFBd0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNwRDthQUFNO1lBQ0gsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDNUUsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDO2dCQUNwQixDQUFDLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUk7Z0JBQ3ZDLENBQUMsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRztnQkFDckMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNqQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07YUFDdEIsQ0FBQyxDQUFDO1NBQ047SUFDTCxDQUFDO0lBRU8sWUFBWSxDQUFDLE9BQWUsRUFBRSxPQUFlO1FBQ2pELE1BQU0sV0FBVyxHQUFHLDBFQUE0QixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTdELE9BQU87WUFDSCxDQUFDLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsT0FBTyxHQUFHLFdBQVcsQ0FBQyxJQUFJO1lBQ3hELENBQUMsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLEdBQUcsV0FBVyxDQUFDLEdBQUc7U0FDekQsQ0FBQztJQUNOLENBQUM7SUFFTyxjQUFjLENBQUMsS0FBZ0IsRUFBRSxLQUFjLEVBQUUsS0FBYTtRQUNsRSxPQUFPLENBQ0gsS0FBSyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxVQUFVO1lBQ25ELEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUs7WUFDaEMsS0FBSyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxXQUFXO1lBQ25ELEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FDcEMsQ0FBQztJQUNOLENBQUM7SUFFTyxXQUFXLENBQUMsSUFBbUIsRUFBRSxDQUFTLEVBQUUsQ0FBUztRQUN6RCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksa0RBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRU8sU0FBUyxDQUFDLEtBQWEsRUFBRSxLQUFhO1FBQzFDLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJLEVBQUU7WUFDMUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2hELE9BQU8sQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDNUU7YUFBTTtZQUNILE9BQU8sSUFBSSxDQUFDO1NBQ2Y7SUFDTCxDQUFDO0lBRU8sVUFBVSxDQUFDLE9BQWUsRUFBRSxPQUFlOztRQUMvQyxNQUFNLE1BQU0sR0FBRyxVQUFJLENBQUMsT0FBTywwQ0FBRSxVQUFVLENBQUM7UUFDeEMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNULE1BQU0sSUFBSSx1RUFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUMxQztRQUVELE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNuRSxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsZUFBZSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFcEcsSUFBSSxPQUFPLEVBQUU7WUFDVCxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxFQUFFO2dCQUMxQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQztnQkFFN0MsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO29CQUN0QixNQUFNLElBQUksNEVBQXdCLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQy9DO2dCQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQy9DLE1BQU0sUUFBUSxHQUFHLElBQUksZ0VBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDdkUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQzVDO1NBQ0o7YUFBTTtZQUNILDBFQUEwRTtZQUMxRSxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxJQUFJLFdBQUksQ0FBQyxhQUFhLDBDQUFFLEtBQUssTUFBSyxJQUFJLEVBQUU7Z0JBQ2hFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQzthQUNyQjtTQUNKO1FBRUQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRU8sVUFBVTs7UUFDZCxLQUFLLE1BQU0sTUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDaEMsTUFBTSxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQy9DLFlBQU0sQ0FBQyxVQUFVLDBDQUFFLElBQUksRUFBRSxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1NBQzVCO1FBRUQsVUFBSSxDQUFDLGFBQWEsMENBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN4RCxVQUFJLENBQUMsYUFBYSwwQ0FBRSxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzFCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFFTyxNQUFNLENBQUMsS0FBNkI7UUFDeEMsSUFBSSxNQUFNLEdBQXNCLElBQUksQ0FBQztRQUVyQyxxREFBcUQ7UUFDckQsZ0ZBQWdGO1FBQ2hGLGtIQUFrSDtRQUNsSCxLQUFLLE1BQU0sTUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDaEMsSUFBSSxDQUFDLEdBQXNCLElBQUksQ0FBQztZQUVoQyxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7Z0JBQ2pCLENBQUMsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ3ZEO2lCQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJLEVBQUU7Z0JBQ2pDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2hEO1lBRUQsOEVBQThFO1lBQzlFLG9IQUFvSDtZQUNwSCxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsRUFBRTtnQkFDL0UsTUFBTSxHQUFHLENBQUMsQ0FBQzthQUNkO1NBQ0o7UUFFRCxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN0QyxzRkFBc0Y7WUFDdEYsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssTUFBSyxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsS0FBSyxHQUFFO2dCQUMzRSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsdUJBQXVCLEVBQUUsQ0FBQzthQUNwRTtZQUVELElBQUksTUFBTSxLQUFLLElBQUksRUFBRTtnQkFDakIsb0dBQW9HO2dCQUNwRyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUVwQyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDM0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLENBQUM7YUFDOUM7WUFFRCxJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQztTQUMvQjtJQUNMLENBQUM7SUFFRCx1R0FBdUc7SUFDdkcsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUE0QixFQUFFLE1BQWtCO1FBQ3pELElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxJQUFJLEVBQUU7WUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO1NBQzVFO1FBRUQsT0FBTyxJQUFJLFVBQVUsQ0FBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCw0REFBNEQ7SUFDNUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUE0QixFQUFFLFFBQXNCLEVBQUUsSUFBbUIsRUFBRSxDQUFTLEVBQUUsQ0FBUyxFQUFFLFdBQW9CO1FBQzlILE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUMxRCxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0IsTUFBTSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUM7UUFDaEMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDOUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDdEQsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2pOd0Y7QUFHbEQ7QUFHZTtBQUNBO0FBSzlCO0FBR3hCOzs7OztHQUtHO0FBQ0ksTUFBTSxTQUFVLFNBQVEsOERBQVk7SUFrQnZDOzs7O09BSUc7SUFDSCxZQUNxQixPQUFtQixFQUNuQixjQUE2QixFQUM5QyxDQUFTLEVBQUUsQ0FBUztRQUVwQixLQUFLLEVBQUUsQ0FBQztRQUpTLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFDbkIsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFmMUMsY0FBUyxHQUE0QixJQUFJLENBQUM7UUFvQjlDLElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFFekMsMEZBQTBGO1FBQzFGLGdGQUFnRjtRQUNoRixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxZQUFZLCtDQUFLLEVBQUU7WUFDN0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUNuRSxJQUFJLE1BQU0sRUFBRTtnQkFDUixjQUFjLEdBQUcsTUFBTSxDQUFDO2FBQzNCO1NBQ0o7UUFFRCxJQUFJLENBQUMsYUFBYSxHQUFHLGNBQWMsQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQ2pFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFbkMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sS0FBSyxJQUFJLEVBQUU7WUFDckMscUdBQXFHO1lBQ3JHLE1BQU0sSUFBSSx1RUFBbUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUM3QztRQUVELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQztRQUN6RCxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUM1QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQzlCO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRXRELElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUU7WUFDdkUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDckU7UUFFRCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFckIsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXpDLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUFFO1lBQzdDLE1BQU0sSUFBSSw0RUFBd0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUNsRDtRQUVELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDbEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUEzREQsSUFBSSxPQUFPLEtBQWtCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDcEQsSUFBSSxVQUFVLEtBQWEsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUNyRCxJQUFJLFdBQVcsS0FBYSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELElBQUksYUFBYSxLQUFvQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLElBQUksYUFBYSxLQUFvQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQXlEekUsbUVBQW1FO0lBQzNELHVCQUF1QixDQUFDLFFBQWdCLEVBQUUsUUFBZ0I7O1FBQzlELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLGdDQUFrQyxDQUFDO1FBQzlELE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEQsYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLDBCQUErQixDQUFDO1FBQzNELE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEQsV0FBVyxDQUFDLFNBQVMsQ0FBQyxHQUFHLHNCQUE2QixDQUFDO1FBQ3ZELE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakQsVUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLG9CQUE0QixDQUFDO1FBQ3JELE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEQsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLHdCQUE4QixDQUFDO1FBQ3pELFVBQVUsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDckMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwQyxhQUFhLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXZDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsR0FBRyw0QkFBZ0MsQ0FBQztRQUUxRSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUV2RCxNQUFNLElBQUksR0FBRyxVQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksMENBQUUsSUFBSSxDQUFDO1FBQ3BELElBQUksSUFBSSxFQUFFO1lBQ04sSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLDhDQUFJLENBQUMsS0FBSyxFQUFFLDhDQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDMUMsSUFBSSxDQUFDLDhDQUFJLENBQUMsS0FBSyxFQUFFLDhDQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDOUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsQ0FBQzthQUNoRjtTQUNKO1FBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLDREQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLDREQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkQsVUFBVSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1RCxZQUFZLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxJQUFJLENBQUMsQ0FBUyxFQUFFLENBQVM7UUFDckIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzQixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNLLGVBQWUsQ0FBQyxDQUFTLEVBQUUsQ0FBUztRQUN4QyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsNERBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsNERBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU1QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFOUMsOEdBQThHO1FBQzlHLG9FQUFvRTtRQUNwRSxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFO1lBQzdILElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1NBQ3pCO1FBRUQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBSTtRQUNBLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLENBQUM7UUFFbkMsSUFBSSxJQUFJLEdBQTRCLElBQUksQ0FBQztRQUN6QyxJQUFJLG9CQUFvQixHQUF5QixJQUFJLENBQUM7UUFFdEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7UUFDMUMsSUFBSSxPQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsS0FBSyxNQUFLLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7U0FDdEI7UUFFRDs7VUFFRTtRQUNGLElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtZQUNmLG9CQUFvQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7WUFDM0MsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQzlDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN4RCxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBRXJDOzs7ZUFHRztTQUNGO2FBQU0sSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRTtZQUN4RCxNQUFNLFdBQVcsR0FBRywwRUFBNEIsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUU3RCxNQUFNLE1BQU0sR0FBdUM7Z0JBQy9DLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVTtnQkFDaEQsR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTO2dCQUM3QyxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLO2dCQUMvQixNQUFNLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNO2FBQ3BDO1lBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSx5REFBVyxFQUFFLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzVHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7WUFFbEM7Ozs7ZUFJRztTQUNGO2FBQU07WUFDSCxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsaURBQWlEO1NBQ25GO1FBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUU1RCxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUM1QixvQkFBb0IsYUFBcEIsb0JBQW9CLHVCQUFwQixvQkFBb0IsQ0FBRSxLQUFLLEVBQUUsQ0FBQztTQUNqQztRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGFBQWE7UUFDakIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO1FBQzlELElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTtZQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLCtDQUErQyxDQUFDLENBQUM7U0FDcEU7UUFFRCxJQUFJLEtBQUssR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDO1FBQ3RDLElBQUksTUFBTSxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUM7UUFDeEMsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7WUFDN0MsTUFBTSxJQUFJLEtBQUssQ0FBQyx3REFBd0QsQ0FBQyxDQUFDO1NBQzdFO1FBRUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUM7UUFDM0IsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQztRQUN6RyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsNERBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsNERBQWMsQ0FBQyxNQUFNLENBQUM7UUFDbkQsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQyxNQUFNLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsNERBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyw0REFBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQy9CLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2pRbUYsQ0FBQyw0QkFBNEI7QUFDdkM7QUFDZTtBQUNqQztBQUNOO0FBRUk7QUFFWDtBQUUzQzs7OztHQUlHO0FBQ0ksTUFBTSxVQUFVO0lBUW5CLGdCQUFnQjtJQUNoQjtJQUNJLGdCQUFnQjtJQUNSLGNBQTZCO0lBQ3JDLGdCQUFnQjtJQUNDLFFBQXFCO0lBQ3RDLGdCQUFnQjtJQUNDLDJCQUEwQztJQUMzRCwrRUFBK0U7SUFDdkUsbUJBQXFHO0lBQzdHLGdEQUFnRDtJQUN4QyxlQUFzQztJQUM5QyxnREFBZ0Q7SUFDeEMsTUFBMEI7SUFDbEMsZ0RBQWdEO0lBQ3hDLEdBQXVCO1FBWnZCLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBRXBCLGFBQVEsR0FBUixRQUFRLENBQWE7UUFFckIsZ0NBQTJCLEdBQTNCLDJCQUEyQixDQUFlO1FBRW5ELHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBa0Y7UUFFckcsb0JBQWUsR0FBZixlQUFlLENBQXVCO1FBRXRDLFdBQU0sR0FBTixNQUFNLENBQW9CO1FBRTFCLFFBQUcsR0FBSCxHQUFHLENBQW9CO1FBRS9CLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBRTFCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTNELE1BQU0sbUJBQW1CLEdBQUcsa0ZBQTZCLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9FLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLDBEQUFVLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUVwSCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUo7OztPQUdHO0lBQ0gsT0FBTztRQUNOLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7O09BR0c7SUFDSyxrQkFBa0I7UUFDdEIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFFMUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLDhEQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUN2RixJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssV0FBVyxDQUFDLENBQVMsRUFBRSxDQUFTOztRQUNwQyxNQUFNLElBQUksR0FBRyxXQUFXLENBQUM7UUFDekIsSUFBSSxvQkFBK0MsQ0FBQztRQUVwRCxJQUFJLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixLQUFLLFVBQVUsRUFBRTtZQUNoRCxNQUFNLHVCQUF1QixHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBa0UsQ0FBQztZQUMzSCxrR0FBa0c7WUFDbEcsSUFBSSxVQUFVLENBQUMsK0JBQStCLENBQUMsdUJBQXVCLENBQUMsRUFBRTtnQkFDckUsb0JBQW9CLEdBQUc7b0JBQ25CLElBQUk7b0JBQ0osY0FBYyxFQUFFLHVCQUF1QixDQUFDLEtBQUs7b0JBQzdDLGFBQWEsRUFBRSx1QkFBdUIsQ0FBQyxJQUFJO29CQUMzQyxLQUFLLEVBQUUsNkJBQXVCLENBQUMsS0FBSyxtQ0FBSSxJQUFJLENBQUMsTUFBTTtpQkFDdEQsQ0FBQzthQUNMO2lCQUFNO2dCQUNILG9CQUFvQixHQUFHLHVCQUF1QixDQUFDO2FBQ2xEO1NBQ0o7YUFBTTtZQUNILG9CQUFvQixHQUFHO2dCQUNuQixJQUFJO2dCQUNKLGNBQWMsRUFBRSxJQUFJLENBQUMsZUFBZTtnQkFDcEMsYUFBYSxFQUFFLElBQUksQ0FBQyxtQkFBbUI7Z0JBQ3ZDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDbEIsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHO2FBQ2YsQ0FBQztTQUNMO1FBRUQsb0RBQW9EO1FBQ3BELGtHQUFrRztRQUNsRyxvSUFBb0k7UUFDcEkscUVBQXFFO1FBRXJFLE1BQU0sa0JBQWtCLEdBQUcsK0RBQXlCLENBQUMsT0FBTyxDQUFDLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRTFGLE1BQU0sYUFBYSxHQUFHLElBQUksZ0VBQWEsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLGtCQUFrQixFQUFFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztRQUM5RyxJQUFJLENBQUMsdUJBQXVCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUU5RCxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSSxFQUFFO1lBQzdCLE1BQU0sSUFBSSx1RUFBbUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUNoRDthQUFNO1lBQ0gsTUFBTSxNQUFNLEdBQUcsb0RBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBRXJHLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQztZQUNwRSxJQUFJLG1CQUFtQixLQUFLLElBQUksRUFBRTtnQkFDOUIsTUFBTSxJQUFJLHVFQUFtQixDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQ2hEO2lCQUFNO2dCQUNILE1BQU0sWUFBWSxHQUFHLFlBQU0sQ0FBQyxLQUFLLDBDQUFFLE9BQU8sQ0FBQztnQkFDM0MsSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFO29CQUM1QixNQUFNLElBQUksNEVBQXdCLENBQUMsYUFBYSxDQUFDLENBQUM7aUJBQ3JEO2dCQUVELG1CQUFtQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7YUFDdkU7U0FDSjtJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDUixVQUFVO1FBQ2Qsb0RBQW9EO1FBQ3BELDJEQUEyRDtRQUMzRCxXQUFXO1FBQ1gsNkNBQTZDO1FBQzdDLGdEQUFnRDtRQUNoRCxJQUFJO1FBQ0osSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7T0FHQTtJQUNLLGtCQUFrQjtRQUN6QixJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSSxFQUFHO1lBQ3hCLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7U0FDbkM7SUFDRixDQUFDO0NBQ0Q7QUFFRCxjQUFjO0FBQ2QsV0FBaUIsVUFBVTtJQVF2QixzQ0FBc0M7SUFDdEMsU0FBZ0IsK0JBQStCLENBQzNDLE1BQWtFO1FBRWxFLE9BQU8sQ0FBQyxDQUFDLGVBQWUsSUFBSSxNQUFNLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBSmUsMENBQStCLGtDQUk5QztBQUNMLENBQUMsRUFkZ0IsVUFBVSxLQUFWLFVBQVUsUUFjMUI7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6SytDO0FBRWhELGdCQUFnQjtBQUNULE1BQU0sbUJBQW1CO0lBRzVCO1FBQ0ksZ0RBQWdEO1FBQ2hELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLG9EQUE0QyxDQUFDO1FBQ3hFLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkQsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLHdCQUE4QixDQUFDO1FBQ3pELElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRXhDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsT0FBTztRQUNILElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUFvQixFQUFFLE1BQWM7UUFDOUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLDREQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsNERBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyw0REFBYyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDM0UsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLDREQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO0lBQy9DLENBQUM7SUFFRCxJQUFJO1FBQ0EsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQztJQUM5QyxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7Ozs7OztBQ2hDRCxnQkFBZ0I7QUFDVCxNQUFNLFlBQVk7SUFPckIsWUFBb0IsT0FBZSxFQUFFLEtBQWEsRUFBRSxRQUFnQixFQUFVLFVBQWtDO1FBQTVGLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFBMkMsZUFBVSxHQUFWLFVBQVUsQ0FBd0I7UUFMeEcsd0JBQW1CLEdBQUcsQ0FBQyxFQUFjLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDM0QsNkJBQXdCLEdBQUcsQ0FBQyxFQUFjLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7UUFLekUsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDNUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3JGLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQy9GLElBQUksQ0FBQyxPQUFPLENBQUMsd0JBQXdCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBVkQsSUFBSSxPQUFPLEtBQWtCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFZcEQsT0FBTzs7UUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUMvRSxVQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsMENBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRU8sT0FBTyxDQUFDLEVBQWM7UUFDMUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRU8sWUFBWSxDQUFDLEVBQWM7UUFDL0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN4QixDQUFDO0NBQ0o7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2pDbUU7QUFNZDtBQUNoQjtBQUN1QztBQUM5QjtBQUVFO0FBRWpEOzs7R0FHRztBQUNJLE1BQU0sTUFBTyxTQUFRLDhEQUFZO0lBK0RwQyxnQkFBZ0I7SUFDaEI7SUFDSSxnQkFBZ0I7SUFDUixjQUE2QjtJQUNyQyxnQkFBZ0I7SUFDUixPQUFjLEVBQ3RCLFFBQXlCO0lBQ3pCLGdCQUFnQjtJQUNSLDRCQUFnRSxFQUN4RSxVQUE2QjtJQUM3QixnQkFBZ0I7SUFDUixZQUE0QztJQUNwRCxnQkFBZ0I7SUFDUixvQkFBNEQ7SUFDcEUsZ0JBQWdCO0lBQ1IsV0FBMEM7SUFDbEQsZ0JBQWdCO0lBQ1IsZ0JBQW9EO0lBQzVELGdCQUFnQjtJQUNSLHFCQUE4RDtJQUN0RSxnQkFBZ0I7SUFDUixvQkFBNEQ7SUFDcEUsZ0JBQWdCO0lBQ1Isd0JBQW9FO1FBRTVFLEtBQUssRUFBRSxDQUFDO1FBdEJBLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBRTdCLFlBQU8sR0FBUCxPQUFPLENBQU87UUFHZCxpQ0FBNEIsR0FBNUIsNEJBQTRCLENBQW9DO1FBR2hFLGlCQUFZLEdBQVosWUFBWSxDQUFnQztRQUU1Qyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXdDO1FBRTVELGdCQUFXLEdBQVgsV0FBVyxDQUErQjtRQUUxQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQW9DO1FBRXBELDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBeUM7UUFFOUQseUJBQW9CLEdBQXBCLG9CQUFvQixDQUF3QztRQUU1RCw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQTRDO1FBNURoRixnQkFBZ0I7UUFDQyxtQkFBYyxHQUFHLENBQUMsRUFBYyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZFLGdCQUFnQjtRQUNDLHdCQUFtQixHQUFHLENBQUMsRUFBYyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBR2pGLGdCQUFnQjtRQUNDLHlCQUFvQixHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQXlEakUsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLDBEQUFhLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFDdkQsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxJQUFJLENBQUMsRUFDM0QsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxJQUFJLENBQUMsRUFDMUQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsRUFDN0YsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLCtCQUErQixFQUFFLENBQy9DLENBQUM7UUFFRixJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDM0IsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQztRQUM3QyxJQUFJLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7UUFDN0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxRQUFRLENBQUMsa0JBQWtCLENBQUM7UUFDdkQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztRQUNuRCxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU1QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRywwQkFBK0IsQ0FBQztRQUMzRCxJQUFJLENBQUMseUJBQXlCLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMseUJBQXlCLENBQUMsU0FBUyxDQUFDLEdBQUcsOEJBQWlDLENBQUM7UUFDOUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRS9ELElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNoRixJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUUxRixJQUFJLENBQUMsd0JBQXdCLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQywwQkFBMEIsRUFBRTtRQUN0RixVQUFVLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUVsRyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDO1FBRXBGLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQzFCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLHdEQUFZLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsc0NBQ25FLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsMEJBQTBCLEVBQUUsQ0FDekQsQ0FBQztTQUNMO1FBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLHdEQUFZLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLDRCQUFpQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDO1FBRXBJOztXQUVHO1FBQ0gsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLHdEQUFZLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLGdDQUM3RCxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFDLEVBQUUsQ0FBQyxDQUNuRCxDQUFDO1FBRUY7O1dBRUc7UUFDSCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksd0RBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsMEJBQWdDLEdBQUcsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFFL0csSUFBSSxDQUFDLCtCQUErQixFQUFFLENBQUM7UUFFdkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDbkYsQ0FBQztJQWxHRCxtQkFBbUI7SUFDbkIsaUdBQWlHO0lBRWpHLElBQUksSUFBSSxLQUFjLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDMUMsSUFBSSxJQUFJLEtBQVcsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN2QyxJQUFJLGNBQWMsS0FBYyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0lBRTlELElBQUksYUFBYSxLQUFvQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLElBQUksTUFBTSxLQUFZLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDNUMsSUFBSSxJQUFJLEtBQVksT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDdEQsSUFBSSxtQkFBbUIsS0FBYSxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO0lBRXJGLElBQUksT0FBTyxLQUFrQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ3BELElBQUksb0JBQW9CLEtBQWtCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQy9FLElBQUksd0JBQXdCLEtBQWtCLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQztJQXNGdEY7OztPQUdHO0lBQ0gsT0FBTztRQUNILElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFckIsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7UUFDOUIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztRQUN0QyxJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQztRQUM3QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxTQUFTLENBQUM7UUFDdkMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztRQUN0QyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsU0FBUyxDQUFDO1FBRTFDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFOUIsVUFBVSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDbEYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDbEYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFNBQVMsQ0FBQyxhQUE0QixFQUFFLEtBQWE7UUFDakQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsU0FBUyxDQUFDLGFBQTRCO1FBQ2xDLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsNkJBQTZCLENBQUMsc0JBQXFDO1FBQy9ELElBQUksQ0FBQyxjQUFjLENBQUMsNkJBQTZCLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUMxRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixPQUFPLENBQUMsS0FBVztRQUNmLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyw4Q0FBSSxDQUFDLEtBQUssRUFBRSw4Q0FBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGFBQWE7O1FBQ2pCLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7UUFDaEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsRUFBRSxLQUFLLElBQUksQ0FBQztRQUNoRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUM7UUFFbEQsc0VBQXNFO1FBQ3RFLDBFQUEwRTtRQUMxRSw2RUFBNkU7UUFDN0Usd0JBQXdCO1FBQ3hCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN6RSxNQUFNLEtBQUssR0FBRywwQkFBbUIsYUFBbkIsbUJBQW1CLHVCQUFuQixtQkFBbUIsQ0FBRSxZQUFZLDBDQUFFLEtBQUssTUFBSyxLQUFLLENBQUM7UUFDakUseUVBQTJCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsV0FBVyxJQUFJLEtBQUssQ0FBQyxDQUFDO1FBRTdFLGtGQUFrRjtRQUNsRixtRkFBbUY7UUFDbkYsSUFBSSxNQUFNLEdBQUcsMEJBQW1CLGFBQW5CLG1CQUFtQix1QkFBbkIsbUJBQW1CLENBQUUsWUFBWSwwQ0FBRSxNQUFNLE1BQUssS0FBSyxDQUFDO1FBQ2pFLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGdCQUFnQixFQUFFO1lBQzVELE1BQU0sS0FBTixNQUFNLEdBQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxFQUFFO1NBQ2xDO2FBQU07WUFDSCxNQUFNLEtBQU4sTUFBTSxHQUFNLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxNQUFNLEVBQUU7U0FDMUQ7UUFDRCx5RUFBMkIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVoRSx3SEFBd0g7UUFDeEgsd0RBQXdEO1FBQ3hELE1BQU0sUUFBUSxHQUFHLENBQUMsMEJBQW1CLGFBQW5CLG1CQUFtQix1QkFBbkIsbUJBQW1CLENBQUUsWUFBWSwwQ0FBRSxRQUFRLE1BQUssS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDaEgseUVBQTJCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixpQkFBaUIsQ0FBQyxLQUFjO1FBQzVCLElBQUksS0FBSyxFQUFFO1lBQ1AsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyw0QkFBZ0MsQ0FBQztTQUMvRDthQUFNO1lBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSw0QkFBZ0MsQ0FBQztTQUNsRTtJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsZ0JBQWdCO1FBQ1osSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLFNBQVMsRUFBRTtZQUNwQyxNQUFNLElBQUksNEVBQXdCLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDcEQ7YUFBTTtZQUNILElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQzNFO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixnQkFBZ0I7UUFDWixJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssU0FBUyxFQUFFO1lBQ3BDLE1BQU0sSUFBSSw0RUFBd0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNwRDthQUFNO1lBQ0gsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDM0U7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsY0FBYztRQUNWLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFO1lBQ2xDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUUvRixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyw0REFBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQzVEO2lCQUFNO2dCQUNILElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyw0REFBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQzdEO1lBQ0QsSUFBSSxjQUFzQixDQUFDO1lBQzNCLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtnQkFDdEIsY0FBYyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO2FBQ3RIO2lCQUFNO2dCQUNILGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMseUJBQXlCLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQzthQUNwSDtZQUVELElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQyxDQUFDO1NBQzNGO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNSLHNDQUFzQyxDQUFDLGFBQTRCO1FBQ3ZFLElBQUksSUFBSSxDQUFDLHFCQUFxQixLQUFLLFNBQVMsRUFBRTtZQUMxQyxNQUFNLElBQUksNEVBQXdCLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDcEQ7YUFBTTtZQUNILElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUM3QztJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDUixxQ0FBcUMsQ0FBQyxhQUE0QjtRQUN0RSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsS0FBSyxTQUFTLEVBQUU7WUFDekMsTUFBTSxJQUFJLDRFQUF3QixDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ3BEO2FBQU07WUFDSCxJQUFJLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDNUM7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IsZ0NBQWdDLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxZQUEwQixFQUFFLGFBQTRCO1FBQ25ILElBQUksSUFBSSxDQUFDLHdCQUF3QixLQUFLLFNBQVMsRUFBRTtZQUM3QyxNQUFNLElBQUksNEVBQXdCLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDckQ7YUFBTTtZQUNILElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksRUFBRSxhQUFhLENBQUMsQ0FBQztTQUNwRTtJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDUiwrQkFBK0I7UUFDbkMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEtBQUssU0FBUyxFQUFFO1lBQ3ZDLHlFQUEyQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUNwRztJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDUix1QkFBdUI7UUFDM0IsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUU7WUFDNUQsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLFNBQVMsRUFBRTtnQkFDakMsTUFBTSxJQUFJLDRFQUF3QixDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQ3JEO2lCQUFNO2dCQUNILElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQzthQUN2QjtTQUNKO2FBQU07WUFDSCxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1lBQ2hFLElBQUksbUJBQW1CLEVBQUU7Z0JBQ3JCLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxDQUFDO2FBQ2hDO1lBQ0Qsb0ZBQW9GO1NBQ3ZGO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNoQiw2REFBNkQ7SUFDckQsK0JBQStCLENBQUMsRUFBUztRQUM3QyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsS0FBSyxTQUFTLEVBQUU7WUFDekMsTUFBTSxJQUFJLDRFQUF3QixDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ3JEO2FBQU07WUFDSCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztTQUMvQjtJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSyxPQUFPLENBQUMsS0FBaUI7UUFDN0IsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDaEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMzQjtJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSyxZQUFZLENBQUMsS0FBaUI7UUFDbEMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDaEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2hDO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNSLGVBQWU7UUFDbkIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxnQkFBZ0I7SUFDUixXQUFXLENBQUMsRUFBYztRQUM5QixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQ2hDLE1BQU0sSUFBSSw0RUFBd0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUNuRDthQUFNO1lBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN4QjtJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDUixnQkFBZ0IsQ0FBQyxFQUFjO1FBQ25DLElBQUksSUFBSSxDQUFDLGdCQUFnQixLQUFLLFNBQVMsRUFBRTtZQUNyQyxNQUFNLElBQUksNEVBQXdCLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDcEQ7YUFBTTtZQUNILElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUM3QjtJQUNMLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNwWnFEO0FBRU47QUFFaEQsZ0JBQWdCO0FBQ1QsTUFBTSxRQUFRO0lBUWpCLFlBQW9CLFdBQW9CLEVBQVUsS0FBYSxFQUFFLFFBQWdCO1FBQTdELGdCQUFXLEdBQVgsV0FBVyxDQUFTO1FBQVUsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUMzRCxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFFL0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsOEJBQWlDLENBQUM7UUFDN0QsTUFBTSxpQkFBaUIsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hELGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxHQUFHLG1DQUFtQyxDQUFDO1FBRW5FLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3JELE1BQU0sZUFBZSxHQUFHLGdCQUFnQixHQUFHLENBQUMsQ0FBQztRQUU3QyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDbEIsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyw0REFBYyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDL0QsaUJBQWlCLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyw0REFBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQztZQUMvRSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLDhCQUFpQyxDQUFDO1lBQzdELElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyw0REFBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMzRDthQUFNO1lBQ0gsaUJBQWlCLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyw0REFBYyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDaEUsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyw0REFBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQztZQUM5RSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLGtDQUFtQyxDQUFDO1lBQy9ELElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyw0REFBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMxRDtRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFN0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLDhEQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBNUJELElBQUksT0FBTyxLQUFxQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBOEJ2RCxPQUFPO1FBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsRUFBRSxDQUE4QyxTQUFZLEVBQUUsUUFBa0M7UUFDNUYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUksU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2xELENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqRG1FO0FBSWQ7QUFFdEQ7OztHQUdHO0FBQ0ksTUFBTSxHQUFHO0lBaURaLGdCQUFnQjtJQUNoQjtJQUNJLGdCQUFnQjtJQUNDLGNBQTZCO0lBQzlDLGdCQUFnQjtJQUNSLGNBQTZCO0lBQ3JDLGdCQUFnQjtJQUNSLFdBQXVDO0lBQy9DLGdCQUFnQjtJQUNSLFdBQXVDO0lBQy9DLGdCQUFnQjtJQUNSLGVBQStDOztRQVJ0QyxtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUV0QyxtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUU3QixnQkFBVyxHQUFYLFdBQVcsQ0FBNEI7UUFFdkMsZ0JBQVcsR0FBWCxXQUFXLENBQTRCO1FBRXZDLG9CQUFlLEdBQWYsZUFBZSxDQUFnQztRQWxEM0QsZ0JBQWdCO1FBQ1IsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUUxQixnQkFBZ0I7UUFDQyxzQkFBaUIsR0FBRyxDQUFDLEVBQWMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqRixnQkFBZ0I7UUFDQywyQkFBc0IsR0FBRyxDQUFDLEVBQWMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2RixnQkFBZ0I7UUFDQyx3QkFBbUIsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDakUsZ0JBQWdCO1FBQ0MsNkJBQXdCLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDM0UsbUJBQW1CO1FBQ25CLDRFQUE0RTtRQUM1RSxnQkFBZ0I7UUFDQyx1QkFBa0IsR0FBRyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZGLGdCQUFnQjtRQUNDLGdDQUEyQixHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQ2pGLGdCQUFnQjtRQUNDLDZCQUF3QixHQUFHLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQWtDL0UsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsb0JBQTRCLENBQUM7UUFDeEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsd0JBQThCLENBQUM7UUFDL0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsK0JBQWlDLENBQUM7UUFDbEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUU5QyxJQUFJLGNBQWMsQ0FBQyxVQUFVLEVBQUU7WUFDM0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLDhCQUFpQyxDQUFDO1NBQy9EO2FBQU07WUFDSCxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1NBQzdDO1FBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBRXRFLE1BQU0sY0FBYyxHQUFHLG9CQUFjLENBQUMsY0FBYyxtQ0FBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDO1FBRWpILElBQUksY0FBYyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUN4QjtRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ25GLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRTdGLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUU7WUFDaEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDMUYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDcEcscUdBQXFHO1NBQ3hHO2FBQU07WUFDSCxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO1NBQ2xDO1FBRUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUF2RUQsSUFBSSxRQUFRLEtBQWMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNsRCxnREFBZ0Q7SUFDaEQsSUFBSSxhQUFhLEtBQW9CLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFDbEUsd0RBQXdEO0lBQ3hELElBQUksV0FBVyxLQUFvQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLElBQUksT0FBTyxLQUFrQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ3BELElBQUksWUFBWSxLQUFrQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQzlELElBQUksWUFBWSxLQUE4QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQzFFLElBQUksY0FBYyxLQUFjLE9BQU8sSUFBSSxDQUFDLGFBQWEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzFFLElBQUksY0FBYyxDQUFDLEtBQWM7UUFDN0IsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUMvQixJQUFJLEtBQUssRUFBRTtnQkFDUCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7YUFDeEI7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2FBQ3pCO1NBQ0o7SUFDTCxDQUFDO0lBd0REOzs7O09BSUc7SUFDSCxRQUFRLENBQUMsS0FBYTtRQUNsQixJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTLENBQUMsUUFBaUI7UUFDdkIsSUFBSSxRQUFRLEtBQUssSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUM3QixPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztRQUUxQixJQUFJLFFBQVEsRUFBRTtZQUNWLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsMEJBQStCLENBQUM7U0FDOUQ7YUFBTTtZQUNILElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sMEJBQStCLENBQUM7U0FDakU7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsT0FBTzs7UUFDSCxJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQztRQUM3QixJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQztRQUM3QixJQUFJLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQztRQUNqQyxJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUM3RSxVQUFJLENBQUMsYUFBYSwwQ0FBRSxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDM0UsVUFBSSxDQUFDLGFBQWEsMENBQUUsbUJBQW1CLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQ3JGLHNGQUFzRjtRQUN0RixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDdkUsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN6QjtRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixVQUFVO1FBQ04sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSw0QkFBZ0MsQ0FBQztRQUMvRCxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLDRCQUFnQyxDQUFDO0lBQ3hFLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsVUFBVTtRQUNOLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsNEJBQWdDLENBQUM7UUFDNUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsR0FBRyw0QkFBZ0MsQ0FBQztJQUNyRSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxXQUFXLENBQUMsQ0FBUyxFQUFFLENBQVM7UUFDcEMsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLFNBQVMsRUFBRTtZQUNsQyxNQUFNLElBQUksNEVBQXdCLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDdEQ7YUFBTTtZQUNILElBQUksSUFBSSxDQUFDLGVBQWUsS0FBSyxTQUFTLEVBQUU7Z0JBQ3BDLE1BQU0sSUFBSSw0RUFBd0IsQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUNuRDtpQkFBTTtnQkFDSCxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDdEU7U0FDSjtJQUVMLENBQUM7SUFFRCxnQkFBZ0I7SUFDUixvQkFBb0I7UUFDeEIsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLFNBQVMsRUFBRTtZQUNsQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO1NBQ2xDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGNBQWMsQ0FBQyxLQUFpQjtRQUNwQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQzVCLElBQUksTUFBTSxLQUFLLElBQUksQ0FBQyxRQUFRLElBQUksTUFBTSxLQUFLLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDM0Qsb0JBQW9CO1lBQ3BCLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQ3BCLDJCQUEyQjtnQkFDM0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUVuQixzQkFBc0I7YUFDekI7aUJBQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRTtnQkFDN0QsMkJBQTJCO2dCQUMzQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7YUFDdEI7U0FDSjtJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDUixlQUFlLENBQUMsS0FBaUI7UUFDckMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDaEMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3RCO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNLLFlBQVk7UUFDaEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxnQkFBZ0I7SUFDUixpQkFBaUI7UUFDckIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gscUNBQXFDO0lBQ3JDLGtDQUFrQztJQUNsQyxJQUFJO0lBRUosZ0JBQWdCO0lBQ1IsV0FBVztRQUNmLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUU7WUFDaEMsTUFBTSxJQUFJLDRFQUF3QixDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ2xEO2FBQU07WUFDSCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUN6QztJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDUixXQUFXO1FBQ2YsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtZQUNoQyxNQUFNLElBQUksNEVBQXdCLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDbEQ7YUFBTTtZQUNILElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ3pDO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNSLGFBQWE7UUFDakIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLDhEQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELGdCQUFnQjtJQUNSLGNBQWM7UUFDbEIsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLFNBQVMsRUFBRTtZQUNsQyxNQUFNLElBQUksNEVBQXdCLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDbEQ7YUFBTTtZQUNILElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsMkJBQTJCLENBQUMsQ0FBQztZQUNyRSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDN0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7U0FDbEM7SUFDTCxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzNSc0Q7QUFLUztBQUNwQztBQUU1QixnQkFBZ0I7QUFDVCxNQUFNLGFBQWE7SUFpQnRCLFlBQW9CLGNBQTZCLEVBQ3JDLHFCQUE2RCxFQUM3RCxvQkFBMkQsRUFDM0Qsd0JBQW1FLEVBQ25FLDJCQUFxRTtRQUo3RCxtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUNyQywwQkFBcUIsR0FBckIscUJBQXFCLENBQXdDO1FBQzdELHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBdUM7UUFDM0QsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEyQztRQUNuRSxnQ0FBMkIsR0FBM0IsMkJBQTJCLENBQTBDO1FBcEJqRix5RkFBeUY7UUFDeEUsVUFBSyxHQUFVLEVBQUUsQ0FBQztRQUkzQix5QkFBb0IsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMxQixvQkFBZSxHQUFHLEtBQUssQ0FBQztRQWdCNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsc0JBQTZCLENBQUM7UUFFekQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxHQUFHLDZDQUF3QyxDQUFDO1FBQzVFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztJQUNqRCxDQUFDO0lBcEJELElBQUksSUFBSSxLQUFZLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDeEMsSUFBSSxRQUFRLEtBQWEsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDcEQsSUFBSSxtQkFBbUIsS0FBYSxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7SUFFdkUsSUFBSSxPQUFPLEtBQWtCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDcEQsSUFBSSxlQUFlLEtBQWtCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztJQUNwRSxJQUFJLGNBQWMsS0FBYyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0lBZ0I5RCxPQUFPO1FBQ0gsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3hDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDM0I7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsU0FBUyxDQUFDLGFBQTRCLEVBQUUsS0FBYTtRQUNqRCwwQ0FBMEM7UUFDMUMsaUNBQWlDO1FBQ2pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxLQUFLLGFBQWEsRUFBRTtnQkFDL0MsT0FBTzthQUNWO1NBQ0o7UUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLHFDQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFDbkMsYUFBYSxFQUNiLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEVBQ3hDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEVBQ3hDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUUxRixJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDckIsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO1NBQzdCO1FBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUVqQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUU7WUFDekMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQzVFO2FBQU07WUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDMUM7SUFDTCxDQUFDO0lBRUQsU0FBUyxDQUFDLGFBQTRCO1FBQ2xDLDhDQUE4QztRQUM5QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDeEMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsS0FBSyxhQUFhLEVBQUU7Z0JBQy9DLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzFCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDZCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hCLE9BQU87YUFDVjtTQUNKO1FBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRCw2QkFBNkIsQ0FBQyxzQkFBcUM7UUFDL0QsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3hDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxLQUFLLHNCQUFzQixDQUFDO1lBQ3hFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2xDLElBQUksUUFBUSxFQUFFO2dCQUNWLFdBQVcsR0FBRyxDQUFDLENBQUM7YUFDbkI7U0FDSjtRQUVELElBQUksV0FBVyxHQUFHLENBQUMsRUFBRTtZQUNqQixNQUFNLElBQUksK0RBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUN2QzthQUFNO1lBQ0gsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMscUJBQXFCLEVBQUU7Z0JBQ2pFOzs7bUJBR0c7Z0JBQ0gsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEtBQUssQ0FBQyxDQUFDLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtvQkFDN0UsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFDMUMsS0FBSyxJQUFJLENBQUMsR0FBRyxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTt3QkFDbEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztxQkFDckM7b0JBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7b0JBRTFCLHNGQUFzRjtpQkFDekY7YUFDSjtTQUNKO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYyxDQUFDLGNBQXNCLEVBQUUsbUJBQThDO1FBQ2pGLElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQztRQUMzQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxFQUFFLGNBQWMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQzVGLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDVixjQUFjLEdBQUcsSUFBSSxDQUFDO1lBQ3RCLDJCQUEyQjtZQUMzQixJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxFQUFFLGNBQWMsRUFBRSxtQkFBbUIsQ0FBQztTQUM5RTtRQUVELElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyw0REFBYyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFFM0UsSUFBSSxjQUFjLEtBQUssSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN6QyxJQUFJLENBQUMsZUFBZSxHQUFHLGNBQWMsQ0FBQztZQUN0QyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztTQUN0QztJQUNMLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxjQUF1QixFQUFFLGNBQXNCLEVBQUUsbUJBQThDO1FBQzdHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3ZCLElBQUksbUJBQW1CLEtBQUssU0FBUyxFQUFFO2dCQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7YUFDckU7WUFFRCxJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQztZQUMzQixJQUFJLDJCQUEyQixHQUFHLEtBQUssQ0FBQztZQUN4QyxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQztZQUMxRixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoRSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUUvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3hDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO2dCQUV6QyxrRUFBa0U7Z0JBQ2xFLElBQUksVUFBVSxDQUFDLGFBQWEsS0FBSyxJQUFJLENBQUMsUUFBUSxFQUFFO29CQUM1QyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDekM7Z0JBQ0QsTUFBTSxvQkFBb0IsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxDQUFDO2dCQUM3RSxNQUFNLGNBQWMsR0FBRyw0REFBYyxDQUFDLG9CQUFvQixDQUFDLENBQUM7Z0JBQzVELE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxXQUFXLEdBQUcsY0FBYyxDQUFDO2dCQUV6RCxrQkFBa0IsSUFBSSxRQUFRLENBQUM7Z0JBRS9CLG9EQUFvRDtnQkFDcEQsd0RBQXdEO2dCQUN4RCxJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUM7Z0JBQ3hCLElBQUksV0FBVyxJQUFJLENBQUMsRUFBRTtvQkFDbEIsZUFBZSxHQUFHLGtCQUFrQixDQUFDO2lCQUN4QztxQkFBTTtvQkFDSCxNQUFNLDBCQUEwQixHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLENBQUM7b0JBQ25GLE1BQU0sb0JBQW9CLEdBQUcsNERBQWMsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO29CQUN4RSxlQUFlLEdBQUcsa0JBQWtCLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsb0JBQW9CLENBQUM7aUJBQy9GO2dCQUVELHNEQUFzRDtnQkFDdEQsSUFBSSxlQUFlLEdBQUcsY0FBYyxFQUFFO29CQUVsQyw0REFBNEQ7b0JBQzVELElBQUksQ0FBQywyQkFBMkIsRUFBRTt3QkFFOUIsd0NBQXdDO3dCQUN4QyxrREFBa0Q7d0JBQ2xELElBQUksT0FBZSxDQUFDO3dCQUNwQixJQUFJLFdBQVcsR0FBRyxDQUFDLElBQUksV0FBVyxJQUFJLENBQUMsRUFBRTs0QkFDckMsT0FBTyxHQUFHLENBQUMsZUFBZSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO3lCQUMxRDs2QkFBTTs0QkFDSCxPQUFPLEdBQUcsQ0FBQyxlQUFlLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3lCQUNwRDt3QkFFRCxrQ0FBa0M7d0JBQ2xDLElBQUksT0FBTyxHQUFHLG1CQUFtQixFQUFFOzRCQUMvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dDQUN6QixNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsS0FBSyxXQUFXLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsNERBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dDQUN2RixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLDREQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dDQUMzRCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQzs2QkFDdkQ7NEJBQ0QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQzs0QkFDOUIsSUFBSSxVQUFVLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0NBQzVDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDOzZCQUN6Qzt5QkFDSjs2QkFBTTs0QkFDSCwyQkFBMkIsR0FBRyxJQUFJLENBQUM7eUJBQ3RDO3FCQUVKO3lCQUFNLElBQUksQ0FBQyxLQUFLLFdBQVcsRUFBRTt3QkFDMUIsb0VBQW9FO3dCQUNwRSxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7d0JBQ2pDLFVBQVUsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQzt3QkFDakMsSUFBSSxVQUFVLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUU7NEJBQzVDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO3lCQUN6QztxQkFDSjtvQkFFRCxJQUFJLDJCQUEyQixJQUFJLENBQUMsS0FBSyxXQUFXLEVBQUU7d0JBQ2xELElBQUksY0FBYyxFQUFFOzRCQUNoQiwrQ0FBK0M7NEJBQy9DLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQzs0QkFDakMsVUFBVSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDOzRCQUVqQyxJQUFJLFVBQVUsQ0FBQyxhQUFhLEtBQUssSUFBSSxDQUFDLGdCQUFnQixFQUFFO2dDQUNwRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDOzZCQUNqRDt5QkFDSjs2QkFBTTs0QkFDSCwrRUFBK0U7NEJBQy9FLE9BQU8sS0FBSyxDQUFDO3lCQUNoQjtxQkFDSjtpQkFFSjtxQkFBTTtvQkFDSCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO29CQUM5QixVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7b0JBQ2pDLFVBQVUsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztvQkFDakMsSUFBSSxVQUFVLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUU7d0JBQzVDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO3FCQUN6QztpQkFDSjthQUNKO1NBQ0o7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7O09BRUc7SUFDSCwwQkFBMEI7UUFDdEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFFRDs7T0FFRztJQUNILDBCQUEwQjtRQUN0QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7SUFDakQsQ0FBQztJQUVPLG1CQUFtQixDQUFDLGFBQTRCO1FBQ3BELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRU8sbUJBQW1CLENBQUMsYUFBNEI7UUFDcEQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFTyx1QkFBdUIsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLFlBQTBCLEVBQUUsYUFBNEI7UUFDMUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7Q0FFSjs7Ozs7Ozs7Ozs7Ozs7O0FDL1FELDBDQUEwQztBQUNuQyxNQUFNLG1CQUFtQjtJQU81QjtRQUNJLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLHFEQUE0QyxDQUFDO1FBQ3hFLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUV6QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUM1QixJQUFJLENBQUMsdUJBQXVCLEdBQUcsR0FBRyxDQUFDO1FBQ25DLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7SUFDcEMsQ0FBQztJQUVELE9BQU87UUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCw2REFBNkQ7SUFDN0Qsa0JBQWtCLENBQUMsV0FBd0IsRUFBRSxTQUFzQjtRQUMvRDs7V0FFRztRQUNILE9BQU87UUFDUCwrQkFBK0I7UUFDL0Isb0NBQW9DO1FBQ3BDLHFEQUFxRDtRQUNyRCxzQ0FBc0M7UUFDdEMsa0RBQWtEO1FBQ2xELHFEQUFxRDtJQUN6RCxDQUFDO0lBRU8sa0JBQWtCO1FBQ3RCLHdHQUF3RztRQUN4RyxxREFBcUQ7UUFDckQsV0FBVztRQUNYLDBEQUEwRDtRQUMxRCxtR0FBbUc7UUFDbkcscUNBQXFDO1FBQ3JDLHlCQUF5QjtRQUV6QixvQ0FBb0M7UUFDcEMsZ0RBQWdEO1FBQ2hELGtCQUFrQjtRQUNsQixRQUFRO1FBRVIsZ0NBQWdDO1FBRWhDLHdEQUF3RDtRQUN4RCxnRkFBZ0Y7UUFDaEYsZ0ZBQWdGO1FBQ2hGLGlDQUFpQztRQUNqQyxRQUFRO1FBRVIsNkNBQTZDO1FBQzdDLHlEQUF5RDtRQUN6RCxJQUFJO0lBQ1IsQ0FBQztJQUVPLE9BQU8sQ0FBQyxPQUFvQjtRQUNoQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUU3QyxPQUFPO1lBQ0gsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ2IsS0FBSyxFQUFFLE9BQU8sQ0FBQyxXQUFXO1lBQzFCLE1BQU0sRUFBRSxPQUFPLENBQUMsWUFBWTtTQUMvQixDQUFDO0lBQ04sQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDN0VELGNBQWM7QUFDUCxNQUFlLGFBQWMsU0FBUSxLQUFLO0lBQzdDLGdCQUFnQjtJQUNoQixZQUE0QixJQUFZLEVBQUUsT0FBZTtRQUNyRCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFEUyxTQUFJLEdBQUosSUFBSSxDQUFRO0lBRXhDLENBQUM7Q0FDSjtBQUVELGNBQWM7QUFDUCxNQUFNLGtCQUFtQixTQUFRLGFBQWE7SUFDakQsZ0JBQWdCO0lBQ2hCLFlBQVksT0FBZSxFQUFrQixJQUFhO1FBQ3RELEtBQUssQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFEUyxTQUFJLEdBQUosSUFBSSxDQUFTO0lBRTFELENBQUM7Q0FDSjtBQUVELGNBQWM7QUFDUCxNQUFNLGtCQUFtQixTQUFRLGFBQWE7SUFDakQsZ0JBQWdCO0lBQ2hCLFlBQVksT0FBZTtRQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3BDLENBQUM7Q0FDSjtBQUVELGNBQWM7QUFDUCxNQUFNLFFBQVMsU0FBUSxhQUFhO0lBQ3ZDLGdCQUFnQjtJQUNoQixZQUFZLE9BQWU7UUFDdkIsS0FBSyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMxQixDQUFDO0NBQ0o7QUFFRCxjQUFjO0FBQ1AsTUFBTSxTQUFVLFNBQVEsYUFBYTtJQUN4QyxnQkFBZ0I7SUFDaEIsWUFBWSxPQUFlO1FBQ3ZCLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDM0IsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0Q0QsZ0JBQWdCO0FBQ2hCLE1BQWUsYUFBYyxTQUFRLEtBQUs7SUFDdEMsWUFBWSxJQUFZLEVBQUUsSUFBWSxFQUFFLE9BQWdCO1FBQ3BELEtBQUssQ0FBQyxHQUFHLElBQUksS0FBSyxJQUFJLEdBQUcsT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsT0FBTyxFQUFFLENBQUM7SUFDM0UsQ0FBQztDQUNKO0FBRUQsZ0JBQWdCO0FBQ1QsTUFBTSxXQUFZLFNBQVEsYUFBYTtJQUMxQyxZQUFZLElBQVksRUFBRSxPQUFnQjtRQUN0QyxLQUFLLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUM7SUFDbEMsQ0FBQztDQUNKO0FBRUQsZ0JBQWdCO0FBQ1QsTUFBTSxvQkFBcUIsU0FBUSxhQUFhO0lBQ25ELFlBQVksSUFBWSxFQUFFLGFBQW9CLEVBQUUsT0FBZ0I7UUFDNUQsS0FBSyxDQUFDLGlCQUFpQixFQUFFLElBQUksRUFBRSxHQUFHLGFBQWEsR0FBRyxPQUFPLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxPQUFPLEVBQUUsQ0FBQztJQUNwRyxDQUFDO0NBQ0o7QUFFRCxnQkFBZ0I7QUFDVCxNQUFNLG1CQUFvQixTQUFRLGFBQWE7SUFDbEQsWUFBWSxJQUFZLEVBQUUsT0FBZ0I7UUFDdEMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLElBQUksRUFBRSxPQUFPLENBQUM7SUFDMUMsQ0FBQztDQUNKO0FBRUQsZ0JBQWdCO0FBQ1QsTUFBTSx3QkFBeUIsU0FBUSxhQUFhO0lBQ3ZELFlBQVksSUFBWSxFQUFFLE9BQWdCO1FBQ3RDLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDO0lBQy9DLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDaENzRTtBQUVUO0FBQ2tCO0FBQ2Y7QUFFOEY7QUFDOUc7QUFFakQsY0FBYztBQUNQLE1BQU0sWUFBYSxTQUFRLDBEQUFhO0lBdUMzQyxnQkFBZ0I7SUFDaEIsWUFBWSx5QkFBaUUsRUFDekUsb0NBQTRGLEVBQzVGLDJCQUF1RTtRQUV2RSxLQUFLLENBQUMseUJBQXlCLEVBQUUsb0NBQW9DLEVBQUUsMkJBQTJCLEVBQUUsSUFBSSxDQUFDLENBQUM7UUEzQzlHLGdCQUFnQjtRQUNSLHVCQUFrQixHQUFHLElBQUksR0FBRyxFQUE4QyxDQUFDO1FBSW5GLGdCQUFnQjtRQUNSLDRCQUF1QixHQUFHLElBQUksR0FBRyxFQUFvRCxDQUFDO1FBQzlGLGdCQUFnQjtRQUNSLDJCQUFzQixHQUFHLElBQUksR0FBRyxFQUF1RCxDQUFDO1FBSWhHLGdCQUFnQjtRQUNSLGtEQUE2QyxHQUNqRCxDQUFDLFNBQTZCLEVBQUUsS0FBYSxFQUFFLE1BQWMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLDBDQUEwQyxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDaEosZ0JBQWdCO1FBQ1IsMkRBQXNELEdBQzFELENBQUMsU0FBNkIsRUFBRSxPQUFnQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbURBQW1ELENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3RJLGdCQUFnQjtRQUNSLHVEQUFrRCxHQUN0RCxDQUFDLFNBQTZCLEVBQUUsYUFBNEIsRUFBRSxhQUFxQixFQUFFLEVBQUUsQ0FDbkYsSUFBSSxDQUFDLCtDQUErQyxDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUM7UUF1QmxHLDRJQUE0STtRQUM1SSxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQzdCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNmO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILGlCQUFpQixDQUFDLElBQVksRUFDMUIsZ0NBQTJHLEVBQzNHLE9BQU8sR0FBRyxLQUFLO1FBRWYsSUFBSSxPQUFPLGdDQUFnQyxLQUFLLFVBQVUsRUFBRTtZQUN4RCxNQUFNLElBQUksNERBQVEsQ0FBQyxrRkFBa0YsQ0FBQztTQUN6RzthQUFNO1lBQ0gsSUFBSSxnQ0FBZ0MsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLEVBQUU7Z0JBQzlELE1BQU0sb0JBQW9CLEdBQUcsZ0NBQXFFLENBQUM7Z0JBQ25HLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsT0FBTyxDQUFDLENBQUM7YUFDMUU7aUJBQU07Z0JBQ0gsTUFBTSxtQkFBbUIsR0FBRyxnQ0FBeUUsQ0FBQztnQkFDdEcsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLElBQUksRUFBRSxtQkFBbUIsRUFBRSxPQUFPLENBQUMsQ0FBQzthQUM3RTtTQUNKO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsNEJBQTRCLENBQUMsUUFBZ0IsRUFBRSxvQkFBdUQsRUFBRSxPQUFPLEdBQUcsS0FBSztRQUNuSCxJQUFJLE9BQU8sb0JBQW9CLEtBQUssVUFBVSxFQUFFO1lBQzVDLE1BQU0sSUFBSSxLQUFLLENBQUMsNERBQVcsNENBQWlELENBQUMsQ0FBQztTQUNqRjtRQUVELE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVwRSxJQUFJLHFCQUFxQixLQUFLLFNBQVMsRUFBRTtZQUNyQyxNQUFNLElBQUksNkRBQVMsQ0FBQyxHQUFHLDREQUFXLHNDQUEyQyxLQUFLLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDakc7UUFFRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRTtZQUM5QixXQUFXLEVBQUUsb0JBQW9CO1lBQ2pDLGVBQWUsRUFBRSxTQUFTO1lBQzFCLE9BQU87U0FDVixDQUNKLENBQUM7SUFDTixDQUFDO0lBRUQ7O09BRUc7SUFDSCxnQ0FBZ0MsQ0FBQyxRQUFnQixFQUFFLHdCQUErRCxFQUFFLE9BQU8sR0FBRyxLQUFLO1FBQy9ILElBQUksT0FBTyx3QkFBd0IsS0FBSyxVQUFVLEVBQUU7WUFDaEQsTUFBTSxJQUFJLDZEQUFTLENBQUMsd0NBQXdDLENBQUMsQ0FBQztTQUNqRTtRQUVELE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVwRSxJQUFJLHFCQUFxQixLQUFLLFNBQVMsRUFBRTtZQUNyQyxNQUFNLElBQUksNkRBQVMsQ0FBQyxHQUFHLDREQUFXLHNDQUEyQyxLQUFLLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDakc7UUFFRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRTtZQUM5QixXQUFXLEVBQUUsU0FBUztZQUN0QixlQUFlLEVBQUUsd0JBQXdCO1lBQ3pDLE9BQU87U0FDVixDQUNKLENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILHlCQUF5QixDQUFDLFFBQXNEO1FBQzVFLElBQUksQ0FBQyx1Q0FBdUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsdUNBQXVDLENBQUMsUUFBc0Q7UUFDMUYsSUFBSSxPQUFPLFFBQVEsS0FBSyxVQUFVLEVBQUU7WUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1NBQzFEO1FBRUQsSUFBSSxJQUFJLENBQUMsMkJBQTJCLEtBQUssU0FBUyxFQUFFO1lBQ2hELE9BQU8sQ0FBQyxJQUFJLENBQUMsc0dBQXNHLENBQUM7U0FDdkg7UUFFRCxJQUFJLENBQUMsMkJBQTJCLEdBQUcsUUFBUSxDQUFDO0lBQ2hELENBQUM7SUFFRCwrQkFBK0I7UUFDM0IsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakUsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsd0JBQXdCLENBQUMsTUFBbUM7UUFDeEQsSUFBSSxZQUE0RCxDQUFDO1FBRWpFLE1BQU0sUUFBUSxHQUFHLGdGQUEyQixDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQztRQUM3RSxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDeEIsWUFBWSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDeEQ7UUFDRCxJQUFJLFlBQVksS0FBSyxTQUFTLEVBQUU7WUFDNUIsSUFBSSxJQUFJLENBQUMsMkJBQTJCLEtBQUssU0FBUyxFQUFFO2dCQUNoRCxZQUFZLEdBQUc7b0JBQ1gsV0FBVyxFQUFFLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLENBQUM7b0JBQ3JELGVBQWUsRUFBRSxTQUFTO29CQUMxQixPQUFPLEVBQUUsS0FBSztpQkFDakI7YUFDSjtTQUNKO1FBRUQsT0FBTyxZQUFZLENBQUM7SUFDeEIsQ0FBQztJQUVELGdCQUFnQjtJQUNQLGFBQWEsQ0FBQyxTQUE2QixFQUFFLFVBQXVDO1FBQ3pGLElBQUksWUFBNEQsQ0FBQztRQUVqRSxNQUFNLFFBQVEsR0FBRyxnRkFBMkIsQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsRixJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDeEIsWUFBWSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDeEQ7UUFDRCxJQUFJLFlBQVksS0FBSyxTQUFTLEVBQUU7WUFDNUIsSUFBSSxJQUFJLENBQUMsMkJBQTJCLEtBQUssU0FBUyxFQUFFO2dCQUNoRCxZQUFZLEdBQUc7b0JBQ1gsV0FBVyxFQUFFLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxVQUFVLENBQUM7b0JBQ3pELGVBQWUsRUFBRSxTQUFTO29CQUMxQixPQUFPLEVBQUUsS0FBSztpQkFDakI7YUFDSjtTQUNKO1FBRUQsSUFBSSxNQUE0QyxDQUFDO1FBQ2pELElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRTtZQUM1QixNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDO1lBQ3JDLG9GQUFvRjtZQUNwRixJQUFJLGNBQXFDLENBQUM7WUFDMUMsSUFBSSxVQUFVLENBQUMsY0FBYyxLQUFLLFNBQVMsRUFBRTtnQkFDekMsY0FBYyxHQUFHLFNBQVMsQ0FBQzthQUM5QjtpQkFBTTtnQkFDSCxZQUFZO2dCQUNaLGNBQWMsR0FBRyw2REFBZSxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsY0FBYyxDQUFjLENBQUM7YUFDaEY7WUFFRCxJQUFJLFNBQW1ELENBQUM7WUFDeEQsTUFBTSxvQkFBb0IsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDO1lBQ3RELElBQUksb0JBQW9CLEtBQUssU0FBUyxFQUFFO2dCQUNwQyxTQUFTLEdBQUcsSUFBSSxvQkFBb0IsQ0FBQyxTQUFTLEVBQUUsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2FBQzVFO2lCQUFNO2dCQUNILE1BQU0sZUFBZSxHQUFHLFlBQVksQ0FBQyxlQUFlLENBQUM7Z0JBQ3JELElBQUksZUFBZSxLQUFLLFNBQVMsRUFBRTtvQkFDL0IsU0FBUyxHQUFHLGVBQWUsQ0FBQyxTQUFTLEVBQUUsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2lCQUNuRTtxQkFBTTtvQkFDSCxNQUFNLElBQUksK0RBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztpQkFDekM7YUFDSjtZQUVELElBQUksT0FBTyxFQUFFO2dCQUNULElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRTtvQkFDekIsTUFBTSxJQUFJLDRFQUF3QixDQUFDLGVBQWUsQ0FBQyxDQUFDO2lCQUN2RDtxQkFBTTtvQkFDSCxNQUFNLGtCQUFrQixHQUFHLFNBQTRDLENBQUM7b0JBQ3hFLE1BQU0sb0JBQW9CLEdBQUcsa0JBQWtCLENBQUMsZUFBZSxDQUFDO29CQUNoRSxJQUFJLG9CQUFvQixLQUFLLFNBQVMsRUFBRTt3QkFDcEMsTUFBTSxJQUFJLDZEQUFTLENBQUMsR0FBRyw0REFBVyxvREFBeUQsS0FBSyxRQUFRLEVBQUUsQ0FBQyxDQUFDO3FCQUMvRzt5QkFBTTt3QkFDSCwyRUFBNkIsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO3dCQUNwRCxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO3dCQUNqRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO3dCQUMvRCxTQUFTLENBQUMsMkJBQTJCLEdBQUcsSUFBSSxDQUFDLDZDQUE2QyxDQUFDO3dCQUMzRixTQUFTLENBQUMsb0NBQW9DLEdBQUcsSUFBSSxDQUFDLHNEQUFzRCxDQUFDO3dCQUM3RyxTQUFTLENBQUMsZ0NBQWdDLEdBQUcsSUFBSSxDQUFDLGtEQUFrRCxDQUFDO3FCQUN4RztpQkFDSjthQUNKO1lBRUQsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFFdkQsTUFBTSxHQUFHO2dCQUNMLE9BQU8sRUFBRSxZQUFZLENBQUMsT0FBTztnQkFDN0IsU0FBUzthQUNaLENBQUM7U0FFTDthQUFNO1lBQ0gsd0JBQXdCO1lBQ3hCLE1BQU0sR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztTQUN2RDtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxnQkFBZ0I7SUFDUCxlQUFlLENBQUMsU0FBNkIsRUFBRSxPQUFnQixFQUFFLFNBQW1EO1FBQ3pILE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4RSxJQUFJLG1CQUFtQixLQUFLLFNBQVMsRUFBRTtZQUNuQyxLQUFLLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxpRUFBaUU7U0FDMUg7YUFBTTtZQUNILE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN0RSxJQUFJLGtCQUFrQixLQUFLLFNBQVMsRUFBRTtnQkFDbEMsTUFBTSxvQkFBb0IsR0FBRyxrQkFBa0IsQ0FBQyxlQUFlLENBQUM7Z0JBQ2hFLElBQUksb0JBQW9CLEtBQUssU0FBUyxFQUFFO29CQUNwQyxNQUFNLElBQUksK0RBQVcsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUN2RDtxQkFBTTtvQkFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO29CQUNqRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2lCQUNqRDthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBRVEsNkJBQTZCLENBQUMsS0FBYTtRQUNoRCxJQUFJLENBQUMsK0JBQStCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzlFLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBR0QsZ0JBQWdCO0lBQ1IsMENBQTBDLENBQUMsU0FBNkIsRUFBRSxLQUFhLEVBQUUsTUFBYztRQUMzRyxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEUsSUFBSSxrQkFBa0IsS0FBSyxTQUFTLEVBQUU7WUFDbEMsTUFBTSxJQUFJLDRFQUF3QixDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ3REO2FBQU07WUFDSCxNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxlQUFlLENBQUM7WUFDdkQsSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFO2dCQUMzQixNQUFNLElBQUksNkRBQVMsQ0FBQyw0REFBVyxpQ0FBc0MsR0FBRyxHQUFHLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2xHO2lCQUFNO2dCQUNILE1BQU0sMkJBQTJCLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUM5RSxNQUFNLElBQUksR0FBRywyQkFBMkIsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLCtCQUErQixDQUFDLElBQUksQ0FBQztnQkFDMUYsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsNERBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDOUMsTUFBTSxHQUFHLEdBQUcsMkJBQTJCLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxHQUFHLENBQUM7Z0JBQ3ZGLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLDREQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzVDLDZEQUFlLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNwQyw4REFBZ0IsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7YUFDekM7U0FDSjtJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDUixtREFBbUQsQ0FBQyxTQUE2QixFQUFFLE9BQWdCO1FBQ3ZHLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0RSxJQUFJLGtCQUFrQixLQUFLLFNBQVMsRUFBRTtZQUNsQyxNQUFNLElBQUksNEVBQXdCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUN4RDthQUFNO1lBQ0gsTUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsZUFBZSxDQUFDO1lBQ3ZELElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRTtnQkFDM0IsTUFBTSxJQUFJLDZEQUFTLENBQUMsNERBQVcsaUNBQXNDLEdBQUcsR0FBRyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNsRztpQkFBTTtnQkFDSCx5RUFBMkIsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7YUFDckQ7U0FDSjtJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDUiwrQ0FBK0MsQ0FBQyxTQUE2QixFQUFFLGFBQTRCLEVBQUUsYUFBcUI7UUFDdEksTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RFLElBQUksa0JBQWtCLEtBQUssU0FBUyxFQUFFO1lBQ2xDLE1BQU0sSUFBSSw0RUFBd0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1NBQ3pEO2FBQU07WUFDSCxNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxlQUFlLENBQUM7WUFDdkQsSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFO2dCQUMzQixNQUFNLElBQUksNkRBQVMsQ0FBQyw0REFBVyxpQ0FBc0MsR0FBRyxHQUFHLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2xHO2lCQUFNO2dCQUNILFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLGFBQWEsQ0FBQzthQUM1QztTQUNKO0lBQ0wsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMzVnlIO0FBQ3BEO0FBRVA7QUFHVjtBQUN3QztBQUVoRDtBQUU3QyxjQUFjO0FBQ1AsTUFBTSxhQUFjLFNBQVEsc0RBQVc7SUErQjFDLGdCQUFnQjtJQUNoQixZQUNJLGFBQTRCLEVBQzVCLE1BQW1DO0lBQ25DLGdCQUFnQjtJQUNSLFdBQW9DO1FBRTVDLEtBQUssQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFGakUsZ0JBQVcsR0FBWCxXQUFXLENBQXlCO1FBdkJoRCxnQkFBZ0I7UUFDUixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBMEJyQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUV4QixJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUM7UUFFN0MsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWxDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBRTdDLE1BQU0sZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2RCxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsR0FBRyw0QkFBZ0MsQ0FBQztRQUMvRCxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSw4RUFBa0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFDbEYsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxVQUFVLENBQUMsRUFDNUQsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUNqQixHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQ2pCLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxFQUM1QyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FDOUMsQ0FBQztJQUNOLENBQUM7SUExQ0QsNEVBQTRFO0lBQzVFLElBQUksYUFBYSxLQUFnQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUN4RSxJQUFJLGFBQWEsS0FBZ0IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFDeEUsSUFBSSxjQUFjLEtBQWMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztJQUM5RCxnQkFBZ0I7SUFDaEIsSUFBSSxtQkFBbUIsS0FBYyxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7SUFDeEUsSUFBSSxTQUFTLEtBQStDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQy9GLElBQUksU0FBUyxLQUF5QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQy9ELElBQUksVUFBVSxLQUE4QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBRXRFLElBQUksWUFBWSxLQUFvRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQ2hHLElBQUksS0FBSyxLQUFhLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDM0MsSUFBSSxHQUFHLEtBQVUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNwQyxJQUFJLE9BQU8sS0FBYyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBK0JoRCxnQkFBZ0I7SUFDUCxPQUFPO1FBQ1osSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUU7UUFDekIsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxNQUFtQztRQUNwRCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDdkMsQ0FBQztJQUVELFFBQVE7UUFDSixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUM7UUFDNUQsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUU1RixNQUFNLE1BQU0sR0FBZ0M7WUFDeEMsSUFBSSxFQUFFLGtEQUFRLENBQUMsU0FBUztZQUN4QixPQUFPLEVBQUUsRUFBRTtZQUNYLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNYLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMzQixjQUFjLEVBQUUsSUFBSSxDQUFDLGVBQWU7WUFDcEMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ2xCLE1BQU0sRUFBRSwrRUFBMEIsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDeEUsYUFBYSxFQUFFLGdGQUEyQixDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDaEYsY0FBYyxFQUFFLEtBQUs7U0FDeEI7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQsS0FBSztRQUNELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLEVBQUU7WUFDdEIsTUFBTSxJQUFJLHVFQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzdDO2FBQU07WUFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDeEM7SUFDTCxDQUFDO0lBRUQscUJBQXFCO0lBQ3JCLGdCQUFnQjtJQUNoQixhQUFhLENBQUMsS0FBYSxFQUFFLE1BQWM7UUFDdkMsNkRBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLDhEQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsWUFBWTtRQUNSLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixtQkFBbUI7UUFDZixJQUFJLENBQUMsVUFBVSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDMUMsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixrQkFBa0I7UUFDZCxJQUFJLENBQUMsVUFBVSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVELHFCQUFxQjtJQUNyQixnQkFBZ0I7SUFDaEIsSUFBSTtRQUNBLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELGdCQUFnQjtJQUNoQiwwQkFBMEI7O1FBQ3RCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNsRCxNQUFNLElBQUksR0FBRyxVQUFJLENBQUMsWUFBWSwwQ0FBRSxJQUFJLENBQUM7UUFDckMsTUFBTSxNQUFNLEdBQUcseUVBQW9CLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFFckUsTUFBTSxXQUFXLEdBQUcsQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkUsTUFBTSxZQUFZLEdBQUcsQ0FBQyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU5RixPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUM7WUFDcEIsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsV0FBVztZQUMxQixDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxZQUFZO1lBQzFCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLFdBQVc7WUFDL0IsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsWUFBWTtTQUNyQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1AsVUFBVSxDQUFDLEtBQWM7UUFDOUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsZ0JBQWdCO0lBQ1AsSUFBSTtRQUNULElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFM0IsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7OztPQUtHO0lBRUgsUUFBUSxDQUFDLEtBQWE7UUFDbEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsTUFBTSxDQUFDLEdBQVE7UUFDWCxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7UUFDckIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELGdCQUFnQjtJQUNQLElBQUk7UUFDVCxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1AsSUFBSTtRQUNULEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxhQUFhLEdBQUcsS0FBSztRQUN2QixJQUFJLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixVQUFVLENBQUMsYUFBc0I7UUFDN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ2hCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUN2QztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSztRQUN0QixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixJQUFJLENBQUMsYUFBYSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQztTQUN4RTtJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsVUFBVSxDQUFDLGFBQXNCO1FBQzdCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNoQixJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDdEM7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ0csU0FBUyxDQUFDLE1BQW1CO1FBQzVDLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBaUMsQ0FBQztRQUNyRCxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxnQkFBZ0I7SUFDUiwyQkFBMkIsQ0FBQyxVQUF1QztRQUN2RSxJQUFJLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELGdCQUFnQjtJQUNSLGNBQWMsQ0FBQyxLQUFjO1FBQ2pDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxLQUFLLE1BQU0sRUFBRTtZQUN2QyxzRUFBc0U7WUFFdEUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxzRUFBd0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDakUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzNEO0lBQ0wsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7Ozs7O0FDblE0QztBQUV0QyxNQUFlLHVCQUF3QixTQUFRLHNEQUFXO0lBQWpFOztRQUNJLGdCQUFnQjtRQUNSLGFBQVEsR0FBRyxLQUFLLENBQUM7SUFVN0IsQ0FBQztJQVJHLElBQUksT0FBTyxLQUFjLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFFaEQsZ0JBQWdCO0lBQ2hCLGVBQWUsQ0FBQyxLQUFjO1FBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQzFCLENBQUM7Q0FHSjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDYjBFO0FBRXRCO0FBRW9CO0FBS3pFOzs7Ozs7R0FNRztBQUVJLE1BQWUsV0FBWSxTQUFRLDhEQUFZO0lBd0RsRCxnQkFBZ0I7SUFDaEIsWUFBNEIsYUFBNEIsRUFDcEQsTUFBMEI7SUFDMUIsZ0JBQWdCO0lBQ1IsT0FBMkI7SUFDbkMsZ0JBQWdCO0lBQ0MsUUFBcUI7UUFFdEMsS0FBSyxFQUFFLENBQUM7UUFQZ0Isa0JBQWEsR0FBYixhQUFhLENBQWU7UUFHNUMsWUFBTyxHQUFQLE9BQU8sQ0FBb0I7UUFFbEIsYUFBUSxHQUFSLFFBQVEsQ0FBYTtRQXpEMUMsZ0JBQWdCO1FBQ1Isb0JBQWUsR0FBYSxFQUFFLENBQUM7UUE0RG5DLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFFckIsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFFekIsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUNoQyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBRXRDLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztRQUVyQyxJQUFJLENBQUMseUJBQXlCLEdBQUcsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXpDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBdERELElBQUksSUFBSSxLQUFlLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDM0MsSUFBSSxFQUFFLEtBQWEsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNyQyxJQUFJLEVBQUUsQ0FBQyxLQUFhLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzNDLGdCQUFnQjtJQUNoQixJQUFJLGNBQWMsS0FBZSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0lBQy9ELElBQUksTUFBTSxLQUF5QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3pELElBQUksWUFBWSxLQUFvQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLElBQUksVUFBVSxLQUFjLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDdEQsSUFBSSxPQUFPLEtBQWtCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDcEQsSUFBSSxhQUFhLEtBQWMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztJQUU1RCxNQUFNLENBQUMsT0FBTyxDQUFDLElBQWlCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN4QixDQUFDO0lBRUQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFpQjtRQUNwQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDNUIsQ0FBQztJQUVELE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxJQUFpQjtRQUM5QyxPQUFPLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6QyxDQUFDO0lBNkNEOzs7O09BSUc7SUFDSCxXQUFXLENBQUMsV0FBd0IsRUFBRSxTQUFTLEdBQUcsS0FBSztRQUNuRDs7V0FFRztRQUNILE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXREOztXQUVHO1FBQ0gsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDZCxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7U0FDckU7UUFFRDs7O1dBR0g7UUFDRyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDOUI7UUFFRDs7V0FFRztRQUNILElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUVwQzs7V0FFRztRQUNILElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQy9CLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDMUI7YUFBTTtZQUNIOztlQUVHO1lBQ0gscURBQXFEO1lBQ3JELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNoQixJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxFQUFFO29CQUN2QixNQUFNLElBQUksdUVBQW1CLENBQUMsV0FBVyxDQUFDLENBQUM7aUJBQzlDO3FCQUFNO29CQUNILElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNsQzthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCw2REFBNkQ7SUFDN0QsUUFBUSxDQUFDLFdBQXdCLEVBQUUsS0FBcUIsRUFBRSxhQUF1QjtRQUM3RSxLQUFLLGFBQUwsS0FBSyxjQUFMLEtBQUssSUFBTCxLQUFLLEdBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUM7UUFFcEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNqRCxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTVCLElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxJQUFJLElBQUksV0FBVyxDQUFDLGNBQWMsS0FBSyxLQUFLLEVBQUU7WUFDdEUsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ3RCO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsWUFBWSxDQUFDLFFBQXFCLEVBQUUsUUFBcUIsRUFBRSxlQUFlLEdBQUcsS0FBSztRQUM5RSxzREFBc0Q7UUFDdEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkQsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFFaEQsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDZCxNQUFNLElBQUksK0RBQVcsQ0FBQyxZQUFZLEVBQUUscURBQXFELENBQUMsQ0FBQztTQUM5RjtRQUVELElBQUksVUFBVSxLQUFLLElBQUksRUFBRTtZQUNyQixNQUFNLElBQUksdUVBQW1CLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDL0M7YUFBTTtZQUNILFVBQVUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFOUQ7O2NBRUU7WUFDRixJQUFJLGVBQWUsS0FBSyxJQUFJLEVBQUU7Z0JBQzFCLFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUN4QixRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxpREFBaUQ7YUFDeEU7WUFFRDs7Y0FFRTtZQUNGLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxDQUFDO1lBQ3JDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsa0RBQWtEO1lBQ2xELFFBQVEsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztZQUM5QixRQUFRLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDdEMsUUFBUSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBQ3BDLFFBQVEsQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztZQUU1Qyw4RkFBOEY7WUFDOUYsSUFBSSxRQUFRLENBQUMsT0FBTyxLQUFLLElBQUksRUFBRTtnQkFDM0IsTUFBTSxJQUFJLHVFQUFtQixDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQ2hEO2lCQUFNO2dCQUNILElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEtBQUssSUFBSSxJQUFJLFFBQVEsQ0FBQyxjQUFjLEtBQUssS0FBSyxFQUFFO29CQUMvRSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7aUJBQ25CO2dCQUVELElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDMUI7U0FDSjtJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNO1FBQ0YsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksRUFBRTtZQUN2QixNQUFNLElBQUksdUVBQW1CLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDN0M7YUFBTTtZQUNILElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2xDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU07UUFDRixNQUFNLFFBQVEsR0FBRyx5REFBVyxFQUFFLENBQUM7UUFDL0IsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMzRyxJQUFJLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDM0MsT0FBTyxhQUFhLENBQUM7SUFDekIsQ0FBQztJQUlELGdCQUFnQjtJQUNoQixzQkFBc0I7UUFDbEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUN4QyxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDO1FBQ2xDLE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxDQUFxQixLQUFLLENBQUMsQ0FBQztRQUNwRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzVCLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQy9CO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixpQkFBaUIsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLElBQW9CO1FBQ3hELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQztRQUNuRSxJQUFJLG1CQUFtQixLQUFLLElBQUksRUFBRTtZQUM5QixNQUFNLElBQUksdUVBQW1CLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDL0M7YUFBTTtZQUNILG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDOUM7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLDZEQUE2RDtJQUM3RCxNQUFNLENBQUMsV0FBd0IsRUFBRSxJQUFzQjtRQUNuRCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsSUFBSTtRQUNBLElBQUksQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMzQyxJQUFJO1lBQ0Esd0hBQXdIO1lBQ3hILHNEQUFzRDtZQUN0RCxrREFBa0Q7WUFDbEQseUVBQTJCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNqRCxnREFBZ0Q7WUFFaEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNoRCxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2FBQ2hDO1NBQ0o7Z0JBQVM7WUFDTixJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixFQUFFLENBQUM7U0FDNUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsT0FBTztRQUNILEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNoRCxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ25DO1FBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFFeEIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMscUJBQXFCLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVEOzs7T0FHRztJQUNILGNBQWMsQ0FBQyxPQUFxQjtRQUNoQyxPQUFPLEdBQUcsT0FBTyxhQUFQLE9BQU8sY0FBUCxPQUFPLEdBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUVuQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUM3QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQy9DLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7UUFFbEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN6QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBRTNCLE9BQU87WUFDSCxFQUFFLEVBQUUsSUFBSTtZQUNSLEVBQUUsRUFBRSxHQUFHO1lBQ1AsRUFBRSxFQUFFLElBQUksR0FBRyxLQUFLO1lBQ2hCLEVBQUUsRUFBRSxHQUFHLEdBQUcsTUFBTTtZQUNoQixPQUFPLEVBQUUsS0FBSyxHQUFHLE1BQU07WUFDdkIsV0FBVyxFQUFFLElBQUk7U0FDcEIsQ0FBQztJQUNOLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsd0JBQXdCO1FBQ3BCLElBQUksSUFBSSxHQUF1QixJQUFJLENBQUM7UUFFcEMsT0FBTyxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQ2xCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDN0QsT0FBTyxJQUFJLENBQUM7YUFDZjtZQUNELElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1NBQ3RCO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7bUJBR2U7SUFDZixhQUFhO1FBQ1QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFFL0MsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssSUFBSSxFQUFFO1lBQzNDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMxRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7U0FFM0M7YUFBTSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFO1lBQ3RDLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO1NBQ2pFO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxJQUFJO1FBQ0EsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDM0IsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxnQkFBZ0I7SUFDTixTQUFTLENBQUMsTUFBbUI7UUFDbkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7SUFDMUIsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixnQkFBZ0IsQ0FBQyxFQUFVO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUNuQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNoQztJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDTixnQkFBZ0I7UUFDdEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2hELElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDaEM7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ04sSUFBSTtRQUNWLElBQUksQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMzQyxJQUFJO1lBQ0EseUVBQTJCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNsRCxnREFBZ0Q7U0FDbkQ7Z0JBQVM7WUFDTixJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixFQUFFLENBQUM7U0FDNUM7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ04sc0JBQXNCLENBQUMsS0FBYztRQUMzQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDaEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDM0M7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGtCQUFrQixDQUFDLE9BQXNDO1FBQzdELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDN0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQWMsS0FBSyxDQUFDLENBQUM7UUFDN0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDckMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3RFO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSyxjQUFjLENBQUMsSUFBWSxFQUFFLElBQWU7UUFDaEQsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNuQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxLQUFLLFlBQVksOERBQVksQ0FBQyxhQUFhO2dCQUMzQyxLQUFLLENBQUMsb0JBQW9CLEtBQUssS0FBSztnQkFDcEMsSUFBSSxDQUFDLGNBQWMsS0FBSyxJQUFJLEVBQUU7Z0JBRTlCOzs7OzttQkFLRztnQkFDSCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7b0JBQ3pDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztpQkFDekM7cUJBQU07b0JBQ0gsSUFBSSxDQUFDLHVDQUF1QyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztpQkFDN0Q7YUFDSjtTQUNKO0lBQ0wsQ0FBQztJQUVRLGNBQWMsQ0FBQyxJQUFZLEVBQUUsSUFBZTtRQUNqRCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ25CLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLEtBQUssWUFBWSw4REFBWSxDQUFDLGFBQWE7Z0JBQzNDLEtBQUssQ0FBQyxvQkFBb0IsS0FBSyxLQUFLO2dCQUNwQyxJQUFJLENBQUMsY0FBYyxLQUFLLElBQUksRUFDOUI7Z0JBQ0U7Ozs7O21CQUtHO2dCQUNILElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtvQkFDekMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO2lCQUN6QztxQkFBTTtvQkFDSCxJQUFJLENBQUMsdUNBQXVDLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO2lCQUM3RDthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNLLHVDQUF1QyxDQUFDLElBQVksRUFBRSxLQUFpQztRQUMzRixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDNUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQy9DO2FBQU07WUFDSCxJQUFJLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUU7Z0JBQy9DLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7Z0JBQzVDLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDM0Y7U0FDSjtJQUVMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLDZCQUE2QixDQUFDLElBQVksRUFBRSxLQUFpQztRQUNqRixJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQzdDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNoRCxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JoQjBHO0FBQ3dGO0FBQ3ZIO0FBR0o7QUFDMkI7QUFDbEQ7QUFDcUI7QUFDekI7QUFDQztBQUU5Qzs7Ozs7R0FLRztBQUNJLE1BQU0sVUFBVyxTQUFRLCtFQUF1QjtJQUluRCxZQUFZLGFBQTRCLEVBQUUsY0FBa0QsRUFBRSxnQkFBNkI7UUFFdkgsS0FBSyxDQUFDLGFBQWEsRUFBRSw2RUFBd0IsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUVoSCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUMzQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsZ0JBQWdCLENBQUM7UUFFMUMsa0RBQWtEO1FBQ2xELElBQUksTUFBTSxHQUFxQixJQUFJLENBQUM7UUFDcEMsT0FBTyxJQUFJLEVBQUU7WUFDVCxNQUFNLElBQUksR0FDTixNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUM7WUFDdkUsSUFBSSxJQUFJLFlBQVksT0FBTzttQkFDcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLDRCQUFnQyxFQUFFO2dCQUM1RCxNQUFNLEdBQUcsSUFBSSxDQUFDO2FBQ2pCO2lCQUFNO2dCQUNILE1BQU07YUFDVDtTQUNKO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFUSxJQUFJO1FBQ1QsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLElBQUk7WUFBRSxPQUFPO1FBRXhDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUV0QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDL0MsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3pFO1FBRUQsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRWIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7T0FHRztJQUNILFFBQVEsQ0FBQyxjQUFrRDtRQUN2RCxvQ0FBb0M7UUFDcEMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRWpCLElBQUksY0FBYyxLQUFLLFNBQVMsRUFBRTtZQUM5QixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMxRixJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNyQztJQUNMLENBQUM7SUFFRCxTQUFTO1FBQ0wsb0NBQW9DO1FBQ3BDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDdkMsUUFBUSxZQUFZLENBQUMsTUFBTSxFQUFFO1lBQ3pCLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ0osT0FBTzthQUNWO1lBQ0QsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDSixNQUFNLHVCQUF1QixHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDaEQsdUJBQXVCLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2pDLE9BQU87YUFDVjtZQUNELE9BQU8sQ0FBQyxDQUFDO2dCQUNMLE1BQU0sSUFBSSwrREFBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ3RDO1NBQ0o7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE9BQU8sQ0FBQyxVQUF5RSxFQUM3RSxLQUFjO1FBRWQsSUFBSSxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1FBRWpELE1BQU0sa0JBQWtCLEdBQUcsc0RBQVUsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2pFLElBQUksTUFBbUIsQ0FBQztRQUN4QixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM5QixNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNqQzthQUFNO1lBQ0gsNERBQTREO1lBQzVELE1BQU0sR0FBRyxJQUFJLENBQUM7U0FDakI7UUFDRCxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUU7WUFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1NBQ2hFO2FBQU07WUFDSCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzVGLEtBQUssR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM1QyxPQUFPLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1NBQ3pDO0lBQ0wsQ0FBQztJQUVELG1CQUFtQixDQUFDLFVBQStCO1FBQy9DLG9DQUFvQztRQUNwQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFakIsTUFBTSxrQkFBa0IsR0FBRyxzREFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFnQyxDQUFDO1FBRWhHLElBQUksa0JBQWtCLENBQUMsU0FBUyxFQUFFO1lBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztTQUN6RDthQUFNO1lBQ0gsTUFBTSxlQUFlLEdBQUcsSUFBSSwwREFBYSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDeEYsZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3JDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNNLFFBQVEsQ0FBQyxXQUF3QixFQUFFLEtBQWM7UUFDdEQsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1NBQy9EO2FBQU07WUFDSCw4RUFBOEU7WUFDOUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDN0QsS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBRTNDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBRTNDLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNQLHNCQUFzQjtRQUMzQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3ZDLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUM7UUFDbEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQXlCLEtBQUssQ0FBQyxDQUFDO1FBQ3hELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDNUIsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQyxJQUFJLDJFQUFzQixDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxFQUFFO2dCQUNyRCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDO2FBQzFCO2lCQUFNO2dCQUNILE1BQU0sSUFBSSwrREFBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ3RDO1NBQ0o7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLE9BQU8sQ0FBQyxLQUFhLEVBQUUsTUFBYztRQUNqQyxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtZQUM3QyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsNENBQTRDO1NBQ3ZFO2FBQU07WUFDSCw2REFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDckMsOERBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUV2QywwQkFBMEI7WUFDMUIsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzlCLDZEQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3JELDhEQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2FBQzFEO1lBRUQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3JDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNNLFVBQVUsQ0FBQyxLQUFjO1FBQzlCLElBQUksQ0FBQyxhQUFhLENBQUMsZ0NBQWdDLEVBQUUsQ0FBQztRQUN0RCxJQUFJO1lBQ0EsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN0QztnQkFBUztZQUNOLElBQUksQ0FBQyxhQUFhLENBQUMsOEJBQThCLEVBQUUsQ0FBQztTQUN2RDtJQUNMLENBQUM7SUFFRCxlQUFlO1FBQ1gsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBRXBCLE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3BELE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxDQUFrQixNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztRQUVaLEtBQUssTUFBTSxHQUFHLElBQUksYUFBYSxFQUFFO1lBQzdCLE1BQU0sSUFBSSxHQUFHLEdBQWtDLENBQUM7WUFDaEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBcUIsQ0FBQztZQUN0RCxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUU7Z0JBQ2YsTUFBTSxJQUFJLHVFQUFtQixDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQzlDO2lCQUFNO2dCQUNILElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO2dCQUNqQixJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHO29CQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQzs7b0JBRWxELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDO2dCQUN0RCxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDekQsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO2FBQ3hCO1NBQ0o7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRVEsaUJBQWlCLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxJQUFvQjtRQUNqRSxJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQy9DLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFUSxNQUFNLENBQUMsV0FBd0IsRUFBRSxJQUFxQjtRQUUzRCxJQUFJLFdBQVcsQ0FBQyxXQUFXLEVBQUU7WUFDekIsTUFBTSxVQUFVLEdBQUcsNEVBQXVCLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDM0QseUZBQXlGO1lBQ3pGLE1BQU0sU0FBUyxHQUFHLFdBQTRCLENBQUM7WUFDL0MsVUFBVSxDQUFDLE1BQU0sR0FBRywrRUFBMEIsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN6RixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM1RSxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzVCLFdBQVcsR0FBRyxLQUFLLENBQUM7U0FDdkI7UUFFRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNoQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQzlCO2FBQU07WUFDSDs7OztlQUlHO1lBQ0gsSUFBRyxXQUFXLENBQUMsSUFBSSxLQUFLLGtEQUFRLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLEtBQUssa0RBQVEsQ0FBQyxNQUFNLEVBQUM7Z0JBQ3pFLE1BQU0sVUFBVSxHQUFHLDRFQUF1QixDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUMzRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDckUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7Z0JBQzNCLFdBQVcsR0FBRyxLQUFLO2FBQ3RCO1lBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLGtEQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxrREFBUSxDQUFDLE1BQU0sQ0FBQztZQUNsRSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQztZQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxDQUFDLE1BQU0sWUFBWSx1REFBVyxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUU7Z0JBQzFELE1BQU0sVUFBVSxHQUFHLHVFQUFrQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDMUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzNFLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUN2QyxXQUFXLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUN0RSxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNqRSxNQUFNLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDakIsV0FBVyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ3RCLFdBQVcsQ0FBQyxRQUFRLEdBQUcsc0RBQVksQ0FBQyxPQUFPLENBQUM7Z0JBQzVDLFdBQVcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDakM7aUJBQU07Z0JBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2dCQUN0RixNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNqRSxPQUFPLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQztnQkFDcEIsV0FBVyxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUNoQyxXQUFXLENBQUMsUUFBUSxHQUFHLHNEQUFZLENBQUMsT0FBTyxDQUFDO2dCQUM1QyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzVCO1NBQ0o7SUFDTCxDQUFDO0lBRUQsK0dBQStHO0lBQy9HLHVIQUF1SDtJQUN2SCxrQkFBa0I7SUFDbEIsSUFBSTtRQUNBLE1BQU0sSUFBSSwrREFBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCwrR0FBK0c7SUFDL0csa0lBQWtJO0lBQ2xJLGtCQUFrQjtJQUNsQixlQUFlO1FBQ1gsTUFBTSxJQUFJLCtEQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELGtCQUFrQjtRQUNkLE1BQU0sTUFBTSxHQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxvQkFBb0I7UUFDaEIsTUFBTSxNQUFNLEdBQWtCLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuRixPQUF3QixNQUFNLENBQUM7SUFDbkMsQ0FBQztJQUVELHVCQUF1QjtRQUNuQixNQUFNLE1BQU0sR0FBa0IsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO1lBQzVELElBQUksc0RBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO2dCQUN2RCxPQUFPLElBQUksQ0FBQzthQUNmO2lCQUFNO2dCQUNILElBQUksc0RBQVcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO29CQUMvRCxPQUFPLElBQUksQ0FBQztpQkFDZjtxQkFBTTtvQkFDSCxPQUFPLEtBQUssQ0FBQztpQkFDaEI7YUFDSjtRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVELHVCQUF1QixDQUFDLGFBQXFCO1FBQ3pDLE1BQU0sTUFBTSxHQUFrQixFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQzlHLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxRQUFRO1FBQ0osTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCw2REFBNkQ7SUFDN0Qsc0JBQXNCLENBQUMsSUFBbUIsRUFBRSxLQUFjLEVBQUUsa0JBQTJCO1FBQ25GLHdFQUF3RTtJQUM1RSxDQUFDO0lBRU8sY0FBYztRQUNsQixNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLDRFQUE4QixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRWpGLDZEQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNyQyw4REFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXZDOztXQUVHO1FBQ0gsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDOUIsNkRBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNyRCw4REFBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztTQUMxRDtJQUNMLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxPQUErQixFQUFFLE1BQXFCO1FBQ2pGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3JDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQixNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ2pFO0lBQ0wsQ0FBQztJQUVPLHNCQUFzQixDQUFDLE9BQStCLEVBQUUsTUFBcUIsRUFDakYsY0FBNEQ7UUFFNUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDckMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksY0FBYyxDQUFDLFdBQVcsQ0FBQyxFQUFFO2dCQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQzVCO1lBQ0QsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1NBQ2pGO0lBQ0wsQ0FBQztDQUVKO0FBRUQsZ0JBQWdCO0FBQ2hCLFdBQWlCLFVBQVU7SUFLdkIsSUFBaUIsSUFBSSxDQWdCcEI7SUFoQkQsV0FBaUIsSUFBSTtRQVVKLGtCQUFhLEdBQVU7WUFDaEMsRUFBRSxFQUFFLElBQUk7WUFDUixFQUFFLEVBQUUsSUFBSTtZQUNSLEVBQUUsRUFBRSxJQUFJO1lBQ1IsRUFBRSxFQUFFLElBQUk7U0FDWCxDQUFDO0lBQ04sQ0FBQyxFQWhCZ0IsSUFBSSxHQUFKLGVBQUksS0FBSixlQUFJLFFBZ0JwQjtJQUVELFNBQWdCLGFBQWEsQ0FBQyxRQUFrQjtRQUM1QyxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxzQ0FBcUMsQ0FBQztRQUMzRCxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsc0JBQTZCLENBQUM7UUFDbkQsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLHNCQUE2QixDQUFDO1FBQ25ELE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7SUFOZSx3QkFBYSxnQkFNNUI7QUFDTCxDQUFDLEVBOUJnQixVQUFVLEtBQVYsVUFBVSxRQThCMUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3paeUc7QUFFM0Q7QUFDNEI7QUFHa0I7QUFTdEU7QUFFcUI7QUFFNUMsY0FBYztBQUNQLE1BQU0sV0FBWSxTQUFRLHNEQUFXO0lBc0J4QyxnQkFBZ0I7SUFDaEIsWUFBWSxRQUFpQixFQUFFLGFBQTRCLEVBQUUsTUFBcUM7SUFDOUYsZ0JBQWdCO0lBQ1Isa0JBQStCO1FBRXZDLEtBQUssQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLGtCQUFrQixFQUFFLFdBQVcsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFGeEYsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFhO1FBWjNDLGdCQUFnQjtRQUNDLGNBQVMsR0FBZSxFQUFFLENBQUM7UUFleEMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUN2QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUV6QixJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUMzQyxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztRQUN2RSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsYUFBYSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDO1FBQy9FLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQzFCLElBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUNoRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQzlCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7UUFDakMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUVqQyxRQUFRLE1BQU0sQ0FBQyxJQUFJLEVBQUU7WUFDakIsS0FBSyxrREFBUSxDQUFDLEdBQUcsQ0FBQztZQUNsQixLQUFLLGtEQUFRLENBQUMsTUFBTTtnQkFDaEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUMvQixNQUFNO1lBQ1Y7Z0JBQ0ksTUFBTSxJQUFJLCtEQUFXLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDNUM7SUFDTCxDQUFDO0lBRUQsWUFBWSxDQUFDLGFBQXdCLEVBQUUsY0FBMEIsRUFBRSxLQUFjLEVBQUUsS0FBYztRQUM3RixNQUFNLFVBQVUsR0FBd0I7WUFDcEMsSUFBSSxFQUFFLFdBQVc7WUFDakIsYUFBYTtZQUNiLGNBQWM7WUFDZCxLQUFLO1NBQ1IsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFrQixDQUFDO0lBQzVELENBQUM7SUFFRCxZQUFZLENBQUMsYUFBd0IsRUFBRSxjQUEwQixFQUFFLEtBQWMsRUFBRSxLQUFjO1FBQzdGLE1BQU0sVUFBVSxHQUF3QjtZQUNwQyxJQUFJLEVBQUUsV0FBVztZQUNqQixhQUFhO1lBQ2IsY0FBYztZQUNkLEtBQUs7U0FDUixDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsT0FBTyxDQUFDLFVBQXlFLEVBQUcsS0FBYztRQUM5RixLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU3QyxJQUFJLHNEQUFXLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsc0RBQVUsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRTtZQUMxRSx1RkFBdUY7WUFDdkYsT0FBTyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3RDO2FBQU07WUFDSCxPQUFPLFdBQVcsQ0FBQztTQUN0QjtJQUNMLENBQUM7SUFFRCxPQUFPLENBQUMsVUFBeUUsRUFDN0UsS0FBYztRQUVkLElBQUksQ0FBQyxhQUFhLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUNqRCxNQUFNLGtCQUFrQixHQUFHLHNEQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqRSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFGLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNNLFFBQVEsQ0FBQyxXQUF3QixFQUFFLEtBQWMsRUFBRSxhQUF1QjtRQUUvRSw4RUFBOEU7UUFFOUUsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3JCLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztTQUNwQztRQUVELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzlCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1lBRTVFLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRTtnQkFDWCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUFDO2dCQUN4RixlQUFlLENBQUMscUJBQXFCLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUMxRTtpQkFBTTtnQkFDSCxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLEVBQUUsZUFBZSxDQUFDLENBQUM7Z0JBQ25GLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzdFO1NBQ0o7YUFBTTtZQUNILElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2hFO1FBRUQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFbkMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUM7UUFFekQsSUFBSSxhQUFhLEtBQUssSUFBSSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUMzQyxPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMvQyxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEQsSUFBSSxrQkFBa0IsS0FBSyxXQUFXLEVBQUU7Z0JBQ3BDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDO2FBQ2xDO2lCQUFNO2dCQUNILE1BQU0sUUFBUSxHQUFHLGtCQUFrQixDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxXQUFXLENBQUMsR0FBRyxHQUFHLENBQUM7Z0JBQ3RFLGtCQUFrQixDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7YUFDdEM7U0FDSjtRQUVELElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRTNDLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDTSxXQUFXLENBQUMsV0FBd0IsRUFBRSxTQUFrQjtRQUM3RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNyRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFN0MsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDZCxNQUFNLElBQUksS0FBSyxDQUFDLHFFQUFxRSxDQUFDLENBQUM7U0FDMUY7UUFFRDs7O1dBR0c7UUFDSCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEVBQUU7WUFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDM0M7UUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUUxQyxvRUFBb0U7UUFDcEUsOENBQThDO1FBQzlDLG9DQUFvQztRQUNwQyxtRUFBbUU7UUFDbkUsV0FBVztRQUNYLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzNDLElBQUk7SUFDUixDQUFDO0lBRUQ7O09BRUc7SUFDTSxZQUFZLENBQUMsUUFBcUIsRUFBRSxRQUFxQjtRQUM5RCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQzNCLEtBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7T0FFRztJQUNNLFVBQVUsQ0FBQyxLQUFjO1FBQzlCLElBQUksQ0FBQyxhQUFhLENBQUMsZ0NBQWdDLEVBQUUsQ0FBQztRQUN0RCxJQUFJO1lBQ0EsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN0QztnQkFBUztZQUNOLElBQUksQ0FBQyxhQUFhLENBQUMsOEJBQThCLEVBQUUsQ0FBQztTQUN2RDtJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNNLElBQUk7UUFDVCxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSTtZQUFFLE9BQU87UUFFeEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRXRCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMvQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDekU7UUFFRCxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFYixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ25ELElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2xHO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELFFBQVE7UUFDSixNQUFNLE1BQU0sR0FBa0M7WUFDMUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUF3QjtZQUNuQyxPQUFPLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixFQUFpRTtZQUNyRyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7WUFDWCxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7U0FDOUI7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQsZ0JBQWdCO0lBQ0csU0FBUyxDQUFDLE1BQW1CO1FBQzVDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxNQUFNLENBQUM7UUFDakMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IsY0FBYztRQUNsQixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM5QixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztTQUMzQjtRQUNELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxnQkFBZ0I7UUFDcEIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFFcEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQy9DLElBQUksYUFBYSxDQUFDLGVBQWUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUN2QyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDaEM7WUFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ2hCLDZEQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUMzRSw4REFBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDOUU7aUJBQU07Z0JBQ0gsNkRBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzFFLDhEQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUMvRTtTQUNKO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxzQkFBc0I7UUFDMUIsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDOUUsTUFBTSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxHQUFHLHNFQUF3QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU5RixJQUFJLFNBQWlCLENBQUM7UUFDdEIsSUFBSSxhQUFxQixDQUFDO1FBQzFCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNoQixTQUFTLEdBQUcsYUFBYSxHQUFHLGlCQUFpQixDQUFDO1lBQzlDLGFBQWEsR0FBRyxZQUFZLENBQUM7U0FDaEM7YUFBTTtZQUNILFNBQVMsR0FBRyxZQUFZLEdBQUcsaUJBQWlCLENBQUM7WUFDN0MsYUFBYSxHQUFHLGFBQWEsQ0FBQztTQUNqQztRQUVELElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztRQUN0QixNQUFNLFNBQVMsR0FBYSxFQUFFLENBQUM7UUFFL0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQy9DLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekMsSUFBSSxRQUFnQixDQUFDO1lBQ3JCLElBQUksV0FBVyxDQUFDLFFBQVEsS0FBSyxzREFBWSxDQUFDLE9BQU8sRUFBRTtnQkFDL0MsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQy9EO2lCQUFNO2dCQUNILE1BQU0sSUFBSSwrREFBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ3ZDO1lBRUQsYUFBYSxJQUFJLFFBQVEsQ0FBQztZQUMxQixTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzVCO1FBRUQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsYUFBYSxDQUFDLENBQUM7UUFFOUQsT0FBTztZQUNILFNBQVM7WUFDVCxlQUFlO1lBQ2YsU0FBUztZQUNULGFBQWE7U0FDaEIsQ0FBQztJQUNOLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQW1CRztJQUNLLHNCQUFzQjtRQUUxQixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxNQUFNLHVCQUF1QixHQUFrQixFQUFFLENBQUM7UUFDbEQsSUFBSSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7UUFFNUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQy9DLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekMsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQztZQUN0QyxRQUFRLFFBQVEsRUFBRTtnQkFDZCxLQUFLLHNEQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3ZCLEtBQUssSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDO29CQUMxQixNQUFNO2lCQUNUO2dCQUNELEtBQUssc0RBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDMUIsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUMxQyxtQkFBbUIsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDO29CQUN4QyxNQUFNO2lCQUNUO2dCQUNEO29CQUNJLE1BQU0sSUFBSSwrREFBVyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7YUFDekU7U0FDSjtRQUVEOztXQUVHO1FBQ0gsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsRUFBRTtZQUMzQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMxQixPQUFPO1NBQ1Y7YUFBTTtZQUNIOztlQUVHO1lBQ0gsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSx1QkFBdUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMvRCxNQUFNLHVCQUF1QixHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUM7Z0JBQzVDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyx1QkFBdUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ3JELE1BQU0sV0FBVyxHQUFHLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMvQyxXQUFXLENBQUMsSUFBSSxHQUFHLHVCQUF1QixHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxtQkFBbUIsQ0FBQyxDQUFDO29CQUN0RixXQUFXLENBQUMsUUFBUSxHQUFHLHNEQUFZLENBQUMsT0FBTyxDQUFDO2lCQUMvQztnQkFDRCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDMUIsT0FBTzthQUNWO2lCQUFNO2dCQUVIOzs7OzttQkFLRztnQkFDSCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLHVCQUF1QixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQy9ELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyx1QkFBdUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7d0JBQ3JELE1BQU0sV0FBVyxHQUFHLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUMvQyxXQUFXLENBQUMsSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsbUJBQW1CLENBQUMsQ0FBQzt3QkFDakUsV0FBVyxDQUFDLFFBQVEsR0FBRyxzREFBWSxDQUFDLE9BQU8sQ0FBQztxQkFDL0M7b0JBQ0QsS0FBSyxJQUFJLEVBQUUsQ0FBQztpQkFDZjtnQkFFRDs7bUJBRUc7Z0JBQ0gsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUMvQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN6QyxXQUFXLENBQUMsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUM7aUJBQ3ZEO2dCQUVELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2FBQzdCO1NBQ0o7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssa0JBQWtCO1FBS3RCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUzRCxJQUFJLFdBQVcsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1lBQ25ELE9BQU87U0FDVjthQUFNO1lBQ0gsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO1lBQ3JCLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztZQUN0QixNQUFNLGNBQWMsR0FBWSxFQUFFLENBQUM7WUFDbkMsTUFBTSxVQUFVLEdBQVksRUFBRSxDQUFDO1lBRS9CLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBRXBEOztlQUVHO1lBQ0gsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNyRCxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUU1QyxJQUFJLEtBQVksQ0FBQztnQkFDakIsSUFBSSxRQUFRLEdBQUcsV0FBVyxFQUFFO29CQUN4QixhQUFhLElBQUksV0FBVyxHQUFHLFFBQVEsQ0FBQztvQkFDeEMsS0FBSyxHQUFHO3dCQUNKLElBQUksRUFBRSxXQUFXO3FCQUNwQixDQUFDO2lCQUVMO3FCQUFNO29CQUNILFlBQVksSUFBSSxRQUFRLEdBQUcsV0FBVyxDQUFDO29CQUN2QyxLQUFLLEdBQUc7d0JBQ0osSUFBSSxFQUFFLFFBQVE7cUJBQ2pCLENBQUM7b0JBQ0YsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDOUI7Z0JBRUQsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUMxQjtZQUVEOztlQUVHO1lBQ0gsSUFBSSxhQUFhLEtBQUssQ0FBQyxJQUFJLGFBQWEsR0FBRyxZQUFZLEVBQUU7Z0JBQ3JELE9BQU87YUFDVjtpQkFBTTtnQkFDSDs7bUJBRUc7Z0JBQ0gsTUFBTSxhQUFhLEdBQUcsYUFBYSxHQUFHLFlBQVksQ0FBQztnQkFDbkQsSUFBSSxhQUFhLEdBQUcsYUFBYSxDQUFDO2dCQUNsQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDNUMsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNoQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsR0FBRyxhQUFhLENBQUMsQ0FBQztvQkFDM0UsYUFBYSxJQUFJLFdBQVcsQ0FBQztvQkFDN0IsS0FBSyxDQUFDLElBQUksSUFBSSxXQUFXLENBQUM7aUJBQzdCO2dCQUVEOzttQkFFRztnQkFDSCxJQUFJLGFBQWEsS0FBSyxDQUFDLEVBQUU7b0JBQ3JCLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxhQUFhLENBQUM7aUJBQzNEO2dCQUVEOzttQkFFRztnQkFDSCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQy9DLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3pDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLENBQUM7aUJBQzNFO2FBQ0o7U0FDSjtJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ssY0FBYyxDQUFDLEtBQWE7UUFDaEMsTUFBTSxRQUFRLEdBQUcsSUFBSSx3REFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMxRixRQUFRLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzNGLFFBQVEsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLFFBQVEsQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDMUMsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ssYUFBYSxDQUFDLFFBQWtCO1FBQ3BDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRS9DLE9BQU87WUFDSCxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7WUFDaEMsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztTQUN0QyxDQUFDO0lBQ04sQ0FBQztJQUVPLDJCQUEyQixDQUFDLFdBQXdCO1FBQ3hELE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUM7UUFDcEMsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFO1lBQ3ZCLElBQUksV0FBVyxDQUFDLFdBQVcsS0FBSyxzREFBWSxDQUFDLEtBQUssRUFBRTtnQkFDaEQsT0FBTyxPQUFPLENBQUM7YUFDbEI7aUJBQU07Z0JBQ0gsTUFBTSxJQUFJLCtEQUFXLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQzthQUNyRTtTQUNKO2FBQU07WUFDSCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUM7WUFDOUQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQztTQUM1RjtJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSyxpQ0FBaUMsQ0FBQyxXQUF3QjtRQUM5RCxJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUM7UUFFeEIsS0FBSyxNQUFNLEtBQUssSUFBSSxXQUFXLENBQUMsWUFBWSxFQUFFO1lBQzFDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUU5RCxJQUFJLFdBQVcsWUFBWSxXQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRTtnQkFDakYsZUFBZSxJQUFJLE9BQU8sQ0FBQyxDQUFDLGtFQUFrRTthQUNqRztpQkFBTTtnQkFDSCxlQUFlLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7YUFDeEQ7U0FDSjtRQUVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM5RCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssbUJBQW1CLENBQUMsUUFBa0I7UUFDMUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUUzQyxNQUFNLFdBQVcsR0FBRyw0REFBYyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUNoRixNQUFNLFNBQVMsR0FBRyw0REFBYyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUM3RSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsaUNBQWlDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNFLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFekUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsU0FBUyxHQUFHLFlBQVksQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNLLGNBQWMsQ0FBQyxRQUFrQixFQUFFLE9BQWUsRUFBRSxPQUFlO1FBQ3ZFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBRWhELElBQUksSUFBSSxDQUFDLG9CQUFvQixLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsb0JBQW9CLEtBQUssSUFBSSxFQUFFO1lBQzFFLE1BQU0sSUFBSSx1RUFBbUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUNoRDtRQUNELE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNyRCxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFFckQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQztRQUNoQyxNQUFNLFlBQVksR0FBRyw0REFBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNoQixRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsWUFBWSxDQUFDO1NBQzdDO2FBQU07WUFDSCxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDO1NBQzlDO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssa0JBQWtCLENBQUMsUUFBa0I7UUFDekMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEtBQUssSUFBSSxFQUFFO1lBQ2pDLE1BQU0sSUFBSSx1RUFBbUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUNqRDthQUFNO1lBQ0gsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzQyxNQUFNLFVBQVUsR0FBRyw0REFBYyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUMvRSxNQUFNLFNBQVMsR0FBRyw0REFBYyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUM3RSxNQUFNLHVCQUF1QixHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxDQUFDO1lBQ2pHLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFFL0QsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsdUJBQXVCLEdBQUcsaUJBQWlCLENBQUM7WUFDaEUsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsdUJBQXVCLENBQUMsR0FBRyxpQkFBaUIsQ0FBQztZQUVyRSxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsNERBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsNERBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVoRCxVQUFVLENBQUMscUJBQXFCLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQ2xFO0lBQ0wsQ0FBQztDQUNKO0FBRUQsY0FBYztBQUNkLFdBQWlCLFdBQVc7SUFTeEIsZ0JBQWdCO0lBQ2hCLFNBQWdCLHVCQUF1QixDQUFDLE9BQW9CLEVBQUUsU0FBb0M7UUFDOUYsSUFBSSxTQUFTLEtBQUssT0FBTyxFQUFFO1lBQ3ZCLE9BQU8sNkRBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNuQzthQUFNO1lBQ0gsT0FBTyw4REFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNwQztJQUNMLENBQUM7SUFOZSxtQ0FBdUIsMEJBTXRDO0lBRUQsZ0JBQWdCO0lBQ2hCLFNBQWdCLHVCQUF1QixDQUFDLE9BQW9CLEVBQUUsU0FBb0MsRUFBRSxLQUFhO1FBQzdHLElBQUksU0FBUyxLQUFLLE9BQU8sRUFBRTtZQUN2QixPQUFPLDZEQUFlLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzFDO2FBQU07WUFDSCxPQUFPLDhEQUFnQixDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztTQUMzQztJQUNMLENBQUM7SUFOZSxtQ0FBdUIsMEJBTXRDO0lBRUQsZ0JBQWdCO0lBQ2hCLFNBQWdCLGFBQWEsQ0FBQyxRQUFrQixFQUFFLFFBQWlCO1FBQy9ELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLHNCQUE2QixDQUFDO1FBQ25ELElBQUksUUFBUSxFQUFFO1lBQ1YsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLDBCQUErQixDQUFDO1NBQ3hEO2FBQU07WUFDSCxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsb0JBQTRCLENBQUM7U0FDckQ7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBVGUseUJBQWEsZ0JBUzVCO0FBQ0wsQ0FBQyxFQXRDZ0IsV0FBVyxLQUFYLFdBQVcsUUFzQzNCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDenNCa0U7QUFDOEU7QUFDckc7QUFDMEQ7QUFJaEQ7QUFDOEU7QUFNNUc7QUFDeUI7QUFDcUI7QUFDekI7QUFFN0MsY0FBYztBQUNQLE1BQU0sS0FBTSxTQUFRLCtFQUF1QjtJQWdEOUMsZ0JBQWdCO0lBQ2hCLFlBQVksYUFBNEIsRUFBRSxNQUErQixFQUFFLE1BQW1COztRQUMxRixLQUFLLENBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBakN4RSxnQkFBZ0I7UUFDUix1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFNbkMsZ0JBQWdCO1FBQ1Isb0JBQWUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEQsZ0JBQWdCO1FBQ1IsdUJBQWtCLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzFELGdCQUFnQjtRQUNSLHVCQUFrQixHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQXVCdEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ25DLE1BQU0sa0JBQWtCLEdBQUcsYUFBYSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7UUFDN0QsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUNyQyxtRkFBbUY7UUFDbkYsSUFBSSxxQkFBb0UsQ0FBQztRQUN6RSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzVCLHFCQUFxQixHQUFHLFNBQVMsQ0FBQztTQUNyQzthQUFNO1lBQ0gsTUFBTSxvQkFBb0IsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUMscUJBQXFCLEdBQUksb0JBQW1ELENBQUMsTUFBTSxDQUFDLENBQUMseURBQXlEO1NBQ2pKO1FBRUQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7UUFDN0MsSUFBSSxDQUFDLHVCQUF1QixHQUFHLFlBQU0sQ0FBQyxlQUFlLG1DQUFJLENBQUMsQ0FBQyxDQUFDLG9CQUFvQjtRQUVoRix5R0FBeUc7UUFDekcsTUFBTSxJQUFJLEdBQUcsc0JBQUksQ0FBQyxhQUFhLDBDQUFFLElBQUksbUNBQUkscUJBQXFCLGFBQXJCLHFCQUFxQix1QkFBckIscUJBQXFCLENBQUUsSUFBSSxtQ0FBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7UUFDaEcsTUFBTSxNQUFNLEdBQUcsc0JBQUksQ0FBQyxhQUFhLDBDQUFFLE1BQU0sbUNBQUkscUJBQXFCLGFBQXJCLHFCQUFxQix1QkFBckIscUJBQXFCLENBQUUsTUFBTSxtQ0FBSSxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7UUFDeEcsTUFBTSxRQUFRLEdBQUcsc0JBQUksQ0FBQyxhQUFhLDBDQUFFLFFBQVEsbUNBQUkscUJBQXFCLGFBQXJCLHFCQUFxQix1QkFBckIscUJBQXFCLENBQUUsUUFBUSxtQ0FBSSxrQkFBa0IsQ0FBQyxRQUFRLENBQUM7UUFDaEgsTUFBTSxLQUFLLEdBQUcsc0JBQUksQ0FBQyxhQUFhLDBDQUFFLEtBQUssbUNBQUkscUJBQXFCLGFBQXJCLHFCQUFxQix1QkFBckIscUJBQXFCLENBQUUsS0FBSyxtQ0FBSSxrQkFBa0IsQ0FBQyxLQUFLLENBQUM7UUFDcEcsTUFBTSxRQUFRLEdBQUcsc0JBQUksQ0FBQyxhQUFhLDBDQUFFLFFBQVEsbUNBQUkscUJBQXFCLGFBQXJCLHFCQUFxQix1QkFBckIscUJBQXFCLENBQUUsUUFBUSxtQ0FBSSxrQkFBa0IsQ0FBQyxRQUFRLENBQUM7UUFDaEgsTUFBTSxXQUFXLEdBQUcsc0JBQUksQ0FBQyxhQUFhLDBDQUFFLFdBQVcsbUNBQUkscUJBQXFCLGFBQXJCLHFCQUFxQix1QkFBckIscUJBQXFCLENBQUUsV0FBVyxtQ0FBSSxrQkFBa0IsQ0FBQyxXQUFXLENBQUM7UUFDNUgsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFFBQVEsS0FBSyxLQUFLLENBQUM7UUFDNUMsTUFBTSxjQUFjLEdBQW9CO1lBQ3BDLElBQUksRUFBRSxJQUFJLEtBQUssS0FBSztZQUNwQixJQUFJLEVBQUUsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsOENBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDdEMsYUFBYSxFQUFFLE1BQU0sS0FBSyxLQUFLO1lBQy9CLFdBQVcsRUFBRSxNQUFNLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU07WUFDM0MsZUFBZSxFQUFFLElBQUksQ0FBQyxpQkFBaUI7WUFDdkMsYUFBYSxFQUFFLFFBQVEsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUTtZQUNqRCxZQUFZLEVBQUUsS0FBSyxLQUFLLEtBQUs7WUFDN0IsVUFBVSxFQUFFLEtBQUssS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSztZQUN4QyxlQUFlLEVBQUUsSUFBSTtZQUNyQixhQUFhLEVBQUUsUUFBUTtZQUN2QixrQkFBa0IsRUFBRSxXQUFXLEtBQUssS0FBSztZQUN6QyxnQkFBZ0IsRUFBRSxXQUFXLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVc7U0FDN0QsQ0FBQztRQUVGLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxvREFBTSxDQUFDLGFBQWEsRUFDbkMsSUFBSSxFQUFFLGNBQWMsRUFDcEIsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLEVBQ25DLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFDbkIsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQzlCLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFDM0IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUMsRUFDdkMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxFQUFFLENBQUMsRUFDNUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxJQUFJLENBQUMsRUFDckQsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxJQUFJLENBQUMsRUFDcEQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FDbkcsQ0FBQztRQUVGLHdCQUF3QjtRQUV4QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUVwQixJQUFJLENBQUMsc0JBQXNCLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLEdBQUcsd0JBQThCLENBQUM7UUFFeEUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3hDLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQ3hCLElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1NBQ2pEO1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUV0RCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBekZELElBQUkscUJBQXFCLEtBQWtCLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQztJQUNoRixJQUFJLE1BQU0sS0FBYSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzdDLElBQUksVUFBVSxLQUFjLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELElBQUksVUFBVSxLQUFXLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3BELElBQUksb0JBQW9CLEtBQWMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFDM0UsZ0JBQWdCO0lBQ2hCLElBQUkscUJBQXFCLEtBQThDLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQztJQUM1RyxnQkFBZ0I7SUFDaEIsSUFBSSxtQkFBbUIsS0FBYyxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7SUFDeEUsSUFBSSxXQUFXLEtBQWMsT0FBTyxJQUFJLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLElBQUksV0FBVztRQUNYLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1NBQ3hEO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUE0RUQsZ0JBQWdCO0lBQ1AsVUFBVSxDQUFDLEtBQWM7UUFDOUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQ0FBZ0MsRUFBRSxDQUFDO1FBQ3RELElBQUk7WUFDQSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3RDO2dCQUFTO1lBQ04sSUFBSSxDQUFDLGFBQWEsQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1NBQ3ZEO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNQLElBQUk7UUFDVCxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSTtZQUFFLE9BQU87UUFFeEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRXRCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMvQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDekU7UUFFRCxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFYixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3ZDLE1BQU0sZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQztRQUM3QyxJQUFJLGdCQUFnQixHQUFHLENBQUMsRUFBRSxFQUFFLDBDQUEwQztZQUNsRSxJQUFJLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLHVCQUF1QixJQUFJLGdCQUFnQixFQUFFO2dCQUN0RixNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxJQUFJLENBQUMsdUJBQXVCLFFBQVEsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7YUFDbkc7aUJBQU07Z0JBQ0gsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGdCQUFnQixFQUFFLENBQUMsRUFBRSxFQUFFO29CQUN2QyxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3BDLElBQUksQ0FBQyxDQUFDLFdBQVcsWUFBWSwwREFBYSxDQUFDLEVBQUU7d0JBQ3pDLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsUUFBUSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztxQkFDM0Y7eUJBQU07d0JBQ0gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUN2QyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7d0JBQ25CLFdBQVcsQ0FBQyxTQUFTLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztxQkFDaEQ7aUJBQ0o7Z0JBRUQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBRWhHLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7YUFDakM7U0FDSjtRQUVELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxtRUFBbUU7SUFDbkUsb0JBQW9CLENBQUMsSUFBaUI7UUFDbEMsSUFBSSxDQUFDLHNEQUFXLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQUMseURBQXlELENBQUMsQ0FBQztTQUM5RTthQUFNO1lBQ0gsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztTQUM1QztJQUNMLENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxhQUE0QixFQUFFLEtBQWMsRUFBRSxrQkFBa0IsR0FBRyxLQUFLO1FBQzNGLElBQUksSUFBSSxDQUFDLG9CQUFvQixLQUFLLGFBQWEsRUFBRTtZQUM3QyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUNqRCxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7YUFDakU7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUMzQyxJQUFJO29CQUNBLElBQUksSUFBSSxDQUFDLG9CQUFvQixLQUFLLFNBQVMsRUFBRTt3QkFDekMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxDQUFDO3FCQUNwQztvQkFDRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsYUFBYSxDQUFDO29CQUMxQyxJQUFJLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUMxRCxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7aUJBQ3hCO3dCQUFTO29CQUNOLElBQUksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztpQkFDNUM7Z0JBRUQsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxhQUFhLENBQUMsQ0FBQztnQkFDckQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsYUFBYSxDQUFDLENBQUM7Z0JBQ25FLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2FBQ2hDO1NBQ0o7UUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksS0FBSyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxhQUFhLENBQUMsdUJBQXVCLENBQUMsYUFBYSxFQUFFLGtCQUFrQixDQUFDLENBQUM7U0FDakY7SUFDTCxDQUFDO0lBRUQsbUVBQW1FO0lBQ25FLG9CQUFvQjs7UUFDaEIsT0FBTyxVQUFJLENBQUMsc0JBQXNCLEVBQUUsbUNBQUksSUFBSSxDQUFDO0lBQ2pELENBQUM7SUFFRCxzQkFBc0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDckMsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixzQkFBc0I7O1FBQ2xCLFVBQUksQ0FBQyxvQkFBb0IsMENBQUUsS0FBSyxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVELGdCQUFnQjtJQUNQLGVBQWUsQ0FBQyxLQUFjO1FBQ25DLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsWUFBWSxDQUFDLGFBQXdCLEVBQUUsY0FBMEIsRUFBRSxLQUFjLEVBQUUsS0FBYztRQUM3RixNQUFNLFVBQVUsR0FBd0I7WUFDcEMsSUFBSSxFQUFFLFdBQVc7WUFDakIsYUFBYTtZQUNiLGNBQWM7WUFDZCxLQUFLO1NBQ1IsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFrQixDQUFDO0lBQzVELENBQUM7SUFFRCxZQUFZLENBQUMsYUFBd0IsRUFBRSxjQUEwQixFQUFFLEtBQWMsRUFBRSxLQUFjO1FBQzdGLE1BQU0sVUFBVSxHQUF3QjtZQUNwQyxJQUFJLEVBQUUsV0FBVztZQUNqQixhQUFhO1lBQ2IsY0FBYztZQUNkLEtBQUs7U0FDUixDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsT0FBTyxDQUFDLFVBQStCLEVBQUcsS0FBYztRQUNwRCxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxPQUFPLENBQUMsVUFBK0IsRUFBRSxLQUFjO1FBQ25ELElBQUksQ0FBQyxhQUFhLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUVqRCxNQUFNLGtCQUFrQixHQUFHLHNEQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqRSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFGLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVRLFFBQVEsQ0FBQyxXQUF3QixFQUFFLEtBQWMsRUFBRSxLQUFLLEdBQUcsS0FBSztRQUNyRSxJQUFHLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFDO1lBQ3ZELEtBQUssSUFBSSxDQUFDLENBQUM7WUFDWCxNQUFNLElBQUksK0RBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLG9FQUFvRTtTQUMxRztRQUVELElBQUksQ0FBQyxDQUFDLFdBQVcsWUFBWSwwREFBYSxDQUFDLEVBQUU7WUFDekMsTUFBTSxJQUFJLCtEQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQywwQ0FBMEM7U0FDakY7YUFBTTtZQUNILEtBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDM0MsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNoRCxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkIsV0FBVyxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzdDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQzdCLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO0lBQ0wsQ0FBQztJQUVRLFdBQVcsQ0FBQyxXQUF3QixFQUFFLFNBQWtCO1FBQzdELE1BQU0sYUFBYSxHQUFHLFdBQTRCLENBQUM7UUFDbkQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdkQsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7UUFFMUQsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEtBQUssYUFBYSxFQUFFO1lBQzdDLElBQUksYUFBYSxDQUFDLE9BQU8sRUFBRTtnQkFDdkIsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO2FBQ3hCO1lBQ0QsSUFBSSxDQUFDLGtCQUFrQixFQUFFO2dCQUNyQixrRkFBa0Y7Z0JBQ2xGLDBFQUEwRTtnQkFDMUUsa0ZBQWtGO2dCQUNsRixNQUFNLHFCQUFxQixHQUFHLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDMUQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDakc7U0FDSjtRQUVELElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXRDLEtBQUssQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRTVDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWM7UUFDVixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ25CO2FBQU07WUFDSCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDbkI7SUFDTCxDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ25CLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0MsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUN2QyxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUM7WUFDN0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGdCQUFnQixFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN2QyxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BDLElBQUksV0FBVyxZQUFZLDBEQUFhLEVBQUU7b0JBQ3RDLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2lCQUNyQztxQkFBTTtvQkFDSCxNQUFNLElBQUksK0RBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztpQkFDdkM7YUFDSjtZQUNELElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1NBQ2hDO0lBQ0wsQ0FBQztJQUVELFFBQVE7UUFDSixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDbEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQ3ZDLE1BQU0sZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQztZQUM3QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3ZDLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEMsSUFBSSxXQUFXLFlBQVksMERBQWEsRUFBRTtvQkFDdEMsV0FBVyxDQUFDLGtCQUFrQixFQUFFLENBQUM7aUJBQ3BDO3FCQUFNO29CQUNILE1BQU0sSUFBSSwrREFBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO2lCQUN2QzthQUNKO1lBQ0QsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7U0FDaEM7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1AsT0FBTzs7UUFDWixJQUFJLFVBQUksQ0FBQyxvQkFBb0IsMENBQUUsT0FBTyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNwQztRQUNELEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDekMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDeEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7U0FDbEQ7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxRQUFRO1FBQ0osSUFBSSxlQUFtQyxDQUFDO1FBQ3hDLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQzNCLGVBQWUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUN2RSxJQUFJLGVBQWUsR0FBRyxDQUFDLEVBQUU7Z0JBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMvRDtTQUNKO1FBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksZUFBZSxLQUFLLFNBQVMsRUFBRTtZQUMvRCxNQUFNLElBQUksS0FBSyxDQUFDLDJEQUEyRCxDQUFDLENBQUM7U0FDaEY7YUFBTTtZQUNILE1BQU0sTUFBTSxHQUE0QjtnQkFDcEMsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsT0FBTyxFQUFFLElBQUksQ0FBQyxzQkFBc0IsRUFBbUM7Z0JBQ3ZFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtnQkFDZixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7Z0JBQ3ZCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDckIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUM3QixFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ1gsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO2dCQUMzQixTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVc7Z0JBQzNCLE1BQU0sRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7Z0JBQ2pDLGVBQWU7YUFDbEI7WUFDRCxPQUFPLE1BQU0sQ0FBQztTQUNqQjtJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Ba0JHO0lBQ0gsNkRBQTZEO0lBQ3BELE1BQU0sQ0FBQyxXQUF3QixFQUFFLElBQXNCO1FBQzVEOzs7V0FHRztRQUNILElBQUksSUFBSSxDQUFDLFlBQVksMEJBQXlCLEVBQUU7WUFDNUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDM0IsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRTtnQkFDL0IsTUFBTSxJQUFJLDRFQUF3QixDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ3BEO2lCQUFNO2dCQUNILElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDNUMsT0FBTzthQUNWO1NBQ0o7UUFFRDs7V0FFRztRQUNILElBQUksSUFBSSxDQUFDLFlBQVksc0JBQXVCLEVBQUU7WUFDMUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3BDLE9BQU87U0FDVjtRQUVEOzs7V0FHRztRQUNILE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLG9CQUFzQixJQUFJLElBQUksQ0FBQyxZQUFZLDBCQUF5QixDQUFDO1FBQ3pHLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLHNCQUF1QixJQUFJLElBQUksQ0FBQyxZQUFZLHdCQUF3QixDQUFDO1FBQzNHLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLG9CQUFzQixJQUFJLElBQUksQ0FBQyxZQUFZLHNCQUF1QixDQUFDO1FBQ3pHLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRS9HOztXQUVHO1FBQ0gsSUFBSSxXQUFXLENBQUMsV0FBVyxFQUFFO1lBQ3pCLE1BQU0sVUFBVSxHQUFHLDRFQUF1QixDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzNELFVBQVUsQ0FBQyxNQUFNLEdBQUksV0FBNkIsQ0FBQyxZQUFZLENBQUM7WUFDaEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDNUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM1QixXQUFXLEdBQUcsS0FBSyxDQUFDO1NBQ3ZCO1FBR0Q7Ozs7V0FJRztRQUNILElBQUcsV0FBVyxDQUFDLElBQUksS0FBSyxrREFBUSxDQUFDLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLGtEQUFRLENBQUMsTUFBTSxFQUFDO1lBQ3pFLE1BQU0sVUFBVSxHQUFHLDRFQUF1QixDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzNELFVBQVUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDOUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDckUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7WUFDM0IsV0FBVyxHQUFHLEtBQUs7U0FDdEI7UUFFRDs7O1dBR0c7UUFDSCxJQUFJLGdCQUFnQixFQUFFO1lBQ2xCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxRCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDL0UsSUFBSSxDQUFDLElBQUksSUFBSSxHQUFHLENBQUM7WUFDakIsV0FBVyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQzdCLFdBQVcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUNyQyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQzs7O2VBR0c7U0FDTjthQUFNO1lBQ0gsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxrREFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsa0RBQVEsQ0FBQyxHQUFHLENBQUM7WUFDekQsTUFBTSxVQUFVLEdBQUcsdUVBQWtCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBdUIsQ0FBQztZQUNoRixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMzRSxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFFakQsV0FBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN0RSxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRS9ELElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ2YsV0FBVyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7WUFDdEIsV0FBVyxDQUFDLFFBQVEsR0FBRyxzREFBWSxDQUFDLE9BQU8sQ0FBQztZQUM1QyxXQUFXLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2pDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDTSxpQkFBaUIsQ0FBQyxDQUFTLEVBQUUsQ0FBUztRQUMzQyxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtZQUMzQyxNQUFNLE9BQU8sR0FBRyxHQUFvQixDQUFDO1lBQ3JDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFFNUQsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRTtnQkFFMUQsSUFBSSxPQUFPLDBCQUF5QixFQUFFO29CQUNsQyxJQUFJLENBQUMsWUFBWSx3QkFBdUIsQ0FBQztvQkFDekMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNyRTtxQkFBTTtvQkFDSCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztvQkFDM0IsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUN2QztnQkFFRCxPQUFPO2FBQ1Y7U0FDSjtJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsT0FBTztRQUNILElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxLQUFLLE1BQU0sRUFBRTtZQUN2QyxPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlELE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDdEUsSUFBSSxVQUFVLEtBQUssSUFBSSxJQUFJLFdBQVcsS0FBSyxJQUFJLEVBQUU7WUFDN0MsTUFBTSxJQUFJLHVFQUFtQixDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQy9DO1FBQ0QsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLEVBQUUsR0FBRyxXQUFXLENBQUMsRUFBRSxDQUFDO1FBQ3JELE1BQU0sYUFBYSxHQUFHLFdBQVcsQ0FBQyxFQUFFLEdBQUcsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUV0RCxJQUFJLENBQUMsc0JBQXNCLEdBQUc7WUFDMUIsTUFBTSxFQUFFO2dCQUNKLFNBQVMsRUFBRTtvQkFDUCxFQUFFLEVBQUUsVUFBVSxDQUFDLEVBQUU7b0JBQ2pCLEVBQUUsRUFBRSxVQUFVLENBQUMsRUFBRTtvQkFDakIsRUFBRSxFQUFFLFVBQVUsQ0FBQyxFQUFFO29CQUNqQixFQUFFLEVBQUUsVUFBVSxDQUFDLEVBQUU7aUJBQ3BCO2dCQUNELGFBQWEsRUFBRTtvQkFDWCxFQUFFLEVBQUUsVUFBVSxDQUFDLEVBQUU7b0JBQ2pCLEVBQUUsRUFBRSxVQUFVLENBQUMsRUFBRTtvQkFDakIsRUFBRSxFQUFFLFVBQVUsQ0FBQyxFQUFFO29CQUNqQixFQUFFLEVBQUUsVUFBVSxDQUFDLEVBQUU7aUJBQ3BCO2FBQ0o7U0FDSixDQUFDO1FBRUY7O1dBRUc7UUFDSCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUVoQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxHQUFHO2dCQUMvQixTQUFTLEVBQUU7b0JBQ1AsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFO29CQUNsQixFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUU7b0JBQ2xCLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRTtvQkFDbEIsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFO2lCQUNyQjtnQkFDRCxhQUFhLEVBQUU7b0JBQ1gsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFO29CQUNsQixFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUU7b0JBQ2xCLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRTtvQkFDbEIsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFO2lCQUNyQjthQUNKLENBQUM7WUFFRixPQUFPLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzdDO2FBQU07WUFDSCxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxHQUFHO2dCQUMvQixTQUFTLEVBQUU7b0JBQ1AsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFO29CQUNsQixFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUU7b0JBQ2xCLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRSxHQUFHLFlBQVksR0FBRyxJQUFJO29CQUN4QyxFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUU7aUJBQ3JCO2dCQUNELGFBQWEsRUFBRTtvQkFDWCxFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUU7b0JBQ2xCLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRTtvQkFDbEIsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFLEdBQUcsWUFBWSxHQUFHLEdBQUc7b0JBQ3ZDLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRTtpQkFDckI7YUFDSixDQUFDO1lBRUYsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsR0FBRztnQkFDOUIsU0FBUyxFQUFFO29CQUNQLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRSxHQUFHLFlBQVksR0FBRyxJQUFJO29CQUN4QyxFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUU7b0JBQ2xCLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRSxHQUFHLFlBQVksR0FBRyxJQUFJO29CQUN4QyxFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUUsR0FBRyxhQUFhLEdBQUcsR0FBRztpQkFDM0M7Z0JBQ0QsYUFBYSxFQUFFO29CQUNYLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRTtvQkFDbEIsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFO29CQUNsQixFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUU7b0JBQ2xCLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRSxHQUFHLGFBQWEsR0FBRyxHQUFHO2lCQUMzQzthQUNKLENBQUM7WUFFRixJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxHQUFHO2dCQUNoQyxTQUFTLEVBQUU7b0JBQ1AsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFLEdBQUcsWUFBWSxHQUFHLElBQUk7b0JBQ3hDLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRTtvQkFDbEIsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFO29CQUNsQixFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUU7aUJBQ3JCO2dCQUNELGFBQWEsRUFBRTtvQkFDWCxFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUUsR0FBRyxZQUFZLEdBQUcsR0FBRztvQkFDdkMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFO29CQUNsQixFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUU7b0JBQ2xCLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRTtpQkFDckI7YUFDSixDQUFDO1lBRUYsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sR0FBRztnQkFDakMsU0FBUyxFQUFFO29CQUNQLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRSxHQUFHLFlBQVksR0FBRyxJQUFJO29CQUN4QyxFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUUsR0FBRyxhQUFhLEdBQUcsR0FBRztvQkFDeEMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFLEdBQUcsWUFBWSxHQUFHLElBQUk7b0JBQ3hDLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRTtpQkFDckI7Z0JBQ0QsYUFBYSxFQUFFO29CQUNYLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRTtvQkFDbEIsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFLEdBQUcsYUFBYSxHQUFHLEdBQUc7b0JBQ3hDLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRTtvQkFDbEIsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFO2lCQUNyQjthQUNKLENBQUM7WUFFRixPQUFPLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzdDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxjQUFjLENBQUMsUUFBYztRQUN6QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUNoQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1lBQy9CLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1NBQzlCO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNSLGNBQWM7UUFDbEIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEtBQUssTUFBTSxFQUFFO1lBQ3ZDLE1BQU0sT0FBTyxHQUFtQixzRUFBd0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFdkUsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRTtnQkFDbkIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLG1FQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsbUVBQXlCLENBQUMsTUFBTSxDQUFDO2dCQUNuSCxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQzthQUNqRjtZQUNELDZEQUFlLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1RCw4REFBZ0IsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRTlELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDL0MsNkRBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzdELDhEQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNsRTtZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDcEIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7U0FDaEM7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IsdUJBQXVCLENBQUMsQ0FBUztRQUNyQyxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQztRQUMvRCxNQUFNLDhCQUE4QixHQUFHLG9CQUFvQixDQUFDLFVBQVUsQ0FBQztRQUV2RSxpSEFBaUg7UUFDakgsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEtBQUssQ0FBYyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3JFLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNqQixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDakIsT0FBTyxRQUFRLEdBQUcsaUJBQWlCLEVBQUU7WUFDakMsTUFBTSxpQkFBaUIsR0FBRyw4QkFBOEIsQ0FBQyxRQUFRLEVBQUUsQ0FBZ0IsQ0FBQztZQUNwRixJQUFJLGlCQUFpQixLQUFLLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLEVBQUU7Z0JBQzdELGtCQUFrQixDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsaUJBQWlCLENBQUM7YUFDdEQ7U0FDSjtRQUVELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQztRQUNuRSxJQUFJLG1CQUFtQixLQUFLLElBQUksRUFBRTtZQUM5QixNQUFNLElBQUksdUVBQW1CLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDbEQ7UUFFRCxJQUFJLElBQW9CLENBQUM7UUFFekIsY0FBYztRQUNkLElBQUksaUJBQWlCLEtBQUssQ0FBQyxFQUFFO1lBQ3pCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDaEUsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUMzRCxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBRTlELElBQUksR0FBRztnQkFDSCxFQUFFLEVBQUUsVUFBVTtnQkFDZCxFQUFFLEVBQUUsVUFBVSxHQUFHLEdBQUc7Z0JBQ3BCLEVBQUUsRUFBRSxTQUFTLEdBQUcsVUFBVSxDQUFDLE1BQU0sR0FBRyxFQUFFO2dCQUN0QyxFQUFFLEVBQUUsU0FBUyxHQUFHLFVBQVUsQ0FBQyxNQUFNO2FBQ3BDLENBQUM7WUFFRixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztTQUN2QjthQUFNO1lBQ0gsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLDBEQUEwRDtZQUMxRCxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7WUFDdkIsSUFBSSxNQUFjLENBQUM7WUFDbkIsSUFBSSxPQUFlLENBQUM7WUFDcEIsSUFBSSxRQUFnQixDQUFDO1lBQ3JCLElBQUksVUFBdUIsQ0FBQztZQUM1QixHQUFHO2dCQUNDLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQyxRQUFRLENBQWdCLENBQUM7Z0JBQ3pELE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUNuRCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUN6RCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO2dCQUU1RCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFO29CQUM3QixPQUFPLEdBQUcsVUFBVSxDQUFDO29CQUNyQixNQUFNLEdBQUcsV0FBVyxDQUFDO29CQUNyQixRQUFRLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztpQkFDN0I7cUJBQU07b0JBQ0gsT0FBTyxHQUFHLFdBQVcsQ0FBQztvQkFDdEIsTUFBTSxHQUFHLFVBQVUsQ0FBQztvQkFDcEIsUUFBUSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7aUJBQzVCO2dCQUVELElBQUksQ0FBQyxJQUFJLE9BQU8sSUFBSSxDQUFDLEdBQUcsT0FBTyxHQUFHLFFBQVEsRUFBRTtvQkFDeEMsVUFBVSxHQUFHLElBQUksQ0FBQztpQkFDckI7cUJBQU07b0JBQ0gsUUFBUSxFQUFFLENBQUM7aUJBQ2Q7YUFDSixRQUFRLFFBQVEsR0FBRyxpQkFBaUIsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUV0RCw4RkFBOEY7WUFDOUYsSUFBSSxVQUFVLEtBQUssS0FBSyxJQUFJLENBQUMsR0FBRyxPQUFPLEVBQUU7Z0JBQ3JDLE9BQU87YUFDVjtZQUVELE1BQU0sS0FBSyxHQUFHLE9BQU8sR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1lBRXJDLElBQUksQ0FBQyxHQUFHLEtBQUssRUFBRTtnQkFDWCxJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQztnQkFDM0IsVUFBVSxDQUFDLHFCQUFxQixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLENBQUM7YUFDMUY7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztnQkFDNUQsVUFBVSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLENBQUM7YUFDdkY7WUFFRCxNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUM3RixNQUFNLHlCQUF5QixHQUFHLHNCQUFzQixDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUN2RixNQUFNLDBCQUEwQixHQUFHLHNCQUFzQixDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUUxRixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFO2dCQUM3QixNQUFNLGNBQWMsR0FBRyx5QkFBeUIsQ0FBQztnQkFDakQsTUFBTSwyQkFBMkIsR0FBRyxzQkFBc0IsQ0FBQyxNQUFNLENBQUM7Z0JBRWxFLElBQUksR0FBRztvQkFDSCxFQUFFLEVBQUUsTUFBTTtvQkFDVixFQUFFLEVBQUUsTUFBTSxHQUFHLFVBQVUsQ0FBQyxZQUFZO29CQUNwQyxFQUFFLEVBQUUsY0FBYztvQkFDbEIsRUFBRSxFQUFFLGNBQWMsR0FBRywyQkFBMkI7aUJBQ25ELENBQUM7YUFDTDtpQkFBTTtnQkFDSCxNQUFNLGVBQWUsR0FBRywwQkFBMEIsQ0FBQztnQkFDbkQsTUFBTSwyQkFBMkIsR0FBRyxzQkFBc0IsQ0FBQyxLQUFLLENBQUM7Z0JBRWpFLElBQUksR0FBRztvQkFDSCxFQUFFLEVBQUUsZUFBZTtvQkFDbkIsRUFBRSxFQUFFLGVBQWUsR0FBRywyQkFBMkI7b0JBQ2pELEVBQUUsRUFBRSxNQUFNO29CQUNWLEVBQUUsRUFBRSxNQUFNLEdBQUcsVUFBVSxDQUFDLFlBQVk7aUJBQ3ZDLENBQUM7YUFDTDtTQUNKO1FBRUQsbUJBQW1CLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzQyxPQUFPO0lBQ1gsQ0FBQztJQUVELGdCQUFnQjtJQUNSLG1CQUFtQjtRQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ25ELENBQUM7SUFFRCxnQkFBZ0I7SUFDUixtQkFBbUI7UUFDdkIseUVBQTJCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLHdFQUEwRixDQUFDO1FBQ3hILElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssOENBQUksQ0FBQyxHQUFHLEVBQUU7WUFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3pEO1FBRUQsOERBQThEO1FBQzlELDRDQUE0QztRQUM1QyxxREFBcUQ7UUFDckQsR0FBRztRQUNILElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELGdCQUFnQjtJQUNSLHFCQUFxQixDQUFDLE9BQXNCO1FBQ2hELElBQUksSUFBSSxDQUFDLHNCQUFzQixLQUFLLFNBQVMsRUFBRTtZQUMzQyxNQUFNLElBQUksNEVBQXdCLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDckQ7YUFBTTtZQUNILE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxhQUFhLENBQUM7WUFDekUsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDO1lBQ25FLElBQUksbUJBQW1CLEtBQUssSUFBSSxFQUFFO2dCQUM5QixNQUFNLElBQUksdUVBQW1CLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDaEQ7aUJBQU07Z0JBQ0gsbUJBQW1CLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDcEQsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUM7YUFDL0I7U0FDSjtJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDUixZQUFZO1FBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFO0lBQ2pDLENBQUM7SUFFRCxnQkFBZ0I7SUFDUixlQUFlO1FBQ25CLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IsZUFBZTtRQUNuQixJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELGdCQUFnQjtJQUNSLGlCQUFpQjtRQUNyQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVELGdCQUFnQjtJQUNSLHNCQUFzQixDQUFDLEVBQWM7UUFDekMsTUFBTSxTQUFTLEdBQUcsOERBQVksQ0FBQyxvQkFBb0IsQ0FBQztRQUNwRCxNQUFNLGFBQWEsR0FBRyxJQUFJLDhEQUFZLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMvRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IsMkJBQTJCLENBQUMsRUFBYztRQUM5QyxNQUFNLFNBQVMsR0FBRyw4REFBWSxDQUFDLHlCQUF5QixDQUFDO1FBQ3pELE1BQU0sYUFBYSxHQUFHLElBQUksOERBQVksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3BGLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxnQkFBZ0I7SUFDUixnQ0FBZ0MsQ0FBQyxJQUFtQjtRQUN4RCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IsK0JBQStCLENBQUMsSUFBbUI7UUFDdkQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IsbUNBQW1DLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxZQUEwQixFQUFFLGFBQTRCO1FBQ3RILElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJLEVBQUU7WUFDM0IsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3pCO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksRUFBRSxhQUFhLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1Isa0JBQWtCO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDMUIsT0FBTywrRUFBMEIsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUMzRTthQUFNO1lBQ0gsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFFM0QsSUFBSSxNQUFNLEdBQUcsK0VBQTBCLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3BGLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtnQkFDdEIsTUFBTSxHQUFHO29CQUNMLElBQUk7b0JBQ0osTUFBTSxFQUFFLFNBQVM7b0JBQ2pCLFFBQVEsRUFBRSxTQUFTO29CQUNuQixLQUFLLEVBQUUsU0FBUztvQkFDaEIsUUFBUSxFQUFFLFNBQVM7b0JBQ25CLFdBQVcsRUFBRSxTQUFTO2lCQUN6QixDQUFDO2FBQ0w7WUFDRCxPQUFPLE1BQU0sQ0FBQztTQUNqQjtJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDUixxQkFBcUI7UUFDekIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7Q0FDSjtBQUVELGNBQWM7QUFDZCxXQUFpQixLQUFLO0lBc0JsQixnQkFBZ0I7SUFDaEIsU0FBZ0IsYUFBYSxDQUFDLFFBQWtCO1FBQzVDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLHNCQUE2QixDQUFDO1FBQ25ELE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyx3QkFBOEIsQ0FBQztRQUNwRCxPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBTGUsbUJBQWEsZ0JBSzVCO0FBQ0wsQ0FBQyxFQTdCZ0IsS0FBSyxLQUFMLEtBQUssUUE2QnJCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3I4QnVIO0FBU3RGO0FBRXdCO0FBQ047QUFDQTtBQUNtQjtBQUNEO0FBQ1Q7QUFDOEQ7QUFDcEU7QUFFSjtBQUNGO0FBQ0c7QUFDZDtBQUNtQjtBQUdKO0FBQ1I7QUFDaUM7QUFDWTtBQU9uRTtBQVN2Qjs7R0FFRztBQUVILGNBQWM7QUFDUCxNQUFlLGFBQWMsU0FBUSw4REFBWTtJQW1KcEQ7OztNQUdFO0lBQ0YsWUFBWSxVQUErQztRQUN2RCxLQUFLLEVBQUUsQ0FBQztRQXZKWjs7O1dBR0c7UUFDSCxxQ0FBZ0MsR0FBRyxLQUFLLENBQUM7UUFDekMsa0hBQWtIO1FBQ2xILDJCQUFzQixHQUFHLEdBQUcsQ0FBQztRQUM3Qjs7O1dBR0c7UUFDSCx1Q0FBa0MsR0FBRyxJQUFJLENBQUM7UUFJMUMsZ0JBQWdCO1FBQ1IsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFDL0IsZ0JBQWdCO1FBQ1IsZ0JBQVcsR0FBMkIsU0FBUyxDQUFDO1FBQ3hELGdCQUFnQjtRQUNSLGlCQUFZLEdBQW9CLEVBQUUsQ0FBQztRQUMzQyxnQkFBZ0I7UUFDUix5QkFBb0IsR0FBK0IsSUFBSSxDQUFDO1FBQ2hFLGdCQUFnQjtRQUNSLHlCQUFvQixHQUErQixJQUFJLENBQUM7UUFHaEUsZ0JBQWdCO1FBQ1IsZUFBVSxHQUF1QixFQUFFLENBQUM7UUFHNUMsZ0JBQWdCO1FBQ1IseUJBQW9CLEdBQUcsYUFBYSxDQUFDLDBCQUEwQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xGLGdCQUFnQjtRQUNSLHdCQUFtQixHQUFHLGFBQWEsQ0FBQywrQkFBK0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0RixnQkFBZ0I7UUFDUixpQkFBWSxHQUFpQixFQUFFLENBQUM7UUFDeEMsZ0JBQWdCO1FBQ1IsK0JBQTBCLEdBQUcsS0FBSyxDQUFDO1FBQzNDLGdCQUFnQjtRQUNSLGVBQVUsR0FBRyxJQUFJLENBQUM7UUFDMUIsZ0JBQWdCO1FBQ1IsY0FBUyxHQUFHLElBQUksc0RBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QyxnQkFBZ0I7UUFDUixXQUFNLEdBQWtCLElBQUksQ0FBQztRQUNyQyxnQkFBZ0I7UUFDUixZQUFPLEdBQWtCLElBQUksQ0FBQztRQUd0QyxnQkFBZ0I7UUFDUiw0QkFBdUIsR0FBeUIsRUFBRSxDQUFDO1FBQzNELGdCQUFnQjtRQUNSLDJDQUFzQyxHQUFHLENBQUMsQ0FBQztRQUNuRCxnQkFBZ0I7UUFDUixnQ0FBMkIsR0FBRyxDQUFDLENBQUM7UUFHeEMsZ0JBQWdCO1FBQ1IsWUFBTyxHQUF5QixJQUFJLENBQUM7UUFFN0MsZ0JBQWdCO1FBQ1Isb0JBQWUsR0FBRyxJQUFJLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO1FBQ2pGLHVEQUF1RDtRQUMvQyxnQ0FBMkIsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDbEUsdURBQXVEO1FBQy9DLGlDQUE0QixHQUFHLEtBQUssQ0FBQztRQUM3QyxnQkFBZ0I7UUFDUiwyQ0FBc0MsR0FBRyxDQUFDLEVBQThCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQVFuSTs7OztXQUlHO1FBQ0gsa0JBQWEsR0FBeUIsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO1FBRS9DOzs7O1dBSUc7UUFDSCxnQkFBVyxHQUF5QixHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7UUFrRXpELElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQztRQUUxQyxJQUFJLENBQUMsbUNBQW1DLEdBQUcsVUFBVSxDQUFDLGtDQUFrQyxDQUFDO1FBRXpGLDREQUFXLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDOUIsa0VBQWMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUVqQyxJQUFJLFVBQVUsQ0FBQyxnQkFBZ0IsS0FBSyxTQUFTLEVBQUU7WUFDM0MsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQztTQUN4RDtJQUNMLENBQUM7SUExRUQsSUFBSSxTQUFTLEtBQWtCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztJQUMvRCxJQUFJLGFBQWEsS0FBYyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQzVELElBQUksVUFBVSxLQUFjLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSw4QkFBaUMsQ0FBQyxDQUFDLENBQUM7SUFDdkcsZ0JBQWdCO0lBQ2hCLElBQUksVUFBVSxLQUE2QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLGlGQUFpRjtJQUNqRixJQUFJLElBQUksS0FBNkIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUMvRCxJQUFJLFdBQVcsS0FBc0IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUNoRSxnQkFBZ0I7SUFDaEIsSUFBSSxtQkFBbUIsS0FBaUMsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO0lBQzNGLDBDQUEwQztJQUMxQyxJQUFJLG1CQUFtQixLQUFpQyxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7SUFDM0YsSUFBSSxLQUFLLEtBQW9CLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDbEQsSUFBSSxNQUFNLEtBQW9CLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDcEQ7Ozs7T0FJRztJQUNILElBQUksUUFBUSxLQUFlLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDbkQsSUFBSSxRQUFRO1FBQ1IsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtZQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7U0FDekQ7YUFBTTtZQUNILE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUM7WUFDekQsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUNqQyxPQUFPLFNBQVMsQ0FBQzthQUNwQjtpQkFBTTtnQkFDSCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzNDO1NBQ0o7SUFDTCxDQUFDO0lBQ0QsSUFBSSxvQkFBb0IsS0FBZ0MsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDO0lBQzVGLGdCQUFnQjtJQUNoQixJQUFJLGtCQUFrQixLQUFrQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDMUUsSUFBSSxjQUFjLEtBQXdCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7SUFFeEUsdURBQXVEO0lBQ3ZELElBQUkscUJBQXFCLEtBQWMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLG1DQUFtQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFFNUgsSUFBSSxNQUFNLEtBQTJCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDM0QsSUFBSSxNQUFNLENBQUMsS0FBMkIsSUFBSSxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFFakUsSUFBSSxTQUFTOztRQUNULE1BQU0sTUFBTSxHQUFvQixFQUFFLENBQUM7UUFFbkMsTUFBTSxJQUFJLEdBQUcsVUFBSSxDQUFDLE1BQU0sbUNBQUksSUFBSSxDQUFDO1FBQ2pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFbEIsS0FBSyxJQUFJLE1BQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2pDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNyQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3RCO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQXFCRDs7Ozs7OztPQU9HO0lBQ0gsT0FBTztRQUNILElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUNyQixJQUFJLElBQUksQ0FBQyw0QkFBNEIsRUFBRTtnQkFDbkMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsMkJBQTJCLENBQUMsQ0FBQztnQkFDakYsSUFBSSxDQUFDLDRCQUE0QixHQUFHLEtBQUssQ0FBQzthQUM3QztZQUVELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsb0JBQW9CLEtBQUssSUFBSSxFQUFFO2dCQUMxRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQzthQUM5QjtZQUVELElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFFL0IsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtnQkFDaEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUM5QjtZQUNELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsS0FBSyxJQUFJLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUN2QztZQUNELElBQUksSUFBSSxDQUFDLG9CQUFvQixLQUFLLElBQUksRUFBRTtnQkFDcEMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ3ZDO1lBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUV6QixLQUFLLE1BQU0sVUFBVSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQ3hDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUN4QjtZQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1lBRXZCLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1NBQy9CO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsWUFBWSxDQUFDLE1BQTRCO1FBQ3JDLE9BQU8seUVBQW9CLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsY0FBYyxDQUFDLE1BQTRCO1FBQ3ZDLE9BQU8seUVBQW9CLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFPRDs7O09BR0c7SUFDSCxJQUFJOztRQUNBLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxnRkFBbUIsRUFBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3hFLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLCtFQUFtQixFQUFFLENBQUM7UUFDdEQsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFFL0IsSUFBSSxDQUFDLFlBQVksR0FBRyx5RUFBb0IsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLDRDQUE0QztRQUN0RyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksMERBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDeEYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUV4QixJQUFJLENBQUMsNkJBQTZCLEVBQUUsQ0FBQztRQUVyQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXpCLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQztRQUV0RCxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtZQUMxQywrREFBK0Q7WUFDL0QsSUFBSSxhQUFNLENBQUMsSUFBSSwwQ0FBRSxJQUFJLEtBQUksa0RBQVEsQ0FBQyxTQUFTLEVBQUU7Z0JBQ3pDLE1BQU0sQ0FBQyxJQUFJLEdBQUc7b0JBQ1YsSUFBSSxFQUFFLGtEQUFRLENBQUMsS0FBSztvQkFDcEIsT0FBTyxFQUFFLENBQUUsTUFBTSxDQUFDLElBQUksQ0FBRTtpQkFDM0IsQ0FBQzthQUNMO1lBRUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMzQjtJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCxVQUFVLENBQUMsWUFBMEI7UUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDckIsNkRBQTZEO1lBQzdELE1BQU0sSUFBSSxLQUFLLENBQUMsMkZBQTJGLENBQUM7U0FDL0c7YUFBTTtZQUNILElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUU7Z0JBQ2hDLE1BQU0sSUFBSSw0RUFBd0IsQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUNuRDtpQkFBTTtnQkFDSCxJQUFJLENBQUMsWUFBWSxHQUFHLHlEQUFZLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUN2RCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLDJCQUEyQjtnQkFDcEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLDZCQUE2QixFQUFFLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2FBQ2xDO1NBQ0o7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxVQUFVO1FBQ04sSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLEtBQUssRUFBRTtZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxDQUFDLENBQUM7U0FDdkU7YUFBTTtZQUVILDhEQUE4RDtZQUM5RCxxREFBcUQ7WUFDckQsSUFBSTtZQUVKOztjQUVFO1lBQ0YsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtnQkFDaEMsTUFBTSxJQUFJLDRFQUF3QixDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ25EO2lCQUFNO2dCQUNILE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztnQkFFaEUsSUFBSSxjQUFrRCxDQUFDO2dCQUN2RCxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO29CQUM1QixjQUFjLEdBQUcsU0FBUyxDQUFDO2lCQUM5QjtxQkFBTTtvQkFDSCxjQUFjLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNyQztnQkFFRDs7a0JBRUU7Z0JBQ0YsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7Z0JBQzlCLE1BQU0sV0FBVyxHQUFpQyxFQUFFLENBQUM7Z0JBQ3JELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDL0MsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7aUJBQ3JEO2dCQUVELE1BQU0sTUFBTSxHQUF5QjtvQkFDakMsSUFBSSxFQUFFLGNBQWM7b0JBQ3BCLFdBQVc7b0JBQ1gsUUFBUSxFQUFHLHlFQUFvQixDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUM7b0JBQy9FLFVBQVUsRUFBRSx5RUFBb0IsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO29CQUNwRixNQUFNLEVBQUUseUVBQW9CLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztvQkFDeEUsUUFBUSxFQUFFLElBQUk7aUJBQ2pCO2dCQUVELE9BQU8sTUFBTSxDQUFDO2FBQ2pCO1NBQ0o7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFFSCxLQUFLO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtZQUNoQyxNQUFNLElBQUksNEVBQXdCLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDbkQ7YUFBTTtZQUNILElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDaEM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRO1FBQ0osT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILFlBQVksQ0FBQyxhQUF3QixFQUFFLGNBQTBCLEVBQUUsS0FBYztRQUM3RSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsYUFBYSxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN4RixJQUFJLGFBQWEsS0FBSyxTQUFTLEVBQUU7WUFDN0IsTUFBTSxJQUFJLCtEQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDdEM7YUFBTTtZQUNILE9BQU8sYUFBYSxDQUFDO1NBQ3hCO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsc0JBQXNCLENBQUMsYUFBd0IsRUFBRSxjQUEwQixFQUFFLEtBQWMsRUFDdkYsaUJBQW9EO1FBRXBELElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUU7WUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1NBQ3ZEO2FBQU07WUFDSCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsYUFBYSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUN0RyxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7Z0JBQ3hCLE9BQU8sU0FBUyxDQUFDO2FBQ3BCO2lCQUFNO2dCQUNILE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDckUsSUFBSSxDQUFDLDZEQUFXLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxFQUFFO29CQUMzQyxNQUFNLElBQUksK0RBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQztpQkFDMUM7cUJBQU07b0JBQ0gsT0FBTyxXQUFXLENBQUM7aUJBQ3RCO2FBQ0o7U0FDSjtJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxZQUFZLENBQUMsYUFBd0IsRUFBRSxjQUEwQixFQUFFLEtBQWM7UUFDN0UsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsRUFBRSxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbkYsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFO1lBQ3hCLE1BQU0sSUFBSSwrREFBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ3RDO2FBQU07WUFDSCxPQUFPLFFBQVEsQ0FBQztTQUNuQjtJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILHNCQUFzQixDQUFDLGFBQXdCLEVBQUUsY0FBMEIsRUFBRSxLQUFjLEVBQ3ZGLGlCQUE2RDtRQUU3RCxNQUFNLFVBQVUsR0FBd0I7WUFDcEMsSUFBSSxFQUFFLFdBQVc7WUFDakIsYUFBYTtZQUNiLGNBQWM7WUFDZCxLQUFLO1NBQ1IsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRDs7Ozs7TUFLRTtJQUNGLE9BQU8sQ0FBQyxVQUF5RTtRQUM3RSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdkQsSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQzNCLE1BQU0sSUFBSSwrREFBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ3RDO2FBQU07WUFDSCxPQUFPLFdBQVcsQ0FBQztTQUN0QjtJQUNMLENBQUM7SUFFRDs7Ozs7O21HQU0rRjtJQUMvRixpQkFBaUIsQ0FBQyxVQUF5RSxFQUN2RixpQkFBNkQ7UUFFN0QsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtZQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7U0FDdkQ7YUFBTTtZQUNILE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUN2RSxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7Z0JBQ3hCLE9BQU8sU0FBUyxDQUFDO2FBQ3BCO2lCQUFNO2dCQUNILE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDckUsT0FBTyxXQUFXLENBQUM7YUFDdEI7U0FDSjtJQUNMLENBQUM7SUFFRDs7Ozt1REFJbUQ7SUFDbkQsT0FBTyxDQUFDLFVBQXlFO1FBQzdFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwRCxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDeEIsTUFBTSxJQUFJLCtEQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDdEM7YUFBTTtZQUNILE9BQU8sUUFBUSxDQUFDO1NBQ25CO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7K0dBTTJHO0lBQzNHLGlCQUFpQixDQUFDLFVBQXlFLEVBQ3ZGLGlCQUE2RDtRQUU3RCxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztTQUN2RDthQUFNO1lBQ0gsSUFBSSxpQkFBaUIsS0FBSyxTQUFTLEVBQUU7Z0JBQ2pDLHlEQUF5RDtnQkFDekQsaUJBQWlCLEdBQUcsYUFBYSxDQUFDLHdCQUF3QixDQUFDO2FBQzlEO1lBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDM0QsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFO2dCQUN4QixPQUFPLFNBQVMsQ0FBQzthQUNwQjtpQkFBTTtnQkFDSCxJQUFJLFVBQVUsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDO2dCQUNyQyxJQUFJLE1BQWMsQ0FBQztnQkFDbkIsUUFBUSxVQUFVLENBQUMsSUFBSSxFQUFFO29CQUNyQixLQUFLLGtEQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQ2xCLE1BQU0sVUFBVSxHQUFHLFVBQXdCLENBQUM7d0JBQzVDLE1BQU0sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ3hELElBQUksTUFBTSxJQUFJLENBQUMsRUFBRTs0QkFDYixVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyx3QkFBd0I7eUJBQzFFOzZCQUFNOzRCQUNILE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxnRkFBZ0Y7eUJBQy9GO3dCQUNELE1BQU07cUJBQ1Q7b0JBQ0QsS0FBSyxrREFBUSxDQUFDLEdBQUcsQ0FBQztvQkFDbEIsS0FBSyxrREFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUNsQixNQUFNLFdBQVcsR0FBRyxVQUF5QixDQUFDO3dCQUM5QyxNQUFNLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUN6RCxNQUFNO3FCQUNUO29CQUNELEtBQUssa0RBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDakIsSUFBSSxDQUFDLHVEQUFVLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxFQUFFOzRCQUNyQyxNQUFNLEtBQUssQ0FBQyw0REFBVyxzQ0FBMkMsQ0FBQyxDQUFDO3lCQUN2RTs2QkFBTTs0QkFDSCxNQUFNLEtBQUssR0FBRyxVQUFtQixDQUFDOzRCQUNsQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDOzRCQUNuRCxNQUFNO3lCQUNUO3FCQUNKO29CQUNELEtBQUssa0RBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQzt3QkFDckIsTUFBTSxJQUFJLCtEQUFXLENBQUMsaUJBQWlCLENBQUMsQ0FBQztxQkFDNUM7b0JBQ0Q7d0JBQ0ksTUFBTSxJQUFJLHdFQUFvQixDQUFDLGlCQUFpQixFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDMUU7Z0JBRUQsSUFBSSx1REFBVSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsRUFBRTtvQkFDcEMsNEJBQTRCO29CQUM1QixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUM3QyxJQUFJLDZEQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO3dCQUMzQixVQUFVLEdBQUcsSUFBSSxDQUFDO3dCQUNsQixNQUFNLEdBQUcsQ0FBQyxDQUFDO3FCQUNkO2lCQUNKO2dCQUVELFFBQVEsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO2dCQUNqQyxRQUFRLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztnQkFFeEIsT0FBTyxRQUFRLENBQUM7YUFDbkI7U0FDSjtJQUNMLENBQUM7SUFFRDs7O01BR0U7SUFDRixtQkFBbUIsQ0FBQyxVQUErQjtRQUMvQyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztTQUNsRDthQUFNO1lBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUNwRDtJQUNMLENBQUM7SUFFRCw0REFBNEQ7SUFDNUQsVUFBVSxDQUFDLEtBQWEsRUFBRSxNQUFjO1FBQ3BDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE9BQU8sQ0FBQyxLQUFhLEVBQUUsTUFBYztRQUNqQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUV0QixJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssSUFBSSxFQUFFO1lBQzlCLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUU7Z0JBQ2hDLE1BQU0sSUFBSSw0RUFBd0IsQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUNuRDtpQkFBTTtnQkFDSCxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFFcEQsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO29CQUN0QixNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLDZFQUE4QixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO29CQUNqRiw4REFBZSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUNyRCwrREFBZ0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztvQkFDdkQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQzFDO2dCQUVELElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2FBQ2xDO1NBQ0o7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLHFCQUFxQjtRQUNqQixJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLG1CQUFtQjtRQUNmLElBQUksRUFBRSxJQUFJLENBQUMsMkJBQTJCLEtBQUssQ0FBQyxFQUFFO1lBQzFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1NBQ2xDO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNoQix1QkFBdUI7UUFDbkIsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyw2RUFBOEIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNqRixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsY0FBYyxDQUFDLEtBQUssR0FBRyxLQUFLO1FBQ3hCLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUU7WUFDaEMsTUFBTSxJQUFJLDRFQUF3QixDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ3BEO2FBQU07WUFDSCxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN0QztJQUNMLENBQUM7SUFFRCxjQUFjO0lBQ2Qsd0JBQXdCLENBQUMsTUFBMEIsRUFBRSxNQUFtQjtRQUNwRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZELE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNmLE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsaUJBQWlCLENBQUMsTUFBMEIsRUFBRSxNQUFtQjtRQUM3RCxJQUFJLE9BQU8sTUFBTSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDakMsTUFBTSxJQUFJLHVFQUFrQixDQUFDLDRCQUE0QixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUN0RjtRQUVEOztXQUVHO1FBQ0g7UUFDSSx5QkFBeUI7UUFDekIsdUVBQWtCLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQztZQUUxQyxzQ0FBc0M7WUFDdEMsQ0FBQyxDQUFDLE1BQU0sWUFBWSxnREFBSyxDQUFDO1lBRTFCLHVCQUF1QjtZQUN2QixDQUFDLENBQUMsTUFBTTtZQUVSLGdEQUFnRDtZQUNoRCxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJLElBQUksTUFBTSxZQUFZLDBEQUFVLENBQUMsRUFDOUQ7WUFDRSxNQUFNLFdBQVcsR0FBNEI7Z0JBQ3pDLElBQUksRUFBRSxrREFBUSxDQUFDLEtBQUs7Z0JBQ3BCLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQztnQkFDakIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO2dCQUNqQixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7Z0JBQ3pCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztnQkFDdkIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO2dCQUMvQixFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUU7Z0JBQ2IsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO2dCQUMzQixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7Z0JBQzdCLGVBQWUsRUFBRSxDQUFDO2dCQUNsQixNQUFNLEVBQUUsU0FBUzthQUNwQixDQUFDO1lBRUYsTUFBTSxHQUFHLFdBQVcsQ0FBQztTQUN4QjtRQUVELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDckUsT0FBTyxXQUFXLENBQUM7SUFDdkIsQ0FBQztJQUVELDBCQUEwQixDQUFDLEVBQVU7UUFDakMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtZQUNoQyxNQUFNLElBQUksNEVBQXdCLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDdkQ7YUFBTTtZQUNILE9BQU8sSUFBSSxDQUFDLHFDQUFxQyxDQUFDLGtEQUFRLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFrQixDQUFDO1NBQ2hIO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNoQiwyQkFBMkIsQ0FBQyxJQUFpQixFQUN6QyxNQUFxRCxFQUNyRCxRQUF1QixFQUN2QixTQUFtRDs7UUFFbkQ7Ozs7Ozs7V0FPRztRQUNILE1BQU0sSUFBSSxHQUFHLFNBQVMsYUFBVCxTQUFTLGNBQVQsU0FBUyxHQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUUvQyxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUU7WUFDZixNQUFNLElBQUksdUVBQW1CLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDakQ7YUFBTTtZQUNILElBQUksUUFBUSxLQUFLLElBQUksRUFBRTtnQkFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUMxQztZQUVELElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtnQkFDdEIsTUFBTSxXQUFXLEdBQUcsMkVBQTRCLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzdELE1BQU0sVUFBVSxHQUFHLENBQUMsSUFBSSxZQUFZLGlFQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFFOUgsTUFBTSxHQUFHO29CQUNMLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJO29CQUN4QyxHQUFHLEVBQUUsV0FBVyxDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUMsR0FBRztvQkFDckMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLO29CQUN2QixNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU07aUJBQzVCLENBQUM7YUFDTDtZQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQyxJQUFJLFVBQUksQ0FBQyxNQUFNLDBDQUFFLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUNqQjtZQUVELElBQUksQ0FBQywyRUFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsRUFBRTtnQkFDdEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLDREQUFXLG1EQUF3RCxFQUFFLENBQUMsQ0FBQzthQUM3RjtpQkFBTTtnQkFDSCxPQUFPLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDcEY7U0FDSjtJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsZ0NBQWdDO1FBQzVCLElBQUksRUFBRSxJQUFJLENBQUMsc0NBQXNDLEtBQUssQ0FBQyxFQUFFO1lBQ3JELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1NBQzNDO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNoQix3QkFBd0IsQ0FBQyxTQUE2QjtRQUNsRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsOEJBQThCO1FBQzFCLElBQUksRUFBRSxJQUFJLENBQUMsc0NBQXNDLEtBQUssQ0FBQyxFQUFFO1lBQ3JELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUM7WUFDbEQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO2dCQUNYLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDMUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDNUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNsRCxTQUFTLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztpQkFDNUM7Z0JBQ0QsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2FBQzNDO1NBQ0o7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLDZCQUE2QixDQUFDLEtBQWE7UUFDdkMsSUFBSSxJQUFJLENBQUMseUJBQXlCLEtBQUssU0FBUyxFQUFFO1lBQzlDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN6QztJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsNEJBQTRCO1FBQ3hCLElBQUksSUFBSSxDQUFDLHdCQUF3QixLQUFLLFNBQVMsRUFBRTtZQUM3QyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztTQUNuQztJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDUiwwQkFBMEIsQ0FBQyxjQUFzQyxFQUNyRSxNQUF5QyxFQUN6QyxRQUF1QixFQUN2QixhQUE0QjtRQUU1QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFckMsTUFBTSxrQkFBa0IsR0FBK0I7WUFDbkQsSUFBSSxFQUFFLGNBQWM7WUFDcEIsV0FBVyxFQUFFLEVBQUU7WUFDZixRQUFRLEVBQUUsWUFBWSxDQUFDLFFBQVE7WUFDL0IsVUFBVSxFQUFFLFlBQVksQ0FBQyxVQUFVO1lBQ25DLE1BQU0sRUFBRSxZQUFZLENBQUMsTUFBTTtZQUMzQixNQUFNO1lBQ04sUUFBUTtZQUNSLGFBQWE7WUFDYixRQUFRLEVBQUUsSUFBSTtTQUNqQjtRQUVELE9BQU8sSUFBSSxDQUFDLGtDQUFrQyxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixrQ0FBa0MsQ0FBQyxNQUFrQzs7UUFDakUsaUZBQWlGO1FBQ2pGLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJLEVBQUU7WUFDdkIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGtDQUFrQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ2xFO1FBRUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNuQyxNQUFNLGFBQWEsR0FBUztZQUN4QixJQUFJLEVBQUUsa0JBQVksQ0FBQyxJQUFJLG1DQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxVQUFVLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztZQUM3RSxHQUFHLEVBQUUsa0JBQVksQ0FBQyxHQUFHLG1DQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxVQUFVLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztZQUMxRSxLQUFLLEVBQUUsa0JBQVksQ0FBQyxLQUFLLG1DQUFJLEdBQUc7WUFDaEMsTUFBTSxFQUFFLGtCQUFZLENBQUMsTUFBTSxtQ0FBSSxHQUFHO1NBQ3JDLENBQUM7UUFFRixNQUFNLGFBQWEsR0FBRyxJQUFJLG9FQUFhLENBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVyRSxhQUFhLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUU7WUFDakMsTUFBTSxFQUFFLEdBQUcsYUFBYSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBRXpDLDhEQUE4RDtZQUM5RCxNQUFNLGNBQWMsR0FBRzs7Z0JBQ25CLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxJQUFJLGVBQUUsQ0FBQyxVQUFVLDBDQUFFLG9CQUFvQixFQUFFLDBDQUFFLE1BQU0sTUFBSyxDQUFDLEVBQUU7b0JBQ3ZFLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDekI7WUFDTCxDQUFDLENBQUM7WUFFRixFQUFFLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUNyQyxFQUFFLENBQUMsRUFBRSxDQUFDLGVBQWUsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUV2QyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FBQztRQUVILGFBQWEsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUM7UUFFaEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFdEMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRTtZQUN2RixVQUFVLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQywyQkFBMkIsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2pHLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxJQUFJLENBQUM7U0FDNUM7UUFFRCxPQUFPLGFBQWEsQ0FBQztJQUN6QixDQUFDO0lBRUQ7OztPQUdHO0lBRUgsbUJBQW1CLENBQUMsWUFBWSxHQUFHLEtBQUs7UUFDcEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQy9DLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQzVDO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBRTdCLElBQUksSUFBSSxDQUFDLDRCQUE0QixFQUFFO1lBQ25DLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUM7WUFDakYsSUFBSSxDQUFDLDRCQUE0QixHQUFHLEtBQUssQ0FBQztTQUM3QztJQUNMLENBQUM7SUFtQkQsYUFBYSxDQUFDLE9BQW9CLEVBQzlCLGlDQUE2RyxFQUM3RyxjQUEwQixFQUMxQixLQUFjLEVBQ2QsRUFBVztRQUVYLE1BQU0sVUFBVSxHQUFHLElBQUksOERBQVUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxpQ0FBaUMsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ25ILElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRW5DLE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7O09BR0E7SUFDSCxnQkFBZ0IsQ0FBQyxVQUFzQjtRQUN0Qyw4REFBZSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFFLENBQUM7UUFDaEQsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRCxnQkFBZ0I7SUFDUiwwQkFBMEIsQ0FBQyxNQUFrQjtRQUNqRCw4REFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixrQkFBa0IsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLFlBQTBCLEVBQUUsYUFBNEI7O1FBQzdGLE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyx3QkFBd0IsRUFBRSxLQUFLLElBQUksQ0FBQztRQUVqRSxNQUFNLFdBQVcsR0FDYixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxlQUFlO1lBQzFDLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFrQix3RkFBd0Y7UUFFaEosTUFBTSxxQkFBcUIsR0FDdkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsa0JBQWtCO1lBQzdDLENBQUMsVUFBSSxDQUFDLE9BQU8sbUNBQUksSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBSyxtQ0FBbUM7UUFFM0YseUZBQXlGO1FBQ3pGLHFHQUFxRztRQUNyRyxJQUFJLE1BQU0sSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQ2xELFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMxQixPQUFPO1NBQ1Y7UUFFRCxNQUFNLE1BQU0sR0FBRyw4REFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRXRGLElBQUkscUJBQXFCLEVBQUU7WUFDdkIsS0FBSyxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUMzQixJQUFJLEVBQUUsS0FBSyxJQUFJLEVBQUU7b0JBQ2IsRUFBRSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUN6QzthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLHVCQUF1Qjs7UUFDbkIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2pDLFVBQUksQ0FBQyxtQkFBbUIsMENBQUUsSUFBSSxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILGNBQWMsQ0FBQyxJQUFtQixFQUFFLGFBQWEsR0FBRyxLQUFLO1FBQ3JELElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILG1CQUFtQixDQUFDLGFBQWEsR0FBRyxLQUFLO1FBQ3JDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILHVCQUF1QixDQUFDLElBQStCLEVBQUUsY0FBYyxHQUFHLEtBQUs7UUFDM0UsSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBRXJDLElBQUksb0JBQXlELENBQUM7WUFDOUQsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO2dCQUNwQixvQkFBb0IsS0FBSyxTQUFTLENBQUM7YUFDdEM7aUJBQU07Z0JBQ0gsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQzthQUMxQztZQUVELElBQUksSUFBSSxDQUFDLHFCQUFxQixLQUFLLFNBQVMsRUFBRTtnQkFDMUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDO2dCQUNsRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsU0FBUyxDQUFDO2dCQUN2QyxjQUFjLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUMxQyxNQUFNLG9CQUFvQixHQUFHLGNBQWMsQ0FBQyxVQUFVLENBQUM7Z0JBQ3ZELElBQUksb0JBQW9CLEtBQUssb0JBQW9CLEVBQUU7b0JBQy9DLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztpQkFDcEM7cUJBQU07b0JBQ0gsb0JBQW9CLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUMvQzthQUNKO1lBRUQsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO2dCQUNwQixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUNoQyxJQUFJLG9CQUFvQixLQUFLLFNBQVMsRUFBRTtvQkFDcEMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUM5QzthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IsMkJBQTJCLENBQUMsTUFBMEIsRUFBRSxNQUFtQjtRQUMvRSxRQUFRLE1BQU0sQ0FBQyxJQUFJLEVBQUU7WUFDakIsS0FBSyxrREFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sSUFBSSwrREFBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzVELEtBQUssa0RBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLElBQUksOERBQVcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQXVDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDeEcsS0FBSyxrREFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sSUFBSSw4REFBVyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBdUMsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUMxRyxLQUFLLGtEQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxJQUFJLGdEQUFLLENBQUMsSUFBSSxFQUFFLE1BQWlDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDdkYsS0FBSyxrREFBUSxDQUFDLFNBQVM7Z0JBQ25CLE9BQU8sSUFBSSxpRUFBYSxDQUFDLElBQUksRUFBRSxNQUFxQyxFQUFFLE1BQWUsQ0FBQyxDQUFDO1lBQzNGO2dCQUNJLE1BQU0sSUFBSSx3RUFBb0IsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxvQ0FBb0MsQ0FBQyxDQUFDO1NBQ3RHO0lBQ0wsQ0FBQztJQUVEOzs7O1FBSUk7SUFDSixpQkFBaUIsQ0FBQyxLQUF3QjtRQUN0QyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDckIsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLFNBQVMsRUFBRTtnQkFDcEMsSUFBSSxDQUFDLDZCQUE2QixFQUFFLENBQUM7YUFDeEM7U0FDSjthQUFNO1lBQ0gsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLGVBQWUsRUFBRTtnQkFDaEMsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLFNBQVMsRUFBRTtvQkFDcEMsSUFBSSxDQUFDLDZCQUE2QixFQUFFLENBQUM7aUJBQ3hDO2dCQUVELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNwQztTQUNKO0lBQ0wsQ0FBQztJQUVELDJCQUEyQjtRQUN2QixJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssU0FBUyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDbkM7SUFDTCxDQUFDO0lBRUQsdUhBQXVIO0lBQ3ZILHFIQUFxSDtJQUNySCxXQUFXO0lBRVgsbUJBQW1CO0lBQ25CLHNDQUFzQztJQUN0Qyw2Q0FBNkM7SUFFN0MsbURBQW1EO0lBQ25ELHNDQUFzQztJQUN0QyxvRUFBb0U7SUFFcEUsaURBQWlEO0lBQ2pELG1FQUFtRTtJQUNuRSwwREFBMEQ7SUFDMUQsdUJBQXVCO0lBQ3ZCLHNEQUFzRDtJQUN0RCxnQkFBZ0I7SUFDaEIsWUFBWTtJQUNaLFFBQVE7SUFDUixJQUFJO0lBRUosdUhBQXVIO0lBQ3ZILHFIQUFxSDtJQUNySCxXQUFXO0lBRVgsbUJBQW1CO0lBQ25CLHNDQUFzQztJQUN0Qyw2Q0FBNkM7SUFFN0MsbURBQW1EO0lBQ25ELHNDQUFzQztJQUN0QyxvRUFBb0U7SUFFcEUsaURBQWlEO0lBQ2pELG1FQUFtRTtJQUNuRSwwREFBMEQ7SUFDMUQsdUJBQXVCO0lBQ3ZCLHNEQUFzRDtJQUN0RCxnQkFBZ0I7SUFDaEIsWUFBWTtJQUNaLFFBQVE7SUFDUixJQUFJO0lBRUosZ0JBQWdCO0lBQ1Isb0NBQW9DLENBQUMsS0FBaUM7UUFDaEYsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDM0UsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDN0YsSUFBSSxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUM7U0FDakM7SUFDQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxXQUFXO1FBQ1AsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixPQUFPLENBQUMsQ0FBUyxFQUFFLENBQVM7UUFDeEIsSUFBSSxZQUFZLEdBQTRCLElBQUksQ0FBQztRQUNqRCxJQUFJLGVBQWUsR0FBRyxRQUFRLENBQUM7UUFFL0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzdDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFaEMsSUFDSSxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUU7Z0JBQ1osQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksNkJBQTZCO2dCQUM1QyxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUU7Z0JBQ1osQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksNkJBQTZCO2dCQUM1QyxlQUFlLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFDaEM7Z0JBQ0UsZUFBZSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQy9CLFlBQVksR0FBRyxJQUFJLENBQUM7YUFDdkI7U0FDSjtRQUVELE9BQU8sWUFBWSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsa0JBQWtCO1FBQ2QsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDbEQ7Ozs7OztXQU1HO1FBQ0gsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUNwQyxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUU7WUFDMUIsTUFBTSxJQUFJLDRFQUF3QixDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ3JEO2FBQU07WUFDSCxJQUFJLGVBQWUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUM5QixnREFBZ0Q7Z0JBQ2hELE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDL0MsSUFBSSxVQUFVLEtBQUssSUFBSSxFQUFFO29CQUNyQixNQUFNLElBQUksdUVBQW1CLENBQUMsY0FBYyxDQUFDO2lCQUNoRDtxQkFBTTtvQkFDSCxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQ2xDO2dCQUNELE9BQU87YUFDVjtpQkFBTTtnQkFDSCxJQUFJLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFO29CQUNwQyxpRkFBaUY7b0JBQ2pGLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO2lCQUN4QjtxQkFBTTtvQkFDSCxrQkFBa0I7b0JBQ2xCLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLGVBQWUsRUFBRSxDQUFDO2lCQUNsRDtnQkFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDN0MsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNqQyxJQUFJLDZEQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO3dCQUM1QixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBRTdCLElBQUksSUFBSSxLQUFLLElBQUksRUFBRTs0QkFDZixTQUFTO3lCQUNaOzZCQUFNOzRCQUNILElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUMzQixNQUFNLDBCQUEwQixHQUFHLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQzs0QkFDL0QsSUFBSSwwQkFBMEIsS0FBSyxTQUFTLEVBQUU7Z0NBQzFDLE1BQU0sSUFBSSw0RUFBd0IsQ0FBQyxjQUFjLENBQUMsQ0FBQzs2QkFDdEQ7aUNBQU07Z0NBQ0gsTUFBTSxhQUFhLEdBQUcsMEJBQTBCLENBQUMsTUFBTSxDQUFDLGFBQWE7Z0NBQ3JFLE1BQU0sT0FBTyxHQUFHLENBQUMsYUFBYSxDQUFDLEVBQUUsR0FBRyxhQUFhLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsRUFBRSxHQUFHLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQ0FFOUYsTUFBTSxNQUFNLEdBQXFCO29DQUM3QixFQUFFLEVBQUUsYUFBYSxDQUFDLEVBQUU7b0NBQ3BCLEVBQUUsRUFBRSxhQUFhLENBQUMsRUFBRTtvQ0FDcEIsRUFBRSxFQUFFLGFBQWEsQ0FBQyxFQUFFO29DQUNwQixFQUFFLEVBQUUsYUFBYSxDQUFDLEVBQUU7b0NBQ3BCLFdBQVcsRUFBRSxLQUFLO29DQUNsQixPQUFPO2lDQUNWLENBQUM7Z0NBQ0YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7NkJBQ2hDO3lCQUNKO3FCQUNKO2lCQUNKO2FBQ0o7U0FDSjtJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssNkJBQTZCO1FBQ2pDLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUU7WUFDaEMsTUFBTSxJQUFJLDRFQUF3QixDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ3REO2FBQU07WUFDSCxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUV4RSxJQUFJLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ2pDLElBQUksSUFBSSxHQUFHLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuQyxJQUFJLDZEQUFXLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUNuQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO29CQUMxQixJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUU7d0JBQ2hCLE1BQU0sSUFBSSx1RUFBbUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztxQkFDakQ7eUJBQU07d0JBQ0gsSUFBSSxHQUFHLEtBQUssQ0FBQztxQkFDaEI7aUJBQ0o7Z0JBQ0QsSUFBSSxDQUFDLDZEQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUM1QixNQUFNLElBQUksK0RBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztpQkFDekM7cUJBQU07b0JBQ0gsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2lCQUNuQjthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1Isb0JBQW9CLENBQUMsS0FBWTtRQUNyQyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM3QixLQUFLLENBQUMsRUFBRSxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1FBQzdFLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsZ0NBQWtDLENBQUM7UUFDOUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDM0UsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtZQUNoQyxNQUFNLElBQUksNEVBQXdCLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDcEQ7YUFBTTtZQUNILElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDaEQsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyw2RUFBOEIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNqRiw4REFBZSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdEMsK0RBQWdCLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUN4QyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDN0I7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IsNkJBQTZCO1FBQ2pDLElBQUksSUFBSSxDQUFDLGVBQWUsS0FBSyxTQUFTLEVBQUU7WUFDcEMsTUFBTSxJQUFJLCtEQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDdkM7YUFBTTtZQUNILE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDbkMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRTtnQkFDdkIsTUFBTSxJQUFJLHVFQUFtQixDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQzlDO2lCQUFNO2dCQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sZ0NBQWtDLENBQUM7Z0JBQ2pFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMzRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDO2dCQUNqQyxLQUFLLENBQUMsR0FBRyxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO2dCQUM5RSxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2FBQzdCO1NBQ0o7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxzQkFBc0I7UUFDMUIsTUFBTSxXQUFXLEdBQW9CLEVBQUUsQ0FBQztRQUV4QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDL0MsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sS0FBSyxLQUFLLEVBQUU7Z0JBQ25ELFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzFDO2lCQUFNO2dCQUNILElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNuRDtTQUNKO1FBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBSyxXQUFXLENBQUMsTUFBTSxFQUFFO1lBQ2pELElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDN0I7SUFFTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGtCQUFrQjtRQUN0QixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQ2hDLE1BQU0sSUFBSSw0RUFBd0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUNyRDthQUFNO1lBQ0gsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixFQUFFLENBQUM7U0FDaEQ7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGdCQUFnQjtRQUNwQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzNELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUN6RDtJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSyxxQkFBcUI7UUFDekIsSUFBSSxJQUFJLENBQUMsZ0NBQWdDLEVBQUU7WUFDdkMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7U0FDcEM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0sseUJBQXlCO1FBQzdCLElBQUksSUFBSSxDQUFDLGtDQUFrQyxFQUFFO1lBQ3pDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1NBQ2xDO1FBRUQsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssU0FBUyxFQUFFO1lBQ3JDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxVQUFVLENBQzlCLEdBQUcsRUFBRTtnQkFDRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDO2dCQUNsQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDL0IsQ0FBQyxFQUNELElBQUksQ0FBQyxzQkFBc0IsQ0FDOUIsQ0FBQztTQUNMO0lBQ0wsQ0FBQztJQUVPLHVCQUF1QjtRQUMzQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxTQUFTLEVBQUU7WUFDckMsWUFBWSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUM7U0FDckM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssWUFBWTs7UUFDaEIsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztRQUNsQyxNQUFNLGdCQUFnQixHQUFHLFVBQUksQ0FBQyxpQkFBaUIsbUNBQUksV0FBVyxDQUFDO1FBRS9ELElBQUksZ0JBQWdCLEtBQUssV0FBVyxFQUFFO1lBQ2xDLElBQUksQ0FBQyxnQ0FBZ0MsR0FBRyxJQUFJLENBQUM7WUFFN0MsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQztZQUNqRCxlQUFlLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7WUFDdEMsZUFBZSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQ25DLGVBQWUsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQztZQUNwQyxlQUFlLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7WUFDMUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQ2xDLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztZQUMvQixXQUFXLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7WUFDaEMsV0FBVyxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1NBQ3pDO1FBRUQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGdCQUFnQixDQUFDO0lBQzlDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLGNBQWM7UUFDbEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRDs7O09BR0c7SUFDSyx1QkFBdUI7UUFDM0IsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtZQUNoQyxNQUFNLElBQUksNEVBQXdCLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDcEQ7YUFBTTtZQUNILElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1lBQ3hCLGtFQUFrRTtZQUNsRSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtnQkFDMUIsQ0FBQyxJQUFJLENBQUMsMEJBQTBCO2dCQUNoQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUMxQztnQkFDSSxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxFQUFFO29CQUN4RCxNQUFNLElBQUksNEVBQXdCLENBQUMsWUFBWSxDQUFDLENBQUM7aUJBQ3BEO3FCQUFNO29CQUNILDJDQUEyQztvQkFDM0MsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztvQkFDekUsSUFBSSxXQUFXLElBQUksQ0FBQyxFQUFFO3dCQUNsQixPQUFPO3FCQUNWO3lCQUFNO3dCQUNILHFDQUFxQzt3QkFDckMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUM7d0JBQ3RFLE1BQU0sYUFBYSxHQUFHLFdBQVcsR0FBRyxZQUFZLENBQUM7d0JBQ2pELElBQUksYUFBYSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7NEJBQzlCLE9BQU87eUJBQ1Y7NkJBQU07NEJBQ0gsaURBQWlEOzRCQUNqRCxJQUFJLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDOzRCQUV2Qyx1RkFBdUY7NEJBQ3ZGLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBQzdFLE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxHQUFHLGdCQUFnQixDQUFDOzRCQUV4RCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDekQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDOzRCQUN0QyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dDQUN4QixNQUFNLElBQUksK0RBQVcsQ0FBQyxhQUFhLENBQUM7NkJBQ3ZDO2lDQUFNO2dDQUNILE1BQU0sbUJBQW1CLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUN6QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0NBQ3ZDLG9CQUFvQjtvQ0FDcEIsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztvQ0FDckYsSUFBSSxDQUFDLCtCQUErQixDQUFDLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxDQUFDO2lDQUNyRTtnQ0FFRCxJQUFJLENBQUMsMEJBQTBCLEdBQUcsS0FBSyxDQUFDOzZCQUMzQzt5QkFDSjtxQkFDSjtpQkFDSjthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxtQkFBbUI7UUFDdkIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUM7UUFDNUMsTUFBTSxvQkFBb0IsR0FBRyxRQUFRLENBQUMsY0FBYyxLQUFLLHdEQUFjLENBQUMsTUFBTSxDQUFDO1FBQy9FLE1BQU0sNEJBQTRCLEdBQUcsUUFBUSxDQUFDLGNBQWMsS0FBSyx3REFBYyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQzFHLE9BQU8sb0JBQW9CLElBQUksNEJBQTRCLENBQUM7SUFDaEUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssK0JBQStCLENBQUMsU0FBc0IsRUFBRSxJQUFpQjtRQUM3RSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3ZDLElBQUksSUFBSSxZQUFZLGdEQUFLLEVBQUU7WUFDdkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzFDLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzdCLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDNUI7U0FDSjthQUFNO1lBQ0gsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzFDLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLCtCQUErQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUN6RDtTQUNKO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxZQUFZO1FBQ2hCLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUU7WUFDaEMsTUFBTSxJQUFJLDRFQUF3QixDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ3JEO2FBQU07WUFDSCxNQUFNLE1BQU0sR0FBWSxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFdEQsT0FBTyxNQUFNLENBQUM7U0FDakI7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1Isd0JBQXdCLENBQUMsSUFBYztRQUMzQyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQ2hDLE1BQU0sSUFBSSw0RUFBd0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUN0RDthQUFNO1lBQ0gsT0FBTyxJQUFJLENBQUMsaUNBQWlDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUN6RTtJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDUixpQ0FBaUMsQ0FBQyxJQUFjLEVBQUUsSUFBaUI7UUFDdkUsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUN2QyxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUM7UUFDN0MsSUFBSSxnQkFBZ0IsS0FBSyxDQUFDLEVBQUU7WUFDeEIsT0FBTyxTQUFTLENBQUM7U0FDcEI7YUFBTTtZQUNILEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDdkMsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLFdBQVcsQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO29CQUMzQixPQUFPLFdBQVcsQ0FBQztpQkFDdEI7YUFDSjtZQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDdkMsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwQyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQ25GLElBQUksZ0JBQWdCLEtBQUssU0FBUyxFQUFFO29CQUNoQyxPQUFPLGdCQUFnQixDQUFDO2lCQUMzQjthQUNKO1lBRUQsT0FBTyxTQUFTLENBQUM7U0FDcEI7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IscUNBQXFDLENBQUMsSUFBYyxFQUFFLEVBQVUsRUFBRSxJQUFpQjtRQUN2RixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3ZDLE1BQU0sZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQztRQUM3QyxJQUFJLGdCQUFnQixLQUFLLENBQUMsRUFBRTtZQUN4QixPQUFPLFNBQVMsQ0FBQztTQUNwQjthQUFNO1lBQ0gsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGdCQUFnQixFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN2QyxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BDLElBQUksV0FBVyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksV0FBVyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUU7b0JBQ3BELE9BQU8sV0FBVyxDQUFDO2lCQUN0QjthQUNKO1lBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGdCQUFnQixFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN2QyxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHFDQUFxQyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQzNGLElBQUksZ0JBQWdCLEtBQUssU0FBUyxFQUFFO29CQUNoQyxPQUFPLGdCQUFnQixDQUFDO2lCQUMzQjthQUNKO1lBRUQsT0FBTyxTQUFTLENBQUM7U0FDcEI7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssc0JBQXNCLENBQUMsTUFBZSxFQUFFLElBQWlCO1FBQzdELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDdkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDMUMsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdCLElBQUksSUFBSSxZQUFZLGdEQUFLLEVBQUU7Z0JBQ3ZCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDckI7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7b0JBQ25CLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7aUJBQzdDO2FBQ0o7U0FDSjtJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDUixpQkFBaUIsQ0FBQyxTQUFvRDtRQUMxRSxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQy9CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDNUIsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDN0MsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFO2dCQUN4QixPQUFPLFFBQVEsQ0FBQzthQUNuQjtTQUNKO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQztJQUVELGdCQUFnQjtJQUNSLFlBQVksQ0FBQyxRQUF3QztRQUN6RCxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ3JDLFFBQVEsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUNyQix3QkFBc0QsQ0FBQyxDQUFDO2dCQUNwRCxJQUFJLElBQUksQ0FBQyxxQkFBcUIsS0FBSyxTQUFTLEVBQUU7b0JBQzFDLE9BQU8sU0FBUztpQkFDbkI7cUJBQU07b0JBQ0gsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQztvQkFDekQsTUFBTSxrQkFBa0IsR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDO29CQUNuRCxNQUFNLHNCQUFzQixHQUFHLGtCQUFrQixDQUFDLE1BQU0sQ0FBQztvQkFDekQsSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFO3dCQUM3QixPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxzQkFBc0IsRUFBRSxDQUFDO3FCQUN4RDt5QkFBTTt3QkFDSCxNQUFNLFlBQVksR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7d0JBQzVFLE1BQU0sS0FBSyxHQUFHLFlBQVksR0FBRyxhQUFhLENBQUM7d0JBQzNDLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsc0JBQXNCLEVBQUU7NEJBQzdDLE9BQU8sU0FBUyxDQUFDO3lCQUNwQjs2QkFBTTs0QkFDSCxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDO3lCQUNoQztxQkFDSjtpQkFDSjthQUNKO1lBQ0QseUJBQXVELENBQUMsQ0FBQztnQkFDckQsSUFBSSxJQUFJLENBQUMscUJBQXFCLEtBQUssU0FBUyxFQUFFO29CQUMxQyxPQUFPLFNBQVM7aUJBQ25CO3FCQUFNO29CQUNILE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUM7b0JBQ3pELE9BQU8sSUFBSSxDQUFDLCtCQUErQixDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsQ0FBQztpQkFDMUU7YUFDSjtZQUNELHVCQUFxRCxDQUFDLENBQUM7Z0JBQ25ELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxrREFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNqRSxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUU7b0JBQzFCLE9BQU8sU0FBUyxDQUFDO2lCQUNwQjtxQkFBTTtvQkFDSCxPQUFPLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7aUJBQzFFO2FBQ0o7WUFDRCw2QkFBMkQsQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsa0RBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDN0QsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFO29CQUMxQixPQUFPLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7aUJBQzFFO3FCQUFNO29CQUNILFVBQVUsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsa0RBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDNUQsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFO3dCQUMxQixPQUFPLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7cUJBQzFFO3lCQUFNO3dCQUNILE9BQU8sU0FBUyxDQUFDO3FCQUNwQjtpQkFDSjthQUNKO1lBQ0QscUJBQW1ELENBQUMsQ0FBQztnQkFDakQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGtEQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQy9ELElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTtvQkFDMUIsT0FBTyxTQUFTLENBQUM7aUJBQ3BCO3FCQUFNO29CQUNILE9BQU8sSUFBSSxDQUFDLCtCQUErQixDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsQ0FBQztpQkFDMUU7YUFDSjtZQUNELHdCQUFzRCxDQUFDLENBQUM7Z0JBQ3BELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxrREFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNsRSxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUU7b0JBQzFCLE9BQU8sU0FBUyxDQUFDO2lCQUNwQjtxQkFBTTtvQkFDSCxPQUFPLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7aUJBQzFFO2FBQ0o7WUFDRCxrQkFBZ0QsQ0FBQyxDQUFDO2dCQUM5QyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO29CQUNoQyxNQUFNLElBQUksNEVBQXdCLENBQUMsY0FBYyxDQUFDLENBQUM7aUJBQ3REO3FCQUFNO29CQUNILElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUU7d0JBQzdCLE9BQU8sU0FBUyxDQUFDO3FCQUNwQjt5QkFBTTt3QkFDSCxJQUFJLGFBQWEsS0FBSyxTQUFTLElBQUksYUFBYSxLQUFLLENBQUM7NEJBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7NkJBQ2pEOzRCQUNELE9BQU8sU0FBUyxDQUFDO3lCQUNwQjtxQkFDSjtpQkFDSjthQUNKO1lBQ0QsaUJBQStDLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtvQkFDaEMsTUFBTSxJQUFJLDRFQUF3QixDQUFDLFlBQVksQ0FBQyxDQUFDO2lCQUNwRDtxQkFBTTtvQkFDSCxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDO29CQUN6RCxJQUFJLGtCQUFrQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7d0JBQ2pDLElBQUksYUFBYSxLQUFLLFNBQVMsSUFBSSxhQUFhLEtBQUssQ0FBQzs0QkFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQzs2QkFDakQ7NEJBQ0QsT0FBTyxTQUFTLENBQUM7eUJBQ3BCO3FCQUNKO3lCQUFNO3dCQUNILE1BQU0sVUFBVSxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUN6QyxPQUFPLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7cUJBQzFFO2lCQUNKO2FBQ0o7U0FDSjtJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDUiwrQkFBK0IsQ0FBQyxVQUF1QixFQUMzRCxhQUFpQztRQUVqQyxNQUFNLGtCQUFrQixHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUM7UUFDbkQsTUFBTSxzQkFBc0IsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7UUFDekQsSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFO1lBQzdCLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLHNCQUFzQixFQUFFLENBQUM7U0FDeEQ7YUFBTTtZQUNILElBQUksYUFBYSxHQUFHLENBQUMsSUFBSSxhQUFhLEdBQUcsc0JBQXNCLEVBQUU7Z0JBQzdELE9BQU8sU0FBUyxDQUFDO2FBQ3BCO2lCQUFNO2dCQUNILE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxDQUFDO2FBQy9DO1NBQ0o7SUFDTCxDQUFDO0NBQ0o7QUFFRCxjQUFjO0FBQ2QsV0FBaUIsYUFBYTtJQVcxQixnQkFBZ0I7SUFDaEIsU0FBZ0IsMEJBQTBCLENBQUMsUUFBa0I7UUFDekQsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcseUNBQXNDLENBQUM7UUFDNUQsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUplLHdDQUEwQiw2QkFJekM7SUFFRCxnQkFBZ0I7SUFDaEIsU0FBZ0IsK0JBQStCLENBQUMsUUFBa0I7UUFDOUQsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsb0RBQTJDLENBQUM7UUFDakUsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUplLDZDQUErQixrQ0FJOUM7SUE2Q0Q7OztPQUdHO0lBQ1Usc0NBQXdCLEdBQWdDO1FBQ2pFLEVBQUUsTUFBTSxzQkFBc0MsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO1FBQ2xFLEVBQUUsTUFBTSxvQkFBb0MsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO1FBQ2hFLEVBQUUsTUFBTSwwQkFBMEMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO1FBQ3RFLEVBQUUsTUFBTSxjQUE4QixFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7S0FDN0QsQ0FBQztJQUVGOzs7T0FHRztJQUNVLHlEQUEyQyxHQUFnQztRQUNwRixFQUFFLE1BQU0scUJBQXFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtRQUN6RCxFQUFFLE1BQU0sb0JBQW9DLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtRQUNoRSxFQUFFLE1BQU0sMEJBQTBDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtRQUN0RSxFQUFFLE1BQU0sY0FBOEIsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO0tBQzdELENBQUM7QUFDTixDQUFDLEVBekZnQixhQUFhLEtBQWIsYUFBYSxRQXlGN0I7Ozs7Ozs7Ozs7Ozs7OztBQzkxREQ7Ozs7O0VBS0U7QUFFSyxJQUFVLGNBQWMsQ0FtTzlCO0FBbk9ELFdBQWlCLGNBQWM7SUFNM0IsTUFBTSxJQUFJLEdBQXNCO1FBQzVCLFVBQVU7UUFDVixZQUFZO1FBQ1osb0JBQW9CO1FBQ3BCLGlCQUFpQjtRQUNqQixrQkFBa0I7UUFDbEIsWUFBWTtRQUNaLGFBQWE7UUFDYixlQUFlO1FBQ2YsY0FBYztRQUNkLGNBQWM7UUFDZCxnQkFBZ0I7UUFDaEIsaUJBQWlCO1FBQ2pCLFFBQVE7UUFDUixPQUFPO1FBQ1AsVUFBVTtRQUNWLFVBQVU7UUFDVixRQUFRO1FBQ1IsU0FBUztRQUNULGVBQWU7UUFDZixnQkFBZ0I7UUFDaEIsSUFBSTtRQUNKLE9BQU87UUFDUCxNQUFNO1FBQ04sUUFBUTtRQUNSLFlBQVk7UUFDWixPQUFPO1FBQ1Asa0JBQWtCO1FBQ2xCLGFBQWE7UUFDYixVQUFVO1FBQ1YsaUJBQWlCO1FBQ2pCLGdCQUFnQjtRQUNoQixpQkFBaUI7UUFJakIsNkNBQTZDO0tBQ2hELENBQUM7SUFFRixNQUFNLE1BQU0sR0FBa0M7UUFDMUMsSUFBSTtRQUNKLEtBQUs7UUFDTCxLQUFLO1FBQ0wsUUFBUTtRQUNSLE9BQU87UUFDUCxXQUFXO1FBQ1gsT0FBTztRQUNQLFVBQVU7UUFDVixVQUFVO1FBQ1Ysb0JBQW9CO0tBQ3ZCLENBQUM7SUFFRixTQUFnQixlQUFlO1FBQzNCLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUU7WUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1NBQzNEO0lBQ0wsQ0FBQztJQUplLDhCQUFlLGtCQUk5QjtJQUVELFNBQWdCLGVBQWUsQ0FBQyxJQUE2QixFQUFFLE1BQWU7UUFDMUUsTUFBTSxFQUFFLEdBQTRCLEVBQUUsQ0FBQztRQUN2QyxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRTtZQUNwQixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxtREFBbUQ7Z0JBQy9FLElBQUksYUFBcUIsQ0FBQztnQkFDMUIsSUFBSSxNQUFNLEVBQUU7b0JBQ1IsYUFBYSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDbEM7cUJBQU07b0JBQ0gsYUFBYSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDcEM7Z0JBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM1QixFQUFFLENBQUMsYUFBYSxDQUFDLEdBQUcsY0FBYyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQzthQUN6RDtTQUNKO1FBRUQsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDO0lBakJlLDhCQUFlLGtCQWlCOUI7SUFFRCxTQUFTLGNBQWMsQ0FBQyxJQUFlLEVBQUUsTUFBZTtRQUNwRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzNCLE1BQU0sRUFBRSxHQUFHLElBQUksS0FBSyxDQUFVLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDN0Isa0VBQWtFO1lBQ2xFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsY0FBYyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztTQUM3QztRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVELFNBQVMsY0FBYyxDQUFDLElBQWEsRUFBRSxNQUFlO1FBQ2xELElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO1lBQzFCLElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtnQkFDZixPQUFPLElBQUksQ0FBQzthQUNmO2lCQUFNO2dCQUNILElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDckIsT0FBTyxjQUFjLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2lCQUN2QztxQkFBTTtvQkFDSCxPQUFPLGVBQWUsQ0FBQyxJQUErQixFQUFFLE1BQU0sQ0FBQyxDQUFDO2lCQUNuRTthQUNKO1NBQ0o7YUFBTTtZQUNILElBQUksTUFBTSxFQUFFO2dCQUNSLE9BQU8sV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzVCO2lCQUFNO2dCQUNILE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzlCO1NBQ0o7SUFDTCxDQUFDO0lBRUQsU0FBUyxTQUFTLENBQUMsS0FBYTtRQUM1Qjs7O1dBR0c7UUFDSCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNqRCxPQUFPLEtBQUssR0FBRyxLQUFLLENBQUM7U0FDeEI7UUFFRCxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFaEM7O1dBRUc7UUFDSCxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNkLE9BQU8sS0FBSyxDQUFDO1lBRWI7O2VBRUc7U0FDTjthQUFNO1lBQ0gsT0FBTyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzdCO0lBQ0wsQ0FBQztJQUVELFNBQVMsV0FBVyxDQUFDLEdBQVc7UUFDNUI7OztXQUdHO1FBQ0gsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNsQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDbEM7UUFFRDs7OztXQUlHO1FBQ0gsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUU7WUFDNUIsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDakI7UUFDRDs7V0FFRztRQUNILE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUVELFNBQVMsV0FBVyxDQUFDLEtBQWM7UUFDL0I7OztXQUdHO1FBQ0gsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDakQsT0FBTyxLQUFLLEdBQUcsS0FBSyxDQUFDO1NBQ3hCO1FBRUQsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWxDOztXQUVHO1FBQ0gsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDZCxPQUFPLEtBQUssQ0FBQztZQUViOztlQUVHO1NBQ047YUFBTTtZQUNILE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUM3QjtJQUNMLENBQUM7SUFFRCxTQUFTLGFBQWEsQ0FBQyxLQUFjO1FBQ2pDOzs7V0FHRztRQUNILElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2pELE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUN0QztRQUVEOzs7O1dBSUc7UUFDSCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUU7WUFDM0QsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbkI7UUFDRDs7V0FFRztRQUNILE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxTQUFTLFVBQVUsQ0FBQyxHQUFXO1FBQzNCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2xDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtnQkFDakIsT0FBTyxDQUFDLENBQUM7YUFDWjtTQUNKO1FBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNkLENBQUM7SUFFRCxTQUFTLFlBQVksQ0FBQyxLQUFjO1FBQ2hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3BDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssRUFBRTtnQkFDckIsT0FBTyxDQUFDLENBQUM7YUFDWjtTQUNKO1FBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNkLENBQUM7QUFDTCxDQUFDLEVBbk9nQixjQUFjLEtBQWQsY0FBYyxRQW1POUI7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6TzhDO0FBRS9DLGdCQUFnQjtBQUNULE1BQU0sWUFBYSxTQUFRLHdEQUFZO0lBZTFDLFlBQW9CLFNBQXNCLEVBQUUsMEJBQXlDO1FBQ2pGLEtBQUssRUFBRSxDQUFDO1FBRFEsY0FBUyxHQUFULFNBQVMsQ0FBYTtRQU5sQyxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFFekIsOEJBQXlCLEdBQUcsQ0FBQyxFQUFnQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLDhCQUF5QixHQUFHLENBQUMsRUFBZ0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6RSw0QkFBdUIsR0FBRyxDQUFDLEVBQWdCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFLekUsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7UUFFMUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsU0FBUyxFQUFFLEdBQUcsMEJBQTBCLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQztRQUMzQixJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFFNUI7Ozs7V0FJRztRQUNILElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBRXBCOzs7OztXQUtHO1FBQ0gsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFFckIsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUMsQ0FBQztRQUVwRSxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUV2QixJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMseUJBQXlCLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN0RyxDQUFDO0lBRUQsT0FBTztRQUNILElBQUksQ0FBQyx3Q0FBd0MsRUFBRSxDQUFDO1FBRWhELElBQUksQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFFRCxVQUFVO1FBQ04sSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRU8sYUFBYSxDQUFDLE1BQW9CO1FBQ3RDLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBcUIsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUU7WUFDbkYsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ25DO0lBQ0wsQ0FBQztJQUVPLGtCQUFrQixDQUFDLEtBQW1CO1FBQzFDLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBRTVCLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ2hGLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQy9GLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsNkNBQXdDLENBQUM7UUFDbEUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUU3QixJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FDdEIsR0FBRyxFQUFFO1lBQ0QsSUFBSTtnQkFDQSxJQUFJLENBQUMsU0FBUyxFQUFFO2FBQ25CO1lBQ0QsT0FBTyxHQUFHLEVBQUU7Z0JBQ1IsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbkIsTUFBTSxHQUFHLENBQUM7YUFDYjtRQUNMLENBQUMsRUFDQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVPLGFBQWEsQ0FBQyxNQUFvQjtRQUN0QyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN2QixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUMzQjtJQUNMLENBQUM7SUFFTyxlQUFlLENBQUMsS0FBbUI7UUFDdkMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQztRQUN4RCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO1FBRXhELElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxLQUFLLEVBQUU7WUFDMUIsSUFDSSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVO2dCQUNuQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQ3JDO2dCQUNFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzthQUNwQjtTQUNKO1FBRUQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDOUM7SUFDTCxDQUFDO0lBRU8sV0FBVyxDQUFDLE1BQW9CO1FBQ3BDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVPLGVBQWUsQ0FBQyxTQUF3QjtRQUM1QyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO1lBQzdCLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7U0FDN0I7UUFFRCxJQUFJLENBQUMsd0NBQXdDLEVBQUUsQ0FBQztRQUVoRCxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSSxFQUFFO1lBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sOEJBQWlDLENBQUM7WUFDOUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSw4QkFBaUMsQ0FBQztZQUNqRSxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztTQUNwQztJQUNMLENBQUM7SUFFTyx3Q0FBd0M7UUFDNUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUM7WUFDbkYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDL0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSw2Q0FBd0MsQ0FBQztZQUNyRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO1NBQ2pDO0lBQ0wsQ0FBQztJQUVPLFNBQVM7UUFDYixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO1lBQzdCLFlBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7U0FDN0I7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLDhCQUFpQyxDQUFDO1FBQzNELElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsOEJBQWlDLENBQUM7UUFDOUQsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3RSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNqRCxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7Ozs7OztBQ3BKRDs7OztHQUlHO0FBQ0ksTUFBTSxZQUFZO0lBQXpCO1FBQ0ksZ0JBQWdCO1FBQ1IsMkJBQXNCLEdBQW1DLEVBQUUsQ0FBQztRQUNwRSxnQkFBZ0I7UUFDUixzQkFBaUIsR0FBRyxJQUFJLEdBQUcsRUFBMEMsQ0FBQztRQXFFOUU7O1dBRUc7UUFDSCxXQUFNLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1FBRWxDOztXQUVHO1FBQ0gsWUFBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7SUFzRXhCLENBQUM7SUFqSkcsNkRBQTZEO0lBQzdELGNBQWMsQ0FBQyxJQUFZLEVBQUUsSUFBZTtRQUN4Qyw0QkFBNEI7SUFDaEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsSUFBSSxDQUE4QyxTQUFZLEVBQUUsR0FBRyxJQUFvQztRQUNuRyxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXpELElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRTtZQUM1QixZQUFZLEdBQUcsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3BDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUMxQyxNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO2FBQ3pCO1NBQ0o7UUFFRCxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLFdBQVcsQ0FBQyxTQUFpQixFQUFFLEdBQUcsSUFBZ0M7UUFDOUQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVqRCxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDcEIsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNwQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDbEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7YUFDcEI7U0FDSjtRQUVELElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIscUJBQXFCLENBQThDLFNBQVk7UUFDM0UsTUFBTSxLQUFLLEdBQUcsSUFBSSxZQUFZLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLHdCQUF3QixDQUFDLFNBQWlCO1FBQ3RDLE1BQU0sS0FBSyxHQUFHLElBQUksWUFBWSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxtQkFBbUIsQ0FBOEMsU0FBWSxFQUFFLFFBQWtDO1FBQzdHLE1BQU0sZUFBZSxHQUFHLFFBQXdDLENBQUM7UUFDakUsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFNBQVMsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQsR0FBRyxDQUE4QyxTQUFZLEVBQUUsUUFBa0M7UUFDN0YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBWUQ7Ozs7O09BS0c7SUFDSCxnQkFBZ0IsQ0FBOEMsU0FBWSxFQUFFLFFBQWtDO1FBQzFHLE1BQU0sZUFBZSxHQUFHLFFBQXdDLENBQUM7UUFDakUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsRUFBRSxDQUE4QyxTQUFZLEVBQUUsUUFBa0M7UUFDNUYsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IsdUJBQXVCLENBQUMsU0FBaUIsRUFBRSxRQUFzQztRQUNyRixJQUFJLFNBQVMsS0FBSyxZQUFZLENBQUMsU0FBUyxFQUFFO1lBQ3RDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDOUM7YUFBTTtZQUNILElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUQsSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFO2dCQUM3QixhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ2hDO2lCQUFNO2dCQUNILGFBQWEsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMzQixJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQzthQUN4RDtTQUNKO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNSLDBCQUEwQixDQUFDLFNBQWlCLEVBQUUsUUFBc0M7UUFDeEYsSUFBSSxTQUFTLEtBQUssWUFBWSxDQUFDLFNBQVMsRUFBRTtZQUN0QyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxRQUFRLENBQUMsQ0FBQztTQUM3RTthQUFNO1lBQ0gsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM1RCxJQUFJLGFBQWEsS0FBSyxTQUFTLEVBQUU7Z0JBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLEdBQUcsU0FBUyxDQUFDLENBQUM7YUFDN0U7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7YUFDL0Q7U0FDSjtJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDUixrQkFBa0IsQ0FBQyxTQUFpQixFQUFFLGFBQTZDLEVBQUUsUUFBc0M7UUFDL0gsTUFBTSxHQUFHLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUU7WUFDVCxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixHQUFHLFNBQVMsQ0FBQyxDQUFDO1NBQ3pEO2FBQU07WUFDSCxhQUFhLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNoQztJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDUixZQUFZLENBQUMsU0FBaUIsRUFBRSxJQUFlO1FBQ25ELE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQztRQUN0RSxJQUFJLDBCQUEwQixHQUFHLENBQUMsRUFBRTtZQUNoQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFnQyxDQUFDO1lBQy9ELFdBQVcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFL0IsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFakUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLDBCQUEwQixFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNqRCxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDO2FBQzNDO1NBQ0o7SUFDTCxDQUFDO0NBQ0o7QUFFRCxjQUFjO0FBQ2QsV0FBaUIsWUFBWTtJQUN6Qjs7T0FFRztJQUNVLHNCQUFTLEdBQUcsT0FBTyxDQUFDO0lBRXBCLGlDQUFvQixHQUFHLGtCQUFrQixDQUFDO0lBQzFDLHNDQUF5QixHQUFHLHVCQUF1QixDQUFDO0lBaUVqRSxNQUFhLGFBQWE7UUFVdEIsZ0JBQWdCO1FBQ2hCO1FBQ0ksZ0JBQWdCO1FBQ0MsS0FBYTtRQUM5QixnQkFBZ0I7UUFDQyxPQUFxQjtZQUZyQixVQUFLLEdBQUwsS0FBSyxDQUFRO1lBRWIsWUFBTyxHQUFQLE9BQU8sQ0FBYztZQWQxQyxnQkFBZ0I7WUFDUiwwQkFBcUIsR0FBRyxLQUFLLENBQUM7UUFjdEMsQ0FBQztRQVpELElBQUksSUFBSSxLQUFhLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDekMsSUFBSSxNQUFNLEtBQW1CLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDbkQsNEZBQTRGO1FBQzVGLElBQUksTUFBTSxLQUFtQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ25ELElBQUksb0JBQW9CLEtBQWMsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDO1FBVTFFLGVBQWU7WUFDWCxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO1FBQ3RDLENBQUM7S0FDSjtJQXJCWSwwQkFBYSxnQkFxQnpCO0lBRUQsTUFBYSxrQkFBbUIsU0FBUSxhQUFhO1FBR2pELGdCQUFnQjtRQUNoQixZQUFZLElBQVksRUFBRSxNQUFvQjtRQUMxQyxnQkFBZ0I7UUFDQyxXQUF1QjtZQUV4QyxLQUFLLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRkgsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUFHNUMsQ0FBQztRQVJELElBQUksVUFBVSxLQUFpQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0tBUzVEO0lBVlksK0JBQWtCLHFCQVU5QjtJQUVELE1BQWEsdUJBQXdCLFNBQVEsYUFBYTtRQUd0RCxnQkFBZ0I7UUFDaEIsWUFBWSxJQUFZLEVBQUUsTUFBb0I7UUFDMUMsZ0JBQWdCO1FBQ0MsV0FBdUI7WUFFeEMsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUZILGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBRzVDLENBQUM7UUFSRCxJQUFJLFVBQVUsS0FBaUIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztLQVM1RDtJQVZZLG9DQUF1QiwwQkFVbkM7QUFDTCxDQUFDLEVBdEhnQixZQUFZLEtBQVosWUFBWSxRQXNINUI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDelI4RDtBQUVoQjtBQVUvQzs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNJLE1BQU0sUUFBUyxTQUFRLHdEQUFZO0lBS3RDOzs7O09BSUc7SUFDSDtJQUNJLGdCQUFnQjtJQUNSLGNBQTZCO1FBRXJDLEtBQUssRUFBRSxDQUFDO1FBRkEsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFWekMsZ0JBQWdCO1FBQ1Isd0JBQW1CLEdBQUcsQ0FBQyxVQUFrRCxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFZcEgsVUFBVSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdEcsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNNLElBQUksQ0FBOEMsU0FBWSxFQUFFLEdBQUcsSUFBb0M7UUFDNUcsSUFBSSxTQUFTLEtBQUssZUFBZSxFQUFFO1lBQy9CLG1FQUFtRTtZQUNuRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztTQUNuQzthQUFNO1lBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztTQUNsQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCxpQkFBaUIsQ0FBQyxHQUFHLElBQWdDO1FBQ2pELDhCQUE4QjtRQUM5QixJQUFJLENBQUMsd0JBQXdCLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRDs7O09BR0c7SUFDSCxPQUFPO1FBQ0gsVUFBVSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVEOzs7T0FHRztJQUNLLHdCQUF3QixDQUFDLFNBQWlCLEVBQUUsSUFBZTtRQUMvRCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFO1lBQ2pDLHNFQUFzRTtZQUN0RSwrQkFBK0I7WUFDL0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUMzQzthQUFNO1lBQ0gsZ0VBQWdFO1lBQ2hFLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDbkQ7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssZ0JBQWdCLENBQUMsS0FBNkM7UUFDbEUsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUM1QixJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxpQkFBaUIsQ0FBQyxTQUFpQixFQUFFLElBQWU7UUFDeEQsTUFBTSxNQUFNLEdBQThCO1lBQ3RDLGFBQWEsRUFBRSxJQUFJLENBQUMsY0FBYztZQUNsQyxTQUFTO1lBQ1QsSUFBSSxFQUFFLElBQUk7U0FDYjtRQUVELE1BQU0sU0FBUyxHQUE0QjtZQUN2QyxPQUFPLEVBQUUsSUFBSTtZQUNiLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLE1BQU07U0FDVCxDQUFDO1FBRUYsTUFBTSxLQUFLLEdBQUcsSUFBSSxXQUFXLENBQTRCLFFBQVEsQ0FBQyxjQUFjLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDN0YsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUNqQyxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7WUFDakIsTUFBTSxJQUFJLHVFQUFtQixDQUFDLFlBQVksQ0FBQztTQUM5QztRQUVELE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7T0FHRztJQUNLLHlCQUF5QixDQUFDLFNBQWlCLEVBQUUsSUFBZTtRQUNoRSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ3JDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDN0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUM7WUFFbkUsSUFBSSxPQUFPLEVBQUU7Z0JBQ1QsT0FBTyxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDL0Q7U0FDSjtJQUNMLENBQUM7Q0FDSjtBQUVELGNBQWM7QUFDZCxXQUFpQixRQUFRO0lBRXJCLGdCQUFnQjtJQUNILHVCQUFjLEdBQUcsZ0JBQWdCLENBQUM7QUFXbkQsQ0FBQyxFQWRnQixRQUFRLEtBQVIsUUFBUSxRQWN4Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsS3NEO0FBZ0J2RCxjQUFjO0FBQ1AsSUFBVSxXQUFXLENBMkUzQjtBQTNFRCxXQUFpQixXQUFXO0lBQ3hCLGdCQUFnQjtJQUNoQixJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFXeEIsZ0JBQWdCO0lBQ2hCLE1BQU0sV0FBVyxHQUFnQjtRQUM3Qix5Q0FBeUMsRUFBRTtZQUN2QyxFQUFFLG1EQUF3RDtZQUMxRCxPQUFPLEVBQUUsaURBQWlEO1NBQzdEO1FBQ0Qsa0NBQWtDLEVBQUU7WUFDaEMsRUFBRSw0Q0FBaUQ7WUFDbkQsT0FBTyxFQUFFLHdDQUF3QztTQUNwRDtRQUNELGlFQUFpRSxFQUFFO1lBQy9ELEVBQUUsMkVBQWdGO1lBQ2xGLE9BQU8sRUFBRSwyRUFBMkU7U0FDdkY7UUFDRCw0QkFBNEIsRUFBRTtZQUMxQixFQUFFLHNDQUEyQztZQUM3QyxPQUFPLEVBQUUsaUNBQWlDO1NBQzdDO1FBQ0QsdUJBQXVCLEVBQUU7WUFDckIsRUFBRSxpQ0FBc0M7WUFDeEMsT0FBTyxFQUFFLG1FQUFtRTtTQUMvRTtRQUNELDBDQUEwQyxFQUFFO1lBQ3hDLEVBQUUsb0RBQXlEO1lBQzNELE9BQU8sRUFBRSwwREFBMEQ7U0FDdEU7UUFDRCw0QkFBNEIsRUFBRTtZQUMxQixFQUFFLHNDQUEyQztZQUM3QyxPQUFPLEVBQUUscUNBQXFDO1NBQ2pEO1FBRUQsNkJBQTZCLEVBQUU7WUFDM0IsRUFBRSx1Q0FBNEM7WUFDOUMsT0FBTyxFQUFFLG9DQUFvQztTQUNoRDtRQUNELHVCQUF1QixFQUFFO1lBQ3JCLEVBQUUsaUNBQXNDO1lBQ3hDLE9BQU8sRUFBRSw2QkFBNkI7U0FDekM7UUFDRCwyQkFBMkIsRUFBRTtZQUN6QixFQUFFLHFDQUEwQztZQUM1QyxPQUFPLEVBQUUsaUNBQWlDO1NBQzdDO0tBQ0o7SUFFWSxtQkFBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3ZELGdCQUFnQjtJQUNoQixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRXpDLFNBQWdCLGVBQWU7UUFDM0IsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNkLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxtQkFBTyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUM5QixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RCLElBQUksSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUU7b0JBQ2YsTUFBTSxJQUFJLCtEQUFXLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2lCQUMxRDtxQkFBTTtvQkFDSCxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztpQkFDakM7YUFDSjtTQUNKO1FBQ0QsV0FBVyxHQUFHLElBQUksQ0FBQztJQUN2QixDQUFDO0lBWmUsMkJBQWUsa0JBWTlCO0FBQ0wsQ0FBQyxFQTNFZ0IsV0FBVyxLQUFYLFdBQVcsUUEyRTNCO0FBRUQsY0FBYztBQUNQLE1BQU0sV0FBVyxHQUFHLElBQUksS0FBSyxDQUFTLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FDL0ZsRSxjQUFjO0FBQ1AsSUFBVSxjQUFjLENBSTlCO0FBSkQsV0FBaUIsY0FBYztJQUNkLHlDQUEwQixHQUFHLE1BQU0sQ0FBQztJQUNwQyx5Q0FBMEIsR0FBRyxJQUFJLENBQUM7SUFDbEMsbURBQW9DLEdBQUcsSUFBSSxDQUFDO0FBQzdELENBQUMsRUFKZ0IsY0FBYyxLQUFkLGNBQWMsUUFJOUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ0wrRDtBQUNiO0FBS25ELGdCQUFnQjtBQUNULElBQVUseUJBQXlCLENBR3pDO0FBSEQsV0FBaUIseUJBQXlCO0lBQ3pCLCtCQUFLLEdBQUcsT0FBTyxDQUFDO0lBQ2hCLGdDQUFNLEdBQUcsUUFBUSxDQUFDO0FBQ25DLENBQUMsRUFIZ0IseUJBQXlCLEtBQXpCLHlCQUF5QixRQUd6QztBQWdCRCxjQUFjO0FBQ1AsSUFBVSxJQUFJLENBS3BCO0FBTEQsV0FBaUIsSUFBSTtJQUNKLFFBQUcsR0FBRyxLQUFLLENBQUM7SUFDWixTQUFJLEdBQUcsTUFBTSxDQUFDO0lBQ2QsVUFBSyxHQUFHLE9BQU8sQ0FBQztJQUNoQixXQUFNLEdBQUcsUUFBUSxDQUFDO0FBQ25DLENBQUMsRUFMZ0IsSUFBSSxLQUFKLElBQUksUUFLcEI7QUFJRCxjQUFjO0FBQ1AsSUFBVSxhQUFhLENBSTdCO0FBSkQsV0FBaUIsYUFBYTtJQUNiLGtCQUFJLEdBQUcsTUFBTSxDQUFDO0lBQ2Qsa0JBQUksR0FBRyxNQUFNLENBQUM7SUFDZCw0QkFBYyxHQUFHLGdCQUFnQixDQUFDO0FBQ25ELENBQUMsRUFKZ0IsYUFBYSxLQUFiLGFBQWEsUUFJN0I7QUFFRCxjQUFjO0FBQ1AsTUFBTSx5QkFBeUIsR0FBRztJQUNyQyxJQUFJLEVBQUUsNERBQWMsQ0FBQywwQkFBMEI7SUFDL0MsSUFBSSxFQUFFLDREQUFjLENBQUMsMEJBQTBCO0lBQy9DLGNBQWMsRUFBRSw0REFBYyxDQUFDLG9DQUFvQztDQUN0RTtBQTJCRCxjQUFjO0FBQ1AsSUFBVSxTQUFTLENBU3pCO0FBVEQsV0FBaUIsU0FBUztJQUN0QixTQUFnQixNQUFNLENBQUMsS0FBZ0I7UUFDbkMsT0FBTyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUZlLGdCQUFNLFNBRXJCO0lBRUQsd0RBQXdEO0lBQ3hELFNBQWdCLFlBQVksQ0FBQyxLQUFnQjtRQUN6QyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQztJQUNoRixDQUFDO0lBRmUsc0JBQVksZUFFM0I7QUFDTCxDQUFDLEVBVGdCLFNBQVMsS0FBVCxTQUFTLFFBU3pCO0FBS0QsY0FBYztBQUNQLElBQVUsUUFBUSxDQU14QjtBQU5ELFdBQWlCLFFBQVE7SUFDUixlQUFNLEdBQUcsUUFBUSxDQUFDO0lBQ2xCLFlBQUcsR0FBRyxLQUFLLENBQUM7SUFDWixlQUFNLEdBQUcsUUFBUSxDQUFDO0lBQ2xCLGNBQUssR0FBRyxPQUFPLENBQUM7SUFDaEIsa0JBQVMsR0FBRyxXQUFXLENBQUM7QUFDekMsQ0FBQyxFQU5nQixRQUFRLEtBQVIsUUFBUSxRQU14QjtBQUlELGNBQWM7QUFDUCxJQUFVLGNBQWMsQ0FJOUI7QUFKRCxXQUFpQixjQUFjO0lBQ2QsbUJBQUksR0FBRyxNQUFNLENBQUM7SUFDZCxxQkFBTSxHQUFHLFFBQVEsQ0FBQztJQUNsQixxQkFBTSxHQUFHLFFBQVEsQ0FBQztBQUNuQyxDQUFDLEVBSmdCLGNBQWMsS0FBZCxjQUFjLFFBSTlCO0FBUUQsY0FBYztBQUNkLElBQVksWUFLWDtBQUxELFdBQVksWUFBWTtJQUNwQiw0QkFBWTtJQUNaLDZCQUFhO0lBQ2IsaUNBQWlCO0lBQ2pCLHlCQUFTO0FBQ2IsQ0FBQyxFQUxXLFlBQVksS0FBWixZQUFZLFFBS3ZCO0FBRUQsY0FBYztBQUNkLFdBQWlCLFlBQVk7SUFDekIsU0FBZ0IsUUFBUSxDQUFDLEtBQWE7UUFDbEMsUUFBUSxLQUFLLEVBQUU7WUFDWCxLQUFLLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLFlBQVksQ0FBQyxLQUFLLENBQUM7WUFDbkQsS0FBSyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDO1lBQ3ZELEtBQUssWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sWUFBWSxDQUFDLFVBQVUsQ0FBQztZQUM3RCxLQUFLLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDN0MsT0FBTyxDQUFDLENBQUMsT0FBTyxTQUFTLENBQUM7U0FDN0I7SUFDTCxDQUFDO0lBUmUscUJBQVEsV0FRdkI7SUFFRCxTQUFnQixNQUFNLENBQUMsS0FBbUI7UUFDdEMsUUFBUSxLQUFLLEVBQUU7WUFDWCxLQUFLLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLFlBQVksQ0FBQyxLQUFLLENBQUM7WUFDbkQsS0FBSyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDO1lBQ3ZELEtBQUssWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sWUFBWSxDQUFDLFVBQVUsQ0FBQztZQUM3RCxLQUFLLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDN0M7Z0JBQ0ksTUFBTSxJQUFJLHdFQUFvQixDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUMxRDtJQUNMLENBQUM7SUFUZSxtQkFBTSxTQVNyQjtBQUNMLENBQUMsRUFyQmdCLFlBQVksS0FBWixZQUFZLFFBcUI1Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlJRCxnQkFBZ0I7QUFDVCxTQUFTLGNBQWMsQ0FBQyxLQUFhO0lBQ3hDLE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDckMsQ0FBQztBQUVELGdCQUFnQjtBQUNULFNBQVMsY0FBYyxDQUFDLEtBQWE7SUFDeEMsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDMUMsT0FBTyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQVFELGdCQUFnQjtBQUNULFNBQVMsZ0NBQWdDLENBQUMsS0FBYTtJQUMxRCxLQUFLLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBRTFCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDNUIsSUFBSSxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ2QsT0FBTyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsdUJBQXVCLEVBQUUsRUFBRSxFQUFFO0tBQzFEO1NBQU07UUFDSCxJQUFJLHNCQUFzQixHQUFHLE1BQU0sQ0FBQztRQUNwQyxJQUFJLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDNUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM3QixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDaEIsSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFO29CQUNkLHNCQUFzQixHQUFHLENBQUMsQ0FBQztvQkFDM0IsTUFBTTtpQkFDVDtxQkFBTTtvQkFDSCxJQUFJLGVBQWUsRUFBRTt3QkFDakIsc0JBQXNCLEdBQUcsQ0FBQyxDQUFDO3dCQUMzQixNQUFNO3FCQUNUO3lCQUFNO3dCQUNILGVBQWUsR0FBRyxJQUFJLENBQUM7cUJBQzFCO2lCQUNKO2FBQ0o7U0FDSjtRQUNELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLENBQUM7UUFDOUQsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLHNCQUFzQixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFekUsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztLQUNsRjtBQUNMLENBQUM7QUFFRCxnQkFBZ0I7QUFDVCxTQUFTLE9BQU8sQ0FBQyxJQUFZO0lBQ2hDLE9BQU8sSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDO0FBQ3RDLENBQUM7QUFFRCxnQkFBZ0I7QUFDVCxTQUFTLGVBQWUsQ0FBQyxPQUFvQjtJQUNoRCxPQUFPLE9BQU8sQ0FBQyxXQUFXLENBQUM7QUFDL0IsQ0FBQztBQUVELGdCQUFnQjtBQUNULFNBQVMsZUFBZSxDQUFDLE9BQW9CLEVBQUUsS0FBYTtJQUMvRCxNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN6RCxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxhQUFhLENBQUM7QUFDeEMsQ0FBQztBQUVELGdCQUFnQjtBQUNULFNBQVMsZ0JBQWdCLENBQUMsT0FBb0I7SUFDakQsT0FBTyxPQUFPLENBQUMsWUFBWSxDQUFDO0FBQ2hDLENBQUM7QUFFRCxnQkFBZ0I7QUFDVCxTQUFTLGdCQUFnQixDQUFDLE9BQW9CLEVBQUUsTUFBYztJQUNqRSxNQUFNLGNBQWMsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUMzRCxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxjQUFjLENBQUM7QUFDMUMsQ0FBQztBQUVELGdCQUFnQjtBQUNULFNBQVMsd0JBQXdCLENBQUMsT0FBb0I7SUFDekQsT0FBTztRQUNILEtBQUssRUFBRSxPQUFPLENBQUMsV0FBVztRQUMxQixNQUFNLEVBQUUsT0FBTyxDQUFDLFlBQVk7S0FDL0IsQ0FBQztBQUNOLENBQUM7QUFFRCxnQkFBZ0I7QUFDVCxTQUFTLDhCQUE4QixDQUFDLE9BQW9CO0lBQy9ELE9BQU87UUFDSCxLQUFLLEVBQUUsT0FBTyxDQUFDLFdBQVc7UUFDMUIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxZQUFZO0tBQy9CLENBQUM7QUFDTixDQUFDO0FBRUQsZ0JBQWdCO0FBQ1QsU0FBUyxzQkFBc0IsQ0FBQyxNQUFrQztJQUNyRSxJQUFJLFlBQVksR0FBNkIsTUFBTyxDQUFDLGVBQWUsQ0FBQztJQUNyRSxJQUFJLFlBQVksR0FBNkIsTUFBTyxDQUFDLGVBQWUsQ0FBQztJQUNyRSxJQUFJLE9BQWUsRUFBRSxPQUFlLENBQUM7SUFFckMsSUFBSSxZQUFZLEtBQUssU0FBUyxJQUFJLFlBQVksS0FBSyxTQUFTLEVBQUU7UUFDMUQsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQVEseUNBQXlDO1FBQ3ZHLE9BQU8sR0FBRyxNQUFNLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLENBQUUsbURBQW1EO0tBQ3BIO1NBQU07UUFDSCxPQUFPLEdBQUcsWUFBWSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDeEMsT0FBTyxHQUFHLFlBQVksR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO0tBQzNDO0lBRUQsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUU7QUFDeEUsQ0FBQztBQUVELGdCQUFnQjtBQUNULFNBQVMsNEJBQTRCLENBQUMsTUFBa0M7SUFDM0UsSUFBSSxZQUFZLEdBQTZCLE1BQU8sQ0FBQyxlQUFlLENBQUM7SUFDckUsSUFBSSxZQUFZLEdBQTZCLE1BQU8sQ0FBQyxlQUFlLENBQUM7SUFFckUsSUFBSSxZQUFZLEtBQUssU0FBUyxJQUFJLFlBQVksS0FBSyxTQUFTLEVBQUU7UUFDMUQsTUFBTSxNQUFNLEdBQUcsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUM3QyxZQUFZLEdBQUcsTUFBTSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0tBQ2pEO0lBRUQsT0FBTyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRSxDQUFDO0FBQ3JELENBQUM7QUFHRCxnQkFBZ0I7QUFDVCxTQUFTLDJCQUEyQixDQUFDLE9BQW9CLEVBQUUsT0FBZ0I7SUFDOUUsSUFBSSxPQUFPLEVBQUU7UUFDVCxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7S0FDOUI7U0FBTTtRQUNILE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztLQUNsQztBQUNMLENBQUM7QUFFRCxnQkFBZ0I7QUFDVCxTQUFTLDZCQUE2QixDQUFDLE9BQW9CO0lBQzlELE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUFDO0lBQ3BDLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLEtBQUssZ0JBQWdCLEVBQUU7UUFDN0MsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsZ0JBQWdCLENBQUM7S0FDN0M7QUFDTCxDQUFDO0FBRUQ7OztFQUdFO0FBQ0ssU0FBUyxNQUFNLENBQUMsTUFBK0IsRUFBRSxHQUE0QjtJQUNoRixLQUFLLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBRTtRQUNuQixJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDekIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUMxQjtLQUNKO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQUVEOzs7RUFHRTtBQUNLLFNBQVMsVUFBVSxDQUFDLE1BQStCLEVBQUUsR0FBd0M7SUFDaEcsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFO1FBQ25CLEtBQUssTUFBTSxHQUFHLElBQUksR0FBRyxFQUFFO1lBQ25CLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDekIsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN2QixNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ25DLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQ3hEO1NBQ0o7S0FDSjtJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxnQkFBZ0I7QUFDVCxTQUFTLGVBQWUsQ0FBQyxjQUF1QixFQUFFLEtBQWM7SUFDbkUsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDM0IsT0FBTyxLQUFLLENBQUM7S0FDaEI7U0FBTTtRQUNILElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN0QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQzVCLE1BQU0sV0FBVyxHQUFHLElBQUksS0FBSyxDQUFVLE1BQU0sQ0FBQyxDQUFDO1lBQy9DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzdCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekIsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7YUFDakQ7WUFDRCxPQUFPLFdBQVcsQ0FBQztTQUN0QjthQUFNO1lBQ0gsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO2dCQUNoQixPQUFPLElBQUksQ0FBQzthQUNmO2lCQUFNO2dCQUNILE1BQU0sUUFBUSxHQUFHLEtBQWdDLENBQUM7Z0JBQ2xELElBQUksY0FBYyxLQUFLLFNBQVMsRUFBRTtvQkFDOUIsT0FBTyxVQUFVLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWTtpQkFDaEQ7cUJBQU07b0JBQ0gsSUFBSSxPQUFPLGNBQWMsS0FBSyxRQUFRLEVBQUU7d0JBQ3BDLE9BQU8sVUFBVSxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVk7cUJBQ2hEO3lCQUFNO3dCQUNILElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRTs0QkFDL0IsT0FBTyxVQUFVLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWTt5QkFDaEQ7NkJBQU07NEJBQ0gsSUFBSSxjQUFjLEtBQUssSUFBSSxFQUFFO2dDQUN6QixPQUFPLFVBQVUsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZOzZCQUNoRDtpQ0FBTTtnQ0FDSCxNQUFNLGlCQUFpQixHQUFHLGNBQXlDLENBQUM7Z0NBQ3BFLE9BQU8sVUFBVSxDQUFDLGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUTs2QkFDM0Q7eUJBQ0o7cUJBQ0o7aUJBQ0o7YUFDSjtTQUNKO0tBQ0o7QUFDTCxDQUFDO0FBRUQsZ0JBQWdCO0FBQ1QsU0FBUyxlQUFlLENBQUksSUFBTyxFQUFFLEtBQVU7SUFDbEQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVsQyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtRQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMseURBQXlELENBQUMsQ0FBQztLQUM5RTtJQUVELEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFFRCxnQkFBZ0I7QUFDVCxTQUFTLFdBQVc7SUFDdkIsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQztTQUNwQyxRQUFRLENBQUMsRUFBRSxDQUFDO1NBQ1osT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBRUQsZ0JBQWdCO0FBQ1QsU0FBUyxlQUFlLENBQUMsQ0FBVTtJQUN0QyxJQUFJLENBQUMsWUFBWSxLQUFLLEVBQUU7UUFDcEIsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDO0tBQ3BCO1NBQU07UUFDSCxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRTtZQUN2QixPQUFPLENBQUMsQ0FBQztTQUNaO2FBQU07WUFDSCxPQUFPLGVBQWUsQ0FBQztTQUMxQjtLQUNKO0FBQ0wsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDclA4QztBQUMwRTtBQUVyRTtBQUNlO0FBQ2xCO0FBRWdCO0FBRWpFLGNBQWM7QUFDUCxNQUFNLGFBQWMsU0FBUSwwREFBYTtJQXlDNUMsZ0JBQWdCO0lBQ2hCLFlBQVkseUJBQWlFLEVBQ3pFLG9DQUE0RixFQUM1RiwyQkFBdUUsRUFDdkUsUUFBZTtRQUVmLEtBQUssQ0FBQyxhQUFhLENBQUMsd0NBQXdDLENBQUMseUJBQXlCLEVBQUUsb0NBQW9DLENBQUMsQ0FBQyxDQUFDO1FBaENuSSxxRUFBcUU7UUFDN0Qsa0RBQTZDLEdBQUcsS0FBSyxDQUFDLENBQUMseUNBQXlDO1FBQ3hHLHNFQUFzRTtRQUM5RCwyQkFBc0IsR0FBRyxLQUFLLENBQUMsQ0FBQyx5Q0FBeUM7UUErQjdFLElBQUksb0NBQW9DLEtBQUssU0FBUyxFQUFFO1lBQ3BELElBQUksT0FBTyxvQ0FBb0MsS0FBSyxVQUFVLEVBQUU7Z0JBQzVELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxvQ0FBb0MsQ0FBQztnQkFDL0QsSUFBSSxDQUFDLDZDQUE2QyxHQUFHLElBQUksQ0FBQztnQkFFMUQsSUFBSSwyQkFBMkIsS0FBSyxTQUFTLEVBQUU7b0JBQzNDLElBQUksQ0FBQyxvQkFBb0IsR0FBRywyQkFBMkIsQ0FBQztpQkFDM0Q7YUFDSjtTQUNKO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyw2Q0FBNkMsRUFBRTtZQUNyRCx5QkFBeUI7WUFFekIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNsQiw2Q0FBNkM7Z0JBQzdDLHdHQUF3RztnQkFDeEcsa0dBQWtHO2dCQUNsRywrQ0FBK0M7Z0JBQy9DLElBQUksSUFBSSxDQUFDLG1DQUFtQyxLQUFLLFNBQVMsRUFBRTtvQkFDeEQsTUFBTSxJQUFJLDRFQUF3QixDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUNsRDtxQkFBTTtvQkFDSCxNQUFNLG9CQUFvQixHQUFHLHdEQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO29CQUM1RixnQ0FBZ0M7b0JBQ2hDLElBQUksQ0FBQyxZQUFZLG1DQUNWLG9CQUFvQixLQUN2QixJQUFJLEVBQUUsU0FBUyxHQUNsQjtpQkFDSjthQUNKO1NBQ0o7UUFFRCxJQUFJLFFBQVEsS0FBSyxJQUFJLEVBQUU7WUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtnQkFDN0IsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO2FBQ2Y7U0FDSjtJQUNMLENBQUM7SUFFUSxPQUFPO1FBQ1osSUFBSSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQztRQUNwQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsU0FBUyxDQUFDO1FBRXRDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBR0Q7Ozs7Ozs7Ozs7T0FVRztJQUNNLElBQUk7UUFFVDs7V0FFRztRQUNILElBQUksQ0FBQyxJQUFJLENBQUMsNkNBQTZDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxLQUFLLFNBQVMsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFO1lBQ3RILFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNwRixPQUFPO1NBQ1Y7UUFFRDs7OztXQUlHO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyw2Q0FBNkMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtZQUNsSCxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUM7WUFDbkMsT0FBTztTQUNWO1FBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLElBQUksRUFBRTtZQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLDZDQUE2QyxFQUFFO2dCQUNyRCxJQUFJLENBQUMsb0NBQW9DLEVBQUUsQ0FBQzthQUMvQztZQUVELDRGQUE0RjtZQUM1RixNQUFNLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztTQUM5QjtRQUVELEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsb0NBQW9DO1FBQ2hDLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFFbEMsTUFBTSxlQUFlLEdBQUcsSUFBSSxLQUFLLENBQXNCLENBQUMsQ0FBQyxDQUFDO1FBQzFELGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDNUQsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3RCxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNELGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFM0QsS0FBSyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDL0QsTUFBTSxjQUFjLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELEtBQUssSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLE9BQU8sR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxFQUFFO2dCQUM5RCxNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3JDLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDakM7U0FDSjtRQUVELE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDbEMsV0FBVyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDM0IsV0FBVyxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1FBQ3pDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBRWxDOzs7VUFHRTtRQUNGLDZEQUE2RDtRQUM3RCxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztJQUN6QyxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0gsMEJBQTBCO1FBQ3RCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFO1lBQ3pDLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO2FBQU07WUFDSCxNQUFNLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekQsa0JBQWtCLENBQUMsU0FBUyxDQUFDLEdBQUcsd0JBQThCLENBQUM7WUFDL0Qsa0JBQWtCLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6RSxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xELFdBQVcsQ0FBQyxTQUFTLENBQUMsR0FBRyxzQkFBNkIsQ0FBQztZQUN2RCxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hELFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxrQkFBMkIsQ0FBQztZQUNuRCxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDNUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDdkUsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUM5QyxPQUFPLElBQUksQ0FBQztTQUNmO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNQLGFBQWEsQ0FBQyxTQUE2QixFQUFFLFVBQXVDO1FBQ3pGLElBQUksSUFBSSxDQUFDLGtCQUFrQixLQUFLLFNBQVMsRUFBRTtZQUN2QyxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDekUsT0FBTyxpQkFBaUIsQ0FBQztTQUM1QjthQUFNO1lBQ0gsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEtBQUssU0FBUyxFQUFFO2dCQUN0QyxPQUFPO29CQUNILE9BQU8sRUFBRSxLQUFLO29CQUNkLFNBQVMsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQztpQkFDM0Q7YUFDSjtpQkFBTTtnQkFDSCxpR0FBaUc7Z0JBQ2pHLHdHQUF3RztnQkFDeEcsTUFBTSxJQUFJLEdBQUcsNERBQVcsMkVBQWdGLENBQUM7Z0JBQ3pHLE1BQU0sT0FBTyxHQUFHLEdBQUcsSUFBSSxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUU7Z0JBQ3hELE1BQU0sSUFBSSw2REFBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ2hDO1NBQ0o7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1AsZUFBZSxDQUFDLFNBQTZCLEVBQUUsT0FBZ0IsRUFBRSxTQUFtRDtRQUN6SCxJQUFJLElBQUksQ0FBQyxvQkFBb0IsS0FBSyxTQUFTLEVBQUU7WUFDekMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ3hDO2FBQU07WUFDSCxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxxQkFBcUIsS0FBSyxTQUFTLEVBQUU7Z0JBQ3RELElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRTtvQkFDekIsTUFBTSxJQUFJLDRFQUF3QixDQUFDLGVBQWUsQ0FBQyxDQUFDO2lCQUN2RDtxQkFBTTtvQkFDSCxJQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2lCQUNwRDthQUNKO1NBQ0o7SUFDTCxDQUFDO0NBQ0o7QUFFRCxjQUFjO0FBQ2QsV0FBaUIsYUFBYTtJQXFCMUI7OztPQUdHO0lBQ0gsSUFBSSxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFFN0IsZ0JBQWdCO0lBQ2hCLFNBQWdCLHdDQUF3QyxDQUFDLHlCQUFpRSxFQUN0SCxvQ0FBNkY7UUFHN0YsTUFBTSxlQUFlLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2hILGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUN4QixNQUFNLFdBQVcsR0FBRyxlQUFlLEtBQUssSUFBSSxDQUFDO1FBRTdDLElBQUksZ0JBQXlDLENBQUM7UUFDOUMsSUFBSSxNQUFnQyxDQUFDO1FBQ3JDLElBQUksZUFBZSxLQUFLLElBQUksRUFBRTtZQUMxQixNQUFNLGVBQWUsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQzlELElBQUksZUFBZSxLQUFLLElBQUksRUFBRTtnQkFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO2FBQzVDO1lBQ0QsWUFBWSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUN6QyxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUErQixDQUFDO1lBQ3ZGLE1BQU0sY0FBYyxHQUFHLHlFQUFvQixDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBQ2pGLE1BQU0sR0FBRyx3REFBWSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUM7WUFFbEQsSUFBSSx5QkFBeUIsWUFBWSxXQUFXLEVBQUU7Z0JBQ2xELGdCQUFnQixHQUFHLHlCQUF5QixDQUFDO2FBQ2hEO1NBQ0o7YUFBTTtZQUNILElBQUkseUJBQXlCLEtBQUssU0FBUyxFQUFFO2dCQUN6QyxNQUFNLEdBQUcsU0FBUyxDQUFDO2FBQ3RCO2lCQUFNO2dCQUNILElBQUkseUJBQXlCLFlBQVksV0FBVyxFQUFFO29CQUNsRCxNQUFNLEdBQUcsU0FBUyxDQUFDO29CQUNuQixnQkFBZ0IsR0FBRyx5QkFBeUIsQ0FBQztpQkFDaEQ7cUJBQU07b0JBQ0gsMEJBQTBCO29CQUMxQixNQUFNLEdBQUcseUJBQXlCLENBQUM7aUJBQ3RDO2FBQ0o7WUFFRCxJQUFJLGdCQUFnQixLQUFLLFNBQVMsRUFBRTtnQkFDaEMsSUFBSSxvQ0FBb0MsWUFBWSxXQUFXLEVBQUU7b0JBQzdELGdCQUFnQixHQUFHLG9DQUFvQyxDQUFDO2lCQUMzRDthQUNKO1NBQ0o7UUFFRCxPQUFPO1lBQ0gsa0NBQWtDLEVBQUUsTUFBTTtZQUMxQyxXQUFXO1lBQ1gsZ0JBQWdCO1NBQ25CLENBQUM7SUFDTixDQUFDO0lBaERlLHNEQUF3QywyQ0FnRHZEO0FBQ0wsQ0FBQyxFQTdFZ0IsYUFBYSxLQUFiLGFBQWEsUUE2RTdCOzs7Ozs7O1VDdlVEO1VBQ0E7O1VBRUE7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7O1VBRUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7Ozs7O1dDdEJBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EseUNBQXlDLHdDQUF3QztXQUNqRjtXQUNBO1dBQ0E7Ozs7O1dDUEE7Ozs7O1dDQUE7V0FDQTtXQUNBO1dBQ0EsdURBQXVELGlCQUFpQjtXQUN4RTtXQUNBLGdEQUFnRCxhQUFhO1dBQzdEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ05tQztBQUNTO0FBQzRCO0FBQ1g7QUFDTjtBQUNUO0FBQ047QUFDRztBQUNPO0FBQ1E7QUFDSjtBQUNDO0FBQ2Q7QUFDVztBQUNJO0FBQ1I7QUFDUjtBQUNvQjtBQUMzQjtBQUNtQiIsInNvdXJjZXMiOlsid2VicGFjazovLy93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2NvbmZpZy9jb25maWcudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2NvbmZpZy9yZXNvbHZlZC1jb25maWcudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2NvbnRhaW5lci9jb21wb25lbnQtY29udGFpbmVyLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9jb250cm9scy9icm93c2VyLXBvcG91dC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29udHJvbHMvZHJhZy1hY3Rpb24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2NvbnRyb2xzL2RyYWctcHJveHkudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2NvbnRyb2xzL2RyYWctc291cmNlLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9jb250cm9scy9kcm9wLXRhcmdldC1pbmRpY2F0b3IudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2NvbnRyb2xzL2hlYWRlci1idXR0b24udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2NvbnRyb2xzL2hlYWRlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29udHJvbHMvc3BsaXR0ZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2NvbnRyb2xzL3RhYi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29udHJvbHMvdGFicy1jb250YWluZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2NvbnRyb2xzL3RyYW5zaXRpb24taW5kaWNhdG9yLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9lcnJvcnMvZXh0ZXJuYWwtZXJyb3IudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2Vycm9ycy9pbnRlcm5hbC1lcnJvci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvZ29sZGVuLWxheW91dC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvaXRlbXMvY29tcG9uZW50LWl0ZW0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2l0ZW1zL2NvbXBvbmVudC1wYXJlbnRhYmxlLWl0ZW0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2l0ZW1zL2NvbnRlbnQtaXRlbS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvaXRlbXMvZ3JvdW5kLWl0ZW0udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2l0ZW1zL3Jvdy1vci1jb2x1bW4udHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2l0ZW1zL3N0YWNrLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9sYXlvdXQtbWFuYWdlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvdXRpbHMvY29uZmlnLW1pbmlmaWVyLnRzIiwid2VicGFjazovLy8uL3NyYy90cy91dGlscy9kcmFnLWxpc3RlbmVyLnRzIiwid2VicGFjazovLy8uL3NyYy90cy91dGlscy9ldmVudC1lbWl0dGVyLnRzIiwid2VicGFjazovLy8uL3NyYy90cy91dGlscy9ldmVudC1odWIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL3V0aWxzL2kxOG4tc3RyaW5ncy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvdXRpbHMvc3R5bGUtY29uc3RhbnRzLnRzIiwid2VicGFjazovLy8uL3NyYy90cy91dGlscy90eXBlcy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvdXRpbHMvdXRpbHMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL3ZpcnR1YWwtbGF5b3V0LnRzIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly8vd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovLy93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovLy93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovLy8uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJnb2xkZW5MYXlvdXRcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiZ29sZGVuTGF5b3V0XCJdID0gZmFjdG9yeSgpO1xufSkoZ2xvYmFsVGhpcywgKCkgPT4ge1xucmV0dXJuICIsImltcG9ydCB7IENvbmZpZ3VyYXRpb25FcnJvciB9IGZyb20gJy4uL2Vycm9ycy9leHRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IEFzc2VydEVycm9yLCBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IsIFVucmVhY2hhYmxlQ2FzZUVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgSTE4blN0cmluZ0lkLCBpMThuU3RyaW5ncyB9IGZyb20gJy4uL3V0aWxzL2kxOG4tc3RyaW5ncyc7XHJcbmltcG9ydCB7IEl0ZW1UeXBlLCBKc29uVmFsdWUsIFJlc3BvbnNpdmVNb2RlLCBTaWRlLCBTaXplVW5pdEVudW0gfSBmcm9tICcuLi91dGlscy90eXBlcyc7XHJcbmltcG9ydCB7IGRlZXBFeHRlbmRWYWx1ZSwgc3BsaXRTdHJpbmdBdEZpcnN0Tm9uTnVtZXJpY0NoYXIgfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcbmltcG9ydCB7XHJcbiAgICBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcsXHJcbiAgICBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZyxcclxuICAgIFJlc29sdmVkSXRlbUNvbmZpZyxcclxuICAgIFJlc29sdmVkTGF5b3V0Q29uZmlnLFxyXG4gICAgUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcsXHJcbiAgICBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnLFxyXG4gICAgUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcsXHJcbiAgICBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZ1xyXG59IGZyb20gXCIuL3Jlc29sdmVkLWNvbmZpZ1wiO1xyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBJdGVtQ29uZmlnIHtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGl0ZW0uIFBvc3NpYmxlIHZhbHVlcyBhcmUgJ3JvdycsICdjb2x1bW4nLCAnc3RhY2snLCAnY29tcG9uZW50Jy5cclxuICAgICAqL1xyXG4gICAgdHlwZTogSXRlbVR5cGU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbiBhcnJheSBvZiBjb25maWd1cmF0aW9ucyBmb3IgaXRlbXMgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgYXMgY2hpbGRyZW4gb2YgdGhpcyBpdGVtLlxyXG4gICAgICovXHJcbiAgICBjb250ZW50PzogSXRlbUNvbmZpZ1tdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHdpZHRoIG9mIHRoaXMgaXRlbSwgcmVsYXRpdmUgdG8gdGhlIG90aGVyIGNoaWxkcmVuIG9mIGl0cyBwYXJlbnQgaW4gcGVyY2VudFxyXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoSXRlbUNvbmZpZzppbnRlcmZhY2UpLnNpemV9IGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgd2lkdGg/OiBudW1iZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWluaW11bSB3aWR0aCBvZiB0aGlzIGl0ZW0gaW4gcGl4ZWxzXHJcbiAgICAgKiBDQVVUSU9OIC0gTm90IHRlc3RlZCAtIGRvIG5vdCB1c2VcclxuICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKEl0ZW1Db25maWc6aW50ZXJmYWNlKS5taW5TaXplfSBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIG1pbldpZHRoPzogbnVtYmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGhlaWdodCBvZiB0aGlzIGl0ZW0sIHJlbGF0aXZlIHRvIHRoZSBvdGhlciBjaGlsZHJlbiBvZiBpdHMgcGFyZW50IGluIHBlcmNlbnRcclxuICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKEl0ZW1Db25maWc6aW50ZXJmYWNlKS5zaXplfSBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIGhlaWdodD86IG51bWJlcjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtaW5pbXVtIGhlaWdodCBvZiB0aGlzIGl0ZW0gaW4gcGl4ZWxzXHJcbiAgICAgKiBDQVVUSU9OIC0gTm90IHRlc3RlZCAtIGRvIG5vdCB1c2VcclxuICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKEl0ZW1Db25maWc6aW50ZXJmYWNlKS5taW5TaXplfSBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIG1pbkhlaWdodD86IG51bWJlcjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzaXplIG9mIHRoaXMgaXRlbS5cclxuICAgICAqIEZvciByb3dzLCBpdCBzcGVjaWZpZXMgaGVpZ2h0LiBGb3IgY29sdW1ucywgaXQgc3BlY2lmaWVzIHdpZHRoLlxyXG4gICAgICogSGFzIGZvcm1hdCBcXDxudW1iZXJcXD5cXDx7QGxpbmsgU2l6ZVVuaXR9XFw+LiBDdXJyZW50bHkgb25seSBzdXBwb3J0cyB1bml0cyBgZnJgIGFuZCBgJWAuXHJcbiAgICAgKlxyXG4gICAgICogU3BhY2UgaXMgZmlyc3QgcHJvcG9ydGlvbmFsbHkgYWxsb2NhdGVkIHRvIGl0ZW1zIHdpdGggc2l6ZVVuaXQgYCVgLlxyXG4gICAgICogSWYgdGhlcmUgaXMgYW55IHNwYWNlIGxlZnQgb3ZlciAobGVzcyB0aGFuIDEwMCUgYWxsb2NhdGVkKSwgdGhlbiB0aGVcclxuICAgICAqIHJlbWFpbmRlciBpcyBhbGxvY2F0ZWQgdG8gdGhlIGl0ZW1zIHdpdGggdW5pdCBgZnJgIGFjY29yZGluZyB0byB0aGUgZnJhY3Rpb25hbCBzaXplLlxyXG4gICAgICogSWYgbW9yZSB0aGFuIDEwMCUgaXMgYWxsb2NhdGVkLCB0aGVuIGFuIGV4dHJhIDUwJSBpcyBhbGxvY2F0ZWQgdG8gaXRlbXMgd2l0aCB1bml0IGBmcmAgYW5kXHJcbiAgICAgKiBpcyBhbGxvY2F0ZWQgdG8gZWFjaCBpdGVtIGFjY29yZGluZyB0byBpdHMgZnJhY3Rpb25hbCBzaXplLiBBbGwgaXRlbSBzaXplcyBhcmUgdGhlbiBhZGp1c3RlZFxyXG4gICAgICogdG8gYnJpbmcgdGhlIHRvdGFsIGJhY2sgdG8gMTAwJVxyXG4gICAgICovXHJcbiAgICBzaXplPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHNpemUgb2YgdGhpcyBpdGVtLlxyXG4gICAgICogRm9yIHJvd3MsIGl0IHNwZWNpZmllcyBoZWlnaHQuIEZvciBjb2x1bW5zLCBpdCBzcGVjaWZpZXMgd2lkdGguXHJcbiAgICAgKiBIYXMgZm9ybWF0IDxudW1iZXI+PHNpemVVbml0Pi4gQ3VycmVudGx5IG9ubHkgc3VwcG9ydHMgdW5pdHMgYHB4YFxyXG4gICAgICovXHJcbiAgICBtaW5TaXplPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSBhIENvbnRlbnRJdGVtLlxyXG4gICAgICogRG8gTk9UIGFzc2lnbiBhbiBhcnJheS4gIFRoaXMgb25seSBleGlzdHMgZm9yIGxlZ2FjeSBwdXJwb3Nlcy4gIElmIGFuIGFycmF5IGlzIGFzc2lnbmVkLCB0aGUgZmlyc3QgZWxlbWVudFxyXG4gICAgICogd2lsbCBiZWNvbWUgdGhlIGlkLlxyXG4gICAgICovXHJcbiAgICBpZD86IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIERldGVybWluZXMgaWYgdGhlIGl0ZW0gaXMgY2xvc2FibGUuIElmIGZhbHNlLCB0aGUgeCBvbiB0aGUgaXRlbXMgdGFiIHdpbGwgYmUgaGlkZGVuIGFuZCBjb250YWluZXIuY2xvc2UoKVxyXG4gICAgICogd2lsbCByZXR1cm4gZmFsc2VcclxuICAgICAqIERlZmF1bHQ6IHRydWVcclxuICAgICAqL1xyXG4gICAgaXNDbG9zYWJsZT86IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdGl0bGUgb2YgdGhlIGl0ZW0gYXMgZGlzcGxheWVkIG9uIGl0cyB0YWIgYW5kIG9uIHBvcG91dCB3aW5kb3dzXHJcbiAgICAgKiBEZWZhdWx0OiBjb21wb25lbnRUeXBlLnRvU3RyaW5nKCkgb3IgJydcclxuICAgICAqIEBkZXByZWNhdGVkIG9ubHkgQ29tcG9uZW50IGhhcyBhIHRpdGxlXHJcbiAgICAgKi9cclxuICAgIHRpdGxlPzogc3RyaW5nO1xyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIEl0ZW1Db25maWcge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGNvbnN0IGVudW0gU2l6ZVdpZHRoSGVpZ2h0U3BlY2lmaWNhdGlvblR5cGUge1xyXG4gICAgICAgIE5vbmUsXHJcbiAgICAgICAgU2l6ZSxcclxuICAgICAgICBXaWR0aE9ySGVpZ2h0LFxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKGl0ZW1Db25maWc6IEl0ZW1Db25maWcsIHJvd0FuZENvbHVtbkNoaWxkTGVnYWN5U2l6ZURlZmF1bHQ6IGJvb2xlYW4pOiBSZXNvbHZlZEl0ZW1Db25maWcge1xyXG4gICAgICAgIHN3aXRjaCAoaXRlbUNvbmZpZy50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuZ3JvdW5kOlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcignSXRlbUNvbmZpZyBjYW5ub3Qgc3BlY2lmeSB0eXBlIGdyb3VuZCcsIEpTT04uc3RyaW5naWZ5KGl0ZW1Db25maWcpKTtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5yb3c6XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29sdW1uOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJvd09yQ29sdW1uSXRlbUNvbmZpZy5yZXNvbHZlKGl0ZW1Db25maWcgYXMgUm93T3JDb2x1bW5JdGVtQ29uZmlnLCByb3dBbmRDb2x1bW5DaGlsZExlZ2FjeVNpemVEZWZhdWx0KTtcclxuXHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuc3RhY2s6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RhY2tJdGVtQ29uZmlnLnJlc29sdmUoaXRlbUNvbmZpZyBhcyBTdGFja0l0ZW1Db25maWcsIHJvd0FuZENvbHVtbkNoaWxkTGVnYWN5U2l6ZURlZmF1bHQpO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb21wb25lbnQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gQ29tcG9uZW50SXRlbUNvbmZpZy5yZXNvbHZlKGl0ZW1Db25maWcgYXMgQ29tcG9uZW50SXRlbUNvbmZpZywgcm93QW5kQ29sdW1uQ2hpbGRMZWdhY3lTaXplRGVmYXVsdCk7XHJcblxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVucmVhY2hhYmxlQ2FzZUVycm9yKCdVQ1VJQ1I1NTQ5OScsIGl0ZW1Db25maWcudHlwZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQ29udGVudChjb250ZW50OiBJdGVtQ29uZmlnW10gfCB1bmRlZmluZWQpOiBSZXNvbHZlZEl0ZW1Db25maWdbXSB7XHJcbiAgICAgICAgaWYgKGNvbnRlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgY291bnQgPSBjb250ZW50Lmxlbmd0aDtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PFJlc29sdmVkSXRlbUNvbmZpZz4oY291bnQpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IEl0ZW1Db25maWcucmVzb2x2ZShjb250ZW50W2ldLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVJZChpZDogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQpOiBzdHJpbmcge1xyXG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuaWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaWQpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaWQubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5pZDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlkWzBdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGlkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU2l6ZShcclxuICAgICAgICBzaXplOiBzdHJpbmcgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgd2lkdGg6IG51bWJlciB8IHVuZGVmaW5lZCxcclxuICAgICAgICBoZWlnaHQ6IG51bWJlciB8IHVuZGVmaW5lZCxcclxuICAgICAgICByb3dBbmRDb2x1bW5DaGlsZExlZ2FjeVNpemVEZWZhdWx0OiBib29sZWFuKTpcclxuICAgIFNpemVXaXRoVW5pdCB7XHJcbiAgICAgICAgLy8gUmVtb3ZlIHN1cHBvcnQgZm9yIHJvd0FuZENvbHVtbkNoaWxkTGVnYWN5U2l6ZURlZmF1bHQgaW4gYSBtYWpvciB2ZXJzaW9uIHJlbGVhc2VcclxuXHJcbiAgICAgICAgaWYgKHNpemUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gcGFyc2VTaXplKHNpemUsIFtTaXplVW5pdEVudW0uUGVyY2VudCwgU2l6ZVVuaXRFbnVtLkZyYWN0aW9uYWxdKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAod2lkdGggIT09IHVuZGVmaW5lZCB8fCBoZWlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHdpZHRoICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzaXplOiB3aWR0aCwgc2l6ZVVuaXQ6IFNpemVVbml0RW51bS5QZXJjZW50IH07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChoZWlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzaXplOiBoZWlnaHQsIHNpemVVbml0OiBTaXplVW5pdEVudW0uUGVyY2VudCB9O1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0NSUzMzMzkwJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJvd0FuZENvbHVtbkNoaWxkTGVnYWN5U2l6ZURlZmF1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzaXplOiA1MCwgc2l6ZVVuaXQ6IFNpemVVbml0RW51bS5QZXJjZW50IH07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHNpemU6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5zaXplLCBzaXplVW5pdDogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLnNpemVVbml0IH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVNaW5TaXplKG1pblNpemU6IHN0cmluZyB8IHVuZGVmaW5lZCwgbWluV2lkdGg6IG51bWJlciB8IHVuZGVmaW5lZCwgbWluSGVpZ2h0OiBudW1iZXIgfCB1bmRlZmluZWQpOiBVbmRlZmluYWJsZVNpemVXaXRoVW5pdCB7XHJcbiAgICAgICAgaWYgKG1pblNpemUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gcGFyc2VTaXplKG1pblNpemUsIFtTaXplVW5pdEVudW0uUGl4ZWxdKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBtaW5XaWR0aERlZmluZWQgPSBtaW5XaWR0aCAhPT0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBjb25zdCBtaW5IZWlnaHREZWZpbmVkID0gbWluSGVpZ2h0ICE9PSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGlmIChtaW5XaWR0aERlZmluZWQgfHwgbWluSGVpZ2h0RGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG1pbldpZHRoRGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHNpemU6IG1pbldpZHRoLCBzaXplVW5pdDogU2l6ZVVuaXRFbnVtLlBpeGVsIH07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHNpemU6IG1pbkhlaWdodCwgc2l6ZVVuaXQ6IFNpemVVbml0RW51bS5QaXhlbCB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc2l6ZTogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLm1pblNpemUsIHNpemVVbml0OiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMubWluU2l6ZVVuaXQgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlU2l6ZVdpZHRoSGVpZ2h0U3BlY2lmaWNhdGlvblR5cGUoY29uZmlnOiBJdGVtQ29uZmlnKTogU2l6ZVdpZHRoSGVpZ2h0U3BlY2lmaWNhdGlvblR5cGUge1xyXG4gICAgICAgIGlmIChjb25maWcuc2l6ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBTaXplV2lkdGhIZWlnaHRTcGVjaWZpY2F0aW9uVHlwZS5TaXplO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChjb25maWcud2lkdGggIT09IHVuZGVmaW5lZCB8fCBjb25maWcuaGVpZ2h0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBTaXplV2lkdGhIZWlnaHRTcGVjaWZpY2F0aW9uVHlwZS5XaWR0aE9ySGVpZ2h0O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFNpemVXaWR0aEhlaWdodFNwZWNpZmljYXRpb25UeXBlLk5vbmU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzR3JvdW5kKGNvbmZpZzogSXRlbUNvbmZpZyk6IGNvbmZpZyBpcyBJdGVtQ29uZmlnIHtcclxuICAgICAgICByZXR1cm4gY29uZmlnLnR5cGUgPT09IEl0ZW1UeXBlLmdyb3VuZDtcclxuICAgIH1cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc1Jvdyhjb25maWc6IEl0ZW1Db25maWcpOiBjb25maWcgaXMgSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIGNvbmZpZy50eXBlID09PSBJdGVtVHlwZS5yb3c7XHJcbiAgICB9XHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNDb2x1bW4oY29uZmlnOiBJdGVtQ29uZmlnKTogY29uZmlnIGlzIEl0ZW1Db25maWcge1xyXG4gICAgICAgIHJldHVybiBjb25maWcudHlwZSA9PT0gSXRlbVR5cGUuY29sdW1uO1xyXG4gICAgfVxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzU3RhY2soY29uZmlnOiBJdGVtQ29uZmlnKTogY29uZmlnIGlzIEl0ZW1Db25maWcge1xyXG4gICAgICAgIHJldHVybiBjb25maWcudHlwZSA9PT0gSXRlbVR5cGUuc3RhY2s7XHJcbiAgICB9XHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNDb21wb25lbnQoY29uZmlnOiBJdGVtQ29uZmlnKTogY29uZmlnIGlzIENvbXBvbmVudEl0ZW1Db25maWcge1xyXG4gICAgICAgIHJldHVybiBjb25maWcudHlwZSA9PT0gSXRlbVR5cGUuY29tcG9uZW50O1xyXG4gICAgfVxyXG59XHJcblxyXG4vLyBTdGFjayBvciBDb21wb25lbnRcclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBIZWFkZXJlZEl0ZW1Db25maWcgZXh0ZW5kcyBJdGVtQ29uZmlnIHtcclxuICAgIC8qKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChIZWFkZXJlZEl0ZW1Db25maWc6bmFtZXNwYWNlKS4oSGVhZGVyOmludGVyZmFjZSkuc2hvd30gaW5zdGVhZCAqL1xyXG4gICAgaGFzSGVhZGVycz86IGJvb2xlYW47XHJcbiAgICBoZWFkZXI/OiBIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyO1xyXG4gICAgbWF4aW1pc2VkPzogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBIZWFkZXJlZEl0ZW1Db25maWcge1xyXG4gICAgY29uc3QgbGVnYWN5TWF4aW1pc2VkSWQgPSAnX19nbE1heGltaXNlZCc7XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBIZWFkZXIge1xyXG4gICAgICAgIHNob3c/OiBmYWxzZSB8IFNpZGU7XHJcbiAgICAgICAgcG9wb3V0PzogZmFsc2UgfCBzdHJpbmc7XHJcbiAgICAgICAgZG9jaz86IGZhbHNlIHwgc3RyaW5nO1xyXG4gICAgICAgIG1heGltaXNlPzogZmFsc2UgfCBzdHJpbmc7XHJcbiAgICAgICAgY2xvc2U/OiBmYWxzZSB8IHN0cmluZztcclxuICAgICAgICBtaW5pbWlzZT86IHN0cmluZztcclxuICAgICAgICB0YWJEcm9wZG93bj86IGZhbHNlIHwgc3RyaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBuYW1lc3BhY2UgSGVhZGVyIHtcclxuICAgICAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZShoZWFkZXI6IEhlYWRlciB8IHVuZGVmaW5lZCwgaGFzSGVhZGVyczogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlciB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgICAgIGlmIChoZWFkZXIgPT09IHVuZGVmaW5lZCAmJiBoYXNIZWFkZXJzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlciA9IHtcclxuICAgICAgICAgICAgICAgICAgICBzaG93OiBoZWFkZXI/LnNob3cgPz8gKGhhc0hlYWRlcnMgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGhhc0hlYWRlcnMgPyBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIuZGVmYXVsdHMuc2hvdyA6IGZhbHNlKSxcclxuICAgICAgICAgICAgICAgICAgICBwb3BvdXQ6IGhlYWRlcj8ucG9wb3V0LFxyXG4gICAgICAgICAgICAgICAgICAgIG1heGltaXNlOiBoZWFkZXI/Lm1heGltaXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGNsb3NlOiBoZWFkZXI/LmNsb3NlLFxyXG4gICAgICAgICAgICAgICAgICAgIG1pbmltaXNlOiBoZWFkZXI/Lm1pbmltaXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRhYkRyb3Bkb3duOiBoZWFkZXI/LnRhYkRyb3Bkb3duLFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUlkQW5kTWF4aW1pc2VkKGNvbmZpZzogSGVhZGVyZWRJdGVtQ29uZmlnKTogeyBpZDogc3RyaW5nLCBtYXhpbWlzZWQ6IGJvb2xlYW59IHtcclxuICAgICAgICBsZXQgaWQ6IHN0cmluZztcclxuICAgICAgICAvLyBUbyBzdXBwb3J0IGxlZ2FjeSBjb25maWdzIHdpdGggSWQgc2F2ZWQgYXMgYW4gYXJyYXkgb2Ygc3RyaW5nLCBhc3NpZ24gY29uZmlnLmlkIHRvIGEgdHlwZSB3aGljaCBpbmNsdWRlcyBzdHJpbmcgYXJyYXlcclxuICAgICAgICBsZXQgbGVnYWN5SWQ6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkID0gY29uZmlnLmlkO1xyXG4gICAgICAgIGxldCBsZWdhY3lNYXhpbWlzZWQgPSBmYWxzZTtcclxuICAgICAgICBpZiAobGVnYWN5SWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZCA9IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5pZDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShsZWdhY3lJZCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IGxlZ2FjeUlkLmZpbmRJbmRleCgoaWQpID0+IGlkID09PSBsZWdhY3lNYXhpbWlzZWRJZClcclxuICAgICAgICAgICAgICAgIGlmIChpZHggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5TWF4aW1pc2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBsZWdhY3lJZCA9IGxlZ2FjeUlkLnNwbGljZShpZHgsIDEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGxlZ2FjeUlkLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZCA9IGxlZ2FjeUlkWzBdO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZCA9IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5pZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlkID0gbGVnYWN5SWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBtYXhpbWlzZWQ6IGJvb2xlYW47XHJcbiAgICAgICAgaWYgKGNvbmZpZy5tYXhpbWlzZWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBtYXhpbWlzZWQgPSBjb25maWcubWF4aW1pc2VkO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG1heGltaXNlZCA9IGxlZ2FjeU1heGltaXNlZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7IGlkLCBtYXhpbWlzZWQgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFN0YWNrSXRlbUNvbmZpZyBleHRlbmRzIEhlYWRlcmVkSXRlbUNvbmZpZyB7XHJcbiAgICB0eXBlOiAnc3RhY2snO1xyXG4gICAgY29udGVudDogQ29tcG9uZW50SXRlbUNvbmZpZ1tdO1xyXG4gICAgLyoqIFRoZSBpbmRleCBvZiB0aGUgaXRlbSBpbiBjb250ZW50IHdoaWNoIGlzIHRvIGJlIGFjdGl2ZSovXHJcbiAgICBhY3RpdmVJdGVtSW5kZXg/OiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgU3RhY2tJdGVtQ29uZmlnIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKGl0ZW1Db25maWc6IFN0YWNrSXRlbUNvbmZpZywgcm93QW5kQ29sdW1uQ2hpbGRMZWdhY3lTaXplRGVmYXVsdDogYm9vbGVhbik6IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnIHtcclxuICAgICAgICBjb25zdCB7IGlkLCBtYXhpbWlzZWQgfSA9IEhlYWRlcmVkSXRlbUNvbmZpZy5yZXNvbHZlSWRBbmRNYXhpbWlzZWQoaXRlbUNvbmZpZyk7XHJcbiAgICAgICAgY29uc3QgeyBzaXplLCBzaXplVW5pdCB9ID0gSXRlbUNvbmZpZy5yZXNvbHZlU2l6ZShpdGVtQ29uZmlnLnNpemUsIGl0ZW1Db25maWcud2lkdGgsIGl0ZW1Db25maWcuaGVpZ2h0LCByb3dBbmRDb2x1bW5DaGlsZExlZ2FjeVNpemVEZWZhdWx0KTtcclxuICAgICAgICBjb25zdCB7IHNpemU6IG1pblNpemUsIHNpemVVbml0OiBtaW5TaXplVW5pdCB9ID0gSXRlbUNvbmZpZy5yZXNvbHZlTWluU2l6ZShpdGVtQ29uZmlnLm1pblNpemUsIGl0ZW1Db25maWcubWluV2lkdGgsIGl0ZW1Db25maWcubWluSGVpZ2h0KTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogSXRlbVR5cGUuc3RhY2ssXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IHJlc29sdmVDb250ZW50KGl0ZW1Db25maWcuY29udGVudCksXHJcbiAgICAgICAgICAgIHNpemUsXHJcbiAgICAgICAgICAgIHNpemVVbml0LFxyXG4gICAgICAgICAgICBtaW5TaXplLFxyXG4gICAgICAgICAgICBtaW5TaXplVW5pdCxcclxuICAgICAgICAgICAgaWQsXHJcbiAgICAgICAgICAgIG1heGltaXNlZCxcclxuICAgICAgICAgICAgaXNDbG9zYWJsZTogaXRlbUNvbmZpZy5pc0Nsb3NhYmxlID8/IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5pc0Nsb3NhYmxlLFxyXG4gICAgICAgICAgICBhY3RpdmVJdGVtSW5kZXg6IGl0ZW1Db25maWcuYWN0aXZlSXRlbUluZGV4ID8/IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnLmRlZmF1bHRBY3RpdmVJdGVtSW5kZXgsXHJcbiAgICAgICAgICAgIGhlYWRlcjogSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlci5yZXNvbHZlKGl0ZW1Db25maWcuaGVhZGVyLCBpdGVtQ29uZmlnLmhhc0hlYWRlcnMpLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZnJvbVJlc29sdmVkKHJlc29sdmVkQ29uZmlnOiBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZyk6IFN0YWNrSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBTdGFja0l0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IEl0ZW1UeXBlLnN0YWNrLFxyXG4gICAgICAgICAgICBjb250ZW50OiBmcm9tUmVzb2x2ZWRDb250ZW50KHJlc29sdmVkQ29uZmlnLmNvbnRlbnQpLFxyXG4gICAgICAgICAgICBzaXplOiBmb3JtYXRTaXplKHJlc29sdmVkQ29uZmlnLnNpemUsIHJlc29sdmVkQ29uZmlnLnNpemVVbml0KSxcclxuICAgICAgICAgICAgbWluU2l6ZTogZm9ybWF0VW5kZWZpbmFibGVTaXplKHJlc29sdmVkQ29uZmlnLm1pblNpemUsIHJlc29sdmVkQ29uZmlnLm1pblNpemVVbml0KSxcclxuICAgICAgICAgICAgaWQ6IHJlc29sdmVkQ29uZmlnLmlkLFxyXG4gICAgICAgICAgICBtYXhpbWlzZWQ6IHJlc29sdmVkQ29uZmlnLm1heGltaXNlZCxcclxuICAgICAgICAgICAgaXNDbG9zYWJsZTogcmVzb2x2ZWRDb25maWcuaXNDbG9zYWJsZSxcclxuICAgICAgICAgICAgYWN0aXZlSXRlbUluZGV4OiByZXNvbHZlZENvbmZpZy5hY3RpdmVJdGVtSW5kZXgsXHJcbiAgICAgICAgICAgIGhlYWRlcjogUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyLmNyZWF0ZUNvcHkocmVzb2x2ZWRDb25maWcuaGVhZGVyKSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGZ1bmN0aW9uIHJlc29sdmVDb250ZW50KGNvbnRlbnQ6IENvbXBvbmVudEl0ZW1Db25maWdbXSB8IHVuZGVmaW5lZCk6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZ1tdIHtcclxuICAgICAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBjb3VudCA9IGNvbnRlbnQubGVuZ3RoO1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8UmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnPihjb3VudCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRJdGVtQ29uZmlnID0gY29udGVudFtpXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1Db25maWcgPSBJdGVtQ29uZmlnLnJlc29sdmUoY2hpbGRJdGVtQ29uZmlnLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIVJlc29sdmVkSXRlbUNvbmZpZy5pc0NvbXBvbmVudEl0ZW0oaXRlbUNvbmZpZykpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ1VDVVNJQ1JDOTExMTQnLCBKU09OLnN0cmluZ2lmeShpdGVtQ29uZmlnKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IGl0ZW1Db25maWc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZnVuY3Rpb24gZnJvbVJlc29sdmVkQ29udGVudChyZXNvbHZlZENvbnRlbnQ6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZ1tdKTogQ29tcG9uZW50SXRlbUNvbmZpZ1tdIHtcclxuICAgICAgICBjb25zdCBjb3VudCA9IHJlc29sdmVkQ29udGVudC5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PENvbXBvbmVudEl0ZW1Db25maWc+KGNvdW50KTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRDb250ZW50Q29uZmlnID0gcmVzb2x2ZWRDb250ZW50W2ldO1xyXG4gICAgICAgICAgICByZXN1bHRbaV0gPSBDb21wb25lbnRJdGVtQ29uZmlnLmZyb21SZXNvbHZlZChyZXNvbHZlZENvbnRlbnRDb25maWcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudEl0ZW1Db25maWcgZXh0ZW5kcyBIZWFkZXJlZEl0ZW1Db25maWcge1xyXG4gICAgdHlwZTogJ2NvbXBvbmVudCc7XHJcbiAgICByZWFkb25seSBjb250ZW50PzogW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdGl0bGUgb2YgdGhlIGl0ZW0gYXMgZGlzcGxheWVkIG9uIGl0cyB0YWIgYW5kIG9uIHBvcG91dCB3aW5kb3dzXHJcbiAgICAgKiBEZWZhdWx0OiBjb21wb25lbnRUeXBlLnRvU3RyaW5nKCkgb3IgJydcclxuICAgICAqL1xyXG4gICAgdGl0bGU/OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgY29tcG9uZW50LlxyXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoQ29tcG9uZW50SXRlbUNvbmZpZzppbnRlcmZhY2UpLmNvbXBvbmVudFR5cGV9IGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgY29tcG9uZW50TmFtZT86IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSBjb21wb25lbnQuXHJcbiAgICAgKiBgY29tcG9uZW50VHlwZWAgbXVzdCBiZSBvZiB0eXBlIGBzdHJpbmdgIGlmIGl0IGlzIHJlZ2lzdGVyZWQgd2l0aCBhbnkgb2YgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6XHJcbiAgICAgKiAqIHtAbGluayAoR29sZGVuTGF5b3V0OmNsYXNzKS5yZWdpc3RlckNvbXBvbmVudH0gKGRlcHJlY2F0ZWQpXHJcbiAgICAgKiAqIHtAbGluayAoR29sZGVuTGF5b3V0OmNsYXNzKS5yZWdpc3RlckNvbXBvbmVudENvbnN0cnVjdG9yfVxyXG4gICAgICogKiB7QGxpbmsgKEdvbGRlbkxheW91dDpjbGFzcykucmVnaXN0ZXJDb21wb25lbnRGYWN0b3J5RnVuY3Rpb259XHJcbiAgICAgKi9cclxuICAgIGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZTtcclxuICAgIC8qKlxyXG4gICAgICogVGhlIHN0YXRlIGluZm9ybWF0aW9uIHdpdGggd2hpY2ggYSBjb21wb25lbnQgd2lsbCBiZSBpbml0aWFsaXNlZCB3aXRoLlxyXG4gICAgICogV2lsbCBiZSBwYXNzZWQgdG8gdGhlIGNvbXBvbmVudCBjb25zdHJ1Y3RvciBmdW5jdGlvbiBhbmQgd2lsbCBiZSB0aGUgdmFsdWUgcmV0dXJuZWQgYnlcclxuICAgICAqIGNvbnRhaW5lci5pbml0aWFsU3RhdGUuXHJcbiAgICAgKi9cclxuICAgIGNvbXBvbmVudFN0YXRlPzogSnNvblZhbHVlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVmYXVsdDogdHJ1ZVxyXG4gICAgICovXHJcbiAgICByZW9yZGVyRW5hYmxlZD86IGJvb2xlYW47ICAvLyBUYWtlcyBwcmVjZWRlbmNlIG92ZXIgTGF5b3V0Q29uZmlnLnJlb3JkZXJFbmFibGVkLlxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIENvbXBvbmVudEl0ZW1Db25maWcge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUoaXRlbUNvbmZpZzogQ29tcG9uZW50SXRlbUNvbmZpZywgcm93QW5kQ29sdW1uQ2hpbGRMZWdhY3lTaXplRGVmYXVsdDogYm9vbGVhbik6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyB7XHJcbiAgICAgICAgbGV0IGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCA9IGl0ZW1Db25maWcuY29tcG9uZW50VHlwZTtcclxuICAgICAgICBpZiAoY29tcG9uZW50VHlwZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNvbXBvbmVudFR5cGUgPSBpdGVtQ29uZmlnLmNvbXBvbmVudE5hbWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjb21wb25lbnRUeXBlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb21wb25lbnRJdGVtQ29uZmlnLmNvbXBvbmVudFR5cGUgaXMgdW5kZWZpbmVkJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgeyBpZCwgbWF4aW1pc2VkIH0gPSBIZWFkZXJlZEl0ZW1Db25maWcucmVzb2x2ZUlkQW5kTWF4aW1pc2VkKGl0ZW1Db25maWcpO1xyXG4gICAgICAgICAgICBsZXQgdGl0bGU6IHN0cmluZztcclxuICAgICAgICAgICAgaWYgKGl0ZW1Db25maWcudGl0bGUgPT09IHVuZGVmaW5lZCB8fCBpdGVtQ29uZmlnLnRpdGxlID09PSAnJykge1xyXG4gICAgICAgICAgICAgICAgdGl0bGUgPSBDb21wb25lbnRJdGVtQ29uZmlnLmNvbXBvbmVudFR5cGVUb1RpdGxlKGNvbXBvbmVudFR5cGUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGl0bGUgPSBpdGVtQ29uZmlnLnRpdGxlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHsgc2l6ZSwgc2l6ZVVuaXQgfSA9IEl0ZW1Db25maWcucmVzb2x2ZVNpemUoaXRlbUNvbmZpZy5zaXplLCBpdGVtQ29uZmlnLndpZHRoLCBpdGVtQ29uZmlnLmhlaWdodCwgcm93QW5kQ29sdW1uQ2hpbGRMZWdhY3lTaXplRGVmYXVsdCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgc2l6ZTogbWluU2l6ZSwgc2l6ZVVuaXQ6IG1pblNpemVVbml0IH0gPSBJdGVtQ29uZmlnLnJlc29sdmVNaW5TaXplKGl0ZW1Db25maWcubWluU2l6ZSwgaXRlbUNvbmZpZy5taW5XaWR0aCwgaXRlbUNvbmZpZy5taW5IZWlnaHQpO1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IGl0ZW1Db25maWcudHlwZSxcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IFtdLFxyXG4gICAgICAgICAgICAgICAgc2l6ZSxcclxuICAgICAgICAgICAgICAgIHNpemVVbml0LFxyXG4gICAgICAgICAgICAgICAgbWluU2l6ZSxcclxuICAgICAgICAgICAgICAgIG1pblNpemVVbml0LFxyXG4gICAgICAgICAgICAgICAgaWQsXHJcbiAgICAgICAgICAgICAgICBtYXhpbWlzZWQsXHJcbiAgICAgICAgICAgICAgICBpc0Nsb3NhYmxlOiBpdGVtQ29uZmlnLmlzQ2xvc2FibGUgPz8gUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLmlzQ2xvc2FibGUsXHJcbiAgICAgICAgICAgICAgICByZW9yZGVyRW5hYmxlZDogaXRlbUNvbmZpZy5yZW9yZGVyRW5hYmxlZCA/PyBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcuZGVmYXVsdFJlb3JkZXJFbmFibGVkLFxyXG4gICAgICAgICAgICAgICAgdGl0bGUsXHJcbiAgICAgICAgICAgICAgICBoZWFkZXI6IEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXIucmVzb2x2ZShpdGVtQ29uZmlnLmhlYWRlciwgaXRlbUNvbmZpZy5oYXNIZWFkZXJzKSxcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudFR5cGUsXHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnRTdGF0ZTogaXRlbUNvbmZpZy5jb21wb25lbnRTdGF0ZSA/PyB7fSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGZyb21SZXNvbHZlZChyZXNvbHZlZENvbmZpZzogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnKTogQ29tcG9uZW50SXRlbUNvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBDb21wb25lbnRJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiBJdGVtVHlwZS5jb21wb25lbnQsXHJcbiAgICAgICAgICAgIHNpemU6IGZvcm1hdFNpemUocmVzb2x2ZWRDb25maWcuc2l6ZSwgcmVzb2x2ZWRDb25maWcuc2l6ZVVuaXQpLFxyXG4gICAgICAgICAgICBtaW5TaXplOiBmb3JtYXRVbmRlZmluYWJsZVNpemUocmVzb2x2ZWRDb25maWcubWluU2l6ZSwgcmVzb2x2ZWRDb25maWcubWluU2l6ZVVuaXQpLFxyXG4gICAgICAgICAgICBpZDogcmVzb2x2ZWRDb25maWcuaWQsXHJcbiAgICAgICAgICAgIG1heGltaXNlZDogcmVzb2x2ZWRDb25maWcubWF4aW1pc2VkLFxyXG4gICAgICAgICAgICBpc0Nsb3NhYmxlOiByZXNvbHZlZENvbmZpZy5pc0Nsb3NhYmxlLFxyXG4gICAgICAgICAgICByZW9yZGVyRW5hYmxlZDogcmVzb2x2ZWRDb25maWcucmVvcmRlckVuYWJsZWQsXHJcbiAgICAgICAgICAgIHRpdGxlOiByZXNvbHZlZENvbmZpZy50aXRsZSxcclxuICAgICAgICAgICAgaGVhZGVyOiBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXIuY3JlYXRlQ29weShyZXNvbHZlZENvbmZpZy5oZWFkZXIpLFxyXG4gICAgICAgICAgICBjb21wb25lbnRUeXBlOiByZXNvbHZlZENvbmZpZy5jb21wb25lbnRUeXBlLFxyXG4gICAgICAgICAgICBjb21wb25lbnRTdGF0ZTogZGVlcEV4dGVuZFZhbHVlKHVuZGVmaW5lZCwgcmVzb2x2ZWRDb25maWcuY29tcG9uZW50U3RhdGUpIGFzIEpzb25WYWx1ZSxcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNvbXBvbmVudFR5cGVUb1RpdGxlKGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZSk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgY29tcG9uZW50VHlwZVR5cGUgPSB0eXBlb2YgY29tcG9uZW50VHlwZTtcclxuICAgICAgICBzd2l0Y2ggKGNvbXBvbmVudFR5cGVUeXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6IHJldHVybiBjb21wb25lbnRUeXBlIGFzIHN0cmluZztcclxuICAgICAgICAgICAgY2FzZSAnbnVtYmVyJzogcmV0dXJuIChjb21wb25lbnRUeXBlIGFzIG51bWJlcikudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgY2FzZSAnYm9vbGVhbic6IHJldHVybiAoY29tcG9uZW50VHlwZSBhcyBib29sZWFuKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vLyBSb3dPckNvbHVtblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFJvd09yQ29sdW1uSXRlbUNvbmZpZyBleHRlbmRzIEl0ZW1Db25maWcge1xyXG4gICAgdHlwZTogJ3JvdycgfCAnY29sdW1uJztcclxuICAgIGNvbnRlbnQ6IChSb3dPckNvbHVtbkl0ZW1Db25maWcgfCBTdGFja0l0ZW1Db25maWcgfCBDb21wb25lbnRJdGVtQ29uZmlnKVtdO1xyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFJvd09yQ29sdW1uSXRlbUNvbmZpZyB7XHJcbiAgICBleHBvcnQgdHlwZSBDaGlsZEl0ZW1Db25maWcgPSBSb3dPckNvbHVtbkl0ZW1Db25maWcgfCBTdGFja0l0ZW1Db25maWcgfCBDb21wb25lbnRJdGVtQ29uZmlnO1xyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0NoaWxkSXRlbUNvbmZpZyhpdGVtQ29uZmlnOiBJdGVtQ29uZmlnKTogaXRlbUNvbmZpZyBpcyBDaGlsZEl0ZW1Db25maWcge1xyXG4gICAgICAgIHN3aXRjaCAoaXRlbUNvbmZpZy50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUucm93OlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbHVtbjpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5zdGFjazpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb21wb25lbnQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5ncm91bmQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWFjaGFibGVDYXNlRXJyb3IoJ1VST0NPU1BDSUNJQzEzNjg3JywgaXRlbUNvbmZpZy50eXBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUoaXRlbUNvbmZpZzogUm93T3JDb2x1bW5JdGVtQ29uZmlnLCByb3dBbmRDb2x1bW5DaGlsZExlZ2FjeVNpemVEZWZhdWx0OiBib29sZWFuKTogUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcge1xyXG4gICAgICAgIGNvbnN0IHsgc2l6ZSwgc2l6ZVVuaXQgfSA9IEl0ZW1Db25maWcucmVzb2x2ZVNpemUoaXRlbUNvbmZpZy5zaXplLCBpdGVtQ29uZmlnLndpZHRoLCBpdGVtQ29uZmlnLmhlaWdodCwgcm93QW5kQ29sdW1uQ2hpbGRMZWdhY3lTaXplRGVmYXVsdCk7XHJcbiAgICAgICAgY29uc3QgeyBzaXplOiBtaW5TaXplLCBzaXplVW5pdDogbWluU2l6ZVVuaXQgfSA9IEl0ZW1Db25maWcucmVzb2x2ZU1pblNpemUoaXRlbUNvbmZpZy5taW5TaXplLCBpdGVtQ29uZmlnLm1pbldpZHRoLCBpdGVtQ29uZmlnLm1pbkhlaWdodCk7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogaXRlbUNvbmZpZy50eXBlLFxyXG4gICAgICAgICAgICBjb250ZW50OiBSb3dPckNvbHVtbkl0ZW1Db25maWcucmVzb2x2ZUNvbnRlbnQoaXRlbUNvbmZpZy5jb250ZW50KSxcclxuICAgICAgICAgICAgc2l6ZSxcclxuICAgICAgICAgICAgc2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIG1pblNpemUsXHJcbiAgICAgICAgICAgIG1pblNpemVVbml0LFxyXG4gICAgICAgICAgICBpZDogSXRlbUNvbmZpZy5yZXNvbHZlSWQoaXRlbUNvbmZpZy5pZCksXHJcbiAgICAgICAgICAgIGlzQ2xvc2FibGU6IGl0ZW1Db25maWcuaXNDbG9zYWJsZSA/PyBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuaXNDbG9zYWJsZSxcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZnJvbVJlc29sdmVkKHJlc29sdmVkQ29uZmlnOiBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyk6IFJvd09yQ29sdW1uSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSb3dPckNvbHVtbkl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IHJlc29sdmVkQ29uZmlnLnR5cGUsXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IGZyb21SZXNvbHZlZENvbnRlbnQocmVzb2x2ZWRDb25maWcuY29udGVudCksXHJcbiAgICAgICAgICAgIHNpemU6IGZvcm1hdFNpemUocmVzb2x2ZWRDb25maWcuc2l6ZSwgcmVzb2x2ZWRDb25maWcuc2l6ZVVuaXQpLFxyXG4gICAgICAgICAgICBtaW5TaXplOiBmb3JtYXRVbmRlZmluYWJsZVNpemUocmVzb2x2ZWRDb25maWcubWluU2l6ZSwgcmVzb2x2ZWRDb25maWcubWluU2l6ZVVuaXQpLFxyXG4gICAgICAgICAgICBpZDogcmVzb2x2ZWRDb25maWcuaWQsXHJcbiAgICAgICAgICAgIGlzQ2xvc2FibGU6IHJlc29sdmVkQ29uZmlnLmlzQ2xvc2FibGUsXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQ29udGVudChjb250ZW50OiBDaGlsZEl0ZW1Db25maWdbXSB8IHVuZGVmaW5lZCk6IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnLkNoaWxkSXRlbUNvbmZpZ1tdIHtcclxuICAgICAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBjb3VudCA9IGNvbnRlbnQubGVuZ3RoO1xyXG4gICAgICAgICAgICBjb25zdCBjaGlsZEl0ZW1Db25maWdzID0gbmV3IEFycmF5PFJvd09yQ29sdW1uSXRlbUNvbmZpZy5DaGlsZEl0ZW1Db25maWc+KGNvdW50KTtcclxuICAgICAgICAgICAgbGV0IHdpZHRoT3JIZWlnaHRTcGVjaWZpZWRBdExlYXN0T25jZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBsZXQgc2l6ZVNwZWNpZmllZEF0TGVhc3RPbmNlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRJdGVtQ29uZmlnID0gY29udGVudFtpXTtcclxuICAgICAgICAgICAgICAgIGlmICghUm93T3JDb2x1bW5JdGVtQ29uZmlnLmlzQ2hpbGRJdGVtQ29uZmlnKGNoaWxkSXRlbUNvbmZpZykpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKCdJdGVtQ29uZmlnIGlzIG5vdCBSb3csIENvbHVtbiBvciBTdGFjaycsIGNoaWxkSXRlbUNvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghc2l6ZVNwZWNpZmllZEF0TGVhc3RPbmNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVXaWR0aEhlaWdodFNwZWNpZmljYXRpb25UeXBlID0gSXRlbUNvbmZpZy5jYWxjdWxhdGVTaXplV2lkdGhIZWlnaHRTcGVjaWZpY2F0aW9uVHlwZShjaGlsZEl0ZW1Db25maWcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHNpemVXaWR0aEhlaWdodFNwZWNpZmljYXRpb25UeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEl0ZW1Db25maWcuU2l6ZVdpZHRoSGVpZ2h0U3BlY2lmaWNhdGlvblR5cGUuTm9uZTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbUNvbmZpZy5TaXplV2lkdGhIZWlnaHRTcGVjaWZpY2F0aW9uVHlwZS5XaWR0aE9ySGVpZ2h0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoT3JIZWlnaHRTcGVjaWZpZWRBdExlYXN0T25jZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEl0ZW1Db25maWcuU2l6ZVdpZHRoSGVpZ2h0U3BlY2lmaWNhdGlvblR5cGUuU2l6ZTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplU3BlY2lmaWVkQXRMZWFzdE9uY2UgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWFjaGFibGVDYXNlRXJyb3IoJ1JPQ0lDUkM4NzU1NicsIHNpemVXaWR0aEhlaWdodFNwZWNpZmljYXRpb25UeXBlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjaGlsZEl0ZW1Db25maWdzW2ldID0gY2hpbGRJdGVtQ29uZmlnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgbGVnYWN5U2l6ZURlZmF1bHQ6IGJvb2xlYW47XHJcbiAgICAgICAgICAgIGlmIChzaXplU3BlY2lmaWVkQXRMZWFzdE9uY2UpIHtcclxuICAgICAgICAgICAgICAgIGxlZ2FjeVNpemVEZWZhdWx0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAod2lkdGhPckhlaWdodFNwZWNpZmllZEF0TGVhc3RPbmNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVnYWN5U2l6ZURlZmF1bHQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBsZWdhY3lTaXplRGVmYXVsdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8UmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcuQ2hpbGRJdGVtQ29uZmlnPihjb3VudCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRJdGVtQ29uZmlnID0gY2hpbGRJdGVtQ29uZmlnc1tpXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkQ2hpbGRJdGVtQ29uZmlnID0gSXRlbUNvbmZpZy5yZXNvbHZlKGNoaWxkSXRlbUNvbmZpZywgbGVnYWN5U2l6ZURlZmF1bHQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZy5pc0NoaWxkSXRlbUNvbmZpZyhyZXNvbHZlZENoaWxkSXRlbUNvbmZpZykpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ1VST0NPU1BJQzk5NTEyJywgSlNPTi5zdHJpbmdpZnkocmVzb2x2ZWRDaGlsZEl0ZW1Db25maWcpKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gcmVzb2x2ZWRDaGlsZEl0ZW1Db25maWc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZnVuY3Rpb24gZnJvbVJlc29sdmVkQ29udGVudChyZXNvbHZlZENvbnRlbnQ6IHJlYWRvbmx5IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnLkNoaWxkSXRlbUNvbmZpZ1tdKTogUm93T3JDb2x1bW5JdGVtQ29uZmlnLkNoaWxkSXRlbUNvbmZpZ1tdIHtcclxuICAgICAgICBjb25zdCBjb3VudCA9IHJlc29sdmVkQ29udGVudC5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PFJvd09yQ29sdW1uSXRlbUNvbmZpZy5DaGlsZEl0ZW1Db25maWc+KGNvdW50KTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRDb250ZW50Q29uZmlnID0gcmVzb2x2ZWRDb250ZW50W2ldO1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gcmVzb2x2ZWRDb250ZW50Q29uZmlnLnR5cGU7XHJcbiAgICAgICAgICAgIGxldCBjb250ZW50Q29uZmlnOiBSb3dPckNvbHVtbkl0ZW1Db25maWcuQ2hpbGRJdGVtQ29uZmlnO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUucm93OlxyXG4gICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb2x1bW46XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudENvbmZpZyA9IFJvd09yQ29sdW1uSXRlbUNvbmZpZy5mcm9tUmVzb2x2ZWQocmVzb2x2ZWRDb250ZW50Q29uZmlnKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuc3RhY2s6XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudENvbmZpZyA9IFN0YWNrSXRlbUNvbmZpZy5mcm9tUmVzb2x2ZWQocmVzb2x2ZWRDb250ZW50Q29uZmlnKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29tcG9uZW50OlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRDb25maWcgPSBDb21wb25lbnRJdGVtQ29uZmlnLmZyb21SZXNvbHZlZChyZXNvbHZlZENvbnRlbnRDb25maWcpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWFjaGFibGVDYXNlRXJyb3IoJ1JPQ0lDRlJDNDQ3OTcnLCB0eXBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXN1bHRbaV0gPSBjb250ZW50Q29uZmlnO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgdHlwZSBSb290SXRlbUNvbmZpZyA9IFJvd09yQ29sdW1uSXRlbUNvbmZpZyB8IFN0YWNrSXRlbUNvbmZpZyB8IENvbXBvbmVudEl0ZW1Db25maWc7XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFJvb3RJdGVtQ29uZmlnIHtcclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc1Jvb3RJdGVtQ29uZmlnKGl0ZW1Db25maWc6IEl0ZW1Db25maWcpOiBpdGVtQ29uZmlnIGlzIFJvb3RJdGVtQ29uZmlnIHtcclxuICAgICAgICBzd2l0Y2ggKGl0ZW1Db25maWcudHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnJvdzpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb2x1bW46XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuc3RhY2s6XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29tcG9uZW50OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuZ3JvdW5kOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVucmVhY2hhYmxlQ2FzZUVycm9yKCdVUklDSVIyMzY4NycsIGl0ZW1Db25maWcudHlwZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKGl0ZW1Db25maWc6IFJvb3RJdGVtQ29uZmlnIHwgdW5kZWZpbmVkKTogUmVzb2x2ZWRSb290SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgaWYgKGl0ZW1Db25maWcgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IEl0ZW1Db25maWcucmVzb2x2ZShpdGVtQ29uZmlnLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIGlmICghUmVzb2x2ZWRSb290SXRlbUNvbmZpZy5pc1Jvb3RJdGVtQ29uZmlnKHJlc3VsdCkpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoJ0l0ZW1Db25maWcgaXMgbm90IFJvdywgQ29sdW1uIG9yIFN0YWNrJywgSlNPTi5zdHJpbmdpZnkoaXRlbUNvbmZpZykpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZnJvbVJlc29sdmVkT3JVbmRlZmluZWQocmVzb2x2ZWRJdGVtQ29uZmlnOiBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnIHwgdW5kZWZpbmVkKTogUm9vdEl0ZW1Db25maWcgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGlmIChyZXNvbHZlZEl0ZW1Db25maWcgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSByZXNvbHZlZEl0ZW1Db25maWcudHlwZTtcclxuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnJvdzpcclxuICAgICAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29sdW1uOlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSb3dPckNvbHVtbkl0ZW1Db25maWcuZnJvbVJlc29sdmVkKHJlc29sdmVkSXRlbUNvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnN0YWNrOlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBTdGFja0l0ZW1Db25maWcuZnJvbVJlc29sdmVkKHJlc29sdmVkSXRlbUNvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbXBvbmVudDpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29tcG9uZW50SXRlbUNvbmZpZy5mcm9tUmVzb2x2ZWQocmVzb2x2ZWRJdGVtQ29uZmlnKTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVucmVhY2hhYmxlQ2FzZUVycm9yKCdSSUNGUk9VODk5MjEnLCB0eXBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBMYXlvdXRDb25maWcge1xyXG4gICAgcm9vdDogUm9vdEl0ZW1Db25maWcgfCB1bmRlZmluZWQ7XHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAoTGF5b3V0Q29uZmlnOmludGVyZmFjZSkucm9vdH0gKi9cclxuICAgIGNvbnRlbnQ/OiAoUm93T3JDb2x1bW5JdGVtQ29uZmlnIHwgU3RhY2tJdGVtQ29uZmlnIHwgQ29tcG9uZW50SXRlbUNvbmZpZylbXTtcclxuICAgIG9wZW5Qb3BvdXRzPzogUG9wb3V0TGF5b3V0Q29uZmlnW107XHJcbiAgICBkaW1lbnNpb25zPzogTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnM7XHJcbiAgICBzZXR0aW5ncz86IExheW91dENvbmZpZy5TZXR0aW5ncztcclxuICAgIC8qKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChMYXlvdXRDb25maWc6aW50ZXJmYWNlKS5oZWFkZXJ9IGluc3RlYWQgKi9cclxuICAgIGxhYmVscz86IExheW91dENvbmZpZy5MYWJlbHM7XHJcbiAgICBoZWFkZXI/OiBMYXlvdXRDb25maWcuSGVhZGVyO1xyXG59XHJcblxyXG4vKiogVXNlIHRvIHNwZWNpZnkgTGF5b3V0Q29uZmlnIHdpdGggZGVmYXVsdHMgb3IgZGVzZXJpYWxpc2UgYSBMYXlvdXRDb25maWcuXHJcbiAqIERlc2VyaWFsaXNhdGlvbiB3aWxsIGhhbmRsZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cclxuICogTm90ZSB0aGF0IExheW91dENvbmZpZyBzaG91bGQgYmUgdXNlZCBmb3Igc2VyaWFsaXNhdGlvbiAobm90IExheW91dENvbmZpZylcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBMYXlvdXRDb25maWcge1xyXG4gICAgZXhwb3J0IGludGVyZmFjZSBTZXR0aW5ncyB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgdXNlICR7QGxpbmsgKExheW91dENvbmZpZzpuYW1lc3BhY2UpLihIZWFkZXI6aW50ZXJmYWNlKS5zaG93fSBpbnN0ZWFkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaGFzSGVhZGVycz86IGJvb2xlYW47XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElmIHRydWUsIHRoZSB1c2VyIGNhbiBkcmFnIGNvbXBvbmVudHMgZnJvbSBvbmUgd2luZG93IHRvIGFub3RoZXIuXHJcbiAgICAgICAgICogRGVmYXVsdDogdHJ1ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGRyYWdCZXR3ZWVuV2luZG93cz86IGJvb2xlYW47XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElmIHRydWUsIHRoZSB1c2VyIGNhbiBkcmFnIGFuZCBkcm9wIGNvbXBvbmVudHMgb3V0c2lkZSB0aGVpciBjb250YWluaW5nIHdpbmRvdywgY3JlYXRpbmcgYSBuZXcgcG9wb3V0IHdpbmRvdy5cclxuICAgICAgICAgKiBEZWZhdWx0OiB0cnVlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZHJhZ1RvTmV3V2luZG93PzogYm9vbGVhbjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgdHJ1ZSwgdGhlIHVzZXIgY2FuIHJlLWFycmFuZ2UgdGhlIGxheW91dCBieSBkcmFnZ2luZyBpdGVtcyBieSB0aGVpciB0YWJzIHRvIHRoZSBkZXNpcmVkIGxvY2F0aW9uLlxyXG4gICAgICAgICAqIENhbiBiZSBvdmVycmlkZGVuIGJ5IEl0ZW1Db25maWcucmVvcmRlckVuYWJsZWQgZm9yIHNwZWNpZmljIEl0ZW1Db25maWdzXHJcbiAgICAgICAgICogRGVmYXVsdDogdHJ1ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHJlb3JkZXJFbmFibGVkPzogYm9vbGVhbjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRGVjaWRlcyB3aGF0IHdpbGwgYmUgb3BlbmVkIGluIGEgbmV3IHdpbmRvdyBpZiB0aGUgdXNlciBjbGlja3MgdGhlIHBvcG91dCBpY29uLiBJZiB0cnVlIHRoZSBlbnRpcmUgc3RhY2sgd2lsbFxyXG4gICAgICAgICAqIGJlIHRyYW5zZmVycmVkIHRvIHRoZSBuZXcgd2luZG93LCBpZiBmYWxzZSBvbmx5IHRoZSBhY3RpdmUgY29tcG9uZW50IHdpbGwgYmUgb3BlbmVkLlxyXG4gICAgICAgICAqIERlZmF1bHQ6IGZhbHNlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcG9wb3V0V2hvbGVTdGFjaz86IGJvb2xlYW47XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFNwZWNpZmllcyBpZiBhbiBlcnJvciBpcyB0aHJvd24gd2hlbiBhIHBvcG91dCBpcyBibG9ja2VkIGJ5IHRoZSBicm93c2VyIChlLmcuIGJ5IG9wZW5pbmcgaXQgcHJvZ3JhbW1hdGljYWxseSkuXHJcbiAgICAgICAgICogSWYgZmFsc2UsIHRoZSBwb3BvdXQgY2FsbCB3aWxsIGZhaWwgc2lsZW50bHkuXHJcbiAgICAgICAgICogRGVmYXVsdDogdHJ1ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGJsb2NrZWRQb3BvdXRzVGhyb3dFcnJvcj86IGJvb2xlYW47XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFNwZWNpZmllcyBpZiBhbGwgcG9wb3V0cyBzaG91bGQgYmUgY2xvc2VkIHdoZW4gdGhlIHBhZ2UgdGhhdCBjcmVhdGVkIHRoZW0gaXMgY2xvc2VkLiBQb3BvdXRzIGRvbid0IGhhdmUgYVxyXG4gICAgICAgICAqIHN0cm9uZyBkZXBlbmRlbmN5IG9uIHRoZWlyIHBhcmVudCBhbmQgY2FuIGV4aXN0IG9uIHRoZWlyIG93biwgYnV0IGNhbiBiZSBxdWl0ZSBhbm5veWluZyB0byBjbG9zZSBieSBoYW5kLiBJblxyXG4gICAgICAgICAqIGFkZGl0aW9uLCBhbnkgY2hhbmdlcyBtYWRlIHRvIHBvcG91dHMgd29uJ3QgYmUgc3RvcmVkIGFmdGVyIHRoZSBwYXJlbnQgaXMgY2xvc2VkLlxyXG4gICAgICAgICAqIERlZmF1bHQ6IHRydWVcclxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBXaWxsIGJlIHJlbW92ZWQgaW4gdmVyc2lvbiAzLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNsb3NlUG9wb3V0c09uVW5sb2FkPzogYm9vbGVhbjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU3BlY2lmaWVzIGlmIHRoZSBwb3BvdXQgaWNvbiBzaG91bGQgYmUgZGlzcGxheWVkIGluIHRoZSBoZWFkZXItYmFyLlxyXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKExheW91dENvbmZpZzpuYW1lc3BhY2UpLihIZWFkZXI6aW50ZXJmYWNlKS5wb3BvdXR9IGluc3RlYWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBzaG93UG9wb3V0SWNvbj86IGJvb2xlYW47XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFNwZWNpZmllcyBpZiB0aGUgbWF4aW1pc2UgaWNvbiBzaG91bGQgYmUgZGlzcGxheWVkIGluIHRoZSBoZWFkZXItYmFyLlxyXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKExheW91dENvbmZpZzpuYW1lc3BhY2UpLihIZWFkZXI6aW50ZXJmYWNlKS5tYXhpbWlzZX0gaW5zdGVhZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHNob3dNYXhpbWlzZUljb24/OiBib29sZWFuO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTcGVjaWZpZXMgaWYgdGhlIGNsb3NlIGljb24gc2hvdWxkIGJlIGRpc3BsYXllZCBpbiB0aGUgaGVhZGVyLWJhci5cclxuICAgICAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChMYXlvdXRDb25maWc6bmFtZXNwYWNlKS4oSGVhZGVyOmludGVyZmFjZSkuY2xvc2V9IGluc3RlYWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBzaG93Q2xvc2VJY29uPzogYm9vbGVhbjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU3BlY2lmaWVzIFJlc3BvbnNpdmUgTW9kZSAobW9yZSBpbmZvIG5lZWRlZCkuXHJcbiAgICAgICAgICogRGVmYXVsdDogbm9uZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHJlc3BvbnNpdmVNb2RlPzogUmVzcG9uc2l2ZU1vZGU7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFNwZWNpZmllcyBNYXhpbXVtIHBpeGVsIG92ZXJsYXAgcGVyIHRhYi5cclxuICAgICAgICAgKiBEZWZhdWx0OiAwXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGFiT3ZlcmxhcEFsbG93YW5jZT86IG51bWJlcjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBEZWZhdWx0OiB0cnVlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcmVvcmRlck9uVGFiTWVudUNsaWNrPzogYm9vbGVhbjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRGVmYXVsdDogMTBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0YWJDb250cm9sT2Zmc2V0PzogbnVtYmVyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0byBwb3AgaW4gZWxlbWVudHMgd2hlbiBjbG9zaW5nIGEgcG9wb3V0IHdpbmRvdy5cclxuICAgICAgICAgKiBEZWZhdWx0OiBmYWxzZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHBvcEluT25DbG9zZT86IGJvb2xlYW47XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBTZXR0aW5ncyB7XHJcbiAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUoc2V0dGluZ3M6IFNldHRpbmdzIHwgdW5kZWZpbmVkKTogUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3Mge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzID0ge1xyXG4gICAgICAgICAgICAgICAgZHJhZ0JldHdlZW5XaW5kb3dzOiBzZXR0aW5ncz8uZHJhZ0JldHdlZW5XaW5kb3dzID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzLmRlZmF1bHRzLmRyYWdCZXR3ZWVuV2luZG93cyxcclxuICAgICAgICAgICAgICAgIGRyYWdUb05ld1dpbmRvdzogc2V0dGluZ3M/LmRyYWdUb05ld1dpbmRvdyA/PyBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5kZWZhdWx0cy5kcmFnVG9OZXdXaW5kb3csXHJcbiAgICAgICAgICAgICAgICByZW9yZGVyRW5hYmxlZDogc2V0dGluZ3M/LnJlb3JkZXJFbmFibGVkID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzLmRlZmF1bHRzLnJlb3JkZXJFbmFibGVkLFxyXG4gICAgICAgICAgICAgICAgcG9wb3V0V2hvbGVTdGFjazogc2V0dGluZ3M/LnBvcG91dFdob2xlU3RhY2sgPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuZGVmYXVsdHMucG9wb3V0V2hvbGVTdGFjayxcclxuICAgICAgICAgICAgICAgIGJsb2NrZWRQb3BvdXRzVGhyb3dFcnJvcjogc2V0dGluZ3M/LmJsb2NrZWRQb3BvdXRzVGhyb3dFcnJvciA/PyBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5kZWZhdWx0cy5ibG9ja2VkUG9wb3V0c1Rocm93RXJyb3IsXHJcbiAgICAgICAgICAgICAgICBjbG9zZVBvcG91dHNPblVubG9hZDogc2V0dGluZ3M/LmNsb3NlUG9wb3V0c09uVW5sb2FkID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzLmRlZmF1bHRzLmNsb3NlUG9wb3V0c09uVW5sb2FkLFxyXG4gICAgICAgICAgICAgICAgcmVzcG9uc2l2ZU1vZGU6IHNldHRpbmdzPy5yZXNwb25zaXZlTW9kZSA/PyBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5kZWZhdWx0cy5yZXNwb25zaXZlTW9kZSxcclxuICAgICAgICAgICAgICAgIHRhYk92ZXJsYXBBbGxvd2FuY2U6IHNldHRpbmdzPy50YWJPdmVybGFwQWxsb3dhbmNlID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzLmRlZmF1bHRzLnRhYk92ZXJsYXBBbGxvd2FuY2UsXHJcbiAgICAgICAgICAgICAgICByZW9yZGVyT25UYWJNZW51Q2xpY2s6IHNldHRpbmdzPy5yZW9yZGVyT25UYWJNZW51Q2xpY2sgPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuZGVmYXVsdHMucmVvcmRlck9uVGFiTWVudUNsaWNrLFxyXG4gICAgICAgICAgICAgICAgdGFiQ29udHJvbE9mZnNldDogc2V0dGluZ3M/LnRhYkNvbnRyb2xPZmZzZXQgPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuZGVmYXVsdHMudGFiQ29udHJvbE9mZnNldCxcclxuICAgICAgICAgICAgICAgIHBvcEluT25DbG9zZTogc2V0dGluZ3M/LnBvcEluT25DbG9zZSA/PyBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5kZWZhdWx0cy5wb3BJbk9uQ2xvc2UsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBEaW1lbnNpb25zIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgd2lkdGggb2YgdGhlIGJvcmRlcnMgYmV0d2VlbiB0aGUgbGF5b3V0IGl0ZW1zIGluIHBpeGVsLiBQbGVhc2Ugbm90ZTogVGhlIGFjdHVhbCBkcmFnZ2FibGUgYXJlYSBpcyB3aWRlclxyXG4gICAgICAgICAqIHRoYW4gdGhlIHZpc2libGUgb25lLCBtYWtpbmcgaXQgc2FmZSB0byBzZXQgdGhpcyB0byBzbWFsbCB2YWx1ZXMgd2l0aG91dCBhZmZlY3RpbmcgdXNhYmlsaXR5LlxyXG4gICAgICAgICAqIERlZmF1bHQ6IDVcclxuICAgICAgICAgKi9cclxuICAgICAgICBib3JkZXJXaWR0aD86IG51bWJlcjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRGVmYXVsdDogMTVcclxuICAgICAgICAgKi9cclxuICAgICAgICBib3JkZXJHcmFiV2lkdGg/OiBudW1iZXIsXHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBtaW5pbXVtIGhlaWdodCBhbiBpdGVtIGNhbiBiZSByZXNpemVkIHRvIChpbiBwaXhlbCkuXHJcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoTGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKERpbWVuc2lvbnM6aW50ZXJmYWNlKS5kZWZhdWx0TWluSXRlbUhlaWdodH0gaW5zdGVhZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIG1pbkl0ZW1IZWlnaHQ/OiBudW1iZXI7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBtaW5pbXVtIGhlaWdodCBhbiBpdGVtIGNhbiBiZSByZXNpemVkIHRvLlxyXG4gICAgICAgICAqIERlZmF1bHQ6IDBcclxuICAgICAgICAgKi9cclxuICAgICAgICBkZWZhdWx0TWluSXRlbUhlaWdodD86IHN0cmluZztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG1pbmltdW0gd2lkdGggYW4gaXRlbSBjYW4gYmUgcmVzaXplZCB0byAoaW4gcGl4ZWwpLlxyXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKExheW91dENvbmZpZzpuYW1lc3BhY2UpLihEaW1lbnNpb25zOmludGVyZmFjZSkuZGVmYXVsdE1pbkl0ZW1XaWR0aH0gaW5zdGVhZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIG1pbkl0ZW1XaWR0aD86IG51bWJlcjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG1pbmltdW0gd2lkdGggYW4gaXRlbSBjYW4gYmUgcmVzaXplZCB0by5cclxuICAgICAgICAgKiBEZWZhdWx0OiAxMHB4XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZGVmYXVsdE1pbkl0ZW1XaWR0aD86IHN0cmluZztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGhlaWdodCBvZiB0aGUgaGVhZGVyIGVsZW1lbnRzIGluIHBpeGVsLiBUaGlzIGNhbiBiZSBjaGFuZ2VkLCBidXQgeW91ciB0aGVtZSdzIGhlYWRlciBjc3MgbmVlZHMgdG8gYmVcclxuICAgICAgICAgKiBhZGp1c3RlZCBhY2NvcmRpbmdseS5cclxuICAgICAgICAgKiBEZWZhdWx0OiAyMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGhlYWRlckhlaWdodD86IG51bWJlcjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHdpZHRoIG9mIHRoZSBlbGVtZW50IHRoYXQgYXBwZWFycyB3aGVuIGFuIGl0ZW0gaXMgZHJhZ2dlZCAoaW4gcGl4ZWwpLlxyXG4gICAgICAgICAqIERlZmF1bHQ6IDMwMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGRyYWdQcm94eVdpZHRoPzogbnVtYmVyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBlbGVtZW50IHRoYXQgYXBwZWFycyB3aGVuIGFuIGl0ZW0gaXMgZHJhZ2dlZCAoaW4gcGl4ZWwpLlxyXG4gICAgICAgICAqIERlZmF1bHQ6IDIwMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGRyYWdQcm94eUhlaWdodD86IG51bWJlcjtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgbmFtZXNwYWNlIERpbWVuc2lvbnMge1xyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZShkaW1lbnNpb25zOiBEaW1lbnNpb25zIHwgdW5kZWZpbmVkKTogUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucyB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgc2l6ZTogZGVmYXVsdE1pbkl0ZW1IZWlnaHQsIHNpemVVbml0OiBkZWZhdWx0TWluSXRlbUhlaWdodFVuaXQgfSA9IERpbWVuc2lvbnMucmVzb2x2ZURlZmF1bHRNaW5JdGVtSGVpZ2h0KGRpbWVuc2lvbnMpO1xyXG4gICAgICAgICAgICBjb25zdCB7IHNpemU6IGRlZmF1bHRNaW5JdGVtV2lkdGgsIHNpemVVbml0OiBkZWZhdWx0TWluSXRlbVdpZHRoVW5pdCB9ID0gRGltZW5zaW9ucy5yZXNvbHZlRGVmYXVsdE1pbkl0ZW1XaWR0aChkaW1lbnNpb25zKTtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgYm9yZGVyV2lkdGg6IGRpbWVuc2lvbnM/LmJvcmRlcldpZHRoID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMuZGVmYXVsdHMuYm9yZGVyV2lkdGgsXHJcbiAgICAgICAgICAgICAgICBib3JkZXJHcmFiV2lkdGg6IGRpbWVuc2lvbnM/LmJvcmRlckdyYWJXaWR0aCA/PyBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zLmRlZmF1bHRzLmJvcmRlckdyYWJXaWR0aCxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRNaW5JdGVtSGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdE1pbkl0ZW1IZWlnaHRVbml0LFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdE1pbkl0ZW1XaWR0aCxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRNaW5JdGVtV2lkdGhVbml0LFxyXG4gICAgICAgICAgICAgICAgaGVhZGVySGVpZ2h0OiBkaW1lbnNpb25zPy5oZWFkZXJIZWlnaHQgPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucy5kZWZhdWx0cy5oZWFkZXJIZWlnaHQsXHJcbiAgICAgICAgICAgICAgICBkcmFnUHJveHlXaWR0aDogZGltZW5zaW9ucz8uZHJhZ1Byb3h5V2lkdGggPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucy5kZWZhdWx0cy5kcmFnUHJveHlXaWR0aCxcclxuICAgICAgICAgICAgICAgIGRyYWdQcm94eUhlaWdodDogZGltZW5zaW9ucz8uZHJhZ1Byb3h5SGVpZ2h0ID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMuZGVmYXVsdHMuZHJhZ1Byb3h5SGVpZ2h0LFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGZyb21SZXNvbHZlZChyZXNvbHZlZERpbWVuc2lvbnM6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMpOiBEaW1lbnNpb25zIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBEaW1lbnNpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgYm9yZGVyV2lkdGg6IHJlc29sdmVkRGltZW5zaW9ucy5ib3JkZXJXaWR0aCxcclxuICAgICAgICAgICAgICAgIGJvcmRlckdyYWJXaWR0aDogcmVzb2x2ZWREaW1lbnNpb25zLmJvcmRlckdyYWJXaWR0aCxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRNaW5JdGVtSGVpZ2h0OiBmb3JtYXRTaXplKHJlc29sdmVkRGltZW5zaW9ucy5kZWZhdWx0TWluSXRlbUhlaWdodCwgcmVzb2x2ZWREaW1lbnNpb25zLmRlZmF1bHRNaW5JdGVtSGVpZ2h0VW5pdCksXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0TWluSXRlbVdpZHRoOiBmb3JtYXRTaXplKHJlc29sdmVkRGltZW5zaW9ucy5kZWZhdWx0TWluSXRlbVdpZHRoLCByZXNvbHZlZERpbWVuc2lvbnMuZGVmYXVsdE1pbkl0ZW1XaWR0aFVuaXQpLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVySGVpZ2h0OiByZXNvbHZlZERpbWVuc2lvbnMuaGVhZGVySGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgZHJhZ1Byb3h5V2lkdGg6IHJlc29sdmVkRGltZW5zaW9ucy5kcmFnUHJveHlXaWR0aCxcclxuICAgICAgICAgICAgICAgIGRyYWdQcm94eUhlaWdodDogcmVzb2x2ZWREaW1lbnNpb25zLmRyYWdQcm94eUhlaWdodCxcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEZWZhdWx0TWluSXRlbUhlaWdodChkaW1lbnNpb25zOiBEaW1lbnNpb25zIHwgdW5kZWZpbmVkKTogU2l6ZVdpdGhVbml0IHtcclxuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gZGltZW5zaW9ucz8uZGVmYXVsdE1pbkl0ZW1IZWlnaHQ7XHJcbiAgICAgICAgICAgIGlmIChoZWlnaHQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc2l6ZTogUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucy5kZWZhdWx0cy5kZWZhdWx0TWluSXRlbUhlaWdodCwgc2l6ZVVuaXQ6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMuZGVmYXVsdHMuZGVmYXVsdE1pbkl0ZW1IZWlnaHRVbml0IH07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VTaXplKGhlaWdodCwgW1NpemVVbml0RW51bS5QaXhlbF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEZWZhdWx0TWluSXRlbVdpZHRoKGRpbWVuc2lvbnM6IERpbWVuc2lvbnMgfCB1bmRlZmluZWQpOiBTaXplV2l0aFVuaXQge1xyXG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IGRpbWVuc2lvbnM/LmRlZmF1bHRNaW5JdGVtV2lkdGg7XHJcbiAgICAgICAgICAgIGlmICh3aWR0aCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBzaXplOiBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zLmRlZmF1bHRzLmRlZmF1bHRNaW5JdGVtV2lkdGgsIHNpemVVbml0OiBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zLmRlZmF1bHRzLmRlZmF1bHRNaW5JdGVtV2lkdGhVbml0IH07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VTaXplKHdpZHRoLCBbU2l6ZVVuaXRFbnVtLlBpeGVsXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBMYWJlbHMge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKExheW91dENvbmZpZzpuYW1lc3BhY2UpLihIZWFkZXI6aW50ZXJmYWNlKS5jbG9zZX0gaW5zdGVhZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNsb3NlPzogc3RyaW5nO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChMYXlvdXRDb25maWc6bmFtZXNwYWNlKS4oSGVhZGVyOmludGVyZmFjZSkubWF4aW1pc2V9IGluc3RlYWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBtYXhpbWlzZT86IHN0cmluZztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoTGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKEhlYWRlcjppbnRlcmZhY2UpLm1pbmltaXNlfSBpbnN0ZWFkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgbWluaW1pc2U/OiBzdHJpbmc7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKExheW91dENvbmZpZzpuYW1lc3BhY2UpLihIZWFkZXI6aW50ZXJmYWNlKS5wb3Bpbn0gaW5zdGVhZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHBvcGluPzogc3RyaW5nO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChMYXlvdXRDb25maWc6bmFtZXNwYWNlKS4oSGVhZGVyOmludGVyZmFjZSkucG9wb3V0fSBpbnN0ZWFkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcG9wb3V0Pzogc3RyaW5nO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChMYXlvdXRDb25maWc6bmFtZXNwYWNlKS4oSGVhZGVyOmludGVyZmFjZSkudGFiRHJvcGRvd259IGluc3RlYWRcclxuICAgICAgICAgKi9cclxuICAgICAgICB0YWJEcm9wZG93bj86IHN0cmluZztcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIEhlYWRlciB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU3BlY2lmaWVzIHdoZXRoZXIgaGVhZGVyIHNob3VsZCBiZSBkaXNwbGF5ZWQsIGFuZCBpZiBzbywgb24gd2hpY2ggc2lkZS5cclxuICAgICAgICAgKiBJZiBmYWxzZSwgdGhlIGxheW91dCB3aWxsIGJlIGRpc3BsYXllZCB3aXRoIHNwbGl0dGVycyBvbmx5LlxyXG4gICAgICAgICAqIERlZmF1bHQ6ICd0b3AnXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc2hvdz86IGZhbHNlIHwgU2lkZTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdG9vbHRpcCB0ZXh0IHRoYXQgYXBwZWFycyB3aGVuIGhvdmVyaW5nIG92ZXIgdGhlIHBvcG91dCBpY29uIG9yIGZhbHNlIGlmIHBvcG91dCBidXR0b24gbm90IGRpc3BsYXllZC5cclxuICAgICAgICAgKiBEZWZhdWx0OiAnb3BlbiBpbiBuZXcgd2luZG93J1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHBvcG91dD86IGZhbHNlIHwgc3RyaW5nO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB0b29sdGlwIHRleHQgdGhhdCBhcHBlYXJzIHdoZW4gaG92ZXJpbmcgb3ZlciB0aGUgcG9waW4gaWNvbi5cclxuICAgICAgICAgKiBEZWZhdWx0OiAncG9wIGluJ1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHBvcGluPzogc3RyaW5nO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB0b29sdGlwIHRleHQgdGhhdCBhcHBlYXJzIHdoZW4gaG92ZXJpbmcgb3ZlciB0aGUgbWF4aW1pc2UgaWNvbiBvciBmYWxzZSBpZiBtYXhpbWlzZWQgYnV0dG9uIG5vdCBkaXNwbGF5ZWQuXHJcbiAgICAgICAgICogRGVmYXVsdDogJ21heGltaXNlJ1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIG1heGltaXNlPzogZmFsc2UgfCBzdHJpbmc7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHRvb2x0aXAgdGV4dCB0aGF0IGFwcGVhcnMgd2hlbiBob3ZlcmluZyBvdmVyIHRoZSBjbG9zZSBpY29uLlxyXG4gICAgICAgICAqIERlZmF1bHQ6ICdjbG9zZSdcclxuICAgICAgICAgKi9cclxuICAgICAgICBjbG9zZT86IGZhbHNlIHwgc3RyaW5nO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB0b29sdGlwIHRleHQgdGhhdCBhcHBlYXJzIHdoZW4gaG92ZXJpbmcgb3ZlciB0aGUgbWluaW1pc2UgaWNvbi5cclxuICAgICAgICAgKiBEZWZhdWx0OiAnbWluaW1pc2UnXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgbWluaW1pc2U/OiBzdHJpbmc7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBEZWZhdWx0OiAnYWRkaXRpb25hbCB0YWJzJ1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRhYkRyb3Bkb3duPzogZmFsc2UgfCBzdHJpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBIZWFkZXIge1xyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZShoZWFkZXI6IEhlYWRlciB8IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgc2V0dGluZ3M6IExheW91dENvbmZpZy5TZXR0aW5ncyB8IHVuZGVmaW5lZCwgbGFiZWxzOiBMYXlvdXRDb25maWcuTGFiZWxzIHwgdW5kZWZpbmVkXHJcbiAgICAgICAgKTogUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyIHtcclxuICAgICAgICAgICAgbGV0IHNob3c6IGZhbHNlIHwgU2lkZTtcclxuICAgICAgICAgICAgaWYgKGhlYWRlcj8uc2hvdyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBzaG93ID0gaGVhZGVyLnNob3c7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MgIT09IHVuZGVmaW5lZCAmJiBzZXR0aW5ncy5oYXNIZWFkZXJzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzaG93ID0gc2V0dGluZ3MuaGFzSGVhZGVycyA/IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlci5kZWZhdWx0cy5zaG93IDogZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHNob3cgPSBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIuZGVmYXVsdHMuc2hvdztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlciA9IHtcclxuICAgICAgICAgICAgICAgIHNob3csXHJcbiAgICAgICAgICAgICAgICBwb3BvdXQ6IGhlYWRlcj8ucG9wb3V0ID8/IGxhYmVscz8ucG9wb3V0ID8/XHJcbiAgICAgICAgICAgICAgICAgICAgKHNldHRpbmdzPy5zaG93UG9wb3V0SWNvbiA9PT0gZmFsc2UgPyBmYWxzZSA6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlci5kZWZhdWx0cy5wb3BvdXQpLFxyXG4gICAgICAgICAgICAgICAgcG9waW46IGhlYWRlcj8ucG9waW4gPz8gbGFiZWxzPy5wb3BpbiA/PyBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIuZGVmYXVsdHMucG9waW4sXHJcbiAgICAgICAgICAgICAgICBtYXhpbWlzZTogaGVhZGVyPy5tYXhpbWlzZSA/PyBsYWJlbHM/Lm1heGltaXNlID8/XHJcbiAgICAgICAgICAgICAgICAgICAgKHNldHRpbmdzPy5zaG93TWF4aW1pc2VJY29uID09PSBmYWxzZSA/IGZhbHNlIDogUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyLmRlZmF1bHRzLm1heGltaXNlKSxcclxuICAgICAgICAgICAgICAgIGNsb3NlOiBoZWFkZXI/LmNsb3NlID8/IGxhYmVscz8uY2xvc2UgPz9cclxuICAgICAgICAgICAgICAgICAgICAoc2V0dGluZ3M/LnNob3dDbG9zZUljb24gPT09IGZhbHNlID8gZmFsc2UgOiBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIuZGVmYXVsdHMuY2xvc2UpLFxyXG4gICAgICAgICAgICAgICAgbWluaW1pc2U6IGhlYWRlcj8ubWluaW1pc2UgPz8gbGFiZWxzPy5taW5pbWlzZSA/PyBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIuZGVmYXVsdHMubWluaW1pc2UsXHJcbiAgICAgICAgICAgICAgICB0YWJEcm9wZG93bjogaGVhZGVyPy50YWJEcm9wZG93biA/PyBsYWJlbHM/LnRhYkRyb3Bkb3duID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlci5kZWZhdWx0cy50YWJEcm9wZG93bixcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNQb3BvdXQoY29uZmlnOiBMYXlvdXRDb25maWcpOiBjb25maWcgaXMgUG9wb3V0TGF5b3V0Q29uZmlnIHtcclxuICAgICAgICByZXR1cm4gJ3BhcmVudElkJyBpbiBjb25maWcgfHwgJ2luZGV4SW5QYXJlbnQnIGluIGNvbmZpZyB8fCAnd2luZG93JyBpbiBjb25maWc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUobGF5b3V0Q29uZmlnOiBMYXlvdXRDb25maWcpOiBSZXNvbHZlZExheW91dENvbmZpZyB7XHJcbiAgICAgICAgaWYgKGlzUG9wb3V0KGxheW91dENvbmZpZykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFBvcG91dExheW91dENvbmZpZy5yZXNvbHZlKGxheW91dENvbmZpZyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHJvb3Q6IFJvb3RJdGVtQ29uZmlnIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBpZiAobGF5b3V0Q29uZmlnLnJvb3QgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcm9vdCA9IGxheW91dENvbmZpZy5yb290O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGxheW91dENvbmZpZy5jb250ZW50ICE9PSB1bmRlZmluZWQgJiYgbGF5b3V0Q29uZmlnLmNvbnRlbnQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvb3QgPSBsYXlvdXRDb25maWcuY29udGVudFswXTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm9vdCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBjb25maWc6IFJlc29sdmVkTGF5b3V0Q29uZmlnID0ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZWQ6IHRydWUsXHJcbiAgICAgICAgICAgICAgICByb290OiBSb290SXRlbUNvbmZpZy5yZXNvbHZlKHJvb3QpLFxyXG4gICAgICAgICAgICAgICAgb3BlblBvcG91dHM6IExheW91dENvbmZpZy5yZXNvbHZlT3BlblBvcG91dHMobGF5b3V0Q29uZmlnLm9wZW5Qb3BvdXRzKSxcclxuICAgICAgICAgICAgICAgIGRpbWVuc2lvbnM6IExheW91dENvbmZpZy5EaW1lbnNpb25zLnJlc29sdmUobGF5b3V0Q29uZmlnLmRpbWVuc2lvbnMpLFxyXG4gICAgICAgICAgICAgICAgc2V0dGluZ3M6IExheW91dENvbmZpZy5TZXR0aW5ncy5yZXNvbHZlKGxheW91dENvbmZpZy5zZXR0aW5ncyksXHJcbiAgICAgICAgICAgICAgICBoZWFkZXI6IExheW91dENvbmZpZy5IZWFkZXIucmVzb2x2ZShsYXlvdXRDb25maWcuaGVhZGVyLCBsYXlvdXRDb25maWcuc2V0dGluZ3MsIGxheW91dENvbmZpZy5sYWJlbHMpLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBjb25maWc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBmcm9tUmVzb2x2ZWQoY29uZmlnOiBSZXNvbHZlZExheW91dENvbmZpZyk6IExheW91dENvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBMYXlvdXRDb25maWcgPSB7XHJcbiAgICAgICAgICAgIHJvb3Q6IFJvb3RJdGVtQ29uZmlnLmZyb21SZXNvbHZlZE9yVW5kZWZpbmVkKGNvbmZpZy5yb290KSxcclxuICAgICAgICAgICAgb3BlblBvcG91dHM6IFBvcG91dExheW91dENvbmZpZy5mcm9tUmVzb2x2ZWRBcnJheShjb25maWcub3BlblBvcG91dHMpLFxyXG4gICAgICAgICAgICBzZXR0aW5nczogUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuY3JlYXRlQ29weShjb25maWcuc2V0dGluZ3MpLFxyXG4gICAgICAgICAgICBkaW1lbnNpb25zOiBMYXlvdXRDb25maWcuRGltZW5zaW9ucy5mcm9tUmVzb2x2ZWQoY29uZmlnLmRpbWVuc2lvbnMpLFxyXG4gICAgICAgICAgICBoZWFkZXI6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlci5jcmVhdGVDb3B5KGNvbmZpZy5oZWFkZXIpLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNSZXNvbHZlZChjb25maWdPclJlc29sdmVkQ29uZmlnOiBSZXNvbHZlZExheW91dENvbmZpZyB8IExheW91dENvbmZpZyk6IGNvbmZpZ09yUmVzb2x2ZWRDb25maWcgaXMgUmVzb2x2ZWRMYXlvdXRDb25maWcge1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGNvbmZpZ09yUmVzb2x2ZWRDb25maWcgYXMgUmVzb2x2ZWRMYXlvdXRDb25maWc7XHJcbiAgICAgICAgcmV0dXJuIGNvbmZpZy5yZXNvbHZlZCAhPT0gdW5kZWZpbmVkICYmIChjb25maWcucmVzb2x2ZWQgPT09IHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlT3BlblBvcG91dHMocG9wb3V0Q29uZmlnczogUG9wb3V0TGF5b3V0Q29uZmlnW10gfCB1bmRlZmluZWQpOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZ1tdIHtcclxuICAgICAgICBpZiAocG9wb3V0Q29uZmlncyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBjb3VudCA9IHBvcG91dENvbmZpZ3MubGVuZ3RoO1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8UmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWc+KGNvdW50KTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBQb3BvdXRMYXlvdXRDb25maWcucmVzb2x2ZShwb3BvdXRDb25maWdzW2ldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBQb3BvdXRMYXlvdXRDb25maWcgZXh0ZW5kcyBMYXlvdXRDb25maWcge1xyXG4gICAgLyoqIFRoZSBpZCBvZiB0aGUgZWxlbWVudCB0aGUgaXRlbSB3aWxsIGJlIGFwcGVuZGVkIHRvIG9uIHBvcEluXHJcbiAgICAqIElmIG51bGwsIGFwcGVuZCB0byB0b3Btb3N0IGxheW91dCBlbGVtZW50XHJcbiAgICAqL1xyXG4gICAgcGFyZW50SWQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ7XHJcbiAgICAvKiogVGhlIHBvc2l0aW9uIG9mIHRoaXMgZWxlbWVudCB3aXRoaW4gaXRzIHBhcmVudFxyXG4gICAgKiBJZiBudWxsLCBwb3NpdGlvbiBpcyBsYXN0XHJcbiAgICAqL1xyXG4gICAgaW5kZXhJblBhcmVudDogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZDtcclxuICAgIC8qKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChQb3BvdXRMYXlvdXRDb25maWc6aW50ZXJmYWNlKS53aW5kb3d9ICovXHJcbiAgICBkaW1lbnNpb25zOiBQb3BvdXRMYXlvdXRDb25maWcuRGltZW5zaW9ucyB8IHVuZGVmaW5lZDsgLy8gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XHJcbiAgICB3aW5kb3c6IFBvcG91dExheW91dENvbmZpZy5XaW5kb3cgfCB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgUG9wb3V0TGF5b3V0Q29uZmlnIHtcclxuICAgIC8vIFByZXZpb3VzIHZlcnNpb25zIGtlcHQgd2luZG93IGluZm9ybWF0aW9uIGluIERpbWVuc2lvbnMga2V5LiAgT25seSB1c2UgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoUG9wb3V0TGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKFdpbmRvdzppbnRlcmZhY2UpfSAqL1xyXG4gICAgZXhwb3J0IGludGVyZmFjZSBEaW1lbnNpb25zIGV4dGVuZHMgTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMge1xyXG4gICAgICAgIC8qKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChQb3BvdXRMYXlvdXRDb25maWc6bmFtZXNwYWNlKS4oV2luZG93OmludGVyZmFjZSkud2lkdGh9ICovXHJcbiAgICAgICAgd2lkdGg/OiBudW1iZXIgfCBudWxsLFxyXG4gICAgICAgIC8qKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChQb3BvdXRMYXlvdXRDb25maWc6bmFtZXNwYWNlKS4oV2luZG93OmludGVyZmFjZSkuaGVpZ2h0fSAqL1xyXG4gICAgICAgIGhlaWdodD86IG51bWJlciB8IG51bGwsXHJcbiAgICAgICAgLyoqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKFBvcG91dExheW91dENvbmZpZzpuYW1lc3BhY2UpLihXaW5kb3c6aW50ZXJmYWNlKS5sZWZ0fSAqL1xyXG4gICAgICAgIGxlZnQ/OiBudW1iZXIgfCBudWxsLFxyXG4gICAgICAgIC8qKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChQb3BvdXRMYXlvdXRDb25maWc6bmFtZXNwYWNlKS4oV2luZG93OmludGVyZmFjZSkudG9wfSAqL1xyXG4gICAgICAgIHRvcD86IG51bWJlciB8IG51bGwsXHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBXaW5kb3cge1xyXG4gICAgICAgIHdpZHRoPzogbnVtYmVyLFxyXG4gICAgICAgIGhlaWdodD86IG51bWJlcixcclxuICAgICAgICBsZWZ0PzogbnVtYmVyLFxyXG4gICAgICAgIHRvcD86IG51bWJlcixcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgbmFtZXNwYWNlIFdpbmRvdyB7XHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKHdpbmRvdzogV2luZG93IHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBkaW1lbnNpb25zOiBEaW1lbnNpb25zIHwgdW5kZWZpbmVkKTogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcuV2luZG93XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0OiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZy5XaW5kb3c7XHJcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRzID0gUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcuV2luZG93LmRlZmF1bHRzO1xyXG4gICAgICAgICAgICBpZiAod2luZG93ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHtcclxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogd2luZG93LndpZHRoID8/IGRlZmF1bHRzLndpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogd2luZG93LmhlaWdodCA/PyBkZWZhdWx0cy5oZWlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogd2luZG93LmxlZnQgPz8gZGVmYXVsdHMubGVmdCxcclxuICAgICAgICAgICAgICAgICAgICB0b3A6IHdpbmRvdy50b3AgPz8gZGVmYXVsdHMudG9wLFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiBkaW1lbnNpb25zPy53aWR0aCA/PyBkZWZhdWx0cy53aWR0aCxcclxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGRpbWVuc2lvbnM/LmhlaWdodCA/PyBkZWZhdWx0cy5oZWlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogZGltZW5zaW9ucz8ubGVmdCA/PyBkZWZhdWx0cy5sZWZ0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRvcDogZGltZW5zaW9ucz8udG9wID8/IGRlZmF1bHRzLnRvcCxcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIGV4cG9ydCBmdW5jdGlvbiBmcm9tUmVzb2x2ZWQocmVzb2x2ZWRXaW5kb3c6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLldpbmRvdyk6IFdpbmRvdyB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogV2luZG93ID0ge1xyXG4gICAgICAgICAgICAgICAgd2lkdGg6IHJlc29sdmVkV2luZG93LndpZHRoID09PSBudWxsID8gdW5kZWZpbmVkIDogcmVzb2x2ZWRXaW5kb3cud2lkdGgsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHJlc29sdmVkV2luZG93LmhlaWdodCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IHJlc29sdmVkV2luZG93LmhlaWdodCxcclxuICAgICAgICAgICAgICAgIGxlZnQ6IHJlc29sdmVkV2luZG93LmxlZnQgPT09IG51bGwgPyB1bmRlZmluZWQgOiByZXNvbHZlZFdpbmRvdy5sZWZ0LFxyXG4gICAgICAgICAgICAgICAgdG9wOiByZXNvbHZlZFdpbmRvdy50b3AgPT09IG51bGwgPyB1bmRlZmluZWQgOiByZXNvbHZlZFdpbmRvdy50b3AsXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKHBvcG91dENvbmZpZzogUG9wb3V0TGF5b3V0Q29uZmlnKTogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcge1xyXG4gICAgICAgIGxldCByb290OiBSb290SXRlbUNvbmZpZyB8IHVuZGVmaW5lZDtcclxuICAgICAgICBpZiAocG9wb3V0Q29uZmlnLnJvb3QgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByb290ID0gcG9wb3V0Q29uZmlnLnJvb3Q7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHBvcG91dENvbmZpZy5jb250ZW50ICE9PSB1bmRlZmluZWQgJiYgcG9wb3V0Q29uZmlnLmNvbnRlbnQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgcm9vdCA9IHBvcG91dENvbmZpZy5jb250ZW50WzBdO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcm9vdCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgY29uZmlnOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyA9IHtcclxuICAgICAgICAgICAgcm9vdDogUm9vdEl0ZW1Db25maWcucmVzb2x2ZShyb290KSxcclxuICAgICAgICAgICAgb3BlblBvcG91dHM6IExheW91dENvbmZpZy5yZXNvbHZlT3BlblBvcG91dHMocG9wb3V0Q29uZmlnLm9wZW5Qb3BvdXRzKSxcclxuICAgICAgICAgICAgZGltZW5zaW9uczogTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMucmVzb2x2ZShwb3BvdXRDb25maWcuZGltZW5zaW9ucyksXHJcbiAgICAgICAgICAgIHNldHRpbmdzOiBMYXlvdXRDb25maWcuU2V0dGluZ3MucmVzb2x2ZShwb3BvdXRDb25maWcuc2V0dGluZ3MpLFxyXG4gICAgICAgICAgICBoZWFkZXI6IExheW91dENvbmZpZy5IZWFkZXIucmVzb2x2ZShwb3BvdXRDb25maWcuaGVhZGVyLCBwb3BvdXRDb25maWcuc2V0dGluZ3MsIHBvcG91dENvbmZpZy5sYWJlbHMpLFxyXG4gICAgICAgICAgICBwYXJlbnRJZDogcG9wb3V0Q29uZmlnLnBhcmVudElkID8/IG51bGwsXHJcbiAgICAgICAgICAgIGluZGV4SW5QYXJlbnQ6IHBvcG91dENvbmZpZy5pbmRleEluUGFyZW50ID8/IG51bGwsXHJcbiAgICAgICAgICAgIHdpbmRvdzogUG9wb3V0TGF5b3V0Q29uZmlnLldpbmRvdy5yZXNvbHZlKHBvcG91dENvbmZpZy53aW5kb3csIHBvcG91dENvbmZpZy5kaW1lbnNpb25zKSxcclxuICAgICAgICAgICAgcmVzb2x2ZWQ6IHRydWUsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb25maWc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGZyb21SZXNvbHZlZChyZXNvbHZlZENvbmZpZzogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcpOiBQb3BvdXRMYXlvdXRDb25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogUG9wb3V0TGF5b3V0Q29uZmlnID0ge1xyXG4gICAgICAgICAgICByb290OiBSb290SXRlbUNvbmZpZy5mcm9tUmVzb2x2ZWRPclVuZGVmaW5lZChyZXNvbHZlZENvbmZpZy5yb290KSxcclxuICAgICAgICAgICAgb3BlblBvcG91dHM6IGZyb21SZXNvbHZlZEFycmF5KHJlc29sdmVkQ29uZmlnLm9wZW5Qb3BvdXRzKSxcclxuICAgICAgICAgICAgZGltZW5zaW9uczogTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMuZnJvbVJlc29sdmVkKHJlc29sdmVkQ29uZmlnLmRpbWVuc2lvbnMpLFxyXG4gICAgICAgICAgICBzZXR0aW5nczogUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuY3JlYXRlQ29weShyZXNvbHZlZENvbmZpZy5zZXR0aW5ncyksXHJcbiAgICAgICAgICAgIGhlYWRlcjogUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyLmNyZWF0ZUNvcHkocmVzb2x2ZWRDb25maWcuaGVhZGVyKSxcclxuICAgICAgICAgICAgcGFyZW50SWQ6IHJlc29sdmVkQ29uZmlnLnBhcmVudElkLFxyXG4gICAgICAgICAgICBpbmRleEluUGFyZW50OiByZXNvbHZlZENvbmZpZy5pbmRleEluUGFyZW50LFxyXG4gICAgICAgICAgICB3aW5kb3c6IFBvcG91dExheW91dENvbmZpZy5XaW5kb3cuZnJvbVJlc29sdmVkKHJlc29sdmVkQ29uZmlnLndpbmRvdyksXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBmcm9tUmVzb2x2ZWRBcnJheShyZXNvbHZlZEFycmF5OiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZ1tdKTogUG9wb3V0TGF5b3V0Q29uZmlnW10ge1xyXG4gICAgICAgIGNvbnN0IHJlc29sdmVkT3BlblBvcG91dENvdW50ID0gcmVzb2x2ZWRBcnJheS5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PFBvcG91dExheW91dENvbmZpZz4ocmVzb2x2ZWRPcGVuUG9wb3V0Q291bnQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzb2x2ZWRPcGVuUG9wb3V0Q291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZE9wZW5Qb3BvdXQgPSByZXNvbHZlZEFycmF5W2ldO1xyXG4gICAgICAgICAgICByZXN1bHRbaV0gPSBQb3BvdXRMYXlvdXRDb25maWcuZnJvbVJlc29sdmVkKHJlc29sdmVkT3BlblBvcG91dCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2l6ZVdpdGhVbml0IHtcclxuICAgIHNpemU6IG51bWJlcjtcclxuICAgIHNpemVVbml0OiBTaXplVW5pdEVudW07XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGludGVyZmFjZSBVbmRlZmluYWJsZVNpemVXaXRoVW5pdCB7XHJcbiAgICBzaXplOiBudW1iZXIgfCB1bmRlZmluZWQ7XHJcbiAgICBzaXplVW5pdDogU2l6ZVVuaXRFbnVtO1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNpemUoc2l6ZVN0cmluZzogc3RyaW5nLCBhbGxvd2FibGVTaXplVW5pdHM6IHJlYWRvbmx5IFNpemVVbml0RW51bVtdKTogU2l6ZVdpdGhVbml0IHtcclxuICAgIGNvbnN0IHsgbnVtZXJpY1BhcnQ6IGRpZ2l0c1BhcnQsIGZpcnN0Tm9uTnVtZXJpY0NoYXJQYXJ0OiBmaXJzdE5vbkRpZ2l0UGFydCB9ID0gc3BsaXRTdHJpbmdBdEZpcnN0Tm9uTnVtZXJpY0NoYXIoc2l6ZVN0cmluZyk7XHJcbiAgICBjb25zdCBzaXplID0gTnVtYmVyLnBhcnNlSW50KGRpZ2l0c1BhcnQsIDEwKTtcclxuICAgIGlmIChpc05hTihzaXplKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoYCR7aTE4blN0cmluZ3NbSTE4blN0cmluZ0lkLkludmFsaWROdW1iZXJQYXJ0SW5TaXplU3RyaW5nXX06ICR7c2l6ZVN0cmluZ31gKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3Qgc2l6ZVVuaXQgPSBTaXplVW5pdEVudW0udHJ5UGFyc2UoZmlyc3ROb25EaWdpdFBhcnQpO1xyXG4gICAgICAgIGlmIChzaXplVW5pdCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoYCR7aTE4blN0cmluZ3NbSTE4blN0cmluZ0lkLlVua25vd25Vbml0SW5TaXplU3RyaW5nXX06ICR7c2l6ZVN0cmluZ31gKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghYWxsb3dhYmxlU2l6ZVVuaXRzLmluY2x1ZGVzKHNpemVVbml0KSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcihgJHtpMThuU3RyaW5nc1tJMThuU3RyaW5nSWQuVW5zdXBwb3J0ZWRVbml0SW5TaXplU3RyaW5nXX06ICR7c2l6ZVN0cmluZ31gKVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc2l6ZSwgc2l6ZVVuaXQgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0U2l6ZShzaXplOiBudW1iZXIsIHNpemVVbml0OiBTaXplVW5pdEVudW0pIHtcclxuICAgIHJldHVybiBzaXplLnRvU3RyaW5nKDEwKSArIFNpemVVbml0RW51bS5mb3JtYXQoc2l6ZVVuaXQpO1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRVbmRlZmluYWJsZVNpemUoc2l6ZTogbnVtYmVyfCB1bmRlZmluZWQsIHNpemVVbml0OiBTaXplVW5pdEVudW0pIHtcclxuICAgIGlmIChzaXplID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gc2l6ZS50b1N0cmluZygxMCkgKyBTaXplVW5pdEVudW0uZm9ybWF0KHNpemVVbml0KTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgQGRlcHJlY2F0ZWQgLSB1c2Uge0BsaW5rIChMYXlvdXRDb25maWc6aW50ZXJmYWNlKX0gKi9cclxuZXhwb3J0IHR5cGUgQ29uZmlnID0gTGF5b3V0Q29uZmlnO1xyXG4iLCJpbXBvcnQgeyBBc3NlcnRFcnJvciwgVW5yZWFjaGFibGVDYXNlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBDb25maWdNaW5pZmllciB9IGZyb20gJy4uL3V0aWxzL2NvbmZpZy1taW5pZmllcic7XHJcbmltcG9ydCB7IEl0ZW1UeXBlLCBKc29uVmFsdWUsIFJlc3BvbnNpdmVNb2RlLCBTaWRlLCBTaXplVW5pdEVudW0gfSBmcm9tICcuLi91dGlscy90eXBlcyc7XHJcbmltcG9ydCB7IGRlZXBFeHRlbmRWYWx1ZSB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRJdGVtQ29uZmlnIHtcclxuICAgIC8vIHNlZSBJdGVtQ29uZmlnIGZvciBjb21tZW50c1xyXG4gICAgcmVhZG9ubHkgdHlwZTogSXRlbVR5cGU7XHJcbiAgICByZWFkb25seSBjb250ZW50OiByZWFkb25seSBSZXNvbHZlZEl0ZW1Db25maWdbXTtcclxuICAgIHJlYWRvbmx5IHNpemU6IG51bWJlcjtcclxuICAgIHJlYWRvbmx5IHNpemVVbml0OiBTaXplVW5pdEVudW07XHJcbiAgICByZWFkb25seSBtaW5TaXplOiBudW1iZXIgfCB1bmRlZmluZWQ7XHJcbiAgICByZWFkb25seSBtaW5TaXplVW5pdDogU2l6ZVVuaXRFbnVtO1xyXG4gICAgLy8gaWQgbm8gbG9uZ2VyIHNwZWNpZmllcyB3aGV0aGVyIGFuIEl0ZW0gaXMgbWF4aW1pc2VkLiAgVGhpcyBpcyBub3cgZG9uZSBieSBIZWFkZXJJdGVtQ29uZmlnLm1heGltaXNlZFxyXG4gICAgcmVhZG9ubHkgaWQ6IHN0cmluZztcclxuICAgIHJlYWRvbmx5IGlzQ2xvc2FibGU6IGJvb2xlYW47XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgUmVzb2x2ZWRJdGVtQ29uZmlnIHtcclxuICAgIGV4cG9ydCBjb25zdCBkZWZhdWx0czogUmVzb2x2ZWRJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgIHR5cGU6IEl0ZW1UeXBlLmdyb3VuZCwgLy8gbm90IHJlYWxseSBkZWZhdWx0IGJ1dCBuZWVkIHNvbWV0aGluZ1xyXG4gICAgICAgIGNvbnRlbnQ6IFtdLFxyXG4gICAgICAgIHNpemU6IDEsXHJcbiAgICAgICAgc2l6ZVVuaXQ6IFNpemVVbml0RW51bS5GcmFjdGlvbmFsLFxyXG4gICAgICAgIG1pblNpemU6IHVuZGVmaW5lZCxcclxuICAgICAgICBtaW5TaXplVW5pdDogU2l6ZVVuaXRFbnVtLlBpeGVsLFxyXG4gICAgICAgIGlkOiAnJyxcclxuICAgICAgICBpc0Nsb3NhYmxlOiB0cnVlLFxyXG4gICAgfSBhcyBjb25zdDtcclxuXHJcbiAgICAvKiogQ3JlYXRlcyBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIFJlc29sdmVkSXRlbUNvbmZpZyB1c2luZyBhbiBhbHRlcm5hdGl2ZSBjb250ZW50IGlmIHNwZWNpZmllZCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvcHkob3JpZ2luYWw6IFJlc29sdmVkSXRlbUNvbmZpZywgY29udGVudD86IFJlc29sdmVkSXRlbUNvbmZpZ1tdKTogUmVzb2x2ZWRJdGVtQ29uZmlnIHtcclxuICAgICAgICBzd2l0Y2ggKG9yaWdpbmFsLnR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5ncm91bmQ6XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUucm93OlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbHVtbjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZy5jcmVhdGVDb3B5KG9yaWdpbmFsIGFzIFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgYXMgUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcuQ2hpbGRJdGVtQ29uZmlnW10pO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5zdGFjazpcclxuICAgICAgICAgICAgICAgIHJldHVybiBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZy5jcmVhdGVDb3B5KG9yaWdpbmFsIGFzIFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnLCBjb250ZW50IGFzIFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZ1tdKTtcclxuXHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29tcG9uZW50OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZy5jcmVhdGVDb3B5KG9yaWdpbmFsIGFzIFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyk7XHJcblxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVucmVhY2hhYmxlQ2FzZUVycm9yKCdDSUNDOTEzNTQnLCBvcmlnaW5hbC50eXBlLCAnSW52YWxpZCBDb25maWcgSXRlbSB0eXBlIHNwZWNpZmllZCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdCh0eXBlOiBJdGVtVHlwZSk6IFJlc29sdmVkSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuZ3JvdW5kOlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdDSUNDRFI5MTU2MicpOyAvLyBHZXQgZGVmYXVsdCByb290IGZyb20gTGF5b3V0Q29uZmlnXHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUucm93OlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbHVtbjpcclxuICAgICAgICAgICAgICAgIHJldHVybiBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZy5jcmVhdGVEZWZhdWx0KHR5cGUpO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5zdGFjazpcclxuICAgICAgICAgICAgICAgIHJldHVybiBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZy5jcmVhdGVEZWZhdWx0KCk7XHJcblxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbXBvbmVudDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcuY3JlYXRlRGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnJlYWNoYWJsZUNhc2VFcnJvcignQ0lDQ0REOTE1NjMnLCB0eXBlLCAnSW52YWxpZCBDb25maWcgSXRlbSB0eXBlIHNwZWNpZmllZCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNDb21wb25lbnRJdGVtKGl0ZW1Db25maWc6IFJlc29sdmVkSXRlbUNvbmZpZyk6IGl0ZW1Db25maWcgaXMgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnIHtcclxuICAgICAgICByZXR1cm4gaXRlbUNvbmZpZy50eXBlID09PSBJdGVtVHlwZS5jb21wb25lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzU3RhY2tJdGVtKGl0ZW1Db25maWc6IFJlc29sdmVkSXRlbUNvbmZpZyk6IGl0ZW1Db25maWcgaXMgUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcge1xyXG4gICAgICAgIHJldHVybiBpdGVtQ29uZmlnLnR5cGUgPT09IEl0ZW1UeXBlLnN0YWNrO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0dyb3VuZEl0ZW0oaXRlbUNvbmZpZzogUmVzb2x2ZWRJdGVtQ29uZmlnKTogaXRlbUNvbmZpZyBpcyBSZXNvbHZlZEdyb3VuZEl0ZW1Db25maWcge1xyXG4gICAgICAgIHJldHVybiBpdGVtQ29uZmlnLnR5cGUgPT09IEl0ZW1UeXBlLmdyb3VuZDtcclxuICAgIH1cclxufVxyXG5cclxuLy8gU3RhY2sgb3IgQ29tcG9uZW50XHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcgZXh0ZW5kcyBSZXNvbHZlZEl0ZW1Db25maWcge1xyXG4gICAgaGVhZGVyOiBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXIgfCB1bmRlZmluZWQ7IC8vIHVuZGVmaW5lZCBtZWFucyBnZXQgaGVhZGVyIHNldHRpbmdzIGZyb20gTGF5b3V0Q29uZmlnXHJcbiAgICByZWFkb25seSBtYXhpbWlzZWQ6IGJvb2xlYW47XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcge1xyXG4gICAgZXhwb3J0IGNvbnN0IGRlZmF1bHRNYXhpbWlzZWQgPSBmYWxzZTtcclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIEhlYWRlciB7XHJcbiAgICAgICAgLy8gdW5kZWZpbmVkIG1lYW5zIGdldCBwcm9wZXJ0eSB2YWx1ZSBmcm9tIExheW91dENvbmZpZ1xyXG4gICAgICAgIHJlYWRvbmx5IHNob3c6IGZhbHNlIHwgU2lkZSB8IHVuZGVmaW5lZDtcclxuICAgICAgICByZWFkb25seSBwb3BvdXQ6IGZhbHNlIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIHJlYWRvbmx5IG1heGltaXNlOiBmYWxzZSB8IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICAgICAgICByZWFkb25seSBjbG9zZTogZmFsc2UgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgcmVhZG9ubHkgbWluaW1pc2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICAgICAgICByZWFkb25seSB0YWJEcm9wZG93bjogZmFsc2UgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBIZWFkZXIge1xyXG4gICAgICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb3B5KG9yaWdpbmFsOiBIZWFkZXIgfCB1bmRlZmluZWQsIHNob3c/OiBmYWxzZSB8IFNpZGUpOiBIZWFkZXIgfCB1bmRlZmluZWQge1xyXG4gICAgICAgICAgICBpZiAob3JpZ2luYWwgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvdzogc2hvdyA/PyBvcmlnaW5hbC5zaG93LFxyXG4gICAgICAgICAgICAgICAgICAgIHBvcG91dDogb3JpZ2luYWwucG9wb3V0LFxyXG4gICAgICAgICAgICAgICAgICAgIGNsb3NlOiBvcmlnaW5hbC5jbG9zZSxcclxuICAgICAgICAgICAgICAgICAgICBtYXhpbWlzZTogb3JpZ2luYWwubWF4aW1pc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgbWluaW1pc2U6IG9yaWdpbmFsLm1pbmltaXNlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRhYkRyb3Bkb3duOiBvcmlnaW5hbC50YWJEcm9wZG93bixcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZyBleHRlbmRzIFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnIHtcclxuICAgIHJlYWRvbmx5IHR5cGU6ICdzdGFjayc7XHJcbiAgICByZWFkb25seSBjb250ZW50OiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWdbXTtcclxuICAgIC8qKiBUaGUgaW5kZXggb2YgdGhlIGFjdGl2ZSBpdGVtIGluIHRoZSBTdGFjay4gIE9ubHkgdW5kZWZpbmVkIGlmIHRoZSBTdGFjayBpcyBlbXB0eS4gKi9cclxuICAgIHJlYWRvbmx5IGFjdGl2ZUl0ZW1JbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnIHtcclxuICAgIGV4cG9ydCBjb25zdCBkZWZhdWx0QWN0aXZlSXRlbUluZGV4ID0gMDtcclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29weShvcmlnaW5hbDogUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcsIGNvbnRlbnQ/OiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWdbXSk6IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiBvcmlnaW5hbC50eXBlLFxyXG4gICAgICAgICAgICBjb250ZW50OiBjb250ZW50ICE9PSB1bmRlZmluZWQgPyBjb3B5Q29udGVudChjb250ZW50KSA6IGNvcHlDb250ZW50KG9yaWdpbmFsLmNvbnRlbnQpLFxyXG4gICAgICAgICAgICBzaXplOiBvcmlnaW5hbC5zaXplLFxyXG4gICAgICAgICAgICBzaXplVW5pdDogb3JpZ2luYWwuc2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIG1pblNpemU6IG9yaWdpbmFsLm1pblNpemUsXHJcbiAgICAgICAgICAgIG1pblNpemVVbml0OiBvcmlnaW5hbC5taW5TaXplVW5pdCxcclxuICAgICAgICAgICAgaWQ6IG9yaWdpbmFsLmlkLFxyXG4gICAgICAgICAgICBtYXhpbWlzZWQ6IG9yaWdpbmFsLm1heGltaXNlZCxcclxuICAgICAgICAgICAgaXNDbG9zYWJsZTogb3JpZ2luYWwuaXNDbG9zYWJsZSxcclxuICAgICAgICAgICAgYWN0aXZlSXRlbUluZGV4OiBvcmlnaW5hbC5hY3RpdmVJdGVtSW5kZXgsXHJcbiAgICAgICAgICAgIGhlYWRlcjogUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyLmNyZWF0ZUNvcHkob3JpZ2luYWwuaGVhZGVyKSxcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY29weUNvbnRlbnQob3JpZ2luYWw6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZ1tdKTogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnW10ge1xyXG4gICAgICAgIGNvbnN0IGNvdW50ID0gb3JpZ2luYWwubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWc+KGNvdW50KTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgcmVzdWx0W2ldID0gUmVzb2x2ZWRJdGVtQ29uZmlnLmNyZWF0ZUNvcHkob3JpZ2luYWxbaV0pIGFzIFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdCgpOiBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogSXRlbVR5cGUuc3RhY2ssXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IFtdLFxyXG4gICAgICAgICAgICBzaXplOiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuc2l6ZSxcclxuICAgICAgICAgICAgc2l6ZVVuaXQ6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5zaXplVW5pdCxcclxuICAgICAgICAgICAgbWluU2l6ZTogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLm1pblNpemUsXHJcbiAgICAgICAgICAgIG1pblNpemVVbml0OiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMubWluU2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIGlkOiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuaWQsXHJcbiAgICAgICAgICAgIG1heGltaXNlZDogUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcuZGVmYXVsdE1heGltaXNlZCxcclxuICAgICAgICAgICAgaXNDbG9zYWJsZTogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLmlzQ2xvc2FibGUsXHJcbiAgICAgICAgICAgIGFjdGl2ZUl0ZW1JbmRleDogZGVmYXVsdEFjdGl2ZUl0ZW1JbmRleCxcclxuICAgICAgICAgICAgaGVhZGVyOiB1bmRlZmluZWQsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnIGV4dGVuZHMgUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcge1xyXG4gICAgLy8gc2VlIENvbXBvbmVudEl0ZW1Db25maWcgZm9yIGNvbW1lbnRzXHJcbiAgICByZWFkb25seSB0eXBlOiAnY29tcG9uZW50JztcclxuICAgIHJlYWRvbmx5IGNvbnRlbnQ6IFtdO1xyXG4gICAgcmVhZG9ubHkgdGl0bGU6IHN0cmluZztcclxuICAgIHJlYWRvbmx5IHJlb3JkZXJFbmFibGVkOiBib29sZWFuOyAvLyBUYWtlcyBwcmVjZWRlbmNlIG92ZXIgTGF5b3V0Q29uZmlnLnJlb3JkZXJFbmFibGVkLlxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IGFzIHNwZWNpZmllZCBpbiBsYXlvdXQucmVnaXN0ZXJDb21wb25lbnQuIE1hbmRhdG9yeSBpZiB0eXBlIGlzICdjb21wb25lbnQnLlxyXG4gICAgICovXHJcbiAgICByZWFkb25seSBjb21wb25lbnRUeXBlOiBKc29uVmFsdWU7XHJcbiAgICByZWFkb25seSBjb21wb25lbnRTdGF0ZT86IEpzb25WYWx1ZTtcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcge1xyXG4gICAgZXhwb3J0IGNvbnN0IGRlZmF1bHRSZW9yZGVyRW5hYmxlZCA9IHRydWU7XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVDb21wb25lbnRUeXBlTmFtZShpdGVtQ29uZmlnOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudFR5cGUgPSBpdGVtQ29uZmlnLmNvbXBvbmVudFR5cGU7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnRUeXBlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICByZXR1cm4gY29tcG9uZW50VHlwZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29weShvcmlnaW5hbDogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnKTogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogb3JpZ2luYWwudHlwZSxcclxuICAgICAgICAgICAgY29udGVudDogW10sXHJcbiAgICAgICAgICAgIHNpemU6IG9yaWdpbmFsLnNpemUsXHJcbiAgICAgICAgICAgIHNpemVVbml0OiBvcmlnaW5hbC5zaXplVW5pdCxcclxuICAgICAgICAgICAgbWluU2l6ZTogb3JpZ2luYWwubWluU2l6ZSxcclxuICAgICAgICAgICAgbWluU2l6ZVVuaXQ6IG9yaWdpbmFsLm1pblNpemVVbml0LFxyXG4gICAgICAgICAgICBpZDogb3JpZ2luYWwuaWQsXHJcbiAgICAgICAgICAgIG1heGltaXNlZDogb3JpZ2luYWwubWF4aW1pc2VkLFxyXG4gICAgICAgICAgICBpc0Nsb3NhYmxlOiBvcmlnaW5hbC5pc0Nsb3NhYmxlLFxyXG4gICAgICAgICAgICByZW9yZGVyRW5hYmxlZDogb3JpZ2luYWwucmVvcmRlckVuYWJsZWQsXHJcbiAgICAgICAgICAgIHRpdGxlOiBvcmlnaW5hbC50aXRsZSxcclxuICAgICAgICAgICAgaGVhZGVyOiBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXIuY3JlYXRlQ29weShvcmlnaW5hbC5oZWFkZXIpLFxyXG4gICAgICAgICAgICBjb21wb25lbnRUeXBlOiBvcmlnaW5hbC5jb21wb25lbnRUeXBlLFxyXG4gICAgICAgICAgICBjb21wb25lbnRTdGF0ZTogZGVlcEV4dGVuZFZhbHVlKHVuZGVmaW5lZCwgb3JpZ2luYWwuY29tcG9uZW50U3RhdGUpIGFzIEpzb25WYWx1ZSxcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdChjb21wb25lbnRUeXBlOiBKc29uVmFsdWUgPSAnJywgY29tcG9uZW50U3RhdGU/OiBKc29uVmFsdWUsIHRpdGxlID0gJycpOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiBJdGVtVHlwZS5jb21wb25lbnQsXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IFtdLFxyXG4gICAgICAgICAgICBzaXplOiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuc2l6ZSxcclxuICAgICAgICAgICAgc2l6ZVVuaXQ6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5zaXplVW5pdCxcclxuICAgICAgICAgICAgbWluU2l6ZTogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLm1pblNpemUsXHJcbiAgICAgICAgICAgIG1pblNpemVVbml0OiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMubWluU2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIGlkOiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuaWQsXHJcbiAgICAgICAgICAgIG1heGltaXNlZDogUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcuZGVmYXVsdE1heGltaXNlZCxcclxuICAgICAgICAgICAgaXNDbG9zYWJsZTogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLmlzQ2xvc2FibGUsXHJcbiAgICAgICAgICAgIHJlb3JkZXJFbmFibGVkOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcuZGVmYXVsdFJlb3JkZXJFbmFibGVkLFxyXG4gICAgICAgICAgICB0aXRsZSxcclxuICAgICAgICAgICAgaGVhZGVyOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFR5cGUsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFN0YXRlLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjb3B5Q29tcG9uZW50VHlwZShjb21wb25lbnRUeXBlOiBKc29uVmFsdWUpOiBKc29uVmFsdWUge1xyXG4gICAgICAgIHJldHVybiBkZWVwRXh0ZW5kVmFsdWUoe30sIGNvbXBvbmVudFR5cGUpIGFzIEpzb25WYWx1ZVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQmFzZSBmb3IgUm9vdCBvciBSb3dPckNvbHVtbiBJdGVtQ29uZmlnc1xyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnIGV4dGVuZHMgUmVzb2x2ZWRJdGVtQ29uZmlnIHtcclxuICAgIHJlYWRvbmx5IHR5cGU6ICdyb3cnIHwgJ2NvbHVtbic7XHJcbiAgICAvKiogTm90ZSB0aGF0IFJvd09yQ29sdW1uIFJlc29sdmVkSXRlbUNvbmZpZyBjb250ZW50cywgY2FuIGNvbnRhaW4gQ29tcG9uZW50SXRlbSBpdGVtQ29uZmlncy4gIEhvd2V2ZXJcclxuICAgICAqIHdoZW4gQ29udGVudEl0ZW1zIGFyZSBjcmVhdGVkLCB0aGVzZSBDb21wb25lbnRJdGVtIGl0ZW1Db25maWdzIHdpbGwgY3JlYXRlIGEgU3RhY2sgd2l0aCBhIGNoaWxkIENvbXBvbmVudEl0ZW0uXHJcbiAgICAgKi9cclxuICAgIHJlYWRvbmx5IGNvbnRlbnQ6IHJlYWRvbmx5IChSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyB8IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnIHwgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnKVtdO1xyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnIHtcclxuICAgIGV4cG9ydCB0eXBlIENoaWxkSXRlbUNvbmZpZyA9IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnIHwgUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcgfCBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWc7XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzQ2hpbGRJdGVtQ29uZmlnKGl0ZW1Db25maWc6IFJlc29sdmVkSXRlbUNvbmZpZyk6IGl0ZW1Db25maWcgaXMgQ2hpbGRJdGVtQ29uZmlnIHtcclxuICAgICAgICBzd2l0Y2ggKGl0ZW1Db25maWcudHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnJvdzpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb2x1bW46XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuc3RhY2s6XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29tcG9uZW50OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuZ3JvdW5kOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVucmVhY2hhYmxlQ2FzZUVycm9yKCdDUk9DT1NQQ0lDSUMxMzY4NycsIGl0ZW1Db25maWcudHlwZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb3B5KG9yaWdpbmFsOiBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZywgY29udGVudD86IENoaWxkSXRlbUNvbmZpZ1tdKTogUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IG9yaWdpbmFsLnR5cGUsXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQgIT09IHVuZGVmaW5lZCA/IGNvcHlDb250ZW50KGNvbnRlbnQpIDogY29weUNvbnRlbnQob3JpZ2luYWwuY29udGVudCksXHJcbiAgICAgICAgICAgIHNpemU6IG9yaWdpbmFsLnNpemUsXHJcbiAgICAgICAgICAgIHNpemVVbml0OiBvcmlnaW5hbC5zaXplVW5pdCxcclxuICAgICAgICAgICAgbWluU2l6ZTogb3JpZ2luYWwubWluU2l6ZSxcclxuICAgICAgICAgICAgbWluU2l6ZVVuaXQ6IG9yaWdpbmFsLm1pblNpemVVbml0LFxyXG4gICAgICAgICAgICBpZDogb3JpZ2luYWwuaWQsXHJcbiAgICAgICAgICAgIGlzQ2xvc2FibGU6IG9yaWdpbmFsLmlzQ2xvc2FibGUsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNvcHlDb250ZW50KG9yaWdpbmFsOiByZWFkb25seSBDaGlsZEl0ZW1Db25maWdbXSk6IENoaWxkSXRlbUNvbmZpZ1tdIHtcclxuICAgICAgICBjb25zdCBjb3VudCA9IG9yaWdpbmFsLmxlbmd0aDtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8Q2hpbGRJdGVtQ29uZmlnPihjb3VudCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdFtpXSA9IFJlc29sdmVkSXRlbUNvbmZpZy5jcmVhdGVDb3B5KG9yaWdpbmFsW2ldKSBhcyBDaGlsZEl0ZW1Db25maWc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHQodHlwZTogJ3JvdycgfCAnY29sdW1uJyk6IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlLFxyXG4gICAgICAgICAgICBjb250ZW50OiBbXSxcclxuICAgICAgICAgICAgc2l6ZTogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLnNpemUsXHJcbiAgICAgICAgICAgIHNpemVVbml0OiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuc2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIG1pblNpemU6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5taW5TaXplLFxyXG4gICAgICAgICAgICBtaW5TaXplVW5pdDogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLm1pblNpemVVbml0LFxyXG4gICAgICAgICAgICBpZDogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLmlkLFxyXG4gICAgICAgICAgICBpc0Nsb3NhYmxlOiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuaXNDbG9zYWJsZSxcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFJvb3RJdGVtQ29uZmlnIGlzIHRoZSB0b3Btb3N0IFJlc29sdmVkSXRlbUNvbmZpZyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuXHJcbiAqIE5vdGUgdGhhdCBpdCBkb2VzIG5vdCBoYXZlIGEgY29ycmVzcG9uZGluZyBjb250ZW50SXRlbS4gIEl0IHNwZWNpZmllcyB0aGUgb25lIGFuZCBvbmx5IGNoaWxkIG9mIHRoZSBHcm91bmQgQ29udGVudEl0ZW1cclxuICogTm90ZSB0aGF0IFJvb3RJdGVtQ29uZmlnIGNhbiBiZSBhbiBDb21wb25lbnRJdGVtIGl0ZW1Db25maWcuICBIb3dldmVyIHdoZW4gdGhlIEdyb3VuZCBDb250ZW50SXRlbSdzIGNoaWxkIGlzIGNyZWF0ZWRcclxuICogYSBDb21wb25lbnRJdGVtIGl0ZW1Db25maWcgd2lsbCBjcmVhdGUgYSBTdGFjayB3aXRoIGEgY2hpbGQgQ29tcG9uZW50SXRlbS5cclxuICogQHB1YmxpY1xyXG4qL1xyXG5leHBvcnQgdHlwZSBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnID0gUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcgfCBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZyB8IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZztcclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgUmVzb2x2ZWRSb290SXRlbUNvbmZpZyB7XHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29weShjb25maWc6IFJlc29sdmVkUm9vdEl0ZW1Db25maWcpOiBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnIHtcclxuICAgICAgICByZXR1cm4gUmVzb2x2ZWRJdGVtQ29uZmlnLmNyZWF0ZUNvcHkoY29uZmlnKSBhcyBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc1Jvb3RJdGVtQ29uZmlnKGl0ZW1Db25maWc6IFJlc29sdmVkSXRlbUNvbmZpZyk6IGl0ZW1Db25maWcgaXMgUmVzb2x2ZWRSb290SXRlbUNvbmZpZyB7XHJcbiAgICAgICAgc3dpdGNoIChpdGVtQ29uZmlnLnR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5yb3c6XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29sdW1uOlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnN0YWNrOlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbXBvbmVudDpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmdyb3VuZDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnJlYWNoYWJsZUNhc2VFcnJvcignQ1JPQ09TUENJQ0lDMTM2ODcnLCBpdGVtQ29uZmlnLnR5cGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkR3JvdW5kSXRlbUNvbmZpZyBleHRlbmRzIFJlc29sdmVkSXRlbUNvbmZpZyB7XHJcbiAgICByZWFkb25seSB0eXBlOiAnZ3JvdW5kJztcclxuICAgIHJlYWRvbmx5IHNpemU6IDEwMCxcclxuICAgIHJlYWRvbmx5IHNpemVVbml0OiBTaXplVW5pdEVudW0uUGVyY2VudCxcclxuICAgIHJlYWRvbmx5IG1pblNpemU6IDAsXHJcbiAgICByZWFkb25seSBtaW5TaXplVW5pdDogU2l6ZVVuaXRFbnVtLlBpeGVsLFxyXG4gICAgcmVhZG9ubHkgaWQ6ICcnLFxyXG4gICAgcmVhZG9ubHkgaXNDbG9zYWJsZTogZmFsc2UsXHJcbiAgICByZWFkb25seSB0aXRsZTogJycsXHJcbiAgICByZWFkb25seSByZW9yZGVyRW5hYmxlZDogZmFsc2UsXHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBSZXNvbHZlZEdyb3VuZEl0ZW1Db25maWcge1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZShyb290SXRlbUNvbmZpZzogUmVzb2x2ZWRSb290SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCk6UmVzb2x2ZWRHcm91bmRJdGVtQ29uZmlnIHtcclxuICAgICAgICBjb25zdCBjb250ZW50ID0gcm9vdEl0ZW1Db25maWcgPT09IHVuZGVmaW5lZCA/IFtdIDogW3Jvb3RJdGVtQ29uZmlnXTtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB0eXBlOiBJdGVtVHlwZS5ncm91bmQsXHJcbiAgICAgICAgICAgIGNvbnRlbnQsXHJcbiAgICAgICAgICAgIHNpemU6IDEwMCxcclxuICAgICAgICAgICAgc2l6ZVVuaXQ6IFNpemVVbml0RW51bS5QZXJjZW50LFxyXG4gICAgICAgICAgICBtaW5TaXplOiAwLFxyXG4gICAgICAgICAgICBtaW5TaXplVW5pdDogU2l6ZVVuaXRFbnVtLlBpeGVsLFxyXG4gICAgICAgICAgICBpZDogJycsXHJcbiAgICAgICAgICAgIGlzQ2xvc2FibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICB0aXRsZTogJycsXHJcbiAgICAgICAgICAgIHJlb3JkZXJFbmFibGVkOiBmYWxzZSxcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRMYXlvdXRDb25maWcge1xyXG4gICAgcmVhZG9ubHkgcm9vdDogUmVzb2x2ZWRSb290SXRlbUNvbmZpZyB8IHVuZGVmaW5lZDtcclxuICAgIHJlYWRvbmx5IG9wZW5Qb3BvdXRzOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZ1tdO1xyXG4gICAgcmVhZG9ubHkgZGltZW5zaW9uczogUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucztcclxuICAgIHJlYWRvbmx5IHNldHRpbmdzOiBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncztcclxuICAgIHJlYWRvbmx5IGhlYWRlcjogUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyO1xyXG4gICAgcmVhZG9ubHkgcmVzb2x2ZWQ6IHRydWUsXHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgUmVzb2x2ZWRMYXlvdXRDb25maWcge1xyXG4gICAgZXhwb3J0IGludGVyZmFjZSBTZXR0aW5ncyB7XHJcbiAgICAgICAgLy8gc2VlIENvbmZpZy5TZXR0aW5ncyBmb3IgY29tbWVudHNcclxuICAgICAgICByZWFkb25seSBkcmFnQmV0d2VlbldpbmRvd3M6IGJvb2xlYW47XHJcbiAgICAgICAgcmVhZG9ubHkgZHJhZ1RvTmV3V2luZG93OiBib29sZWFuO1xyXG4gICAgICAgIHJlYWRvbmx5IHJlb3JkZXJFbmFibGVkOiBib29sZWFuOyAvLyBhbHNvIGluIFJlc29sdmVkSXRlbUNvbmZpZyB3aGljaCB0YWtlcyBwcmVjZWRlbmNlXHJcbiAgICAgICAgcmVhZG9ubHkgcG9wb3V0V2hvbGVTdGFjazogYm9vbGVhbjtcclxuICAgICAgICByZWFkb25seSBibG9ja2VkUG9wb3V0c1Rocm93RXJyb3I6IGJvb2xlYW47XHJcbiAgICAgICAgLyoqIEBkZXByZWNhdGVkIFdpbGwgYmUgcmVtb3ZlZCBpbiB2ZXJzaW9uIDMuICovXHJcbiAgICAgICAgcmVhZG9ubHkgY2xvc2VQb3BvdXRzT25VbmxvYWQ6IGJvb2xlYW47XHJcbiAgICAgICAgcmVhZG9ubHkgcmVzcG9uc2l2ZU1vZGU6IFJlc3BvbnNpdmVNb2RlO1xyXG4gICAgICAgIHJlYWRvbmx5IHRhYk92ZXJsYXBBbGxvd2FuY2U6IG51bWJlcjtcclxuICAgICAgICByZWFkb25seSByZW9yZGVyT25UYWJNZW51Q2xpY2s6IGJvb2xlYW47XHJcbiAgICAgICAgcmVhZG9ubHkgdGFiQ29udHJvbE9mZnNldDogbnVtYmVyO1xyXG4gICAgICAgIHJlYWRvbmx5IHBvcEluT25DbG9zZTogYm9vbGVhbjtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgbmFtZXNwYWNlIFNldHRpbmdzIHtcclxuICAgICAgICBleHBvcnQgY29uc3QgZGVmYXVsdHM6IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzID0ge1xyXG4gICAgICAgICAgICBkcmFnQmV0d2VlbldpbmRvd3M6IHRydWUsXHJcbiAgICAgICAgICAgIGRyYWdUb05ld1dpbmRvdzogdHJ1ZSxcclxuICAgICAgICAgICAgcmVvcmRlckVuYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgICAgIHBvcG91dFdob2xlU3RhY2s6IGZhbHNlLFxyXG4gICAgICAgICAgICBibG9ja2VkUG9wb3V0c1Rocm93RXJyb3I6IHRydWUsXHJcbiAgICAgICAgICAgIGNsb3NlUG9wb3V0c09uVW5sb2FkOiB0cnVlLFxyXG4gICAgICAgICAgICByZXNwb25zaXZlTW9kZTogUmVzcG9uc2l2ZU1vZGUubm9uZSwgLy8gd2FzIG9ubG9hZFxyXG4gICAgICAgICAgICB0YWJPdmVybGFwQWxsb3dhbmNlOiAwLFxyXG4gICAgICAgICAgICByZW9yZGVyT25UYWJNZW51Q2xpY2s6IHRydWUsXHJcbiAgICAgICAgICAgIHRhYkNvbnRyb2xPZmZzZXQ6IDEwLFxyXG4gICAgICAgICAgICBwb3BJbk9uQ2xvc2U6IGZhbHNlLFxyXG4gICAgICAgIH0gYXMgY29uc3Q7XHJcblxyXG4gICAgICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb3B5KG9yaWdpbmFsOiBTZXR0aW5ncyk6IFNldHRpbmdzIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGRyYWdCZXR3ZWVuV2luZG93czogb3JpZ2luYWwuZHJhZ0JldHdlZW5XaW5kb3dzLFxyXG4gICAgICAgICAgICAgICAgZHJhZ1RvTmV3V2luZG93OiBvcmlnaW5hbC5kcmFnVG9OZXdXaW5kb3csXHJcbiAgICAgICAgICAgICAgICByZW9yZGVyRW5hYmxlZDogb3JpZ2luYWwucmVvcmRlckVuYWJsZWQsXHJcbiAgICAgICAgICAgICAgICBwb3BvdXRXaG9sZVN0YWNrOiBvcmlnaW5hbC5wb3BvdXRXaG9sZVN0YWNrLFxyXG4gICAgICAgICAgICAgICAgYmxvY2tlZFBvcG91dHNUaHJvd0Vycm9yOiBvcmlnaW5hbC5ibG9ja2VkUG9wb3V0c1Rocm93RXJyb3IsXHJcbiAgICAgICAgICAgICAgICBjbG9zZVBvcG91dHNPblVubG9hZDogb3JpZ2luYWwuY2xvc2VQb3BvdXRzT25VbmxvYWQsXHJcbiAgICAgICAgICAgICAgICByZXNwb25zaXZlTW9kZTogb3JpZ2luYWwucmVzcG9uc2l2ZU1vZGUsXHJcbiAgICAgICAgICAgICAgICB0YWJPdmVybGFwQWxsb3dhbmNlOiBvcmlnaW5hbC50YWJPdmVybGFwQWxsb3dhbmNlLFxyXG4gICAgICAgICAgICAgICAgcmVvcmRlck9uVGFiTWVudUNsaWNrOiBvcmlnaW5hbC5yZW9yZGVyT25UYWJNZW51Q2xpY2ssXHJcbiAgICAgICAgICAgICAgICB0YWJDb250cm9sT2Zmc2V0OiBvcmlnaW5hbC50YWJDb250cm9sT2Zmc2V0LFxyXG4gICAgICAgICAgICAgICAgcG9wSW5PbkNsb3NlOiBvcmlnaW5hbC5wb3BJbk9uQ2xvc2UsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBEaW1lbnNpb25zIHtcclxuICAgICAgICAvLyBzZWUgTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMgZm9yIGNvbW1lbnRzXHJcbiAgICAgICAgcmVhZG9ubHkgYm9yZGVyV2lkdGg6IG51bWJlcjtcclxuICAgICAgICByZWFkb25seSBib3JkZXJHcmFiV2lkdGg6IG51bWJlcixcclxuICAgICAgICByZWFkb25seSBkZWZhdWx0TWluSXRlbUhlaWdodDogbnVtYmVyO1xyXG4gICAgICAgIHJlYWRvbmx5IGRlZmF1bHRNaW5JdGVtSGVpZ2h0VW5pdDogU2l6ZVVuaXRFbnVtO1xyXG4gICAgICAgIHJlYWRvbmx5IGRlZmF1bHRNaW5JdGVtV2lkdGg6IG51bWJlcjtcclxuICAgICAgICByZWFkb25seSBkZWZhdWx0TWluSXRlbVdpZHRoVW5pdDogU2l6ZVVuaXRFbnVtO1xyXG4gICAgICAgIHJlYWRvbmx5IGhlYWRlckhlaWdodDogbnVtYmVyO1xyXG4gICAgICAgIHJlYWRvbmx5IGRyYWdQcm94eVdpZHRoOiBudW1iZXI7XHJcbiAgICAgICAgcmVhZG9ubHkgZHJhZ1Byb3h5SGVpZ2h0OiBudW1iZXI7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBEaW1lbnNpb25zIHtcclxuICAgICAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29weShvcmlnaW5hbDogRGltZW5zaW9ucyk6IERpbWVuc2lvbnMge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgYm9yZGVyV2lkdGg6IG9yaWdpbmFsLmJvcmRlcldpZHRoLFxyXG4gICAgICAgICAgICAgICAgYm9yZGVyR3JhYldpZHRoOiBvcmlnaW5hbC5ib3JkZXJHcmFiV2lkdGgsXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0TWluSXRlbUhlaWdodDogb3JpZ2luYWwuZGVmYXVsdE1pbkl0ZW1IZWlnaHQsXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0TWluSXRlbUhlaWdodFVuaXQ6IG9yaWdpbmFsLmRlZmF1bHRNaW5JdGVtSGVpZ2h0VW5pdCxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRNaW5JdGVtV2lkdGg6IG9yaWdpbmFsLmRlZmF1bHRNaW5JdGVtV2lkdGgsXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0TWluSXRlbVdpZHRoVW5pdDogb3JpZ2luYWwuZGVmYXVsdE1pbkl0ZW1XaWR0aFVuaXQsXHJcbiAgICAgICAgICAgICAgICBoZWFkZXJIZWlnaHQ6IG9yaWdpbmFsLmhlYWRlckhlaWdodCxcclxuICAgICAgICAgICAgICAgIGRyYWdQcm94eVdpZHRoOiBvcmlnaW5hbC5kcmFnUHJveHlXaWR0aCxcclxuICAgICAgICAgICAgICAgIGRyYWdQcm94eUhlaWdodDogb3JpZ2luYWwuZHJhZ1Byb3h5SGVpZ2h0LFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBleHBvcnQgY29uc3QgZGVmYXVsdHM6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMgPSB7XHJcbiAgICAgICAgICAgIGJvcmRlcldpZHRoOiA1LFxyXG4gICAgICAgICAgICBib3JkZXJHcmFiV2lkdGg6IDUsXHJcbiAgICAgICAgICAgIGRlZmF1bHRNaW5JdGVtSGVpZ2h0OiAwLFxyXG4gICAgICAgICAgICBkZWZhdWx0TWluSXRlbUhlaWdodFVuaXQ6IFNpemVVbml0RW51bS5QaXhlbCxcclxuICAgICAgICAgICAgZGVmYXVsdE1pbkl0ZW1XaWR0aDogMTAsXHJcbiAgICAgICAgICAgIGRlZmF1bHRNaW5JdGVtV2lkdGhVbml0OiBTaXplVW5pdEVudW0uUGl4ZWwsXHJcbiAgICAgICAgICAgIGhlYWRlckhlaWdodDogMjAsXHJcbiAgICAgICAgICAgIGRyYWdQcm94eVdpZHRoOiAzMDAsXHJcbiAgICAgICAgICAgIGRyYWdQcm94eUhlaWdodDogMjAwXHJcbiAgICAgICAgfSBhcyBjb25zdDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIEhlYWRlciB7XHJcbiAgICAgICAgcmVhZG9ubHkgc2hvdzogZmFsc2UgfCBTaWRlO1xyXG4gICAgICAgIHJlYWRvbmx5IHBvcG91dDogZmFsc2UgfCBzdHJpbmc7XHJcbiAgICAgICAgcmVhZG9ubHkgcG9waW46IHN0cmluZztcclxuICAgICAgICByZWFkb25seSBtYXhpbWlzZTogZmFsc2UgfCBzdHJpbmc7XHJcbiAgICAgICAgcmVhZG9ubHkgbWluaW1pc2U6IHN0cmluZztcclxuICAgICAgICByZWFkb25seSBjbG9zZTogZmFsc2UgfCBzdHJpbmc7XHJcbiAgICAgICAgcmVhZG9ubHkgdGFiRHJvcGRvd246IGZhbHNlIHwgc3RyaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBuYW1lc3BhY2UgSGVhZGVyIHtcclxuICAgICAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29weShvcmlnaW5hbDogSGVhZGVyKTogSGVhZGVyIHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIHNob3c6IG9yaWdpbmFsLnNob3csXHJcbiAgICAgICAgICAgICAgICBwb3BvdXQ6IG9yaWdpbmFsLnBvcG91dCxcclxuICAgICAgICAgICAgICAgIHBvcGluOiBvcmlnaW5hbC5wb3BpbixcclxuICAgICAgICAgICAgICAgIGNsb3NlOiBvcmlnaW5hbC5jbG9zZSxcclxuICAgICAgICAgICAgICAgIG1heGltaXNlOiBvcmlnaW5hbC5tYXhpbWlzZSxcclxuICAgICAgICAgICAgICAgIG1pbmltaXNlOiBvcmlnaW5hbC5taW5pbWlzZSxcclxuICAgICAgICAgICAgICAgIHRhYkRyb3Bkb3duOiBvcmlnaW5hbC50YWJEcm9wZG93bixcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZXhwb3J0IGNvbnN0IGRlZmF1bHRzOiBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIgPSB7XHJcbiAgICAgICAgICAgIHNob3c6IFNpZGUudG9wLFxyXG4gICAgICAgICAgICBwb3BvdXQ6ICdvcGVuIGluIG5ldyB3aW5kb3cnLFxyXG4gICAgICAgICAgICBwb3BpbjogJ2RvY2snLFxyXG4gICAgICAgICAgICBtYXhpbWlzZTogJ21heGltaXNlJyxcclxuICAgICAgICAgICAgbWluaW1pc2U6ICdtaW5pbWlzZScsXHJcbiAgICAgICAgICAgIGNsb3NlOiAnY2xvc2UnLFxyXG4gICAgICAgICAgICB0YWJEcm9wZG93bjogJ2FkZGl0aW9uYWwgdGFicydcclxuICAgICAgICB9IGFzIGNvbnN0O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc1BvcG91dChjb25maWc6IFJlc29sdmVkTGF5b3V0Q29uZmlnKTogY29uZmlnIGlzIFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnIHtcclxuICAgICAgICByZXR1cm4gJ3BhcmVudElkJyBpbiBjb25maWc7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHQoKTogUmVzb2x2ZWRMYXlvdXRDb25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRMYXlvdXRDb25maWcgPSB7XHJcbiAgICAgICAgICAgIHJvb3Q6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgb3BlblBvcG91dHM6IFtdLFxyXG4gICAgICAgICAgICBkaW1lbnNpb25zOiBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zLmRlZmF1bHRzLFxyXG4gICAgICAgICAgICBzZXR0aW5nczogUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuZGVmYXVsdHMsXHJcbiAgICAgICAgICAgIGhlYWRlcjogUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyLmRlZmF1bHRzLFxyXG4gICAgICAgICAgICByZXNvbHZlZDogdHJ1ZSxcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29weShjb25maWc6IFJlc29sdmVkTGF5b3V0Q29uZmlnKTogUmVzb2x2ZWRMYXlvdXRDb25maWcge1xyXG4gICAgICAgIGlmIChpc1BvcG91dChjb25maWcpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZy5jcmVhdGVDb3B5KGNvbmZpZyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZExheW91dENvbmZpZyA9IHtcclxuICAgICAgICAgICAgICAgIHJvb3Q6IGNvbmZpZy5yb290ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnLmNyZWF0ZUNvcHkoY29uZmlnLnJvb3QpLFxyXG4gICAgICAgICAgICAgICAgb3BlblBvcG91dHM6IFJlc29sdmVkTGF5b3V0Q29uZmlnLmNvcHlPcGVuUG9wb3V0cyhjb25maWcub3BlblBvcG91dHMpLFxyXG4gICAgICAgICAgICAgICAgc2V0dGluZ3M6IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzLmNyZWF0ZUNvcHkoY29uZmlnLnNldHRpbmdzKSxcclxuICAgICAgICAgICAgICAgIGRpbWVuc2lvbnM6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMuY3JlYXRlQ29weShjb25maWcuZGltZW5zaW9ucyksXHJcbiAgICAgICAgICAgICAgICBoZWFkZXI6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlci5jcmVhdGVDb3B5KGNvbmZpZy5oZWFkZXIpLFxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZWQ6IGNvbmZpZy5yZXNvbHZlZCxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY29weU9wZW5Qb3BvdXRzKG9yaWdpbmFsOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZ1tdKTogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWdbXSB7XHJcbiAgICAgICAgY29uc3QgY291bnQgPSBvcmlnaW5hbC5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnPihjb3VudCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdFtpXSA9IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLmNyZWF0ZUNvcHkob3JpZ2luYWxbaV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGFrZXMgYSBHb2xkZW5MYXlvdXQgY29uZmlndXJhdGlvbiBvYmplY3QgYW5kXHJcbiAgICAgKiByZXBsYWNlcyBpdHMga2V5cyBhbmQgdmFsdWVzIHJlY3Vyc2l2ZWx5IHdpdGhcclxuICAgICAqIG9uZSBsZXR0ZXIgY291bnRlcnBhcnRzXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBtaW5pZnlDb25maWcobGF5b3V0Q29uZmlnOiBSZXNvbHZlZExheW91dENvbmZpZyk6IFJlc29sdmVkTGF5b3V0Q29uZmlnIHtcclxuICAgICAgICByZXR1cm4gQ29uZmlnTWluaWZpZXIudHJhbnNsYXRlT2JqZWN0KGxheW91dENvbmZpZywgdHJ1ZSkgYXMgUmVzb2x2ZWRMYXlvdXRDb25maWc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlcyBhIGNvbmZpZ3VyYXRpb24gT2JqZWN0IHRoYXQgd2FzIHByZXZpb3VzbHkgbWluaWZpZWRcclxuICAgICAqIHVzaW5nIG1pbmlmeUNvbmZpZyBhbmQgcmV0dXJucyBpdHMgb3JpZ2luYWwgdmVyc2lvblxyXG4gICAgICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gdW5taW5pZnlDb25maWcobWluaWZpZWRDb25maWc6IFJlc29sdmVkTGF5b3V0Q29uZmlnKTogUmVzb2x2ZWRMYXlvdXRDb25maWcge1xyXG4gICAgICAgIHJldHVybiBDb25maWdNaW5pZmllci50cmFuc2xhdGVPYmplY3QobWluaWZpZWRDb25maWcsIGZhbHNlKSBhcyBSZXNvbHZlZExheW91dENvbmZpZztcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyBleHRlbmRzIFJlc29sdmVkTGF5b3V0Q29uZmlnIHtcclxuICAgIHJlYWRvbmx5IHBhcmVudElkOiBzdHJpbmcgfCBudWxsO1xyXG4gICAgcmVhZG9ubHkgaW5kZXhJblBhcmVudDogbnVtYmVyIHwgbnVsbDtcclxuICAgIHJlYWRvbmx5IHdpbmRvdzogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcuV2luZG93O1xyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnIHtcclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgV2luZG93IHtcclxuICAgICAgICByZWFkb25seSB3aWR0aDogbnVtYmVyIHwgbnVsbCxcclxuICAgICAgICByZWFkb25seSBoZWlnaHQ6IG51bWJlciB8IG51bGwsXHJcbiAgICAgICAgcmVhZG9ubHkgbGVmdDogbnVtYmVyIHwgbnVsbCxcclxuICAgICAgICByZWFkb25seSB0b3A6IG51bWJlciB8IG51bGwsXHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBXaW5kb3cge1xyXG4gICAgICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb3B5KG9yaWdpbmFsOiBXaW5kb3cpOiBXaW5kb3cge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgd2lkdGg6IG9yaWdpbmFsLndpZHRoLFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBvcmlnaW5hbC5oZWlnaHQsXHJcbiAgICAgICAgICAgICAgICBsZWZ0OiBvcmlnaW5hbC5sZWZ0LFxyXG4gICAgICAgICAgICAgICAgdG9wOiBvcmlnaW5hbC50b3AsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGV4cG9ydCBjb25zdCBkZWZhdWx0czogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcuV2luZG93ID0ge1xyXG4gICAgICAgICAgICB3aWR0aDogbnVsbCxcclxuICAgICAgICAgICAgaGVpZ2h0OiBudWxsLFxyXG4gICAgICAgICAgICBsZWZ0OiBudWxsLFxyXG4gICAgICAgICAgICB0b3A6IG51bGwsXHJcbiAgICAgICAgfSBhcyBjb25zdDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29weShvcmlnaW5hbDogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcpOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyA9IHtcclxuICAgICAgICAgICAgcm9vdDogb3JpZ2luYWwucm9vdCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogUmVzb2x2ZWRSb290SXRlbUNvbmZpZy5jcmVhdGVDb3B5KG9yaWdpbmFsLnJvb3QpLFxyXG4gICAgICAgICAgICBvcGVuUG9wb3V0czogUmVzb2x2ZWRMYXlvdXRDb25maWcuY29weU9wZW5Qb3BvdXRzKG9yaWdpbmFsLm9wZW5Qb3BvdXRzKSxcclxuICAgICAgICAgICAgc2V0dGluZ3M6IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzLmNyZWF0ZUNvcHkob3JpZ2luYWwuc2V0dGluZ3MpLFxyXG4gICAgICAgICAgICBkaW1lbnNpb25zOiBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zLmNyZWF0ZUNvcHkob3JpZ2luYWwuZGltZW5zaW9ucyksXHJcbiAgICAgICAgICAgIGhlYWRlcjogUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyLmNyZWF0ZUNvcHkob3JpZ2luYWwuaGVhZGVyKSxcclxuICAgICAgICAgICAgcGFyZW50SWQ6IG9yaWdpbmFsLnBhcmVudElkLFxyXG4gICAgICAgICAgICBpbmRleEluUGFyZW50OiBvcmlnaW5hbC5pbmRleEluUGFyZW50LFxyXG4gICAgICAgICAgICB3aW5kb3c6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLldpbmRvdy5jcmVhdGVDb3B5KG9yaWdpbmFsLndpbmRvdyksXHJcbiAgICAgICAgICAgIHJlc29sdmVkOiBvcmlnaW5hbC5yZXNvbHZlZCxcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBDb21wb25lbnRJdGVtQ29uZmlnLCBJdGVtQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL2NvbmZpZyc7XHJcbmltcG9ydCB7IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9yZXNvbHZlZC1jb25maWcnO1xyXG5pbXBvcnQgeyBUYWIgfSBmcm9tICcuLi9jb250cm9scy90YWInO1xyXG5pbXBvcnQgeyBBc3NlcnRFcnJvciwgVW5leHBlY3RlZE51bGxFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuLi9pdGVtcy9jb21wb25lbnQtaXRlbSc7XHJcbmltcG9ydCB7IENvbnRlbnRJdGVtIH0gZnJvbSAnLi4vaXRlbXMvY29udGVudC1pdGVtJztcclxuaW1wb3J0IHsgTGF5b3V0TWFuYWdlciB9IGZyb20gJy4uL2xheW91dC1tYW5hZ2VyJztcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vdXRpbHMvZXZlbnQtZW1pdHRlcic7XHJcbmltcG9ydCB7IEpzb25WYWx1ZSwgTG9naWNhbFpJbmRleCwgTG9naWNhbFpJbmRleFRvRGVmYXVsdE1hcCB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcclxuaW1wb3J0IHsgZGVlcEV4dGVuZCwgc2V0RWxlbWVudEhlaWdodCwgc2V0RWxlbWVudFdpZHRoIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGNsYXNzIENvbXBvbmVudENvbnRhaW5lciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9jb21wb25lbnRUeXBlOiBKc29uVmFsdWU7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9ib3VuZENvbXBvbmVudDogQ29tcG9uZW50Q29udGFpbmVyLkJpbmRhYmxlQ29tcG9uZW50O1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfd2lkdGg6IG51bWJlcjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2hlaWdodDogbnVtYmVyO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaXNDbG9zYWJsZTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2luaXRpYWxTdGF0ZTogSnNvblZhbHVlIHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfc3RhdGU6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3Zpc2libGU7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9pc1Nob3duV2l0aFplcm9EaW1lbnNpb25zO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfdGFiOiBUYWI7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9zdGFja01heGltaXNlZCA9IGZhbHNlO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfbG9naWNhbFpJbmRleDogTG9naWNhbFpJbmRleDtcclxuXHJcbiAgICBzdGF0ZVJlcXVlc3RFdmVudDogQ29tcG9uZW50Q29udGFpbmVyLlN0YXRlUmVxdWVzdEV2ZW50SGFuZGxlciB8IHVuZGVmaW5lZDtcclxuICAgIHZpcnR1YWxSZWN0aW5nUmVxdWlyZWRFdmVudDogQ29tcG9uZW50Q29udGFpbmVyLlZpcnR1YWxSZWN0aW5nUmVxdWlyZWRFdmVudCB8IHVuZGVmaW5lZDtcclxuICAgIHZpcnR1YWxWaXNpYmlsaXR5Q2hhbmdlUmVxdWlyZWRFdmVudDogQ29tcG9uZW50Q29udGFpbmVyLlZpcnR1YWxWaXNpYmlsaXR5Q2hhbmdlUmVxdWlyZWRFdmVudCB8IHVuZGVmaW5lZDtcclxuICAgIHZpcnR1YWxaSW5kZXhDaGFuZ2VSZXF1aXJlZEV2ZW50OiBDb21wb25lbnRDb250YWluZXIuVmlydHVhbFpJbmRleENoYW5nZVJlcXVpcmVkRXZlbnQgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgZ2V0IHdpZHRoKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl93aWR0aDsgfVxyXG4gICAgZ2V0IGhlaWdodCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5faGVpZ2h0OyB9XHJcbiAgICBnZXQgcGFyZW50KCk6IENvbXBvbmVudEl0ZW0geyByZXR1cm4gdGhpcy5fcGFyZW50OyB9XHJcbiAgICAvKiogQGludGVybmFsIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKENvbXBvbmVudENvbnRhaW5lcjpjbGFzcykuY29tcG9uZW50VHlwZX0gKi9cclxuICAgIGdldCBjb21wb25lbnROYW1lKCk6IEpzb25WYWx1ZSB7IHJldHVybiB0aGlzLl9jb21wb25lbnRUeXBlOyB9XHJcbiAgICBnZXQgY29tcG9uZW50VHlwZSgpOiBKc29uVmFsdWUgeyByZXR1cm4gdGhpcy5fY29tcG9uZW50VHlwZTsgfVxyXG4gICAgZ2V0IHZpcnR1YWwoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9ib3VuZENvbXBvbmVudC52aXJ0dWFsOyB9XHJcbiAgICBnZXQgY29tcG9uZW50KCk6IENvbXBvbmVudENvbnRhaW5lci5Db21wb25lbnQgeyByZXR1cm4gdGhpcy5fYm91bmRDb21wb25lbnQuY29tcG9uZW50OyB9XHJcbiAgICBnZXQgdGFiKCk6IFRhYiB7IHJldHVybiB0aGlzLl90YWI7IH1cclxuICAgIGdldCB0aXRsZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fcGFyZW50LnRpdGxlOyB9XHJcbiAgICBnZXQgbGF5b3V0TWFuYWdlcigpOiBMYXlvdXRNYW5hZ2VyIHsgcmV0dXJuIHRoaXMuX2xheW91dE1hbmFnZXI7IH1cclxuICAgIGdldCBpc0hpZGRlbigpOiBib29sZWFuIHsgcmV0dXJuICF0aGlzLl92aXNpYmxlOyB9XHJcbiAgICBnZXQgdmlzaWJsZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3Zpc2libGU7IH1cclxuICAgIGdldCBzdGF0ZSgpOiBKc29uVmFsdWUgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fc3RhdGU7IH1cclxuICAgIC8qKiBSZXR1cm4gdGhlIGluaXRpYWwgY29tcG9uZW50IHN0YXRlICovXHJcbiAgICBnZXQgaW5pdGlhbFN0YXRlKCk6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9pbml0aWFsU3RhdGU7IH1cclxuICAgIC8qKiBUaGUgaW5uZXIgRE9NIGVsZW1lbnQgd2hlcmUgdGhlIGNvbnRhaW5lcidzIGNvbnRlbnQgaXMgaW50ZW5kZWQgdG8gbGl2ZSBpbiAqL1xyXG4gICAgZ2V0IGVsZW1lbnQoKTogSFRNTEVsZW1lbnQgeyByZXR1cm4gdGhpcy5fZWxlbWVudDsgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9jb25maWc6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfcGFyZW50OiBDb21wb25lbnRJdGVtLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9sYXlvdXRNYW5hZ2VyOiBMYXlvdXRNYW5hZ2VyLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9lbGVtZW50OiBIVE1MRWxlbWVudCxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfdXBkYXRlSXRlbUNvbmZpZ0V2ZW50OiBDb21wb25lbnRDb250YWluZXIuVXBkYXRlSXRlbUNvbmZpZ0V2ZW50SGFuZGxlcixcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfc2hvd0V2ZW50OiBDb21wb25lbnRDb250YWluZXIuU2hvd0V2ZW50SGFuZGxlcixcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfaGlkZUV2ZW50OiBDb21wb25lbnRDb250YWluZXIuSGlkZUV2ZW50SGFuZGxlcixcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfZm9jdXNFdmVudDogQ29tcG9uZW50Q29udGFpbmVyLkZvY3VzRXZlbnRIYW5kbGVyLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9ibHVyRXZlbnQ6IENvbXBvbmVudENvbnRhaW5lci5CbHVyRXZlbnRIYW5kbGVyLFxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fd2lkdGggPSAwO1xyXG4gICAgICAgIHRoaXMuX2hlaWdodCA9IDA7XHJcbiAgICAgICAgdGhpcy5fdmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5faXNTaG93bldpdGhaZXJvRGltZW5zaW9ucyA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudFR5cGUgPSBfY29uZmlnLmNvbXBvbmVudFR5cGU7XHJcbiAgICAgICAgdGhpcy5faXNDbG9zYWJsZSA9IF9jb25maWcuaXNDbG9zYWJsZTtcclxuICAgICAgICB0aGlzLl9pbml0aWFsU3RhdGUgPSBfY29uZmlnLmNvbXBvbmVudFN0YXRlO1xyXG4gICAgICAgIHRoaXMuX3N0YXRlID0gdGhpcy5faW5pdGlhbFN0YXRlO1xyXG5cclxuICAgICAgICB0aGlzLl9ib3VuZENvbXBvbmVudCA9IHRoaXMubGF5b3V0TWFuYWdlci5iaW5kQ29tcG9uZW50KHRoaXMsIF9jb25maWcpO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZUVsZW1lbnRQb3NpdGlvblByb3BlcnR5RnJvbUJvdW5kQ29tcG9uZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJlbGVhc2VDb21wb25lbnQoKTtcclxuICAgICAgICB0aGlzLnN0YXRlUmVxdWVzdEV2ZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnZGVzdHJveScpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChDb21wb25lbnRDb250YWluZXI6Y2xhc3MpLmVsZW1lbnQgfSAqL1xyXG4gICAgZ2V0RWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIaWRlcyB0aGUgY29udGFpbmVyJ3MgY29tcG9uZW50IGl0ZW0gKGFuZCBoZW5jZSwgdGhlIGNvbnRhaW5lcikgaWYgbm90IGFscmVhZHkgaGlkZGVuLlxyXG4gICAgICogRW1pdHMgaGlkZSBldmVudCBwcmlvciB0byBoaWRpbmcgdGhlIGNvbnRhaW5lci5cclxuICAgICAqL1xyXG4gICAgaGlkZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9oaWRlRXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNob3dzIHRoZSBjb250YWluZXIncyBjb21wb25lbnQgaXRlbSAoYW5kIGhlbmNlLCB0aGUgY29udGFpbmVyKSBpZiBub3QgdmlzaWJsZS5cclxuICAgICAqIEVtaXRzIHNob3cgZXZlbnQgcHJpb3IgdG8gaGlkaW5nIHRoZSBjb250YWluZXIuXHJcbiAgICAgKi9cclxuICAgIHNob3coKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fc2hvd0V2ZW50KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGb2N1cyB0aGlzIGNvbXBvbmVudCBpbiBMYXlvdXQuXHJcbiAgICAgKi9cclxuICAgIGZvY3VzKHN1cHByZXNzRXZlbnQgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2ZvY3VzRXZlbnQoc3VwcHJlc3NFdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmUgZm9jdXMgZnJvbSB0aGlzIGNvbXBvbmVudCBpbiBMYXlvdXQuXHJcbiAgICAgKi9cclxuICAgIGJsdXIoc3VwcHJlc3NFdmVudCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fYmx1ckV2ZW50KHN1cHByZXNzRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBzaXplIGZyb20gd2l0aGluIHRoZSBjb250YWluZXIuIFRyYXZlcnNlcyB1cFxyXG4gICAgICogdGhlIGl0ZW0gdHJlZSB1bnRpbCBpdCBmaW5kcyBhIHJvdyBvciBjb2x1bW4gZWxlbWVudFxyXG4gICAgICogYW5kIHJlc2l6ZXMgaXRzIGl0ZW1zIGFjY29yZGluZ2x5LlxyXG4gICAgICpcclxuICAgICAqIElmIHRoaXMgY29udGFpbmVyIGlzbid0IGEgZGVzY2VuZGFudCBvZiBhIHJvdyBvciBjb2x1bW5cclxuICAgICAqIGl0IHJldHVybnMgZmFsc2VcclxuICAgICAqIEBwYXJhbSB3aWR0aCAtIFRoZSBuZXcgd2lkdGggaW4gcGl4ZWxcclxuICAgICAqIEBwYXJhbSBoZWlnaHQgLSBUaGUgbmV3IGhlaWdodCBpbiBwaXhlbFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHJlc2l6ZVN1Y2Nlc2Z1bFxyXG4gICAgICpcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBzZXRTaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IGFuY2VzdG9ySXRlbTogQ29udGVudEl0ZW0gfCBudWxsID0gdGhpcy5fcGFyZW50O1xyXG4gICAgICAgIGlmIChhbmNlc3Rvckl0ZW0uaXNDb2x1bW4gfHwgYW5jZXN0b3JJdGVtLmlzUm93IHx8IGFuY2VzdG9ySXRlbS5wYXJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdJQ1NTUFJDJywgJ0NvbXBvbmVudENvbnRhaW5lciBjYW5ub3QgaGF2ZSBSb3dDb2x1bW4gUGFyZW50Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGFuY2VzdG9yQ2hpbGRJdGVtOiBDb250ZW50SXRlbTtcclxuICAgICAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICAgICAgYW5jZXN0b3JDaGlsZEl0ZW0gPSBhbmNlc3Rvckl0ZW07XHJcbiAgICAgICAgICAgICAgICBhbmNlc3Rvckl0ZW0gPSBhbmNlc3Rvckl0ZW0ucGFyZW50O1xyXG4gICAgICAgICAgICB9IHdoaWxlIChhbmNlc3Rvckl0ZW0gIT09IG51bGwgJiYgIWFuY2VzdG9ySXRlbS5pc0NvbHVtbiAmJiAhYW5jZXN0b3JJdGVtLmlzUm93KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChhbmNlc3Rvckl0ZW0gPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vIG5vIFJvdyBvciBDb2x1bW4gZm91bmRcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIGFuY2VzdG9ySXRlbSBpcyBSb3cgb3IgQ29sdW1uXHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSBhbmNlc3Rvckl0ZW0uaXNDb2x1bW4gPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50U2l6ZSA9IHRoaXNbZGlyZWN0aW9uXTtcclxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50U2l6ZSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdJQ1NTQ1MxMTE5NCcpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdTaXplID0gZGlyZWN0aW9uID09PSAnaGVpZ2h0JyA/IGhlaWdodCA6IHdpZHRoO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0b3RhbFBpeGVsID0gY3VycmVudFNpemUgKiAoMSAvIChhbmNlc3RvckNoaWxkSXRlbS5zaXplIC8gMTAwKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGVyY2VudGFnZSA9IChuZXdTaXplIC8gdG90YWxQaXhlbCkgKiAxMDA7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsdGEgPSAoYW5jZXN0b3JDaGlsZEl0ZW0uc2l6ZSAtIHBlcmNlbnRhZ2UpIC8gKGFuY2VzdG9ySXRlbS5jb250ZW50SXRlbXMubGVuZ3RoIC0gMSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYW5jZXN0b3JJdGVtLmNvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmNlc3Rvckl0ZW1Db250ZW50SXRlbSA9IGFuY2VzdG9ySXRlbS5jb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmNlc3Rvckl0ZW1Db250ZW50SXRlbSA9PT0gYW5jZXN0b3JDaGlsZEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2VzdG9ySXRlbUNvbnRlbnRJdGVtLnNpemUgPSBwZXJjZW50YWdlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3JJdGVtQ29udGVudEl0ZW0uc2l6ZSArPSBkZWx0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3JJdGVtLnVwZGF0ZVNpemUoZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENsb3NlcyB0aGUgY29udGFpbmVyIGlmIGl0IGlzIGNsb3NhYmxlLiBDYW4gYmUgY2FsbGVkIGJ5XHJcbiAgICAgKiBib3RoIHRoZSBjb21wb25lbnQgd2l0aGluIGF0IGFzIHdlbGwgYXMgdGhlIGNvbnRlbnRJdGVtIGNvbnRhaW5pbmdcclxuICAgICAqIGl0LiBFbWl0cyBhIGNsb3NlIGV2ZW50IGJlZm9yZSB0aGUgY29udGFpbmVyIGl0c2VsZiBpcyBjbG9zZWQuXHJcbiAgICAgKi9cclxuICAgIGNsb3NlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9pc0Nsb3NhYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnY2xvc2UnKTtcclxuICAgICAgICAgICAgdGhpcy5fcGFyZW50LmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBSZXBsYWNlcyBjb21wb25lbnQgd2l0aG91dCBhZmZlY3RpbmcgbGF5b3V0ICovXHJcbiAgICByZXBsYWNlQ29tcG9uZW50KGl0ZW1Db25maWc6IENvbXBvbmVudEl0ZW1Db25maWcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJlbGVhc2VDb21wb25lbnQoKTtcclxuXHJcbiAgICAgICAgaWYgKCFJdGVtQ29uZmlnLmlzQ29tcG9uZW50KGl0ZW1Db25maWcpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVwbGFjZUNvbXBvbmVudCBub3QgcGFzc2VkIGEgY29tcG9uZW50IEl0ZW1Db25maWcnKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IENvbXBvbmVudEl0ZW1Db25maWcucmVzb2x2ZShpdGVtQ29uZmlnLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxTdGF0ZSA9IGNvbmZpZy5jb21wb25lbnRTdGF0ZTtcclxuICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSB0aGlzLl9pbml0aWFsU3RhdGU7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudFR5cGUgPSBjb25maWcuY29tcG9uZW50VHlwZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUl0ZW1Db25maWdFdmVudChjb25maWcpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fYm91bmRDb21wb25lbnQgPSB0aGlzLmxheW91dE1hbmFnZXIuYmluZENvbXBvbmVudCh0aGlzLCBjb25maWcpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUVsZW1lbnRQb3NpdGlvblByb3BlcnR5RnJvbUJvdW5kQ29tcG9uZW50KCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fYm91bmRDb21wb25lbnQudmlydHVhbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudmlydHVhbFZpc2liaWxpdHlDaGFuZ2VSZXF1aXJlZEV2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpcnR1YWxWaXNpYmlsaXR5Q2hhbmdlUmVxdWlyZWRFdmVudCh0aGlzLCB0aGlzLl92aXNpYmxlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpcnR1YWxSZWN0aW5nUmVxdWlyZWRFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGF5b3V0TWFuYWdlci5maXJlQmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudCgxKTtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpcnR1YWxSZWN0aW5nUmVxdWlyZWRFdmVudCh0aGlzLCB0aGlzLl93aWR0aCwgdGhpcy5faGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXlvdXRNYW5hZ2VyLmZpcmVBZnRlclZpcnR1YWxSZWN0aW5nRXZlbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEJhc2VMb2dpY2FsWkluZGV4KCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnc3RhdGVDaGFuZ2VkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgaW5pdGlhbCBjb21wb25lbnQgc3RhdGUgb3IgdGhlIGxhdGVzdCBwYXNzZWQgaW4gc2V0U3RhdGUoKVxyXG4gICAgICogQHJldHVybnMgc3RhdGVcclxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgKENvbXBvbmVudENvbnRhaW5lcjpjbGFzcykuaW5pdGlhbFN0YXRlfVxyXG4gICAgICovXHJcbiAgICBnZXRTdGF0ZSgpOiBKc29uVmFsdWUgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1lcmdlcyB0aGUgcHJvdmlkZWQgc3RhdGUgaW50byB0aGUgY3VycmVudCBvbmVcclxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgKENvbXBvbmVudENvbnRhaW5lcjpjbGFzcykuc3RhdGVSZXF1ZXN0RXZlbnR9XHJcbiAgICAgKi9cclxuICAgIGV4dGVuZFN0YXRlKHN0YXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGV4dGVuZGVkU3RhdGUgPSBkZWVwRXh0ZW5kKHRoaXMuX3N0YXRlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBzdGF0ZSk7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZShleHRlbmRlZFN0YXRlIGFzIEpzb25WYWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb21wb25lbnQgc3RhdGVcclxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgKENvbXBvbmVudENvbnRhaW5lcjpjbGFzcykuc3RhdGVSZXF1ZXN0RXZlbnR9XHJcbiAgICAgKi9cclxuICAgIHNldFN0YXRlKHN0YXRlOiBKc29uVmFsdWUpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9zdGF0ZSA9IHN0YXRlO1xyXG4gICAgICAgIHRoaXMuX3BhcmVudC5lbWl0QmFzZUJ1YmJsaW5nRXZlbnQoJ3N0YXRlQ2hhbmdlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0J3MgdGhlIGNvbXBvbmVudHMgdGl0bGVcclxuICAgICAqL1xyXG4gICAgc2V0VGl0bGUodGl0bGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3BhcmVudC5zZXRUaXRsZSh0aXRsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc2V0VGFiKHRhYjogVGFiKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdGFiID0gdGFiO1xyXG4gICAgICAgIHRoaXMuZW1pdCgndGFiJywgdGFiKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHNldFZpc2liaWxpdHkodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fYm91bmRDb21wb25lbnQudmlydHVhbCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy52aXJ0dWFsVmlzaWJpbGl0eUNoYW5nZVJlcXVpcmVkRXZlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy52aXJ0dWFsVmlzaWJpbGl0eUNoYW5nZVJlcXVpcmVkRXZlbnQodGhpcywgdmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl92aXNpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92aXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9oZWlnaHQgPT09IDAgJiYgdGhpcy5fd2lkdGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc1Nob3duV2l0aFplcm9EaW1lbnNpb25zID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNTaG93bldpdGhaZXJvRGltZW5zaW9ucyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U2l6ZVRvTm9kZVNpemUodGhpcy5fd2lkdGgsIHRoaXMuX2hlaWdodCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0U2hvdygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lzU2hvd25XaXRoWmVyb0RpbWVuc2lvbnMgJiYgKHRoaXMuX2hlaWdodCAhPT0gMCB8fCB0aGlzLl93aWR0aCAhPT0gMCkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc1Nob3duV2l0aFplcm9EaW1lbnNpb25zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTaXplVG9Ob2RlU2l6ZSh0aGlzLl93aWR0aCwgdGhpcy5faGVpZ2h0LCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRTaG93KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fdmlzaWJsZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faXNTaG93bldpdGhaZXJvRGltZW5zaW9ucyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0SGlkZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNldEJhc2VMb2dpY2FsWkluZGV4KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2V0TG9naWNhbFpJbmRleChMb2dpY2FsWkluZGV4LmJhc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldExvZ2ljYWxaSW5kZXgobG9naWNhbFpJbmRleDogTG9naWNhbFpJbmRleCk6IHZvaWQge1xyXG4gICAgICAgIGlmIChsb2dpY2FsWkluZGV4ICE9PSB0aGlzLl9sb2dpY2FsWkluZGV4KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvZ2ljYWxaSW5kZXggPSBsb2dpY2FsWkluZGV4O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5ub3RpZnlWaXJ0dWFsWkluZGV4Q2hhbmdlUmVxdWlyZWQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIGNvbnRhaW5lcidzIHNpemUsIGJ1dCBjb25zaWRlcmVkIHRlbXBvcmFyeSAoZm9yIGRyYWdnaW5nKVxyXG4gICAgICogc28gZG9uJ3QgZW1pdCBhbnkgZXZlbnRzLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGVudGVyRHJhZ01vZGUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl93aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIHRoaXMuX2hlaWdodCA9IGhlaWdodDtcclxuICAgICAgICBzZXRFbGVtZW50V2lkdGgodGhpcy5fZWxlbWVudCwgd2lkdGgpO1xyXG4gICAgICAgIHNldEVsZW1lbnRIZWlnaHQodGhpcy5fZWxlbWVudCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRMb2dpY2FsWkluZGV4KExvZ2ljYWxaSW5kZXguZHJhZyk7XHJcblxyXG4gICAgICAgIHRoaXMuZHJhZygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4aXREcmFnTW9kZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNldEJhc2VMb2dpY2FsWkluZGV4KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZW50ZXJTdGFja01heGltaXNlZCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9zdGFja01heGltaXNlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zZXRMb2dpY2FsWkluZGV4KExvZ2ljYWxaSW5kZXguc3RhY2tNYXhpbWlzZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4aXRTdGFja01heGltaXNlZCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNldEJhc2VMb2dpY2FsWkluZGV4KCk7XHJcbiAgICAgICAgdGhpcy5fc3RhY2tNYXhpbWlzZWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBkcmFnKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9ib3VuZENvbXBvbmVudC52aXJ0dWFsKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnZpcnR1YWxSZWN0aW5nUmVxdWlyZWRFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9sYXlvdXRNYW5hZ2VyLmZpcmVCZWZvcmVWaXJ0dWFsUmVjdGluZ0V2ZW50KDEpO1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpcnR1YWxSZWN0aW5nUmVxdWlyZWRFdmVudCh0aGlzLCB0aGlzLl93aWR0aCwgdGhpcy5faGVpZ2h0KTtcclxuICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGF5b3V0TWFuYWdlci5maXJlQWZ0ZXJWaXJ0dWFsUmVjdGluZ0V2ZW50KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb250YWluZXIncyBzaXplLiBDYWxsZWQgYnkgdGhlIGNvbnRhaW5lcidzIGNvbXBvbmVudCBpdGVtLlxyXG4gICAgICogVG8gaW5zdGVhZCBzZXQgdGhlIHNpemUgcHJvZ3JhbW1hdGljYWxseSBmcm9tIHdpdGhpbiB0aGUgY29tcG9uZW50IGl0c2VsZixcclxuICAgICAqIHVzZSB0aGUgcHVibGljIHNldFNpemUgbWV0aG9kXHJcbiAgICAgKiBAcGFyYW0gd2lkdGggLSBpbiBweFxyXG4gICAgICogQHBhcmFtIGhlaWdodCAtIGluIHB4XHJcbiAgICAgKiBAcGFyYW0gZm9yY2UgLSBzZXQgZXZlbiBpZiBubyBjaGFuZ2VcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBzZXRTaXplVG9Ob2RlU2l6ZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgZm9yY2U6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBpZiAod2lkdGggIT09IHRoaXMuX3dpZHRoIHx8IGhlaWdodCAhPT0gdGhpcy5faGVpZ2h0IHx8IGZvcmNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3dpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgICAgIHRoaXMuX2hlaWdodCA9IGhlaWdodDtcclxuICAgICAgICAgICAgc2V0RWxlbWVudFdpZHRoKHRoaXMuX2VsZW1lbnQsIHdpZHRoKTtcclxuICAgICAgICAgICAgc2V0RWxlbWVudEhlaWdodCh0aGlzLl9lbGVtZW50LCBoZWlnaHQpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX2JvdW5kQ29tcG9uZW50LnZpcnR1YWwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkVmlydHVhbFNpemVkQ29udGFpbmVyVG9MYXlvdXRNYW5hZ2VyKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3Jlc2l6ZScpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja1Nob3duRnJvbVplcm9EaW1lbnNpb25zKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgbm90aWZ5VmlydHVhbFJlY3RpbmdSZXF1aXJlZCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy52aXJ0dWFsUmVjdGluZ1JlcXVpcmVkRXZlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnZpcnR1YWxSZWN0aW5nUmVxdWlyZWRFdmVudCh0aGlzLCB0aGlzLl93aWR0aCwgdGhpcy5faGVpZ2h0KTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdyZXNpemUnKTtcclxuICAgICAgICAgICAgdGhpcy5jaGVja1Nob3duRnJvbVplcm9EaW1lbnNpb25zKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgbm90aWZ5VmlydHVhbFpJbmRleENoYW5nZVJlcXVpcmVkKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnZpcnR1YWxaSW5kZXhDaGFuZ2VSZXF1aXJlZEV2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY29uc3QgbG9naWNhbFpJbmRleCA9IHRoaXMuX2xvZ2ljYWxaSW5kZXg7XHJcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRaSW5kZXggPSBMb2dpY2FsWkluZGV4VG9EZWZhdWx0TWFwW2xvZ2ljYWxaSW5kZXhdO1xyXG4gICAgICAgICAgICB0aGlzLnZpcnR1YWxaSW5kZXhDaGFuZ2VSZXF1aXJlZEV2ZW50KHRoaXMsIGxvZ2ljYWxaSW5kZXgsIGRlZmF1bHRaSW5kZXgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHVwZGF0ZUVsZW1lbnRQb3NpdGlvblByb3BlcnR5RnJvbUJvdW5kQ29tcG9uZW50KCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9ib3VuZENvbXBvbmVudC52aXJ0dWFsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnc3RhdGljJztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJyc7IC8vIHNldCBpdCBiYWNrIHRvIGF0dHJpYnV0ZSB2YWx1ZVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGFkZFZpcnR1YWxTaXplZENvbnRhaW5lclRvTGF5b3V0TWFuYWdlcigpIHtcclxuICAgICAgICB0aGlzLl9sYXlvdXRNYW5hZ2VyLmJlZ2luVmlydHVhbFNpemVkQ29udGFpbmVyQWRkaW5nKCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5fbGF5b3V0TWFuYWdlci5hZGRWaXJ0dWFsU2l6ZWRDb250YWluZXIodGhpcyk7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgdGhpcy5fbGF5b3V0TWFuYWdlci5lbmRWaXJ0dWFsU2l6ZWRDb250YWluZXJBZGRpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBjaGVja1Nob3duRnJvbVplcm9EaW1lbnNpb25zKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9pc1Nob3duV2l0aFplcm9EaW1lbnNpb25zICYmICh0aGlzLl9oZWlnaHQgIT09IDAgfHwgdGhpcy5fd2lkdGggIT09IDApKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzU2hvd25XaXRoWmVyb0RpbWVuc2lvbnMgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0U2hvdygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGVtaXRTaG93KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZW1pdCgnc2hvd24nKTtcclxuICAgICAgICB0aGlzLmVtaXQoJ3Nob3cnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGVtaXRIaWRlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZW1pdCgnaGlkZScpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVsZWFzZUNvbXBvbmVudCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fc3RhY2tNYXhpbWlzZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5leGl0U3RhY2tNYXhpbWlzZWQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5lbWl0KCdiZWZvcmVDb21wb25lbnRSZWxlYXNlJywgdGhpcy5fYm91bmRDb21wb25lbnQuY29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIudW5iaW5kQ29tcG9uZW50KHRoaXMsIHRoaXMuX2JvdW5kQ29tcG9uZW50LnZpcnR1YWwsIHRoaXMuX2JvdW5kQ29tcG9uZW50LmNvbXBvbmVudCk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgQ29tcG9uZW50Q29udGFpbmVyfSAqL1xyXG5leHBvcnQgdHlwZSBJdGVtQ29udGFpbmVyID0gQ29tcG9uZW50Q29udGFpbmVyO1xyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBDb21wb25lbnRDb250YWluZXIge1xyXG4gICAgZXhwb3J0IHR5cGUgQ29tcG9uZW50ID0gdW5rbm93bjtcclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIEJpbmRhYmxlQ29tcG9uZW50IHtcclxuICAgICAgICBjb21wb25lbnQ6IENvbXBvbmVudDtcclxuICAgICAgICB2aXJ0dWFsOiBib29sZWFuO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCB0eXBlIFN0YXRlUmVxdWVzdEV2ZW50SGFuZGxlciA9ICh0aGlzOiB2b2lkKSA9PiBKc29uVmFsdWUgfCB1bmRlZmluZWQ7XHJcbiAgICBleHBvcnQgdHlwZSBWaXJ0dWFsUmVjdGluZ1JlcXVpcmVkRXZlbnQgPSAodGhpczogdm9pZCwgY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSA9PiB2b2lkO1xyXG4gICAgZXhwb3J0IHR5cGUgVmlydHVhbFZpc2liaWxpdHlDaGFuZ2VSZXF1aXJlZEV2ZW50ID0gKHRoaXM6IHZvaWQsIGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCB2aXNpYmxlOiBib29sZWFuKSA9PiB2b2lkO1xyXG4gICAgZXhwb3J0IHR5cGUgVmlydHVhbFpJbmRleENoYW5nZVJlcXVpcmVkRXZlbnQgPVxyXG4gICAgICAgICh0aGlzOiB2b2lkLCBjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgbG9naWNhbFpJbmRleDogTG9naWNhbFpJbmRleCwgZGVmYXVsdFpJbmRleDogc3RyaW5nKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgU2hvd0V2ZW50SGFuZGxlciA9ICh0aGlzOiB2b2lkKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgSGlkZUV2ZW50SGFuZGxlciA9ICh0aGlzOiB2b2lkKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgRm9jdXNFdmVudEhhbmRsZXIgPSAodGhpczogdm9pZCwgc3VwcHJlc3NFdmVudDogYm9vbGVhbikgPT4gdm9pZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIEJsdXJFdmVudEhhbmRsZXIgPSAodGhpczogdm9pZCwgc3VwcHJlc3NFdmVudDogYm9vbGVhbikgPT4gdm9pZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIFVwZGF0ZUl0ZW1Db25maWdFdmVudEhhbmRsZXIgPSAoaXRlbUNvbmZpZzogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnKSA9PiB2b2lkO1xyXG59XHJcbiIsImltcG9ydCB7IFJlc29sdmVkTGF5b3V0Q29uZmlnLCBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZywgUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcgfSBmcm9tICcuLi9jb25maWcvcmVzb2x2ZWQtY29uZmlnJztcclxuaW1wb3J0IHsgUG9wb3V0QmxvY2tlZEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2V4dGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgVW5leHBlY3RlZE51bGxFcnJvciwgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgQ29udGVudEl0ZW0gfSBmcm9tICcuLi9pdGVtcy9jb250ZW50LWl0ZW0nO1xyXG5pbXBvcnQgeyBSb3dPckNvbHVtbiB9IGZyb20gJy4uL2l0ZW1zL3Jvdy1vci1jb2x1bW4nO1xyXG5pbXBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi4vbGF5b3V0LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi91dGlscy9ldmVudC1lbWl0dGVyJztcclxuaW1wb3J0IHsgUmVjdCwgSXRlbVR5cGUgfSBmcm9tICcuLi91dGlscy90eXBlcyc7XHJcbmltcG9ydCB7IGRlZXBFeHRlbmQsIGdldEVycm9yTWVzc2FnZSwgZ2V0VW5pcXVlSWQsIGdldFdpbmRvd1RvcExlZnRCb3JkZXIgfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcblxyXG4vKipcclxuICogUG9wcyBhIGNvbnRlbnQgaXRlbSBvdXQgaW50byBhIG5ldyBicm93c2VyIHdpbmRvdy5cclxuICogVGhpcyBpcyBhY2hpZXZlZCBieVxyXG4gKlxyXG4gKiAgICAtIENyZWF0aW5nIGEgbmV3IGNvbmZpZ3VyYXRpb24gd2l0aCB0aGUgY29udGVudCBpdGVtIGFzIHJvb3QgZWxlbWVudFxyXG4gKiAgICAtIFNlcmlhbGl6aW5nIGFuZCBtaW5pZnlpbmcgdGhlIGNvbmZpZ3VyYXRpb25cclxuICogICAgLSBPcGVuaW5nIHRoZSBjdXJyZW50IHdpbmRvdydzIFVSTCB3aXRoIHRoZSBjb25maWd1cmF0aW9uIGFzIGEgR0VUIHBhcmFtZXRlclxyXG4gKiAgICAtIEdvbGRlbkxheW91dCB3aGVuIG9wZW5lZCBpbiB0aGUgbmV3IHdpbmRvdyB3aWxsIGxvb2sgZm9yIHRoZSBHRVQgcGFyYW1ldGVyXHJcbiAqICAgICAgYW5kIHVzZSBpdCBpbnN0ZWFkIG9mIHRoZSBwcm92aWRlZCBjb25maWd1cmF0aW9uXHJcbiAqIEBwdWJsaWNcclxuICovXHJcblxyXG5leHBvcnQgY2xhc3MgQnJvd3NlclBvcG91dCBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9wb3BvdXRXaW5kb3c6IFdpbmRvdyB8IG51bGw7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9pc0luaXRpYWxpc2VkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfY2hlY2tSZWFkeUludGVydmFsOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3ByZXZlbnRQb3BJbk9uQ2xvc2U6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0gX2NvbmZpZyAtIEdvbGRlbkxheW91dCBpdGVtIGNvbmZpZ1xyXG4gICAgICogQHBhcmFtIF9pbml0aWFsV2luZG93U2l6ZSAtIEEgbWFwIHdpdGggd2lkdGgsIGhlaWdodCwgdG9wIGFuZCBsZWZ0XHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX2NvbmZpZzogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX2luaXRpYWxXaW5kb3dTaXplOiBSZWN0LFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9sYXlvdXRNYW5hZ2VyOiBMYXlvdXRNYW5hZ2VyLFxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXNlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3BvcG91dFdpbmRvdyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fcHJldmVudFBvcEluT25DbG9zZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlV2luZG93KCk7XHJcbiAgICB9XHJcblxyXG4gICAgdG9Db25maWcoKTogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcge1xyXG4gICAgICAgIGlmICh0aGlzLl9pc0luaXRpYWxpc2VkID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgY3JlYXRlIGNvbmZpZywgbGF5b3V0IG5vdCB5ZXQgaW5pdGlhbGlzZWQnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGdsSW5zdGFuY2UgPSB0aGlzLmdldEdsSW5zdGFuY2UoKTtcclxuICAgICAgICBjb25zdCBnbEluc3RhbmNlQ29uZmlnID0gZ2xJbnN0YW5jZS5zYXZlTGF5b3V0KCk7XHJcblxyXG4gICAgICAgIGxldCBsZWZ0OiBudW1iZXIgfCBudWxsO1xyXG4gICAgICAgIGxldCB0b3A6IG51bWJlciB8IG51bGw7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BvcG91dFdpbmRvdyA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICBsZWZ0ID0gbnVsbDtcclxuICAgICAgICAgICAgdG9wID0gbnVsbDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZWZ0ID0gdGhpcy5fcG9wb3V0V2luZG93LnNjcmVlblggPz8gdGhpcy5fcG9wb3V0V2luZG93LnNjcmVlbkxlZnQ7XHJcbiAgICAgICAgICAgIHRvcCA9IHRoaXMuX3BvcG91dFdpbmRvdy5zY3JlZW5ZID8/IHRoaXMuX3BvcG91dFdpbmRvdy5zY3JlZW5Ub3A7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB3aW5kb3c6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLldpbmRvdyA9IHtcclxuICAgICAgICAgICAgd2lkdGg6IHRoaXMuZ2V0R2xJbnN0YW5jZSgpLndpZHRoLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IHRoaXMuZ2V0R2xJbnN0YW5jZSgpLmhlaWdodCxcclxuICAgICAgICAgICAgbGVmdCxcclxuICAgICAgICAgICAgdG9wLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbmZpZzogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcgPSB7XHJcbiAgICAgICAgICAgIHJvb3Q6IGdsSW5zdGFuY2VDb25maWcucm9vdCxcclxuICAgICAgICAgICAgb3BlblBvcG91dHM6IGdsSW5zdGFuY2VDb25maWcub3BlblBvcG91dHMsXHJcbiAgICAgICAgICAgIHNldHRpbmdzOiBnbEluc3RhbmNlQ29uZmlnLnNldHRpbmdzLFxyXG4gICAgICAgICAgICBkaW1lbnNpb25zOiBnbEluc3RhbmNlQ29uZmlnLmRpbWVuc2lvbnMsXHJcbiAgICAgICAgICAgIGhlYWRlcjogZ2xJbnN0YW5jZUNvbmZpZy5oZWFkZXIsXHJcbiAgICAgICAgICAgIHdpbmRvdyxcclxuICAgICAgICAgICAgcGFyZW50SWQ6IHRoaXMuX2NvbmZpZy5wYXJlbnRJZCxcclxuICAgICAgICAgICAgaW5kZXhJblBhcmVudDogdGhpcy5fY29uZmlnLmluZGV4SW5QYXJlbnQsXHJcbiAgICAgICAgICAgIHJlc29sdmVkOiB0cnVlLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiBjb25maWc7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0R2xJbnN0YW5jZSgpOiBMYXlvdXRNYW5hZ2VyIHtcclxuICAgICAgICBpZiAodGhpcy5fcG9wb3V0V2luZG93ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdCUEdHSTI0NjkzJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9wb3BvdXRXaW5kb3cuX19nbEluc3RhbmNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSBuYXRpdmUgQnJvd3NlcldpbmRvdyBiYWNraW5nIHRoaXMgcG9wb3V0LlxyXG4gICAgICogTWlnaHQgdGhyb3cgYW4gVW5leHBlY3RlZE51bGxFcnJvciBleGNlcHRpb24gd2hlbiB0aGUgd2luZG93IGlzIG5vdCBpbml0aWFsaXplZCB5ZXQuXHJcbiAgICAgKiBAcHVibGljXHJcbiAgICAgKi9cclxuICAgIGdldFdpbmRvdygpOiBXaW5kb3cge1xyXG4gICAgICAgIGlmICh0aGlzLl9wb3BvdXRXaW5kb3cgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0JQR1cwODcyMTUnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcG91dFdpbmRvdztcclxuICAgIH1cclxuXHJcbiAgICBjbG9zZShwcmV2ZW50UG9wSW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChwcmV2ZW50UG9wSW4pIHtcclxuICAgICAgICAgICAgdGhpcy5fcHJldmVudFBvcEluT25DbG9zZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5nZXRHbEluc3RhbmNlKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5nZXRHbEluc3RhbmNlKCkuY2xvc2VXaW5kb3coKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRXaW5kb3coKS5jbG9zZSgpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgcG9wcGVkIG91dCBpdGVtIHRvIGl0cyBvcmlnaW5hbCBwb3NpdGlvbi4gSWYgdGhlIG9yaWdpbmFsXHJcbiAgICAgKiBwYXJlbnQgaXNuJ3QgYXZhaWxhYmxlIGFueW1vcmUgaXQgZmFsbHMgYmFjayB0byB0aGUgbGF5b3V0J3MgdG9wbW9zdCBlbGVtZW50XHJcbiAgICAgKi9cclxuICAgIHBvcEluKCk6IHZvaWQge1xyXG4gICAgICAgIGxldCBwYXJlbnRJdGVtOiBDb250ZW50SXRlbTtcclxuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLl9jb25maWcuaW5kZXhJblBhcmVudDtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb25maWcucGFyZW50SWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLypcclxuICAgICAgICAqIFRoZSBkZWVwRXh0ZW5kIGNhbGwgc2VlbXMgYSBiaXQgcG9pbnRsZXNzLCBidXQgaXQncyBjcnVjaWFsIHRvXHJcbiAgICAgICAgKiBjb3B5IHRoZSBjb25maWcgcmV0dXJuZWQgYnkgdGhpcy5nZXRHbEluc3RhbmNlKCkudG9Db25maWcoKVxyXG4gICAgICAgICogb250byBhIG5ldyBvYmplY3QuIEludGVybmV0IEV4cGxvcmVyIGtlZXBzIHRoZSByZWZlcmVuY2VzXHJcbiAgICAgICAgKiB0byBvYmplY3RzIG9uIHRoZSBjaGlsZCB3aW5kb3csIHJlc3VsdGluZyBpbiB0aGUgZm9sbG93aW5nIGVycm9yXHJcbiAgICAgICAgKiBvbmNlIHRoZSBjaGlsZCB3aW5kb3cgaXMgY2xvc2VkOlxyXG4gICAgICAgICpcclxuICAgICAgICAqIFRoZSBjYWxsZWUgKHNlcnZlciBbbm90IHNlcnZlciBhcHBsaWNhdGlvbl0pIGlzIG5vdCBhdmFpbGFibGUgYW5kIGRpc2FwcGVhcmVkXHJcbiAgICAgICAgKi9cclxuICAgICAgICBjb25zdCBnbEluc3RhbmNlTGF5b3V0Q29uZmlnID0gdGhpcy5nZXRHbEluc3RhbmNlKCkuc2F2ZUxheW91dCgpO1xyXG4gICAgICAgIGNvbnN0IGNvcGllZEdsSW5zdGFuY2VMYXlvdXRDb25maWcgPSBkZWVwRXh0ZW5kKHt9LCBnbEluc3RhbmNlTGF5b3V0Q29uZmlnKSBhcyBSZXNvbHZlZExheW91dENvbmZpZztcclxuICAgICAgICBsZXQgY29waWVkUm9vdCA9IGNvcGllZEdsSW5zdGFuY2VMYXlvdXRDb25maWcucm9vdDtcclxuICAgICAgICBpZiAoY29waWVkUm9vdCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZ3JvdW5kSXRlbSA9IHRoaXMuX2xheW91dE1hbmFnZXIuZ3JvdW5kSXRlbTtcclxuICAgICAgICBpZiAoZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0JQUElHMzQ5NzInKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcGFyZW50SXRlbSA9IGdyb3VuZEl0ZW0uZ2V0SXRlbXNCeVBvcEluUGFyZW50SWQodGhpcy5fY29uZmlnLnBhcmVudElkKVswXTtcclxuXHJcbiAgICAgICAgLypcclxuICAgICAgICAqIEZhbGxiYWNrIGlmIHBhcmVudEl0ZW0gaXMgbm90IGF2YWlsYWJsZS4gRWl0aGVyIGFkZCBpdCB0byB0aGUgdG9wbW9zdFxyXG4gICAgICAgICogaXRlbSBvciBtYWtlIGl0IHRoZSB0b3Btb3N0IGl0ZW0gaWYgdGhlIGxheW91dCBpcyBlbXB0eVxyXG4gICAgICAgICovXHJcbiAgICAgICAgaWYgKCFwYXJlbnRJdGVtKSB7XHJcbiAgICAgICAgICAgIGlmIChncm91bmRJdGVtLmNvbnRlbnRJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRJdGVtID0gZ3JvdW5kSXRlbS5jb250ZW50SXRlbXNbMF07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRJdGVtID0gZ3JvdW5kSXRlbTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpbmRleCA9IHBhcmVudEl0ZW0uY29udGVudEl0ZW1zLmxlbmd0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChwYXJlbnRJdGVtLmlzU3RhY2spIHsgICBcclxuICAgICAgICAgICAgLy8gU3RhY2tzIGNhbiBvbmx5IGhvbGQgY29tcG9uZW50IGl0ZW1zIC0+IHRyeSB0byBmaW5kIG9uZSBieSB1bnJhdmVsaW5nIGNvbnRhaW5lcnMgd2l0aCBhIHNpbmdsZSBjaGlsZFxyXG4gICAgICAgICAgICB3aGlsZSAoY29waWVkUm9vdC50eXBlICE9PSBJdGVtVHlwZS5jb21wb25lbnQgJiYgY29waWVkUm9vdC5jb250ZW50Lmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgY29waWVkUm9vdCA9IGNvcGllZFJvb3QuY29udGVudFswXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gRmFpbGVkIHRvIGZpbmQgYSBjb21wb25lbnQgaXRlbSwgd3JhcCB0aGUgcGFyZW50IGl0ZW0gYW5kIGRvY2tlZCBpdGVtIGluIGEgcm93IGFzIHNpYmxpbmdzXHJcbiAgICAgICAgICAgIGlmIChjb3BpZWRSb290LnR5cGUgIT09IEl0ZW1UeXBlLmNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudEl0ZW0ucGFyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0JQUElHMzQ5NzMnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSBuZXcgUm93T3JDb2x1bW4oZmFsc2UsIHRoaXMuX2xheW91dE1hbmFnZXIsIFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnLmNyZWF0ZURlZmF1bHQoJ3JvdycpLCBwYXJlbnRJdGVtLnBhcmVudCk7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRJdGVtLnBhcmVudC5yZXBsYWNlQ2hpbGQocGFyZW50SXRlbSwgcm93LCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICByb3cuYWRkQ2hpbGQocGFyZW50SXRlbSk7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRJdGVtID0gcm93O1xyXG4gICAgICAgICAgICAgICAgaW5kZXggPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBuZXdDb250ZW50SXRlbSA9IHRoaXMuX2xheW91dE1hbmFnZXIuY3JlYXRlQW5kSW5pdENvbnRlbnRJdGVtKGNvcGllZFJvb3QsIHBhcmVudEl0ZW0pO1xyXG5cclxuICAgICAgICBpbmRleCA9IChpbmRleCAhPT0gbnVsbCkgPyBNYXRoLm1heCgwLCBNYXRoLm1pbihwYXJlbnRJdGVtLmNvbnRlbnRJdGVtcy5sZW5ndGgsIGluZGV4KSkgOiBudWxsO1xyXG4gICAgICAgIHBhcmVudEl0ZW0uYWRkQ2hpbGQobmV3Q29udGVudEl0ZW0sIGluZGV4KTtcclxuICAgICAgICBpZiAodGhpcy5fbGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuc2V0dGluZ3MucG9wSW5PbkNsb3NlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX29uQ2xvc2UoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyB0aGUgVVJMIGFuZCB3aW5kb3cgcGFyYW1ldGVyXHJcbiAgICAgKiBhbmQgb3BlbnMgYSBuZXcgd2luZG93XHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVXaW5kb3coKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5jcmVhdGVVcmwoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQm9ndXMgdGl0bGUgdG8gcHJldmVudCByZS11c2FnZSBvZiBleGlzdGluZyB3aW5kb3cgd2l0aCB0aGVcclxuICAgICAgICAgKiBzYW1lIHRpdGxlLiBUaGUgYWN0dWFsIHRpdGxlIHdpbGwgYmUgc2V0IGJ5IHRoZSBuZXcgd2luZG93J3NcclxuICAgICAgICAgKiBHb2xkZW5MYXlvdXQgaW5zdGFuY2UgaWYgaXQgZGV0ZWN0cyB0aGF0IGl0IGlzIGluIHN1YldpbmRvd01vZGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCB0YXJnZXQgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwKS50b1N0cmluZygzNik7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBvcHRpb25zIGFzIHVzZWQgaW4gdGhlIHdpbmRvdy5vcGVuIHN0cmluZ1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IGZlYXR1cmVzID0gdGhpcy5zZXJpYWxpemVXaW5kb3dGZWF0dXJlcyh7XHJcbiAgICAgICAgICAgIGxlZnQ6IHRoaXMuX2luaXRpYWxXaW5kb3dTaXplLmxlZnQsXHJcbiAgICAgICAgICAgIHRvcDogdGhpcy5faW5pdGlhbFdpbmRvd1NpemUudG9wLFxyXG4gICAgICAgICAgICB3aWR0aDogdGhpcy5faW5pdGlhbFdpbmRvd1NpemUud2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy5faW5pdGlhbFdpbmRvd1NpemUuaGVpZ2h0LFxyXG4gICAgICAgICAgICBpbm5lcldpZHRoOiB0aGlzLl9pbml0aWFsV2luZG93U2l6ZS53aWR0aCxcclxuICAgICAgICAgICAgaW5uZXJIZWlnaHQ6IHRoaXMuX2luaXRpYWxXaW5kb3dTaXplLmhlaWdodCxcclxuICAgICAgICAgICAgbWVudWJhcjogJ25vJyxcclxuICAgICAgICAgICAgdG9vbGJhcjogJ25vJyxcclxuICAgICAgICAgICAgbG9jYXRpb246ICdubycsXHJcbiAgICAgICAgICAgIHBlcnNvbmFsYmFyOiAnbm8nLFxyXG4gICAgICAgICAgICByZXNpemFibGU6ICd5ZXMnLFxyXG4gICAgICAgICAgICBzY3JvbGxiYXJzOiAnbm8nLFxyXG4gICAgICAgICAgICBzdGF0dXM6ICdubydcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fcG9wb3V0V2luZG93ID0gZ2xvYmFsVGhpcy5vcGVuKHVybCwgdGFyZ2V0LCBmZWF0dXJlcyk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fcG9wb3V0V2luZG93KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9sYXlvdXRNYW5hZ2VyLmxheW91dENvbmZpZy5zZXR0aW5ncy5ibG9ja2VkUG9wb3V0c1Rocm93RXJyb3IgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IFBvcG91dEJsb2NrZWRFcnJvcignUG9wb3V0IGJsb2NrZWQnKTtcclxuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wb3BvdXRXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHsgICAgXHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25BbmRSZXNpemVXaW5kb3coKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9wb3BvdXRXaW5kb3cpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3BvcG91dFdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2xheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLnNldHRpbmdzLnBvcEluT25DbG9zZSAmJiAhdGhpcy5fcHJldmVudFBvcEluT25DbG9zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcEluKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25DbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUG9sbGluZyB0aGUgY2hpbGR3aW5kb3cgdG8gZmluZCBvdXQgaWYgR29sZGVuTGF5b3V0IGhhcyBiZWVuIGluaXRpYWxpc2VkXHJcbiAgICAgICAgICogZG9lc24ndCBzZWVtIG9wdGltYWwsIGJ1dCB0aGUgYWx0ZXJuYXRpdmVzIC0gYWRkaW5nIGEgY2FsbGJhY2sgdG8gdGhlIHBhcmVudFxyXG4gICAgICAgICAqIHdpbmRvdyBvciByYWlzaW5nIGFuIGV2ZW50IG9uIHRoZSB3aW5kb3cgb2JqZWN0IC0gYm90aCB3b3VsZCBpbnRyb2R1Y2Uga25vd2xlZGdlXHJcbiAgICAgICAgICogYWJvdXQgdGhlIHBhcmVudCB0byB0aGUgY2hpbGQgd2luZG93IHdoaWNoIHdlJ2QgcmF0aGVyIGF2b2lkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fY2hlY2tSZWFkeUludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5jaGVja1JlYWR5KCksIDEwKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGNoZWNrUmVhZHkoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BvcG91dFdpbmRvdyA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignQlBDUjAxODQ0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3BvcG91dFdpbmRvdy5fX2dsSW5zdGFuY2UgJiYgdGhpcy5fcG9wb3V0V2luZG93Ll9fZ2xJbnN0YW5jZS5pc0luaXRpYWxpc2VkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9wb3BvdXRXaW5kb3cuX19nbEluc3RhbmNlLnBhcmVudCA9IHRoaXMuX2xheW91dE1hbmFnZXI7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uSW5pdGlhbGlzZWQoKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jaGVja1JlYWR5SW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5fY2hlY2tSZWFkeUludGVydmFsKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGVja1JlYWR5SW50ZXJ2YWwgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBwb3NpdGlvbkFuZFJlc2l6ZVdpbmRvdygpIHtcclxuICAgICAgICBpZiAodGhpcy5fcG9wb3V0V2luZG93ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdCUFBBUlcxJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJbml0aWFsIHdpbmRvdyBzaXplIHBhcmFtZXRlcnMgZGVzY3JpYmUgY2xpZW50IChpLmUuIGlubmVyKSBwb3NpdGlvbiBhbmQgc2l6ZVxyXG4gICAgICAgIC8vIFNpbmNlIHRoZSBib3JkZXIgb2YgdGhlIHBvcG91dCBtYXkgaGF2ZSBkaWZmZXJlbnQgYm9yZGVycyB0aGFuIHRoZSBtYWluIHdpbmRvdywgd2UgaGF2ZVxyXG4gICAgICAgIC8vIHRvIGFkanVzdCB0aGUgcG9zaXRpb24gYW5kIHNpemUgb25jZSB0aGUgd2luZG93IGhhcyBiZWVuIGNyZWF0ZWQuXHJcbiAgICAgICAgLy8gT25seSBkbyB0aGlzIGlmIHRoZSB3aW5kb3cgcGFyYW1ldGVycyBhcmUgcGxhdXNpYmxlIChlLmcuIG9uIExpbnV4IGlubmVyIGRpbWVuc2lvbiBpcyB6ZXJvIHNvbWV0aW1lcylcclxuICAgICAgICBpZiAodGhpcy5fcG9wb3V0V2luZG93LmlubmVyV2lkdGggPiAwICYmIHRoaXMuX3BvcG91dFdpbmRvdy5pbm5lckhlaWdodCA+IDAgJiZcclxuICAgICAgICAgICAgdGhpcy5fcG9wb3V0V2luZG93Lm91dGVyV2lkdGggPiAwICYmIHRoaXMuX3BvcG91dFdpbmRvdy5vdXRlckhlaWdodCA+IDAgJiZcclxuICAgICAgICAgICAgdGhpcy5fcG9wb3V0V2luZG93LmlubmVyV2lkdGggPD0gdGhpcy5fcG9wb3V0V2luZG93Lm91dGVyV2lkdGggJiZcclxuICAgICAgICAgICAgdGhpcy5fcG9wb3V0V2luZG93LmlubmVySGVpZ2h0IDw9IHRoaXMuX3BvcG91dFdpbmRvdy5vdXRlckhlaWdodCkge1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnN0IGJvcmRlciA9IGdldFdpbmRvd1RvcExlZnRCb3JkZXIodGhpcy5fcG9wb3V0V2luZG93KTtcclxuICAgICAgICAgICAgdGhpcy5fcG9wb3V0V2luZG93Lm1vdmVUbyhcclxuICAgICAgICAgICAgICAgIHRoaXMuX2luaXRpYWxXaW5kb3dTaXplLmxlZnQgLSBib3JkZXIud2lkdGgsXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pbml0aWFsV2luZG93U2l6ZS50b3AgLSBib3JkZXIuaGVpZ2h0LFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLl9wb3BvdXRXaW5kb3cucmVzaXplVG8oXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pbml0aWFsV2luZG93U2l6ZS53aWR0aCArICh0aGlzLl9wb3BvdXRXaW5kb3cub3V0ZXJXaWR0aCAtIHRoaXMuX3BvcG91dFdpbmRvdy5pbm5lcldpZHRoKSxcclxuICAgICAgICAgICAgICAgIHRoaXMuX2luaXRpYWxXaW5kb3dTaXplLmhlaWdodCArICh0aGlzLl9wb3BvdXRXaW5kb3cub3V0ZXJIZWlnaHQgLSB0aGlzLl9wb3BvdXRXaW5kb3cuaW5uZXJIZWlnaHQpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wb3BvdXRXaW5kb3cuZm9jdXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlcmlhbGlzZXMgYSBtYXAgb2Yga2V5OnZhbHVlcyB0byBhIHdpbmRvdyBvcHRpb25zIHN0cmluZ1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB3aW5kb3dPcHRpb25zIC1cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBzZXJpYWxpc2VkIHdpbmRvdyBvcHRpb25zXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzZXJpYWxpemVXaW5kb3dGZWF0dXJlcyh3aW5kb3dPcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+KTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCB3aW5kb3dPcHRpb25zU3RyaW5nOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB3aW5kb3dPcHRpb25zKSB7XHJcbiAgICAgICAgICAgIHdpbmRvd09wdGlvbnNTdHJpbmcucHVzaChrZXkgKyAnPScgKyB3aW5kb3dPcHRpb25zW2tleV0udG9TdHJpbmcoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gd2luZG93T3B0aW9uc1N0cmluZy5qb2luKCcsJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIHRoZSBVUkwgZm9yIHRoZSBuZXcgd2luZG93LCBpbmNsdWRpbmcgdGhlXHJcbiAgICAgKiBjb25maWcgR0VUIHBhcmFtZXRlclxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIFVSTFxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlVXJsKCk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3Qgc3RvcmFnZUtleSA9ICdnbC13aW5kb3ctY29uZmlnLScgKyBnZXRVbmlxdWVJZCgpO1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IFJlc29sdmVkTGF5b3V0Q29uZmlnLm1pbmlmeUNvbmZpZyh0aGlzLl9jb25maWcpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShzdG9yYWdlS2V5LCBKU09OLnN0cmluZ2lmeShjb25maWcpKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3Igd2hpbGUgd3JpdGluZyB0byBsb2NhbFN0b3JhZ2UgJyArIGdldEVycm9yTWVzc2FnZShlKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKCcvZ2wtcG9wb3V0JywgbG9jYXRpb24ub3JpZ2luKTtcclxuICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgnZ2wtd2luZG93Jywgc3RvcmFnZUtleSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHRoZW1lID0gdGhpcy5fbGF5b3V0TWFuYWdlci5jb250YWluZXIuZGF0YXNldC50aGVtZTtcclxuICAgICAgICBpZiAodGhlbWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgnZ2wtdGhlbWUnLCB0aGVtZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdXJsLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayB3aGVuIHRoZSBuZXcgd2luZG93IGlzIG9wZW5lZCBhbmQgdGhlIEdvbGRlbkxheW91dCBpbnN0YW5jZVxyXG4gICAgICogd2l0aGluIGl0IGlzIGluaXRpYWxpc2VkXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvbkluaXRpYWxpc2VkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2lzSW5pdGlhbGlzZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZ2V0R2xJbnN0YW5jZSgpLm9uKCdwb3BJbicsICgpID0+IHRoaXMucG9wSW4oKSk7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdpbml0aWFsaXNlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW52b2tlZCA1MG1zIGFmdGVyIHRoZSB3aW5kb3cgdW5sb2FkIGV2ZW50XHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfb25DbG9zZSgpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZW1pdCgnY2xvc2VkJyksIDUwKTtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBEcmFnUHJveHkgfSBmcm9tICcuL2RyYWctcHJveHknO1xyXG5pbXBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi4vbGF5b3V0LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBVbmV4cGVjdGVkTnVsbEVycm9yLCBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi91dGlscy9ldmVudC1lbWl0dGVyJztcclxuaW1wb3J0IHsgQ29udGVudEl0ZW0gfSBmcm9tICcuLi9pdGVtcy9jb250ZW50LWl0ZW0nO1xyXG5pbXBvcnQgeyBDb21wb25lbnRJdGVtIH0gZnJvbSAnLi4vaXRlbXMvY29tcG9uZW50LWl0ZW0nO1xyXG5pbXBvcnQgeyBEcmFnTGlzdGVuZXIgfSBmcm9tICcuLi91dGlscy9kcmFnLWxpc3RlbmVyJztcclxuaW1wb3J0IHsgZ2V0V2luZG93SW5uZXJTY3JlZW5Qb3NpdGlvbiB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuY2xhc3MgRHJhZ1RhcmdldCB7XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9vd25lcjogRHJhZ0FjdGlvbixcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9hcmVhOiBDb250ZW50SXRlbS5BcmVhLFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX3BhZ2VYOiBudW1iZXIsXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfcGFnZVk6IG51bWJlcikge1xyXG4gICAgICAgIGlmIChfb3duZXIubGF5b3V0TWFuYWdlciAhPT0gX2FyZWEuY29udGVudEl0ZW0ubGF5b3V0TWFuYWdlcikge1xyXG4gICAgICAgICAgICB0aHJvdyBFcnJvcignTGF5b3V0TWFuYWdlciBvZiBBcmVhIGFuZCBEcmFnUHJveHkgbXVzdCBtYXRjaCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgb3duZXIoKTogRHJhZ0FjdGlvbiB7IHJldHVybiB0aGlzLl9vd25lcjsgfVxyXG4gICAgZ2V0IGFyZWEoKTogQ29udGVudEl0ZW0uQXJlYSB7IHJldHVybiB0aGlzLl9hcmVhOyB9XHJcblxyXG4gICAgZHJvcChpdGVtOiBDb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgdGhpcy5fYXJlYS5jb250ZW50SXRlbS5vbkRyb3AoaXRlbSwgdGhpcy5fYXJlYSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGlnaGxpZ2h0RHJvcFpvbmUoKSB7XHJcbiAgICAgICAgdGhpcy5hcmVhLmNvbnRlbnRJdGVtLmhpZ2hsaWdodERyb3Bab25lKHRoaXMuX3BhZ2VYLCB0aGlzLl9wYWdlWSwgdGhpcy5fYXJlYSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGNsYXNzIERyYWdBY3Rpb24gZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgcHJpdmF0ZSBfZHJhZ1Byb3h5OiBEcmFnUHJveHkgfCBudWxsID0gbnVsbDtcclxuICAgIHByaXZhdGUgX2N1cnJlbnRUYXJnZXQ6IERyYWdUYXJnZXQgfCBudWxsID0gbnVsbDtcclxuICAgIHByaXZhdGUgX2RyYWdMaXN0ZW5lcjogRHJhZ0xpc3RlbmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgICBwcml2YXRlIF9ib3VuZGluZ1JlY3Q6IERPTVJlY3Q7XHJcbiAgICBwcml2YXRlIF9hY3Rpb25zOiBEcmFnQWN0aW9uW10gPSBbXTtcclxuXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kcmFnRXZlbnRIYW5kbGVyID0gKF9vZmZzZXRYOiBudW1iZXIsIF9vZmZzZXRZOiBudW1iZXIsIGV2ZW50OiBFdmVudEVtaXR0ZXIuRHJhZ0V2ZW50KSA9PiB0aGlzLm9uRHJhZyhldmVudCk7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kcmFnU3RvcEV2ZW50SGFuZGxlciA9ICgpID0+IHRoaXMub25EcmFnU3RvcCgpO1xyXG5cclxuICAgIGdldCBsYXlvdXRNYW5hZ2VyKCk6IExheW91dE1hbmFnZXIgeyByZXR1cm4gdGhpcy5fbGF5b3V0TWFuYWdlcjsgfVxyXG4gICAgZ2V0IHBhcmVudCgpOiBEcmFnQWN0aW9uIHwgbnVsbCB7IHJldHVybiB0aGlzLl9wYXJlbnQ7IH1cclxuICAgIGdldCBwcm94eSgpOiBEcmFnUHJveHkgfCBudWxsIHsgcmV0dXJuIHRoaXMuX2RyYWdQcm94eTsgfVxyXG4gICAgcHJpdmF0ZSBnZXQgcGFyZW50T3JTZWxmKCk6IERyYWdBY3Rpb24geyByZXR1cm4gdGhpcy5fcGFyZW50ID8/IHRoaXM7IH1cclxuICAgIGdldCBjdXJyZW50VGFyZ2V0KCk6IERyYWdUYXJnZXQgfCBudWxsIHsgcmV0dXJuIHRoaXMucGFyZW50T3JTZWxmLl9jdXJyZW50VGFyZ2V0OyB9XHJcbiAgICBwcml2YXRlIHNldCBjdXJyZW50VGFyZ2V0KHZhbHVlIDogRHJhZ1RhcmdldCB8IG51bGwpIHsgdGhpcy5wYXJlbnRPclNlbGYuX2N1cnJlbnRUYXJnZXQgPSB2YWx1ZTsgfVxyXG5cclxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfbGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlcixcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9hbGxvd1BvcG91dDogYm9vbGVhbiA9IGZhbHNlLFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX3BhcmVudDogRHJhZ0FjdGlvbiB8IG51bGwgPSBudWxsXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMuX2JvdW5kaW5nUmVjdCA9IHRoaXMuY29tcHV0ZUJvdW5kaW5nUmVjdCgpO1xyXG4gICAgICAgIHRoaXMucGFyZW50T3JTZWxmLl9hY3Rpb25zLnB1c2godGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjb21wdXRlQm91bmRpbmdSZWN0KCk6IERPTVJlY3Qge1xyXG4gICAgICAgIGlmICh0aGlzLl9sYXlvdXRNYW5hZ2VyLmdyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdEQUNCUjExMTIwJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgcmVjdCA9IHRoaXMuX2xheW91dE1hbmFnZXIuZ3JvdW5kSXRlbS5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gRE9NUmVjdC5mcm9tUmVjdCh7XHJcbiAgICAgICAgICAgICAgICB4OiBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQgKyByZWN0LmxlZnQsXHJcbiAgICAgICAgICAgICAgICB5OiBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCArIHJlY3QudG9wLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IHJlY3Qud2lkdGgsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNjcmVlblRvUGFnZShzY3JlZW5YOiBudW1iZXIsIHNjcmVlblk6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IGlubmVyU2NyZWVuID0gZ2V0V2luZG93SW5uZXJTY3JlZW5Qb3NpdGlvbihnbG9iYWxUaGlzKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgeDogZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0ICsgc2NyZWVuWCAtIGlubmVyU2NyZWVuLmxlZnQsXHJcbiAgICAgICAgICAgIHk6IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wICsgc2NyZWVuWSAtIGlubmVyU2NyZWVuLnRvcFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpc1Byb3h5VmlzaWJsZShwcm94eTogRHJhZ1Byb3h5LCBwYWdlWCA6IG51bWJlciwgcGFnZVk6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIHBhZ2VYID49IHRoaXMuX2JvdW5kaW5nUmVjdC5sZWZ0IC0gcHJveHkub3V0ZXJXaWR0aCAmJlxyXG4gICAgICAgICAgICBwYWdlWCA8IHRoaXMuX2JvdW5kaW5nUmVjdC5yaWdodCAmJlxyXG4gICAgICAgICAgICBwYWdlWSA+PSB0aGlzLl9ib3VuZGluZ1JlY3QudG9wIC0gcHJveHkub3V0ZXJIZWlnaHQgJiZcclxuICAgICAgICAgICAgcGFnZVkgPCB0aGlzLl9ib3VuZGluZ1JlY3QuYm90dG9tXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNyZWF0ZVByb3h5KGl0ZW06IENvbXBvbmVudEl0ZW0sIHg6IG51bWJlciwgeTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fZHJhZ1Byb3h5ID0gbmV3IERyYWdQcm94eSh0aGlzLCBpdGVtLCB4LCB5KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRyYWdMb2NhbChwYWdlWDogbnVtYmVyLCBwYWdlWTogbnVtYmVyKTogRHJhZ1RhcmdldCB8IG51bGwge1xyXG4gICAgICAgIGlmICh0aGlzLl9kcmFnUHJveHkgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgY29uc3QgYXJlYSA9IHRoaXMuX2RyYWdQcm94eS5kcmFnKHBhZ2VYLCBwYWdlWSk7XHJcbiAgICAgICAgICAgIHJldHVybiAoYXJlYSAhPT0gbnVsbCkgPyBuZXcgRHJhZ1RhcmdldCh0aGlzLCBhcmVhLCBwYWdlWCwgcGFnZVkpIDogbnVsbDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBkcmFnR2xvYmFsKHNjcmVlblg6IG51bWJlciwgc2NyZWVuWTogbnVtYmVyKTogRHJhZ1RhcmdldCB8IG51bGwge1xyXG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuX3BhcmVudD8uX2RyYWdQcm94eTtcclxuICAgICAgICBpZiAoIXNvdXJjZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignREFERzEnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHsgeDogcGFnZVgsIHk6IHBhZ2VZIH0gPSB0aGlzLnNjcmVlblRvUGFnZShzY3JlZW5YLCBzY3JlZW5ZKTtcclxuICAgICAgICBjb25zdCB2aXNpYmxlID0gZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID09PSAndmlzaWJsZScgJiYgdGhpcy5pc1Byb3h5VmlzaWJsZShzb3VyY2UsIHBhZ2VYLCBwYWdlWSk7XHJcblxyXG4gICAgICAgIGlmICh2aXNpYmxlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kcmFnUHJveHkgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMubGF5b3V0TWFuYWdlci5ncm91bmRJdGVtO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdEQURHMicpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb25maWcgPSBzb3VyY2UuY29tcG9uZW50SXRlbS50b0NvbmZpZygpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZHJhZ0l0ZW0gPSBuZXcgQ29tcG9uZW50SXRlbSh0aGlzLmxheW91dE1hbmFnZXIsIGNvbmZpZywgcGFyZW50KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlUHJveHkoZHJhZ0l0ZW0sIHBhZ2VYLCBwYWdlWSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBQcm94eSBpcyBubyBsb25nZXIgdmlzaWJsZSBhbmQgbm90IGN1cnJlbnRseSB0aGUgZHJhZyB0YXJnZXQgLT4gZGVzdHJveVxyXG4gICAgICAgICAgICBpZiAodGhpcy5fZHJhZ1Byb3h5ICE9PSBudWxsICYmIHRoaXMuY3VycmVudFRhcmdldD8ub3duZXIgIT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub25EcmFnU3RvcCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5kcmFnTG9jYWwocGFnZVgsIHBhZ2VZKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uRHJhZ1N0b3AoKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgdGhpcy5fYWN0aW9ucykge1xyXG4gICAgICAgICAgICBhY3Rpb24ubGF5b3V0TWFuYWdlci5oaWRlRHJvcFRhcmdldEluZGljYXRvcigpO1xyXG4gICAgICAgICAgICBhY3Rpb24uX2RyYWdQcm94eT8uZHJvcCgpO1xyXG4gICAgICAgICAgICBhY3Rpb24uX2RyYWdQcm94eSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXI/Lm9mZignZHJhZycsIHRoaXMuX2RyYWdFdmVudEhhbmRsZXIpO1xyXG4gICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lcj8ub2ZmKCdkcmFnU3RvcCcsIHRoaXMuX2RyYWdTdG9wRXZlbnRIYW5kbGVyKTtcclxuICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2N1cnJlbnRUYXJnZXQgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25EcmFnKGV2ZW50OiBFdmVudEVtaXR0ZXIuRHJhZ0V2ZW50KSB7XHJcbiAgICAgICAgbGV0IHRhcmdldDogRHJhZ1RhcmdldCB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgICBcclxuICAgICAgICAvLyBUcnkgdG8gZmluZCBhIGRyYWcgdGFyZ2V0IGJ5IGludm9raW5nIGFsbCBhY3Rpb25zLlxyXG4gICAgICAgIC8vIEZvciBzZWNvbmRhcnkgYWN0aW9ucyB0aGUgc2NyZWVuIHBvc2l0aW9uIG9mIHRoZSBldmVudCBoYXZlIHRvIGJlIHRyYW5zbGF0ZWQuXHJcbiAgICAgICAgLy8gVGhlIGZpcnN0IHZhbGlkIHRhcmdldCBpcyBzZWxlY3RlZCwgc3RpbGwgd2Ugd2FudCB0byBpbnZva2UgYWxsIGFjdGlvbnMgZHVlIHRvIHRoZSBjdWxsaW5nIGxvZ2ljIGluIGRyYWdHbG9iYWwuXHJcbiAgICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgdGhpcy5fYWN0aW9ucykge1xyXG4gICAgICAgICAgICBsZXQgdDogRHJhZ1RhcmdldCB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFjdGlvbiAhPT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgdCA9IGFjdGlvbi5kcmFnR2xvYmFsKGV2ZW50LnNjcmVlblgsIGV2ZW50LnNjcmVlblkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2RyYWdQcm94eSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdCA9IHRoaXMuZHJhZ0xvY2FsKGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIE9ubHkgc2V0IHRhcmdldCBpZiB3ZSBkb24ndCBhbHJlYWR5IGhhdmUgb25lLCB1bmxlc3MgdGhlIHByZWxpbWluYXJ5IHRhcmdldFxyXG4gICAgICAgICAgICAvLyBiZWxvbmdzIHRvIHRoZSBtYWluIHdpbmRvdy4gSW4gdGhhdCBjYXNlIHdlIHNldCB0aGUgbmV3IHRhcmdldCB0byBwcmlvcml0aXplIHBvcG91dCB3aW5kb3dzIG92ZXIgdGhlIG1haW4gd2luZG93LlxyXG4gICAgICAgICAgICBpZiAodGFyZ2V0ID09PSBudWxsIHx8ICh0ICE9PSBudWxsICYmIHRhcmdldC5vd25lci5sYXlvdXRNYW5hZ2VyLnBhcmVudCA9PT0gbnVsbCkpIHtcclxuICAgICAgICAgICAgICAgIHRhcmdldCA9IHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0YXJnZXQgIT09IG51bGwgfHwgdGhpcy5fYWxsb3dQb3BvdXQpIHtcclxuICAgICAgICAgICAgLy8gSWYgd2UgYWxyZWFkeSBoYXZlIGEgZHJvcCBhcmVhIGJ1dCBpdCBpcyBpbiBhIGRpZmZlcmVudCB3aW5kb3csIGhpZGUgdGhlIGluZGljYXRvci5cclxuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFRhcmdldCAhPT0gbnVsbCAmJiB0aGlzLmN1cnJlbnRUYXJnZXQub3duZXIgIT09IHRhcmdldD8ub3duZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFRhcmdldC5vd25lci5sYXlvdXRNYW5hZ2VyLmhpZGVEcm9wVGFyZ2V0SW5kaWNhdG9yKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0YXJnZXQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vIE1vdmUgdGhlIG93bmVyIG9mIHRoZSB0YXJnZXQgdG8gdGhlIGZyb250LCBzbyBpdCBoYXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgZm9yIGZ1dHVyZSBkcmFnIGV2ZW50cy5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fYWN0aW9ucy5pbmRleE9mKHRhcmdldC5vd25lcik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3Rpb25zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3Rpb25zLnVuc2hpZnQodGFyZ2V0Lm93bmVyKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0YXJnZXQuaGlnaGxpZ2h0RHJvcFpvbmUoKTtcclxuICAgICAgICAgICAgICAgIHRhcmdldC5vd25lci5sYXlvdXRNYW5hZ2VyLm1vdmVXaW5kb3dUb3AoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50VGFyZ2V0ID0gdGFyZ2V0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBTcGF3biBhIHNlY29uZGFyeSBkcmFnIGFjdGlvbiwgdGhlIHByb3h5IGVsZW1lbnQgaXMgb25seSBjcmVhdGVkIHdoZW4gdGhlIHBvaW50ZXIgZW50ZXJzIGl0cyB3aW5kb3cuXHJcbiAgICBzdGF0aWMgc3Bhd24obGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlciwgcGFyZW50OiBEcmFnQWN0aW9uKTogRHJhZ0FjdGlvbiB7XHJcbiAgICAgICAgaWYgKHBhcmVudC5fcGFyZW50ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2Vjb25kYXJ5IERyYWdBY3Rpb24gY2Fubm90IHNwYXduIGFub3RoZXIgRHJhZ0FjdGlvbi4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgRHJhZ0FjdGlvbihsYXlvdXRNYW5hZ2VyLCBmYWxzZSwgcGFyZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTdGFydCBhIGRyYWcgYWN0aW9uLCBpbW1lZGlhdGVseSBzaG93aW5nIGEgcHJveHkgZWxlbWVudC5cclxuICAgIHN0YXRpYyBzdGFydChsYXlvdXRNYW5hZ2VyOiBMYXlvdXRNYW5hZ2VyLCBsaXN0ZW5lcjogRHJhZ0xpc3RlbmVyLCBpdGVtOiBDb21wb25lbnRJdGVtLCB4OiBudW1iZXIsIHk6IG51bWJlciwgYWxsb3dQb3BvdXQ6IGJvb2xlYW4pOiBEcmFnQWN0aW9uIHsgICAgICAgICAgICBcclxuICAgICAgICBjb25zdCBhY3Rpb24gPSBuZXcgRHJhZ0FjdGlvbihsYXlvdXRNYW5hZ2VyLCBhbGxvd1BvcG91dCk7XHJcbiAgICAgICAgYWN0aW9uLmNyZWF0ZVByb3h5KGl0ZW0sIHgsIHkpO1xyXG4gICAgICAgIGFjdGlvbi5fZHJhZ0xpc3RlbmVyID0gbGlzdGVuZXI7XHJcbiAgICAgICAgbGlzdGVuZXIub24oJ2RyYWcnLCBhY3Rpb24uX2RyYWdFdmVudEhhbmRsZXIpO1xyXG4gICAgICAgIGxpc3RlbmVyLm9uKCdkcmFnU3RvcCcsIGFjdGlvbi5fZHJhZ1N0b3BFdmVudEhhbmRsZXIpO1xyXG4gICAgICAgIHJldHVybiBhY3Rpb247XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9yZXNvbHZlZC1jb25maWcnO1xyXG5pbXBvcnQgeyBVbmV4cGVjdGVkTnVsbEVycm9yLCBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBDb21wb25lbnRJdGVtIH0gZnJvbSAnLi4vaXRlbXMvY29tcG9uZW50LWl0ZW0nO1xyXG5pbXBvcnQgeyBDb250ZW50SXRlbSB9IGZyb20gJy4uL2l0ZW1zL2NvbnRlbnQtaXRlbSc7XHJcbmltcG9ydCB7IFN0YWNrIH0gZnJvbSAnLi4vaXRlbXMvc3RhY2snO1xyXG5pbXBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi4vbGF5b3V0LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBEb21Db25zdGFudHMgfSBmcm9tICcuLi91dGlscy9kb20tY29uc3RhbnRzJztcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vdXRpbHMvZXZlbnQtZW1pdHRlcic7XHJcbmltcG9ydCB7IFNpZGUsIFdpZHRoQW5kSGVpZ2h0IH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnO1xyXG5pbXBvcnQge1xyXG4gICAgZ2V0VW5pcXVlSWQsXHJcbiAgICBnZXRXaW5kb3dJbm5lclNjcmVlblBvc2l0aW9uLFxyXG4gICAgbnVtYmVyVG9QaXhlbHNcclxufSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcbmltcG9ydCB7IERyYWdBY3Rpb24gfSBmcm9tICcuL2RyYWctYWN0aW9uJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIGNyZWF0ZXMgYSB0ZW1wb3JhcnkgY29udGFpbmVyXHJcbiAqIGZvciB0aGUgY29tcG9uZW50IHdoaWxzdCBpdCBpcyBiZWluZyBkcmFnZ2VkXHJcbiAqIGFuZCBoYW5kbGVzIGRyYWcgZXZlbnRzXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIERyYWdQcm94eSBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBwcml2YXRlIF9vdXRlcldpZHRoOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIF9vdXRlckhlaWdodDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBfc2lkZWQ6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIF9lbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgX3Byb3h5Q29udGFpbmVyRWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbiAgICBwcml2YXRlIF9jb21wb25lbnRJdGVtRm9jdXNlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX29yaWdpbmFsU2l6ZTogV2lkdGhBbmRIZWlnaHQ7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kb2NrUG9pbnQ6IENvbnRlbnRJdGVtLkRvY2tQb2ludCB8IG51bGw7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ncm91bmRBcmVhOiBDb250ZW50SXRlbS5BcmVhO1xyXG4gICAgcHJpdmF0ZSBfbGFzdEFyZWE6IENvbnRlbnRJdGVtLkFyZWEgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBnZXQgZWxlbWVudCgpOiBIVE1MRWxlbWVudCB7IHJldHVybiB0aGlzLl9lbGVtZW50OyB9XHJcbiAgICBnZXQgb3V0ZXJXaWR0aCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fb3V0ZXJXaWR0aDsgfVxyXG4gICAgZ2V0IG91dGVySGVpZ2h0KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9vdXRlckhlaWdodDsgfVxyXG4gICAgZ2V0IGNvbXBvbmVudEl0ZW0oKTogQ29tcG9uZW50SXRlbSB7IHJldHVybiB0aGlzLl9jb21wb25lbnRJdGVtOyB9XHJcbiAgICBnZXQgbGF5b3V0TWFuYWdlcigpOiBMYXlvdXRNYW5hZ2VyIHsgcmV0dXJuIHRoaXMuX2FjdGlvbi5sYXlvdXRNYW5hZ2VyOyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0geCAtIFRoZSBpbml0aWFsIHggcG9zaXRpb25cclxuICAgICAqIEBwYXJhbSB5IC0gVGhlIGluaXRpYWwgeSBwb3NpdGlvblxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2FjdGlvbjogRHJhZ0FjdGlvbixcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9jb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtLFxyXG4gICAgICAgIHg6IG51bWJlciwgeTogbnVtYmVyXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICBsZXQgc2l6ZWRDb21wb25lbnQgPSB0aGlzLl9jb21wb25lbnRJdGVtO1xyXG5cclxuICAgICAgICAvLyBJZiB3ZSBhcmUgZHJhZ2dpbmcgYW4gaW5hY3RpdmUgY29tcG9uZW50IG9mIGEgc3RhY2ssIHdlIHdvbid0IGJlIGFibGUgdG8gZ2V0IHJlYXNvbmFibGVcclxuICAgICAgICAvLyBzaXplIGZvciBhIHBvcG91dC4gVXNlIHRoZSBzaXplIG9mIHRoZSBhY3RpdmUgY29tcG9uZW50IGluc3RlYWQgaW4gdGhpcyBjYXNlLlxyXG4gICAgICAgIGlmICh0aGlzLl9jb21wb25lbnRJdGVtLnBhcmVudCBpbnN0YW5jZW9mIFN0YWNrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuX2NvbXBvbmVudEl0ZW0ucGFyZW50LmdldEFjdGl2ZUNvbXBvbmVudEl0ZW0oKTtcclxuICAgICAgICAgICAgaWYgKGFjdGl2ZSkge1xyXG4gICAgICAgICAgICAgICAgc2l6ZWRDb21wb25lbnQgPSBhY3RpdmU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX29yaWdpbmFsU2l6ZSA9IHNpemVkQ29tcG9uZW50LmdldE91dGVyQm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVEcmFnUHJveHlFbGVtZW50cyh4LCB5KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudEl0ZW0ucGFyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBfY29udGVudEl0ZW0gd2lsbCBoYXZlIGR1bW15IEdyb3VuZEl0ZW0gYXMgcGFyZW50IGlmIGluaXRpYXRlZCBieSBhIGV4dGVybmFsIGRyYWcgc291cmNlXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdEUEMxMDA5NycpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbUZvY3VzZWQgPSB0aGlzLl9jb21wb25lbnRJdGVtLmZvY3VzZWQ7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudEl0ZW1Gb2N1c2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudEl0ZW0uYmx1cigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZG9ja1BvaW50ID0gdGhpcy5fY29tcG9uZW50SXRlbS5maW5kRG9ja1BvaW50KCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9jb21wb25lbnRJdGVtLnBhcmVudC5jb250ZW50SXRlbXMuaW5jbHVkZXModGhpcy5fY29tcG9uZW50SXRlbSkpIHtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5wYXJlbnQucmVtb3ZlQ2hpbGQodGhpcy5fY29tcG9uZW50SXRlbSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldERpbWVuc2lvbnMoKTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLl9lbGVtZW50KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubGF5b3V0TWFuYWdlci5ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignRFBDMTAwOTgnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2dyb3VuZEFyZWEgPSB0aGlzLmxheW91dE1hbmFnZXIuZ3JvdW5kSXRlbS5nZXRFbGVtZW50QXJlYSgpO1xyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5jYWxjdWxhdGVJdGVtQXJlYXMoKTtcclxuICAgICAgICB0aGlzLnNldERyb3BQb3NpdGlvbih4LCB5KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQ3JlYXRlIFN0YWNrLWxpa2Ugc3RydWN0dXJlIHRvIGNvbnRhaW4gdGhlIGRyYWdnZWQgY29tcG9uZW50ICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZURyYWdQcm94eUVsZW1lbnRzKGluaXRpYWxYOiBudW1iZXIsIGluaXRpYWxZOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuRHJhZ1Byb3h5KTtcclxuICAgICAgICBjb25zdCBoZWFkZXJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgaGVhZGVyRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuSGVhZGVyKTtcclxuICAgICAgICBjb25zdCB0YWJzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIHRhYnNFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5UYWJzKTtcclxuICAgICAgICBjb25zdCB0YWJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGFiRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuVGFiKTtcclxuICAgICAgICBjb25zdCB0aXRsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgICAgdGl0bGVFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5UaXRsZSk7XHJcbiAgICAgICAgdGFiRWxlbWVudC5hcHBlbmRDaGlsZCh0aXRsZUVsZW1lbnQpO1xyXG4gICAgICAgIHRhYnNFbGVtZW50LmFwcGVuZENoaWxkKHRhYkVsZW1lbnQpO1xyXG4gICAgICAgIGhlYWRlckVsZW1lbnQuYXBwZW5kQ2hpbGQodGFic0VsZW1lbnQpO1xyXG5cclxuICAgICAgICB0aGlzLl9wcm94eUNvbnRhaW5lckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICB0aGlzLl9wcm94eUNvbnRhaW5lckVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkNvbnRlbnQpO1xyXG5cclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKGhlYWRlckVsZW1lbnQpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fcHJveHlDb250YWluZXJFbGVtZW50KTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2lkZSA9IHRoaXMuX2NvbXBvbmVudEl0ZW0uaGVhZGVyQ29uZmlnPy5zaG93O1xyXG4gICAgICAgIGlmIChzaWRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NpZGVkID0gW1NpZGUucmlnaHQsIFNpZGUubGVmdF0uaW5jbHVkZXMoc2lkZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbG1fJyArIHNpZGUpO1xyXG4gICAgICAgICAgICBpZiAoW1NpZGUucmlnaHQsIFNpZGUuYm90dG9tXS5pbmRleE9mKHNpZGUpID49IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Byb3h5Q29udGFpbmVyRWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgaGVhZGVyRWxlbWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5sZWZ0ID0gbnVtYmVyVG9QaXhlbHMoaW5pdGlhbFgpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUudG9wID0gbnVtYmVyVG9QaXhlbHMoaW5pdGlhbFkpO1xyXG4gICAgICAgIHRhYkVsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsIHRoaXMuX2NvbXBvbmVudEl0ZW0udGl0bGUpO1xyXG4gICAgICAgIHRpdGxlRWxlbWVudC5pbnNlcnRBZGphY2VudFRleHQoJ2FmdGVyYmVnaW4nLCB0aGlzLl9jb21wb25lbnRJdGVtLnRpdGxlKTtcclxuICAgICAgICB0aGlzLl9wcm94eUNvbnRhaW5lckVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fY29tcG9uZW50SXRlbS5lbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxiYWNrIG9uIGV2ZXJ5IG1vdXNlTW92ZSBldmVudCBkdXJpbmcgYSBkcmFnLiBEZXRlcm1pbmVzIGlmIHRoZSBkcmFnIGlzXHJcbiAgICAgKiBzdGlsbCB3aXRoaW4gdGhlIHZhbGlkIGRyYWcgYXJlYSBhbmQgY2FsbHMgdGhlIGxheW91dE1hbmFnZXIgdG8gaGlnaGxpZ2h0IHRoZVxyXG4gICAgICogY3VycmVudCBkcm9wIGFyZWFcclxuICAgICAqXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgZHJhZyh4OiBudW1iZXIsIHk6IG51bWJlcik6IENvbnRlbnRJdGVtLkFyZWEgfCBudWxsIHtcclxuICAgICAgICBjb25zdCBhcmVhID0gdGhpcy5zZXREcm9wUG9zaXRpb24oeCwgeSk7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5kcmFnKCk7XHJcbiAgICAgICAgcmV0dXJuIGFyZWE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB0YXJnZXQgcG9zaXRpb25cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geCAtIFRoZSB4IHBvc2l0aW9uIGluIHB4XHJcbiAgICAgKiBAcGFyYW0geSAtIFRoZSB5IHBvc2l0aW9uIGluIHB4XHJcbiAgICAgKlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc2V0RHJvcFBvc2l0aW9uKHg6IG51bWJlciwgeTogbnVtYmVyKTogQ29udGVudEl0ZW0uQXJlYSB8IG51bGwge1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUubGVmdCA9IG51bWJlclRvUGl4ZWxzKHgpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUudG9wID0gbnVtYmVyVG9QaXhlbHMoeSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGFyZWEgPSB0aGlzLmxheW91dE1hbmFnZXIuZ2V0QXJlYSh4LCB5KTtcclxuXHJcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBubyBtYXRjaGluZyBhcmVhLCByZXR1cm4gdGhlIGxhc3QgYXJlYSBpbnN0ZWFkICh1bmxlc3Mgd2UgYXJlIG91dCBvZiBib3VuZHMgb2YgdGhlIGdyb3VuZCBpdGVtKS5cclxuICAgICAgICAvLyBBdm9pZHMgaXNzdWVzIHdpdGggc3BsaXR0ZXJzIHdoaWNoIGRvbid0IGhhdmUgYW4gYXJlYSB0aGVtc2VsdmVzLlxyXG4gICAgICAgIGlmIChhcmVhICE9PSBudWxsIHx8IHggPCB0aGlzLl9ncm91bmRBcmVhLngxIHx8IHggPj0gdGhpcy5fZ3JvdW5kQXJlYS54MiB8fCB5IDwgdGhpcy5fZ3JvdW5kQXJlYS55MSB8fCB5ID49IHRoaXMuX2dyb3VuZEFyZWEueTIpIHtcclxuICAgICAgICAgICAgdGhpcy5fbGFzdEFyZWEgPSBhcmVhO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3RBcmVhO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGJhY2sgd2hlbiB0aGUgZHJhZyBoYXMgZmluaXNoZWQuIERldGVybWluZXMgdGhlIGRyb3AgYXJlYVxyXG4gICAgICogYW5kIGFkZHMgdGhlIGNoaWxkIHRvIGl0XHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgZHJvcCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRJdGVtLmV4aXREcmFnTW9kZSgpO1xyXG5cclxuICAgICAgICBsZXQgYXJlYTogQ29udGVudEl0ZW0uQXJlYSB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgIGxldCBkcm9wcGVkQ29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLl9hY3Rpb24uY3VycmVudFRhcmdldDtcclxuICAgICAgICBpZiAodGFyZ2V0Py5vd25lciA9PT0gdGhpcy5fYWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGFyZWEgPSB0YXJnZXQuYXJlYTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgKiBWYWxpZCBkcm9wIGFyZWEgZm91bmRcclxuICAgICAgICAqL1xyXG4gICAgICAgIGlmIChhcmVhICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGRyb3BwZWRDb21wb25lbnRJdGVtID0gdGhpcy5fY29tcG9uZW50SXRlbTtcclxuICAgICAgICAgICAgY29uc3QgbmV3UGFyZW50Q29udGVudEl0ZW0gPSBhcmVhLmNvbnRlbnRJdGVtO1xyXG4gICAgICAgICAgICBuZXdQYXJlbnRDb250ZW50SXRlbS5vbkRyb3AoZHJvcHBlZENvbXBvbmVudEl0ZW0sIGFyZWEpO1xyXG4gICAgICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuZm9jdXNXaW5kb3coKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogTm8gdmFsaWQgZHJvcCBhcmVhIGZvdW5kIGR1cmluZyB0aGUgZHVyYXRpb24gb2YgdGhlIGRyYWcuXHJcbiAgICAgICAgICogQ3JlYXRlIGEgcG9wb3V0LlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0ID09PSBudWxsICYmIHRoaXMuX2FjdGlvbi5wYXJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgY29uc3QgaW5uZXJTY3JlZW4gPSBnZXRXaW5kb3dJbm5lclNjcmVlblBvc2l0aW9uKGdsb2JhbFRoaXMpO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgd2luZG93IDogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcuV2luZG93ID0ge1xyXG4gICAgICAgICAgICAgICAgbGVmdDogaW5uZXJTY3JlZW4ubGVmdCArIHRoaXMuZWxlbWVudC5vZmZzZXRMZWZ0LFxyXG4gICAgICAgICAgICAgICAgdG9wOiBpbm5lclNjcmVlbi50b3AgKyB0aGlzLmVsZW1lbnQub2Zmc2V0VG9wLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMuX29yaWdpbmFsU2l6ZS53aWR0aCxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogdGhpcy5fb3JpZ2luYWxTaXplLmhlaWdodFxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuY3JlYXRlUG9wb3V0RnJvbUNvbnRlbnRJdGVtKHRoaXMuX2NvbXBvbmVudEl0ZW0sIHdpbmRvdywgZ2V0VW5pcXVlSWQoKSwgdGhpcy5fZG9ja1BvaW50KTtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5kZXN0cm95KCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBkcmFnIGRpZG4ndCB1bHRpbWF0ZWx5IGVuZCB1cCB3aXRoIGFkZGluZyB0aGUgY29udGVudCBpdGVtIHRvXHJcbiAgICAgICAgICogYW55IGNvbnRhaW5lci4gSW4gb3JkZXIgdG8gZW5zdXJlIGNsZWFuIHVwIGhhcHBlbnMsIGRlc3Ryb3kgdGhlXHJcbiAgICAgICAgICogY29udGVudCBpdGVtLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudEl0ZW0uZGVzdHJveSgpOyAvLyBjb250ZW50SXRlbSBjaGlsZHJlbiBhcmUgbm93IGRlc3Ryb3llZCBhcyB3ZWxsXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuZW1pdCgnaXRlbURyb3BwZWQnLCB0aGlzLl9jb21wb25lbnRJdGVtKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudEl0ZW1Gb2N1c2VkKSB7XHJcbiAgICAgICAgICAgIGRyb3BwZWRDb21wb25lbnRJdGVtPy5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIERyYWcgUHJveHkncyBkaW1lbnNpb25zXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzZXREaW1lbnNpb25zKCkge1xyXG4gICAgICAgIGNvbnN0IGRpbWVuc2lvbnMgPSB0aGlzLmxheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLmRpbWVuc2lvbnM7XHJcbiAgICAgICAgaWYgKGRpbWVuc2lvbnMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RyYWdQcm94eS5zZXREaW1lbnNpb25zOiBkaW1lbnNpb25zIHVuZGVmaW5lZCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHdpZHRoID0gZGltZW5zaW9ucy5kcmFnUHJveHlXaWR0aDtcclxuICAgICAgICBsZXQgaGVpZ2h0ID0gZGltZW5zaW9ucy5kcmFnUHJveHlIZWlnaHQ7XHJcbiAgICAgICAgaWYgKHdpZHRoID09PSB1bmRlZmluZWQgfHwgaGVpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEcmFnUHJveHkuc2V0RGltZW5zaW9uczogd2lkdGggYW5kL29yIGhlaWdodCB1bmRlZmluZWQnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX291dGVyV2lkdGggPSB3aWR0aDtcclxuICAgICAgICB0aGlzLl9vdXRlckhlaWdodCA9IGhlaWdodDtcclxuICAgICAgICBjb25zdCBoZWFkZXJIZWlnaHQgPSB0aGlzLmxheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLmhlYWRlci5zaG93ID09PSBmYWxzZSA/IDAgOiBkaW1lbnNpb25zLmhlYWRlckhlaWdodDtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLndpZHRoID0gbnVtYmVyVG9QaXhlbHMod2lkdGgpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gbnVtYmVyVG9QaXhlbHMoaGVpZ2h0KVxyXG4gICAgICAgIHdpZHRoIC09ICh0aGlzLl9zaWRlZCA/IGhlYWRlckhlaWdodCA6IDApO1xyXG4gICAgICAgIGhlaWdodCAtPSAoIXRoaXMuX3NpZGVkID8gaGVhZGVySGVpZ2h0IDogMCk7XHJcbiAgICAgICAgdGhpcy5fcHJveHlDb250YWluZXJFbGVtZW50LnN0eWxlLndpZHRoID0gbnVtYmVyVG9QaXhlbHMod2lkdGgpO1xyXG4gICAgICAgIHRoaXMuX3Byb3h5Q29udGFpbmVyRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBudW1iZXJUb1BpeGVscyhoZWlnaHQpO1xyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudEl0ZW0uZW50ZXJEcmFnTW9kZSh3aWR0aCwgaGVpZ2h0KTtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRJdGVtLnNob3coKTtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBDb21wb25lbnRJdGVtQ29uZmlnIGFzIENvbmZpZ0NvbXBvbmVudEl0ZW1Db25maWcgfSBmcm9tICcuLi9jb25maWcvY29uZmlnJzsgLy8gcmVtb3ZlIGFsaWFzIGluIHZlcnNpb24gM1xyXG5pbXBvcnQgeyBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyB9IGZyb20gXCIuLi9jb25maWcvcmVzb2x2ZWQtY29uZmlnXCI7XHJcbmltcG9ydCB7IFVuZXhwZWN0ZWROdWxsRXJyb3IsIFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuLi9pdGVtcy9jb21wb25lbnQtaXRlbSc7XHJcbmltcG9ydCB7IEdyb3VuZEl0ZW0gfSBmcm9tICcuLi9pdGVtcy9ncm91bmQtaXRlbSc7XHJcbmltcG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuLi9sYXlvdXQtbWFuYWdlcic7XHJcbmltcG9ydCB7IERyYWdMaXN0ZW5lciB9IGZyb20gJy4uL3V0aWxzL2RyYWctbGlzdGVuZXInO1xyXG5pbXBvcnQgeyBKc29uVmFsdWUgfSBmcm9tICcuLi91dGlscy90eXBlcyc7XHJcbmltcG9ydCB7IERyYWdBY3Rpb24gfSBmcm9tICcuL2RyYWctYWN0aW9uJztcclxuXHJcbi8qKlxyXG4gKiBBbGxvd3MgZm9yIGFueSBET00gaXRlbSB0byBjcmVhdGUgYSBjb21wb25lbnQgb24gZHJhZ1xyXG4gKiBzdGFydCB0byBiZSBkcmFnZ2VkIGludG8gdGhlIExheW91dFxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRHJhZ1NvdXJjZSB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9kcmFnTGlzdGVuZXI6IERyYWdMaXN0ZW5lciB8IG51bGw7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9kdW1teUdyb3VuZENvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9kdW1teUdyb3VuZENvbnRlbnRJdGVtOiBHcm91bmRJdGVtO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9sYXlvdXRNYW5hZ2VyOiBMYXlvdXRNYW5hZ2VyLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9lbGVtZW50OiBIVE1MRWxlbWVudCxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfZXh0cmFBbGxvd2FibGVDaGlsZFRhcmdldHM6IEhUTUxFbGVtZW50W10sXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCBAZGVwcmVjYXRlZCByZXBsYWNlIHdpdGggY29tcG9uZW50SXRlbUNvbmZpZ09yRnRuIGluIHZlcnNpb24gMyAqL1xyXG4gICAgICAgIHByaXZhdGUgX2NvbXBvbmVudFR5cGVPckZ0bjogSnNvblZhbHVlIHwgKCgpID0+IChEcmFnU291cmNlLkNvbXBvbmVudEl0ZW1Db25maWcgfCBDb25maWdDb21wb25lbnRJdGVtQ29uZmlnKSksXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCBAZGVwcmVjYXRlZCByZW1vdmUgaW4gdmVyc2lvbiAzICovXHJcbiAgICAgICAgcHJpdmF0ZSBfY29tcG9uZW50U3RhdGU6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCxcclxuICAgICAgICAvKiogQGludGVybmFsIEBkZXByZWNhdGVkIHJlbW92ZSBpbiB2ZXJzaW9uIDMgKi9cclxuICAgICAgICBwcml2YXRlIF90aXRsZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgQGRlcHJlY2F0ZWQgcmVtb3ZlIGluIHZlcnNpb24gMyAqL1xyXG4gICAgICAgIHByaXZhdGUgX2lkOiBzdHJpbmcgfCB1bmRlZmluZWRcclxuICAgICkge1xyXG4gICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lciA9IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMuX2R1bW15R3JvdW5kQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblxyXG4gICAgICAgIGNvbnN0IGR1bW15Um9vdEl0ZW1Db25maWcgPSBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZy5jcmVhdGVEZWZhdWx0KCdyb3cnKTtcclxuICAgICAgICB0aGlzLl9kdW1teUdyb3VuZENvbnRlbnRJdGVtID0gbmV3IEdyb3VuZEl0ZW0odGhpcy5fbGF5b3V0TWFuYWdlciwgZHVtbXlSb290SXRlbUNvbmZpZywgdGhpcy5fZHVtbXlHcm91bmRDb250YWluZXIpO1xyXG5cclxuICAgICAgICB0aGlzLmNyZWF0ZURyYWdMaXN0ZW5lcigpO1xyXG4gICAgfVxyXG5cclxuXHQvKipcclxuXHQgKiBEaXNwb3NlcyBvZiB0aGUgZHJhZyBsaXN0ZW5lcnMgc28gdGhlIGRyYWcgc291cmNlIGlzIG5vdCB1c2FibGUgYW55IG1vcmUuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuXHQgKi9cclxuXHRkZXN0cm95KCk6IHZvaWQge1xyXG5cdFx0dGhpcy5yZW1vdmVEcmFnTGlzdGVuZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBpbml0aWFsbHkgYW5kIGFmdGVyIGV2ZXJ5IGRyYWdcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZURyYWdMaXN0ZW5lcigpIHtcclxuICAgICAgICB0aGlzLnJlbW92ZURyYWdMaXN0ZW5lcigpO1xyXG5cclxuICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIgPSBuZXcgRHJhZ0xpc3RlbmVyKHRoaXMuX2VsZW1lbnQsIHRoaXMuX2V4dHJhQWxsb3dhYmxlQ2hpbGRUYXJnZXRzKTtcclxuICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIub24oJ2RyYWdTdGFydCcsICh4LCB5KSA9PiB0aGlzLm9uRHJhZ1N0YXJ0KHgsIHkpKTtcclxuICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIub24oJ2RyYWdTdG9wJywgKCkgPT4gdGhpcy5vbkRyYWdTdG9wKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGJhY2sgZm9yIHRoZSBEcmFnTGlzdGVuZXIncyBkcmFnU3RhcnQgZXZlbnRcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geCAtIFRoZSB4IHBvc2l0aW9uIG9mIHRoZSBtb3VzZSBvbiBkcmFnU3RhcnRcclxuICAgICAqIEBwYXJhbSB5IC0gVGhlIHggcG9zaXRpb24gb2YgdGhlIG1vdXNlIG9uIGRyYWdTdGFydFxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25EcmFnU3RhcnQoeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCB0eXBlID0gJ2NvbXBvbmVudCc7XHJcbiAgICAgICAgbGV0IGRyYWdTb3VyY2VJdGVtQ29uZmlnOiBDb25maWdDb21wb25lbnRJdGVtQ29uZmlnO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX2NvbXBvbmVudFR5cGVPckZ0biA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZ0bkRyYWdTb3VyY2VJdGVtQ29uZmlnID0gdGhpcy5fY29tcG9uZW50VHlwZU9yRnRuKCkgYXMgKERyYWdTb3VyY2UuQ29tcG9uZW50SXRlbUNvbmZpZyB8IENvbmZpZ0NvbXBvbmVudEl0ZW1Db25maWcpO1xyXG4gICAgICAgICAgICAvLyBJZiB0aGUgY29tcG9uZW50VHlwZSBwcm9wZXJ0eSBleGlzdHMsIHRoZW4gaXQgaXMgYWxyZWFkeSBhIENvbXBvbmVudEl0ZW1Db25maWcgc28gbm90aGluZyB0byBkb1xyXG4gICAgICAgICAgICBpZiAoRHJhZ1NvdXJjZS5pc0RyYWdTb3VyY2VDb21wb25lbnRJdGVtQ29uZmlnKGZ0bkRyYWdTb3VyY2VJdGVtQ29uZmlnKSkge1xyXG4gICAgICAgICAgICAgICAgZHJhZ1NvdXJjZUl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZSxcclxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRTdGF0ZTogZnRuRHJhZ1NvdXJjZUl0ZW1Db25maWcuc3RhdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50VHlwZTogZnRuRHJhZ1NvdXJjZUl0ZW1Db25maWcudHlwZSxcclxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogZnRuRHJhZ1NvdXJjZUl0ZW1Db25maWcudGl0bGUgPz8gdGhpcy5fdGl0bGUsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZHJhZ1NvdXJjZUl0ZW1Db25maWcgPSBmdG5EcmFnU291cmNlSXRlbUNvbmZpZztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRyYWdTb3VyY2VJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICAgICAgdHlwZSxcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudFN0YXRlOiB0aGlzLl9jb21wb25lbnRTdGF0ZSxcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudFR5cGU6IHRoaXMuX2NvbXBvbmVudFR5cGVPckZ0bixcclxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLl90aXRsZSxcclxuICAgICAgICAgICAgICAgIGlkOiB0aGlzLl9pZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIENyZWF0ZSBhIGR1bW15IENvbnRlbnRJdGVtIG9ubHkgZm9yIGRyYWcgcHVycG9zZXNcclxuICAgICAgICAvLyBBbGwgQ29udGVudEl0ZW1zIChleGNlcHQgZm9yIEdyb3VuZEl0ZW0pIG5lZWQgYSBwYXJlbnQuICBXaGVuIGRyYWdnaW5nLCB0aGUgcGFyZW50IGlzIG5vdCB1c2VkLlxyXG4gICAgICAgIC8vIEluc3RlYWQgb2YgYWxsb3dpbmcgbnVsbCBwYXJlbnRzIChhcyBKYXZhc2NyaXB0IHZlcnNpb24gZGlkKSwgdXNlIGEgdGVtcG9yYXJ5IGR1bW15IEdyb3VuZEl0ZW0gcGFyZW50IGFuZCBhZGQgQ29udGVudEl0ZW0gdG8gdGhhdFxyXG4gICAgICAgIC8vIElmIHRoaXMgZG9lcyBub3Qgd29yaywgbmVlZCB0byBjcmVhdGUgYWx0ZXJuYXRpdmUgR3JvdW5kSXRlbSBjbGFzc1xyXG5cclxuICAgICAgICBjb25zdCByZXNvbHZlZEl0ZW1Db25maWcgPSBDb25maWdDb21wb25lbnRJdGVtQ29uZmlnLnJlc29sdmUoZHJhZ1NvdXJjZUl0ZW1Db25maWcsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29tcG9uZW50SXRlbSA9IG5ldyBDb21wb25lbnRJdGVtKHRoaXMuX2xheW91dE1hbmFnZXIsIHJlc29sdmVkSXRlbUNvbmZpZywgdGhpcy5fZHVtbXlHcm91bmRDb250ZW50SXRlbSlcclxuICAgICAgICB0aGlzLl9kdW1teUdyb3VuZENvbnRlbnRJdGVtLmNvbnRlbnRJdGVtcy5wdXNoKGNvbXBvbmVudEl0ZW0pO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fZHJhZ0xpc3RlbmVyID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdEU09EU0Q2Njc0NicpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbiA9IERyYWdBY3Rpb24uc3RhcnQodGhpcy5fbGF5b3V0TWFuYWdlciwgdGhpcy5fZHJhZ0xpc3RlbmVyLCBjb21wb25lbnRJdGVtLCB4LCB5LCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0cmFuc2l0aW9uSW5kaWNhdG9yID0gdGhpcy5fbGF5b3V0TWFuYWdlci50cmFuc2l0aW9uSW5kaWNhdG9yO1xyXG4gICAgICAgICAgICBpZiAodHJhbnNpdGlvbkluZGljYXRvciA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0RTT0RTVDY2NzQ2Jyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcm94eUVsZW1lbnQgPSBhY3Rpb24ucHJveHk/LmVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJveHlFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdEU09EU1Q2Njc0NycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb25JbmRpY2F0b3IudHJhbnNpdGlvbkVsZW1lbnRzKHRoaXMuX2VsZW1lbnQsIHByb3h5RWxlbWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBvbkRyYWdTdG9wKCkge1xyXG4gICAgICAgIC8vIGlmICh0aGlzLl9kdW1teUdyb3VuZENvbnRlbnRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAvLyAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignRFNPRFNEUlUwODExNicpO1xyXG4gICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuX2R1bW15R3JvdW5kQ29udGVudEl0ZW0uXyRkZXN0cm95XHJcbiAgICAgICAgLy8gICAgIHRoaXMuX2R1bW15R3JvdW5kQ29udGVudEl0ZW0gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIHRoaXMuY3JlYXRlRHJhZ0xpc3RlbmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcblx0ICogQ2FsbGVkIGFmdGVyIGV2ZXJ5IGRyYWcgYW5kIHdoZW4gdGhlIGRyYWcgc291cmNlIGlzIGJlaW5nIGRpc3Bvc2VkIG9mLlxyXG4gICAgICogQGludGVybmFsXHJcblx0ICovXHJcblx0cHJpdmF0ZSByZW1vdmVEcmFnTGlzdGVuZXIoKSB7XHJcblx0XHRpZiAodGhpcy5fZHJhZ0xpc3RlbmVyICE9PSBudWxsICkge1xyXG4gICAgICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIgPSBudWxsO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBEcmFnU291cmNlIHtcclxuICAgIC8qKiBAZGVwcmVjYXRlZCAgdXNlIENvbmZpZyB7QGxpbmsgKENvbXBvbmVudEl0ZW1Db25maWc6aW50ZXJmYWNlKX0gKi9cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50SXRlbUNvbmZpZyB7XHJcbiAgICAgICAgdHlwZTogSnNvblZhbHVlLFxyXG4gICAgICAgIHN0YXRlPzogSnNvblZhbHVlLFxyXG4gICAgICAgIHRpdGxlPzogc3RyaW5nLFxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAZGVwcmVjYXRlZCByZW1vdmUgaW4gdmVyc2lvbiAzICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNEcmFnU291cmNlQ29tcG9uZW50SXRlbUNvbmZpZyhcclxuICAgICAgICBjb25maWc6IERyYWdTb3VyY2UuQ29tcG9uZW50SXRlbUNvbmZpZyB8IENvbmZpZ0NvbXBvbmVudEl0ZW1Db25maWdcclxuICAgICk6IGNvbmZpZyBpcyBEcmFnU291cmNlLkNvbXBvbmVudEl0ZW1Db25maWcge1xyXG4gICAgICAgIHJldHVybiAhKFwiY29tcG9uZW50VHlwZVwiIGluIGNvbmZpZyk7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgRG9tQ29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbHMvZG9tLWNvbnN0YW50cyc7XHJcbmltcG9ydCB7IEFyZWFMaW5rZWRSZWN0IH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnO1xyXG5pbXBvcnQgeyBudW1iZXJUb1BpeGVscyB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGNsYXNzIERyb3BUYXJnZXRJbmRpY2F0b3Ige1xyXG4gICAgcHJpdmF0ZSBfZWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgLy8gTWF5YmUgdXNlIGNvbnRhaW5lciBpbnN0ZWFkIG9mIERvY3VtZW50IEJvZHk/XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkRyb3BUYXJnZXRJbmRpY2F0b3IpO1xyXG4gICAgICAgIGNvbnN0IGlubmVyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGlubmVyRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuSW5uZXIpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQoaW5uZXJFbGVtZW50KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLl9lbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaGlnaGxpZ2h0QXJlYShhcmVhOiBBcmVhTGlua2VkUmVjdCwgbWFyZ2luOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmxlZnQgPSBudW1iZXJUb1BpeGVscyhhcmVhLngxICsgbWFyZ2luKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnRvcCA9IG51bWJlclRvUGl4ZWxzKGFyZWEueTEgKyBtYXJnaW4pO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUud2lkdGggPSBudW1iZXJUb1BpeGVscyhhcmVhLngyIC0gYXJlYS54MSAtIG1hcmdpbiAtIDEpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gbnVtYmVyVG9QaXhlbHMoYXJlYS55MiAtIGFyZWEueTEgLSBtYXJnaW4gLSAxKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XHJcbiAgICB9XHJcblxyXG4gICAgaGlkZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBIZWFkZXIgfSBmcm9tICcuL2hlYWRlcic7XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBjbGFzcyBIZWFkZXJCdXR0b24ge1xyXG4gICAgcHJpdmF0ZSBfZWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbiAgICBwcml2YXRlIF9jbGlja0V2ZW50TGlzdGVuZXIgPSAoZXY6IE1vdXNlRXZlbnQpID0+IHRoaXMub25DbGljayhldik7XHJcbiAgICBwcml2YXRlIF90b3VjaFN0YXJ0RXZlbnRMaXN0ZW5lciA9IChldjogVG91Y2hFdmVudCkgPT4gdGhpcy5vblRvdWNoU3RhcnQoZXYpO1xyXG5cclxuICAgIGdldCBlbGVtZW50KCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7IH1cclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9oZWFkZXI6IEhlYWRlciwgbGFiZWw6IHN0cmluZywgY3NzQ2xhc3M6IHN0cmluZywgcHJpdmF0ZSBfcHVzaEV2ZW50OiBIZWFkZXJCdXR0b24uUHVzaEV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChjc3NDbGFzcyk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC50aXRsZSA9IGxhYmVsO1xyXG4gICAgICAgIHRoaXMuX2hlYWRlci5vbignZGVzdHJveScsICgpID0+IHRoaXMuZGVzdHJveSgpKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fY2xpY2tFdmVudExpc3RlbmVyLCB7IHBhc3NpdmU6IHRydWUgfSk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5fdG91Y2hTdGFydEV2ZW50TGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICB0aGlzLl9oZWFkZXIuY29udHJvbHNDb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2NsaWNrRXZlbnRMaXN0ZW5lcik7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5fdG91Y2hTdGFydEV2ZW50TGlzdGVuZXIpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQodGhpcy5fZWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkNsaWNrKGV2OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5fcHVzaEV2ZW50KGV2KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uVG91Y2hTdGFydChldjogVG91Y2hFdmVudCkge1xyXG4gICAgICAgIHRoaXMuX3B1c2hFdmVudChldik7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBIZWFkZXJCdXR0b24ge1xyXG4gICAgZXhwb3J0IHR5cGUgUHVzaEV2ZW50ID0gKHRoaXM6IHZvaWQsIGV2OiBFdmVudCkgPT4gdm9pZDtcclxufVxyXG4iLCJpbXBvcnQgeyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBDb21wb25lbnRJdGVtIH0gZnJvbSAnLi4vaXRlbXMvY29tcG9uZW50LWl0ZW0nO1xyXG5pbXBvcnQgeyBTdGFjayB9IGZyb20gJy4uL2l0ZW1zL3N0YWNrJztcclxuaW1wb3J0IHsgTGF5b3V0TWFuYWdlciB9IGZyb20gJy4uL2xheW91dC1tYW5hZ2VyJztcclxuaW1wb3J0IHsgRG9tQ29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbHMvZG9tLWNvbnN0YW50cyc7XHJcbmltcG9ydCB7IERyYWdMaXN0ZW5lciB9IGZyb20gJy4uL3V0aWxzL2RyYWctbGlzdGVuZXInO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi91dGlscy9ldmVudC1lbWl0dGVyJztcclxuaW1wb3J0IHsgU2lkZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcclxuaW1wb3J0IHsgbnVtYmVyVG9QaXhlbHMsIHNldEVsZW1lbnREaXNwbGF5VmlzaWJpbGl0eSB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuaW1wb3J0IHsgSGVhZGVyQnV0dG9uIH0gZnJvbSAnLi9oZWFkZXItYnV0dG9uJztcclxuaW1wb3J0IHsgVGFiIH0gZnJvbSAnLi90YWInO1xyXG5pbXBvcnQgeyBUYWJzQ29udGFpbmVyIH0gZnJvbSAnLi90YWJzLWNvbnRhaW5lcic7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgaGVhZGVyIGFib3ZlIGEgU3RhY2sgQ29udGVudEl0ZW0uXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBjbGFzcyBIZWFkZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFic0NvbnRhaW5lcjogVGFic0NvbnRhaW5lcjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29udHJvbHNDb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zaG93OiBib29sZWFuO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcG9wb3V0TGFiZWw6IHN0cmluZztcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX21heGltaXNlTGFiZWw6IHN0cmluZztcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX21pbmltaXNlTGFiZWw6IHN0cmluZztcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Nsb3NlTGFiZWw6IHN0cmluZztcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RhYkRyb3Bkb3duRW5hYmxlZDogYm9vbGVhbjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RhYkRyb3Bkb3duTGFiZWw6IHN0cmluZztcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90YWJDb250cm9sT2Zmc2V0OiBudW1iZXI7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2xpY2tMaXN0ZW5lciA9IChldjogTW91c2VFdmVudCkgPT4gdGhpcy5vbkNsaWNrKGV2KTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RvdWNoU3RhcnRMaXN0ZW5lciA9IChldjogVG91Y2hFdmVudCkgPT4gdGhpcy5vblRvdWNoU3RhcnQoZXYpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZG9jdW1lbnRNb3VzZVVwTGlzdGVuZXI6ICh0aGlzOiB2b2lkKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbGF5b3V0U3RhdGVMaXN0ZW5lciA9ICgpID0+IHRoaXMub25MYXlvdXRDaGFuZ2VkKCk7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfc2lkZTogU2lkZTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2xlZnRSaWdodFNpZGVkOiBib29sZWFuO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2xvc2VCdXR0b246IEhlYWRlckJ1dHRvbjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3BvcG91dEJ1dHRvbjogSGVhZGVyQnV0dG9uO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFiRHJvcGRvd25CdXR0b246IEhlYWRlckJ1dHRvbjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX21heGltaXNlQnV0dG9uOiBIZWFkZXJCdXR0b247XHJcbiAgICAvLyAvKiogQGludGVybmFsICovXHJcbiAgICAvLyBwcml2YXRlIF9hY3RpdmVDb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtIHwgbnVsbCA9IG51bGw7IC8vIG9ubHkgdXNlZCB0byBpZGVudGlmeSBhY3RpdmUgdGFiXHJcblxyXG4gICAgZ2V0IHNob3coKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9zaG93OyB9XHJcbiAgICBnZXQgc2lkZSgpOiBTaWRlIHsgcmV0dXJuIHRoaXMuX3NpZGU7IH1cclxuICAgIGdldCBsZWZ0UmlnaHRTaWRlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2xlZnRSaWdodFNpZGVkOyB9XHJcblxyXG4gICAgZ2V0IGxheW91dE1hbmFnZXIoKTogTGF5b3V0TWFuYWdlciB7IHJldHVybiB0aGlzLl9sYXlvdXRNYW5hZ2VyOyB9XHJcbiAgICBnZXQgcGFyZW50KCk6IFN0YWNrIHsgcmV0dXJuIHRoaXMuX3BhcmVudDsgfVxyXG4gICAgZ2V0IHRhYnMoKTogVGFiW10geyByZXR1cm4gdGhpcy5fdGFic0NvbnRhaW5lci50YWJzOyB9XHJcbiAgICBnZXQgbGFzdFZpc2libGVUYWJJbmRleCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fdGFic0NvbnRhaW5lci5sYXN0VmlzaWJsZVRhYkluZGV4OyB9XHJcblxyXG4gICAgZ2V0IGVsZW1lbnQoKTogSFRNTEVsZW1lbnQgeyByZXR1cm4gdGhpcy5fZWxlbWVudDsgfVxyXG4gICAgZ2V0IHRhYnNDb250YWluZXJFbGVtZW50KCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX3RhYnNDb250YWluZXIuZWxlbWVudDsgfVxyXG4gICAgZ2V0IGNvbnRyb2xzQ29udGFpbmVyRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7IHJldHVybiB0aGlzLl9jb250cm9sc0NvbnRhaW5lckVsZW1lbnQ7IH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfbGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlcixcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfcGFyZW50OiBTdGFjayxcclxuICAgICAgICBzZXR0aW5nczogSGVhZGVyLlNldHRpbmdzLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9nZXRBY3RpdmVDb21wb25lbnRJdGVtRXZlbnQ6IEhlYWRlci5HZXRBY3RpdmVDb21wb25lbnRJdGVtRXZlbnQsXHJcbiAgICAgICAgY2xvc2VFdmVudDogSGVhZGVyLkNsb3NlRXZlbnQsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX3BvcG91dEV2ZW50OiBIZWFkZXIuUG9wb3V0RXZlbnQgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX21heGltaXNlVG9nZ2xlRXZlbnQ6IEhlYWRlci5NYXhpbWlzZVRvZ2dsZUV2ZW50IHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9jbGlja0V2ZW50OiBIZWFkZXIuQ2xpY2tFdmVudCB8IHVuZGVmaW5lZCxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfdG91Y2hTdGFydEV2ZW50OiBIZWFkZXIuVG91Y2hTdGFydEV2ZW50IHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9jb21wb25lbnRSZW1vdmVFdmVudDogSGVhZGVyLkNvbXBvbmVudFJlbW92ZUV2ZW50IHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9jb21wb25lbnRGb2N1c0V2ZW50OiBIZWFkZXIuQ29tcG9uZW50Rm9jdXNFdmVudCB8IHVuZGVmaW5lZCxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfY29tcG9uZW50RHJhZ1N0YXJ0RXZlbnQ6IEhlYWRlci5Db21wb25lbnREcmFnU3RhcnRFdmVudCB8IHVuZGVmaW5lZCxcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3RhYnNDb250YWluZXIgPSBuZXcgVGFic0NvbnRhaW5lcih0aGlzLl9sYXlvdXRNYW5hZ2VyLFxyXG4gICAgICAgICAgICAoaXRlbSkgPT4gdGhpcy5oYW5kbGVUYWJJbml0aWF0ZWRDb21wb25lbnRSZW1vdmVFdmVudChpdGVtKSxcclxuICAgICAgICAgICAgKGl0ZW0pID0+IHRoaXMuaGFuZGxlVGFiSW5pdGlhdGVkQ29tcG9uZW50Rm9jdXNFdmVudChpdGVtKSxcclxuICAgICAgICAgICAgKHgsIHksIGRyYWdMaXN0ZW5lciwgaXRlbSkgPT4gdGhpcy5oYW5kbGVUYWJJbml0aWF0ZWREcmFnU3RhcnRFdmVudCh4LCB5LCBkcmFnTGlzdGVuZXIsIGl0ZW0pLFxyXG4gICAgICAgICAgICAoKSA9PiB0aGlzLnByb2Nlc3NUYWJEcm9wZG93bkFjdGl2ZUNoYW5nZWQoKSxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICB0aGlzLl9zaG93ID0gc2V0dGluZ3Muc2hvdztcclxuICAgICAgICB0aGlzLl9wb3BvdXRMYWJlbCA9IHNldHRpbmdzLnBvcG91dExhYmVsO1xyXG4gICAgICAgIHRoaXMuX21heGltaXNlTGFiZWwgPSBzZXR0aW5ncy5tYXhpbWlzZUxhYmVsO1xyXG4gICAgICAgIHRoaXMuX21pbmltaXNlTGFiZWwgPSBzZXR0aW5ncy5taW5pbWlzZUxhYmVsO1xyXG4gICAgICAgIHRoaXMuX2Nsb3NlTGFiZWwgPSBzZXR0aW5ncy5jbG9zZUxhYmVsO1xyXG4gICAgICAgIHRoaXMuX3RhYkRyb3Bkb3duRW5hYmxlZCA9IHNldHRpbmdzLnRhYkRyb3Bkb3duRW5hYmxlZDtcclxuICAgICAgICB0aGlzLl90YWJEcm9wZG93bkxhYmVsID0gc2V0dGluZ3MudGFiRHJvcGRvd25MYWJlbDtcclxuICAgICAgICB0aGlzLnNldFNpZGUoc2V0dGluZ3Muc2lkZSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWN0aW9uJyk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuSGVhZGVyKTtcclxuICAgICAgICB0aGlzLl9jb250cm9sc0NvbnRhaW5lckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWN0aW9uJyk7XHJcbiAgICAgICAgdGhpcy5fY29udHJvbHNDb250YWluZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Db250cm9scyk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl90YWJzQ29udGFpbmVyLmVsZW1lbnQpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fY29udHJvbHNDb250YWluZXJFbGVtZW50KTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3RhYnNDb250YWluZXIuZHJvcGRvd25FbGVtZW50KTtcclxuXHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2NsaWNrTGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl90b3VjaFN0YXJ0TGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fZG9jdW1lbnRNb3VzZVVwTGlzdGVuZXIgPSAoKSA9PiB0aGlzLl90YWJzQ29udGFpbmVyLmhpZGVBZGRpdGlvbmFsVGFic0Ryb3Bkb3duKClcclxuICAgICAgICBnbG9iYWxUaGlzLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9kb2N1bWVudE1vdXNlVXBMaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG5cclxuICAgICAgICB0aGlzLl90YWJDb250cm9sT2Zmc2V0ID0gdGhpcy5fbGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuc2V0dGluZ3MudGFiQ29udHJvbE9mZnNldDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3RhYkRyb3Bkb3duRW5hYmxlZCkge1xyXG4gICAgICAgICAgICB0aGlzLl90YWJEcm9wZG93bkJ1dHRvbiA9IG5ldyBIZWFkZXJCdXR0b24odGhpcywgdGhpcy5fdGFiRHJvcGRvd25MYWJlbCwgRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5UYWJEcm9wZG93bixcclxuICAgICAgICAgICAgICAgICgpID0+IHRoaXMuX3RhYnNDb250YWluZXIuc2hvd0FkZGl0aW9uYWxUYWJzRHJvcGRvd24oKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcG9wb3V0QnV0dG9uID0gbmV3IEhlYWRlckJ1dHRvbih0aGlzLCB0aGlzLl9wb3BvdXRMYWJlbCwgRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Qb3BvdXQsICgpID0+IHRoaXMuaGFuZGxlQnV0dG9uUG9wb3V0RXZlbnQoKSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIE1heGltaXNlIGNvbnRyb2wgLSBzZXQgdGhlIGNvbXBvbmVudCB0byB0aGUgZnVsbCBzaXplIG9mIHRoZSBsYXlvdXRcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9tYXhpbWlzZUJ1dHRvbiA9IG5ldyBIZWFkZXJCdXR0b24odGhpcywgdGhpcy5fbWF4aW1pc2VMYWJlbCwgRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5NYXhpbWlzZSxcclxuICAgICAgICAgICAgKGV2KSA9PiB0aGlzLmhhbmRsZUJ1dHRvbk1heGltaXNlVG9nZ2xlRXZlbnQoZXYpXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ2xvc2UgYnV0dG9uXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fY2xvc2VCdXR0b24gPSBuZXcgSGVhZGVyQnV0dG9uKHRoaXMsIHRoaXMuX2Nsb3NlTGFiZWwsIERvbUNvbnN0YW50cy5DbGFzc05hbWUuQ2xvc2UsICgpID0+IGNsb3NlRXZlbnQoKSk7XHJcblxyXG4gICAgICAgIHRoaXMucHJvY2Vzc1RhYkRyb3Bkb3duQWN0aXZlQ2hhbmdlZCgpO1xyXG5cclxuICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcignc3RhdGVDaGFuZ2VkJywgdGhpcy5fbGF5b3V0U3RhdGVMaXN0ZW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyB0aGUgZW50aXJlIGhlYWRlclxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdkZXN0cm95Jyk7XHJcblxyXG4gICAgICAgIHRoaXMuX3BvcG91dEV2ZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuX21heGltaXNlVG9nZ2xlRXZlbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5fY2xpY2tFdmVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLl90b3VjaFN0YXJ0RXZlbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50UmVtb3ZlRXZlbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50Rm9jdXNFdmVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnREcmFnU3RhcnRFdmVudCA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgdGhpcy5fdGFic0NvbnRhaW5lci5kZXN0cm95KCk7XHJcblxyXG4gICAgICAgIGdsb2JhbFRoaXMuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2RvY3VtZW50TW91c2VVcExpc3RlbmVyKTtcclxuICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignc3RhdGVDaGFuZ2VkJywgdGhpcy5fbGF5b3V0U3RhdGVMaXN0ZW5lcik7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgdGFiIGFuZCBhc3NvY2lhdGVzIGl0IHdpdGggYSBjb250ZW50SXRlbVxyXG4gICAgICogQHBhcmFtIGluZGV4IC0gVGhlIHBvc2l0aW9uIG9mIHRoZSB0YWJcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBjcmVhdGVUYWIoY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3RhYnNDb250YWluZXIuY3JlYXRlVGFiKGNvbXBvbmVudEl0ZW0sIGluZGV4KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbmRzIGEgdGFiIGJhc2VkIG9uIHRoZSBjb250ZW50SXRlbSBpdHMgYXNzb2NpYXRlZCB3aXRoIGFuZCByZW1vdmVzIGl0LlxyXG4gICAgICogQ2Fubm90IHJlbW92ZSB0YWIgaWYgaXQgaGFzIHRoZSBhY3RpdmUgQ29tcG9uZW50SXRlbVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZVRhYihjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdGFic0NvbnRhaW5lci5yZW1vdmVUYWIoY29tcG9uZW50SXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJvY2Vzc0FjdGl2ZUNvbXBvbmVudENoYW5nZWQobmV3QWN0aXZlQ29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3RhYnNDb250YWluZXIucHJvY2Vzc0FjdGl2ZUNvbXBvbmVudENoYW5nZWQobmV3QWN0aXZlQ29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVUYWJTaXplcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHNldFNpZGUodmFsdWU6IFNpZGUpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9zaWRlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5fbGVmdFJpZ2h0U2lkZWQgPSBbU2lkZS5yaWdodCwgU2lkZS5sZWZ0XS5pbmNsdWRlcyh0aGlzLl9zaWRlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGhlYWRlciBidXR0b25zLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdXBkYXRlQnV0dG9ucygpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBhY3RpdmVDb21wb25lbnRJdGVtID0gdGhpcy5fZ2V0QWN0aXZlQ29tcG9uZW50SXRlbUV2ZW50KCk7XHJcbiAgICAgICAgY29uc3QgaXNMYXN0ID0gdGhpcy5fcGFyZW50LmZpbmRBbmNlc3RvcldpdGhTaWJsaW5ncygpID09PSBudWxsO1xyXG4gICAgICAgIGNvbnN0IGlzTWFpbiA9IHRoaXMubGF5b3V0TWFuYWdlci5wYXJlbnQgPT09IG51bGw7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQ2xvc2UgYnV0dG9uIGlzIG9ubHkgdmlzaWJsZSBpZiBhbGwgaXRlbXMgb2YgdGhlIHN0YWNrIGFyZSBjbG9zYWJsZVxyXG4gICAgICAgIC8vIGFuZCB0aGUgYWN0aXZlIGNvbXBvbmVudCBoYXMgaXRzIGNsb3NlIGJ1dHRvbiBzZXQgdG8gdmlzaWJsZS4gTm90ZSB0aGF0XHJcbiAgICAgICAgLy8gaGlkaW5nIHRoZSBjbG9zZSBidXR0b24gaW4gYSBoZWFkZXIgb2YgYW4gaXRlbSBpcyBub3QgZXF1aXZhbGVudCB0byBtYWtpbmdcclxuICAgICAgICAvLyB0aGF0IGl0ZW0gdW5jbG9zYWJsZS5cclxuICAgICAgICBjb25zdCBhbGxDbG9zYWJsZSA9IHRoaXMudGFicy5ldmVyeSh0YWIgPT4gdGFiLmNvbXBvbmVudEl0ZW0uaXNDbG9zYWJsZSk7XHJcbiAgICAgICAgY29uc3QgY2xvc2UgPSBhY3RpdmVDb21wb25lbnRJdGVtPy5oZWFkZXJDb25maWc/LmNsb3NlICE9PSBmYWxzZTtcclxuICAgICAgICBzZXRFbGVtZW50RGlzcGxheVZpc2liaWxpdHkodGhpcy5fY2xvc2VCdXR0b24uZWxlbWVudCwgYWxsQ2xvc2FibGUgJiYgY2xvc2UpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFBvcG91dCBidXR0b24gaXMgdmlzaWJsZSBpZiB0aGUgYWN0aXZlIGNvbXBvbmVudCBoYXMgaXRzIHBvcG91dCBidXR0b24gZW5hYmxlZC5cclxuICAgICAgICAvLyBBbHNvIHdlIHdhbnQgdG8gcHJldmVudCBwb3BwaW5nIG91dCBpZiB0aGF0IHdvdWxkIGxlYXZlIHVzIHdpdGggYW4gZW1wdHkgbGF5b3V0LlxyXG4gICAgICAgIGxldCBwb3BvdXQgPSBhY3RpdmVDb21wb25lbnRJdGVtPy5oZWFkZXJDb25maWc/LnBvcG91dCAhPT0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuX2xheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLnNldHRpbmdzLnBvcG91dFdob2xlU3RhY2spIHtcclxuICAgICAgICAgICAgcG9wb3V0ICYmPSAoIWlzTGFzdCB8fCBpc01haW4pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHBvcG91dCAmJj0gKCFpc0xhc3QgfHwgdGhpcy50YWJzLmxlbmd0aCA+IDEgfHwgaXNNYWluKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0RWxlbWVudERpc3BsYXlWaXNpYmlsaXR5KHRoaXMuX3BvcG91dEJ1dHRvbi5lbGVtZW50LCBwb3BvdXQpO1xyXG5cclxuICAgICAgICAvLyBNYXhpbWl6ZSBidXR0b24gaXMgdmlzaWJsZSBpZiB0aGUgYWN0aXZlIGNvbXBvbmVudCBoYXMgaXRzIG1heGltaXplIGJ1dHRvbiBlbmFibGVkIG9yIHRoZSBzdGFjayBpcyBhbHJlYWR5IG1heGltaXplZC5cclxuICAgICAgICAvLyBBbHNvIGhpZGUgaXQgaWYgc3RhY2sgaXMgdGhlIGxhc3QgaXRlbSBpbiB0aGUgbGF5b3V0LlxyXG4gICAgICAgIGNvbnN0IG1heGltaXplID0gKGFjdGl2ZUNvbXBvbmVudEl0ZW0/LmhlYWRlckNvbmZpZz8ubWF4aW1pc2UgIT09IGZhbHNlIHx8IHRoaXMuX3BhcmVudC5pc01heGltaXNlZCkgJiYgIWlzTGFzdDtcclxuICAgICAgICBzZXRFbGVtZW50RGlzcGxheVZpc2liaWxpdHkodGhpcy5fbWF4aW1pc2VCdXR0b24uZWxlbWVudCwgbWF4aW1pemUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGFwcGx5Rm9jdXNlZFZhbHVlKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkZvY3VzZWQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShEb21Db25zdGFudHMuQ2xhc3NOYW1lLkZvY3VzZWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcm9jZXNzTWF4aW1pc2VkKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9tYXhpbWlzZUJ1dHRvbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0hQTUFYMTY5OTcnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9tYXhpbWlzZUJ1dHRvbi5lbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCB0aGlzLl9taW5pbWlzZUxhYmVsKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJvY2Vzc01pbmltaXNlZCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fbWF4aW1pc2VCdXR0b24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdIUE1JTjE2OTk3Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fbWF4aW1pc2VCdXR0b24uZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgdGhpcy5fbWF4aW1pc2VMYWJlbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHVzaGVzIHRoZSB0YWJzIHRvIHRoZSB0YWIgZHJvcGRvd24gaWYgdGhlIGF2YWlsYWJsZSBzcGFjZSBpcyBub3Qgc3VmZmljaWVudFxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZVRhYlNpemVzKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl90YWJzQ29udGFpbmVyLnRhYkNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBoZWFkZXJIZWlnaHQgPSB0aGlzLl9zaG93ID8gdGhpcy5fbGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuZGltZW5zaW9ucy5oZWFkZXJIZWlnaHQgOiAwO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX2xlZnRSaWdodFNpZGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmhlaWdodCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS53aWR0aCA9IG51bWJlclRvUGl4ZWxzKGhlYWRlckhlaWdodCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLndpZHRoID0gJyc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmhlaWdodCA9IG51bWJlclRvUGl4ZWxzKGhlYWRlckhlaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGF2YWlsYWJsZVdpZHRoOiBudW1iZXI7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9sZWZ0UmlnaHRTaWRlZCkge1xyXG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSB0aGlzLl9lbGVtZW50Lm9mZnNldEhlaWdodCAtIHRoaXMuX2NvbnRyb2xzQ29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHQgLSB0aGlzLl90YWJDb250cm9sT2Zmc2V0O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSB0aGlzLl9lbGVtZW50Lm9mZnNldFdpZHRoIC0gdGhpcy5fY29udHJvbHNDb250YWluZXJFbGVtZW50Lm9mZnNldFdpZHRoIC0gdGhpcy5fdGFiQ29udHJvbE9mZnNldDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fdGFic0NvbnRhaW5lci51cGRhdGVUYWJTaXplcyhhdmFpbGFibGVXaWR0aCwgdGhpcy5fZ2V0QWN0aXZlQ29tcG9uZW50SXRlbUV2ZW50KCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZVRhYkluaXRpYXRlZENvbXBvbmVudFJlbW92ZUV2ZW50KGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICBpZiAodGhpcy5fY29tcG9uZW50UmVtb3ZlRXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdISFRDRTIyMjk0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50UmVtb3ZlRXZlbnQoY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlVGFiSW5pdGlhdGVkQ29tcG9uZW50Rm9jdXNFdmVudChjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudEZvY3VzRXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdISFRBRTIyMjk0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50Rm9jdXNFdmVudChjb21wb25lbnRJdGVtKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVUYWJJbml0aWF0ZWREcmFnU3RhcnRFdmVudCh4OiBudW1iZXIsIHk6IG51bWJlciwgZHJhZ0xpc3RlbmVyOiBEcmFnTGlzdGVuZXIsIGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICBpZiAodGhpcy5fY29tcG9uZW50RHJhZ1N0YXJ0RXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdISFREU0UyMjI5NCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudERyYWdTdGFydEV2ZW50KHgsIHksIGRyYWdMaXN0ZW5lciwgY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcHJvY2Vzc1RhYkRyb3Bkb3duQWN0aXZlQ2hhbmdlZCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fdGFiRHJvcGRvd25CdXR0b24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBzZXRFbGVtZW50RGlzcGxheVZpc2liaWxpdHkodGhpcy5fdGFiRHJvcGRvd25CdXR0b24uZWxlbWVudCwgdGhpcy5fdGFic0NvbnRhaW5lci5kcm9wZG93bkFjdGl2ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlQnV0dG9uUG9wb3V0RXZlbnQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2xheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLnNldHRpbmdzLnBvcG91dFdob2xlU3RhY2spIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3BvcG91dEV2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0hIQlBPRTE3ODM0Jyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9wb3BvdXRFdmVudCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgYWN0aXZlQ29tcG9uZW50SXRlbSA9IHRoaXMuX2dldEFjdGl2ZUNvbXBvbmVudEl0ZW1FdmVudCgpO1xyXG4gICAgICAgICAgICBpZiAoYWN0aXZlQ29tcG9uZW50SXRlbSkge1xyXG4gICAgICAgICAgICAgICAgYWN0aXZlQ29tcG9uZW50SXRlbS5wb3BvdXQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBlbHNlOiBpZiB0aGUgc3RhY2sgaXMgZW1wdHkgdGhlcmUgd29uJ3QgYmUgYW4gYWN0aXZlIGl0ZW0gKGFuZCBub3RoaW5nIHRvIHBvcG91dClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVCdXR0b25NYXhpbWlzZVRvZ2dsZUV2ZW50KGV2OiBFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9tYXhpbWlzZVRvZ2dsZUV2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignSEhCTVRFMTY4MzQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9tYXhpbWlzZVRvZ2dsZUV2ZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW52b2tlZCB3aGVuIHRoZSBoZWFkZXIncyBiYWNrZ3JvdW5kIGlzIGNsaWNrZWQgKG5vdCBpdCdzIHRhYnMgb3IgY29udHJvbHMpXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNsaWNrKGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnZva2VkIHdoZW4gdGhlIGhlYWRlcidzIGJhY2tncm91bmQgaXMgdG91Y2hlZCAobm90IGl0J3MgdGFicyBvciBjb250cm9scylcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uVG91Y2hTdGFydChldmVudDogVG91Y2hFdmVudCkge1xyXG4gICAgICAgIGlmIChldmVudC50YXJnZXQgPT09IHRoaXMuX2VsZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5ub3RpZnlUb3VjaFN0YXJ0KGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBvbkxheW91dENoYW5nZWQoKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVCdXR0b25zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBub3RpZnlDbGljayhldjogTW91c2VFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9jbGlja0V2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignSE5IQzQ2ODM0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY2xpY2tFdmVudChldik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgbm90aWZ5VG91Y2hTdGFydChldjogVG91Y2hFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLl90b3VjaFN0YXJ0RXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdITkhUUzQ2ODM0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fdG91Y2hTdGFydEV2ZW50KGV2KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgSGVhZGVyIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIEdldEFjdGl2ZUNvbXBvbmVudEl0ZW1FdmVudCA9ICh0aGlzOiB2b2lkKSA9PiBDb21wb25lbnRJdGVtIHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgQ2xvc2VFdmVudCA9ICh0aGlzOiB2b2lkKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgUG9wb3V0RXZlbnQgPSAodGhpczogdm9pZCkgPT4gdm9pZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIE1heGltaXNlVG9nZ2xlRXZlbnQgPSAodGhpczogdm9pZCkgPT4gdm9pZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIENsaWNrRXZlbnQgPSAodGhpczogdm9pZCwgZXY6IE1vdXNlRXZlbnQpID0+IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBUb3VjaFN0YXJ0RXZlbnQgPSAodGhpczogdm9pZCwgZXY6IFRvdWNoRXZlbnQpID0+IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBDb21wb25lbnRSZW1vdmVFdmVudCA9ICh0aGlzOiB2b2lkLCBjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgQ29tcG9uZW50Rm9jdXNFdmVudCA9ICh0aGlzOiB2b2lkLCBjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgQ29tcG9uZW50RHJhZ1N0YXJ0RXZlbnQgPSAodGhpczogdm9pZCwgeDogbnVtYmVyLCB5OiBudW1iZXIsIGRyYWdMaXN0ZW5lcjogRHJhZ0xpc3RlbmVyLCBjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgU3RhdGVDaGFuZ2VkRXZlbnQgPSAodGhpczogdm9pZCkgPT4gdm9pZDtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzIHtcclxuICAgICAgICBzaG93OiBib29sZWFuO1xyXG4gICAgICAgIHNpZGU6IFNpZGU7XHJcbiAgICAgICAgcG9wb3V0RW5hYmxlZDogYm9vbGVhbjtcclxuICAgICAgICBwb3BvdXRMYWJlbDogc3RyaW5nO1xyXG4gICAgICAgIG1heGltaXNlRW5hYmxlZDogYm9vbGVhbjtcclxuICAgICAgICBtYXhpbWlzZUxhYmVsOiBzdHJpbmc7XHJcbiAgICAgICAgbWluaW1pc2VFbmFibGVkOiBib29sZWFuO1xyXG4gICAgICAgIG1pbmltaXNlTGFiZWw6IHN0cmluZztcclxuICAgICAgICBjbG9zZUVuYWJsZWQ6IGJvb2xlYW47XHJcbiAgICAgICAgY2xvc2VMYWJlbDogc3RyaW5nO1xyXG4gICAgICAgIHRhYkRyb3Bkb3duRW5hYmxlZDogYm9vbGVhbjtcclxuICAgICAgICB0YWJEcm9wZG93bkxhYmVsOiBzdHJpbmc7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgRG9tQ29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbHMvZG9tLWNvbnN0YW50cyc7XHJcbmltcG9ydCB7IERyYWdMaXN0ZW5lciB9IGZyb20gJy4uL3V0aWxzL2RyYWctbGlzdGVuZXInO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi91dGlscy9ldmVudC1lbWl0dGVyJztcclxuaW1wb3J0IHsgbnVtYmVyVG9QaXhlbHMgfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBjbGFzcyBTcGxpdHRlciB7XHJcbiAgICBwcml2YXRlIF9ncmFiU2l6ZTtcclxuICAgIHByaXZhdGUgX2RyYWdMaXN0ZW5lcjogRHJhZ0xpc3RlbmVyO1xyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnQ6IEhUTUxEaXZFbGVtZW50O1xyXG5cclxuICAgIGdldCBlbGVtZW50KCk6IEhUTUxEaXZFbGVtZW50IHsgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7IH1cclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9pc1ZlcnRpY2FsOiBib29sZWFuLCBwcml2YXRlIF9zaXplOiBudW1iZXIsIGdyYWJTaXplOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9ncmFiU2l6ZSA9IGdyYWJTaXplIDwgdGhpcy5fc2l6ZSA/IHRoaXMuX3NpemUgOiBncmFiU2l6ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLlNwbGl0dGVyKTtcclxuICAgICAgICBjb25zdCBkcmFnSGFuZGxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGRyYWdIYW5kbGVFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5EcmFnSGFuZGxlKTtcclxuXHJcbiAgICAgICAgY29uc3QgaGFuZGxlRXhjZXNzU2l6ZSA9IHRoaXMuX2dyYWJTaXplIC0gdGhpcy5fc2l6ZTtcclxuICAgICAgICBjb25zdCBoYW5kbGVFeGNlc3NQb3MgPSBoYW5kbGVFeGNlc3NTaXplIC8gMjtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2lzVmVydGljYWwpIHtcclxuICAgICAgICAgICAgZHJhZ0hhbmRsZUVsZW1lbnQuc3R5bGUudG9wID0gbnVtYmVyVG9QaXhlbHMoLWhhbmRsZUV4Y2Vzc1Bvcyk7XHJcbiAgICAgICAgICAgIGRyYWdIYW5kbGVFbGVtZW50LnN0eWxlLmhlaWdodCA9IG51bWJlclRvUGl4ZWxzKHRoaXMuX3NpemUgKyBoYW5kbGVFeGNlc3NTaXplKTtcclxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuVmVydGljYWwpO1xyXG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmhlaWdodCA9IG51bWJlclRvUGl4ZWxzKHRoaXMuX3NpemUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRyYWdIYW5kbGVFbGVtZW50LnN0eWxlLmxlZnQgPSBudW1iZXJUb1BpeGVscygtaGFuZGxlRXhjZXNzUG9zKTtcclxuICAgICAgICAgICAgZHJhZ0hhbmRsZUVsZW1lbnQuc3R5bGUud2lkdGggPSBudW1iZXJUb1BpeGVscyh0aGlzLl9zaXplICsgaGFuZGxlRXhjZXNzU2l6ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkhvcml6b250YWwpO1xyXG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLndpZHRoID0gbnVtYmVyVG9QaXhlbHModGhpcy5fc2l6ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKGRyYWdIYW5kbGVFbGVtZW50KTtcclxuXHJcbiAgICAgICAgdGhpcy5fZHJhZ0xpc3RlbmVyID0gbmV3IERyYWdMaXN0ZW5lcih0aGlzLl9lbGVtZW50LCBbZHJhZ0hhbmRsZUVsZW1lbnRdKTtcclxuICAgIH1cclxuXHJcbiAgICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb248SyBleHRlbmRzIGtleW9mIEV2ZW50RW1pdHRlci5FdmVudFBhcmFtc01hcD4oZXZlbnROYW1lOiBLLCBjYWxsYmFjazogRXZlbnRFbWl0dGVyLkNhbGxiYWNrPEs+KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZHJhZ0xpc3RlbmVyLm9uPEs+KGV2ZW50TmFtZSwgY2FsbGJhY2spO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuLi9pdGVtcy9jb21wb25lbnQtaXRlbSc7XHJcbmltcG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuLi9sYXlvdXQtbWFuYWdlcic7XHJcbmltcG9ydCB7IERvbUNvbnN0YW50cyB9IGZyb20gJy4uL3V0aWxzL2RvbS1jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBEcmFnTGlzdGVuZXIgfSBmcm9tICcuLi91dGlscy9kcmFnLWxpc3RlbmVyJztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGFuIGluZGl2aWR1YWwgdGFiIHdpdGhpbiBhIFN0YWNrJ3MgaGVhZGVyXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBjbGFzcyBUYWIge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZWxlbWVudDogSFRNTERpdkVsZW1lbnQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90aXRsZUVsZW1lbnQ6IEhUTUxTcGFuRWxlbWVudDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Nsb3NlRWxlbWVudDogSFRNTERpdkVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfZHJhZ0xpc3RlbmVyOiBEcmFnTGlzdGVuZXIgfCB1bmRlZmluZWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9pc0FjdGl2ZSA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RhYkNsaWNrTGlzdGVuZXIgPSAoZXY6IE1vdXNlRXZlbnQpID0+IHRoaXMub25UYWJDbGlja0Rvd24oZXYpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFiVG91Y2hTdGFydExpc3RlbmVyID0gKGV2OiBUb3VjaEV2ZW50KSA9PiB0aGlzLm9uVGFiVG91Y2hTdGFydChldik7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jbG9zZUNsaWNrTGlzdGVuZXIgPSAoKSA9PiB0aGlzLm9uQ2xvc2VDbGljaygpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2xvc2VUb3VjaFN0YXJ0TGlzdGVuZXIgPSAoKSA9PiB0aGlzLm9uQ2xvc2VUb3VjaFN0YXJ0KCk7XHJcbiAgICAvLyAvKiogQGludGVybmFsICovXHJcbiAgICAvLyBwcml2YXRlIHJlYWRvbmx5IF9jbG9zZU1vdXNlRG93bkxpc3RlbmVyID0gKCkgPT4gdGhpcy5vbkNsb3NlTW91c2Vkb3duKCk7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kcmFnU3RhcnRMaXN0ZW5lciA9ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gdGhpcy5vbkRyYWdTdGFydCh4LCB5KTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRlbnRJdGVtRGVzdHJveUxpc3RlbmVyID0gKCkgPT4gdGhpcy5vbkNvbnRlbnRJdGVtRGVzdHJveSgpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFiVGl0bGVDaGFuZ2VkTGlzdGVuZXIgPSAodGl0bGU6IHN0cmluZykgPT4gdGhpcy5zZXRUaXRsZSh0aXRsZSlcclxuXHJcbiAgICBnZXQgaXNBY3RpdmUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9pc0FjdGl2ZTsgfVxyXG4gICAgLy8gZ2V0IGhlYWRlcigpOiBIZWFkZXIgeyByZXR1cm4gdGhpcy5faGVhZGVyOyB9XHJcbiAgICBnZXQgY29tcG9uZW50SXRlbSgpOiBDb21wb25lbnRJdGVtIHsgcmV0dXJuIHRoaXMuX2NvbXBvbmVudEl0ZW07IH1cclxuICAgIC8qKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChUYWI6Y2xhc3MpLmNvbXBvbmVudEl0ZW19ICovXHJcbiAgICBnZXQgY29udGVudEl0ZW0oKTogQ29tcG9uZW50SXRlbSB7IHJldHVybiB0aGlzLl9jb21wb25lbnRJdGVtOyB9XHJcbiAgICBnZXQgZWxlbWVudCgpOiBIVE1MRWxlbWVudCB7IHJldHVybiB0aGlzLl9lbGVtZW50OyB9XHJcbiAgICBnZXQgdGl0bGVFbGVtZW50KCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX3RpdGxlRWxlbWVudDsgfVxyXG4gICAgZ2V0IGNsb3NlRWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9jbG9zZUVsZW1lbnQ7IH1cclxuICAgIGdldCByZW9yZGVyRW5hYmxlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2RyYWdMaXN0ZW5lciAhPT0gdW5kZWZpbmVkOyB9XHJcbiAgICBzZXQgcmVvcmRlckVuYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAodmFsdWUgIT09IHRoaXMucmVvcmRlckVuYWJsZWQpIHtcclxuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZVJlb3JkZXIoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZVJlb3JkZXIoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfbGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlcixcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfY2xvc2VFdmVudDogVGFiLkNsb3NlRXZlbnQgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX2ZvY3VzRXZlbnQ6IFRhYi5Gb2N1c0V2ZW50IHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9kcmFnU3RhcnRFdmVudDogVGFiLkRyYWdTdGFydEV2ZW50IHwgdW5kZWZpbmVkXHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuVGFiKTtcclxuICAgICAgICB0aGlzLl90aXRsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7IFxyXG4gICAgICAgIHRoaXMuX3RpdGxlRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuVGl0bGUpO1xyXG4gICAgICAgIHRoaXMuX2Nsb3NlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBcclxuICAgICAgICB0aGlzLl9jbG9zZUVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkNsb3NlVGFiKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3RpdGxlRWxlbWVudCk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9jbG9zZUVsZW1lbnQpO1xyXG5cclxuICAgICAgICBpZiAoX2NvbXBvbmVudEl0ZW0uaXNDbG9zYWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9jbG9zZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICcnO1xyXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkNsb3NhYmxlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9jbG9zZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0VGl0bGUoX2NvbXBvbmVudEl0ZW0udGl0bGUpO1xyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudEl0ZW0ub24oJ3RpdGxlQ2hhbmdlZCcsIHRoaXMuX3RhYlRpdGxlQ2hhbmdlZExpc3RlbmVyKTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVvcmRlckVuYWJsZWQgPSBfY29tcG9uZW50SXRlbS5yZW9yZGVyRW5hYmxlZCA/PyB0aGlzLl9sYXlvdXRNYW5hZ2VyLmxheW91dENvbmZpZy5zZXR0aW5ncy5yZW9yZGVyRW5hYmxlZDtcclxuXHJcbiAgICAgICAgaWYgKHJlb3JkZXJFbmFibGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlUmVvcmRlcigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX3RhYkNsaWNrTGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl90YWJUb3VjaFN0YXJ0TGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudEl0ZW0uaXNDbG9zYWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9jbG9zZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9jbG9zZUNsaWNrTGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgdGhpcy5fY2xvc2VFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl9jbG9zZVRvdWNoU3RhcnRMaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAvLyB0aGlzLl9jbG9zZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fY2xvc2VNb3VzZURvd25MaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlRWxlbWVudC5yZW1vdmUoKTtcclxuICAgICAgICAgICAgdGhpcy5fY2xvc2VFbGVtZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5zZXRUYWIodGhpcyk7XHJcbiAgICAgICAgdGhpcy5fbGF5b3V0TWFuYWdlci5lbWl0KCd0YWJDcmVhdGVkJywgdGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB0YWIncyB0aXRsZSB0byB0aGUgcHJvdmlkZWQgc3RyaW5nIGFuZCBzZXRzXHJcbiAgICAgKiBpdHMgdGl0bGUgYXR0cmlidXRlIHRvIGEgcHVyZSB0ZXh0IHJlcHJlc2VudGF0aW9uICh3aXRob3V0XHJcbiAgICAgKiBodG1sIHRhZ3MpIG9mIHRoZSBzYW1lIHN0cmluZy5cclxuICAgICAqL1xyXG4gICAgc2V0VGl0bGUodGl0bGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3RpdGxlRWxlbWVudC5pbm5lclRleHQgPSB0aXRsZTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnRpdGxlID0gdGl0bGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoaXMgdGFiJ3MgYWN0aXZlIHN0YXRlLiBUbyBwcm9ncmFtbWF0aWNhbGx5XHJcbiAgICAgKiBzd2l0Y2ggdGFicywgdXNlIFN0YWNrLnNldEFjdGl2ZUNvbXBvbmVudEl0ZW0oIGl0ZW0gKSBpbnN0ZWFkLlxyXG4gICAgICovXHJcbiAgICBzZXRBY3RpdmUoaXNBY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBpZiAoaXNBY3RpdmUgPT09IHRoaXMuX2lzQWN0aXZlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5faXNBY3RpdmUgPSBpc0FjdGl2ZTtcclxuXHJcbiAgICAgICAgaWYgKGlzQWN0aXZlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkFjdGl2ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKERvbUNvbnN0YW50cy5DbGFzc05hbWUuQWN0aXZlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyB0aGUgdGFiXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9jbG9zZUV2ZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuX2ZvY3VzRXZlbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5fZHJhZ1N0YXJ0RXZlbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX3RhYkNsaWNrTGlzdGVuZXIpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX3RhYlRvdWNoU3RhcnRMaXN0ZW5lcik7XHJcbiAgICAgICAgdGhpcy5fY2xvc2VFbGVtZW50Py5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2Nsb3NlQ2xpY2tMaXN0ZW5lcik7XHJcbiAgICAgICAgdGhpcy5fY2xvc2VFbGVtZW50Py5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5fY2xvc2VUb3VjaFN0YXJ0TGlzdGVuZXIpO1xyXG4gICAgICAgIC8vIHRoaXMuX2Nsb3NlRWxlbWVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fY2xvc2VNb3VzZURvd25MaXN0ZW5lcik7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5vZmYoJ3RpdGxlQ2hhbmdlZCcsIHRoaXMuX3RhYlRpdGxlQ2hhbmdlZExpc3RlbmVyKTtcclxuICAgICAgICBpZiAodGhpcy5yZW9yZGVyRW5hYmxlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVSZW9yZGVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc2V0Qmx1cnJlZCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Gb2N1c2VkKTtcclxuICAgICAgICB0aGlzLl90aXRsZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShEb21Db25zdGFudHMuQ2xhc3NOYW1lLkZvY3VzZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHNldEZvY3VzZWQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuRm9jdXNlZCk7XHJcbiAgICAgICAgdGhpcy5fdGl0bGVFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Gb2N1c2VkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxiYWNrIGZvciB0aGUgRHJhZ0xpc3RlbmVyXHJcbiAgICAgKiBAcGFyYW0geCAtIFRoZSB0YWJzIGFic29sdXRlIHggcG9zaXRpb25cclxuICAgICAqIEBwYXJhbSB5IC0gVGhlIHRhYnMgYWJzb2x1dGUgeSBwb3NpdGlvblxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25EcmFnU3RhcnQoeDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fZHJhZ0xpc3RlbmVyID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignVE9EU0RMVTEwMDkzJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2RyYWdTdGFydEV2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ1RPRFMyMzMwOScpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZHJhZ1N0YXJ0RXZlbnQoeCwgeSwgdGhpcy5fZHJhZ0xpc3RlbmVyLCB0aGlzLmNvbXBvbmVudEl0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIG9uQ29udGVudEl0ZW1EZXN0cm95KCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9kcmFnTGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGJhY2sgd2hlbiB0aGUgdGFiIGlzIGNsaWNrZWRcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uVGFiQ2xpY2tEb3duKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xyXG4gICAgICAgIGlmICh0YXJnZXQgPT09IHRoaXMuX2VsZW1lbnQgfHwgdGFyZ2V0ID09PSB0aGlzLl90aXRsZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgLy8gbGVmdCBtb3VzZSBidXR0b25cclxuICAgICAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUZvY3VzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gbWlkZGxlIG1vdXNlIGJ1dHRvblxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gMSAmJiB0aGlzLl9jb21wb25lbnRJdGVtLmlzQ2xvc2FibGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDbG9zZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgb25UYWJUb3VjaFN0YXJ0KGV2ZW50OiBUb3VjaEV2ZW50KSB7XHJcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLm5vdGlmeUZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGJhY2sgd2hlbiB0aGUgdGFiJ3MgY2xvc2UgYnV0dG9uIGlzIGNsaWNrZWRcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uQ2xvc2VDbGljaygpIHtcclxuICAgICAgICB0aGlzLm5vdGlmeUNsb3NlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBvbkNsb3NlVG91Y2hTdGFydCgpIHtcclxuICAgICAgICB0aGlzLm5vdGlmeUNsb3NlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayB0byBjYXB0dXJlIHRhYiBjbG9zZSBidXR0b24gbW91c2Vkb3duXHJcbiAgICAgKiB0byBwcmV2ZW50IHRhYiBmcm9tIGFjdGl2YXRpbmcuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgLy8gcHJpdmF0ZSBvbkNsb3NlTW91c2Vkb3duKCk6IHZvaWQge1xyXG4gICAgLy8gICAgIC8vIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgbm90aWZ5Q2xvc2UoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2Nsb3NlRXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdUTkMxNTAwNycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlRXZlbnQodGhpcy5fY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgbm90aWZ5Rm9jdXMoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2ZvY3VzRXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdUTkExNTAwNycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzRXZlbnQodGhpcy5fY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgZW5hYmxlUmVvcmRlcigpIHtcclxuICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIgPSBuZXcgRHJhZ0xpc3RlbmVyKHRoaXMuX2VsZW1lbnQsIFt0aGlzLl90aXRsZUVsZW1lbnRdKTtcclxuICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIub24oJ2RyYWdTdGFydCcsIHRoaXMuX2RyYWdTdGFydExpc3RlbmVyKTtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRJdGVtLm9uKCdkZXN0cm95JywgdGhpcy5fY29udGVudEl0ZW1EZXN0cm95TGlzdGVuZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgZGlzYWJsZVJlb3JkZXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RyYWdMaXN0ZW5lciA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ1REUjg3NzQ1Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5vZmYoJ2Rlc3Ryb3knLCB0aGlzLl9jb250ZW50SXRlbURlc3Ryb3lMaXN0ZW5lcik7XHJcbiAgICAgICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lci5vZmYoJ2RyYWdTdGFydCcsIHRoaXMuX2RyYWdTdGFydExpc3RlbmVyKTtcclxuICAgICAgICAgICAgdGhpcy5fZHJhZ0xpc3RlbmVyID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBUYWIge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgQ2xvc2VFdmVudCA9IChjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgRm9jdXNFdmVudCA9IChjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgRHJhZ1N0YXJ0RXZlbnQgPSAoeDogbnVtYmVyLCB5OiBudW1iZXIsIGRyYWdMaXN0ZW5lcjogRHJhZ0xpc3RlbmVyLCBjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG59XHJcbiIsImltcG9ydCB7IEFzc2VydEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgQ29tcG9uZW50SXRlbSB9IGZyb20gJy4uL2l0ZW1zL2NvbXBvbmVudC1pdGVtJztcclxuaW1wb3J0IHsgTGF5b3V0TWFuYWdlciB9IGZyb20gJy4uL2xheW91dC1tYW5hZ2VyJztcclxuaW1wb3J0IHsgRG9tQ29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbHMvZG9tLWNvbnN0YW50cyc7XHJcbmltcG9ydCB7IERyYWdMaXN0ZW5lciB9IGZyb20gJy4uL3V0aWxzL2RyYWctbGlzdGVuZXInO1xyXG5pbXBvcnQgeyBudW1iZXJUb1BpeGVscywgcGl4ZWxzVG9OdW1iZXIgfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcbmltcG9ydCB7IFRhYiB9IGZyb20gJy4vdGFiJztcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGNsYXNzIFRhYnNDb250YWluZXIge1xyXG4gICAgLy8gVGhlcmUgaXMgb25lIHRhYiBwZXIgQ29tcG9uZW50SXRlbSBpbiBzdGFjay4gIEhvd2V2ZXIgdGhleSBtYXkgbm90IGJlIG9yZGVyZWQgdGhlIHNhbWVcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RhYnM6IFRhYltdID0gW107XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZHJvcGRvd25FbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG4gICAgcHJpdmF0ZSBfbGFzdFZpc2libGVUYWJJbmRleCA9IC0xO1xyXG4gICAgcHJpdmF0ZSBfZHJvcGRvd25BY3RpdmUgPSBmYWxzZTtcclxuXHJcbiAgICBnZXQgdGFicygpOiBUYWJbXSB7IHJldHVybiB0aGlzLl90YWJzOyB9XHJcbiAgICBnZXQgdGFiQ291bnQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3RhYnMubGVuZ3RoOyB9XHJcbiAgICBnZXQgbGFzdFZpc2libGVUYWJJbmRleCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fbGFzdFZpc2libGVUYWJJbmRleDsgfVxyXG5cclxuICAgIGdldCBlbGVtZW50KCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7IH1cclxuICAgIGdldCBkcm9wZG93bkVsZW1lbnQoKTogSFRNTEVsZW1lbnQgeyByZXR1cm4gdGhpcy5fZHJvcGRvd25FbGVtZW50OyB9XHJcbiAgICBnZXQgZHJvcGRvd25BY3RpdmUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9kcm9wZG93bkFjdGl2ZTsgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2xheW91dE1hbmFnZXI6IExheW91dE1hbmFnZXIsXHJcbiAgICAgICAgcHJpdmF0ZSBfY29tcG9uZW50UmVtb3ZlRXZlbnQ6IFRhYnNDb250YWluZXIuQ29tcG9uZW50SXRlbVJlbW92ZUV2ZW50LFxyXG4gICAgICAgIHByaXZhdGUgX2NvbXBvbmVudEZvY3VzRXZlbnQ6IFRhYnNDb250YWluZXIuQ29tcG9uZW50SXRlbUZvY3VzRXZlbnQsXHJcbiAgICAgICAgcHJpdmF0ZSBfY29tcG9uZW50RHJhZ1N0YXJ0RXZlbnQ6IFRhYnNDb250YWluZXIuQ29tcG9uZW50SXRlbURyYWdTdGFydEV2ZW50LFxyXG4gICAgICAgIHByaXZhdGUgX2Ryb3Bkb3duQWN0aXZlQ2hhbmdlZEV2ZW50OiBUYWJzQ29udGFpbmVyLkRyb3Bkb3duQWN0aXZlQ2hhbmdlZEV2ZW50LFxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlY3Rpb24nKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5UYWJzKTtcclxuXHJcbiAgICAgICAgdGhpcy5fZHJvcGRvd25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2VjdGlvbicpO1xyXG4gICAgICAgIHRoaXMuX2Ryb3Bkb3duRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuVGFiRHJvcGRvd25MaXN0KTtcclxuICAgICAgICB0aGlzLl9kcm9wZG93bkVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgIH1cclxuXHJcbiAgICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fdGFicy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLl90YWJzW2ldLmRlc3Ryb3koKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHRhYiBhbmQgYXNzb2NpYXRlcyBpdCB3aXRoIGEgY29udGVudEl0ZW1cclxuICAgICAqIEBwYXJhbSBpbmRleCAtIFRoZSBwb3NpdGlvbiBvZiB0aGUgdGFiXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZVRhYihjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgLy9JZiB0aGVyZSdzIGFscmVhZHkgYSB0YWIgcmVsYXRpbmcgdG8gdGhlXHJcbiAgICAgICAgLy9jb250ZW50IGl0ZW0sIGRvbid0IGRvIGFueXRoaW5nXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl90YWJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl90YWJzW2ldLmNvbXBvbmVudEl0ZW0gPT09IGNvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdGFiID0gbmV3IFRhYih0aGlzLl9sYXlvdXRNYW5hZ2VyLFxyXG4gICAgICAgICAgICBjb21wb25lbnRJdGVtLFxyXG4gICAgICAgICAgICAoaXRlbSkgPT4gdGhpcy5oYW5kbGVUYWJDbG9zZUV2ZW50KGl0ZW0pLFxyXG4gICAgICAgICAgICAoaXRlbSkgPT4gdGhpcy5oYW5kbGVUYWJGb2N1c0V2ZW50KGl0ZW0pLFxyXG4gICAgICAgICAgICAoeCwgeSwgZHJhZ0xpc3RlbmVyLCBpdGVtKSA9PiB0aGlzLmhhbmRsZVRhYkRyYWdTdGFydEV2ZW50KHgsIHksIGRyYWdMaXN0ZW5lciwgaXRlbSkpO1xyXG5cclxuICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpbmRleCA9IHRoaXMuX3RhYnMubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fdGFicy5zcGxpY2UoaW5kZXgsIDAsIHRhYik7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCA8IHRoaXMuX2VsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5pbnNlcnRCZWZvcmUodGFiLmVsZW1lbnQsIHRoaXMuX2VsZW1lbnQuY2hpbGROb2Rlc1tpbmRleF0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodGFiLmVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVUYWIoY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSk6IHZvaWQge1xyXG4gICAgICAgIC8vIGNvbXBvbmVudEl0ZW0gY2Fubm90IGJlIEFjdGl2ZUNvbXBvbmVudEl0ZW1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3RhYnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3RhYnNbaV0uY29tcG9uZW50SXRlbSA9PT0gY29tcG9uZW50SXRlbSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFiID0gdGhpcy5fdGFic1tpXTtcclxuICAgICAgICAgICAgICAgIHRhYi5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90YWJzLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb250ZW50SXRlbSBpcyBub3QgY29udHJvbGxlZCBieSB0aGlzIGhlYWRlcicpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb2Nlc3NBY3RpdmVDb21wb25lbnRDaGFuZ2VkKG5ld0FjdGl2ZUNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pOiB2b2lkIHtcclxuICAgICAgICBsZXQgYWN0aXZlSW5kZXggPSAtMTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3RhYnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaXNBY3RpdmUgPSB0aGlzLl90YWJzW2ldLmNvbXBvbmVudEl0ZW0gPT09IG5ld0FjdGl2ZUNvbXBvbmVudEl0ZW07XHJcbiAgICAgICAgICAgIHRoaXMuX3RhYnNbaV0uc2V0QWN0aXZlKGlzQWN0aXZlKTtcclxuICAgICAgICAgICAgaWYgKGlzQWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICBhY3RpdmVJbmRleCA9IGk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChhY3RpdmVJbmRleCA8IDApIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdIU0FDSTU2NjMyJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2xheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLnNldHRpbmdzLnJlb3JkZXJPblRhYk1lbnVDbGljaykge1xyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBJZiB0aGUgdGFiIHNlbGVjdGVkIHdhcyBpbiB0aGUgZHJvcGRvd24sIG1vdmUgZXZlcnl0aGluZyBkb3duIG9uZSB0byBtYWtlIHdheSBmb3IgdGhpcyBvbmUgdG8gYmUgdGhlIGZpcnN0LlxyXG4gICAgICAgICAgICAgICAgICogVGhpcyB3aWxsIG1ha2Ugc3VyZSB0aGUgbW9zdCB1c2VkIHRhYnMgc3RheSB2aXNpYmxlLlxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbGFzdFZpc2libGVUYWJJbmRleCAhPT0gLTEgJiYgYWN0aXZlSW5kZXggPiB0aGlzLl9sYXN0VmlzaWJsZVRhYkluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlVGFiID0gdGhpcy5fdGFic1thY3RpdmVJbmRleF07XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IGFjdGl2ZUluZGV4OyBqID4gMDsgai0tKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RhYnNbal0gPSB0aGlzLl90YWJzW2ogLSAxXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFic1swXSA9IGFjdGl2ZVRhYjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlVGFiU2l6ZXMgd2lsbCBhbHdheXMgYmUgY2FsbGVkIGFmdGVyIHRoaXMgYW5kIGl0IHdpbGwgcmVwb3NpdGlvbiB0YWIgZWxlbWVudHNcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFB1c2hlcyB0aGUgdGFicyB0byB0aGUgdGFiIGRyb3Bkb3duIGlmIHRoZSBhdmFpbGFibGUgc3BhY2UgaXMgbm90IHN1ZmZpY2llbnRcclxuICAgICAqL1xyXG4gICAgdXBkYXRlVGFiU2l6ZXMoYXZhaWxhYmxlV2lkdGg6IG51bWJlciwgYWN0aXZlQ29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSB8IHVuZGVmaW5lZCk6IHZvaWQge1xyXG4gICAgICAgIGxldCBkcm9wRG93bkFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLnRyeVVwZGF0ZVRhYlNpemVzKGRyb3BEb3duQWN0aXZlLCBhdmFpbGFibGVXaWR0aCwgYWN0aXZlQ29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgaWYgKCFzdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIGRyb3BEb3duQWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgLy8gdGhpcyB3aWxsIGFsd2F5cyBzdWNjZWVkXHJcbiAgICAgICAgICAgIHRoaXMudHJ5VXBkYXRlVGFiU2l6ZXMoZHJvcERvd25BY3RpdmUsIGF2YWlsYWJsZVdpZHRoLCBhY3RpdmVDb21wb25lbnRJdGVtKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5tYXhXaWR0aCA9IG51bWJlclRvUGl4ZWxzKE1hdGgubWF4KDAsIGF2YWlsYWJsZVdpZHRoKSk7XHJcblxyXG4gICAgICAgIGlmIChkcm9wRG93bkFjdGl2ZSAhPT0gdGhpcy5fZHJvcGRvd25BY3RpdmUpIHtcclxuICAgICAgICAgICAgdGhpcy5fZHJvcGRvd25BY3RpdmUgPSBkcm9wRG93bkFjdGl2ZTtcclxuICAgICAgICAgICAgdGhpcy5fZHJvcGRvd25BY3RpdmVDaGFuZ2VkRXZlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5VXBkYXRlVGFiU2l6ZXMoZHJvcGRvd25BY3RpdmU6IGJvb2xlYW4sIGF2YWlsYWJsZVdpZHRoOiBudW1iZXIsIGFjdGl2ZUNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAodGhpcy5fdGFicy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGlmIChhY3RpdmVDb21wb25lbnRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm9uLWVtcHR5IHRhYnMgbXVzdCBoYXZlIGFjdGl2ZSBjb21wb25lbnQgaXRlbScpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgY3VtdWxhdGl2ZVRhYldpZHRoID0gMDtcclxuICAgICAgICAgICAgbGV0IHRhYk92ZXJsYXBBbGxvd2FuY2VFeGNlZWRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBjb25zdCB0YWJPdmVybGFwQWxsb3dhbmNlID0gdGhpcy5fbGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuc2V0dGluZ3MudGFiT3ZlcmxhcEFsbG93YW5jZTtcclxuICAgICAgICAgICAgY29uc3QgYWN0aXZlSW5kZXggPSB0aGlzLl90YWJzLmluZGV4T2YoYWN0aXZlQ29tcG9uZW50SXRlbS50YWIpO1xyXG4gICAgICAgICAgICBjb25zdCBhY3RpdmVUYWIgPSB0aGlzLl90YWJzW2FjdGl2ZUluZGV4XTtcclxuICAgICAgICAgICAgdGhpcy5fbGFzdFZpc2libGVUYWJJbmRleCA9IC0xO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl90YWJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJFbGVtZW50ID0gdGhpcy5fdGFic1tpXS5lbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgICAgIC8vUHV0IHRoZSB0YWIgaW4gdGhlIHRhYkNvbnRhaW5lciBzbyBpdHMgdHJ1ZSB3aWR0aCBjYW4gYmUgY2hlY2tlZFxyXG4gICAgICAgICAgICAgICAgaWYgKHRhYkVsZW1lbnQucGFyZW50RWxlbWVudCAhPT0gdGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodGFiRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJNYXJnaW5SaWdodFBpeGVscyA9IGdldENvbXB1dGVkU3R5bGUoYWN0aXZlVGFiLmVsZW1lbnQpLm1hcmdpblJpZ2h0O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFiTWFyZ2luUmlnaHQgPSBwaXhlbHNUb051bWJlcih0YWJNYXJnaW5SaWdodFBpeGVscyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJXaWR0aCA9IHRhYkVsZW1lbnQub2Zmc2V0V2lkdGggKyB0YWJNYXJnaW5SaWdodDtcclxuXHJcbiAgICAgICAgICAgICAgICBjdW11bGF0aXZlVGFiV2lkdGggKz0gdGFiV2lkdGg7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9JbmNsdWRlIHRoZSBhY3RpdmUgdGFiJ3Mgd2lkdGggaWYgaXQgaXNuJ3QgYWxyZWFkeVxyXG4gICAgICAgICAgICAgICAgLy9UaGlzIGlzIHRvIGVuc3VyZSB0aGVyZSBpcyByb29tIHRvIHNob3cgdGhlIGFjdGl2ZSB0YWJcclxuICAgICAgICAgICAgICAgIGxldCB2aXNpYmxlVGFiV2lkdGggPSAwO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZUluZGV4IDw9IGkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2aXNpYmxlVGFiV2lkdGggPSBjdW11bGF0aXZlVGFiV2lkdGg7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdGl2ZVRhYk1hcmdpblJpZ2h0UGl4ZWxzID0gZ2V0Q29tcHV0ZWRTdHlsZShhY3RpdmVUYWIuZWxlbWVudCkubWFyZ2luUmlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlVGFiTWFyZ2luUmlnaHQgPSBwaXhlbHNUb051bWJlcihhY3RpdmVUYWJNYXJnaW5SaWdodFBpeGVscyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZVRhYldpZHRoID0gY3VtdWxhdGl2ZVRhYldpZHRoICsgYWN0aXZlVGFiLmVsZW1lbnQub2Zmc2V0V2lkdGggKyBhY3RpdmVUYWJNYXJnaW5SaWdodDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdGFicyB3b24ndCBmaXQsIGNoZWNrIHRoZSBvdmVybGFwIGFsbG93YW5jZS5cclxuICAgICAgICAgICAgICAgIGlmICh2aXNpYmxlVGFiV2lkdGggPiBhdmFpbGFibGVXaWR0aCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvL09uY2UgYWxsb3dhbmNlIGlzIGV4Y2VlZGVkLCBhbGwgcmVtYWluaW5nIHRhYnMgZ28gdG8gbWVudS5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRhYk92ZXJsYXBBbGxvd2FuY2VFeGNlZWRlZCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9ObyBvdmVybGFwIGZvciBmaXJzdCB0YWIgb3IgYWN0aXZlIHRhYlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL092ZXJsYXAgc3ByZWFkcyBhbW9uZyBub24tYWN0aXZlLCBub24tZmlyc3QgdGFic1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3ZlcmxhcDogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlSW5kZXggPiAwICYmIGFjdGl2ZUluZGV4IDw9IGkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXAgPSAodmlzaWJsZVRhYldpZHRoIC0gYXZhaWxhYmxlV2lkdGgpIC8gKGkgLSAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXAgPSAodmlzaWJsZVRhYldpZHRoIC0gYXZhaWxhYmxlV2lkdGgpIC8gaTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9DaGVjayBvdmVybGFwIGFnYWluc3QgYWxsb3dhbmNlLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3ZlcmxhcCA8IHRhYk92ZXJsYXBBbGxvd2FuY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDw9IGk7IGorKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcmdpbkxlZnQgPSAoaiAhPT0gYWN0aXZlSW5kZXggJiYgaiAhPT0gMCkgPyAnLScgKyBudW1iZXJUb1BpeGVscyhvdmVybGFwKSA6ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RhYnNbal0uZWxlbWVudC5zdHlsZS56SW5kZXggPSBudW1iZXJUb1BpeGVscyhpIC0gaik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFic1tqXS5lbGVtZW50LnN0eWxlLm1hcmdpbkxlZnQgPSBtYXJnaW5MZWZ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFzdFZpc2libGVUYWJJbmRleCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFiRWxlbWVudC5wYXJlbnRFbGVtZW50ICE9PSB0aGlzLl9lbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0YWJFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYk92ZXJsYXBBbGxvd2FuY2VFeGNlZWRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpID09PSBhY3RpdmVJbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0FjdGl2ZSB0YWIgc2hvdWxkIHNob3cgZXZlbiBpZiBhbGxvd2FuY2UgZXhjZWVkZWQuIChXZSBsZWZ0IHJvb20uKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJFbGVtZW50LnN0eWxlLnpJbmRleCA9ICdhdXRvJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFiRWxlbWVudC5zdHlsZS5tYXJnaW5MZWZ0ID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJFbGVtZW50LnBhcmVudEVsZW1lbnQgIT09IHRoaXMuX2VsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodGFiRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWJPdmVybGFwQWxsb3dhbmNlRXhjZWVkZWQgJiYgaSAhPT0gYWN0aXZlSW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRyb3Bkb3duQWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RhYiBtZW51IGFscmVhZHkgc2hvd24sIHNvIHdlIGp1c3QgYWRkIHRvIGl0LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiRWxlbWVudC5zdHlsZS56SW5kZXggPSAnYXV0byc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJFbGVtZW50LnN0eWxlLm1hcmdpbkxlZnQgPSAnJztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFiRWxlbWVudC5wYXJlbnRFbGVtZW50ICE9PSB0aGlzLl9kcm9wZG93bkVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kcm9wZG93bkVsZW1lbnQuYXBwZW5kQ2hpbGQodGFiRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1dlIG5vdyBrbm93IHRoZSB0YWIgbWVudSBtdXN0IGJlIHNob3duLCBzbyB3ZSBoYXZlIHRvIHJlY2FsY3VsYXRlIGV2ZXJ5dGhpbmcuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXN0VmlzaWJsZVRhYkluZGV4ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICB0YWJFbGVtZW50LnN0eWxlLnpJbmRleCA9ICdhdXRvJztcclxuICAgICAgICAgICAgICAgICAgICB0YWJFbGVtZW50LnN0eWxlLm1hcmdpbkxlZnQgPSAnJztcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGFiRWxlbWVudC5wYXJlbnRFbGVtZW50ICE9PSB0aGlzLl9lbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodGFiRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNob3dzIGRyb3AgZG93biBmb3IgYWRkaXRpb25hbCB0YWJzIHdoZW4gdGhlcmUgYXJlIHRvbyBtYW55IHRvIGRpc3BsYXkuXHJcbiAgICAgKi9cclxuICAgIHNob3dBZGRpdGlvbmFsVGFic0Ryb3Bkb3duKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2Ryb3Bkb3duRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIaWRlcyBkcm9wIGRvd24gZm9yIGFkZGl0aW9uYWwgdGFicyB3aGVuIHRoZXJlIGFyZSB0b28gbWFueSB0byBkaXNwbGF5LlxyXG4gICAgICovXHJcbiAgICBoaWRlQWRkaXRpb25hbFRhYnNEcm9wZG93bigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9kcm9wZG93bkVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZVRhYkNsb3NlRXZlbnQoY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSkge1xyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudFJlbW92ZUV2ZW50KGNvbXBvbmVudEl0ZW0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlVGFiRm9jdXNFdmVudChjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50Rm9jdXNFdmVudChjb21wb25lbnRJdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZVRhYkRyYWdTdGFydEV2ZW50KHg6IG51bWJlciwgeTogbnVtYmVyLCBkcmFnTGlzdGVuZXI6IERyYWdMaXN0ZW5lciwgY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSkge1xyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudERyYWdTdGFydEV2ZW50KHgsIHksIGRyYWdMaXN0ZW5lciwgY29tcG9uZW50SXRlbSk7XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgVGFic0NvbnRhaW5lciB7XHJcbiAgICBleHBvcnQgdHlwZSBDb21wb25lbnRJdGVtUmVtb3ZlRXZlbnQgPSAodGhpczogdm9pZCwgY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSkgPT4gdm9pZDtcclxuICAgIGV4cG9ydCB0eXBlIENvbXBvbmVudEl0ZW1Gb2N1c0V2ZW50ID0gKHRoaXM6IHZvaWQsIGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pID0+IHZvaWQ7XHJcbiAgICBleHBvcnQgdHlwZSBDb21wb25lbnRJdGVtRHJhZ1N0YXJ0RXZlbnQgPSAodGhpczogdm9pZCwgeDogbnVtYmVyLCB5OiBudW1iZXIsIGRyYWdMaXN0ZW5lcjogRHJhZ0xpc3RlbmVyLCBjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG4gICAgZXhwb3J0IHR5cGUgRHJvcGRvd25BY3RpdmVDaGFuZ2VkRXZlbnQgPSAodGhpczogdm9pZCkgPT4gdm9pZDtcclxufVxyXG4iLCJpbXBvcnQgeyBEb21Db25zdGFudHMgfSBmcm9tICcuLi91dGlscy9kb20tY29uc3RhbnRzJztcclxuaW1wb3J0IHsgUmVjdCB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcclxuXHJcbi8qKiBAaW50ZXJuYWwgQGRlcHJlY2F0ZWQgVG8gYmUgcmVtb3ZlZCAqL1xyXG5leHBvcnQgY2xhc3MgVHJhbnNpdGlvbkluZGljYXRvciB7XHJcbiAgICBwcml2YXRlIF9lbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgX3RvRWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsO1xyXG4gICAgcHJpdmF0ZSBfZnJvbURpbWVuc2lvbnM6IG51bGw7XHJcbiAgICBwcml2YXRlIF90b3RhbEFuaW1hdGlvbkR1cmF0aW9uOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIF9hbmltYXRpb25TdGFydFRpbWU6IG51bWJlciB8IG51bGw7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLlRyYW5zaXRpb25JbmRpY2F0b3IpO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5fZWxlbWVudCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3RvRWxlbWVudCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fZnJvbURpbWVuc2lvbnMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3RvdGFsQW5pbWF0aW9uRHVyYXRpb24gPSAyMDA7XHJcbiAgICAgICAgdGhpcy5fYW5pbWF0aW9uU3RhcnRUaW1lID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgdHJhbnNpdGlvbkVsZW1lbnRzKGZyb21FbGVtZW50OiBIVE1MRWxlbWVudCwgdG9FbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRPRE8gLSBUaGlzIGlzIG5vdCBxdWl0ZSBhcyBjb29sIGFzIGV4cGVjdGVkLiBSZXZpZXcuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIC8vIHRoaXMuX3RvRWxlbWVudCA9IHRvRWxlbWVudDtcclxuICAgICAgICAvLyB0aGlzLl9hbmltYXRpb25TdGFydFRpbWUgPSBub3coKTtcclxuICAgICAgICAvLyB0aGlzLl9mcm9tRGltZW5zaW9ucyA9IHRoaXMuX21lYXN1cmUoZnJvbUVsZW1lbnQpO1xyXG4gICAgICAgIC8vIHRoaXMuX2Zyb21EaW1lbnNpb25zLm9wYWNpdHkgPSAwLjg7XHJcbiAgICAgICAgLy8gdGhpcy5fZWxlbWVudC5zaG93KCkuY3NzKHRoaXMuX2Zyb21EaW1lbnNpb25zKTtcclxuICAgICAgICAvLyBhbmltRnJhbWUoZm5CaW5kKHRoaXMuX25leHRBbmltYXRpb25GcmFtZSwgdGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbmV4dEFuaW1hdGlvbkZyYW1lKCk6IHZvaWQge1xyXG4gICAgICAgIC8vIGlmICh0aGlzLl90b0VsZW1lbnQgPT09IG51bGwgfHwgdGhpcy5fZnJvbURpbWVuc2lvbnMgPT09IG51bGwgfHwgdGhpcy5fYW5pbWF0aW9uU3RhcnRUaW1lID09PSBudWxsKSB7XHJcbiAgICAgICAgLy8gICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdUSU5BRlREOTcxMTUnKTtcclxuICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgIC8vICAgICBjb25zdCB0b0RpbWVuc2lvbnMgPSB0aGlzLm1lYXN1cmUodGhpcy5fdG9FbGVtZW50KTtcclxuICAgICAgICAvLyAgICAgY29uc3QgYW5pbWF0aW9uUHJvZ3Jlc3MgPSAobm93KCkgLSB0aGlzLl9hbmltYXRpb25TdGFydFRpbWUpIC8gdGhpcy5fdG90YWxBbmltYXRpb25EdXJhdGlvbjtcclxuICAgICAgICAvLyAgICAgY29uc3QgY3VycmVudEZyYW1lU3R5bGVzID0ge307XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IGNzc1Byb3BlcnR5O1xyXG5cclxuICAgICAgICAvLyAgICAgaWYgKGFuaW1hdGlvblByb2dyZXNzID49IDEpIHtcclxuICAgICAgICAvLyAgICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAvLyAgICAgICAgIHJldHVybjtcclxuICAgICAgICAvLyAgICAgfVxyXG5cclxuICAgICAgICAvLyAgICAgdG9EaW1lbnNpb25zLm9wYWNpdHkgPSAwO1xyXG5cclxuICAgICAgICAvLyAgICAgZm9yIChjb25zdCBjc3NQcm9wZXJ0eSBpbiB0aGlzLl9mcm9tRGltZW5zaW9ucykge1xyXG4gICAgICAgIC8vICAgICAgICAgY3VycmVudEZyYW1lU3R5bGVzW2Nzc1Byb3BlcnR5XSA9IHRoaXMuX2Zyb21EaW1lbnNpb25zW2Nzc1Byb3BlcnR5XSArXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgKHRvRGltZW5zaW9uc1tjc3NQcm9wZXJ0eV0gLSB0aGlzLl9mcm9tRGltZW5zaW9uc1tjc3NQcm9wZXJ0eV0pICpcclxuICAgICAgICAvLyAgICAgICAgICAgICBhbmltYXRpb25Qcm9ncmVzcztcclxuICAgICAgICAvLyAgICAgfVxyXG5cclxuICAgICAgICAvLyAgICAgdGhpcy5fZWxlbWVudC5jc3MoY3VycmVudEZyYW1lU3R5bGVzKTtcclxuICAgICAgICAvLyAgICAgYW5pbUZyYW1lKGZuQmluZCh0aGlzLl9uZXh0QW5pbWF0aW9uRnJhbWUsIHRoaXMpKTtcclxuICAgICAgICAvLyB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBtZWFzdXJlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogUmVjdCB7XHJcbiAgICAgICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGxlZnQ6IHJlY3QubGVmdCxcclxuICAgICAgICAgICAgdG9wOiByZWN0LnRvcCxcclxuICAgICAgICAgICAgd2lkdGg6IGVsZW1lbnQub2Zmc2V0V2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodDogZWxlbWVudC5vZmZzZXRIZWlnaHQsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG4iLCIvKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRXh0ZXJuYWxFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgY2xhc3MgQ29uZmlndXJhdGlvbkVycm9yIGV4dGVuZHMgRXh0ZXJuYWxFcnJvciB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHB1YmxpYyByZWFkb25seSBub2RlPzogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoJ0NvbmZpZ3VyYXRpb24nLCBtZXNzYWdlKTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGNsYXNzIFBvcG91dEJsb2NrZWRFcnJvciBleHRlbmRzIEV4dGVybmFsRXJyb3Ige1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoJ1BvcG91dEJsb2NrZWQnLCBtZXNzYWdlKTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGNsYXNzIEFwaUVycm9yIGV4dGVuZHMgRXh0ZXJuYWxFcnJvciB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcignQVBJJywgbWVzc2FnZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBjbGFzcyBCaW5kRXJyb3IgZXh0ZW5kcyBFeHRlcm5hbEVycm9yIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKCdCaW5kJywgbWVzc2FnZSk7XHJcbiAgICB9XHJcbn1cclxuIiwiLyoqIEBpbnRlcm5hbCAqL1xyXG5hYnN0cmFjdCBjbGFzcyBJbnRlcm5hbEVycm9yIGV4dGVuZHMgRXJyb3Ige1xyXG4gICAgY29uc3RydWN0b3IodHlwZTogc3RyaW5nLCBjb2RlOiBzdHJpbmcsIG1lc3NhZ2U/OiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcihgJHt0eXBlfTogJHtjb2RlfSR7bWVzc2FnZSA9PT0gdW5kZWZpbmVkID8gJycgOiAnOiAnICsgbWVzc2FnZX1gKVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBjbGFzcyBBc3NlcnRFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xyXG4gICAgY29uc3RydWN0b3IoY29kZTogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoJ0Fzc2VydCcsIGNvZGUsIG1lc3NhZ2UpXHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGNsYXNzIFVucmVhY2hhYmxlQ2FzZUVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3Rvcihjb2RlOiBzdHJpbmcsIHZhcmlhYmxlVmFsdWU6IG5ldmVyLCBtZXNzYWdlPzogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoJ1VucmVhY2hhYmxlQ2FzZScsIGNvZGUsIGAke3ZhcmlhYmxlVmFsdWV9JHttZXNzYWdlID09PSB1bmRlZmluZWQgPyAnJyA6ICc6ICcgKyBtZXNzYWdlfWApXHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGNsYXNzIFVuZXhwZWN0ZWROdWxsRXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKGNvZGU6IHN0cmluZywgbWVzc2FnZT86IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKCdVbmV4cGVjdGVkTnVsbCcsIGNvZGUsIG1lc3NhZ2UpXHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGNsYXNzIFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xyXG4gICAgY29uc3RydWN0b3IoY29kZTogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoJ1VuZXhwZWN0ZWRVbmRlZmluZWQnLCBjb2RlLCBtZXNzYWdlKVxyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IExheW91dENvbmZpZyB9IGZyb20gJy4vY29uZmlnL2NvbmZpZyc7XHJcbmltcG9ydCB7IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyB9IGZyb20gJy4vY29uZmlnL3Jlc29sdmVkLWNvbmZpZyc7XHJcbmltcG9ydCB7IENvbXBvbmVudENvbnRhaW5lciB9IGZyb20gJy4vY29udGFpbmVyL2NvbXBvbmVudC1jb250YWluZXInO1xyXG5pbXBvcnQgeyBBcGlFcnJvciwgQmluZEVycm9yIH0gZnJvbSAnLi9lcnJvcnMvZXh0ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBBc3NlcnRFcnJvciwgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yIH0gZnJvbSAnLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBJMThuU3RyaW5nSWQsIGkxOG5TdHJpbmdzIH0gZnJvbSAnLi91dGlscy9pMThuLXN0cmluZ3MnO1xyXG5pbXBvcnQgeyBKc29uVmFsdWUsIExvZ2ljYWxaSW5kZXggfSBmcm9tICcuL3V0aWxzL3R5cGVzJztcclxuaW1wb3J0IHsgZGVlcEV4dGVuZFZhbHVlLCBlbnN1cmVFbGVtZW50UG9zaXRpb25BYnNvbHV0ZSwgbnVtYmVyVG9QaXhlbHMsIHNldEVsZW1lbnREaXNwbGF5VmlzaWJpbGl0eSwgc2V0RWxlbWVudEhlaWdodCwgc2V0RWxlbWVudFdpZHRoIH0gZnJvbSAnLi91dGlscy91dGlscyc7XHJcbmltcG9ydCB7IFZpcnR1YWxMYXlvdXQgfSBmcm9tICcuL3ZpcnR1YWwtbGF5b3V0JztcclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBjbGFzcyBHb2xkZW5MYXlvdXQgZXh0ZW5kcyBWaXJ0dWFsTGF5b3V0IHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2NvbXBvbmVudFR5cGVzTWFwID0gbmV3IE1hcDxzdHJpbmcsIEdvbGRlbkxheW91dC5Db21wb25lbnRJbnN0YW50aWF0b3I+KCk7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9nZXRDb21wb25lbnRDb25zdHJ1Y3RvckZ0bjogR29sZGVuTGF5b3V0LkdldENvbXBvbmVudENvbnN0cnVjdG9yQ2FsbGJhY2s7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfcmVnaXN0ZXJlZENvbXBvbmVudE1hcCA9IG5ldyBNYXA8Q29tcG9uZW50Q29udGFpbmVyLCBDb21wb25lbnRDb250YWluZXIuQ29tcG9uZW50PigpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfdmlydHVhYmxlQ29tcG9uZW50TWFwID0gbmV3IE1hcDxDb21wb25lbnRDb250YWluZXIsIEdvbGRlbkxheW91dC5WaXJ0dWFibGVDb21wb25lbnQ+KCk7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9nb2xkZW5MYXlvdXRCb3VuZGluZ0NsaWVudFJlY3Q6IERPTVJlY3Q7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfY29udGFpbmVyVmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50TGlzdGVuZXIgPVxyXG4gICAgICAgIChjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpID0+IHRoaXMuaGFuZGxlQ29udGFpbmVyVmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50KGNvbnRhaW5lciwgd2lkdGgsIGhlaWdodCk7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9jb250YWluZXJWaXJ0dWFsVmlzaWJpbGl0eUNoYW5nZVJlcXVpcmVkRXZlbnRMaXN0ZW5lciA9XHJcbiAgICAgICAgKGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCB2aXNpYmxlOiBib29sZWFuKSA9PiB0aGlzLmhhbmRsZUNvbnRhaW5lclZpcnR1YWxWaXNpYmlsaXR5Q2hhbmdlUmVxdWlyZWRFdmVudChjb250YWluZXIsIHZpc2libGUpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfY29udGFpbmVyVmlydHVhbFpJbmRleENoYW5nZVJlcXVpcmVkRXZlbnRMaXN0ZW5lciA9XHJcbiAgICAgICAgKGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCBsb2dpY2FsWkluZGV4OiBMb2dpY2FsWkluZGV4LCBkZWZhdWx0WkluZGV4OiBzdHJpbmcpID0+XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQ29udGFpbmVyVmlydHVhbFpJbmRleENoYW5nZVJlcXVpcmVkRXZlbnQoY29udGFpbmVyLCBsb2dpY2FsWkluZGV4LCBkZWZhdWx0WkluZGV4KTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSBjb250YWluZXIgLSBBIERvbSBIVE1MIGVsZW1lbnQuIERlZmF1bHRzIHRvIGJvZHlcclxuICAgICAqIEBwYXJhbSBiaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyIC0gRXZlbnQgaGFuZGxlciB0byBiaW5kIGNvbXBvbmVudHNcclxuICAgICAqIEBwYXJhbSBiaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyIC0gRXZlbnQgaGFuZGxlciB0byB1bmJpbmQgY29tcG9uZW50c1xyXG4gICAgICogSWYgYmluZENvbXBvbmVudEV2ZW50SGFuZGxlciBpcyBkZWZpbmVkLCB0aGVuIGNvbnN0cnVjdG9yIHdpbGwgYmUgZGV0ZXJtaW5hdGUuIEl0IHdpbGwgYWx3YXlzIGNhbGwgdGhlIGluaXQoKVxyXG4gICAgICogZnVuY3Rpb24gYW5kIHRoZSBpbml0KCkgZnVuY3Rpb24gd2lsbCBhbHdheXMgY29tcGxldGUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgYmluZENvbXBvbmVudEV2ZW50SGFuZGxlciB3aWxsIGJlIGNhbGxlZFxyXG4gICAgICogaWYgY29uc3RydWN0b3IgaXMgZm9yIGEgcG9wb3V0IHdpbmRvdy4gTWFrZSBzdXJlIGJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgaXMgcmVhZHkgZm9yIGV2ZW50cy5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgY29udGFpbmVyPzogSFRNTEVsZW1lbnQsXHJcbiAgICAgICAgYmluZENvbXBvbmVudEV2ZW50SGFuZGxlcj86IFZpcnR1YWxMYXlvdXQuQmluZENvbXBvbmVudEV2ZW50SGFuZGxlcixcclxuICAgICAgICB1bmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXI/OiBWaXJ0dWFsTGF5b3V0LlVuYmluZENvbXBvbmVudEV2ZW50SGFuZGxlcixcclxuICAgICk7XHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgc3BlY2lmeSBsYXlvdXRDb25maWcgaW4ge0BsaW5rIChMYXlvdXRNYW5hZ2VyOmNsYXNzKS5sb2FkTGF5b3V0fSAqL1xyXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBMYXlvdXRDb25maWcsIGNvbnRhaW5lcj86IEhUTUxFbGVtZW50KTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZ09yT3B0aW9uYWxDb250YWluZXI6IExheW91dENvbmZpZyB8IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIGNvbnRhaW5lck9yQmluZENvbXBvbmVudEV2ZW50SGFuZGxlcj86IEhUTUxFbGVtZW50IHwgVmlydHVhbExheW91dC5CaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyLFxyXG4gICAgICAgIHVuYmluZENvbXBvbmVudEV2ZW50SGFuZGxlcj86IFZpcnR1YWxMYXlvdXQuVW5iaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyLFxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoY29uZmlnT3JPcHRpb25hbENvbnRhaW5lciwgY29udGFpbmVyT3JCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyLCB1bmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIsIHRydWUpO1xyXG4gICAgICAgIC8vIHdlIHRvbGQgVmlydHVhbExheW91dCB0byBub3QgY2FsbCBpbml0KCkgKHNraXBJbml0IHNldCB0byB0cnVlKSBzbyB0aGF0IEdvbGRlbiBMYXlvdXQgY2FuIGluaXRpYWxpc2UgaXRzIHByb3BlcnRpZXMgYmVmb3JlIGluaXQgaXMgY2FsbGVkXHJcbiAgICAgICAgaWYgKCF0aGlzLmRlcHJlY2F0ZWRDb25zdHJ1Y3Rvcikge1xyXG4gICAgICAgICAgICB0aGlzLmluaXQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWdpc3RlciBhIG5ldyBjb21wb25lbnQgdHlwZSB3aXRoIHRoZSBsYXlvdXQgbWFuYWdlci5cclxuICAgICAqXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBTZWUge0BsaW5rIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQwOTIyNTMxL2hvdy10by1jaGVjay1pZi1hLWphdmFzY3JpcHQtZnVuY3Rpb24taXMtYS1jb25zdHJ1Y3Rvcn1cclxuICAgICAqIGluc3RlYWQgdXNlIHtAbGluayAoR29sZGVuTGF5b3V0OmNsYXNzKS5yZWdpc3RlckNvbXBvbmVudENvbnN0cnVjdG9yfVxyXG4gICAgICogb3Ige0BsaW5rIChHb2xkZW5MYXlvdXQ6Y2xhc3MpLnJlZ2lzdGVyQ29tcG9uZW50RmFjdG9yeUZ1bmN0aW9ufVxyXG4gICAgICovXHJcbiAgICByZWdpc3RlckNvbXBvbmVudChuYW1lOiBzdHJpbmcsXHJcbiAgICAgICAgY29tcG9uZW50Q29uc3RydWN0b3JPckZhY3RvcnlGdG46IEdvbGRlbkxheW91dC5Db21wb25lbnRDb25zdHJ1Y3RvciB8IEdvbGRlbkxheW91dC5Db21wb25lbnRGYWN0b3J5RnVuY3Rpb24sXHJcbiAgICAgICAgdmlydHVhbCA9IGZhbHNlXHJcbiAgICApOiB2b2lkIHtcclxuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudENvbnN0cnVjdG9yT3JGYWN0b3J5RnRuICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBBcGlFcnJvcigncmVnaXN0ZXJDb21wb25lbnQoKSBjb21wb25lbnRDb25zdHJ1Y3Rvck9yRmFjdG9yeUZ0biBwYXJhbWV0ZXIgaXMgbm90IGEgZnVuY3Rpb24nKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChjb21wb25lbnRDb25zdHJ1Y3Rvck9yRmFjdG9yeUZ0bi5oYXNPd25Qcm9wZXJ0eSgncHJvdG90eXBlJykpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudENvbnN0cnVjdG9yID0gY29tcG9uZW50Q29uc3RydWN0b3JPckZhY3RvcnlGdG4gYXMgR29sZGVuTGF5b3V0LkNvbXBvbmVudENvbnN0cnVjdG9yO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWdpc3RlckNvbXBvbmVudENvbnN0cnVjdG9yKG5hbWUsIGNvbXBvbmVudENvbnN0cnVjdG9yLCB2aXJ0dWFsKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEZhY3RvcnlGdG4gPSBjb21wb25lbnRDb25zdHJ1Y3Rvck9yRmFjdG9yeUZ0biBhcyBHb2xkZW5MYXlvdXQuQ29tcG9uZW50RmFjdG9yeUZ1bmN0aW9uO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWdpc3RlckNvbXBvbmVudEZhY3RvcnlGdW5jdGlvbihuYW1lLCBjb21wb25lbnRGYWN0b3J5RnRuLCB2aXJ0dWFsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVyIGEgbmV3IGNvbXBvbmVudCB0eXBlIHdpdGggdGhlIGxheW91dCBtYW5hZ2VyLlxyXG4gICAgICovXHJcbiAgICByZWdpc3RlckNvbXBvbmVudENvbnN0cnVjdG9yKHR5cGVOYW1lOiBzdHJpbmcsIGNvbXBvbmVudENvbnN0cnVjdG9yOiBHb2xkZW5MYXlvdXQuQ29tcG9uZW50Q29uc3RydWN0b3IsIHZpcnR1YWwgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50Q29uc3RydWN0b3IgIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGkxOG5TdHJpbmdzW0kxOG5TdHJpbmdJZC5QbGVhc2VSZWdpc3RlckFDb25zdHJ1Y3RvckZ1bmN0aW9uXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBleGlzdGluZ0NvbXBvbmVudFR5cGUgPSB0aGlzLl9jb21wb25lbnRUeXBlc01hcC5nZXQodHlwZU5hbWUpO1xyXG5cclxuICAgICAgICBpZiAoZXhpc3RpbmdDb21wb25lbnRUeXBlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEJpbmRFcnJvcihgJHtpMThuU3RyaW5nc1tJMThuU3RyaW5nSWQuQ29tcG9uZW50SXNBbHJlYWR5UmVnaXN0ZXJlZF19OiAke3R5cGVOYW1lfWApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50VHlwZXNNYXAuc2V0KHR5cGVOYW1lLCB7XHJcbiAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogY29tcG9uZW50Q29uc3RydWN0b3IsXHJcbiAgICAgICAgICAgICAgICBmYWN0b3J5RnVuY3Rpb246IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIHZpcnR1YWwsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0ZXIgYSBuZXcgY29tcG9uZW50IHdpdGggdGhlIGxheW91dCBtYW5hZ2VyLlxyXG4gICAgICovXHJcbiAgICByZWdpc3RlckNvbXBvbmVudEZhY3RvcnlGdW5jdGlvbih0eXBlTmFtZTogc3RyaW5nLCBjb21wb25lbnRGYWN0b3J5RnVuY3Rpb246IEdvbGRlbkxheW91dC5Db21wb25lbnRGYWN0b3J5RnVuY3Rpb24sIHZpcnR1YWwgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50RmFjdG9yeUZ1bmN0aW9uICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBCaW5kRXJyb3IoJ1BsZWFzZSByZWdpc3RlciBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBleGlzdGluZ0NvbXBvbmVudFR5cGUgPSB0aGlzLl9jb21wb25lbnRUeXBlc01hcC5nZXQodHlwZU5hbWUpO1xyXG5cclxuICAgICAgICBpZiAoZXhpc3RpbmdDb21wb25lbnRUeXBlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEJpbmRFcnJvcihgJHtpMThuU3RyaW5nc1tJMThuU3RyaW5nSWQuQ29tcG9uZW50SXNBbHJlYWR5UmVnaXN0ZXJlZF19OiAke3R5cGVOYW1lfWApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50VHlwZXNNYXAuc2V0KHR5cGVOYW1lLCB7XHJcbiAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgZmFjdG9yeUZ1bmN0aW9uOiBjb21wb25lbnRGYWN0b3J5RnVuY3Rpb24sXHJcbiAgICAgICAgICAgICAgICB2aXJ0dWFsLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVyIGEgY29tcG9uZW50IGZ1bmN0aW9uIHdpdGggdGhlIGxheW91dCBtYW5hZ2VyLiBUaGlzIGZ1bmN0aW9uIHNob3VsZFxyXG4gICAgICogcmV0dXJuIGEgY29uc3RydWN0b3IgZm9yIGEgY29tcG9uZW50IGJhc2VkIG9uIGEgY29uZmlnLlxyXG4gICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBpZiBhIGNvbXBvbmVudCB0eXBlIHdpdGggdGhlIHJlcXVpcmVkIG5hbWUgaXMgbm90IGFscmVhZHkgcmVnaXN0ZXJlZC5cclxuICAgICAqIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgYXBwbGljYXRpb25zIHVzZSB0aGUge0BsaW5rIChWaXJ0dWFsTGF5b3V0OmNsYXNzKS5nZXRDb21wb25lbnRFdmVudH0gYW5kXHJcbiAgICAgKiB7QGxpbmsgKFZpcnR1YWxMYXlvdXQ6Y2xhc3MpLnJlbGVhc2VDb21wb25lbnRFdmVudH0gaW5zdGVhZCBvZiByZWdpc3RlcmluZyBhIGNvbnN0cnVjdG9yIGNhbGxiYWNrXHJcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChHb2xkZW5MYXlvdXQ6Y2xhc3MpLnJlZ2lzdGVyR2V0Q29tcG9uZW50Q29uc3RydWN0b3JDYWxsYmFja31cclxuICAgICAqL1xyXG4gICAgcmVnaXN0ZXJDb21wb25lbnRGdW5jdGlvbihjYWxsYmFjazogR29sZGVuTGF5b3V0LkdldENvbXBvbmVudENvbnN0cnVjdG9yQ2FsbGJhY2spOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJlZ2lzdGVyR2V0Q29tcG9uZW50Q29uc3RydWN0b3JDYWxsYmFjayhjYWxsYmFjayk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWdpc3RlciBhIGNhbGxiYWNrIGNsb3N1cmUgd2l0aCB0aGUgbGF5b3V0IG1hbmFnZXIgd2hpY2ggc3VwcGxpZXMgYSBDb21wb25lbnQgQ29uc3RydWN0b3IuXHJcbiAgICAgKiBUaGlzIGNhbGxiYWNrIHNob3VsZCByZXR1cm4gYSBjb25zdHJ1Y3RvciBmb3IgYSBjb21wb25lbnQgYmFzZWQgb24gYSBjb25maWcuXHJcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGlmIGEgY29tcG9uZW50IHR5cGUgd2l0aCB0aGUgcmVxdWlyZWQgbmFtZSBpcyBub3QgYWxyZWFkeSByZWdpc3RlcmVkLlxyXG4gICAgICogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBhcHBsaWNhdGlvbnMgdXNlIHRoZSB7QGxpbmsgKFZpcnR1YWxMYXlvdXQ6Y2xhc3MpLmdldENvbXBvbmVudEV2ZW50fSBhbmRcclxuICAgICAqIHtAbGluayAoVmlydHVhbExheW91dDpjbGFzcykucmVsZWFzZUNvbXBvbmVudEV2ZW50fSBpbnN0ZWFkIG9mIHJlZ2lzdGVyaW5nIGEgY29uc3RydWN0b3IgY2FsbGJhY2tcclxuICAgICAqL1xyXG4gICAgcmVnaXN0ZXJHZXRDb21wb25lbnRDb25zdHJ1Y3RvckNhbGxiYWNrKGNhbGxiYWNrOiBHb2xkZW5MYXlvdXQuR2V0Q29tcG9uZW50Q29uc3RydWN0b3JDYWxsYmFjayk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgcmVnaXN0ZXIgYSBjYWxsYmFjayBmdW5jdGlvbicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2dldENvbXBvbmVudENvbnN0cnVjdG9yRnRuICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdNdWx0aXBsZSBjb21wb25lbnQgZnVuY3Rpb25zIGFyZSBiZWluZyByZWdpc3RlcmVkLiAgT25seSB0aGUgZmluYWwgcmVnaXN0ZXJlZCBmdW5jdGlvbiB3aWxsIGJlIHVzZWQuJylcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2dldENvbXBvbmVudENvbnN0cnVjdG9yRnRuID0gY2FsbGJhY2s7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UmVnaXN0ZXJlZENvbXBvbmVudFR5cGVOYW1lcygpOiBzdHJpbmdbXSB7XHJcbiAgICAgICAgY29uc3QgdHlwZU5hbWVzSXRlcmFibGVJdGVyYXRvciA9IHRoaXMuX2NvbXBvbmVudFR5cGVzTWFwLmtleXMoKTtcclxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0eXBlTmFtZXNJdGVyYWJsZUl0ZXJhdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgY29tcG9uZW50IGluc3RhbnRpYXRvci4gIEF0dGVtcHRzIHRvIHV0aWxpemUgcmVnaXN0ZXJlZFxyXG4gICAgICogY29tcG9uZW50IHR5cGUgYnkgZmlyc3QsIHRoZW4gZmFsbHMgYmFjayB0byB0aGUgY29tcG9uZW50IGNvbnN0cnVjdG9yIGNhbGxiYWNrIGZ1bmN0aW9uIChpZiByZWdpc3RlcmVkKS5cclxuICAgICAqIElmIG5laXRoZXIgZ2V0cyBhbiBpbnN0YW50aWF0b3IsIHRoZW4gcmV0dXJucyBgdW5kZWZpbmVkYC5cclxuICAgICAqIE5vdGUgdGhhdCBgdW5kZWZpbmVkYCB3aWxsIHJldHVybiBpZiBjb25maWcuY29tcG9uZW50VHlwZSBpcyBub3QgYSBzdHJpbmdcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gY29uZmlnIC0gVGhlIGl0ZW0gY29uZmlnXHJcbiAgICAgKiBAcHVibGljXHJcbiAgICAgKi9cclxuICAgIGdldENvbXBvbmVudEluc3RhbnRpYXRvcihjb25maWc6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyk6IEdvbGRlbkxheW91dC5Db21wb25lbnRJbnN0YW50aWF0b3IgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGxldCBpbnN0YW50aWF0b3I6IEdvbGRlbkxheW91dC5Db21wb25lbnRJbnN0YW50aWF0b3IgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIGNvbnN0IHR5cGVOYW1lID0gUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnLnJlc29sdmVDb21wb25lbnRUeXBlTmFtZShjb25maWcpXHJcbiAgICAgICAgaWYgKHR5cGVOYW1lICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaW5zdGFudGlhdG9yID0gdGhpcy5fY29tcG9uZW50VHlwZXNNYXAuZ2V0KHR5cGVOYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGluc3RhbnRpYXRvciA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9nZXRDb21wb25lbnRDb25zdHJ1Y3RvckZ0biAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpbnN0YW50aWF0b3IgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3I6IHRoaXMuX2dldENvbXBvbmVudENvbnN0cnVjdG9yRnRuKGNvbmZpZyksXHJcbiAgICAgICAgICAgICAgICAgICAgZmFjdG9yeUZ1bmN0aW9uOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdmlydHVhbDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBpbnN0YW50aWF0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgYmluZENvbXBvbmVudChjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgaXRlbUNvbmZpZzogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnKTogQ29tcG9uZW50Q29udGFpbmVyLkJpbmRhYmxlQ29tcG9uZW50IHtcclxuICAgICAgICBsZXQgaW5zdGFudGlhdG9yOiBHb2xkZW5MYXlvdXQuQ29tcG9uZW50SW5zdGFudGlhdG9yIHwgdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICBjb25zdCB0eXBlTmFtZSA9IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZy5yZXNvbHZlQ29tcG9uZW50VHlwZU5hbWUoaXRlbUNvbmZpZyk7XHJcbiAgICAgICAgaWYgKHR5cGVOYW1lICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaW5zdGFudGlhdG9yID0gdGhpcy5fY29tcG9uZW50VHlwZXNNYXAuZ2V0KHR5cGVOYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGluc3RhbnRpYXRvciA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9nZXRDb21wb25lbnRDb25zdHJ1Y3RvckZ0biAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpbnN0YW50aWF0b3IgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3I6IHRoaXMuX2dldENvbXBvbmVudENvbnN0cnVjdG9yRnRuKGl0ZW1Db25maWcpLFxyXG4gICAgICAgICAgICAgICAgICAgIGZhY3RvcnlGdW5jdGlvbjogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIHZpcnR1YWw6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgcmVzdWx0OiBDb21wb25lbnRDb250YWluZXIuQmluZGFibGVDb21wb25lbnQ7XHJcbiAgICAgICAgaWYgKGluc3RhbnRpYXRvciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZpcnR1YWwgPSBpbnN0YW50aWF0b3IudmlydHVhbDtcclxuICAgICAgICAgICAgLy8gaGFuZGxlIGNhc2Ugd2hlcmUgY29tcG9uZW50IGlzIG9idGFpbmVkIGJ5IG5hbWUgb3IgY29tcG9uZW50IGNvbnN0cnVjdG9yIGNhbGxiYWNrXHJcbiAgICAgICAgICAgIGxldCBjb21wb25lbnRTdGF0ZTogSnNvblZhbHVlIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBpZiAoaXRlbUNvbmZpZy5jb21wb25lbnRTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnRTdGF0ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIG1ha2UgY29weVxyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50U3RhdGUgPSBkZWVwRXh0ZW5kVmFsdWUoe30sIGl0ZW1Db25maWcuY29tcG9uZW50U3RhdGUpIGFzIEpzb25WYWx1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGNvbXBvbmVudDogQ29tcG9uZW50Q29udGFpbmVyLkNvbXBvbmVudCB8IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50Q29uc3RydWN0b3IgPSBpbnN0YW50aWF0b3IuY29uc3RydWN0b3I7XHJcbiAgICAgICAgICAgIGlmIChjb21wb25lbnRDb25zdHJ1Y3RvciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBuZXcgY29tcG9uZW50Q29uc3RydWN0b3IoY29udGFpbmVyLCBjb21wb25lbnRTdGF0ZSwgdmlydHVhbCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmYWN0b3J5RnVuY3Rpb24gPSBpbnN0YW50aWF0b3IuZmFjdG9yeUZ1bmN0aW9uO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZhY3RvcnlGdW5jdGlvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50ID0gZmFjdG9yeUZ1bmN0aW9uKGNvbnRhaW5lciwgY29tcG9uZW50U3RhdGUsIHZpcnR1YWwpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNQkNGRlUxMDAwOCcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodmlydHVhbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignR0xCQ1ZDVTk4ODc3NCcpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2aXJ0dWFibGVDb21wb25lbnQgPSBjb21wb25lbnQgYXMgR29sZGVuTGF5b3V0LlZpcnR1YWJsZUNvbXBvbmVudDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRSb290RWxlbWVudCA9IHZpcnR1YWJsZUNvbXBvbmVudC5yb290SHRtbEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFJvb3RFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJpbmRFcnJvcihgJHtpMThuU3RyaW5nc1tJMThuU3RyaW5nSWQuVmlydHVhbENvbXBvbmVudERvZXNOb3RIYXZlUm9vdEh0bWxFbGVtZW50XX06ICR7dHlwZU5hbWV9YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5zdXJlRWxlbWVudFBvc2l0aW9uQWJzb2x1dGUoY29tcG9uZW50Um9vdEVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChjb21wb25lbnRSb290RWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZpcnR1YWJsZUNvbXBvbmVudE1hcC5zZXQoY29udGFpbmVyLCB2aXJ0dWFibGVDb21wb25lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIudmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50ID0gdGhpcy5fY29udGFpbmVyVmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50TGlzdGVuZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci52aXJ0dWFsVmlzaWJpbGl0eUNoYW5nZVJlcXVpcmVkRXZlbnQgPSB0aGlzLl9jb250YWluZXJWaXJ0dWFsVmlzaWJpbGl0eUNoYW5nZVJlcXVpcmVkRXZlbnRMaXN0ZW5lcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLnZpcnR1YWxaSW5kZXhDaGFuZ2VSZXF1aXJlZEV2ZW50ID0gdGhpcy5fY29udGFpbmVyVmlydHVhbFpJbmRleENoYW5nZVJlcXVpcmVkRXZlbnRMaXN0ZW5lcjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyZWRDb21wb25lbnRNYXAuc2V0KGNvbnRhaW5lciwgY29tcG9uZW50KTtcclxuXHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHtcclxuICAgICAgICAgICAgICAgIHZpcnR1YWw6IGluc3RhbnRpYXRvci52aXJ0dWFsLFxyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50LFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBVc2UgZ2V0Q29tcG9uZW50RXZlbnRcclxuICAgICAgICAgICAgcmVzdWx0ID0gc3VwZXIuYmluZENvbXBvbmVudChjb250YWluZXIsIGl0ZW1Db25maWcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBvdmVycmlkZSB1bmJpbmRDb21wb25lbnQoY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIsIHZpcnR1YWw6IGJvb2xlYW4sIGNvbXBvbmVudDogQ29tcG9uZW50Q29udGFpbmVyLkNvbXBvbmVudCB8IHVuZGVmaW5lZCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHJlZ2lzdGVyZWRDb21wb25lbnQgPSB0aGlzLl9yZWdpc3RlcmVkQ29tcG9uZW50TWFwLmdldChjb250YWluZXIpO1xyXG4gICAgICAgIGlmIChyZWdpc3RlcmVkQ29tcG9uZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgc3VwZXIudW5iaW5kQ29tcG9uZW50KGNvbnRhaW5lciwgdmlydHVhbCwgY29tcG9uZW50KTsgLy8gd2FzIG5vdCBjcmVhdGVkIGZyb20gcmVnaXN0cmF0aW9uIHNvIHVzZSB2aXJ0dWFsIHVuYmluZCBldmVudHNcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCB2aXJ0dWFibGVDb21wb25lbnQgPSB0aGlzLl92aXJ0dWFibGVDb21wb25lbnRNYXAuZ2V0KGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIGlmICh2aXJ0dWFibGVDb21wb25lbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50Um9vdEVsZW1lbnQgPSB2aXJ0dWFibGVDb21wb25lbnQucm9vdEh0bWxFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFJvb3RFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0dMVUM3Nzc0MycsIGNvbnRhaW5lci50aXRsZSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUNoaWxkKGNvbXBvbmVudFJvb3RFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl92aXJ0dWFibGVDb21wb25lbnRNYXAuZGVsZXRlKGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb3ZlcnJpZGUgZmlyZUJlZm9yZVZpcnR1YWxSZWN0aW5nRXZlbnQoY291bnQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2dvbGRlbkxheW91dEJvdW5kaW5nQ2xpZW50UmVjdCA9IHRoaXMuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIHN1cGVyLmZpcmVCZWZvcmVWaXJ0dWFsUmVjdGluZ0V2ZW50KGNvdW50KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVDb250YWluZXJWaXJ0dWFsUmVjdGluZ1JlcXVpcmVkRXZlbnQoY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdmlydHVhYmxlQ29tcG9uZW50ID0gdGhpcy5fdmlydHVhYmxlQ29tcG9uZW50TWFwLmdldChjb250YWluZXIpO1xyXG4gICAgICAgIGlmICh2aXJ0dWFibGVDb21wb25lbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdHTEhDU0NFNTU5MzMnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCByb290RWxlbWVudCA9IHZpcnR1YWJsZUNvbXBvbmVudC5yb290SHRtbEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGlmIChyb290RWxlbWVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmluZEVycm9yKGkxOG5TdHJpbmdzW0kxOG5TdHJpbmdJZC5Db21wb25lbnRJc05vdFZpcnR1YWJsZV0gKyAnICcgKyBjb250YWluZXIudGl0bGUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyQm91bmRpbmdDbGllbnRSZWN0ID0gY29udGFpbmVyLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsZWZ0ID0gY29udGFpbmVyQm91bmRpbmdDbGllbnRSZWN0LmxlZnQgLSB0aGlzLl9nb2xkZW5MYXlvdXRCb3VuZGluZ0NsaWVudFJlY3QubGVmdDtcclxuICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50LnN0eWxlLmxlZnQgPSBudW1iZXJUb1BpeGVscyhsZWZ0KTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRvcCA9IGNvbnRhaW5lckJvdW5kaW5nQ2xpZW50UmVjdC50b3AgLSB0aGlzLl9nb2xkZW5MYXlvdXRCb3VuZGluZ0NsaWVudFJlY3QudG9wO1xyXG4gICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQuc3R5bGUudG9wID0gbnVtYmVyVG9QaXhlbHModG9wKTtcclxuICAgICAgICAgICAgICAgIHNldEVsZW1lbnRXaWR0aChyb290RWxlbWVudCwgd2lkdGgpO1xyXG4gICAgICAgICAgICAgICAgc2V0RWxlbWVudEhlaWdodChyb290RWxlbWVudCwgaGVpZ2h0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZUNvbnRhaW5lclZpcnR1YWxWaXNpYmlsaXR5Q2hhbmdlUmVxdWlyZWRFdmVudChjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgdmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHZpcnR1YWJsZUNvbXBvbmVudCA9IHRoaXMuX3ZpcnR1YWJsZUNvbXBvbmVudE1hcC5nZXQoY29udGFpbmVyKTtcclxuICAgICAgICBpZiAodmlydHVhYmxlQ29tcG9uZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignR0xIQ1ZWQ1JFNTU5MzQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCByb290RWxlbWVudCA9IHZpcnR1YWJsZUNvbXBvbmVudC5yb290SHRtbEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGlmIChyb290RWxlbWVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmluZEVycm9yKGkxOG5TdHJpbmdzW0kxOG5TdHJpbmdJZC5Db21wb25lbnRJc05vdFZpcnR1YWJsZV0gKyAnICcgKyBjb250YWluZXIudGl0bGUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2V0RWxlbWVudERpc3BsYXlWaXNpYmlsaXR5KHJvb3RFbGVtZW50LCB2aXNpYmxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZUNvbnRhaW5lclZpcnR1YWxaSW5kZXhDaGFuZ2VSZXF1aXJlZEV2ZW50KGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCBsb2dpY2FsWkluZGV4OiBMb2dpY2FsWkluZGV4LCBkZWZhdWx0WkluZGV4OiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCB2aXJ0dWFibGVDb21wb25lbnQgPSB0aGlzLl92aXJ0dWFibGVDb21wb25lbnRNYXAuZ2V0KGNvbnRhaW5lcik7XHJcbiAgICAgICAgaWYgKHZpcnR1YWJsZUNvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0dMSENWWklDUkU1NTkzNScpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvb3RFbGVtZW50ID0gdmlydHVhYmxlQ29tcG9uZW50LnJvb3RIdG1sRWxlbWVudDtcclxuICAgICAgICAgICAgaWYgKHJvb3RFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBCaW5kRXJyb3IoaTE4blN0cmluZ3NbSTE4blN0cmluZ0lkLkNvbXBvbmVudElzTm90VmlydHVhYmxlXSArICcgJyArIGNvbnRhaW5lci50aXRsZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByb290RWxlbWVudC5zdHlsZS56SW5kZXggPSBkZWZhdWx0WkluZGV4O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIEdvbGRlbkxheW91dCB7XHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIFZpcnR1YWJsZUNvbXBvbmVudCB7XHJcbiAgICAgICAgcm9vdEh0bWxFbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgdHlwZSBDb21wb25lbnRDb25zdHJ1Y3RvciA9IG5ldyhjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgc3RhdGU6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCwgdmlydHVhbDogYm9vbGVhbikgPT4gQ29tcG9uZW50Q29udGFpbmVyLkNvbXBvbmVudDtcclxuICAgIGV4cG9ydCB0eXBlIENvbXBvbmVudEZhY3RvcnlGdW5jdGlvbiA9IChjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgc3RhdGU6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCwgdmlydHVhbDogYm9vbGVhbikgPT4gQ29tcG9uZW50Q29udGFpbmVyLkNvbXBvbmVudCB8IHVuZGVmaW5lZDtcclxuICAgIGV4cG9ydCB0eXBlIEdldENvbXBvbmVudENvbnN0cnVjdG9yQ2FsbGJhY2sgPSAodGhpczogdm9pZCwgY29uZmlnOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcpID0+IENvbXBvbmVudENvbnN0cnVjdG9yO1xyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50SW5zdGFudGlhdG9yIHtcclxuICAgICAgICBjb25zdHJ1Y3RvcjogQ29tcG9uZW50Q29uc3RydWN0b3IgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgZmFjdG9yeUZ1bmN0aW9uOiBDb21wb25lbnRGYWN0b3J5RnVuY3Rpb24gfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgdmlydHVhbDogYm9vbGVhbjtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcsIFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLCBSZXNvbHZlZExheW91dENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9yZXNvbHZlZC1jb25maWcnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRDb250YWluZXIgfSBmcm9tICcuLi9jb250YWluZXIvY29tcG9uZW50LWNvbnRhaW5lcic7XHJcbmltcG9ydCB7IFRhYiB9IGZyb20gJy4uL2NvbnRyb2xzL3RhYic7XHJcbmltcG9ydCB7IFVuZXhwZWN0ZWROdWxsRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi4vbGF5b3V0LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBEb21Db25zdGFudHMgfSBmcm9tICcuLi91dGlscy9kb20tY29uc3RhbnRzJztcclxuaW1wb3J0IHsgSXRlbVR5cGUsIEpzb25WYWx1ZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcclxuaW1wb3J0IHsgZ2V0RWxlbWVudFdpZHRoQW5kSGVpZ2h0LCBzZXRFbGVtZW50SGVpZ2h0LCBzZXRFbGVtZW50V2lkdGggfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcbmltcG9ydCB7IENvbXBvbmVudFBhcmVudGFibGVJdGVtIH0gZnJvbSAnLi9jb21wb25lbnQtcGFyZW50YWJsZS1pdGVtJztcclxuaW1wb3J0IHsgQ29udGVudEl0ZW0gfSBmcm9tICcuL2NvbnRlbnQtaXRlbSc7XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50SXRlbSBleHRlbmRzIENvbnRlbnRJdGVtIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3Jlb3JkZXJFbmFibGVkOiBib29sZWFuO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaGVhZGVyQ29uZmlnOiBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXIgfCB1bmRlZmluZWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF90aXRsZTogc3RyaW5nO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaW5pdGlhbFdhbnRNYXhpbWlzZTogYm9vbGVhbjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2NvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfdGFiOiBUYWI7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9mb2N1c2VkID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChDb21wb25lbnRJdGVtOmNsYXNzKS5jb21wb25lbnRUeXBlfSAqL1xyXG4gICAgZ2V0IGNvbXBvbmVudE5hbWUoKTogSnNvblZhbHVlIHsgcmV0dXJuIHRoaXMuX2NvbnRhaW5lci5jb21wb25lbnRUeXBlOyB9XHJcbiAgICBnZXQgY29tcG9uZW50VHlwZSgpOiBKc29uVmFsdWUgeyByZXR1cm4gdGhpcy5fY29udGFpbmVyLmNvbXBvbmVudFR5cGU7IH1cclxuICAgIGdldCByZW9yZGVyRW5hYmxlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3Jlb3JkZXJFbmFibGVkOyB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBnZXQgaW5pdGlhbFdhbnRNYXhpbWlzZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2luaXRpYWxXYW50TWF4aW1pc2U7IH1cclxuICAgIGdldCBjb21wb25lbnQoKTogQ29tcG9uZW50Q29udGFpbmVyLkNvbXBvbmVudCB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9jb250YWluZXIuY29tcG9uZW50OyB9XHJcbiAgICBnZXQgY29udGFpbmVyKCk6IENvbXBvbmVudENvbnRhaW5lciB7IHJldHVybiB0aGlzLl9jb250YWluZXI7IH1cclxuICAgIGdldCBwYXJlbnRJdGVtKCk6IENvbXBvbmVudFBhcmVudGFibGVJdGVtIHsgcmV0dXJuIHRoaXMuX3BhcmVudEl0ZW07IH1cclxuXHJcbiAgICBnZXQgaGVhZGVyQ29uZmlnKCk6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlciB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9oZWFkZXJDb25maWc7IH1cclxuICAgIGdldCB0aXRsZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fdGl0bGU7IH1cclxuICAgIGdldCB0YWIoKTogVGFiIHsgcmV0dXJuIHRoaXMuX3RhYjsgfVxyXG4gICAgZ2V0IGZvY3VzZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9mb2N1c2VkOyB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgbGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlcixcclxuICAgICAgICBjb25maWc6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfcGFyZW50SXRlbTogQ29tcG9uZW50UGFyZW50YWJsZUl0ZW1cclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKGxheW91dE1hbmFnZXIsIGNvbmZpZywgX3BhcmVudEl0ZW0sIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTtcclxuXHJcbiAgICAgICAgdGhpcy5pc0NvbXBvbmVudCA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuX3Jlb3JkZXJFbmFibGVkID0gY29uZmlnLnJlb3JkZXJFbmFibGVkO1xyXG5cclxuICAgICAgICB0aGlzLmFwcGx5VXBkYXRhYmxlQ29uZmlnKGNvbmZpZyk7XHJcblxyXG4gICAgICAgIHRoaXMuX2luaXRpYWxXYW50TWF4aW1pc2UgPSBjb25maWcubWF4aW1pc2VkO1xyXG5cclxuICAgICAgICBjb25zdCBjb250YWluZXJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgY29udGFpbmVyRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuQ29udGVudCk7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKGNvbnRhaW5lckVsZW1lbnQpO1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IG5ldyBDb21wb25lbnRDb250YWluZXIoY29uZmlnLCB0aGlzLCBsYXlvdXRNYW5hZ2VyLCBjb250YWluZXJFbGVtZW50LFxyXG4gICAgICAgICAgICAoaXRlbUNvbmZpZykgPT4gdGhpcy5oYW5kbGVVcGRhdGVJdGVtQ29uZmlnRXZlbnQoaXRlbUNvbmZpZyksXHJcbiAgICAgICAgICAgICgpID0+IHRoaXMuc2hvdygpLFxyXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmhpZGUoKSxcclxuICAgICAgICAgICAgKHN1cHByZXNzRXZlbnQpID0+IHRoaXMuZm9jdXMoc3VwcHJlc3NFdmVudCksXHJcbiAgICAgICAgICAgIChzdXBwcmVzc0V2ZW50KSA9PiB0aGlzLmJsdXIoc3VwcHJlc3NFdmVudCksXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBvdmVycmlkZSBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5kZXN0cm95KClcclxuICAgICAgICBzdXBlci5kZXN0cm95KCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwbHlVcGRhdGFibGVDb25maWcoY29uZmlnOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNldFRpdGxlKGNvbmZpZy50aXRsZSk7XHJcbiAgICAgICAgdGhpcy5faGVhZGVyQ29uZmlnID0gY29uZmlnLmhlYWRlcjtcclxuICAgIH1cclxuXHJcbiAgICB0b0NvbmZpZygpOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcge1xyXG4gICAgICAgIGNvbnN0IHN0YXRlUmVxdWVzdEV2ZW50ID0gdGhpcy5fY29udGFpbmVyLnN0YXRlUmVxdWVzdEV2ZW50O1xyXG4gICAgICAgIGNvbnN0IHN0YXRlID0gc3RhdGVSZXF1ZXN0RXZlbnQgPT09IHVuZGVmaW5lZCA/IHRoaXMuX2NvbnRhaW5lci5zdGF0ZSA6IHN0YXRlUmVxdWVzdEV2ZW50KCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiBJdGVtVHlwZS5jb21wb25lbnQsXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IFtdLFxyXG4gICAgICAgICAgICBzaXplOiB0aGlzLnNpemUsXHJcbiAgICAgICAgICAgIHNpemVVbml0OiB0aGlzLnNpemVVbml0LFxyXG4gICAgICAgICAgICBtaW5TaXplOiB0aGlzLm1pblNpemUsXHJcbiAgICAgICAgICAgIG1pblNpemVVbml0OiB0aGlzLm1pblNpemVVbml0LFxyXG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcclxuICAgICAgICAgICAgbWF4aW1pc2VkOiBmYWxzZSxcclxuICAgICAgICAgICAgaXNDbG9zYWJsZTogdGhpcy5pc0Nsb3NhYmxlLFxyXG4gICAgICAgICAgICByZW9yZGVyRW5hYmxlZDogdGhpcy5fcmVvcmRlckVuYWJsZWQsXHJcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLl90aXRsZSxcclxuICAgICAgICAgICAgaGVhZGVyOiBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXIuY3JlYXRlQ29weSh0aGlzLl9oZWFkZXJDb25maWcpLFxyXG4gICAgICAgICAgICBjb21wb25lbnRUeXBlOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcuY29weUNvbXBvbmVudFR5cGUodGhpcy5jb21wb25lbnRUeXBlKSxcclxuICAgICAgICAgICAgY29tcG9uZW50U3RhdGU6IHN0YXRlLFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBjbG9zZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5wYXJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0NJQzY4ODgzJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5wYXJlbnQucmVtb3ZlQ2hpbGQodGhpcywgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBVc2VkIGJ5IERyYWcgUHJveHlcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGVudGVyRHJhZ01vZGUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBzZXRFbGVtZW50V2lkdGgodGhpcy5lbGVtZW50LCB3aWR0aCk7XHJcbiAgICAgICAgc2V0RWxlbWVudEhlaWdodCh0aGlzLmVsZW1lbnQsIGhlaWdodCk7XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmVudGVyRHJhZ01vZGUod2lkdGgsIGhlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhpdERyYWdNb2RlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5leGl0RHJhZ01vZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBlbnRlclN0YWNrTWF4aW1pc2VkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5lbnRlclN0YWNrTWF4aW1pc2VkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhpdFN0YWNrTWF4aW1pc2VkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5leGl0U3RhY2tNYXhpbWlzZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBVc2VkIGJ5IERyYWcgUHJveHlcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGRyYWcoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmRyYWcoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBnZXRPdXRlckJvdW5kaW5nQ2xpZW50UmVjdCgpOiBET01SZWN0IHsgXHJcbiAgICAgICAgY29uc3QgcmVjdCA9IHRoaXMuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBjb25zdCBzaG93ID0gdGhpcy5oZWFkZXJDb25maWc/LnNob3c7XHJcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucy5kZWZhdWx0cy5oZWFkZXJIZWlnaHQ7XHJcblxyXG4gICAgICAgIGNvbnN0IGhlYWRlcldpZHRoID0gKHNob3cgPT09ICdsZWZ0JyB8fCBzaG93ID09PSAncmlnaHQnKSA/IGhlaWdodCA6IDA7XHJcbiAgICAgICAgY29uc3QgaGVhZGVySGVpZ2h0ID0gKHNob3cgPT09ICd0b3AnIHx8IHNob3cgPT09ICdib3R0b20nIHx8IHNob3cgPT09IHVuZGVmaW5lZCkgPyBoZWlnaHQgOiAwO1xyXG5cclxuICAgICAgICByZXR1cm4gRE9NUmVjdC5mcm9tUmVjdCh7XHJcbiAgICAgICAgICAgIHg6IHJlY3QubGVmdCAtIGhlYWRlcldpZHRoLFxyXG4gICAgICAgICAgICB5OiByZWN0LnRvcCAtIGhlYWRlckhlaWdodCxcclxuICAgICAgICAgICAgd2lkdGg6IHJlY3Qud2lkdGggKyBoZWFkZXJXaWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiByZWN0LmhlaWdodCArIGhlYWRlckhlaWdodCxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBvdmVycmlkZSB1cGRhdGVTaXplKGZvcmNlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVOb2RlU2l6ZShmb3JjZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgaW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZU5vZGVTaXplKGZhbHNlKTtcclxuXHJcbiAgICAgICAgc3VwZXIuaW5pdCgpO1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5lbWl0KCdvcGVuJyk7XHJcbiAgICAgICAgdGhpcy5pbml0Q29udGVudEl0ZW1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhpcyBjb21wb25lbnQncyB0aXRsZVxyXG4gICAgICpcclxuICAgICAqIEBwdWJsaWNcclxuICAgICAqIEBwYXJhbSB0aXRsZSAtXHJcbiAgICAgKi9cclxuXHJcbiAgICBzZXRUaXRsZSh0aXRsZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdGl0bGUgPSB0aXRsZTtcclxuICAgICAgICB0aGlzLmVtaXQoJ3RpdGxlQ2hhbmdlZCcsIHRpdGxlKTtcclxuICAgICAgICB0aGlzLmVtaXQoJ3N0YXRlQ2hhbmdlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFRhYih0YWI6IFRhYik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3RhYiA9IHRhYjtcclxuICAgICAgICB0aGlzLmVtaXQoJ3RhYicsIHRhYilcclxuICAgICAgICB0aGlzLl9jb250YWluZXIuc2V0VGFiKHRhYik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgaGlkZSgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLnNldFZpc2liaWxpdHkoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIG92ZXJyaWRlIHNob3coKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIuc2hvdygpO1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5zZXRWaXNpYmlsaXR5KHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRm9jdXNlcyB0aGUgaXRlbSBpZiBpdCBpcyBub3QgYWxyZWFkeSBmb2N1c2VkXHJcbiAgICAgKi9cclxuICAgIGZvY3VzKHN1cHByZXNzRXZlbnQgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGFyZW50SXRlbS5zZXRBY3RpdmVDb21wb25lbnRJdGVtKHRoaXMsIHRydWUsIHN1cHByZXNzRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHNldEZvY3VzZWQoc3VwcHJlc3NFdmVudDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2ZvY3VzZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMudGFiLnNldEZvY3VzZWQoKTtcclxuICAgICAgICBpZiAoIXN1cHByZXNzRXZlbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0QmFzZUJ1YmJsaW5nRXZlbnQoJ2ZvY3VzJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQmx1cnMgKGRlZm9jdXNlcykgdGhlIGl0ZW0gaWYgaXQgaXMgZm9jdXNlZFxyXG4gICAgICovXHJcbiAgICBibHVyKHN1cHByZXNzRXZlbnQgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9mb2N1c2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5zZXRGb2N1c2VkQ29tcG9uZW50SXRlbSh1bmRlZmluZWQsIHN1cHByZXNzRXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBzZXRCbHVycmVkKHN1cHByZXNzRXZlbnQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9mb2N1c2VkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy50YWIuc2V0Qmx1cnJlZCgpO1xyXG4gICAgICAgIGlmICghc3VwcHJlc3NFdmVudCkge1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRCYXNlQnViYmxpbmdFdmVudCgnYmx1cicpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc2V0UGFyZW50KHBhcmVudDogQ29udGVudEl0ZW0pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9wYXJlbnRJdGVtID0gcGFyZW50IGFzIENvbXBvbmVudFBhcmVudGFibGVJdGVtO1xyXG4gICAgICAgIHN1cGVyLnNldFBhcmVudChwYXJlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlVXBkYXRlSXRlbUNvbmZpZ0V2ZW50KGl0ZW1Db25maWc6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZykge1xyXG4gICAgICAgIHRoaXMuYXBwbHlVcGRhdGFibGVDb25maWcoaXRlbUNvbmZpZyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSB1cGRhdGVOb2RlU2l6ZShmb3JjZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnKSB7XHJcbiAgICAgICAgICAgIC8vIERvIG5vdCB1cGRhdGUgc2l6ZSBvZiBoaWRkZW4gY29tcG9uZW50cyB0byBwcmV2ZW50IHVud2FudGVkIHJlZmxvd3NcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gZ2V0RWxlbWVudFdpZHRoQW5kSGVpZ2h0KHRoaXMuZWxlbWVudCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5zZXRTaXplVG9Ob2RlU2l6ZSh3aWR0aCwgaGVpZ2h0LCBmb3JjZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChDb21wb25lbnRJdGVtOmNsYXNzKX0gKi9cclxuZXhwb3J0IHR5cGUgQ29tcG9uZW50ID0gQ29tcG9uZW50SXRlbTtcclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgQ29tcG9uZW50SXRlbSB7XHJcbiAgICBleHBvcnQgdHlwZSBDb21wb25lbnQgPSBDb21wb25lbnRDb250YWluZXIuQ29tcG9uZW50O1xyXG59XHJcbiIsImltcG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuL2NvbXBvbmVudC1pdGVtJztcclxuaW1wb3J0IHsgQ29udGVudEl0ZW0gfSBmcm9tICcuL2NvbnRlbnQtaXRlbSc7XHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29tcG9uZW50UGFyZW50YWJsZUl0ZW0gZXh0ZW5kcyBDb250ZW50SXRlbSB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9mb2N1c2VkID0gZmFsc2U7XHJcblxyXG4gICAgZ2V0IGZvY3VzZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9mb2N1c2VkOyB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc2V0Rm9jdXNlZFZhbHVlKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZm9jdXNlZCA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFic3RyYWN0IHNldEFjdGl2ZUNvbXBvbmVudEl0ZW0oaXRlbTogQ29tcG9uZW50SXRlbSwgZm9jdXM6IGJvb2xlYW4sIHN1cHByZXNzRm9jdXNFdmVudDogYm9vbGVhbik6IHZvaWQ7XHJcbn1cclxuIiwiaW1wb3J0IHsgUmVzb2x2ZWRJdGVtQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL3Jlc29sdmVkLWNvbmZpZydcclxuaW1wb3J0IHsgQnJvd3NlclBvcG91dCB9IGZyb20gJy4uL2NvbnRyb2xzL2Jyb3dzZXItcG9wb3V0J1xyXG5pbXBvcnQgeyBBc3NlcnRFcnJvciwgVW5leHBlY3RlZE51bGxFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcidcclxuaW1wb3J0IHsgTGF5b3V0TWFuYWdlciB9IGZyb20gJy4uL2xheW91dC1tYW5hZ2VyJ1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi91dGlscy9ldmVudC1lbWl0dGVyJ1xyXG5pbXBvcnQgeyBBcmVhTGlua2VkUmVjdCwgSXRlbVR5cGUsIFNpemVVbml0RW51bSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJ1xyXG5pbXBvcnQgeyBnZXRVbmlxdWVJZCwgc2V0RWxlbWVudERpc3BsYXlWaXNpYmlsaXR5IH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnXHJcbmltcG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuL2NvbXBvbmVudC1pdGVtJ1xyXG5pbXBvcnQgeyBDb21wb25lbnRQYXJlbnRhYmxlSXRlbSB9IGZyb20gJy4vY29tcG9uZW50LXBhcmVudGFibGUtaXRlbSdcclxuaW1wb3J0IHsgU3RhY2sgfSBmcm9tICcuL3N0YWNrJ1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgaXMgdGhlIGJhc2VjbGFzcyB0aGF0IGFsbCBjb250ZW50IGl0ZW1zIGluaGVyaXQgZnJvbS5cclxuICogTW9zdCBtZXRob2RzIHByb3ZpZGUgYSBzdWJzZXQgb2Ygd2hhdCB0aGUgc3ViLWNsYXNzZXMgZG8uXHJcbiAqXHJcbiAqIEl0IGFsc28gcHJvdmlkZXMgYSBudW1iZXIgb2YgZnVuY3Rpb25zIGZvciB0cmVlIHRyYXZlcnNhbFxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbnRlbnRJdGVtIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3R5cGU6IEl0ZW1UeXBlO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaWQ6IHN0cmluZztcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3BvcEluUGFyZW50SWRzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfY29udGVudEl0ZW1zOiBDb250ZW50SXRlbVtdO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaXNDbG9zYWJsZTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3BlbmRpbmdFdmVudFByb3BhZ2F0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF90aHJvdHRsZWRFdmVudHM6IHN0cmluZ1tdO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaXNJbml0aWFsaXNlZDtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBzaXplOiBudW1iZXI7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBzaXplVW5pdDogU2l6ZVVuaXRFbnVtO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgbWluU2l6ZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgbWluU2l6ZVVuaXQ6IFNpemVVbml0RW51bTtcclxuXHJcbiAgICBpc0dyb3VuZDogYm9vbGVhblxyXG4gICAgaXNSb3c6IGJvb2xlYW5cclxuICAgIGlzQ29sdW1uOiBib29sZWFuXHJcbiAgICBpc1N0YWNrOiBib29sZWFuXHJcbiAgICBpc0NvbXBvbmVudDogYm9vbGVhblxyXG5cclxuICAgIGdldCB0eXBlKCk6IEl0ZW1UeXBlIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH1cclxuICAgIGdldCBpZCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5faWQ7IH1cclxuICAgIHNldCBpZCh2YWx1ZTogc3RyaW5nKSB7IHRoaXMuX2lkID0gdmFsdWU7IH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGdldCBwb3BJblBhcmVudElkcygpOiBzdHJpbmdbXSB7IHJldHVybiB0aGlzLl9wb3BJblBhcmVudElkczsgfVxyXG4gICAgZ2V0IHBhcmVudCgpOiBDb250ZW50SXRlbSB8IG51bGwgeyByZXR1cm4gdGhpcy5fcGFyZW50OyB9XHJcbiAgICBnZXQgY29udGVudEl0ZW1zKCk6IENvbnRlbnRJdGVtW10geyByZXR1cm4gdGhpcy5fY29udGVudEl0ZW1zOyB9XHJcbiAgICBnZXQgaXNDbG9zYWJsZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2lzQ2xvc2FibGU7IH1cclxuICAgIGdldCBlbGVtZW50KCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7IH1cclxuICAgIGdldCBpc0luaXRpYWxpc2VkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5faXNJbml0aWFsaXNlZDsgfVxyXG5cclxuICAgIHN0YXRpYyBpc1N0YWNrKGl0ZW06IENvbnRlbnRJdGVtKTogaXRlbSBpcyBTdGFjayB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW0uaXNTdGFjaztcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNDb21wb25lbnRJdGVtKGl0ZW06IENvbnRlbnRJdGVtKTogaXRlbSBpcyBDb21wb25lbnRJdGVtIHtcclxuICAgICAgICByZXR1cm4gaXRlbS5pc0NvbXBvbmVudDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNDb21wb25lbnRQYXJlbnRhYmxlSXRlbShpdGVtOiBDb250ZW50SXRlbSk6IGl0ZW0gaXMgQ29tcG9uZW50UGFyZW50YWJsZUl0ZW0ge1xyXG4gICAgICAgIHJldHVybiBpdGVtLmlzU3RhY2sgfHwgaXRlbS5pc0dyb3VuZDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgbGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlcixcclxuICAgICAgICBjb25maWc6IFJlc29sdmVkSXRlbUNvbmZpZyxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfcGFyZW50OiBDb250ZW50SXRlbSB8IG51bGwsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnQ6IEhUTUxFbGVtZW50XHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICB0aGlzLl90eXBlID0gY29uZmlnLnR5cGU7XHJcbiAgICAgICAgdGhpcy5faWQgPSBjb25maWcuaWQ7XHJcblxyXG4gICAgICAgIHRoaXMuX2lzSW5pdGlhbGlzZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzR3JvdW5kID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc1JvdyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNDb2x1bW4gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzU3RhY2sgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzQ29tcG9uZW50ID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMuc2l6ZSA9IGNvbmZpZy5zaXplO1xyXG4gICAgICAgIHRoaXMuc2l6ZVVuaXQgPSBjb25maWcuc2l6ZVVuaXQ7XHJcbiAgICAgICAgdGhpcy5taW5TaXplID0gY29uZmlnLm1pblNpemU7XHJcbiAgICAgICAgdGhpcy5taW5TaXplVW5pdCA9IGNvbmZpZy5taW5TaXplVW5pdDtcclxuXHJcbiAgICAgICAgdGhpcy5faXNDbG9zYWJsZSA9IGNvbmZpZy5pc0Nsb3NhYmxlO1xyXG5cclxuICAgICAgICB0aGlzLl9wZW5kaW5nRXZlbnRQcm9wYWdhdGlvbnMgPSB7fTtcclxuICAgICAgICB0aGlzLl90aHJvdHRsZWRFdmVudHMgPSBbJ3N0YXRlQ2hhbmdlZCddO1xyXG5cclxuICAgICAgICB0aGlzLl9jb250ZW50SXRlbXMgPSB0aGlzLmNyZWF0ZUNvbnRlbnRJdGVtcyhjb25maWcuY29udGVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVycyB0aGUgc2l6ZSBvZiB0aGUgY29tcG9uZW50IGFuZCBpdHMgY2hpbGRyZW4sIGNhbGxlZCByZWN1cnNpdmVseVxyXG4gICAgICogQHBhcmFtIGZvcmNlIC0gSW4gc29tZSBjYXNlcyB0aGUgc2l6ZSBpcyBub3QgdXBkYXRlZCBpZiBpdCBoYXMgbm90IGNoYW5nZWQuIEluIHRoaXMgY2FzZSwgZXZlbnRzXHJcbiAgICAgKiAoc3VjaCBhcyBDb21wb25lbnRDb250YWluZXIudmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50KSBhcmUgbm90IGZpcmVkLiBTZXR0aW5nIGZvcmNlIHRvIHRydWUsIGVuc3VyZXMgdGhlIHNpemUgaXMgdXBkYXRlZCByZWdhcmRsZXNzLCBhbmRcclxuICAgICAqIHRoZSByZXNwZWN0aXZlIGV2ZW50cyBhcmUgZmlyZWQuIFRoaXMgaXMgc29tZXRpbWVzIG5lY2Vzc2FyeSB3aGVuIGEgY29tcG9uZW50J3Mgc2l6ZSBoYXMgbm90IGNoYW5nZWQgYnV0IGl0IGhhcyBiZWNvbWUgdmlzaWJsZSwgYW5kIHRoZVxyXG4gICAgICogcmVsZXZhbnQgZXZlbnRzIG5lZWQgdG8gYmUgZmlyZWQuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgYWJzdHJhY3QgdXBkYXRlU2l6ZShmb3JjZTogYm9vbGVhbik6IHZvaWQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGEgY2hpbGQgbm9kZSAoYW5kIGl0cyBjaGlsZHJlbikgZnJvbSB0aGUgdHJlZVxyXG4gICAgICogQHBhcmFtIGNvbnRlbnRJdGVtIC0gVGhlIGNoaWxkIGl0ZW0gdG8gcmVtb3ZlXHJcbiAgICAgKiBAcGFyYW0ga2VlcENoaWxkIC0gV2hldGhlciB0byBkZXN0cm95IHRoZSByZW1vdmVkIGl0ZW1cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlQ2hpbGQoY29udGVudEl0ZW06IENvbnRlbnRJdGVtLCBrZWVwQ2hpbGQgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIC8qXHJcbiAgICAgICAgICogR2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgaXRlbSB0aGF0J3MgdG8gYmUgcmVtb3ZlZCB3aXRoaW4gYWxsIGNvbnRlbnQgaXRlbXMgdGhpcyBub2RlIGNvbnRhaW5zXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9jb250ZW50SXRlbXMuaW5kZXhPZihjb250ZW50SXRlbSk7XHJcblxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgICogTWFrZSBzdXJlIHRoZSBjb250ZW50IGl0ZW0gdG8gYmUgcmVtb3ZlZCBpcyBhY3R1YWxseSBhIGNoaWxkIG9mIHRoaXMgaXRlbVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IHJlbW92ZSBjaGlsZCBpdGVtLiBVbmtub3duIGNvbnRlbnQgaXRlbScpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcblx0XHQgKiBDYWxsIGRlc3Ryb3kgb24gdGhlIGNvbnRlbnQgaXRlbS5cclxuXHRcdCAqIEFsbCBjaGlsZHJlbiBhcmUgZGVzdHJveWVkIGFzIHdlbGxcclxuXHRcdCAqL1xyXG4gICAgICAgIGlmICgha2VlcENoaWxkKSB7XHJcblx0XHRcdHRoaXMuX2NvbnRlbnRJdGVtc1tpbmRleF0uZGVzdHJveSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUmVtb3ZlIHRoZSBjb250ZW50IGl0ZW0gZnJvbSB0aGlzIG5vZGVzIGFycmF5IG9mIGNoaWxkcmVuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fY29udGVudEl0ZW1zLnNwbGljZShpbmRleCwgMSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElmIHRoaXMgbm9kZSBzdGlsbCBjb250YWlucyBvdGhlciBjb250ZW50IGl0ZW1zLCBhZGp1c3QgdGhlaXIgc2l6ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICh0aGlzLl9jb250ZW50SXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoZmFsc2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBJZiB0aGlzIHdhcyB0aGUgbGFzdCBjb250ZW50IGl0ZW0sIHJlbW92ZSB0aGlzIG5vZGUgYXMgd2VsbFxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgLy8gaWYgKCF0aGlzLmlzR3JvdW5kICYmIHRoaXMuX2lzQ2xvc2FibGUgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzR3JvdW5kKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcGFyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0NJVUMwMDg3NCcpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHVwIHRoZSB0cmVlIHN0cnVjdHVyZSBmb3IgdGhlIG5ld2x5IGFkZGVkIGNoaWxkXHJcbiAgICAgKiBUaGUgcmVzcG9uc2liaWxpdHkgZm9yIHRoZSBhY3R1YWwgRE9NIG1hbmlwdWxhdGlvbnMgbGllc1xyXG4gICAgICogd2l0aCB0aGUgY29uY3JldGUgaXRlbVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBjb250ZW50SXRlbSAtXHJcbiAgICAgKiBAcGFyYW0gaW5kZXggLSBJZiBvbWl0dGVkIGl0ZW0gd2lsbCBiZSBhcHBlbmRlZFxyXG4gICAgICogQHBhcmFtIHN1c3BlbmRSZXNpemUgLSBVc2VkIGJ5IGRlc2NlbmRlbnQgaW1wbGVtZW50YXRpb25zXHJcbiAgICAgKi9cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIGFkZENoaWxkKGNvbnRlbnRJdGVtOiBDb250ZW50SXRlbSwgaW5kZXg/OiBudW1iZXIgfCBudWxsLCBzdXNwZW5kUmVzaXplPzogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICAgICAgaW5kZXggPz89IHRoaXMuX2NvbnRlbnRJdGVtcy5sZW5ndGg7XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbnRlbnRJdGVtcy5zcGxpY2UoaW5kZXgsIDAsIGNvbnRlbnRJdGVtKTtcclxuICAgICAgICBjb250ZW50SXRlbS5zZXRQYXJlbnQodGhpcyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9pc0luaXRpYWxpc2VkID09PSB0cnVlICYmIGNvbnRlbnRJdGVtLl9pc0luaXRpYWxpc2VkID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICBjb250ZW50SXRlbS5pbml0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaW5kZXg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXBsYWNlcyBvbGRDaGlsZCB3aXRoIG5ld0NoaWxkXHJcbiAgICAgKiBAcGFyYW0gb2xkQ2hpbGQgLVxyXG4gICAgICogQHBhcmFtIG5ld0NoaWxkIC1cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICByZXBsYWNlQ2hpbGQob2xkQ2hpbGQ6IENvbnRlbnRJdGVtLCBuZXdDaGlsZDogQ29udGVudEl0ZW0sIGRlc3Ryb3lPbGRDaGlsZCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgLy8gRG8gbm90IHRyeSB0byByZXBsYWNlIENvbXBvbmVudEl0ZW0gLSB3aWxsIG5vdCB3b3JrXHJcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9jb250ZW50SXRlbXMuaW5kZXhPZihvbGRDaGlsZCk7XHJcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IG9sZENoaWxkLl9lbGVtZW50LnBhcmVudE5vZGU7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdDSVJDSTIzMjMyJywgJ0NhblxcJ3QgcmVwbGFjZSBjaGlsZC4gb2xkQ2hpbGQgaXMgbm90IGNoaWxkIG9mIHRoaXMnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChwYXJlbnROb2RlID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdDSVJDUDIzMjMyJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobmV3Q2hpbGQuX2VsZW1lbnQsIG9sZENoaWxkLl9lbGVtZW50KTtcclxuXHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICogT3B0aW9uYWxseSBkZXN0cm95IHRoZSBvbGQgY29udGVudCBpdGVtXHJcbiAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGlmIChkZXN0cm95T2xkQ2hpbGQgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIG9sZENoaWxkLl9wYXJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgb2xkQ2hpbGQuZGVzdHJveSgpOyAvLyB3aWxsIG5vdyBhbHNvIGRlc3Ryb3kgYWxsIGNoaWxkcmVuIG9mIG9sZENoaWxkXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICogV2lyZSB0aGUgbmV3IGNvbnRlbnRJdGVtIGludG8gdGhlIHRyZWVcclxuICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgdGhpcy5fY29udGVudEl0ZW1zW2luZGV4XSA9IG5ld0NoaWxkO1xyXG4gICAgICAgICAgICBuZXdDaGlsZC5zZXRQYXJlbnQodGhpcyk7XHJcbiAgICAgICAgICAgIC8vIG5ld0NoaWxkIGluaGVyaXRzIHRoZSBzaXplcyBmcm9tIHRoZSBvbGQgY2hpbGQ6XHJcbiAgICAgICAgICAgIG5ld0NoaWxkLnNpemUgPSBvbGRDaGlsZC5zaXplO1xyXG4gICAgICAgICAgICBuZXdDaGlsZC5zaXplVW5pdCA9IG9sZENoaWxkLnNpemVVbml0O1xyXG4gICAgICAgICAgICBuZXdDaGlsZC5taW5TaXplID0gb2xkQ2hpbGQubWluU2l6ZTtcclxuICAgICAgICAgICAgbmV3Q2hpbGQubWluU2l6ZVVuaXQgPSBvbGRDaGlsZC5taW5TaXplVW5pdDtcclxuXHJcbiAgICAgICAgICAgIC8vVE9ETyBUaGlzIGRvZXNuJ3QgdXBkYXRlIHRoZSBjb25maWcuLi4gcmVmYWN0b3IgdG8gbGVhdmUgaXRlbSBub2RlcyB1bnRvdWNoZWQgYWZ0ZXIgY3JlYXRpb25cclxuICAgICAgICAgICAgaWYgKG5ld0NoaWxkLl9wYXJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdDSVJDTkM0NTY5OScpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKG5ld0NoaWxkLl9wYXJlbnQuX2lzSW5pdGlhbGlzZWQgPT09IHRydWUgJiYgbmV3Q2hpbGQuX2lzSW5pdGlhbGlzZWQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3Q2hpbGQuaW5pdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZShmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QuXHJcbiAgICAgKiBTaG9ydGhhbmQgZm9yIHRoaXMucGFyZW50LnJlbW92ZUNoaWxkKCB0aGlzIClcclxuICAgICAqL1xyXG4gICAgcmVtb3ZlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9wYXJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0NJUjExMTEwJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgdGhlIGNvbXBvbmVudCBmcm9tIHRoZSBsYXlvdXQgYW5kIGNyZWF0ZXMgYSBuZXdcclxuICAgICAqIGJyb3dzZXIgd2luZG93IHdpdGggdGhlIGNvbXBvbmVudCBhbmQgaXRzIGNoaWxkcmVuIGluc2lkZVxyXG4gICAgICovXHJcbiAgICBwb3BvdXQoKTogQnJvd3NlclBvcG91dCB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50SWQgPSBnZXRVbmlxdWVJZCgpO1xyXG4gICAgICAgIGNvbnN0IGJyb3dzZXJQb3BvdXQgPSB0aGlzLmxheW91dE1hbmFnZXIuY3JlYXRlUG9wb3V0RnJvbUNvbnRlbnRJdGVtKHRoaXMsIHVuZGVmaW5lZCwgcGFyZW50SWQsIHVuZGVmaW5lZCk7XHJcbiAgICAgICAgdGhpcy5lbWl0QmFzZUJ1YmJsaW5nRXZlbnQoJ3N0YXRlQ2hhbmdlZCcpO1xyXG4gICAgICAgIHJldHVybiBicm93c2VyUG9wb3V0O1xyXG4gICAgfVxyXG5cclxuICAgIGFic3RyYWN0IHRvQ29uZmlnKCk6IFJlc29sdmVkSXRlbUNvbmZpZztcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjYWxjdWxhdGVDb25maWdDb250ZW50KCk6IFJlc29sdmVkSXRlbUNvbmZpZ1tdIHtcclxuICAgICAgICBjb25zdCBjb250ZW50SXRlbXMgPSB0aGlzLl9jb250ZW50SXRlbXM7XHJcbiAgICAgICAgY29uc3QgY291bnQgPSBjb250ZW50SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxSZXNvbHZlZEl0ZW1Db25maWc+KGNvdW50KTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IGNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgcmVzdWx0W2ldID0gaXRlbS50b0NvbmZpZygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGhpZ2hsaWdodERyb3Bab25lKHg6IG51bWJlciwgeTogbnVtYmVyLCBhcmVhOiBBcmVhTGlua2VkUmVjdCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGRyb3BUYXJnZXRJbmRpY2F0b3IgPSB0aGlzLmxheW91dE1hbmFnZXIuZHJvcFRhcmdldEluZGljYXRvcjtcclxuICAgICAgICBpZiAoZHJvcFRhcmdldEluZGljYXRvciA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignQUNJSERaNTU5MycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRyb3BUYXJnZXRJbmRpY2F0b3IuaGlnaGxpZ2h0QXJlYShhcmVhLCAxKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgb25Ecm9wKGNvbnRlbnRJdGVtOiBDb250ZW50SXRlbSwgYXJlYTogQ29udGVudEl0ZW0uQXJlYSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYWRkQ2hpbGQoY29udGVudEl0ZW0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHNob3coKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmJlZ2luU2l6ZUludmFsaWRhdGlvbigpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vIE5vdCBzdXJlIHdoeSBzaG93QWxsQWN0aXZlQ29udGVudEl0ZW1zKCkgd2FzIGNhbGxlZC4gR29sZGVuTGF5b3V0IHNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IGl0LiAgTGVmdCBjb21tZW50ZWQgY29kZVxyXG4gICAgICAgICAgICAvLyBpbiBzb3VyY2UgaW4gY2FzZSBhIHJlYXNvbiBmb3IgaXQgYmVjb21lcyBhcHBhcmVudC5cclxuICAgICAgICAgICAgLy8gdGhpcy5sYXlvdXRNYW5hZ2VyLnNob3dBbGxBY3RpdmVDb250ZW50SXRlbXMoKTtcclxuICAgICAgICAgICAgc2V0RWxlbWVudERpc3BsYXlWaXNpYmlsaXR5KHRoaXMuX2VsZW1lbnQsIHRydWUpO1xyXG4gICAgICAgICAgICAvLyB0aGlzLmxheW91dE1hbmFnZXIudXBkYXRlU2l6ZUZyb21Db250YWluZXIoKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jb250ZW50SXRlbXNbaV0uc2hvdygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmVuZFNpemVJbnZhbGlkYXRpb24oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyB0aGlzIGl0ZW0gYW5kcyBpdHMgY2hpbGRyZW5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRJdGVtc1tpXS5kZXN0cm95KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2NvbnRlbnRJdGVtcyA9IFtdO1xyXG5cclxuICAgICAgICB0aGlzLmVtaXRCYXNlQnViYmxpbmdFdmVudCgnYmVmb3JlSXRlbURlc3Ryb3llZCcpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICAgICAgdGhpcy5lbWl0QmFzZUJ1YmJsaW5nRXZlbnQoJ2l0ZW1EZXN0cm95ZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGFyZWEgdGhlIGNvbXBvbmVudCBjdXJyZW50bHkgb2NjdXBpZXNcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBnZXRFbGVtZW50QXJlYShlbGVtZW50PzogSFRNTEVsZW1lbnQpOiBDb250ZW50SXRlbS5BcmVhIHtcclxuICAgICAgICBlbGVtZW50ID0gZWxlbWVudCA/PyB0aGlzLl9lbGVtZW50O1xyXG5cclxuICAgICAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBjb25zdCB0b3AgPSByZWN0LnRvcCArIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wO1xyXG4gICAgICAgIGNvbnN0IGxlZnQgPSByZWN0LmxlZnQgKyBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQ7XHJcblxyXG4gICAgICAgIGNvbnN0IHdpZHRoID0gcmVjdC53aWR0aDtcclxuICAgICAgICBjb25zdCBoZWlnaHQgPSByZWN0LmhlaWdodDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgeDE6IGxlZnQsXHJcbiAgICAgICAgICAgIHkxOiB0b3AsXHJcbiAgICAgICAgICAgIHgyOiBsZWZ0ICsgd2lkdGgsXHJcbiAgICAgICAgICAgIHkyOiB0b3AgKyBoZWlnaHQsXHJcbiAgICAgICAgICAgIHN1cmZhY2U6IHdpZHRoICogaGVpZ2h0LFxyXG4gICAgICAgICAgICBjb250ZW50SXRlbTogdGhpc1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZmluZEFuY2VzdG9yV2l0aFNpYmxpbmdzKCk6IENvbnRlbnRJdGVtIHwgbnVsbCB7XHJcbiAgICAgICAgbGV0IGN1cnI6IENvbnRlbnRJdGVtIHwgbnVsbCA9IHRoaXM7XHJcblxyXG4gICAgICAgIHdoaWxlIChjdXJyICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyLnBhcmVudCAhPT0gbnVsbCAmJiBjdXJyLnBhcmVudC5jb250ZW50SXRlbXMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3VyciA9IGN1cnIucGFyZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogRmluZHMgYW4gYW5jZXN0b3IgdGhhdCB3aWxsIGV4aXN0IGV2ZW4gYWZ0ZXIgdGhlIGl0ZW0gaXMgcmVtb3ZlZCBhbmQgcmV0dXJucyBpdCBhcyBkb2NrIHBvaW50LlxyXG4gICAgICogXHJcbiAgICAgKiBAaW50ZXJuYWwgKi9cclxuICAgIGZpbmREb2NrUG9pbnQoKTogQ29udGVudEl0ZW0uRG9ja1BvaW50IHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3QgYW5jaG9yID0gdGhpcy5maW5kQW5jZXN0b3JXaXRoU2libGluZ3MoKTtcclxuXHJcbiAgICAgICAgaWYgKGFuY2hvciAhPT0gbnVsbCAmJiBhbmNob3IucGFyZW50ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gYW5jaG9yLnBhcmVudC5fY29udGVudEl0ZW1zLmluZGV4T2YoYW5jaG9yKTtcclxuICAgICAgICAgICAgcmV0dXJuIHsgcGFyZW50OiBhbmNob3IucGFyZW50LCBpbmRleCB9O1xyXG5cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubGF5b3V0TWFuYWdlci5ncm91bmRJdGVtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHBhcmVudDogdGhpcy5sYXlvdXRNYW5hZ2VyLmdyb3VuZEl0ZW0sIGluZGV4OiBudWxsIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB0cmVlIG9mIGNvbnRlbnQgaXRlbXMgaXMgY3JlYXRlZCBpbiB0d28gc3RlcHM6IEZpcnN0IGFsbCBjb250ZW50IGl0ZW1zIGFyZSBpbnN0YW50aWF0ZWQsXHJcbiAgICAgKiB0aGVuIGluaXQgaXMgY2FsbGVkIHJlY3Vyc2l2ZWx5IGZyb20gdG9wIHRvIGJvdHRlbS4gVGhpcyBpcyB0aGUgYmFzaWMgaW5pdCBmdW5jdGlvbixcclxuICAgICAqIGl0IGNhbiBiZSB1c2VkLCBleHRlbmRlZCBvciBvdmVyd3JpdHRlbiBieSB0aGUgY29udGVudCBpdGVtc1xyXG4gICAgICpcclxuICAgICAqIEl0cyBiZWhhdmlvdXIgZGVwZW5kcyBvbiB0aGUgY29udGVudCBpdGVtXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgaW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpc2VkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmVtaXRCYXNlQnViYmxpbmdFdmVudCgnaXRlbUNyZWF0ZWQnKTtcclxuICAgICAgICB0aGlzLmVtaXRVbmtub3duQnViYmxpbmdFdmVudCh0aGlzLnR5cGUgKyAnQ3JlYXRlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByb3RlY3RlZCBzZXRQYXJlbnQocGFyZW50OiBDb250ZW50SXRlbSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBhZGRQb3BJblBhcmVudElkKGlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMucG9wSW5QYXJlbnRJZHMuaW5jbHVkZXMoaWQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMucG9wSW5QYXJlbnRJZHMucHVzaChpZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByb3RlY3RlZCBpbml0Q29udGVudEl0ZW1zKCk6IHZvaWQge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRJdGVtc1tpXS5pbml0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByb3RlY3RlZCBoaWRlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5iZWdpblNpemVJbnZhbGlkYXRpb24oKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBzZXRFbGVtZW50RGlzcGxheVZpc2liaWxpdHkodGhpcy5fZWxlbWVudCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAvLyB0aGlzLmxheW91dE1hbmFnZXIudXBkYXRlU2l6ZUZyb21Db250YWluZXIoKTtcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuZW5kU2l6ZUludmFsaWRhdGlvbigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcm90ZWN0ZWQgdXBkYXRlQ29udGVudEl0ZW1zU2l6ZShmb3JjZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRJdGVtc1tpXS51cGRhdGVTaXplKGZvcmNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBjcmVhdGVzIGFsbCBjb250ZW50IGl0ZW1zIGZvciB0aGlzIG5vZGUgYXQgaW5pdGlhbGlzYXRpb24gdGltZVxyXG4gICAgICogUExFQVNFIE5PVEUsIHBsZWFzZSBzZWUgYWRkQ2hpbGQgZm9yIGFkZGluZyBjb250ZW50SXRlbXMgYXQgcnVudGltZVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlQ29udGVudEl0ZW1zKGNvbnRlbnQ6IHJlYWRvbmx5IFJlc29sdmVkSXRlbUNvbmZpZ1tdKSB7XHJcbiAgICAgICAgY29uc3QgY291bnQgPSBjb250ZW50Lmxlbmd0aDtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8Q29udGVudEl0ZW0+KGNvdW50KTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgcmVzdWx0W2ldID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmNyZWF0ZUNvbnRlbnRJdGVtKGNvbnRlbnRbaV0sIHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGZvciBldmVyeSBldmVudCBvbiB0aGUgaXRlbSB0cmVlLiBEZWNpZGVzIHdoZXRoZXIgdGhlIGV2ZW50IGlzIGEgYnViYmxpbmdcclxuICAgICAqIGV2ZW50IGFuZCBwcm9wYWdhdGVzIGl0IHRvIGl0cyBwYXJlbnRcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudFxyXG4gICAgICogQHBhcmFtIGV2ZW50IC1cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHByb3BhZ2F0ZUV2ZW50KG5hbWU6IHN0cmluZywgYXJnczogdW5rbm93bltdKSB7XHJcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gYXJnc1swXTtcclxuICAgICAgICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyLkJ1YmJsaW5nRXZlbnQgJiZcclxuICAgICAgICAgICAgICAgIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkID09PSBmYWxzZSAmJlxyXG4gICAgICAgICAgICAgICAgdGhpcy5faXNJbml0aWFsaXNlZCA9PT0gdHJ1ZSkge1xyXG5cclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogSW4gc29tZSBjYXNlcyAoZS5nLiBpZiBhbiBlbGVtZW50IGlzIGNyZWF0ZWQgZnJvbSBhIERyYWdTb3VyY2UpIGl0XHJcbiAgICAgICAgICAgICAgICAgKiBkb2Vzbid0IGhhdmUgYSBwYXJlbnQgYW5kIGlzIG5vdCBhIGNoaWxkIG9mIEdyb3VuZEl0ZW0uIElmIHRoYXQncyB0aGUgY2FzZVxyXG4gICAgICAgICAgICAgICAgICogcHJvcGFnYXRlIHRoZSBidWJibGluZyBldmVudCBmcm9tIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIHN1YnN0cmVlIGRpcmVjdGx5XHJcbiAgICAgICAgICAgICAgICAgKiB0byB0aGUgbGF5b3V0TWFuYWdlclxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0dyb3VuZCA9PT0gZmFsc2UgJiYgdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGFyZW50LmVtaXRVbmtub3duKG5hbWUsIGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUV2ZW50UHJvcGFnYXRpb25Ub0xheW91dE1hbmFnZXIobmFtZSwgZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG92ZXJyaWRlIHRyeUJ1YmJsZUV2ZW50KG5hbWU6IHN0cmluZywgYXJnczogdW5rbm93bltdKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gYXJnc1swXTtcclxuICAgICAgICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyLkJ1YmJsaW5nRXZlbnQgJiZcclxuICAgICAgICAgICAgICAgIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkID09PSBmYWxzZSAmJlxyXG4gICAgICAgICAgICAgICAgdGhpcy5faXNJbml0aWFsaXNlZCA9PT0gdHJ1ZVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogSW4gc29tZSBjYXNlcyAoZS5nLiBpZiBhbiBlbGVtZW50IGlzIGNyZWF0ZWQgZnJvbSBhIERyYWdTb3VyY2UpIGl0XHJcbiAgICAgICAgICAgICAgICAgKiBkb2Vzbid0IGhhdmUgYSBwYXJlbnQgYW5kIGlzIG5vdCBhIGNoaWxkIG9mIEdyb3VuZEl0ZW0uIElmIHRoYXQncyB0aGUgY2FzZVxyXG4gICAgICAgICAgICAgICAgICogcHJvcGFnYXRlIHRoZSBidWJibGluZyBldmVudCBmcm9tIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIHN1YnN0cmVlIGRpcmVjdGx5XHJcbiAgICAgICAgICAgICAgICAgKiB0byB0aGUgbGF5b3V0TWFuYWdlclxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0dyb3VuZCA9PT0gZmFsc2UgJiYgdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGFyZW50LmVtaXRVbmtub3duKG5hbWUsIGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUV2ZW50UHJvcGFnYXRpb25Ub0xheW91dE1hbmFnZXIobmFtZSwgZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWxsIHJhdyBldmVudHMgYnViYmxlIHVwIHRvIHRoZSBHcm91bmQgZWxlbWVudC4gU29tZSBldmVudHMgdGhhdFxyXG4gICAgICogYXJlIHByb3BhZ2F0ZWQgdG8gLSBhbmQgZW1pdHRlZCBieSAtIHRoZSBsYXlvdXRNYW5hZ2VyIGhvd2V2ZXIgYXJlXHJcbiAgICAgKiBvbmx5IHN0cmluZy1iYXNlZCwgYmF0Y2hlZCBhbmQgc2FuaXRpemVkIHRvIG1ha2UgdGhlbSBtb3JlIHVzYWJsZVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50XHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzY2hlZHVsZUV2ZW50UHJvcGFnYXRpb25Ub0xheW91dE1hbmFnZXIobmFtZTogc3RyaW5nLCBldmVudDogRXZlbnRFbWl0dGVyLkJ1YmJsaW5nRXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5fdGhyb3R0bGVkRXZlbnRzLmluZGV4T2YobmFtZSkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5lbWl0VW5rbm93bihuYW1lLCBldmVudCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdFdmVudFByb3BhZ2F0aW9uc1tuYW1lXSAhPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ0V2ZW50UHJvcGFnYXRpb25zW25hbWVdID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMucHJvcGFnYXRlRXZlbnRUb0xheW91dE1hbmFnZXIobmFtZSwgZXZlbnQpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayBmb3IgZXZlbnRzIHNjaGVkdWxlZCBieSBfc2NoZWR1bGVFdmVudFByb3BhZ2F0aW9uVG9MYXlvdXRNYW5hZ2VyXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHByb3BhZ2F0ZUV2ZW50VG9MYXlvdXRNYW5hZ2VyKG5hbWU6IHN0cmluZywgZXZlbnQ6IEV2ZW50RW1pdHRlci5CdWJibGluZ0V2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5fcGVuZGluZ0V2ZW50UHJvcGFnYXRpb25zW25hbWVdID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmVtaXRVbmtub3duKG5hbWUsIGV2ZW50KTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBDb250ZW50SXRlbSB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIEFyZWEgZXh0ZW5kcyBBcmVhTGlua2VkUmVjdCB7XHJcbiAgICAgICAgc3VyZmFjZTogbnVtYmVyO1xyXG4gICAgICAgIGNvbnRlbnRJdGVtOiBDb250ZW50SXRlbTtcclxuICAgIH1cclxuICAgIC8qKiBAcHVibGljICovXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIERvY2tQb2ludCB7XHJcbiAgICAgICAgcGFyZW50OiBDb250ZW50SXRlbTtcclxuICAgICAgICBpbmRleDogbnVtYmVyIHwgbnVsbDtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAoQ29udGVudEl0ZW06Y2xhc3MpfSAqL1xyXG5leHBvcnQgdHlwZSBBYnN0cmFjdENvbnRlbnRJdGVtID0gQ29udGVudEl0ZW07XHJcbiIsImltcG9ydCB7IENvbXBvbmVudEl0ZW1Db25maWcsIEl0ZW1Db25maWcsIFJvd09yQ29sdW1uSXRlbUNvbmZpZywgU3RhY2tJdGVtQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL2NvbmZpZyc7XHJcbmltcG9ydCB7IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZywgUmVzb2x2ZWRHcm91bmRJdGVtQ29uZmlnLCBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZywgUmVzb2x2ZWRJdGVtQ29uZmlnLCBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnLCBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9yZXNvbHZlZC1jb25maWcnO1xyXG5pbXBvcnQgeyBBc3NlcnRFcnJvciwgVW5leHBlY3RlZE51bGxFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuLi9sYXlvdXQtbWFuYWdlcic7XHJcbmltcG9ydCB7IERvbUNvbnN0YW50cyB9IGZyb20gJy4uL3V0aWxzL2RvbS1jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBBcmVhTGlua2VkUmVjdCwgSXRlbVR5cGUsIFNpemVVbml0RW51bSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcclxuaW1wb3J0IHsgZ2V0RWxlbWVudENsaWVudFdpZHRoQW5kSGVpZ2h0LCBzZXRFbGVtZW50SGVpZ2h0LCBzZXRFbGVtZW50V2lkdGggfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcbmltcG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuL2NvbXBvbmVudC1pdGVtJztcclxuaW1wb3J0IHsgQ29tcG9uZW50UGFyZW50YWJsZUl0ZW0gfSBmcm9tICcuL2NvbXBvbmVudC1wYXJlbnRhYmxlLWl0ZW0nO1xyXG5pbXBvcnQgeyBDb250ZW50SXRlbSB9IGZyb20gJy4vY29udGVudC1pdGVtJztcclxuaW1wb3J0IHsgUm93T3JDb2x1bW4gfSBmcm9tICcuL3Jvdy1vci1jb2x1bW4nO1xyXG5cclxuLyoqXHJcbiAqIEdyb3VuZEl0ZW0gaXMgdGhlIENvbnRlbnRJdGVtIHdob3NlIG9uZSBjaGlsZCBpcyB0aGUgcm9vdCBDb250ZW50SXRlbSAoUm9vdCBpcyBwbGFudGVkIGluIEdyb3VuZCkuXHJcbiAqIChQcmV2aW91c2x5IGl0IHdhcyBjYWxsZWQgcm9vdCBob3dldmVyIHRoaXMgd2FzIGluY29ycmVjdCBhcyBpdHMgY2hpbGQgaXMgdGhlIHJvb3QgaXRlbSlcclxuICogVGhlcmUgaXMgb25seSBvbmUgaW5zdGFuY2Ugb2YgR3JvdW5kSXRlbSBhbmQgaXQgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIGJ5IHRoZSBMYXlvdXQgTWFuYWdlclxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmV4cG9ydCBjbGFzcyBHcm91bmRJdGVtIGV4dGVuZHMgQ29tcG9uZW50UGFyZW50YWJsZUl0ZW0ge1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2hpbGRFbGVtZW50Q29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGxheW91dE1hbmFnZXI6IExheW91dE1hbmFnZXIsIHJvb3RJdGVtQ29uZmlnOiBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnIHwgdW5kZWZpbmVkLCBjb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG5cclxuICAgICAgICBzdXBlcihsYXlvdXRNYW5hZ2VyLCBSZXNvbHZlZEdyb3VuZEl0ZW1Db25maWcuY3JlYXRlKHJvb3RJdGVtQ29uZmlnKSwgbnVsbCwgR3JvdW5kSXRlbS5jcmVhdGVFbGVtZW50KGRvY3VtZW50KSk7XHJcblxyXG4gICAgICAgIHRoaXMuaXNHcm91bmQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lciA9IHRoaXMuZWxlbWVudDtcclxuICAgICAgICB0aGlzLl9jb250YWluZXJFbGVtZW50ID0gY29udGFpbmVyRWxlbWVudDtcclxuXHJcbiAgICAgICAgLy8gaW5zZXJ0IGJlZm9yZSBhbnkgcHJlLWV4aXN0aW5nIGNvbnRlbnQgZWxlbWVudHNcclxuICAgICAgICBsZXQgYmVmb3JlOiBDaGlsZE5vZGUgfCBudWxsID0gbnVsbDtcclxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xyXG4gICAgICAgICAgICBjb25zdCBwcmV2OiBDaGlsZE5vZGUgfCBudWxsID1cclxuICAgICAgICAgICAgICAgIGJlZm9yZSA/IGJlZm9yZS5wcmV2aW91c1NpYmxpbmcgOiB0aGlzLl9jb250YWluZXJFbGVtZW50Lmxhc3RDaGlsZDtcclxuICAgICAgICAgICAgaWYgKHByZXYgaW5zdGFuY2VvZiBFbGVtZW50XHJcbiAgICAgICAgICAgICAgICAmJiBwcmV2LmNsYXNzTGlzdC5jb250YWlucyhEb21Db25zdGFudHMuQ2xhc3NOYW1lLkNvbnRlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICBiZWZvcmUgPSBwcmV2O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyRWxlbWVudC5pbnNlcnRCZWZvcmUodGhpcy5lbGVtZW50LCBiZWZvcmUpO1xyXG4gICAgfVxyXG5cclxuICAgIG92ZXJyaWRlIGluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNJbml0aWFsaXNlZCA9PT0gdHJ1ZSkgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZU5vZGVTaXplKCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5fY2hpbGRFbGVtZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuY29udGVudEl0ZW1zW2ldLmVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3VwZXIuaW5pdCgpO1xyXG5cclxuICAgICAgICB0aGlzLmluaXRDb250ZW50SXRlbXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIExvYWRzIGEgbmV3IExheW91dFxyXG4gICAgICogSW50ZXJuYWwgb25seS4gIFRvIGxvYWQgYSBuZXcgbGF5b3V0IHdpdGggQVBJLCB1c2Uge0BsaW5rIChMYXlvdXRNYW5hZ2VyOmNsYXNzKS5sb2FkTGF5b3V0fVxyXG4gICAgICovXHJcbiAgICBsb2FkUm9vdChyb290SXRlbUNvbmZpZzogUmVzb2x2ZWRSb290SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xyXG4gICAgICAgIC8vIFJlbW92ZSBleGlzdGluZyByb290IGlmIGl0IGV4aXN0c1xyXG4gICAgICAgIHRoaXMuY2xlYXJSb290KCk7XHJcblxyXG4gICAgICAgIGlmIChyb290SXRlbUNvbmZpZyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvb3RDb250ZW50SXRlbSA9IHRoaXMubGF5b3V0TWFuYWdlci5jcmVhdGVBbmRJbml0Q29udGVudEl0ZW0ocm9vdEl0ZW1Db25maWcsIHRoaXMpO1xyXG4gICAgICAgICAgICB0aGlzLmFkZENoaWxkKHJvb3RDb250ZW50SXRlbSwgMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNsZWFyUm9vdCgpOiB2b2lkIHtcclxuICAgICAgICAvLyBSZW1vdmUgZXhpc3Rpbmcgcm9vdCBpZiBpdCBleGlzdHNcclxuICAgICAgICBjb25zdCBjb250ZW50SXRlbXMgPSB0aGlzLmNvbnRlbnRJdGVtcztcclxuICAgICAgICBzd2l0Y2ggKGNvbnRlbnRJdGVtcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgY2FzZSAwOiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSAxOiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1Jvb3RDb250ZW50SXRlbSA9IGNvbnRlbnRJdGVtc1swXTtcclxuICAgICAgICAgICAgICAgIGV4aXN0aW5nUm9vdENvbnRlbnRJdGVtLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignR0lMUjA3NzIxJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgQ29udGVudEl0ZW0gY2hpbGQgdG8gcm9vdCBDb250ZW50SXRlbS5cclxuICAgICAqIEludGVybmFsIG9ubHkuICBUbyBsb2FkIGEgYWRkIHdpdGggQVBJLCB1c2Uge0BsaW5rIChMYXlvdXRNYW5hZ2VyOmNsYXNzKS5hZGRJdGVtfVxyXG4gICAgICogQHJldHVybnMgLTEgaWYgYWRkZWQgYXMgcm9vdCBvdGhlcndpc2UgaW5kZXggaW4gcm9vdCBDb250ZW50SXRlbSdzIGNvbnRlbnRcclxuICAgICAqL1xyXG4gICAgYWRkSXRlbShpdGVtQ29uZmlnOiBSb3dPckNvbHVtbkl0ZW1Db25maWcgfCBTdGFja0l0ZW1Db25maWcgfCBDb21wb25lbnRJdGVtQ29uZmlnLFxyXG4gICAgICAgIGluZGV4PzogbnVtYmVyXHJcbiAgICApOiBudW1iZXIge1xyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5jaGVja01pbmltaXNlTWF4aW1pc2VkU3RhY2soKTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRJdGVtQ29uZmlnID0gSXRlbUNvbmZpZy5yZXNvbHZlKGl0ZW1Db25maWcsIGZhbHNlKTtcclxuICAgICAgICBsZXQgcGFyZW50OiBDb250ZW50SXRlbTtcclxuICAgICAgICBpZiAodGhpcy5jb250ZW50SXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwYXJlbnQgPSB0aGlzLmNvbnRlbnRJdGVtc1swXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcclxuICAgICAgICAgICAgcGFyZW50ID0gdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHBhcmVudC5pc0NvbXBvbmVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhZGQgaXRlbSBhcyBjaGlsZCB0byBDb21wb25lbnRJdGVtJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSB0aGlzLmxheW91dE1hbmFnZXIuY3JlYXRlQW5kSW5pdENvbnRlbnRJdGVtKHJlc29sdmVkSXRlbUNvbmZpZywgcGFyZW50KTtcclxuICAgICAgICAgICAgaW5kZXggPSBwYXJlbnQuYWRkQ2hpbGQoY29udGVudEl0ZW0sIGluZGV4KTtcclxuICAgICAgICAgICAgcmV0dXJuIChwYXJlbnQgPT09IHRoaXMpID8gLTEgOiBpbmRleDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZENvbXBvbmVudEFzUm9vdChpdGVtQ29uZmlnOiBDb21wb25lbnRJdGVtQ29uZmlnKTogdm9pZCB7XHJcbiAgICAgICAgLy8gUmVtb3ZlIGV4aXN0aW5nIHJvb3QgaWYgaXQgZXhpc3RzXHJcbiAgICAgICAgdGhpcy5jbGVhclJvb3QoKTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRJdGVtQ29uZmlnID0gSXRlbUNvbmZpZy5yZXNvbHZlKGl0ZW1Db25maWcsIGZhbHNlKSBhcyBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWc7XHJcblxyXG4gICAgICAgIGlmIChyZXNvbHZlZEl0ZW1Db25maWcubWF4aW1pc2VkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUm9vdCBDb21wb25lbnQgY2Fubm90IGJlIG1heGltaXNlZCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvb3RDb250ZW50SXRlbSA9IG5ldyBDb21wb25lbnRJdGVtKHRoaXMubGF5b3V0TWFuYWdlciwgcmVzb2x2ZWRJdGVtQ29uZmlnLCB0aGlzKTtcclxuICAgICAgICAgICAgcm9vdENvbnRlbnRJdGVtLmluaXQoKTtcclxuICAgICAgICAgICAgdGhpcy5hZGRDaGlsZChyb290Q29udGVudEl0ZW0sIDApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBSb290IENvbnRlbnRJdGVtLlxyXG4gICAgICogSW50ZXJuYWwgb25seS4gIFRvIHJlcGxhY2UgUm9vdCBDb250ZW50SXRlbSB3aXRoIEFQSSwgdXNlIHtAbGluayAoTGF5b3V0TWFuYWdlcjpjbGFzcykubG9hZExheW91dH1cclxuICAgICAqL1xyXG4gICAgb3ZlcnJpZGUgYWRkQ2hpbGQoY29udGVudEl0ZW06IENvbnRlbnRJdGVtLCBpbmRleD86IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHcm91bmQgbm9kZSBjYW4gb25seSBoYXZlIGEgc2luZ2xlIGNoaWxkJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gY29udGVudEl0ZW0gPSB0aGlzLmxheW91dE1hbmFnZXIuXyRub3JtYWxpemVDb250ZW50SXRlbShjb250ZW50SXRlbSwgdGhpcyk7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lci5hcHBlbmRDaGlsZChjb250ZW50SXRlbS5lbGVtZW50KTtcclxuICAgICAgICAgICAgaW5kZXggPSBzdXBlci5hZGRDaGlsZChjb250ZW50SXRlbSwgaW5kZXgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKGZhbHNlKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0QmFzZUJ1YmJsaW5nRXZlbnQoJ3N0YXRlQ2hhbmdlZCcpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGluZGV4O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBvdmVycmlkZSBjYWxjdWxhdGVDb25maWdDb250ZW50KCk6IFJlc29sdmVkUm9vdEl0ZW1Db25maWdbXSB7XHJcbiAgICAgICAgY29uc3QgY29udGVudEl0ZW1zID0gdGhpcy5jb250ZW50SXRlbXM7XHJcbiAgICAgICAgY29uc3QgY291bnQgPSBjb250ZW50SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxSZXNvbHZlZFJvb3RJdGVtQ29uZmlnPihjb3VudCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1Db25maWcgPSBpdGVtLnRvQ29uZmlnKCk7XHJcbiAgICAgICAgICAgIGlmIChSZXNvbHZlZFJvb3RJdGVtQ29uZmlnLmlzUm9vdEl0ZW1Db25maWcoaXRlbUNvbmZpZykpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IGl0ZW1Db25maWc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ1JDQ0M2NjgzMicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc2V0U2l6ZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGlmICh3aWR0aCA9PT0gdW5kZWZpbmVkIHx8IGhlaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZShmYWxzZSk7IC8vIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIHYxLnggQVBJXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2V0RWxlbWVudFdpZHRoKHRoaXMuZWxlbWVudCwgd2lkdGgpO1xyXG4gICAgICAgICAgICBzZXRFbGVtZW50SGVpZ2h0KHRoaXMuZWxlbWVudCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIC8vIEdyb3VuZEl0ZW0gY2FuIGJlIGVtcHR5XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRFbGVtZW50V2lkdGgodGhpcy5jb250ZW50SXRlbXNbMF0uZWxlbWVudCwgd2lkdGgpO1xyXG4gICAgICAgICAgICAgICAgc2V0RWxlbWVudEhlaWdodCh0aGlzLmNvbnRlbnRJdGVtc1swXS5lbGVtZW50LCBoZWlnaHQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbnRlbnRJdGVtc1NpemUodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIFJvb3QgQ29udGVudEl0ZW0uXHJcbiAgICAgKiBJbnRlcm5hbCBvbmx5LiAgVG8gcmVwbGFjZSBSb290IENvbnRlbnRJdGVtIHdpdGggQVBJLCB1c2Uge0BsaW5rIChMYXlvdXRNYW5hZ2VyOmNsYXNzKS51cGRhdGVSb290U2l6ZX1cclxuICAgICAqL1xyXG4gICAgb3ZlcnJpZGUgdXBkYXRlU2l6ZShmb3JjZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5iZWdpblZpcnR1YWxTaXplZENvbnRhaW5lckFkZGluZygpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTm9kZVNpemUoKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVDb250ZW50SXRlbXNTaXplKGZvcmNlKTtcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuZW5kVmlydHVhbFNpemVkQ29udGFpbmVyQWRkaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVNpZGVBcmVhcygpOiBHcm91bmRJdGVtLkFyZWFbXSB7XHJcbiAgICAgICAgY29uc3QgYXJlYVNpemUgPSA1MDtcclxuXHJcbiAgICAgICAgY29uc3Qgb3Bwb3NpdGVTaWRlcyA9IEdyb3VuZEl0ZW0uQXJlYS5vcHBvc2l0ZVNpZGVzO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxHcm91bmRJdGVtLkFyZWE+KE9iamVjdC5rZXlzKG9wcG9zaXRlU2lkZXMpLmxlbmd0aCk7XHJcbiAgICAgICAgbGV0IGlkeCA9IDA7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9wcG9zaXRlU2lkZXMpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2lkZSA9IGtleSBhcyBrZXlvZiBHcm91bmRJdGVtLkFyZWEuU2lkZXM7XHJcbiAgICAgICAgICAgIGNvbnN0IGFyZWEgPSB0aGlzLmdldEVsZW1lbnRBcmVhKCkgYXMgR3JvdW5kSXRlbS5BcmVhO1xyXG4gICAgICAgICAgICBpZiAoYXJlYSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ1JDU0E3NzU1MycpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXJlYS5zaWRlID0gc2lkZTtcclxuICAgICAgICAgICAgICAgIGlmIChvcHBvc2l0ZVNpZGVzW3NpZGVdWzFdID09PSAnMicgKVxyXG4gICAgICAgICAgICAgICAgICAgIGFyZWFbc2lkZV0gPSBhcmVhW29wcG9zaXRlU2lkZXNbc2lkZV1dIC0gYXJlYVNpemU7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgYXJlYVtzaWRlXSA9IGFyZWFbb3Bwb3NpdGVTaWRlc1tzaWRlXV0gKyBhcmVhU2l6ZTtcclxuICAgICAgICAgICAgICAgIGFyZWEuc3VyZmFjZSA9IChhcmVhLngyIC0gYXJlYS54MSkgKiAoYXJlYS55MiAtIGFyZWEueTEpO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0W2lkeCsrXSA9IGFyZWE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgb3ZlcnJpZGUgaGlnaGxpZ2h0RHJvcFpvbmUoeDogbnVtYmVyLCB5OiBudW1iZXIsIGFyZWE6IEFyZWFMaW5rZWRSZWN0KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLnRhYkRyb3BQbGFjZWhvbGRlci5yZW1vdmUoKTtcclxuICAgICAgICBzdXBlci5oaWdobGlnaHREcm9wWm9uZSh4LCB5LCBhcmVhKTtcclxuICAgIH1cclxuXHJcbiAgICBvdmVycmlkZSBvbkRyb3AoY29udGVudEl0ZW06IENvbnRlbnRJdGVtLCBhcmVhOiBHcm91bmRJdGVtLkFyZWEpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgaWYgKGNvbnRlbnRJdGVtLmlzQ29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1Db25maWcgPSBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZy5jcmVhdGVEZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIC8vIHNpbmNlIFJlc29sdmVkSXRlbUNvbmZpZy5jb250ZW50SXRlbXMgbm90IHNldCB1cCwgd2UgbmVlZCB0byBhZGQgaGVhZGVyIGZyb20gQ29tcG9uZW50XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGNvbnRlbnRJdGVtIGFzIENvbXBvbmVudEl0ZW07XHJcbiAgICAgICAgICAgIGl0ZW1Db25maWcuaGVhZGVyID0gUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyLmNyZWF0ZUNvcHkoY29tcG9uZW50LmhlYWRlckNvbmZpZyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmNyZWF0ZUFuZEluaXRDb250ZW50SXRlbShpdGVtQ29uZmlnLCB0aGlzKTtcclxuICAgICAgICAgICAgc3RhY2suYWRkQ2hpbGQoY29udGVudEl0ZW0pO1xyXG4gICAgICAgICAgICBjb250ZW50SXRlbSA9IHN0YWNrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZENoaWxkKGNvbnRlbnRJdGVtKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICAgKiBJZiB0aGUgY29udGVudEl0ZW0gdGhhdCdzIGJlaW5nIGRyb3BwZWQgaXMgbm90IGRyb3BwZWQgb24gYSBTdGFjayAoY2FzZXMgd2hpY2gganVzdCBwYXNzZWQgYWJvdmUgYW5kXHJcbiAgICAgICAgICAgICAqIHdoaWNoIHdvdWxkIHdyYXAgdGhlIGNvbnRlbnRJdGVtIGluIGEgU3RhY2spIHdlIG5lZWQgdG8gY2hlY2sgd2hldGhlciBjb250ZW50SXRlbSBpcyBhIFJvd09yQ29sdW1uLlxyXG4gICAgICAgICAgICAgKiBJZiBpdCBpcywgd2UgbmVlZCB0byByZS13cmFwIGl0IGluIGEgU3RhY2sgbGlrZSBpdCB3YXMgd2hlbiBpdCB3YXMgZHJhZ2dlZCBieSBpdHMgVGFiIChpdCB3YXMgZHJhZ2dlZCEpLlxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgaWYoY29udGVudEl0ZW0udHlwZSA9PT0gSXRlbVR5cGUucm93IHx8IGNvbnRlbnRJdGVtLnR5cGUgPT09IEl0ZW1UeXBlLmNvbHVtbil7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtQ29uZmlnID0gUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcuY3JlYXRlRGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB0aGlzLmxheW91dE1hbmFnZXIuY3JlYXRlQ29udGVudEl0ZW0oaXRlbUNvbmZpZywgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICBzdGFjay5hZGRDaGlsZChjb250ZW50SXRlbSlcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtID0gc3RhY2tcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgdHlwZSA9IGFyZWEuc2lkZVswXSA9PSAneCcgPyBJdGVtVHlwZS5yb3cgOiBJdGVtVHlwZS5jb2x1bW47XHJcbiAgICAgICAgICAgIGNvbnN0IGluc2VydEJlZm9yZSA9IGFyZWEuc2lkZVsxXSA9PSAnMic7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY29udGVudEl0ZW1zWzBdO1xyXG4gICAgICAgICAgICBpZiAoIShjb2x1bW4gaW5zdGFuY2VvZiBSb3dPckNvbHVtbikgfHwgY29sdW1uLnR5cGUgIT09IHR5cGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1Db25maWcgPSBSZXNvbHZlZEl0ZW1Db25maWcuY3JlYXRlRGVmYXVsdCh0eXBlKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJvd09yQ29sdW1uID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmNyZWF0ZUNvbnRlbnRJdGVtKGl0ZW1Db25maWcsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXBsYWNlQ2hpbGQoY29sdW1uLCByb3dPckNvbHVtbik7XHJcbiAgICAgICAgICAgICAgICByb3dPckNvbHVtbi5hZGRDaGlsZChjb250ZW50SXRlbSwgaW5zZXJ0QmVmb3JlID8gMCA6IHVuZGVmaW5lZCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICByb3dPckNvbHVtbi5hZGRDaGlsZChjb2x1bW4sIGluc2VydEJlZm9yZSA/IHVuZGVmaW5lZCA6IDAsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgY29sdW1uLnNpemUgPSA1MDtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemUgPSA1MDtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemVVbml0ID0gU2l6ZVVuaXRFbnVtLlBlcmNlbnQ7XHJcbiAgICAgICAgICAgICAgICByb3dPckNvbHVtbi51cGRhdGVTaXplKGZhbHNlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmcgPSBjb2x1bW4uY29udGVudEl0ZW1zW2luc2VydEJlZm9yZSA/IDAgOiBjb2x1bW4uY29udGVudEl0ZW1zLmxlbmd0aCAtIDFdXHJcbiAgICAgICAgICAgICAgICBjb2x1bW4uYWRkQ2hpbGQoY29udGVudEl0ZW0sIGluc2VydEJlZm9yZSA/IDAgOiB1bmRlZmluZWQsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgc2libGluZy5zaXplICo9IDAuNTtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemUgPSBzaWJsaW5nLnNpemU7XHJcbiAgICAgICAgICAgICAgICBjb250ZW50SXRlbS5zaXplVW5pdCA9IFNpemVVbml0RW51bS5QZXJjZW50O1xyXG4gICAgICAgICAgICAgICAgY29sdW1uLnVwZGF0ZVNpemUoZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIE5vIENvbnRlbnRJdGVtIGNhbiBkb2NrIHdpdGggZ3JvdW5kSXRlbS4gIEhvd2V2ZXIgU3RhY2sgY2FuIGhhdmUgYSBHcm91bmRJdGVtIHBhcmVudCBhbmQgU3RhY2sgcmVxdWlyZXMgdGhhdFxyXG4gICAgLy8gaXRzIHBhcmVudCBpbXBsZW1lbnQgZG9jaygpIGZ1bmN0aW9uLiAgQWNjb3JkaW5nbHkgdGhpcyBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBidXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBhcyBpdCBzaG91bGRcclxuICAgIC8vIG5ldmVyIGJlIGNhbGxlZFxyXG4gICAgZG9jaygpOiB2b2lkIHtcclxuICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0dJRDg3NzMxJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTm8gQ29udGVudEl0ZW0gY2FuIGRvY2sgd2l0aCBncm91bmRJdGVtLiAgSG93ZXZlciBTdGFjayBjYW4gaGF2ZSBhIEdyb3VuZEl0ZW0gcGFyZW50IGFuZCBTdGFjayByZXF1aXJlcyB0aGF0XHJcbiAgICAvLyBpdHMgcGFyZW50IGltcGxlbWVudCB2YWxpZGF0ZURvY2tpbmcoKSBmdW5jdGlvbi4gIEFjY29yZGluZ2x5IHRoaXMgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgYnV0IHRocm93cyBhbiBleGNlcHRpb24gYXMgaXQgc2hvdWxkXHJcbiAgICAvLyBuZXZlciBiZSBjYWxsZWRcclxuICAgIHZhbGlkYXRlRG9ja2luZygpOiB2b2lkIHtcclxuICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0dJVkQ4NzczMicpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEFsbENvbnRlbnRJdGVtcygpOiBDb250ZW50SXRlbVtdIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IENvbnRlbnRJdGVtW10gPSBbdGhpc107XHJcbiAgICAgICAgdGhpcy5kZWVwR2V0QWxsQ29udGVudEl0ZW1zKHRoaXMuY29udGVudEl0ZW1zLCByZXN1bHQpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QWxsQ29tcG9uZW50SXRlbXMoKTogQ29tcG9uZW50SXRlbVtdIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IENvbnRlbnRJdGVtW10gPSBbXTtcclxuICAgICAgICB0aGlzLmRlZXBGaWx0ZXJDb250ZW50SXRlbXModGhpcy5jb250ZW50SXRlbXMsIHJlc3VsdCwgKGl0ZW0pID0+IGl0ZW0uaXNDb21wb25lbnQpO1xyXG4gICAgICAgIHJldHVybiA8Q29tcG9uZW50SXRlbVtdPnJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDb25maWdNYXhpbWlzZWRJdGVtcygpOiBDb250ZW50SXRlbVtdIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IENvbnRlbnRJdGVtW10gPSBbXTtcclxuICAgICAgICB0aGlzLmRlZXBGaWx0ZXJDb250ZW50SXRlbXModGhpcy5jb250ZW50SXRlbXMsIHJlc3VsdCwgKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgaWYgKENvbnRlbnRJdGVtLmlzU3RhY2soaXRlbSkgJiYgaXRlbS5pbml0aWFsV2FudE1heGltaXNlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChDb250ZW50SXRlbS5pc0NvbXBvbmVudEl0ZW0oaXRlbSkgJiYgaXRlbS5pbml0aWFsV2FudE1heGltaXNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGdldEl0ZW1zQnlQb3BJblBhcmVudElkKHBvcEluUGFyZW50SWQ6IHN0cmluZyk6IENvbnRlbnRJdGVtW10ge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogQ29udGVudEl0ZW1bXSA9IFtdO1xyXG4gICAgICAgIHRoaXMuZGVlcEZpbHRlckNvbnRlbnRJdGVtcyh0aGlzLmNvbnRlbnRJdGVtcywgcmVzdWx0LCAoaXRlbSkgPT4gaXRlbS5wb3BJblBhcmVudElkcy5pbmNsdWRlcyhwb3BJblBhcmVudElkKSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICB0b0NvbmZpZygpOiBSZXNvbHZlZEl0ZW1Db25maWcge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGdlbmVyYXRlIEdyb3VuZEl0ZW0gY29uZmlnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgc2V0QWN0aXZlQ29tcG9uZW50SXRlbShpdGVtOiBDb21wb25lbnRJdGVtLCBmb2N1czogYm9vbGVhbiwgc3VwcHJlc3NGb2N1c0V2ZW50OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgLy8gb25seSBhcHBsaWNhYmxlIGlmIENvbXBvbmVudEl0ZW0gaXMgcm9vdCBhbmQgdGhlbiBpdCBhbHdheXMgaGFzIGZvY3VzXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVOb2RlU2l6ZSgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGdldEVsZW1lbnRDbGllbnRXaWR0aEFuZEhlaWdodCh0aGlzLl9jb250YWluZXJFbGVtZW50KTtcclxuXHJcbiAgICAgICAgc2V0RWxlbWVudFdpZHRoKHRoaXMuZWxlbWVudCwgd2lkdGgpO1xyXG4gICAgICAgIHNldEVsZW1lbnRIZWlnaHQodGhpcy5lbGVtZW50LCBoZWlnaHQpO1xyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIEdyb3VuZEl0ZW0gY2FuIGJlIGVtcHR5XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgc2V0RWxlbWVudFdpZHRoKHRoaXMuY29udGVudEl0ZW1zWzBdLmVsZW1lbnQsIHdpZHRoKTtcclxuICAgICAgICAgICAgc2V0RWxlbWVudEhlaWdodCh0aGlzLmNvbnRlbnRJdGVtc1swXS5lbGVtZW50LCBoZWlnaHQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRlZXBHZXRBbGxDb250ZW50SXRlbXMoY29udGVudDogcmVhZG9ubHkgQ29udGVudEl0ZW1bXSwgcmVzdWx0OiBDb250ZW50SXRlbVtdKTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gY29udGVudFtpXTtcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goY29udGVudEl0ZW0pO1xyXG4gICAgICAgICAgICB0aGlzLmRlZXBHZXRBbGxDb250ZW50SXRlbXMoY29udGVudEl0ZW0uY29udGVudEl0ZW1zLCByZXN1bHQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRlZXBGaWx0ZXJDb250ZW50SXRlbXMoY29udGVudDogcmVhZG9ubHkgQ29udGVudEl0ZW1bXSwgcmVzdWx0OiBDb250ZW50SXRlbVtdLFxyXG4gICAgICAgIGNoZWNrQWNjZXB0RnRuOiAoKHRoaXM6IHZvaWQsIGl0ZW06IENvbnRlbnRJdGVtKSA9PiBib29sZWFuKVxyXG4gICAgKTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gY29udGVudFtpXTtcclxuICAgICAgICAgICAgaWYgKGNoZWNrQWNjZXB0RnRuKGNvbnRlbnRJdGVtKSkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY29udGVudEl0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZGVlcEZpbHRlckNvbnRlbnRJdGVtcyhjb250ZW50SXRlbS5jb250ZW50SXRlbXMsIHJlc3VsdCwgY2hlY2tBY2NlcHRGdG4pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBHcm91bmRJdGVtIHtcclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQXJlYSBleHRlbmRzIENvbnRlbnRJdGVtLkFyZWEge1xyXG4gICAgICAgIHNpZGU6IGtleW9mIHR5cGVvZiBBcmVhLlNpZGU7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBBcmVhIHtcclxuICAgICAgICBleHBvcnQgY29uc3QgZW51bSBTaWRlIHtcclxuICAgICAgICAgICAgeTIsXHJcbiAgICAgICAgICAgIHgyLFxyXG4gICAgICAgICAgICB5MSxcclxuICAgICAgICAgICAgeDEsXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBleHBvcnQgdHlwZSBTaWRlcyA9IHsgW3NpZGUgaW4ga2V5b2YgdHlwZW9mIFNpZGVdOiBrZXlvZiB0eXBlb2YgU2lkZTsgfVxyXG5cclxuICAgICAgICBleHBvcnQgY29uc3Qgb3Bwb3NpdGVTaWRlczogU2lkZXMgPSB7XHJcbiAgICAgICAgICAgIHkyOiAneTEnLFxyXG4gICAgICAgICAgICB4MjogJ3gxJyxcclxuICAgICAgICAgICAgeTE6ICd5MicsXHJcbiAgICAgICAgICAgIHgxOiAneDInLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQoZG9jdW1lbnQ6IERvY3VtZW50KTogSFRNTERpdkVsZW1lbnQge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Hb2xkZW5MYXlvdXQpO1xyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkl0ZW0pO1xyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLlJvb3QpO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IENvbXBvbmVudEl0ZW1Db25maWcsIEl0ZW1Db25maWcsIFJvd09yQ29sdW1uSXRlbUNvbmZpZywgU3RhY2tJdGVtQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL2NvbmZpZydcclxuaW1wb3J0IHsgUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcsIFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL3Jlc29sdmVkLWNvbmZpZydcclxuaW1wb3J0IHsgU3BsaXR0ZXIgfSBmcm9tICcuLi9jb250cm9scy9zcGxpdHRlcidcclxuaW1wb3J0IHsgQXNzZXJ0RXJyb3IsIFVuZXhwZWN0ZWROdWxsRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InXHJcbmltcG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuLi9sYXlvdXQtbWFuYWdlcidcclxuaW1wb3J0IHsgRG9tQ29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbHMvZG9tLWNvbnN0YW50cydcclxuaW1wb3J0IHsgSXRlbVR5cGUsIEpzb25WYWx1ZSwgU2l6ZVVuaXRFbnVtLCBXaWR0aE9ySGVpZ2h0UHJvcGVydHlOYW1lIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnXHJcbmltcG9ydCB7XHJcbiAgICBnZXRFbGVtZW50SGVpZ2h0LFxyXG4gICAgZ2V0RWxlbWVudFdpZHRoLFxyXG4gICAgZ2V0RWxlbWVudFdpZHRoQW5kSGVpZ2h0LFxyXG4gICAgbnVtYmVyVG9QaXhlbHMsXHJcbiAgICBwaXhlbHNUb051bWJlcixcclxuICAgIHNldEVsZW1lbnRIZWlnaHQsXHJcbiAgICBzZXRFbGVtZW50V2lkdGhcclxufSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIlxyXG5pbXBvcnQgeyBDb21wb25lbnRJdGVtIH0gZnJvbSAnLi9jb21wb25lbnQtaXRlbSdcclxuaW1wb3J0IHsgQ29udGVudEl0ZW0gfSBmcm9tICcuL2NvbnRlbnQtaXRlbSdcclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBjbGFzcyBSb3dPckNvbHVtbiBleHRlbmRzIENvbnRlbnRJdGVtIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NoaWxkRWxlbWVudENvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb25maWdUeXBlOiAncm93JyB8ICdjb2x1bW4nO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaXNDb2x1bW46IGJvb2xlYW47XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zcGxpdHRlclNpemU6IG51bWJlcjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3NwbGl0dGVyR3JhYlNpemU6IG51bWJlcjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RpbWVuc2lvbjogV2lkdGhPckhlaWdodFByb3BlcnR5TmFtZTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3NwbGl0dGVyOiBTcGxpdHRlcltdID0gW107XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9zcGxpdHRlclBvc2l0aW9uOiBudW1iZXIgfCBudWxsO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfc3BsaXR0ZXJNaW5Qb3NpdGlvbjogbnVtYmVyIHwgbnVsbDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3NwbGl0dGVyTWF4UG9zaXRpb246IG51bWJlciB8IG51bGw7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IoaXNDb2x1bW46IGJvb2xlYW4sIGxheW91dE1hbmFnZXI6IExheW91dE1hbmFnZXIsIGNvbmZpZzogUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX3Jvd09yQ29sdW1uUGFyZW50OiBDb250ZW50SXRlbVxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIobGF5b3V0TWFuYWdlciwgY29uZmlnLCBfcm93T3JDb2x1bW5QYXJlbnQsIFJvd09yQ29sdW1uLmNyZWF0ZUVsZW1lbnQoZG9jdW1lbnQsIGlzQ29sdW1uKSk7XHJcblxyXG4gICAgICAgIHRoaXMuaXNSb3cgPSAhaXNDb2x1bW47XHJcbiAgICAgICAgdGhpcy5pc0NvbHVtbiA9IGlzQ29sdW1uO1xyXG5cclxuICAgICAgICB0aGlzLl9jaGlsZEVsZW1lbnRDb250YWluZXIgPSB0aGlzLmVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5fc3BsaXR0ZXJTaXplID0gbGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuZGltZW5zaW9ucy5ib3JkZXJXaWR0aDtcclxuICAgICAgICB0aGlzLl9zcGxpdHRlckdyYWJTaXplID0gbGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuZGltZW5zaW9ucy5ib3JkZXJHcmFiV2lkdGg7XHJcbiAgICAgICAgdGhpcy5faXNDb2x1bW4gPSBpc0NvbHVtbjtcclxuICAgICAgICB0aGlzLl9kaW1lbnNpb24gPSBpc0NvbHVtbiA/ICdoZWlnaHQnIDogJ3dpZHRoJztcclxuICAgICAgICB0aGlzLl9zcGxpdHRlclBvc2l0aW9uID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9zcGxpdHRlck1pblBvc2l0aW9uID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9zcGxpdHRlck1heFBvc2l0aW9uID0gbnVsbDtcclxuXHJcbiAgICAgICAgc3dpdGNoIChjb25maWcudHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnJvdzpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb2x1bW46XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jb25maWdUeXBlID0gY29uZmlnLnR5cGU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignUk9DQ0NUMDA5MjUnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmV3Q29tcG9uZW50KGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZSwgY29tcG9uZW50U3RhdGU/OiBKc29uVmFsdWUsIHRpdGxlPzogc3RyaW5nLCBpbmRleD86IG51bWJlcik6IENvbXBvbmVudEl0ZW0ge1xyXG4gICAgICAgIGNvbnN0IGl0ZW1Db25maWc6IENvbXBvbmVudEl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdjb21wb25lbnQnLFxyXG4gICAgICAgICAgICBjb21wb25lbnRUeXBlLFxyXG4gICAgICAgICAgICBjb21wb25lbnRTdGF0ZSxcclxuICAgICAgICAgICAgdGl0bGUsXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gdGhpcy5uZXdJdGVtKGl0ZW1Db25maWcsIGluZGV4KSBhcyBDb21wb25lbnRJdGVtO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZENvbXBvbmVudChjb21wb25lbnRUeXBlOiBKc29uVmFsdWUsIGNvbXBvbmVudFN0YXRlPzogSnNvblZhbHVlLCB0aXRsZT86IHN0cmluZywgaW5kZXg/OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgIGNvbnN0IGl0ZW1Db25maWc6IENvbXBvbmVudEl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdjb21wb25lbnQnLFxyXG4gICAgICAgICAgICBjb21wb25lbnRUeXBlLFxyXG4gICAgICAgICAgICBjb21wb25lbnRTdGF0ZSxcclxuICAgICAgICAgICAgdGl0bGUsXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gdGhpcy5hZGRJdGVtKGl0ZW1Db25maWcsIGluZGV4KTtcclxuICAgIH1cclxuXHJcbiAgICBuZXdJdGVtKGl0ZW1Db25maWc6IFJvd09yQ29sdW1uSXRlbUNvbmZpZyB8IFN0YWNrSXRlbUNvbmZpZyB8IENvbXBvbmVudEl0ZW1Db25maWcsICBpbmRleD86IG51bWJlcik6IENvbnRlbnRJdGVtIHtcclxuICAgICAgICBpbmRleCA9IHRoaXMuYWRkSXRlbShpdGVtQ29uZmlnLCBpbmRleCk7XHJcbiAgICAgICAgY29uc3QgY3JlYXRlZEl0ZW0gPSB0aGlzLmNvbnRlbnRJdGVtc1tpbmRleF07XHJcblxyXG4gICAgICAgIGlmIChDb250ZW50SXRlbS5pc1N0YWNrKGNyZWF0ZWRJdGVtKSAmJiAoSXRlbUNvbmZpZy5pc0NvbXBvbmVudChpdGVtQ29uZmlnKSkpIHtcclxuICAgICAgICAgICAgLy8gY3JlYXRlZEl0ZW0gaXMgYSBTdGFjayB3aGljaCB3YXMgY3JlYXRlZCB0byBob2xkIHdhbnRlZCBjb21wb25lbnQuICBSZXR1cm4gY29tcG9uZW50XHJcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVkSXRlbS5jb250ZW50SXRlbXNbMF07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZWRJdGVtO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhZGRJdGVtKGl0ZW1Db25maWc6IFJvd09yQ29sdW1uSXRlbUNvbmZpZyB8IFN0YWNrSXRlbUNvbmZpZyB8IENvbXBvbmVudEl0ZW1Db25maWcsXHJcbiAgICAgICAgaW5kZXg/OiBudW1iZXJcclxuICAgICk6IG51bWJlciB7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmNoZWNrTWluaW1pc2VNYXhpbWlzZWRTdGFjaygpO1xyXG4gICAgICAgIGNvbnN0IHJlc29sdmVkSXRlbUNvbmZpZyA9IEl0ZW1Db25maWcucmVzb2x2ZShpdGVtQ29uZmlnLCBmYWxzZSk7XHJcbiAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSB0aGlzLmxheW91dE1hbmFnZXIuY3JlYXRlQW5kSW5pdENvbnRlbnRJdGVtKHJlc29sdmVkSXRlbUNvbmZpZywgdGhpcyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkQ2hpbGQoY29udGVudEl0ZW0sIGluZGV4LCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgYSBuZXcgY29udGVudEl0ZW0gdG8gdGhlIFJvdyBvciBDb2x1bW5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gY29udGVudEl0ZW0gLVxyXG4gICAgICogQHBhcmFtIGluZGV4IC0gVGhlIHBvc2l0aW9uIG9mIHRoZSBuZXcgaXRlbSB3aXRoaW4gdGhlIFJvdyBvciBDb2x1bW4uXHJcbiAgICAgKiAgICAgICAgICAgICAgICBJZiBubyBpbmRleCBpcyBwcm92aWRlZCB0aGUgaXRlbSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBlbmRcclxuICAgICAqIEBwYXJhbSBzdXNwZW5kUmVzaXplIC0gSWYgdHJ1ZSB0aGUgaXRlbXMgd29uJ3QgYmUgcmVzaXplZC4gVGhpcyB3aWxsIGxlYXZlIHRoZSBpdGVtIGluXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGFuIGluY29uc2lzdGVudCBzdGF0ZSBhbmQgaXMgb25seSBpbnRlbmRlZCB0byBiZSB1c2VkIGlmIG11bHRpcGxlXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuIG5lZWQgdG8gYmUgYWRkZWQgaW4gb25lIGdvIGFuZCByZXNpemUgaXMgY2FsbGVkIGFmdGVyd2FyZHNcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBvdmVycmlkZSBhZGRDaGlsZChjb250ZW50SXRlbTogQ29udGVudEl0ZW0sIGluZGV4PzogbnVtYmVyLCBzdXNwZW5kUmVzaXplPzogYm9vbGVhbik6IG51bWJlciB7XHJcblxyXG4gICAgICAgIC8vIGNvbnRlbnRJdGVtID0gdGhpcy5sYXlvdXRNYW5hZ2VyLl8kbm9ybWFsaXplQ29udGVudEl0ZW0oY29udGVudEl0ZW0sIHRoaXMpO1xyXG5cclxuICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpbmRleCA9IHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNwbGl0dGVyRWxlbWVudCA9IHRoaXMuY3JlYXRlU3BsaXR0ZXIoTWF0aC5tYXgoMCwgaW5kZXggLSAxKSkuZWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgIGlmIChpbmRleCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGVudEl0ZW1zW2luZGV4IC0gMV0uZWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgc3BsaXR0ZXJFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIHNwbGl0dGVyRWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgY29udGVudEl0ZW0uZWxlbWVudCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRJdGVtc1swXS5lbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgnYmVmb3JlYmVnaW4nLCBzcGxpdHRlckVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgc3BsaXR0ZXJFbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgnYmVmb3JlYmVnaW4nLCBjb250ZW50SXRlbS5lbGVtZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lci5hcHBlbmRDaGlsZChjb250ZW50SXRlbS5lbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN1cGVyLmFkZENoaWxkKGNvbnRlbnRJdGVtLCBpbmRleCk7XHJcblxyXG4gICAgICAgIGNvbnN0IG5ld0l0ZW1TaXplID0gKDEgLyB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGgpICogMTAwO1xyXG5cclxuICAgICAgICBpZiAoc3VzcGVuZFJlc2l6ZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRCYXNlQnViYmxpbmdFdmVudCgnc3RhdGVDaGFuZ2VkJyk7XHJcbiAgICAgICAgICAgIHJldHVybiBpbmRleDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXhlZENvbnRlbnRJdGVtID0gdGhpcy5jb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgIGlmIChpbmRleGVkQ29udGVudEl0ZW0gPT09IGNvbnRlbnRJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICBjb250ZW50SXRlbS5zaXplID0gbmV3SXRlbVNpemU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtU2l6ZSA9IGluZGV4ZWRDb250ZW50SXRlbS5zaXplICo9ICgxMDAgLSBuZXdJdGVtU2l6ZSkgLyAxMDA7XHJcbiAgICAgICAgICAgICAgICBpbmRleGVkQ29udGVudEl0ZW0uc2l6ZSA9IGl0ZW1TaXplO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZVNpemUoZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuZW1pdEJhc2VCdWJibGluZ0V2ZW50KCdzdGF0ZUNoYW5nZWQnKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGluZGV4O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhIGNoaWxkIG9mIHRoaXMgZWxlbWVudFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBjb250ZW50SXRlbSAtXHJcbiAgICAgKiBAcGFyYW0ga2VlcENoaWxkIC0gSWYgdHJ1ZSB0aGUgY2hpbGQgd2lsbCBiZSByZW1vdmVkLCBidXQgbm90IGRlc3Ryb3llZFxyXG4gICAgICpcclxuICAgICAqL1xyXG4gICAgb3ZlcnJpZGUgcmVtb3ZlQ2hpbGQoY29udGVudEl0ZW06IENvbnRlbnRJdGVtLCBrZWVwQ2hpbGQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuY29udGVudEl0ZW1zLmluZGV4T2YoY29udGVudEl0ZW0pO1xyXG4gICAgICAgIGNvbnN0IHNwbGl0dGVySW5kZXggPSBNYXRoLm1heChpbmRleCAtIDEsIDApO1xyXG5cclxuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuXFwndCByZW1vdmUgY2hpbGQuIENvbnRlbnRJdGVtIGlzIG5vdCBjaGlsZCBvZiB0aGlzIFJvdyBvciBDb2x1bW4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFJlbW92ZSB0aGUgc3BsaXR0ZXIgYmVmb3JlIHRoZSBpdGVtIG9yIGFmdGVyIGlmIHRoZSBpdGVtIGhhcHBlbnNcclxuICAgICAgICAgKiB0byBiZSB0aGUgZmlyc3QgaW4gdGhlIHJvdy9jb2x1bW5cclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAodGhpcy5fc3BsaXR0ZXJbc3BsaXR0ZXJJbmRleF0pIHtcclxuICAgICAgICAgICAgdGhpcy5fc3BsaXR0ZXJbc3BsaXR0ZXJJbmRleF0uZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9zcGxpdHRlci5zcGxpY2Uoc3BsaXR0ZXJJbmRleCwgMSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdXBlci5yZW1vdmVDaGlsZChjb250ZW50SXRlbSwga2VlcENoaWxkKTtcclxuXHJcbiAgICAgICAgLy8gaWYgKHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aCA9PT0gMSAmJiB0aGlzLmlzQ2xvc2FibGUgPT09IHRydWUpIHtcclxuICAgICAgICAvLyAgICAgY29uc3QgY2hpbGRJdGVtID0gdGhpcy5jb250ZW50SXRlbXNbMF07XHJcbiAgICAgICAgLy8gICAgIHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuX3Jvd09yQ29sdW1uUGFyZW50LnJlcGxhY2VDaGlsZCh0aGlzLCBjaGlsZEl0ZW0sIHRydWUpO1xyXG4gICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaXplKGZhbHNlKTtcclxuICAgICAgICB0aGlzLmVtaXRCYXNlQnViYmxpbmdFdmVudCgnc3RhdGVDaGFuZ2VkJyk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVwbGFjZXMgYSBjaGlsZCBvZiB0aGlzIFJvdyBvciBDb2x1bW4gd2l0aCBhbm90aGVyIGNvbnRlbnRJdGVtXHJcbiAgICAgKi9cclxuICAgIG92ZXJyaWRlIHJlcGxhY2VDaGlsZChvbGRDaGlsZDogQ29udGVudEl0ZW0sIG5ld0NoaWxkOiBDb250ZW50SXRlbSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNpemUgPSBvbGRDaGlsZC5zaXplO1xyXG4gICAgICAgIHN1cGVyLnJlcGxhY2VDaGlsZChvbGRDaGlsZCwgbmV3Q2hpbGQpO1xyXG4gICAgICAgIG5ld0NoaWxkLnNpemUgPSBzaXplO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2l6ZShmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5lbWl0QmFzZUJ1YmJsaW5nRXZlbnQoJ3N0YXRlQ2hhbmdlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIHdoZW5ldmVyIHRoZSBkaW1lbnNpb25zIG9mIHRoaXMgaXRlbSBvciBvbmUgb2YgaXRzIHBhcmVudHMgY2hhbmdlXHJcbiAgICAgKi9cclxuICAgIG92ZXJyaWRlIHVwZGF0ZVNpemUoZm9yY2U6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuYmVnaW5WaXJ0dWFsU2l6ZWRDb250YWluZXJBZGRpbmcoKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU5vZGVTaXplKCk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29udGVudEl0ZW1zU2l6ZShmb3JjZSk7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmVuZFZpcnR1YWxTaXplZENvbnRhaW5lckFkZGluZygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEludm9rZWQgcmVjdXJzaXZlbHkgYnkgdGhlIGxheW91dCBtYW5hZ2VyLiBDb250ZW50SXRlbS5pbml0IGFwcGVuZHNcclxuICAgICAqIHRoZSBjb250ZW50SXRlbSdzIERPTSBlbGVtZW50cyB0byB0aGUgY29udGFpbmVyLCBSb3dPckNvbHVtbiBpbml0IGFkZHMgc3BsaXR0ZXJzXHJcbiAgICAgKiBpbiBiZXR3ZWVuIHRoZW1cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBvdmVycmlkZSBpbml0KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmlzSW5pdGlhbGlzZWQgPT09IHRydWUpIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVOb2RlU2l6ZSgpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmNvbnRlbnRJdGVtc1tpXS5lbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN1cGVyLmluaXQoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGggLSAxOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5jb250ZW50SXRlbXNbaV0uZWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgdGhpcy5jcmVhdGVTcGxpdHRlcihpKS5lbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdENvbnRlbnRJdGVtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHRvQ29uZmlnKCk6IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUgYXMgJ3JvdycgfCAnY29sdW1uJyxcclxuICAgICAgICAgICAgY29udGVudDogdGhpcy5jYWxjdWxhdGVDb25maWdDb250ZW50KCkgYXMgKFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnIHwgUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcpW10sXHJcbiAgICAgICAgICAgIHNpemU6IHRoaXMuc2l6ZSxcclxuICAgICAgICAgICAgc2l6ZVVuaXQ6IHRoaXMuc2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIG1pblNpemU6IHRoaXMubWluU2l6ZSxcclxuICAgICAgICAgICAgbWluU2l6ZVVuaXQ6IHRoaXMubWluU2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxyXG4gICAgICAgICAgICBpc0Nsb3NhYmxlOiB0aGlzLmlzQ2xvc2FibGUsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHNldFBhcmVudChwYXJlbnQ6IENvbnRlbnRJdGVtKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fcm93T3JDb2x1bW5QYXJlbnQgPSBwYXJlbnQ7XHJcbiAgICAgICAgc3VwZXIuc2V0UGFyZW50KHBhcmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSB1cGRhdGVOb2RlU2l6ZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5jb250ZW50SXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVJlbGF0aXZlU2l6ZXMoKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRBYnNvbHV0ZVNpemVzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZW1pdEJhc2VCdWJibGluZ0V2ZW50KCdzdGF0ZUNoYW5nZWQnKTtcclxuICAgICAgICB0aGlzLmVtaXQoJ3Jlc2l6ZScpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHVybnMgdGhlIHJlbGF0aXZlIHNpemVzIGNhbGN1bGF0ZWQgYnkgY2FsY3VsYXRlUmVsYXRpdmVTaXplcyBpbnRvXHJcbiAgICAgKiBhYnNvbHV0ZSBwaXhlbCB2YWx1ZXMgYW5kIGFwcGxpZXMgdGhlbSB0byB0aGUgY2hpbGRyZW4ncyBET00gZWxlbWVudHNcclxuICAgICAqXHJcbiAgICAgKiBBc3NpZ25zIGFkZGl0aW9uYWwgcGl4ZWxzIHRvIGNvdW50ZXJhY3QgTWF0aC5mbG9vclxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc2V0QWJzb2x1dGVTaXplcygpIHtcclxuICAgICAgICBjb25zdCBhYnNvbHV0ZVNpemVzID0gdGhpcy5jYWxjdWxhdGVBYnNvbHV0ZVNpemVzKCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGFic29sdXRlU2l6ZXMuYWRkaXRpb25hbFBpeGVsIC0gaSA+IDApIHtcclxuICAgICAgICAgICAgICAgIGFic29sdXRlU2l6ZXMuaXRlbVNpemVzW2ldKys7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9pc0NvbHVtbikge1xyXG4gICAgICAgICAgICAgICAgc2V0RWxlbWVudFdpZHRoKHRoaXMuY29udGVudEl0ZW1zW2ldLmVsZW1lbnQsIGFic29sdXRlU2l6ZXMuY3Jvc3NBeGlzU2l6ZSk7XHJcbiAgICAgICAgICAgICAgICBzZXRFbGVtZW50SGVpZ2h0KHRoaXMuY29udGVudEl0ZW1zW2ldLmVsZW1lbnQsIGFic29sdXRlU2l6ZXMuaXRlbVNpemVzW2ldKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNldEVsZW1lbnRXaWR0aCh0aGlzLmNvbnRlbnRJdGVtc1tpXS5lbGVtZW50LCBhYnNvbHV0ZVNpemVzLml0ZW1TaXplc1tpXSk7XHJcbiAgICAgICAgICAgICAgICBzZXRFbGVtZW50SGVpZ2h0KHRoaXMuY29udGVudEl0ZW1zW2ldLmVsZW1lbnQsIGFic29sdXRlU2l6ZXMuY3Jvc3NBeGlzU2l6ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSBhYnNvbHV0ZSBzaXplcyBvZiBhbGwgb2YgdGhlIGNoaWxkcmVuIG9mIHRoaXMgSXRlbS5cclxuICAgICAqIEByZXR1cm5zIFNldCB3aXRoIGFic29sdXRlIHNpemVzIGFuZCBhZGRpdGlvbmFsIHBpeGVscy5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZUFic29sdXRlU2l6ZXMoKTogUm93T3JDb2x1bW4uQWJzb2x1dGVTaXplcyB7XHJcbiAgICAgICAgY29uc3QgdG90YWxTcGxpdHRlclNpemUgPSAodGhpcy5jb250ZW50SXRlbXMubGVuZ3RoIC0gMSkgKiB0aGlzLl9zcGxpdHRlclNpemU7XHJcbiAgICAgICAgY29uc3QgeyB3aWR0aDogZWxlbWVudFdpZHRoLCBoZWlnaHQ6IGVsZW1lbnRIZWlnaHQgfSA9IGdldEVsZW1lbnRXaWR0aEFuZEhlaWdodCh0aGlzLmVsZW1lbnQpO1xyXG5cclxuICAgICAgICBsZXQgdG90YWxTaXplOiBudW1iZXI7XHJcbiAgICAgICAgbGV0IGNyb3NzQXhpc1NpemU6IG51bWJlcjtcclxuICAgICAgICBpZiAodGhpcy5faXNDb2x1bW4pIHtcclxuICAgICAgICAgICAgdG90YWxTaXplID0gZWxlbWVudEhlaWdodCAtIHRvdGFsU3BsaXR0ZXJTaXplO1xyXG4gICAgICAgICAgICBjcm9zc0F4aXNTaXplID0gZWxlbWVudFdpZHRoO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRvdGFsU2l6ZSA9IGVsZW1lbnRXaWR0aCAtIHRvdGFsU3BsaXR0ZXJTaXplO1xyXG4gICAgICAgICAgICBjcm9zc0F4aXNTaXplID0gZWxlbWVudEhlaWdodDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB0b3RhbEFzc2lnbmVkID0gMDtcclxuICAgICAgICBjb25zdCBpdGVtU2l6ZXM6IG51bWJlcltdID0gW107XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSB0aGlzLmNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgbGV0IGl0ZW1TaXplOiBudW1iZXI7XHJcbiAgICAgICAgICAgIGlmIChjb250ZW50SXRlbS5zaXplVW5pdCA9PT0gU2l6ZVVuaXRFbnVtLlBlcmNlbnQpIHtcclxuICAgICAgICAgICAgICAgIGl0ZW1TaXplID0gTWF0aC5mbG9vcih0b3RhbFNpemUgKiAoY29udGVudEl0ZW0uc2l6ZSAvIDEwMCkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdST0NDQVM2NjkyJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRvdGFsQXNzaWduZWQgKz0gaXRlbVNpemU7XHJcbiAgICAgICAgICAgIGl0ZW1TaXplcy5wdXNoKGl0ZW1TaXplKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWxQaXhlbCA9IE1hdGguZmxvb3IodG90YWxTaXplIC0gdG90YWxBc3NpZ25lZCk7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGl0ZW1TaXplcyxcclxuICAgICAgICAgICAgYWRkaXRpb25hbFBpeGVsLFxyXG4gICAgICAgICAgICB0b3RhbFNpemUsXHJcbiAgICAgICAgICAgIGNyb3NzQXhpc1NpemUsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgdGhlIHJlbGF0aXZlIHNpemVzIG9mIGFsbCBjaGlsZHJlbiBvZiB0aGlzIEl0ZW0uIFRoZSBsb2dpY1xyXG4gICAgICogaXMgYXMgZm9sbG93czpcclxuICAgICAqXHJcbiAgICAgKiAtIEFkZCB1cCB0aGUgdG90YWwgc2l6ZSBvZiBhbGwgaXRlbXMgdGhhdCBoYXZlIGEgY29uZmlndXJlZCBzaXplXHJcbiAgICAgKlxyXG4gICAgICogLSBJZiB0aGUgdG90YWwgPT0gMTAwIChjaGVjayBmb3IgZmxvYXRpbmcgcG9pbnQgZXJyb3JzKVxyXG4gICAgICogICAgICAgIEV4Y2VsbGVudCwgam9iIGRvbmVcclxuICAgICAqXHJcbiAgICAgKiAtIElmIHRoZSB0b3RhbCBpcyBcXD4gMTAwLFxyXG4gICAgICogICAgICAgIHNldCB0aGUgc2l6ZSBvZiBpdGVtcyB3aXRob3V0IHNldCBkaW1lbnNpb25zIHRvIDEvMyBhbmQgYWRkIHRoaXMgdG8gdGhlIHRvdGFsXHJcbiAgICAgKiAgICAgICAgc2V0IHRoZSBzaXplIG9mZiBhbGwgaXRlbXMgc28gdGhhdCB0aGUgdG90YWwgaXMgaHVuZHJlZCByZWxhdGl2ZSB0byB0aGVpciBvcmlnaW5hbCBzaXplXHJcbiAgICAgKlxyXG4gICAgICogLSBJZiB0aGUgdG90YWwgaXMgXFw8IDEwMFxyXG4gICAgICogICAgICAgIElmIHRoZXJlIGFyZSBpdGVtcyB3aXRob3V0IHNldCBkaW1lbnNpb25zLCBkaXN0cmlidXRlIHRoZSByZW1haW5kZXIgdG8gMTAwIGV2ZW5seSBiZXR3ZWVuIHRoZW1cclxuICAgICAqICAgICAgICBJZiB0aGVyZSBhcmUgbm8gaXRlbXMgd2l0aG91dCBzZXQgZGltZW5zaW9ucywgaW5jcmVhc2UgYWxsIGl0ZW1zIHNpemVzIHJlbGF0aXZlIHRvXHJcbiAgICAgKiAgICAgICAgdGhlaXIgb3JpZ2luYWwgc2l6ZSBzbyB0aGF0IHRoZXkgYWRkIHVwIHRvIDEwMFxyXG4gICAgICpcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZVJlbGF0aXZlU2l6ZXMoKSB7XHJcblxyXG4gICAgICAgIGxldCB0b3RhbCA9IDA7XHJcbiAgICAgICAgY29uc3QgaXRlbXNXaXRoRnJhY3Rpb25hbFNpemU6IENvbnRlbnRJdGVtW10gPSBbXTtcclxuICAgICAgICBsZXQgdG90YWxGcmFjdGlvbmFsU2l6ZSA9IDA7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSB0aGlzLmNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgY29uc3Qgc2l6ZVVuaXQgPSBjb250ZW50SXRlbS5zaXplVW5pdDtcclxuICAgICAgICAgICAgc3dpdGNoIChzaXplVW5pdCkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBTaXplVW5pdEVudW0uUGVyY2VudDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGNvbnRlbnRJdGVtLnNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXNlIFNpemVVbml0RW51bS5GcmFjdGlvbmFsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbXNXaXRoRnJhY3Rpb25hbFNpemUucHVzaChjb250ZW50SXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdG90YWxGcmFjdGlvbmFsU2l6ZSArPSBjb250ZW50SXRlbS5zaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ1JPQ0NSUzQ5MTEwJywgSlNPTi5zdHJpbmdpZnkoY29udGVudEl0ZW0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRXZlcnl0aGluZyBhZGRzIHVwIHRvIGh1bmRyZWQsIGFsbCBnb29kIDotKVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChNYXRoLnJvdW5kKHRvdGFsKSA9PT0gMTAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzcGVjdE1pbkl0ZW1TaXplKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogQWxsb2NhdGUgdGhlIHJlbWFpbmluZyBzaXplIHRvIHRoZSBpdGVtcyB3aXRoIGEgZnJhY3Rpb25hbCBzaXplXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBpZiAoTWF0aC5yb3VuZCh0b3RhbCkgPCAxMDAgJiYgaXRlbXNXaXRoRnJhY3Rpb25hbFNpemUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZnJhY3Rpb25hbEFsbG9jYXRlZFNpemUgPSAxMDAgLSB0b3RhbDtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXNXaXRoRnJhY3Rpb25hbFNpemUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IGl0ZW1zV2l0aEZyYWN0aW9uYWxTaXplW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemUgPSBmcmFjdGlvbmFsQWxsb2NhdGVkU2l6ZSAqIChjb250ZW50SXRlbS5zaXplIC8gdG90YWxGcmFjdGlvbmFsU2l6ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEl0ZW0uc2l6ZVVuaXQgPSBTaXplVW5pdEVudW0uUGVyY2VudDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMucmVzcGVjdE1pbkl0ZW1TaXplKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBJZiB0aGUgdG90YWwgaXMgPiAxMDAsIGJ1dCB0aGVyZSBhcmUgYWxzbyBpdGVtcyB3aXRoIGEgZnJhY3Rpb25hbCBzaXplLCBhc3NpZ24gYW5vdGhlciA1MCVcclxuICAgICAgICAgICAgICAgICAqIHRvIHRoZSBmcmFjdGlvbmFsIGl0ZW1zXHJcbiAgICAgICAgICAgICAgICAgKlxyXG4gICAgICAgICAgICAgICAgICogVGhpcyB3aWxsIGJlIHJlc2V0IGluIHRoZSBuZXh0IHN0ZXBcclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKE1hdGgucm91bmQodG90YWwpID4gMTAwICYmIGl0ZW1zV2l0aEZyYWN0aW9uYWxTaXplLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zV2l0aEZyYWN0aW9uYWxTaXplLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gaXRlbXNXaXRoRnJhY3Rpb25hbFNpemVbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemUgPSA1MCAqIChjb250ZW50SXRlbS5zaXplIC8gdG90YWxGcmFjdGlvbmFsU2l6ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemVVbml0ID0gU2l6ZVVuaXRFbnVtLlBlcmNlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IDUwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogU2V0IGV2ZXJ5IGl0ZW1zIHNpemUgcmVsYXRpdmUgdG8gMTAwIHJlbGF0aXZlIHRvIGl0cyBzaXplIHRvIHRvdGFsXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IHRoaXMuY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemUgPSAoY29udGVudEl0ZW0uc2l6ZSAvIHRvdGFsKSAqIDEwMDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3BlY3RNaW5JdGVtU2l6ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRqdXN0cyB0aGUgY29sdW1uIHdpZHRocyB0byByZXNwZWN0IHRoZSBkaW1lbnNpb25zIG1pbkl0ZW1XaWR0aCBpZiBzZXQuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByZXNwZWN0TWluSXRlbVNpemUoKSB7XHJcbiAgICAgICAgaW50ZXJmYWNlIEVudHJ5IHtcclxuICAgICAgICAgICAgc2l6ZTogbnVtYmVyO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbWluSXRlbVNpemUgPSB0aGlzLmNhbGN1bGF0ZUNvbnRlbnRJdGVtTWluU2l6ZSh0aGlzKTtcclxuXHJcbiAgICAgICAgaWYgKG1pbkl0ZW1TaXplIDw9IDAgfHwgdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoIDw9IDEpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCB0b3RhbE92ZXJNaW4gPSAwO1xyXG4gICAgICAgICAgICBsZXQgdG90YWxVbmRlck1pbiA9IDA7XHJcbiAgICAgICAgICAgIGNvbnN0IGVudHJpZXNPdmVyTWluOiBFbnRyeVtdID0gW107XHJcbiAgICAgICAgICAgIGNvbnN0IGFsbEVudHJpZXM6IEVudHJ5W10gPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGFic29sdXRlU2l6ZXMgPSB0aGlzLmNhbGN1bGF0ZUFic29sdXRlU2l6ZXMoKTtcclxuXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBGaWd1cmUgb3V0IGhvdyBtdWNoIHdlIGFyZSB1bmRlciB0aGUgbWluIGl0ZW0gc2l6ZSB0b3RhbCBhbmQgaG93IG11Y2ggcm9vbSB3ZSBoYXZlIHRvIHVzZS5cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWJzb2x1dGVTaXplcy5pdGVtU2l6ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1TaXplID0gYWJzb2x1dGVTaXplcy5pdGVtU2l6ZXNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGVudHJ5OiBFbnRyeTtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtU2l6ZSA8IG1pbkl0ZW1TaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG90YWxVbmRlck1pbiArPSBtaW5JdGVtU2l6ZSAtIGl0ZW1TaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIGVudHJ5ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBtaW5JdGVtU2l6ZVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbE92ZXJNaW4gKz0gaXRlbVNpemUgLSBtaW5JdGVtU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogaXRlbVNpemVcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIGVudHJpZXNPdmVyTWluLnB1c2goZW50cnkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGFsbEVudHJpZXMucHVzaChlbnRyeSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBJZiB0aGVyZSBpcyBub3RoaW5nIHVuZGVyIG1pbiwgb3IgdGhlcmUgaXMgbm90IGVub3VnaCBvdmVyIHRvIG1ha2UgdXAgdGhlIGRpZmZlcmVuY2UsIGRvIG5vdGhpbmcuXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBpZiAodG90YWxVbmRlck1pbiA9PT0gMCB8fCB0b3RhbFVuZGVyTWluID4gdG90YWxPdmVyTWluKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIEV2ZW5seSByZWR1Y2UgYWxsIGNvbHVtbnMgdGhhdCBhcmUgb3ZlciB0aGUgbWluIGl0ZW0gd2lkdGggdG8gbWFrZSB1cCB0aGUgZGlmZmVyZW5jZS5cclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVkdWNlUGVyY2VudCA9IHRvdGFsVW5kZXJNaW4gLyB0b3RhbE92ZXJNaW47XHJcbiAgICAgICAgICAgICAgICBsZXQgcmVtYWluaW5nU2l6ZSA9IHRvdGFsVW5kZXJNaW47XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXNPdmVyTWluLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzT3Zlck1pbltpXTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWR1Y2VkU2l6ZSA9IE1hdGgucm91bmQoKGVudHJ5LnNpemUgLSBtaW5JdGVtU2l6ZSkgKiByZWR1Y2VQZXJjZW50KTtcclxuICAgICAgICAgICAgICAgICAgICByZW1haW5pbmdTaXplIC09IHJlZHVjZWRTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIGVudHJ5LnNpemUgLT0gcmVkdWNlZFNpemU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBUYWtlIGFueXRoaW5nIHJlbWFpbmluZyBmcm9tIHRoZSBsYXN0IGl0ZW0uXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmdTaXplICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWxsRW50cmllc1thbGxFbnRyaWVzLmxlbmd0aCAtIDFdLnNpemUgLT0gcmVtYWluaW5nU2l6ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIFNldCBldmVyeSBpdGVtcyBzaXplIHJlbGF0aXZlIHRvIDEwMCByZWxhdGl2ZSB0byBpdHMgc2l6ZSB0byB0b3RhbFxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSB0aGlzLmNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50SXRlbS5zaXplID0gKGFsbEVudHJpZXNbaV0uc2l6ZSAvIGFic29sdXRlU2l6ZXMudG90YWxTaXplKSAqIDEwMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBTcGxpdHRlciwgYmluZHMgZXZlbnRzIHRvIGl0IGFuZCBhZGRzXHJcbiAgICAgKiBpdCB0byB0aGUgYXJyYXkgb2Ygc3BsaXR0ZXJzIGF0IHRoZSBwb3NpdGlvbiBzcGVjaWZpZWQgYXMgdGhlIGluZGV4IGFyZ3VtZW50XHJcbiAgICAgKlxyXG4gICAgICogV2hhdCBpdCBkb2Vzbid0IGRvIHRob3VnaCBpcyBhcHBlbmQgdGhlIHNwbGl0dGVyIHRvIHRoZSBET01cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaW5kZXggLSBUaGUgcG9zaXRpb24gb2YgdGhlIHNwbGl0dGVyXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZVNwbGl0dGVyKGluZGV4OiBudW1iZXIpOiBTcGxpdHRlciB7XHJcbiAgICAgICAgY29uc3Qgc3BsaXR0ZXIgPSBuZXcgU3BsaXR0ZXIodGhpcy5faXNDb2x1bW4sIHRoaXMuX3NwbGl0dGVyU2l6ZSwgdGhpcy5fc3BsaXR0ZXJHcmFiU2l6ZSk7XHJcbiAgICAgICAgc3BsaXR0ZXIub24oJ2RyYWcnLCAob2Zmc2V0WCwgb2Zmc2V0WSkgPT4gdGhpcy5vblNwbGl0dGVyRHJhZyhzcGxpdHRlciwgb2Zmc2V0WCwgb2Zmc2V0WSkpO1xyXG4gICAgICAgIHNwbGl0dGVyLm9uKCdkcmFnU3RvcCcsICgpID0+IHRoaXMub25TcGxpdHRlckRyYWdTdG9wKHNwbGl0dGVyKSk7XHJcbiAgICAgICAgc3BsaXR0ZXIub24oJ2RyYWdTdGFydCcsICgpID0+IHRoaXMub25TcGxpdHRlckRyYWdTdGFydChzcGxpdHRlcikpO1xyXG4gICAgICAgIHRoaXMuX3NwbGl0dGVyLnNwbGljZShpbmRleCwgMCwgc3BsaXR0ZXIpO1xyXG4gICAgICAgIHJldHVybiBzcGxpdHRlcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIExvY2F0ZXMgdGhlIGluc3RhbmNlIG9mIFNwbGl0dGVyIGluIHRoZSBhcnJheSBvZlxyXG4gICAgICogcmVnaXN0ZXJlZCBzcGxpdHRlcnMgYW5kIHJldHVybnMgYSBtYXAgY29udGFpbmluZyB0aGUgY29udGVudEl0ZW1cclxuICAgICAqIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHNwbGl0dGVycywgYm90aCBvZiB3aGljaCBhcmUgYWZmZWN0ZWQgaWYgdGhlXHJcbiAgICAgKiBzcGxpdHRlciBpcyBtb3ZlZFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIEEgbWFwIG9mIGNvbnRlbnRJdGVtcyB0aGF0IHRoZSBzcGxpdHRlciBhZmZlY3RzXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRTcGxpdEl0ZW1zKHNwbGl0dGVyOiBTcGxpdHRlcikge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fc3BsaXR0ZXIuaW5kZXhPZihzcGxpdHRlcik7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGJlZm9yZTogdGhpcy5jb250ZW50SXRlbXNbaW5kZXhdLFxyXG4gICAgICAgICAgICBhZnRlcjogdGhpcy5jb250ZW50SXRlbXNbaW5kZXggKyAxXVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVDb250ZW50SXRlbU1pblNpemUoY29udGVudEl0ZW06IENvbnRlbnRJdGVtKSB7XHJcbiAgICAgICAgY29uc3QgbWluU2l6ZSA9IGNvbnRlbnRJdGVtLm1pblNpemU7XHJcbiAgICAgICAgaWYgKG1pblNpemUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZiAoY29udGVudEl0ZW0ubWluU2l6ZVVuaXQgPT09IFNpemVVbml0RW51bS5QaXhlbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1pblNpemU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ1JPQ0dNRDk4ODMxJywgSlNPTi5zdHJpbmdpZnkoY29udGVudEl0ZW0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpbWVuc2lvbnMgPSB0aGlzLmxheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLmRpbWVuc2lvbnM7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pc0NvbHVtbiA/IGRpbWVuc2lvbnMuZGVmYXVsdE1pbkl0ZW1IZWlnaHQgOiBkaW1lbnNpb25zLmRlZmF1bHRNaW5JdGVtV2lkdGg7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgbWluaW11bSBkaW1lbnNpb25zIGZvciB0aGUgZ2l2ZW4gaXRlbSB0YWtpbmcgaXRzIGNoaWxkcmVuIGludG8gY29uc2lkZXJhdGlvbi5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZUNvbnRlbnRJdGVtc1RvdGFsTWluU2l6ZShjb250ZW50SXRlbTogQ29udGVudEl0ZW0pIHtcclxuICAgICAgICBsZXQgY2hpbGRyZW5NaW5TaXplID0gMDtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBjb250ZW50SXRlbS5jb250ZW50SXRlbXMpIHtcclxuICAgICAgICAgICAgY29uc3QgbWluU2l6ZSA9IHRoaXMuY2FsY3VsYXRlQ29udGVudEl0ZW1zVG90YWxNaW5TaXplKGNoaWxkKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjb250ZW50SXRlbSBpbnN0YW5jZW9mIFJvd09yQ29sdW1uICYmIChjb250ZW50SXRlbS5pc0NvbHVtbiA9PT0gdGhpcy5faXNDb2x1bW4pKSB7XHJcbiAgICAgICAgICAgICAgICBjaGlsZHJlbk1pblNpemUgKz0gbWluU2l6ZTsgLy8gUHJvYmFibHkgbm90IHBvc3NpYmxlIChSb3cgaW5zaWRlIHJvdywgb3IgY29sdW1uIGluc2lkZSBjb2x1bW4pXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjaGlsZHJlbk1pblNpemUgPSBNYXRoLm1heChjaGlsZHJlbk1pblNpemUsIG1pblNpemUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBtaW5TaXplID0gdGhpcy5jYWxjdWxhdGVDb250ZW50SXRlbU1pblNpemUoY29udGVudEl0ZW0pO1xyXG4gICAgICAgIHJldHVybiBNYXRoLm1heChtaW5TaXplLCBjaGlsZHJlbk1pblNpemUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW52b2tlZCB3aGVuIGEgc3BsaXR0ZXIncyBkcmFnTGlzdGVuZXIgZmlyZXMgZHJhZ1N0YXJ0LiBDYWxjdWxhdGVzIHRoZSBzcGxpdHRlcnNcclxuICAgICAqIG1vdmVtZW50IGFyZWEgb25jZSAoc28gdGhhdCBpdCBkb2Vzbid0IG5lZWQgY2FsY3VsYXRpbmcgb24gZXZlcnkgbW91c2Vtb3ZlIGV2ZW50KVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25TcGxpdHRlckRyYWdTdGFydChzcGxpdHRlcjogU3BsaXR0ZXIpIHtcclxuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0U3BsaXRJdGVtcyhzcGxpdHRlcik7XHJcblxyXG4gICAgICAgIGNvbnN0IGJlZm9yZVdpZHRoID0gcGl4ZWxzVG9OdW1iZXIoaXRlbXMuYmVmb3JlLmVsZW1lbnQuc3R5bGVbdGhpcy5fZGltZW5zaW9uXSk7XHJcbiAgICAgICAgY29uc3QgYWZ0ZXJTaXplID0gcGl4ZWxzVG9OdW1iZXIoaXRlbXMuYWZ0ZXIuZWxlbWVudC5zdHlsZVt0aGlzLl9kaW1lbnNpb25dKTtcclxuICAgICAgICBjb25zdCBiZWZvcmVNaW5TaXplID0gdGhpcy5jYWxjdWxhdGVDb250ZW50SXRlbXNUb3RhbE1pblNpemUoaXRlbXMuYmVmb3JlKTtcclxuICAgICAgICBjb25zdCBhZnRlck1pblNpemUgPSB0aGlzLmNhbGN1bGF0ZUNvbnRlbnRJdGVtc1RvdGFsTWluU2l6ZShpdGVtcy5hZnRlcik7XHJcblxyXG4gICAgICAgIHRoaXMuX3NwbGl0dGVyUG9zaXRpb24gPSAwO1xyXG4gICAgICAgIHRoaXMuX3NwbGl0dGVyTWluUG9zaXRpb24gPSBNYXRoLm1pbigwLCAtMSAqIChiZWZvcmVXaWR0aCAtIGJlZm9yZU1pblNpemUpKTtcclxuICAgICAgICB0aGlzLl9zcGxpdHRlck1heFBvc2l0aW9uID0gTWF0aC5tYXgoMCwgYWZ0ZXJTaXplIC0gYWZ0ZXJNaW5TaXplKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEludm9rZWQgd2hlbiBhIHNwbGl0dGVyJ3MgRHJhZ0xpc3RlbmVyIGZpcmVzIGRyYWcuIFVwZGF0ZXMgdGhlIHNwbGl0dGVyJ3MgRE9NIHBvc2l0aW9uLFxyXG4gICAgICogYnV0IG5vdCB0aGUgc2l6ZXMgb2YgdGhlIGVsZW1lbnRzIHRoZSBzcGxpdHRlciBjb250cm9scyBpbiBvcmRlciB0byBtaW5pbWl6ZSByZXNpemUgZXZlbnRzXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHNwbGl0dGVyIC1cclxuICAgICAqIEBwYXJhbSBvZmZzZXRYIC0gUmVsYXRpdmUgcGl4ZWwgdmFsdWVzIHRvIHRoZSBzcGxpdHRlcidzIG9yaWdpbmFsIHBvc2l0aW9uLiBDYW4gYmUgbmVnYXRpdmVcclxuICAgICAqIEBwYXJhbSBvZmZzZXRZIC0gUmVsYXRpdmUgcGl4ZWwgdmFsdWVzIHRvIHRoZSBzcGxpdHRlcidzIG9yaWdpbmFsIHBvc2l0aW9uLiBDYW4gYmUgbmVnYXRpdmVcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uU3BsaXR0ZXJEcmFnKHNwbGl0dGVyOiBTcGxpdHRlciwgb2Zmc2V0WDogbnVtYmVyLCBvZmZzZXRZOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgb2Zmc2V0ID0gdGhpcy5faXNDb2x1bW4gPyBvZmZzZXRZIDogb2Zmc2V0WDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3NwbGl0dGVyTWluUG9zaXRpb24gPT09IG51bGwgfHwgdGhpcy5fc3BsaXR0ZXJNYXhQb3NpdGlvbiA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignUk9DT1NENTkyMjYnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb2Zmc2V0ID0gTWF0aC5tYXgob2Zmc2V0LCB0aGlzLl9zcGxpdHRlck1pblBvc2l0aW9uKTtcclxuICAgICAgICBvZmZzZXQgPSBNYXRoLm1pbihvZmZzZXQsIHRoaXMuX3NwbGl0dGVyTWF4UG9zaXRpb24pO1xyXG5cclxuICAgICAgICB0aGlzLl9zcGxpdHRlclBvc2l0aW9uID0gb2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IG9mZnNldFBpeGVscyA9IG51bWJlclRvUGl4ZWxzKG9mZnNldCk7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzQ29sdW1uKSB7XHJcbiAgICAgICAgICAgIHNwbGl0dGVyLmVsZW1lbnQuc3R5bGUudG9wID0gb2Zmc2V0UGl4ZWxzO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNwbGl0dGVyLmVsZW1lbnQuc3R5bGUubGVmdCA9IG9mZnNldFBpeGVscztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnZva2VkIHdoZW4gYSBzcGxpdHRlcidzIERyYWdMaXN0ZW5lciBmaXJlcyBkcmFnU3RvcC4gUmVzZXRzIHRoZSBzcGxpdHRlcnMgRE9NIHBvc2l0aW9uLFxyXG4gICAgICogYW5kIGFwcGxpZXMgdGhlIG5ldyBzaXplcyB0byB0aGUgZWxlbWVudHMgYmVmb3JlIGFuZCBhZnRlciB0aGUgc3BsaXR0ZXIgYW5kIHRoZWlyIGNoaWxkcmVuXHJcbiAgICAgKiBvbiB0aGUgbmV4dCBhbmltYXRpb24gZnJhbWVcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uU3BsaXR0ZXJEcmFnU3RvcChzcGxpdHRlcjogU3BsaXR0ZXIpIHtcclxuICAgICAgICBpZiAodGhpcy5fc3BsaXR0ZXJQb3NpdGlvbiA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignUk9DT1NEUzY2OTMyJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldFNwbGl0SXRlbXMoc3BsaXR0ZXIpO1xyXG4gICAgICAgICAgICBjb25zdCBzaXplQmVmb3JlID0gcGl4ZWxzVG9OdW1iZXIoaXRlbXMuYmVmb3JlLmVsZW1lbnQuc3R5bGVbdGhpcy5fZGltZW5zaW9uXSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNpemVBZnRlciA9IHBpeGVsc1RvTnVtYmVyKGl0ZW1zLmFmdGVyLmVsZW1lbnQuc3R5bGVbdGhpcy5fZGltZW5zaW9uXSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNwbGl0dGVyUG9zaXRpb25JblJhbmdlID0gKHRoaXMuX3NwbGl0dGVyUG9zaXRpb24gKyBzaXplQmVmb3JlKSAvIChzaXplQmVmb3JlICsgc2l6ZUFmdGVyKTtcclxuICAgICAgICAgICAgY29uc3QgdG90YWxSZWxhdGl2ZVNpemUgPSBpdGVtcy5iZWZvcmUuc2l6ZSArIGl0ZW1zLmFmdGVyLnNpemU7XHJcblxyXG4gICAgICAgICAgICBpdGVtcy5iZWZvcmUuc2l6ZSA9IHNwbGl0dGVyUG9zaXRpb25JblJhbmdlICogdG90YWxSZWxhdGl2ZVNpemU7XHJcbiAgICAgICAgICAgIGl0ZW1zLmFmdGVyLnNpemUgPSAoMSAtIHNwbGl0dGVyUG9zaXRpb25JblJhbmdlKSAqIHRvdGFsUmVsYXRpdmVTaXplO1xyXG5cclxuICAgICAgICAgICAgc3BsaXR0ZXIuZWxlbWVudC5zdHlsZS50b3AgPSBudW1iZXJUb1BpeGVscygwKTtcclxuICAgICAgICAgICAgc3BsaXR0ZXIuZWxlbWVudC5zdHlsZS5sZWZ0ID0gbnVtYmVyVG9QaXhlbHMoMCk7XHJcblxyXG4gICAgICAgICAgICBnbG9iYWxUaGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLnVwZGF0ZVNpemUoZmFsc2UpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgUm93T3JDb2x1bW4ge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGludGVyZmFjZSBBYnNvbHV0ZVNpemVzIHtcclxuICAgICAgICBpdGVtU2l6ZXM6IG51bWJlcltdLFxyXG4gICAgICAgIGFkZGl0aW9uYWxQaXhlbDogbnVtYmVyLFxyXG4gICAgICAgIHRvdGFsU2l6ZTogbnVtYmVyLFxyXG4gICAgICAgIGNyb3NzQXhpc1NpemU6IG51bWJlclxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRFbGVtZW50RGltZW5zaW9uU2l6ZShlbGVtZW50OiBIVE1MRWxlbWVudCwgZGltZW5zaW9uOiBXaWR0aE9ySGVpZ2h0UHJvcGVydHlOYW1lKTogbnVtYmVyIHtcclxuICAgICAgICBpZiAoZGltZW5zaW9uID09PSAnd2lkdGgnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBnZXRFbGVtZW50V2lkdGgoZWxlbWVudCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGdldEVsZW1lbnRIZWlnaHQoZWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBzZXRFbGVtZW50RGltZW5zaW9uU2l6ZShlbGVtZW50OiBIVE1MRWxlbWVudCwgZGltZW5zaW9uOiBXaWR0aE9ySGVpZ2h0UHJvcGVydHlOYW1lLCB2YWx1ZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGRpbWVuc2lvbiA9PT0gJ3dpZHRoJykge1xyXG4gICAgICAgICAgICByZXR1cm4gc2V0RWxlbWVudFdpZHRoKGVsZW1lbnQsIHZhbHVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gc2V0RWxlbWVudEhlaWdodChlbGVtZW50LCB2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbGVtZW50KGRvY3VtZW50OiBEb2N1bWVudCwgaXNDb2x1bW46IGJvb2xlYW4pOiBIVE1MRGl2RWxlbWVudCB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkl0ZW0pO1xyXG4gICAgICAgIGlmIChpc0NvbHVtbikge1xyXG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Db2x1bW4pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLlJvdyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IENvbXBvbmVudEl0ZW1Db25maWcsIEl0ZW1Db25maWcgfSBmcm9tICcuLi9jb25maWcvY29uZmlnJztcclxuaW1wb3J0IHsgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnLCBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZywgUmVzb2x2ZWRJdGVtQ29uZmlnLCBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9yZXNvbHZlZC1jb25maWcnO1xyXG5pbXBvcnQgeyBIZWFkZXIgfSBmcm9tICcuLi9jb250cm9scy9oZWFkZXInO1xyXG5pbXBvcnQgeyBBc3NlcnRFcnJvciwgVW5leHBlY3RlZE51bGxFcnJvciwgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgTGF5b3V0TWFuYWdlciB9IGZyb20gJy4uL2xheW91dC1tYW5hZ2VyJztcclxuaW1wb3J0IHsgRG9tQ29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbHMvZG9tLWNvbnN0YW50cyc7XHJcbmltcG9ydCB7IERyYWdMaXN0ZW5lciB9IGZyb20gJy4uL3V0aWxzL2RyYWctbGlzdGVuZXInO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi91dGlscy9ldmVudC1lbWl0dGVyJztcclxuaW1wb3J0IHsgQXJlYUxpbmtlZFJlY3QsIEl0ZW1UeXBlLCBKc29uVmFsdWUsIFNpZGUsIFNpemVVbml0RW51bSwgV2lkdGhBbmRIZWlnaHQsIFdpZHRoT3JIZWlnaHRQcm9wZXJ0eU5hbWUgfSBmcm9tICcuLi91dGlscy90eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgICBnZXRFbGVtZW50V2lkdGhBbmRIZWlnaHQsXHJcbiAgICBzZXRFbGVtZW50RGlzcGxheVZpc2liaWxpdHksXHJcbiAgICBzZXRFbGVtZW50SGVpZ2h0LFxyXG4gICAgc2V0RWxlbWVudFdpZHRoXHJcbn0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRJdGVtIH0gZnJvbSAnLi9jb21wb25lbnQtaXRlbSc7XHJcbmltcG9ydCB7IENvbXBvbmVudFBhcmVudGFibGVJdGVtIH0gZnJvbSAnLi9jb21wb25lbnQtcGFyZW50YWJsZS1pdGVtJztcclxuaW1wb3J0IHsgQ29udGVudEl0ZW0gfSBmcm9tICcuL2NvbnRlbnQtaXRlbSc7XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgY2xhc3MgU3RhY2sgZXh0ZW5kcyBDb21wb25lbnRQYXJlbnRhYmxlSXRlbSB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9oZWFkZXJDb25maWc6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlciB8IHVuZGVmaW5lZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2hlYWRlcjogSGVhZGVyO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2hpbGRFbGVtZW50Q29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX21heGltaXNlZEVuYWJsZWQ6IGJvb2xlYW47XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9hY3RpdmVDb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtIHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfZHJvcFNlZ21lbnQ6IFN0YWNrLlNlZ21lbnQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9kcm9wSW5kZXg6IG51bWJlcjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2NvbnRlbnRBcmVhRGltZW5zaW9uczogU3RhY2suQ29udGVudEFyZWFEaW1lbnNpb25zO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaGVhZGVyU2lkZUNoYW5nZWQgPSBmYWxzZTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2luaXRpYWxXYW50TWF4aW1pc2U6IGJvb2xlYW47XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9pbml0aWFsQWN0aXZlSXRlbUluZGV4OiBudW1iZXI7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfcmVzaXplTGlzdGVuZXIgPSAoKSA9PiB0aGlzLmhhbmRsZVJlc2l6ZSgpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfbWF4aW1pc2VkTGlzdGVuZXIgPSAoKSA9PiB0aGlzLmhhbmRsZU1heGltaXNlZCgpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfbWluaW1pc2VkTGlzdGVuZXIgPSAoKSA9PiB0aGlzLmhhbmRsZU1pbmltaXNlZCgpO1xyXG5cclxuICAgIGdldCBjaGlsZEVsZW1lbnRDb250YWluZXIoKTogSFRNTEVsZW1lbnQgeyByZXR1cm4gdGhpcy5fY2hpbGRFbGVtZW50Q29udGFpbmVyOyB9XHJcbiAgICBnZXQgaGVhZGVyKCk6IEhlYWRlciB7IHJldHVybiB0aGlzLl9oZWFkZXI7IH1cclxuICAgIGdldCBoZWFkZXJTaG93KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5faGVhZGVyLnNob3c7IH1cclxuICAgIGdldCBoZWFkZXJTaWRlKCk6IFNpZGUgeyByZXR1cm4gdGhpcy5faGVhZGVyLnNpZGU7IH1cclxuICAgIGdldCBoZWFkZXJMZWZ0UmlnaHRTaWRlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2hlYWRlci5sZWZ0UmlnaHRTaWRlZDsgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZ2V0IGNvbnRlbnRBcmVhRGltZW5zaW9ucygpOiBTdGFjay5Db250ZW50QXJlYURpbWVuc2lvbnMgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fY29udGVudEFyZWFEaW1lbnNpb25zOyB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBnZXQgaW5pdGlhbFdhbnRNYXhpbWlzZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2luaXRpYWxXYW50TWF4aW1pc2U7IH1cclxuICAgIGdldCBpc01heGltaXNlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMgPT09IHRoaXMubGF5b3V0TWFuYWdlci5tYXhpbWlzZWRTdGFjazsgfVxyXG4gICAgZ2V0IHN0YWNrUGFyZW50KCk6IENvbnRlbnRJdGVtIHtcclxuICAgICAgICBpZiAoIXRoaXMucGFyZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU3RhY2sgc2hvdWxkIGFsd2F5cyBoYXZlIGEgcGFyZW50Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3RvcihsYXlvdXRNYW5hZ2VyOiBMYXlvdXRNYW5hZ2VyLCBjb25maWc6IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnLCBwYXJlbnQ6IENvbnRlbnRJdGVtKSB7XHJcbiAgICAgICAgc3VwZXIobGF5b3V0TWFuYWdlciwgY29uZmlnLCBwYXJlbnQsIFN0YWNrLmNyZWF0ZUVsZW1lbnQoZG9jdW1lbnQpKTtcclxuXHJcbiAgICAgICAgdGhpcy5faGVhZGVyQ29uZmlnID0gY29uZmlnLmhlYWRlcjtcclxuICAgICAgICBjb25zdCBsYXlvdXRIZWFkZXJDb25maWcgPSBsYXlvdXRNYW5hZ2VyLmxheW91dENvbmZpZy5oZWFkZXI7XHJcbiAgICAgICAgY29uc3QgY29uZmlnQ29udGVudCA9IGNvbmZpZy5jb250ZW50O1xyXG4gICAgICAgIC8vIElmIHN0YWNrIGhhcyBvbmx5IG9uZSBjb21wb25lbnQsIHRoZW4gd2UgY2FuIGFsc28gY2hlY2sgdGhpcyBmb3IgaGVhZGVyIHNldHRpbmdzXHJcbiAgICAgICAgbGV0IGNvbXBvbmVudEhlYWRlckNvbmZpZzogUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGlmIChjb25maWdDb250ZW50Lmxlbmd0aCAhPT0gMSkge1xyXG4gICAgICAgICAgICBjb21wb25lbnRIZWFkZXJDb25maWcgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgZmlyc3RDaGlsZEl0ZW1Db25maWcgPSBjb25maWdDb250ZW50WzBdO1xyXG4gICAgICAgICAgICBjb21wb25lbnRIZWFkZXJDb25maWcgPSAoZmlyc3RDaGlsZEl0ZW1Db25maWcgYXMgUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcpLmhlYWRlcjsgLy8gd2lsbCBiZSB1bmRlZmluZWQgaWYgbm90IGNvbXBvbmVudCAoYW5kIHdvbnQgYmUgc3RhY2spXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9pbml0aWFsV2FudE1heGltaXNlID0gY29uZmlnLm1heGltaXNlZDtcclxuICAgICAgICB0aGlzLl9pbml0aWFsQWN0aXZlSXRlbUluZGV4ID0gY29uZmlnLmFjdGl2ZUl0ZW1JbmRleCA/PyAwOyAvLyBtYWtlIHN1cmUgZGVmaW5lZFxyXG5cclxuICAgICAgICAvLyBjaGVjayBmb3IgZGVmaW5lZCB2YWx1ZSBmb3IgZWFjaCBpdGVtIGluIG9yZGVyIG9mIFN0YWNrICh0aGlzIEl0ZW0pLCBDb21wb25lbnQgKGZpcnN0IGNoaWxkKSwgTWFuYWdlci5cclxuICAgICAgICBjb25zdCBzaG93ID0gdGhpcy5faGVhZGVyQ29uZmlnPy5zaG93ID8/IGNvbXBvbmVudEhlYWRlckNvbmZpZz8uc2hvdyA/PyBsYXlvdXRIZWFkZXJDb25maWcuc2hvdztcclxuICAgICAgICBjb25zdCBwb3BvdXQgPSB0aGlzLl9oZWFkZXJDb25maWc/LnBvcG91dCA/PyBjb21wb25lbnRIZWFkZXJDb25maWc/LnBvcG91dCA/PyBsYXlvdXRIZWFkZXJDb25maWcucG9wb3V0O1xyXG4gICAgICAgIGNvbnN0IG1heGltaXNlID0gdGhpcy5faGVhZGVyQ29uZmlnPy5tYXhpbWlzZSA/PyBjb21wb25lbnRIZWFkZXJDb25maWc/Lm1heGltaXNlID8/IGxheW91dEhlYWRlckNvbmZpZy5tYXhpbWlzZTtcclxuICAgICAgICBjb25zdCBjbG9zZSA9IHRoaXMuX2hlYWRlckNvbmZpZz8uY2xvc2UgPz8gY29tcG9uZW50SGVhZGVyQ29uZmlnPy5jbG9zZSA/PyBsYXlvdXRIZWFkZXJDb25maWcuY2xvc2U7XHJcbiAgICAgICAgY29uc3QgbWluaW1pc2UgPSB0aGlzLl9oZWFkZXJDb25maWc/Lm1pbmltaXNlID8/IGNvbXBvbmVudEhlYWRlckNvbmZpZz8ubWluaW1pc2UgPz8gbGF5b3V0SGVhZGVyQ29uZmlnLm1pbmltaXNlO1xyXG4gICAgICAgIGNvbnN0IHRhYkRyb3Bkb3duID0gdGhpcy5faGVhZGVyQ29uZmlnPy50YWJEcm9wZG93biA/PyBjb21wb25lbnRIZWFkZXJDb25maWc/LnRhYkRyb3Bkb3duID8/IGxheW91dEhlYWRlckNvbmZpZy50YWJEcm9wZG93bjtcclxuICAgICAgICB0aGlzLl9tYXhpbWlzZWRFbmFibGVkID0gbWF4aW1pc2UgIT09IGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IGhlYWRlclNldHRpbmdzOiBIZWFkZXIuU2V0dGluZ3MgPSB7XHJcbiAgICAgICAgICAgIHNob3c6IHNob3cgIT09IGZhbHNlLFxyXG4gICAgICAgICAgICBzaWRlOiBzaG93ID09PSBmYWxzZSA/IFNpZGUudG9wIDogc2hvdyxcclxuICAgICAgICAgICAgcG9wb3V0RW5hYmxlZDogcG9wb3V0ICE9PSBmYWxzZSxcclxuICAgICAgICAgICAgcG9wb3V0TGFiZWw6IHBvcG91dCA9PT0gZmFsc2UgPyAnJyA6IHBvcG91dCxcclxuICAgICAgICAgICAgbWF4aW1pc2VFbmFibGVkOiB0aGlzLl9tYXhpbWlzZWRFbmFibGVkLFxyXG4gICAgICAgICAgICBtYXhpbWlzZUxhYmVsOiBtYXhpbWlzZSA9PT0gZmFsc2UgPyAnJyA6IG1heGltaXNlLFxyXG4gICAgICAgICAgICBjbG9zZUVuYWJsZWQ6IGNsb3NlICE9PSBmYWxzZSxcclxuICAgICAgICAgICAgY2xvc2VMYWJlbDogY2xvc2UgPT09IGZhbHNlID8gJycgOiBjbG9zZSxcclxuICAgICAgICAgICAgbWluaW1pc2VFbmFibGVkOiB0cnVlLFxyXG4gICAgICAgICAgICBtaW5pbWlzZUxhYmVsOiBtaW5pbWlzZSxcclxuICAgICAgICAgICAgdGFiRHJvcGRvd25FbmFibGVkOiB0YWJEcm9wZG93biAhPT0gZmFsc2UsXHJcbiAgICAgICAgICAgIHRhYkRyb3Bkb3duTGFiZWw6IHRhYkRyb3Bkb3duID09PSBmYWxzZSA/ICcnIDogdGFiRHJvcGRvd24sXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5faGVhZGVyID0gbmV3IEhlYWRlcihsYXlvdXRNYW5hZ2VyLFxyXG4gICAgICAgICAgICB0aGlzLCBoZWFkZXJTZXR0aW5ncyxcclxuICAgICAgICAgICAgKCkgPT4gdGhpcy5nZXRBY3RpdmVDb21wb25lbnRJdGVtKCksXHJcbiAgICAgICAgICAgICgpID0+IHRoaXMucmVtb3ZlKCksXHJcbiAgICAgICAgICAgICgpID0+IHRoaXMuaGFuZGxlUG9wb3V0RXZlbnQoKSxcclxuICAgICAgICAgICAgKCkgPT4gdGhpcy50b2dnbGVNYXhpbWlzZSgpLFxyXG4gICAgICAgICAgICAoZXYpID0+IHRoaXMuaGFuZGxlSGVhZGVyQ2xpY2tFdmVudChldiksXHJcbiAgICAgICAgICAgIChldikgPT4gdGhpcy5oYW5kbGVIZWFkZXJUb3VjaFN0YXJ0RXZlbnQoZXYpLFxyXG4gICAgICAgICAgICAoaXRlbSkgPT4gdGhpcy5oYW5kbGVIZWFkZXJDb21wb25lbnRSZW1vdmVFdmVudChpdGVtKSxcclxuICAgICAgICAgICAgKGl0ZW0pID0+IHRoaXMuaGFuZGxlSGVhZGVyQ29tcG9uZW50Rm9jdXNFdmVudChpdGVtKSxcclxuICAgICAgICAgICAgKHgsIHksIGRyYWdMaXN0ZW5lciwgaXRlbSkgPT4gdGhpcy5oYW5kbGVIZWFkZXJDb21wb25lbnRTdGFydERyYWdFdmVudCh4LCB5LCBkcmFnTGlzdGVuZXIsIGl0ZW0pLFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIHRoaXMuX2Ryb3Bab25lcyA9IHt9O1xyXG5cclxuICAgICAgICB0aGlzLmlzU3RhY2sgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLl9jaGlsZEVsZW1lbnRDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWN0aW9uJyk7XHJcbiAgICAgICAgdGhpcy5fY2hpbGRFbGVtZW50Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5JdGVtcyk7XHJcblxyXG4gICAgICAgIHRoaXMub24oJ3Jlc2l6ZScsIHRoaXMuX3Jlc2l6ZUxpc3RlbmVyKTtcclxuICAgICAgICBpZiAodGhpcy5fbWF4aW1pc2VkRW5hYmxlZCkge1xyXG4gICAgICAgICAgICB0aGlzLm9uKCdtYXhpbWlzZWQnLCB0aGlzLl9tYXhpbWlzZWRMaXN0ZW5lcik7XHJcbiAgICAgICAgICAgIHRoaXMub24oJ21pbmltaXNlZCcsIHRoaXMuX21pbmltaXNlZExpc3RlbmVyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9oZWFkZXIuZWxlbWVudCk7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lcik7XHJcblxyXG4gICAgICAgIHRoaXMuc2V0dXBIZWFkZXJQb3NpdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIG92ZXJyaWRlIHVwZGF0ZVNpemUoZm9yY2U6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuYmVnaW5WaXJ0dWFsU2l6ZWRDb250YWluZXJBZGRpbmcoKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU5vZGVTaXplKCk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29udGVudEl0ZW1zU2l6ZShmb3JjZSk7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmVuZFZpcnR1YWxTaXplZENvbnRhaW5lckFkZGluZygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBvdmVycmlkZSBpbml0KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmlzSW5pdGlhbGlzZWQgPT09IHRydWUpIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVOb2RlU2l6ZSgpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmNvbnRlbnRJdGVtc1tpXS5lbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN1cGVyLmluaXQoKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGVudEl0ZW1zID0gdGhpcy5jb250ZW50SXRlbXM7XHJcbiAgICAgICAgY29uc3QgY29udGVudEl0ZW1Db3VudCA9IGNvbnRlbnRJdGVtcy5sZW5ndGg7XHJcbiAgICAgICAgaWYgKGNvbnRlbnRJdGVtQ291bnQgPiAwKSB7IC8vIGNvbnRlbnRJdGVtQ291bnQgd2lsbCBiZSAwIG9uIGRyYWcgZHJvcFxyXG4gICAgICAgICAgICBpZiAodGhpcy5faW5pdGlhbEFjdGl2ZUl0ZW1JbmRleCA8IDAgfHwgdGhpcy5faW5pdGlhbEFjdGl2ZUl0ZW1JbmRleCA+PSBjb250ZW50SXRlbUNvdW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFjdGl2ZUl0ZW1JbmRleCBvdXQgb2YgcmFuZ2U6ICR7dGhpcy5faW5pdGlhbEFjdGl2ZUl0ZW1JbmRleH0gaWQ6ICR7dGhpcy5pZH1gKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudEl0ZW1Db3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSBjb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoY29udGVudEl0ZW0gaW5zdGFuY2VvZiBDb21wb25lbnRJdGVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFN0YWNrIENvbnRlbnQgSXRlbSBpcyBub3Qgb2YgdHlwZSBDb21wb25lbnRJdGVtOiAke2l9IGlkOiAke3RoaXMuaWR9YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faGVhZGVyLmNyZWF0ZVRhYihjb250ZW50SXRlbSwgaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEl0ZW0uY29udGFpbmVyLnNldEJhc2VMb2dpY2FsWkluZGV4KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlQ29tcG9uZW50SXRlbShjb250ZW50SXRlbXNbdGhpcy5faW5pdGlhbEFjdGl2ZUl0ZW1JbmRleF0gYXMgQ29tcG9uZW50SXRlbSwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuX2hlYWRlci51cGRhdGVUYWJTaXplcygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmluaXRDb250ZW50SXRlbXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAoU3RhY2s6Y2xhc3MpLnNldEFjdGl2ZUNvbXBvbmVudEl0ZW19ICovXHJcbiAgICBzZXRBY3RpdmVDb250ZW50SXRlbShpdGVtOiBDb250ZW50SXRlbSk6IHZvaWQge1xyXG4gICAgICAgIGlmICghQ29udGVudEl0ZW0uaXNDb21wb25lbnRJdGVtKGl0ZW0pKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU3RhY2suc2V0QWN0aXZlQ29udGVudEl0ZW06IGl0ZW0gaXMgbm90IGEgQ29tcG9uZW50SXRlbScpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlQ29tcG9uZW50SXRlbShpdGVtLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNldEFjdGl2ZUNvbXBvbmVudEl0ZW0oY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSwgZm9jdXM6IGJvb2xlYW4sIHN1cHByZXNzRm9jdXNFdmVudCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZUNvbXBvbmVudEl0ZW0gIT09IGNvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29udGVudEl0ZW1zLmluZGV4T2YoY29tcG9uZW50SXRlbSkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbXBvbmVudEl0ZW0gaXMgbm90IGEgY2hpbGQgb2YgdGhpcyBzdGFjaycpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmJlZ2luU2l6ZUludmFsaWRhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fYWN0aXZlQ29tcG9uZW50SXRlbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FjdGl2ZUNvbXBvbmVudEl0ZW0uaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmVDb21wb25lbnRJdGVtID0gY29tcG9uZW50SXRlbTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9oZWFkZXIucHJvY2Vzc0FjdGl2ZUNvbXBvbmVudENoYW5nZWQoY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50SXRlbS5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5lbmRTaXplSW52YWxpZGF0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdhY3RpdmVDb250ZW50SXRlbUNoYW5nZWQnLCBjb21wb25lbnRJdGVtKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5lbWl0KCdhY3RpdmVDb250ZW50SXRlbUNoYW5nZWQnLCBjb21wb25lbnRJdGVtKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdFN0YXRlQ2hhbmdlZEV2ZW50KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmZvY3VzZWQgfHwgZm9jdXMpIHtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLnNldEZvY3VzZWRDb21wb25lbnRJdGVtKGNvbXBvbmVudEl0ZW0sIHN1cHByZXNzRm9jdXNFdmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIChTdGFjazpjbGFzcykuZ2V0QWN0aXZlQ29tcG9uZW50SXRlbX0gKi9cclxuICAgIGdldEFjdGl2ZUNvbnRlbnRJdGVtKCk6IENvbnRlbnRJdGVtIHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWN0aXZlQ29tcG9uZW50SXRlbSgpID8/IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QWN0aXZlQ29tcG9uZW50SXRlbSgpOiBDb21wb25lbnRJdGVtIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZlQ29tcG9uZW50SXRlbTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBmb2N1c0FjdGl2ZUNvbnRlbnRJdGVtKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2FjdGl2ZUNvbXBvbmVudEl0ZW0/LmZvY3VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgc2V0Rm9jdXNlZFZhbHVlKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5faGVhZGVyLmFwcGx5Rm9jdXNlZFZhbHVlKHZhbHVlKTtcclxuICAgICAgICBzdXBlci5zZXRGb2N1c2VkVmFsdWUodmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIG5ld0NvbXBvbmVudChjb21wb25lbnRUeXBlOiBKc29uVmFsdWUsIGNvbXBvbmVudFN0YXRlPzogSnNvblZhbHVlLCB0aXRsZT86IHN0cmluZywgaW5kZXg/OiBudW1iZXIpOiBDb21wb25lbnRJdGVtIHtcclxuICAgICAgICBjb25zdCBpdGVtQ29uZmlnOiBDb21wb25lbnRJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiAnY29tcG9uZW50JyxcclxuICAgICAgICAgICAgY29tcG9uZW50VHlwZSxcclxuICAgICAgICAgICAgY29tcG9uZW50U3RhdGUsXHJcbiAgICAgICAgICAgIHRpdGxlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubmV3SXRlbShpdGVtQ29uZmlnLCBpbmRleCkgYXMgQ29tcG9uZW50SXRlbTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRDb21wb25lbnQoY29tcG9uZW50VHlwZTogSnNvblZhbHVlLCBjb21wb25lbnRTdGF0ZT86IEpzb25WYWx1ZSwgdGl0bGU/OiBzdHJpbmcsIGluZGV4PzogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgICBjb25zdCBpdGVtQ29uZmlnOiBDb21wb25lbnRJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiAnY29tcG9uZW50JyxcclxuICAgICAgICAgICAgY29tcG9uZW50VHlwZSxcclxuICAgICAgICAgICAgY29tcG9uZW50U3RhdGUsXHJcbiAgICAgICAgICAgIHRpdGxlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkSXRlbShpdGVtQ29uZmlnLCBpbmRleCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmV3SXRlbShpdGVtQ29uZmlnOiBDb21wb25lbnRJdGVtQ29uZmlnLCAgaW5kZXg/OiBudW1iZXIpOiBDb250ZW50SXRlbSB7XHJcbiAgICAgICAgaW5kZXggPSB0aGlzLmFkZEl0ZW0oaXRlbUNvbmZpZywgaW5kZXgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRJdGVtc1tpbmRleF07XHJcbiAgICB9XHJcblxyXG4gICAgYWRkSXRlbShpdGVtQ29uZmlnOiBDb21wb25lbnRJdGVtQ29uZmlnLCBpbmRleD86IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmNoZWNrTWluaW1pc2VNYXhpbWlzZWRTdGFjaygpO1xyXG5cclxuICAgICAgICBjb25zdCByZXNvbHZlZEl0ZW1Db25maWcgPSBJdGVtQ29uZmlnLnJlc29sdmUoaXRlbUNvbmZpZywgZmFsc2UpO1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmNyZWF0ZUFuZEluaXRDb250ZW50SXRlbShyZXNvbHZlZEl0ZW1Db25maWcsIHRoaXMpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFkZENoaWxkKGNvbnRlbnRJdGVtLCBpbmRleCk7XHJcbiAgICB9XHJcblxyXG4gICAgb3ZlcnJpZGUgYWRkQ2hpbGQoY29udGVudEl0ZW06IENvbnRlbnRJdGVtLCBpbmRleD86IG51bWJlciwgZm9jdXMgPSBmYWxzZSk6IG51bWJlciB7XHJcbiAgICAgICAgaWYoaW5kZXggIT09IHVuZGVmaW5lZCAmJiBpbmRleCA+IHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aCl7XHJcbiAgICAgICAgICAgIGluZGV4IC09IDE7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignU0FDOTk3MjgnKTsgLy8gdW5kaXNwbGF5Q2hpbGQoKSByZW1vdmVkIHNvIHRoaXMgY29uZGl0aW9uIHNob3VsZCBubyBsb25nZXIgb2NjdXJcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghKGNvbnRlbnRJdGVtIGluc3RhbmNlb2YgQ29tcG9uZW50SXRlbSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdTQUNDODg1MzInKTsgLy8gU3RhY2tzIGNhbiBvbmx5IGhhdmUgQ29tcG9uZW50IGNoaWxkcmVuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaW5kZXggPSBzdXBlci5hZGRDaGlsZChjb250ZW50SXRlbSwgaW5kZXgpO1xyXG4gICAgICAgICAgICB0aGlzLl9jaGlsZEVsZW1lbnRDb250YWluZXIuYXBwZW5kQ2hpbGQoY29udGVudEl0ZW0uZWxlbWVudCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2hlYWRlci5jcmVhdGVUYWIoY29udGVudEl0ZW0sIGluZGV4KTtcclxuICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVDb21wb25lbnRJdGVtKGNvbnRlbnRJdGVtLCBmb2N1cyk7XHJcbiAgICAgICAgICAgIHRoaXMuX2hlYWRlci51cGRhdGVUYWJTaXplcygpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoZmFsc2UpO1xyXG4gICAgICAgICAgICBjb250ZW50SXRlbS5jb250YWluZXIuc2V0QmFzZUxvZ2ljYWxaSW5kZXgoKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0U3RhdGVDaGFuZ2VkRXZlbnQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGluZGV4O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvdmVycmlkZSByZW1vdmVDaGlsZChjb250ZW50SXRlbTogQ29udGVudEl0ZW0sIGtlZXBDaGlsZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudEl0ZW0gPSBjb250ZW50SXRlbSBhcyBDb21wb25lbnRJdGVtO1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jb250ZW50SXRlbXMuaW5kZXhPZihjb21wb25lbnRJdGVtKTtcclxuICAgICAgICBjb25zdCBzdGFja1dpbGxCZURlbGV0ZWQgPSB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGggPT09IDE7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9hY3RpdmVDb21wb25lbnRJdGVtID09PSBjb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgICAgIGlmIChjb21wb25lbnRJdGVtLmZvY3VzZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudEl0ZW0uYmx1cigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghc3RhY2tXaWxsQmVEZWxldGVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHdlJ3JlIGFscmVhZHkgc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IG9uZSBjb250ZW50IGl0ZW0gbGVmdCAqYWZ0ZXIqXHJcbiAgICAgICAgICAgICAgICAvLyByZW1vdmluZyBjb250ZW50SXRlbSwgc28gd2UgY2FuIHNhZmVseSBhc3N1bWUgaW5kZXggMSBpcyBhIHZhbGlkIG9uZSBpZlxyXG4gICAgICAgICAgICAgICAgLy8gdGhlIGluZGV4IG9mIGNvbnRlbnRJdGVtIGlzIDAsIG90aGVyd2lzZSB3ZSBqdXN0IHVzZSB0aGUgcHJldmlvdXMgY29udGVudCBpdGVtLlxyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3QWN0aXZlQ29tcG9uZW50SWR4ID0gaW5kZXggPT09IDAgPyAxIDogaW5kZXggLSAxO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVDb21wb25lbnRJdGVtKHRoaXMuY29udGVudEl0ZW1zW25ld0FjdGl2ZUNvbXBvbmVudElkeF0gYXMgQ29tcG9uZW50SXRlbSwgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9oZWFkZXIucmVtb3ZlVGFiKGNvbXBvbmVudEl0ZW0pO1xyXG5cclxuICAgICAgICBzdXBlci5yZW1vdmVDaGlsZChjb21wb25lbnRJdGVtLCBrZWVwQ2hpbGQpO1xyXG5cclxuICAgICAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZWRFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWF4aW1pc2VzIHRoZSBJdGVtIG9yIG1pbmltaXNlcyBpdCBpZiBpdCBpcyBhbHJlYWR5IG1heGltaXNlZFxyXG4gICAgICovXHJcbiAgICB0b2dnbGVNYXhpbWlzZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5pc01heGltaXNlZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1pbmltaXNlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5tYXhpbWlzZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBtYXhpbWlzZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNNYXhpbWlzZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLnNldE1heGltaXNlZFN0YWNrKHRoaXMpO1xyXG4gICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbXMgPSB0aGlzLmNvbnRlbnRJdGVtcztcclxuICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW1Db3VudCA9IGNvbnRlbnRJdGVtcy5sZW5ndGg7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudEl0ZW1Db3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IGNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgIGlmIChjb250ZW50SXRlbSBpbnN0YW5jZW9mIENvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50SXRlbS5lbnRlclN0YWNrTWF4aW1pc2VkKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignU01BWEk4Nzc3MycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdFN0YXRlQ2hhbmdlZEV2ZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG1pbmltaXNlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmlzTWF4aW1pc2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5zZXRNYXhpbWlzZWRTdGFjayh1bmRlZmluZWQpO1xyXG4gICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbXMgPSB0aGlzLmNvbnRlbnRJdGVtcztcclxuICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW1Db3VudCA9IGNvbnRlbnRJdGVtcy5sZW5ndGg7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudEl0ZW1Db3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IGNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgIGlmIChjb250ZW50SXRlbSBpbnN0YW5jZW9mIENvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50SXRlbS5leGl0U3RhY2tNYXhpbWlzZWQoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdTTUlOSTg3NzczJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5lbWl0U3RhdGVDaGFuZ2VkRXZlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fYWN0aXZlQ29tcG9uZW50SXRlbT8uZm9jdXNlZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9hY3RpdmVDb21wb25lbnRJdGVtLmJsdXIoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xyXG4gICAgICAgIHRoaXMub2ZmKCdyZXNpemUnLCB0aGlzLl9yZXNpemVMaXN0ZW5lcik7XHJcbiAgICAgICAgaWYgKHRoaXMuX21heGltaXNlZEVuYWJsZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5vZmYoJ21heGltaXNlZCcsIHRoaXMuX21heGltaXNlZExpc3RlbmVyKTtcclxuICAgICAgICAgICAgdGhpcy5vZmYoJ21pbmltaXNlZCcsIHRoaXMuX21pbmltaXNlZExpc3RlbmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5faGVhZGVyLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICB0b0NvbmZpZygpOiBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgbGV0IGFjdGl2ZUl0ZW1JbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGlmICh0aGlzLl9hY3RpdmVDb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgICAgIGFjdGl2ZUl0ZW1JbmRleCA9IHRoaXMuY29udGVudEl0ZW1zLmluZGV4T2YodGhpcy5fYWN0aXZlQ29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgICAgIGlmIChhY3RpdmVJdGVtSW5kZXggPCAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FjdGl2ZSBjb21wb25lbnQgaXRlbSBub3QgZm91bmQgaW4gc3RhY2snKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jb250ZW50SXRlbXMubGVuZ3RoID4gMCAmJiBhY3RpdmVJdGVtSW5kZXggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIG5vbi1lbXB0eSBzdGFjayB0byBoYXZlIGFuIGFjdGl2ZSBjb21wb25lbnQgaXRlbScpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnc3RhY2snLFxyXG4gICAgICAgICAgICAgICAgY29udGVudDogdGhpcy5jYWxjdWxhdGVDb25maWdDb250ZW50KCkgYXMgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnW10sXHJcbiAgICAgICAgICAgICAgICBzaXplOiB0aGlzLnNpemUsXHJcbiAgICAgICAgICAgICAgICBzaXplVW5pdDogdGhpcy5zaXplVW5pdCxcclxuICAgICAgICAgICAgICAgIG1pblNpemU6IHRoaXMubWluU2l6ZSxcclxuICAgICAgICAgICAgICAgIG1pblNpemVVbml0OiB0aGlzLm1pblNpemVVbml0LFxyXG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXHJcbiAgICAgICAgICAgICAgICBpc0Nsb3NhYmxlOiB0aGlzLmlzQ2xvc2FibGUsXHJcbiAgICAgICAgICAgICAgICBtYXhpbWlzZWQ6IHRoaXMuaXNNYXhpbWlzZWQsXHJcbiAgICAgICAgICAgICAgICBoZWFkZXI6IHRoaXMuY3JlYXRlSGVhZGVyQ29uZmlnKCksXHJcbiAgICAgICAgICAgICAgICBhY3RpdmVJdGVtSW5kZXgsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPaywgdGhpcyBvbmUgaXMgZ29pbmcgdG8gYmUgdGhlIHRyaWNreSBvbmU6IFRoZSB1c2VyIGhhcyBkcm9wcGVkIGEge0BsaW5rIChDb250ZW50SXRlbTpjbGFzcyl9IG9udG8gdGhpcyBzdGFjay5cclxuICAgICAqXHJcbiAgICAgKiBJdCB3YXMgZHJvcHBlZCBvbiBlaXRoZXIgdGhlIHN0YWNrcyBoZWFkZXIgb3IgdGhlIHRvcCwgcmlnaHQsIGJvdHRvbSBvciBsZWZ0IGJpdCBvZiB0aGUgY29udGVudCBhcmVhXHJcbiAgICAgKiAod2hpY2ggb25lIG9mIHRob3NlIGlzIHN0b3JlZCBpbiB0aGlzLl9kcm9wU2VnbWVudCkuIE5vdywgaWYgdGhlIHVzZXIgaGFzIGRyb3BwZWQgb24gdGhlIGhlYWRlciB0aGUgY2FzZVxyXG4gICAgICogaXMgcmVsYXRpdmVseSBjbGVhcjogV2UgYWRkIHRoZSBpdGVtIHRvIHRoZSBleGlzdGluZyBzdGFjay4uLiBqb2IgZG9uZSAobWlnaHQgYmUgZ29vZCB0byBoYXZlXHJcbiAgICAgKiB0YWIgcmVvcmRlcmluZyBhdCBzb21lIHBvaW50LCBidXQgbGV0cyBub3Qgc3dlYXQgaXQgcmlnaHQgbm93KVxyXG4gICAgICpcclxuICAgICAqIElmIHRoZSBpdGVtIHdhcyBkcm9wcGVkIG9uIHRoZSBjb250ZW50IHBhcnQgdGhpbmdzIGFyZSBhIGJpdCBtb3JlIGNvbXBsaWNhdGVkLiBJZiBpdCB3YXMgZHJvcHBlZCBvbiBlaXRoZXIgdGhlXHJcbiAgICAgKiB0b3Agb3IgYm90dG9tIHJlZ2lvbiB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBjb2x1bW4gYW5kIHBsYWNlIHRoZSBpdGVtcyBhY2NvcmRpbmdseS5cclxuICAgICAqIFVubGVzcywgb2YgY291cnNlIGlmIHRoZSBzdGFjayBpcyBhbHJlYWR5IHdpdGhpbiBhIGNvbHVtbi4uLiBpbiB3aGljaCBjYXNlIHdlIHdhbnRcclxuICAgICAqIHRvIGFkZCB0aGUgbmV3bHkgY3JlYXRlZCBpdGVtIHRvIHRoZSBleGlzdGluZyBjb2x1bW4uLi5cclxuICAgICAqIGVpdGhlciBwcmVwZW5kIG9yIGFwcGVuZCBpdCwgZGVwZW5kaW5nIG9uIHdldGhlciBpdHMgdG9wIG9yIGJvdHRvbS5cclxuICAgICAqXHJcbiAgICAgKiBTYW1lIHRoaW5nIGZvciByb3dzIGFuZCBsZWZ0IC8gcmlnaHQgZHJvcCBzZWdtZW50cy4uLiBzbyBpbiB0b3RhbCB0aGVyZSBhcmUgOSB0aGluZ3MgdGhhdCBjYW4gcG90ZW50aWFsbHkgaGFwcGVuXHJcbiAgICAgKiAobGVmdCwgdG9wLCByaWdodCwgYm90dG9tKSAqIGlzIGNoaWxkIG9mIHRoZSByaWdodCBwYXJlbnQgKHJvdywgY29sdW1uKSArIGhlYWRlciBkcm9wXHJcbiAgICAgKlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIG92ZXJyaWRlIG9uRHJvcChjb250ZW50SXRlbTogQ29udGVudEl0ZW0sIGFyZWE6IENvbnRlbnRJdGVtLkFyZWEpOiB2b2lkIHtcclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIFRoZSBpdGVtIHdhcyBkcm9wcGVkIG9uIHRoZSBoZWFkZXIgYXJlYS4gSnVzdCBhZGQgaXQgYXMgYSBjaGlsZCBvZiB0aGlzIHN0YWNrIGFuZFxyXG4gICAgICAgICAqIGdldCB0aGUgaGVsbCBvdXQgb2YgdGhpcyBsb2dpY1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICh0aGlzLl9kcm9wU2VnbWVudCA9PT0gU3RhY2suU2VnbWVudC5IZWFkZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5yZXNldEhlYWRlckRyb3Bab25lKCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kcm9wSW5kZXggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignU09EREk2ODk5MCcpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRDaGlsZChjb250ZW50SXRlbSwgdGhpcy5fZHJvcEluZGV4KTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLypcclxuICAgICAgICAgKiBUaGUgc3RhY2sgaXMgZW1wdHkuIExldCdzIGp1c3QgYWRkIHRoZSBlbGVtZW50LlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICh0aGlzLl9kcm9wU2VnbWVudCA9PT0gU3RhY2suU2VnbWVudC5Cb2R5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGQoY29udGVudEl0ZW0sIDAsIHRydWUpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIFRoZSBpdGVtIHdhcyBkcm9wcGVkIG9uIHRoZSB0b3AtLCBsZWZ0LSwgYm90dG9tLSBvciByaWdodC0gcGFydCBvZiB0aGUgY29udGVudC4gTGV0J3NcclxuICAgICAgICAgKiBhZ2dyZWdhdGUgc29tZSBjb25kaXRpb25zIHRvIG1ha2UgdGhlIGlmIHN0YXRlbWVudHMgbGF0ZXIgb24gbW9yZSByZWFkYWJsZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IGlzVmVydGljYWwgPSB0aGlzLl9kcm9wU2VnbWVudCA9PT0gU3RhY2suU2VnbWVudC5Ub3AgfHwgdGhpcy5fZHJvcFNlZ21lbnQgPT09IFN0YWNrLlNlZ21lbnQuQm90dG9tO1xyXG4gICAgICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IHRoaXMuX2Ryb3BTZWdtZW50ID09PSBTdGFjay5TZWdtZW50LkxlZnQgfHwgdGhpcy5fZHJvcFNlZ21lbnQgPT09IFN0YWNrLlNlZ21lbnQuUmlnaHQ7XHJcbiAgICAgICAgY29uc3QgaW5zZXJ0QmVmb3JlID0gdGhpcy5fZHJvcFNlZ21lbnQgPT09IFN0YWNrLlNlZ21lbnQuVG9wIHx8IHRoaXMuX2Ryb3BTZWdtZW50ID09PSBTdGFjay5TZWdtZW50LkxlZnQ7XHJcbiAgICAgICAgY29uc3QgaGFzQ29ycmVjdFBhcmVudCA9IChpc1ZlcnRpY2FsICYmIHRoaXMuc3RhY2tQYXJlbnQuaXNDb2x1bW4pIHx8IChpc0hvcml6b250YWwgJiYgdGhpcy5zdGFja1BhcmVudC5pc1Jvdyk7XHJcblxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgICogVGhlIGNvbnRlbnQgaXRlbSBjYW4gYmUgZWl0aGVyIGEgY29tcG9uZW50IG9yIGEgc3RhY2suIElmIGl0IGlzIGEgY29tcG9uZW50LCB3cmFwIGl0IGludG8gYSBzdGFja1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChjb250ZW50SXRlbS5pc0NvbXBvbmVudCkge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtQ29uZmlnID0gUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcuY3JlYXRlRGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBpdGVtQ29uZmlnLmhlYWRlciA9IChjb250ZW50SXRlbSBhcyBDb21wb25lbnRJdGVtKS5oZWFkZXJDb25maWc7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmNyZWF0ZUFuZEluaXRDb250ZW50SXRlbShpdGVtQ29uZmlnLCB0aGlzKTtcclxuICAgICAgICAgICAgc3RhY2suYWRkQ2hpbGQoY29udGVudEl0ZW0pO1xyXG4gICAgICAgICAgICBjb250ZW50SXRlbSA9IHN0YWNrO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgICogSWYgdGhlIGNvbnRlbnRJdGVtIHRoYXQncyBiZWluZyBkcm9wcGVkIGlzIG5vdCBkcm9wcGVkIG9uIGEgU3RhY2sgKGNhc2VzIHdoaWNoIGp1c3QgcGFzc2VkIGFib3ZlIGFuZFxyXG4gICAgICAgICAqIHdoaWNoIHdvdWxkIHdyYXAgdGhlIGNvbnRlbnRJdGVtIGluIGEgU3RhY2spIHdlIG5lZWQgdG8gY2hlY2sgd2hldGhlciBjb250ZW50SXRlbSBpcyBhIFJvd09yQ29sdW1uLlxyXG4gICAgICAgICAqIElmIGl0IGlzLCB3ZSBuZWVkIHRvIHJlLXdyYXAgaXQgaW4gYSBTdGFjayBsaWtlIGl0IHdhcyB3aGVuIGl0IHdhcyBkcmFnZ2VkIGJ5IGl0cyBUYWIgKGl0IHdhcyBkcmFnZ2VkISkuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYoY29udGVudEl0ZW0udHlwZSA9PT0gSXRlbVR5cGUucm93IHx8IGNvbnRlbnRJdGVtLnR5cGUgPT09IEl0ZW1UeXBlLmNvbHVtbil7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1Db25maWcgPSBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZy5jcmVhdGVEZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGl0ZW1Db25maWcuaGVhZGVyID0gdGhpcy5jcmVhdGVIZWFkZXJDb25maWcoKTtcclxuICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB0aGlzLmxheW91dE1hbmFnZXIuY3JlYXRlQ29udGVudEl0ZW0oaXRlbUNvbmZpZywgdGhpcyk7XHJcbiAgICAgICAgICAgIHN0YWNrLmFkZENoaWxkKGNvbnRlbnRJdGVtKVxyXG4gICAgICAgICAgICBjb250ZW50SXRlbSA9IHN0YWNrXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIElmIHRoZSBpdGVtIGlzIGRyb3BwZWQgb24gdG9wIG9yIGJvdHRvbSBvZiBhIGNvbHVtbiBvciBsZWZ0IGFuZCByaWdodCBvZiBhIHJvdywgaXQncyBhbHJlYWR5XHJcbiAgICAgICAgICogbGF5ZCBvdXQgaW4gdGhlIGNvcnJlY3Qgd2F5LiBKdXN0IGFkZCBpdCBhcyBhIGNoaWxkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKGhhc0NvcnJlY3RQYXJlbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnN0YWNrUGFyZW50LmNvbnRlbnRJdGVtcy5pbmRleE9mKHRoaXMpO1xyXG4gICAgICAgICAgICB0aGlzLnN0YWNrUGFyZW50LmFkZENoaWxkKGNvbnRlbnRJdGVtLCBpbnNlcnRCZWZvcmUgPyBpbmRleCA6IGluZGV4ICsgMSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2l6ZSAqPSAwLjU7XHJcbiAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemUgPSB0aGlzLnNpemU7XHJcbiAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemVVbml0ID0gdGhpcy5zaXplVW5pdDtcclxuICAgICAgICAgICAgdGhpcy5zdGFja1BhcmVudC51cGRhdGVTaXplKGZhbHNlKTtcclxuICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgICogVGhpcyBoYW5kbGVzIGl0ZW1zIHRoYXQgYXJlIGRyb3BwZWQgb24gdG9wIG9yIGJvdHRvbSBvZiBhIHJvdyBvciBsZWZ0IC8gcmlnaHQgb2YgYSBjb2x1bW4uIFdlIG5lZWRcclxuICAgICAgICAgICAgICogdG8gY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBjb250ZW50SXRlbSBmb3IgdGhlbSB0byBsaXZlIGluXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBpc1ZlcnRpY2FsID8gSXRlbVR5cGUuY29sdW1uIDogSXRlbVR5cGUucm93O1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtQ29uZmlnID0gUmVzb2x2ZWRJdGVtQ29uZmlnLmNyZWF0ZURlZmF1bHQodHlwZSkgYXMgUmVzb2x2ZWRJdGVtQ29uZmlnO1xyXG4gICAgICAgICAgICBjb25zdCByb3dPckNvbHVtbiA9IHRoaXMubGF5b3V0TWFuYWdlci5jcmVhdGVDb250ZW50SXRlbShpdGVtQ29uZmlnLCB0aGlzKTtcclxuICAgICAgICAgICAgdGhpcy5zdGFja1BhcmVudC5yZXBsYWNlQ2hpbGQodGhpcywgcm93T3JDb2x1bW4pO1xyXG5cclxuICAgICAgICAgICAgcm93T3JDb2x1bW4uYWRkQ2hpbGQoY29udGVudEl0ZW0sIGluc2VydEJlZm9yZSA/IDAgOiB1bmRlZmluZWQsIHRydWUpO1xyXG4gICAgICAgICAgICByb3dPckNvbHVtbi5hZGRDaGlsZCh0aGlzLCBpbnNlcnRCZWZvcmUgPyB1bmRlZmluZWQgOiAwLCB0cnVlKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2l6ZSA9IDUwO1xyXG4gICAgICAgICAgICBjb250ZW50SXRlbS5zaXplID0gNTA7XHJcbiAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemVVbml0ID0gU2l6ZVVuaXRFbnVtLlBlcmNlbnQ7XHJcbiAgICAgICAgICAgIHJvd09yQ29sdW1uLnVwZGF0ZVNpemUoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIElmIHRoZSB1c2VyIGhvdmVycyBhYm92ZSB0aGUgaGVhZGVyIHBhcnQgb2YgdGhlIHN0YWNrLCBpbmRpY2F0ZSBkcm9wIHBvc2l0aW9ucyBmb3IgdGFicy5cclxuICAgICAqIG90aGVyd2lzZSBpbmRpY2F0ZSB3aGljaCBzZWdtZW50IG9mIHRoZSBib2R5IHRoZSBkcmFnZ2VkIGl0ZW0gd291bGQgYmUgZHJvcHBlZCBvblxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB4IC0gQWJzb2x1dGUgU2NyZWVuIFhcclxuICAgICAqIEBwYXJhbSB5IC0gQWJzb2x1dGUgU2NyZWVuIFlcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBvdmVycmlkZSBoaWdobGlnaHREcm9wWm9uZSh4OiBudW1iZXIsIHk6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuX2NvbnRlbnRBcmVhRGltZW5zaW9ucykge1xyXG4gICAgICAgICAgICBjb25zdCBzZWdtZW50ID0ga2V5IGFzIFN0YWNrLlNlZ21lbnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGFyZWEgPSB0aGlzLl9jb250ZW50QXJlYURpbWVuc2lvbnNbc2VnbWVudF0uaG92ZXJBcmVhO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFyZWEueDEgPCB4ICYmIGFyZWEueDIgPiB4ICYmIGFyZWEueTEgPCB5ICYmIGFyZWEueTIgPiB5KSB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQgPT09IFN0YWNrLlNlZ21lbnQuSGVhZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZHJvcFNlZ21lbnQgPSBTdGFjay5TZWdtZW50LkhlYWRlcjtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodEhlYWRlckRyb3Bab25lKHRoaXMuX2hlYWRlci5sZWZ0UmlnaHRTaWRlZCA/IHkgOiB4KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldEhlYWRlckRyb3Bab25lKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRCb2R5RHJvcFpvbmUoc2VnbWVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGdldEFyZWEoKTogQ29udGVudEl0ZW0uQXJlYSB8IG51bGwge1xyXG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaGVhZGVyQXJlYSA9IHN1cGVyLmdldEVsZW1lbnRBcmVhKHRoaXMuX2hlYWRlci5lbGVtZW50KTtcclxuICAgICAgICBjb25zdCBjb250ZW50QXJlYSA9IHN1cGVyLmdldEVsZW1lbnRBcmVhKHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lcik7XHJcbiAgICAgICAgaWYgKGhlYWRlckFyZWEgPT09IG51bGwgfHwgY29udGVudEFyZWEgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ1NHQUhDMTMwODYnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY29udGVudFdpZHRoID0gY29udGVudEFyZWEueDIgLSBjb250ZW50QXJlYS54MTtcclxuICAgICAgICBjb25zdCBjb250ZW50SGVpZ2h0ID0gY29udGVudEFyZWEueTIgLSBjb250ZW50QXJlYS55MTtcclxuXHJcbiAgICAgICAgdGhpcy5fY29udGVudEFyZWFEaW1lbnNpb25zID0ge1xyXG4gICAgICAgICAgICBoZWFkZXI6IHtcclxuICAgICAgICAgICAgICAgIGhvdmVyQXJlYToge1xyXG4gICAgICAgICAgICAgICAgICAgIHgxOiBoZWFkZXJBcmVhLngxLFxyXG4gICAgICAgICAgICAgICAgICAgIHkxOiBoZWFkZXJBcmVhLnkxLFxyXG4gICAgICAgICAgICAgICAgICAgIHgyOiBoZWFkZXJBcmVhLngyLFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBoZWFkZXJBcmVhLnkyXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0QXJlYToge1xyXG4gICAgICAgICAgICAgICAgICAgIHgxOiBoZWFkZXJBcmVhLngxLFxyXG4gICAgICAgICAgICAgICAgICAgIHkxOiBoZWFkZXJBcmVhLnkxLFxyXG4gICAgICAgICAgICAgICAgICAgIHgyOiBoZWFkZXJBcmVhLngyLFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBoZWFkZXJBcmVhLnkyXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBIaWdobGlnaHQgdGhlIGVudGlyZSBib2R5IGlmIHRoZSBzdGFjayBpcyBlbXB0eVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGggPT09IDApIHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRBcmVhRGltZW5zaW9ucy5ib2R5ID0ge1xyXG4gICAgICAgICAgICAgICAgaG92ZXJBcmVhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgeDE6IGNvbnRlbnRBcmVhLngxLFxyXG4gICAgICAgICAgICAgICAgICAgIHkxOiBjb250ZW50QXJlYS55MSxcclxuICAgICAgICAgICAgICAgICAgICB4MjogY29udGVudEFyZWEueDIsXHJcbiAgICAgICAgICAgICAgICAgICAgeTI6IGNvbnRlbnRBcmVhLnkyXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0QXJlYToge1xyXG4gICAgICAgICAgICAgICAgICAgIHgxOiBjb250ZW50QXJlYS54MSxcclxuICAgICAgICAgICAgICAgICAgICB5MTogY29udGVudEFyZWEueTEsXHJcbiAgICAgICAgICAgICAgICAgICAgeDI6IGNvbnRlbnRBcmVhLngyLFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBjb250ZW50QXJlYS55MlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRBcmVhKHRoaXMuZWxlbWVudCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY29udGVudEFyZWFEaW1lbnNpb25zLmxlZnQgPSB7XHJcbiAgICAgICAgICAgICAgICBob3ZlckFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogY29udGVudEFyZWEueDEsXHJcbiAgICAgICAgICAgICAgICAgICAgeTE6IGNvbnRlbnRBcmVhLnkxLFxyXG4gICAgICAgICAgICAgICAgICAgIHgyOiBjb250ZW50QXJlYS54MSArIGNvbnRlbnRXaWR0aCAqIDAuMjUsXHJcbiAgICAgICAgICAgICAgICAgICAgeTI6IGNvbnRlbnRBcmVhLnkyXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0QXJlYToge1xyXG4gICAgICAgICAgICAgICAgICAgIHgxOiBjb250ZW50QXJlYS54MSxcclxuICAgICAgICAgICAgICAgICAgICB5MTogY29udGVudEFyZWEueTEsXHJcbiAgICAgICAgICAgICAgICAgICAgeDI6IGNvbnRlbnRBcmVhLngxICsgY29udGVudFdpZHRoICogMC41LFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBjb250ZW50QXJlYS55MlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fY29udGVudEFyZWFEaW1lbnNpb25zLnRvcCA9IHtcclxuICAgICAgICAgICAgICAgIGhvdmVyQXJlYToge1xyXG4gICAgICAgICAgICAgICAgICAgIHgxOiBjb250ZW50QXJlYS54MSArIGNvbnRlbnRXaWR0aCAqIDAuMjUsXHJcbiAgICAgICAgICAgICAgICAgICAgeTE6IGNvbnRlbnRBcmVhLnkxLFxyXG4gICAgICAgICAgICAgICAgICAgIHgyOiBjb250ZW50QXJlYS54MSArIGNvbnRlbnRXaWR0aCAqIDAuNzUsXHJcbiAgICAgICAgICAgICAgICAgICAgeTI6IGNvbnRlbnRBcmVhLnkxICsgY29udGVudEhlaWdodCAqIDAuNVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodEFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogY29udGVudEFyZWEueDEsXHJcbiAgICAgICAgICAgICAgICAgICAgeTE6IGNvbnRlbnRBcmVhLnkxLFxyXG4gICAgICAgICAgICAgICAgICAgIHgyOiBjb250ZW50QXJlYS54MixcclxuICAgICAgICAgICAgICAgICAgICB5MjogY29udGVudEFyZWEueTEgKyBjb250ZW50SGVpZ2h0ICogMC41XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9jb250ZW50QXJlYURpbWVuc2lvbnMucmlnaHQgPSB7XHJcbiAgICAgICAgICAgICAgICBob3ZlckFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogY29udGVudEFyZWEueDEgKyBjb250ZW50V2lkdGggKiAwLjc1LFxyXG4gICAgICAgICAgICAgICAgICAgIHkxOiBjb250ZW50QXJlYS55MSxcclxuICAgICAgICAgICAgICAgICAgICB4MjogY29udGVudEFyZWEueDIsXHJcbiAgICAgICAgICAgICAgICAgICAgeTI6IGNvbnRlbnRBcmVhLnkyXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0QXJlYToge1xyXG4gICAgICAgICAgICAgICAgICAgIHgxOiBjb250ZW50QXJlYS54MSArIGNvbnRlbnRXaWR0aCAqIDAuNSxcclxuICAgICAgICAgICAgICAgICAgICB5MTogY29udGVudEFyZWEueTEsXHJcbiAgICAgICAgICAgICAgICAgICAgeDI6IGNvbnRlbnRBcmVhLngyLFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBjb250ZW50QXJlYS55MlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fY29udGVudEFyZWFEaW1lbnNpb25zLmJvdHRvbSA9IHtcclxuICAgICAgICAgICAgICAgIGhvdmVyQXJlYToge1xyXG4gICAgICAgICAgICAgICAgICAgIHgxOiBjb250ZW50QXJlYS54MSArIGNvbnRlbnRXaWR0aCAqIDAuMjUsXHJcbiAgICAgICAgICAgICAgICAgICAgeTE6IGNvbnRlbnRBcmVhLnkxICsgY29udGVudEhlaWdodCAqIDAuNSxcclxuICAgICAgICAgICAgICAgICAgICB4MjogY29udGVudEFyZWEueDEgKyBjb250ZW50V2lkdGggKiAwLjc1LFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBjb250ZW50QXJlYS55MlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodEFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogY29udGVudEFyZWEueDEsXHJcbiAgICAgICAgICAgICAgICAgICAgeTE6IGNvbnRlbnRBcmVhLnkxICsgY29udGVudEhlaWdodCAqIDAuNSxcclxuICAgICAgICAgICAgICAgICAgICB4MjogY29udGVudEFyZWEueDIsXHJcbiAgICAgICAgICAgICAgICAgICAgeTI6IGNvbnRlbnRBcmVhLnkyXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RWxlbWVudEFyZWEodGhpcy5lbGVtZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9ncmFtbWF0aWNhbGx5IG9wZXJhdGUgd2l0aCBoZWFkZXIgcG9zaXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHBvc2l0aW9uIC1cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBwcmV2aW91cyBoZWFkZXIgcG9zaXRpb25cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwb3NpdGlvbkhlYWRlcihwb3NpdGlvbjogU2lkZSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9oZWFkZXIuc2lkZSAhPT0gcG9zaXRpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5faGVhZGVyLnNldFNpZGUocG9zaXRpb24pO1xyXG4gICAgICAgICAgICB0aGlzLl9oZWFkZXJTaWRlQ2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0dXBIZWFkZXJQb3NpdGlvbigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHVwZGF0ZU5vZGVTaXplKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQ6IFdpZHRoQW5kSGVpZ2h0ID0gZ2V0RWxlbWVudFdpZHRoQW5kSGVpZ2h0KHRoaXMuZWxlbWVudCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5faGVhZGVyLnNob3cpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRpbWVuc2lvbiA9IHRoaXMuX2hlYWRlci5sZWZ0UmlnaHRTaWRlZCA/IFdpZHRoT3JIZWlnaHRQcm9wZXJ0eU5hbWUud2lkdGggOiBXaWR0aE9ySGVpZ2h0UHJvcGVydHlOYW1lLmhlaWdodDtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRbZGltZW5zaW9uXSAtPSB0aGlzLmxheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLmRpbWVuc2lvbnMuaGVhZGVySGVpZ2h0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHNldEVsZW1lbnRXaWR0aCh0aGlzLl9jaGlsZEVsZW1lbnRDb250YWluZXIsIGNvbnRlbnQud2lkdGgpO1xyXG4gICAgICAgICAgICBzZXRFbGVtZW50SGVpZ2h0KHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lciwgY29udGVudC5oZWlnaHQpO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgc2V0RWxlbWVudFdpZHRoKHRoaXMuY29udGVudEl0ZW1zW2ldLmVsZW1lbnQsIGNvbnRlbnQud2lkdGgpO1xyXG4gICAgICAgICAgICAgICAgc2V0RWxlbWVudEhlaWdodCh0aGlzLmNvbnRlbnRJdGVtc1tpXS5lbGVtZW50LCBjb250ZW50LmhlaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdyZXNpemUnKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0U3RhdGVDaGFuZ2VkRXZlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoaWdobGlnaHRIZWFkZXJEcm9wWm9uZSh4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB2aXNpYmxlVGFic0xlbmd0aCA9IHRoaXMuX2hlYWRlci5sYXN0VmlzaWJsZVRhYkluZGV4ICsgMTtcclxuICAgICAgICBjb25zdCB0YWJzQ29udGFpbmVyRWxlbWVudCA9IHRoaXMuX2hlYWRlci50YWJzQ29udGFpbmVyRWxlbWVudDtcclxuICAgICAgICBjb25zdCB0YWJzQ29udGFpbmVyRWxlbWVudENoaWxkTm9kZXMgPSB0YWJzQ29udGFpbmVyRWxlbWVudC5jaGlsZE5vZGVzO1xyXG5cclxuICAgICAgICAvLyBDcmVhdGUgc2hhbGxvdyBjb3B5IG9mIGNoaWxkTm9kZXMgbGlzdCwgZXhjbHVkaW5nIERyb3BQbGFjZUhvbGRlciwgYXMgd2Ugd2lsbCBiZSBtb2RpZnlpbmcgdGhlIGNoaWxkTm9kZXMgbGlzdFxyXG4gICAgICAgIGNvbnN0IHZpc2libGVUYWJFbGVtZW50cyA9IG5ldyBBcnJheTxIVE1MRWxlbWVudD4odmlzaWJsZVRhYnNMZW5ndGgpO1xyXG4gICAgICAgIGxldCB0YWJJbmRleCA9IDA7XHJcbiAgICAgICAgbGV0IHRhYkNvdW50ID0gMDtcclxuICAgICAgICB3aGlsZSAodGFiQ291bnQgPCB2aXNpYmxlVGFic0xlbmd0aCkge1xyXG4gICAgICAgICAgICBjb25zdCB2aXNpYmxlVGFiRWxlbWVudCA9IHRhYnNDb250YWluZXJFbGVtZW50Q2hpbGROb2Rlc1t0YWJJbmRleCsrXSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgaWYgKHZpc2libGVUYWJFbGVtZW50ICE9PSB0aGlzLmxheW91dE1hbmFnZXIudGFiRHJvcFBsYWNlaG9sZGVyKSB7XHJcbiAgICAgICAgICAgICAgICB2aXNpYmxlVGFiRWxlbWVudHNbdGFiQ291bnQrK10gPSB2aXNpYmxlVGFiRWxlbWVudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZHJvcFRhcmdldEluZGljYXRvciA9IHRoaXMubGF5b3V0TWFuYWdlci5kcm9wVGFyZ2V0SW5kaWNhdG9yO1xyXG4gICAgICAgIGlmIChkcm9wVGFyZ2V0SW5kaWNhdG9yID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdTSEhEWkRUSTk3MTEwJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgYXJlYTogQXJlYUxpbmtlZFJlY3Q7XHJcblxyXG4gICAgICAgIC8vIEVtcHR5IHN0YWNrXHJcbiAgICAgICAgaWYgKHZpc2libGVUYWJzTGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlclJlY3QgPSB0aGlzLl9oZWFkZXIuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgY29uc3QgaGVhZGVyVG9wID0gaGVhZGVyUmVjdC50b3AgKyBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcDtcclxuICAgICAgICAgICAgY29uc3QgaGVhZGVyTGVmdCA9IGhlYWRlclJlY3QubGVmdCArIGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdDtcclxuXHJcbiAgICAgICAgICAgIGFyZWEgPSB7XHJcbiAgICAgICAgICAgICAgICB4MTogaGVhZGVyTGVmdCxcclxuICAgICAgICAgICAgICAgIHgyOiBoZWFkZXJMZWZ0ICsgMTAwLFxyXG4gICAgICAgICAgICAgICAgeTE6IGhlYWRlclRvcCArIGhlYWRlclJlY3QuaGVpZ2h0IC0gMjAsXHJcbiAgICAgICAgICAgICAgICB5MjogaGVhZGVyVG9wICsgaGVhZGVyUmVjdC5oZWlnaHQsXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9kcm9wSW5kZXggPSAwO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCB0YWJJbmRleCA9IDA7XHJcbiAgICAgICAgICAgIC8vIFRoaXMgaW5kaWNhdGVzIHdoZXRoZXIgb3VyIGN1cnNvciBpcyBleGFjdGx5IG92ZXIgYSB0YWJcclxuICAgICAgICAgICAgbGV0IGlzQWJvdmVUYWIgPSBmYWxzZTtcclxuICAgICAgICAgICAgbGV0IHRhYlRvcDogbnVtYmVyO1xyXG4gICAgICAgICAgICBsZXQgdGFiTGVmdDogbnVtYmVyO1xyXG4gICAgICAgICAgICBsZXQgdGFiV2lkdGg6IG51bWJlcjtcclxuICAgICAgICAgICAgbGV0IHRhYkVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICBkbyB7XHJcbiAgICAgICAgICAgICAgICB0YWJFbGVtZW50ID0gdmlzaWJsZVRhYkVsZW1lbnRzW3RhYkluZGV4XSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhYlJlY3QgPSB0YWJFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFiUmVjdFRvcCA9IHRhYlJlY3QudG9wICsgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJSZWN0TGVmdCA9IHRhYlJlY3QubGVmdCArIGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faGVhZGVyLmxlZnRSaWdodFNpZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFiTGVmdCA9IHRhYlJlY3RUb3A7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFiVG9wID0gdGFiUmVjdExlZnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFiV2lkdGggPSB0YWJSZWN0LmhlaWdodDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFiTGVmdCA9IHRhYlJlY3RMZWZ0O1xyXG4gICAgICAgICAgICAgICAgICAgIHRhYlRvcCA9IHRhYlJlY3RUb3A7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFiV2lkdGggPSB0YWJSZWN0LndpZHRoO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICh4ID49IHRhYkxlZnQgJiYgeCA8IHRhYkxlZnQgKyB0YWJXaWR0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlzQWJvdmVUYWIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0YWJJbmRleCsrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IHdoaWxlICh0YWJJbmRleCA8IHZpc2libGVUYWJzTGVuZ3RoICYmICFpc0Fib3ZlVGFiKTtcclxuXHJcbiAgICAgICAgICAgIC8vIElmIHdlJ3JlIG5vdCBhYm92ZSBhbnkgdGFicywgb3IgdG8gdGhlIHJpZ2h0IG9mIGFueSB0YWIsIHdlIGFyZSBvdXQgb2YgdGhlIGFyZWEsIHNvIGdpdmUgdXBcclxuICAgICAgICAgICAgaWYgKGlzQWJvdmVUYWIgPT09IGZhbHNlICYmIHggPCB0YWJMZWZ0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGhhbGZYID0gdGFiTGVmdCArIHRhYldpZHRoIC8gMjtcclxuXHJcbiAgICAgICAgICAgIGlmICh4IDwgaGFsZlgpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Ryb3BJbmRleCA9IHRhYkluZGV4O1xyXG4gICAgICAgICAgICAgICAgdGFiRWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2JlZm9yZWJlZ2luJywgdGhpcy5sYXlvdXRNYW5hZ2VyLnRhYkRyb3BQbGFjZWhvbGRlcik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kcm9wSW5kZXggPSBNYXRoLm1pbih0YWJJbmRleCArIDEsIHZpc2libGVUYWJzTGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgIHRhYkVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIHRoaXMubGF5b3V0TWFuYWdlci50YWJEcm9wUGxhY2Vob2xkZXIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0YWJEcm9wUGxhY2Vob2xkZXJSZWN0ID0gdGhpcy5sYXlvdXRNYW5hZ2VyLnRhYkRyb3BQbGFjZWhvbGRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgY29uc3QgdGFiRHJvcFBsYWNlaG9sZGVyUmVjdFRvcCA9IHRhYkRyb3BQbGFjZWhvbGRlclJlY3QudG9wICsgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhYkRyb3BQbGFjZWhvbGRlclJlY3RMZWZ0ID0gdGFiRHJvcFBsYWNlaG9sZGVyUmVjdC5sZWZ0ICsgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0O1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX2hlYWRlci5sZWZ0UmlnaHRTaWRlZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGxhY2VIb2xkZXJUb3AgPSB0YWJEcm9wUGxhY2Vob2xkZXJSZWN0VG9wO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFiRHJvcFBsYWNlaG9sZGVyUmVjdFdpZHRoID0gdGFiRHJvcFBsYWNlaG9sZGVyUmVjdC5oZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICAgICAgYXJlYSA9IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogdGFiVG9wLFxyXG4gICAgICAgICAgICAgICAgICAgIHgyOiB0YWJUb3AgKyB0YWJFbGVtZW50LmNsaWVudEhlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICB5MTogcGxhY2VIb2xkZXJUb3AsXHJcbiAgICAgICAgICAgICAgICAgICAgeTI6IHBsYWNlSG9sZGVyVG9wICsgdGFiRHJvcFBsYWNlaG9sZGVyUmVjdFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlSG9sZGVyTGVmdCA9IHRhYkRyb3BQbGFjZWhvbGRlclJlY3RMZWZ0O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFiRHJvcFBsYWNlaG9sZGVyUmVjdFdpZHRoID0gdGFiRHJvcFBsYWNlaG9sZGVyUmVjdC53aWR0aDtcclxuXHJcbiAgICAgICAgICAgICAgICBhcmVhID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHgxOiBwbGFjZUhvbGRlckxlZnQsXHJcbiAgICAgICAgICAgICAgICAgICAgeDI6IHBsYWNlSG9sZGVyTGVmdCArIHRhYkRyb3BQbGFjZWhvbGRlclJlY3RXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICB5MTogdGFiVG9wLFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiB0YWJUb3AgKyB0YWJFbGVtZW50LmNsaWVudEhlaWdodCxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRyb3BUYXJnZXRJbmRpY2F0b3IuaGlnaGxpZ2h0QXJlYShhcmVhLCAwKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZXNldEhlYWRlckRyb3Bab25lKCkge1xyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci50YWJEcm9wUGxhY2Vob2xkZXIucmVtb3ZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBzZXR1cEhlYWRlclBvc2l0aW9uKCkge1xyXG4gICAgICAgIHNldEVsZW1lbnREaXNwbGF5VmlzaWJpbGl0eSh0aGlzLl9oZWFkZXIuZWxlbWVudCwgdGhpcy5faGVhZGVyLnNob3cpO1xyXG4gICAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKERvbUNvbnN0YW50cy5DbGFzc05hbWUuTGVmdCwgRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5SaWdodCwgRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Cb3R0b20pO1xyXG4gICAgICAgIGlmICh0aGlzLl9oZWFkZXIuc2lkZSAhPT0gU2lkZS50b3ApIHtcclxuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2xtXycgKyB0aGlzLl9oZWFkZXIuc2lkZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2lmIChbU2lkZS5yaWdodCwgU2lkZS5ib3R0b21dLmluY2x1ZGVzKHRoaXMuX2hlYWRlci5zaWRlKSkge1xyXG4gICAgICAgIC8vICAgIC8vIG1vdmUgdGhlIGhlYWRlciBiZWhpbmQgdGhlIGNvbnRlbnQuXHJcbiAgICAgICAgLy8gICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2hlYWRlci5lbGVtZW50KTtcclxuICAgICAgICAvL31cclxuICAgICAgICB0aGlzLnVwZGF0ZVNpemUoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGlnaGxpZ2h0Qm9keURyb3Bab25lKHNlZ21lbnQ6IFN0YWNrLlNlZ21lbnQpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fY29udGVudEFyZWFEaW1lbnNpb25zID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignU0hCRFpDODIyNjUnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBoaWdobGlnaHRBcmVhID0gdGhpcy5fY29udGVudEFyZWFEaW1lbnNpb25zW3NlZ21lbnRdLmhpZ2hsaWdodEFyZWE7XHJcbiAgICAgICAgICAgIGNvbnN0IGRyb3BUYXJnZXRJbmRpY2F0b3IgPSB0aGlzLmxheW91dE1hbmFnZXIuZHJvcFRhcmdldEluZGljYXRvcjtcclxuICAgICAgICAgICAgaWYgKGRyb3BUYXJnZXRJbmRpY2F0b3IgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdTSEJEWkQ5NjExMCcpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZHJvcFRhcmdldEluZGljYXRvci5oaWdobGlnaHRBcmVhKGhpZ2hsaWdodEFyZWEsIDEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZHJvcFNlZ21lbnQgPSBzZWdtZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlUmVzaXplKCkge1xyXG4gICAgICAgIHRoaXMuX2hlYWRlci51cGRhdGVUYWJTaXplcygpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVNYXhpbWlzZWQoKSB7XHJcbiAgICAgICAgdGhpcy5faGVhZGVyLnByb2Nlc3NNYXhpbWlzZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZU1pbmltaXNlZCgpIHtcclxuICAgICAgICB0aGlzLl9oZWFkZXIucHJvY2Vzc01pbmltaXNlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlUG9wb3V0RXZlbnQoKSB7XHJcbiAgICAgICAgdGhpcy5wb3BvdXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZUhlYWRlckNsaWNrRXZlbnQoZXY6IE1vdXNlRXZlbnQpIHtcclxuICAgICAgICBjb25zdCBldmVudE5hbWUgPSBFdmVudEVtaXR0ZXIuaGVhZGVyQ2xpY2tFdmVudE5hbWU7XHJcbiAgICAgICAgY29uc3QgYnViYmxpbmdFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIuQ2xpY2tCdWJibGluZ0V2ZW50KGV2ZW50TmFtZSwgdGhpcywgZXYpO1xyXG4gICAgICAgIHRoaXMuZW1pdChldmVudE5hbWUsIGJ1YmJsaW5nRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlSGVhZGVyVG91Y2hTdGFydEV2ZW50KGV2OiBUb3VjaEV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgZXZlbnROYW1lID0gRXZlbnRFbWl0dGVyLmhlYWRlclRvdWNoU3RhcnRFdmVudE5hbWU7XHJcbiAgICAgICAgY29uc3QgYnViYmxpbmdFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIuVG91Y2hTdGFydEJ1YmJsaW5nRXZlbnQoZXZlbnROYW1lLCB0aGlzLCBldik7XHJcbiAgICAgICAgdGhpcy5lbWl0KGV2ZW50TmFtZSwgYnViYmxpbmdFdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVIZWFkZXJDb21wb25lbnRSZW1vdmVFdmVudChpdGVtOiBDb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVDaGlsZChpdGVtLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVIZWFkZXJDb21wb25lbnRGb2N1c0V2ZW50KGl0ZW06IENvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICB0aGlzLnNldEFjdGl2ZUNvbXBvbmVudEl0ZW0oaXRlbSwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVIZWFkZXJDb21wb25lbnRTdGFydERyYWdFdmVudCh4OiBudW1iZXIsIHk6IG51bWJlciwgZHJhZ0xpc3RlbmVyOiBEcmFnTGlzdGVuZXIsIGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICBpZiAodGhpcy5pc01heGltaXNlZCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnRvZ2dsZU1heGltaXNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5zdGFydENvbXBvbmVudERyYWcoeCwgeSwgZHJhZ0xpc3RlbmVyLCBjb21wb25lbnRJdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZUhlYWRlckNvbmZpZygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2hlYWRlclNpZGVDaGFuZ2VkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXIuY3JlYXRlQ29weSh0aGlzLl9oZWFkZXJDb25maWcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNob3cgPSB0aGlzLl9oZWFkZXIuc2hvdyA/IHRoaXMuX2hlYWRlci5zaWRlIDogZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyLmNyZWF0ZUNvcHkodGhpcy5faGVhZGVyQ29uZmlnLCBzaG93KTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvdyxcclxuICAgICAgICAgICAgICAgICAgICBwb3BvdXQ6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICBtYXhpbWlzZTogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIGNsb3NlOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgbWluaW1pc2U6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICB0YWJEcm9wZG93bjogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGVtaXRTdGF0ZUNoYW5nZWRFdmVudCgpIHtcclxuICAgICAgICB0aGlzLmVtaXRCYXNlQnViYmxpbmdFdmVudCgnc3RhdGVDaGFuZ2VkJyk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgU3RhY2sge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGNvbnN0IGVudW0gU2VnbWVudCB7XHJcbiAgICAgICAgSGVhZGVyID0gJ2hlYWRlcicsXHJcbiAgICAgICAgQm9keSA9ICdib2R5JyxcclxuICAgICAgICBMZWZ0ID0gJ2xlZnQnLFxyXG4gICAgICAgIFJpZ2h0ID0gJ3JpZ2h0JyxcclxuICAgICAgICBUb3AgPSAndG9wJyxcclxuICAgICAgICBCb3R0b20gPSAnYm90dG9tJyxcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIENvbnRlbnRBcmVhRGltZW5zaW9uIHtcclxuICAgICAgICBob3ZlckFyZWE6IEFyZWFMaW5rZWRSZWN0O1xyXG4gICAgICAgIGhpZ2hsaWdodEFyZWE6IEFyZWFMaW5rZWRSZWN0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIENvbnRlbnRBcmVhRGltZW5zaW9ucyA9IHtcclxuICAgICAgICBbc2VnbWVudDogc3RyaW5nXTogQ29udGVudEFyZWFEaW1lbnNpb247XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbGVtZW50KGRvY3VtZW50OiBEb2N1bWVudCk6IEhUTUxEaXZFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuSXRlbSk7XHJcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuU3RhY2spO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IENvbXBvbmVudEl0ZW1Db25maWcsIEl0ZW1Db25maWcsIExheW91dENvbmZpZywgUm93T3JDb2x1bW5JdGVtQ29uZmlnLCBTdGFja0l0ZW1Db25maWcgfSBmcm9tICcuL2NvbmZpZy9jb25maWcnO1xyXG5pbXBvcnQge1xyXG4gICAgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnLFxyXG4gICAgUmVzb2x2ZWRJdGVtQ29uZmlnLFxyXG4gICAgUmVzb2x2ZWRMYXlvdXRDb25maWcsXHJcbiAgICBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyxcclxuICAgIFJlc29sdmVkUm9vdEl0ZW1Db25maWcsXHJcbiAgICBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyxcclxuICAgIFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnXHJcbn0gZnJvbSBcIi4vY29uZmlnL3Jlc29sdmVkLWNvbmZpZ1wiO1xyXG5pbXBvcnQgeyBDb21wb25lbnRDb250YWluZXIgfSBmcm9tICcuL2NvbnRhaW5lci9jb21wb25lbnQtY29udGFpbmVyJztcclxuaW1wb3J0IHsgQnJvd3NlclBvcG91dCB9IGZyb20gJy4vY29udHJvbHMvYnJvd3Nlci1wb3BvdXQnO1xyXG5pbXBvcnQgeyBEcmFnQWN0aW9uIH0gZnJvbSAnLi9jb250cm9scy9kcmFnLWFjdGlvbic7XHJcbmltcG9ydCB7IERyYWdTb3VyY2UgfSBmcm9tICcuL2NvbnRyb2xzL2RyYWctc291cmNlJztcclxuaW1wb3J0IHsgRHJvcFRhcmdldEluZGljYXRvciB9IGZyb20gJy4vY29udHJvbHMvZHJvcC10YXJnZXQtaW5kaWNhdG9yJztcclxuaW1wb3J0IHsgVHJhbnNpdGlvbkluZGljYXRvciB9IGZyb20gJy4vY29udHJvbHMvdHJhbnNpdGlvbi1pbmRpY2F0b3InO1xyXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uRXJyb3IgfSBmcm9tICcuL2Vycm9ycy9leHRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IEFzc2VydEVycm9yLCBVbmV4cGVjdGVkTnVsbEVycm9yLCBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IsIFVucmVhY2hhYmxlQ2FzZUVycm9yIH0gZnJvbSAnLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBDb21wb25lbnRJdGVtIH0gZnJvbSAnLi9pdGVtcy9jb21wb25lbnQtaXRlbSc7XHJcbmltcG9ydCB7IENvbXBvbmVudFBhcmVudGFibGVJdGVtIH0gZnJvbSAnLi9pdGVtcy9jb21wb25lbnQtcGFyZW50YWJsZS1pdGVtJztcclxuaW1wb3J0IHsgQ29udGVudEl0ZW0gfSBmcm9tICcuL2l0ZW1zL2NvbnRlbnQtaXRlbSc7XHJcbmltcG9ydCB7IEdyb3VuZEl0ZW0gfSBmcm9tICcuL2l0ZW1zL2dyb3VuZC1pdGVtJztcclxuaW1wb3J0IHsgUm93T3JDb2x1bW4gfSBmcm9tICcuL2l0ZW1zL3Jvdy1vci1jb2x1bW4nO1xyXG5pbXBvcnQgeyBTdGFjayB9IGZyb20gJy4vaXRlbXMvc3RhY2snO1xyXG5pbXBvcnQgeyBDb25maWdNaW5pZmllciB9IGZyb20gJy4vdXRpbHMvY29uZmlnLW1pbmlmaWVyJztcclxuaW1wb3J0IHsgRG9tQ29uc3RhbnRzIH0gZnJvbSAnLi91dGlscy9kb20tY29uc3RhbnRzJztcclxuaW1wb3J0IHsgRHJhZ0xpc3RlbmVyIH0gZnJvbSAnLi91dGlscy9kcmFnLWxpc3RlbmVyJztcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi91dGlscy9ldmVudC1lbWl0dGVyJztcclxuaW1wb3J0IHsgRXZlbnRIdWIgfSBmcm9tICcuL3V0aWxzL2V2ZW50LWh1Yic7XHJcbmltcG9ydCB7IEkxOG5TdHJpbmdJZCwgSTE4blN0cmluZ3MsIGkxOG5TdHJpbmdzIH0gZnJvbSAnLi91dGlscy9pMThuLXN0cmluZ3MnO1xyXG5pbXBvcnQgeyBJdGVtVHlwZSwgSnNvblZhbHVlLCBSZWN0LCBSZXNwb25zaXZlTW9kZSwgV2lkdGhBbmRIZWlnaHQgfSBmcm9tICcuL3V0aWxzL3R5cGVzJztcclxuaW1wb3J0IHtcclxuICAgIGdldEVsZW1lbnRDbGllbnRXaWR0aEFuZEhlaWdodCxcclxuICAgIGdldFdpbmRvd0lubmVyU2NyZWVuUG9zaXRpb24sXHJcbiAgICByZW1vdmVGcm9tQXJyYXksXHJcbiAgICBzZXRFbGVtZW50SGVpZ2h0LFxyXG4gICAgc2V0RWxlbWVudFdpZHRoXHJcbn0gZnJvbSAnLi91dGlscy91dGlscyc7XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmRlY2xhcmUgZ2xvYmFsIHtcclxuICAgIGludGVyZmFjZSBXaW5kb3cge1xyXG4gICAgICAgIF9fZ2xJbnN0YW5jZTogTGF5b3V0TWFuYWdlcjtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoZSBtYWluIGNsYXNzIHRoYXQgd2lsbCBiZSBleHBvc2VkIGFzIEdvbGRlbkxheW91dC5cclxuICovXHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTGF5b3V0TWFuYWdlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICAvKiogV2hldGhlciB0aGUgbGF5b3V0IHdpbGwgYmUgYXV0b21hdGljYWxseSBiZSByZXNpemVkIHRvIGNvbnRhaW5lciB3aGVuZXZlciB0aGUgY29udGFpbmVyJ3Mgc2l6ZSBpcyBjaGFuZ2VkXHJcbiAgICAgKiBEZWZhdWx0IGlzIHRydWUgaWYgPGJvZHk+IGlzIHRoZSBjb250YWluZXIgb3RoZXJ3aXNlIGZhbHNlXHJcbiAgICAgKiBEZWZhdWx0IHdpbGwgYmUgY2hhbmdlZCB0byB0cnVlIGZvciBhbnkgY29udGFpbmVyIGluIHRoZSBmdXR1cmVcclxuICAgICAqL1xyXG4gICAgcmVzaXplV2l0aENvbnRhaW5lckF1dG9tYXRpY2FsbHkgPSBmYWxzZTtcclxuICAgIC8qKiBUaGUgZGVib3VuY2UgaW50ZXJ2YWwgKGluIG1pbGxpc2Vjb25kcykgdXNlZCB3aGVuZXZlciBhIGxheW91dCBpcyBhdXRvbWF0aWNhbGx5IHJlc2l6ZWQuICAwIG1lYW5zIG5leHQgdGljayAqL1xyXG4gICAgcmVzaXplRGVib3VuY2VJbnRlcnZhbCA9IDEwMDtcclxuICAgIC8qKiBFeHRlbmQgdGhlIGN1cnJlbnQgZGVib3VuY2UgZGVsYXkgdGltZSBwZXJpb2QgaWYgaXQgaXMgdHJpZ2dlcmVkIGR1cmluZyB0aGUgZGVsYXkuXHJcbiAgICAgKiBJZiB0aGlzIGlzIHRydWUsIHRoZSBsYXlvdXQgd2lsbCBvbmx5IHJlc2l6ZSB3aGVuIGl0cyBjb250YWluZXIgaGFzIHN0b3BwZWQgYmVpbmcgcmVzaXplZC5cclxuICAgICAqIElmIGl0IGlzIGZhbHNlLCB0aGUgbGF5b3V0IHdpbGwgcmVzaXplIGF0IGludGVydmFscyB3aGlsZSBpdHMgY29udGFpbmVyIGlzIGJlaW5nIHJlc2l6ZWQuXHJcbiAgICAgKi9cclxuICAgIHJlc2l6ZURlYm91bmNlRXh0ZW5kZWRXaGVuUG9zc2libGUgPSB0cnVlO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2NvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaXNJbml0aWFsaXNlZCA9IGZhbHNlO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfZ3JvdW5kSXRlbTogR3JvdW5kSXRlbSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX29wZW5Qb3BvdXRzOiBCcm93c2VyUG9wb3V0W10gPSBbXTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2Ryb3BUYXJnZXRJbmRpY2F0b3I6IERyb3BUYXJnZXRJbmRpY2F0b3IgfCBudWxsID0gbnVsbDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3RyYW5zaXRpb25JbmRpY2F0b3I6IFRyYW5zaXRpb25JbmRpY2F0b3IgfCBudWxsID0gbnVsbDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3Jlc2l6ZVRpbWVvdXRJZDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9pdGVtQXJlYXM6IENvbnRlbnRJdGVtLkFyZWFbXSA9IFtdO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfbWF4aW1pc2VkU3RhY2s6IFN0YWNrIHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfbWF4aW1pc2VQbGFjZWhvbGRlciA9IExheW91dE1hbmFnZXIuY3JlYXRlTWF4aW1pc2VQbGFjZUVsZW1lbnQoZG9jdW1lbnQpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfdGFiRHJvcFBsYWNlaG9sZGVyID0gTGF5b3V0TWFuYWdlci5jcmVhdGVUYWJEcm9wUGxhY2Vob2xkZXJFbGVtZW50KGRvY3VtZW50KTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2RyYWdTb3VyY2VzOiBEcmFnU291cmNlW10gPSBbXTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3VwZGF0aW5nQ29sdW1uc1Jlc3BvbnNpdmUgPSBmYWxzZTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2ZpcnN0TG9hZCA9IHRydWU7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9ldmVudEh1YiA9IG5ldyBFdmVudEh1Yih0aGlzKTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3dpZHRoOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2hlaWdodDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9mb2N1c2VkQ29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSB8IHVuZGVmaW5lZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3ZpcnR1YWxTaXplZENvbnRhaW5lcnM6IENvbXBvbmVudENvbnRhaW5lcltdID0gW107XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF92aXJ0dWFsU2l6ZWRDb250YWluZXJBZGRpbmdCZWdpbkNvdW50ID0gMDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3NpemVJbnZhbGlkYXRpb25CZWdpbkNvdW50ID0gMDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByb3RlY3RlZCBfY29uc3RydWN0b3JPclN1YldpbmRvd0xheW91dENvbmZpZzogTGF5b3V0Q29uZmlnIHwgdW5kZWZpbmVkOyAvLyBwcm90ZWN0ZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9wYXJlbnQ6IExheW91dE1hbmFnZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB0aGlzLmhhbmRsZUNvbnRhaW5lclJlc2l6ZSgpKTtcclxuICAgIC8qKiBAaW50ZXJuYWwgQGRlcHJlY2F0ZWQgdG8gYmUgcmVtb3ZlZCBpbiB2ZXJzaW9uIDMgKi9cclxuICAgIHByaXZhdGUgX3dpbmRvd0JlZm9yZVVubG9hZExpc3RlbmVyID0gKCkgPT4gdGhpcy5vbkJlZm9yZVVubG9hZCgpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCBAZGVwcmVjYXRlZCB0byBiZSByZW1vdmVkIGluIHZlcnNpb24gMyAqL1xyXG4gICAgcHJpdmF0ZSBfd2luZG93QmVmb3JlVW5sb2FkTGlzdGVuaW5nID0gZmFsc2U7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9tYXhpbWlzZWRTdGFja0JlZm9yZURlc3Ryb3llZExpc3RlbmVyID0gKGV2OiBFdmVudEVtaXR0ZXIuQnViYmxpbmdFdmVudCkgPT4gdGhpcy5jbGVhbnVwQmVmb3JlTWF4aW1pc2VkU3RhY2tEZXN0cm95ZWQoZXYpO1xyXG5cclxuICAgIHJlYWRvbmx5IGlzU3ViV2luZG93OiBib29sZWFuO1xyXG4gICAgbGF5b3V0Q29uZmlnOiBSZXNvbHZlZExheW91dENvbmZpZztcclxuXHJcbiAgICBiZWZvcmVWaXJ0dWFsUmVjdGluZ0V2ZW50OiBMYXlvdXRNYW5hZ2VyLkJlZm9yZVZpcnR1YWxSZWN0aW5nRXZlbnQgfCB1bmRlZmluZWQ7XHJcbiAgICBhZnRlclZpcnR1YWxSZWN0aW5nRXZlbnQ6IExheW91dE1hbmFnZXIuQWZ0ZXJWaXJ0dWFsUmVjdGluZ0V2ZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW92ZXMgdGhlIGFzc29jaWF0ZWQgd2luZG93IHRvIHRoZSBmcm9udC5cclxuICAgICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gaGFzIG5vIGVmZmVjdCAoY2FuIGJlIHNldCBieSBFbGVjdHJvbikuXHJcbiAgICAgKiBAcHVibGljIFxyXG4gICAgICovXHJcbiAgICBtb3ZlV2luZG93VG9wOiAodGhpczogdm9pZCkgPT4gdm9pZCA9ICgpID0+IHt9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRm9jdXMgdGhlIGFzc29jaWF0ZWQgd2luZG93IHdpbmRvdy5cclxuICAgICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gaW52b2tlcyB3aW5kb3cuZm9jdXMoKSAoY2FuIGJlIHNldCBieSBFbGVjdHJvbikuXHJcbiAgICAgKiBAcHVibGljIFxyXG4gICAgICovXHJcbiAgICBmb2N1c1dpbmRvdzogKHRoaXM6IHZvaWQpID0+IHZvaWQgPSAoKSA9PiBnbG9iYWxUaGlzLmZvY3VzKCk7XHJcblxyXG4gICAgZ2V0IGNvbnRhaW5lcigpOiBIVE1MRWxlbWVudCB7IHJldHVybiB0aGlzLl9jb250YWluZXJFbGVtZW50OyB9XHJcbiAgICBnZXQgaXNJbml0aWFsaXNlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2lzSW5pdGlhbGlzZWQ7IH1cclxuICAgIGdldCBpc0RyYWdnaW5nKCk6IGJvb2xlYW4geyByZXR1cm4gZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5EcmFnZ2luZyk7IH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGdldCBncm91bmRJdGVtKCk6IEdyb3VuZEl0ZW0gfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fZ3JvdW5kSXRlbTsgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChMYXlvdXRNYW5hZ2VyOmNsYXNzKS5ncm91bmRJdGVtfSBpbnN0ZWFkICovXHJcbiAgICBnZXQgcm9vdCgpOiBHcm91bmRJdGVtIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX2dyb3VuZEl0ZW07IH1cclxuICAgIGdldCBvcGVuUG9wb3V0cygpOiBCcm93c2VyUG9wb3V0W10geyByZXR1cm4gdGhpcy5fb3BlblBvcG91dHM7IH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGdldCBkcm9wVGFyZ2V0SW5kaWNhdG9yKCk6IERyb3BUYXJnZXRJbmRpY2F0b3IgfCBudWxsIHsgcmV0dXJuIHRoaXMuX2Ryb3BUYXJnZXRJbmRpY2F0b3I7IH1cclxuICAgIC8qKiBAaW50ZXJuYWwgQGRlcHJlY2F0ZWQgVG8gYmUgcmVtb3ZlZCAqL1xyXG4gICAgZ2V0IHRyYW5zaXRpb25JbmRpY2F0b3IoKTogVHJhbnNpdGlvbkluZGljYXRvciB8IG51bGwgeyByZXR1cm4gdGhpcy5fdHJhbnNpdGlvbkluZGljYXRvcjsgfVxyXG4gICAgZ2V0IHdpZHRoKCk6IG51bWJlciB8IG51bGwgeyByZXR1cm4gdGhpcy5fd2lkdGg7IH1cclxuICAgIGdldCBoZWlnaHQoKTogbnVtYmVyIHwgbnVsbCB7IHJldHVybiB0aGlzLl9oZWlnaHQ7IH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIHRoZSB7QGxpbmsgKEV2ZW50SHViOmNsYXNzKX0gaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbGF5b3V0IG1hbmFnZXIuXHJcbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIHByb3BhZ2F0ZSBldmVudHMgYmV0d2VlbiB0aGUgd2luZG93c1xyXG4gICAgICogQHB1YmxpY1xyXG4gICAgICovXHJcbiAgICBnZXQgZXZlbnRIdWIoKTogRXZlbnRIdWIgeyByZXR1cm4gdGhpcy5fZXZlbnRIdWI7IH1cclxuICAgIGdldCByb290SXRlbSgpOiBDb250ZW50SXRlbSB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhY2Nlc3Mgcm9vdEl0ZW0gYmVmb3JlIGluaXQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBncm91bmRDb250ZW50SXRlbXMgPSB0aGlzLl9ncm91bmRJdGVtLmNvbnRlbnRJdGVtcztcclxuICAgICAgICAgICAgaWYgKGdyb3VuZENvbnRlbnRJdGVtcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ3JvdW5kSXRlbS5jb250ZW50SXRlbXNbMF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXQgZm9jdXNlZENvbXBvbmVudEl0ZW0oKTogQ29tcG9uZW50SXRlbSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9mb2N1c2VkQ29tcG9uZW50SXRlbTsgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZ2V0IHRhYkRyb3BQbGFjZWhvbGRlcigpOiBIVE1MRWxlbWVudCB7IHJldHVybiB0aGlzLl90YWJEcm9wUGxhY2Vob2xkZXI7IH1cclxuICAgIGdldCBtYXhpbWlzZWRTdGFjaygpOiBTdGFjayB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9tYXhpbWlzZWRTdGFjazsgfVxyXG5cclxuICAgIC8qKiBAZGVwcmVjYXRlZCBpbmRpY2F0ZXMgZGVwcmVjYXRlZCBjb25zdHJ1Y3RvciB1c2UgKi9cclxuICAgIGdldCBkZXByZWNhdGVkQ29uc3RydWN0b3IoKTogYm9vbGVhbiB7IHJldHVybiAhdGhpcy5pc1N1YldpbmRvdyAmJiB0aGlzLl9jb25zdHJ1Y3Rvck9yU3ViV2luZG93TGF5b3V0Q29uZmlnICE9PSB1bmRlZmluZWQ7IH1cclxuXHJcbiAgICBnZXQgcGFyZW50KCk6IExheW91dE1hbmFnZXIgfCBudWxsIHsgcmV0dXJuIHRoaXMuX3BhcmVudDsgfVxyXG4gICAgc2V0IHBhcmVudCh2YWx1ZTogTGF5b3V0TWFuYWdlciB8IG51bGwpIHsgdGhpcy5fcGFyZW50ID0gdmFsdWU7IH1cclxuXHJcbiAgICBnZXQgaW5zdGFuY2VzKCk6IExheW91dE1hbmFnZXJbXSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBMYXlvdXRNYW5hZ2VyW10gPSBbXTtcclxuXHJcbiAgICAgICAgY29uc3Qgcm9vdCA9IHRoaXMucGFyZW50ID8/IHRoaXM7XHJcbiAgICAgICAgcmVzdWx0LnB1c2gocm9vdCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IHBvcG91dCBvZiByb290Lm9wZW5Qb3BvdXRzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gcG9wb3V0LmdldEdsSW5zdGFuY2UoKTtcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goY2hpbGQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogQHBhcmFtIGNvbnRhaW5lciAtIEEgRG9tIEhUTUwgZWxlbWVudC4gRGVmYXVsdHMgdG8gYm9keVxyXG4gICAgKiBAaW50ZXJuYWxcclxuICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzOiBMYXlvdXRNYW5hZ2VyLkNvbnN0cnVjdG9yUGFyYW1ldGVycykge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcblxyXG4gICAgICAgIHRoaXMuaXNTdWJXaW5kb3cgPSBwYXJhbWV0ZXJzLmlzU3ViV2luZG93O1xyXG5cclxuICAgICAgICB0aGlzLl9jb25zdHJ1Y3Rvck9yU3ViV2luZG93TGF5b3V0Q29uZmlnID0gcGFyYW1ldGVycy5jb25zdHJ1Y3Rvck9yU3ViV2luZG93TGF5b3V0Q29uZmlnO1xyXG5cclxuICAgICAgICBJMThuU3RyaW5ncy5jaGVja0luaXRpYWxpc2UoKTtcclxuICAgICAgICBDb25maWdNaW5pZmllci5jaGVja0luaXRpYWxpc2UoKTtcclxuXHJcbiAgICAgICAgaWYgKHBhcmFtZXRlcnMuY29udGFpbmVyRWxlbWVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lckVsZW1lbnQgPSBwYXJhbWV0ZXJzLmNvbnRhaW5lckVsZW1lbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVzdHJveXMgdGhlIExheW91dE1hbmFnZXIgaW5zdGFuY2UgaXRzZWxmIGFzIHdlbGwgYXMgZXZlcnkgQ29udGVudEl0ZW1cclxuICAgICAqIHdpdGhpbiBpdC4gQWZ0ZXIgdGhpcyBpcyBjYWxsZWQgbm90aGluZyBzaG91bGQgYmUgbGVmdCBvZiB0aGUgTGF5b3V0TWFuYWdlci5cclxuICAgICAqXHJcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIG9ubHkgbmVlZHMgdG8gYmUgY2FsbGVkIGlmIGFuIGFwcGxpY2F0aW9uIHdpc2hlcyB0byBkZXN0cm95IHRoZSBHb2xkZW4gTGF5b3V0IG9iamVjdCB3aGlsZVxyXG4gICAgICogYSBwYWdlIHJlbWFpbnMgbG9hZGVkLiBXaGVuIGEgcGFnZSBpcyB1bmxvYWRlZCwgYWxsIHJlc291cmNlcyBjbGFpbWVkIGJ5IEdvbGRlbiBMYXlvdXQgd2lsbCBhdXRvbWF0aWNhbGx5XHJcbiAgICAgKiBiZSByZWxlYXNlZC5cclxuICAgICAqL1xyXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5faXNJbml0aWFsaXNlZCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fd2luZG93QmVmb3JlVW5sb2FkTGlzdGVuaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBnbG9iYWxUaGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIHRoaXMuX3dpbmRvd0JlZm9yZVVubG9hZExpc3RlbmVyKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3dpbmRvd0JlZm9yZVVubG9hZExpc3RlbmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5sYXlvdXRDb25maWcuc2V0dGluZ3MuY2xvc2VQb3BvdXRzT25VbmxvYWQgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VBbGxPcGVuUG9wb3V0cygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9yZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tDbGVhclJlc2l6ZVRpbWVvdXQoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2dyb3VuZEl0ZW0uZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX3RhYkRyb3BQbGFjZWhvbGRlci5yZW1vdmUoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2Ryb3BUYXJnZXRJbmRpY2F0b3IgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Ryb3BUYXJnZXRJbmRpY2F0b3IuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl90cmFuc2l0aW9uSW5kaWNhdG9yICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2l0aW9uSW5kaWNhdG9yLmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9ldmVudEh1Yi5kZXN0cm95KCk7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRyYWdTb3VyY2Ugb2YgdGhpcy5fZHJhZ1NvdXJjZXMpIHtcclxuICAgICAgICAgICAgICAgIGRyYWdTb3VyY2UuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2RyYWdTb3VyY2VzID0gW107XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9pc0luaXRpYWxpc2VkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGFrZXMgYSBHb2xkZW5MYXlvdXQgY29uZmlndXJhdGlvbiBvYmplY3QgYW5kXHJcbiAgICAgKiByZXBsYWNlcyBpdHMga2V5cyBhbmQgdmFsdWVzIHJlY3Vyc2l2ZWx5IHdpdGhcclxuICAgICAqIG9uZSBsZXR0ZXIgY29kZXNcclxuICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKFJlc29sdmVkTGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkubWluaWZ5Q29uZmlnfSBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIG1pbmlmeUNvbmZpZyhjb25maWc6IFJlc29sdmVkTGF5b3V0Q29uZmlnKTogUmVzb2x2ZWRMYXlvdXRDb25maWcge1xyXG4gICAgICAgIHJldHVybiBSZXNvbHZlZExheW91dENvbmZpZy5taW5pZnlDb25maWcoY29uZmlnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgY29uZmlndXJhdGlvbiBPYmplY3QgdGhhdCB3YXMgcHJldmlvdXNseSBtaW5pZmllZFxyXG4gICAgICogdXNpbmcgbWluaWZ5Q29uZmlnIGFuZCByZXR1cm5zIGl0cyBvcmlnaW5hbCB2ZXJzaW9uXHJcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChSZXNvbHZlZExheW91dENvbmZpZzpuYW1lc3BhY2UpLnVubWluaWZ5Q29uZmlnfSBpbnN0ZWFkXHJcbiAgICAgKi9cclxuICAgIHVubWluaWZ5Q29uZmlnKGNvbmZpZzogUmVzb2x2ZWRMYXlvdXRDb25maWcpOiBSZXNvbHZlZExheW91dENvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIFJlc29sdmVkTGF5b3V0Q29uZmlnLnVubWluaWZ5Q29uZmlnKGNvbmZpZyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgYWJzdHJhY3QgYmluZENvbXBvbmVudChjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgaXRlbUNvbmZpZzogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnKTogQ29tcG9uZW50Q29udGFpbmVyLkJpbmRhYmxlQ29tcG9uZW50O1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgYWJzdHJhY3QgdW5iaW5kQ29tcG9uZW50KGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCB2aXJ0dWFsOiBib29sZWFuLCBjb21wb25lbnQ6IENvbXBvbmVudENvbnRhaW5lci5Db21wb25lbnQgfCB1bmRlZmluZWQpOiB2b2lkO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGZyb20gR29sZGVuTGF5b3V0IGNsYXNzLiBGaW5pc2hlcyBvZiBpbml0XHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgaW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNldENvbnRhaW5lcigpO1xyXG4gICAgICAgIHRoaXMuX2Ryb3BUYXJnZXRJbmRpY2F0b3IgPSBuZXcgRHJvcFRhcmdldEluZGljYXRvcigvKnRoaXMuY29udGFpbmVyKi8pO1xyXG4gICAgICAgIHRoaXMuX3RyYW5zaXRpb25JbmRpY2F0b3IgPSBuZXcgVHJhbnNpdGlvbkluZGljYXRvcigpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2l6ZUZyb21Db250YWluZXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5sYXlvdXRDb25maWcgPSBSZXNvbHZlZExheW91dENvbmZpZy5jcmVhdGVEZWZhdWx0KCk7IC8vIHdpbGwgb3ZlcndyaXR0ZW4gYmUgbG9hZGVkIHZpYSBsb2FkTGF5b3V0XHJcbiAgICAgICAgdGhpcy5fZ3JvdW5kSXRlbSA9IG5ldyBHcm91bmRJdGVtKHRoaXMsIHRoaXMubGF5b3V0Q29uZmlnLnJvb3QsIHRoaXMuX2NvbnRhaW5lckVsZW1lbnQpO1xyXG4gICAgICAgIHRoaXMuX2dyb3VuZEl0ZW0uaW5pdCgpO1xyXG5cclxuICAgICAgICB0aGlzLmNoZWNrTG9hZGVkTGF5b3V0TWF4aW1pc2VJdGVtKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3Jlc2l6ZU9ic2VydmVyLm9ic2VydmUodGhpcy5fY29udGFpbmVyRWxlbWVudCk7XHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXNlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5hZGp1c3RDb2x1bW5zUmVzcG9uc2l2ZSgpO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnaW5pdGlhbGlzZWQnKTtcclxuXHJcbiAgICAgICAgbGV0IGxheW91dCA9IHRoaXMuX2NvbnN0cnVjdG9yT3JTdWJXaW5kb3dMYXlvdXRDb25maWc7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzU3ViV2luZG93ICYmIGxheW91dCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIC8vIFdyYXAgaW4gc3RhY2sgZm9yIG11bHRpd2luZG93IGRyYWctYW5kLWRyb3AgdG8gd29yayBwcm9wZXJseVxyXG4gICAgICAgICAgICBpZiAobGF5b3V0LnJvb3Q/LnR5cGUgPT0gSXRlbVR5cGUuY29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgICAgICBsYXlvdXQucm9vdCA9IHtcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBJdGVtVHlwZS5zdGFjayxcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBbIGxheW91dC5yb290IF0sXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmxvYWRMYXlvdXQobGF5b3V0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMb2FkcyBhIG5ldyBsYXlvdXRcclxuICAgICAqIEBwYXJhbSBsYXlvdXRDb25maWcgLSBOZXcgbGF5b3V0IHRvIGJlIGxvYWRlZFxyXG4gICAgICovXHJcbiAgICBsb2FkTGF5b3V0KGxheW91dENvbmZpZzogTGF5b3V0Q29uZmlnKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhbGlzZWQpIHtcclxuICAgICAgICAgICAgLy8gSW4gY2FzZSBhcHBsaWNhdGlvbiBub3QgY29ycmVjdGx5IHVzaW5nIGxlZ2FjeSBjb25zdHJ1Y3RvclxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0dvbGRlbkxheW91dDogTmVlZCB0byBjYWxsIGluaXQoKSBpZiBMYXlvdXRDb25maWcgd2l0aCBkZWZpbmVkIHJvb3QgcGFzc2VkIHRvIGNvbnN0cnVjdG9yJylcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTUxMMTExMTknKTtcclxuICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxheW91dENvbmZpZyA9IExheW91dENvbmZpZy5yZXNvbHZlKGxheW91dENvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVN1YldpbmRvd3MoKTsgLy8gc3RpbGwgbmVlZHMgdG8gYmUgdGVzdGVkXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ncm91bmRJdGVtLmxvYWRSb290KHRoaXMubGF5b3V0Q29uZmlnLnJvb3QpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0xvYWRlZExheW91dE1heGltaXNlSXRlbSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGp1c3RDb2x1bW5zUmVzcG9uc2l2ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIGxheW91dCBjb25maWd1cmF0aW9uIG9iamVjdCBiYXNlZCBvbiB0aGUgdGhlIGN1cnJlbnQgc3RhdGVcclxuICAgICAqXHJcbiAgICAgKiBAcHVibGljXHJcbiAgICAgKiBAcmV0dXJucyBHb2xkZW5MYXlvdXQgY29uZmlndXJhdGlvblxyXG4gICAgICovXHJcbiAgICBzYXZlTGF5b3V0KCk6IFJlc29sdmVkTGF5b3V0Q29uZmlnIHtcclxuICAgICAgICBpZiAodGhpcy5faXNJbml0aWFsaXNlZCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGNyZWF0ZSBjb25maWcsIGxheW91dCBub3QgeWV0IGluaXRpYWxpc2VkJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmIChyb290ICE9PSB1bmRlZmluZWQgJiYgIShyb290IGluc3RhbmNlb2YgQ29udGVudEl0ZW0pKSB7XHJcbiAgICAgICAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jvb3QgbXVzdCBiZSBhIENvbnRlbnRJdGVtJyk7XHJcbiAgICAgICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICogQ29udGVudFxyXG4gICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTVRDMTgyNDQnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VuZENvbnRlbnQgPSB0aGlzLl9ncm91bmRJdGVtLmNhbGN1bGF0ZUNvbmZpZ0NvbnRlbnQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgcm9vdEl0ZW1Db25maWc6IFJlc29sdmVkUm9vdEl0ZW1Db25maWcgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdW5kQ29udGVudC5sZW5ndGggIT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICByb290SXRlbUNvbmZpZyA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm9vdEl0ZW1Db25maWcgPSBncm91bmRDb250ZW50WzBdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICAgICAqIFJldHJpZXZlIGNvbmZpZyBmb3Igc3Vid2luZG93c1xyXG4gICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIHRoaXMucmVjb25jaWxlUG9wb3V0V2luZG93cygpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb3BlblBvcG91dHM6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnW10gPSBbXTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fb3BlblBvcG91dHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBvcGVuUG9wb3V0cy5wdXNoKHRoaXMuX29wZW5Qb3BvdXRzW2ldLnRvQ29uZmlnKCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpZzogUmVzb2x2ZWRMYXlvdXRDb25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm9vdDogcm9vdEl0ZW1Db25maWcsXHJcbiAgICAgICAgICAgICAgICAgICAgb3BlblBvcG91dHMsXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6ICBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5jcmVhdGVDb3B5KHRoaXMubGF5b3V0Q29uZmlnLnNldHRpbmdzKSxcclxuICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb25zOiBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zLmNyZWF0ZUNvcHkodGhpcy5sYXlvdXRDb25maWcuZGltZW5zaW9ucyksXHJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyOiBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIuY3JlYXRlQ29weSh0aGlzLmxheW91dENvbmZpZy5oZWFkZXIpLFxyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVkOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBjb25maWc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGFueSBleGlzdGluZyBsYXlvdXQuIEVmZmVjdGl2ZWx5LCBhbiBlbXB0eSBsYXlvdXQgd2lsbCBiZSBsb2FkZWQuXHJcbiAgICAgKi9cclxuXHJcbiAgICBjbGVhcigpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0xNQ0wxMTEyOScpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2dyb3VuZEl0ZW0uY2xlYXJSb290KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAoTGF5b3V0TWFuYWdlcjpjbGFzcykuc2F2ZUxheW91dH1cclxuICAgICAqL1xyXG4gICAgdG9Db25maWcoKTogUmVzb2x2ZWRMYXlvdXRDb25maWcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNhdmVMYXlvdXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBuZXcgQ29tcG9uZW50SXRlbS4gIFdpbGwgdXNlIGRlZmF1bHQgbG9jYXRpb24gc2VsZWN0b3JzIHRvIGVuc3VyZSBhIGxvY2F0aW9uIGlzIGZvdW5kIGFuZFxyXG4gICAgICogY29tcG9uZW50IGlzIHN1Y2Nlc3NmdWxseSBhZGRlZFxyXG4gICAgICogQHBhcmFtIGNvbXBvbmVudFR5cGVOYW1lIC0gTmFtZSBvZiBjb21wb25lbnQgdHlwZSB0byBiZSBjcmVhdGVkLlxyXG4gICAgICogQHBhcmFtIHN0YXRlIC0gT3B0aW9uYWwgaW5pdGlhbCBzdGF0ZSB0byBiZSBhc3NpZ25lZCB0byBjb21wb25lbnRcclxuICAgICAqIEByZXR1cm5zIE5ldyBDb21wb25lbnRJdGVtIGNyZWF0ZWQuXHJcbiAgICAgKi9cclxuICAgIG5ld0NvbXBvbmVudChjb21wb25lbnRUeXBlOiBKc29uVmFsdWUsIGNvbXBvbmVudFN0YXRlPzogSnNvblZhbHVlLCB0aXRsZT86IHN0cmluZyk6IENvbXBvbmVudEl0ZW0ge1xyXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudEl0ZW0gPSB0aGlzLm5ld0NvbXBvbmVudEF0TG9jYXRpb24oY29tcG9uZW50VHlwZSwgY29tcG9uZW50U3RhdGUsIHRpdGxlKTtcclxuICAgICAgICBpZiAoY29tcG9uZW50SXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignTE1OQzY1NTg4Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudEl0ZW07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIENvbXBvbmVudEl0ZW0gYXQgdGhlIGZpcnN0IHZhbGlkIHNlbGVjdG9yIGxvY2F0aW9uLlxyXG4gICAgICogQHBhcmFtIGNvbXBvbmVudFR5cGVOYW1lIC0gTmFtZSBvZiBjb21wb25lbnQgdHlwZSB0byBiZSBjcmVhdGVkLlxyXG4gICAgICogQHBhcmFtIHN0YXRlIC0gT3B0aW9uYWwgaW5pdGlhbCBzdGF0ZSB0byBiZSBhc3NpZ25lZCB0byBjb21wb25lbnRcclxuICAgICAqIEBwYXJhbSBsb2NhdGlvblNlbGVjdG9ycyAtIEFycmF5IG9mIGxvY2F0aW9uIHNlbGVjdG9ycyB1c2VkIHRvIGZpbmQgbG9jYXRpb24gaW4gbGF5b3V0IHdoZXJlIGNvbXBvbmVudFxyXG4gICAgICogd2lsbCBiZSBhZGRlZC4gRmlyc3QgbG9jYXRpb24gaW4gYXJyYXkgd2hpY2ggaXMgdmFsaWQgd2lsbCBiZSB1c2VkLiBJZiBsb2NhdGlvblNlbGVjdG9ycyBpcyB1bmRlZmluZWQsXHJcbiAgICAgKiB7QGxpbmsgKExheW91dE1hbmFnZXI6bmFtZXNwYWNlKS5kZWZhdWx0TG9jYXRpb25TZWxlY3RvcnN9IHdpbGwgYmUgdXNlZFxyXG4gICAgICogQHJldHVybnMgTmV3IENvbXBvbmVudEl0ZW0gY3JlYXRlZCBvciB1bmRlZmluZWQgaWYgbm8gdmFsaWQgbG9jYXRpb24gc2VsZWN0b3Igd2FzIGluIGFycmF5LlxyXG4gICAgICovXHJcbiAgICBuZXdDb21wb25lbnRBdExvY2F0aW9uKGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZSwgY29tcG9uZW50U3RhdGU/OiBKc29uVmFsdWUsIHRpdGxlPzogc3RyaW5nLFxyXG4gICAgICAgIGxvY2F0aW9uU2VsZWN0b3JzPzogTGF5b3V0TWFuYWdlci5Mb2NhdGlvblNlbGVjdG9yW11cclxuICAgICk6IENvbXBvbmVudEl0ZW0gfCB1bmRlZmluZWR7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhZGQgY29tcG9uZW50IGJlZm9yZSBpbml0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLmFkZENvbXBvbmVudEF0TG9jYXRpb24oY29tcG9uZW50VHlwZSwgY29tcG9uZW50U3RhdGUsIHRpdGxlLCBsb2NhdGlvblNlbGVjdG9ycyk7XHJcbiAgICAgICAgICAgIGlmIChsb2NhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZEl0ZW0gPSBsb2NhdGlvbi5wYXJlbnRJdGVtLmNvbnRlbnRJdGVtc1tsb2NhdGlvbi5pbmRleF07XHJcbiAgICAgICAgICAgICAgICBpZiAoIUNvbnRlbnRJdGVtLmlzQ29tcG9uZW50SXRlbShjcmVhdGVkSXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNTkM5OTI4Nzc1MzMnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZWRJdGVtO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIG5ldyBDb21wb25lbnRJdGVtLiAgV2lsbCB1c2UgZGVmYXVsdCBsb2NhdGlvbiBzZWxlY3RvcnMgdG8gZW5zdXJlIGEgbG9jYXRpb24gaXMgZm91bmQgYW5kXHJcbiAgICAgKiBjb21wb25lbnQgaXMgc3VjY2Vzc2Z1bGx5IGFkZGVkXHJcbiAgICAgKiBAcGFyYW0gY29tcG9uZW50VHlwZSAtIFR5cGUgb2YgY29tcG9uZW50IHRvIGJlIGNyZWF0ZWQuXHJcbiAgICAgKiBAcGFyYW0gc3RhdGUgLSBPcHRpb25hbCBpbml0aWFsIHN0YXRlIHRvIGJlIGFzc2lnbmVkIHRvIGNvbXBvbmVudFxyXG4gICAgICogQHJldHVybnMgTG9jYXRpb24gb2YgbmV3IENvbXBvbmVudEl0ZW0gY3JlYXRlZC5cclxuICAgICAqL1xyXG4gICAgYWRkQ29tcG9uZW50KGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZSwgY29tcG9uZW50U3RhdGU/OiBKc29uVmFsdWUsIHRpdGxlPzogc3RyaW5nKTogTGF5b3V0TWFuYWdlci5Mb2NhdGlvbiB7XHJcbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLmFkZENvbXBvbmVudEF0TG9jYXRpb24oY29tcG9uZW50VHlwZSwgY29tcG9uZW50U3RhdGUsIHRpdGxlKTtcclxuICAgICAgICBpZiAobG9jYXRpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNQUM5OTk0MycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgQ29tcG9uZW50SXRlbSBhdCB0aGUgZmlyc3QgdmFsaWQgc2VsZWN0b3IgbG9jYXRpb24uXHJcbiAgICAgKiBAcGFyYW0gY29tcG9uZW50VHlwZSAtIFR5cGUgb2YgY29tcG9uZW50IHRvIGJlIGNyZWF0ZWQuXHJcbiAgICAgKiBAcGFyYW0gc3RhdGUgLSBPcHRpb25hbCBpbml0aWFsIHN0YXRlIHRvIGJlIGFzc2lnbmVkIHRvIGNvbXBvbmVudFxyXG4gICAgICogQHBhcmFtIGxvY2F0aW9uU2VsZWN0b3JzIC0gQXJyYXkgb2YgbG9jYXRpb24gc2VsZWN0b3JzIHVzZWQgdG8gZmluZCBkZXRlcm1pbmUgbG9jYXRpb24gaW4gbGF5b3V0IHdoZXJlIGNvbXBvbmVudFxyXG4gICAgICogd2lsbCBiZSBhZGRlZC4gRmlyc3QgbG9jYXRpb24gaW4gYXJyYXkgd2hpY2ggaXMgdmFsaWQgd2lsbCBiZSB1c2VkLiBJZiB1bmRlZmluZWQsXHJcbiAgICAgKiB7QGxpbmsgKExheW91dE1hbmFnZXI6bmFtZXNwYWNlKS5kZWZhdWx0TG9jYXRpb25TZWxlY3RvcnN9IHdpbGwgYmUgdXNlZC5cclxuICAgICAqIEByZXR1cm5zIExvY2F0aW9uIG9mIG5ldyBDb21wb25lbnRJdGVtIGNyZWF0ZWQgb3IgdW5kZWZpbmVkIGlmIG5vIHZhbGlkIGxvY2F0aW9uIHNlbGVjdG9yIHdhcyBpbiBhcnJheS5cclxuICAgICAqL1xyXG4gICAgYWRkQ29tcG9uZW50QXRMb2NhdGlvbihjb21wb25lbnRUeXBlOiBKc29uVmFsdWUsIGNvbXBvbmVudFN0YXRlPzogSnNvblZhbHVlLCB0aXRsZT86IHN0cmluZyxcclxuICAgICAgICBsb2NhdGlvblNlbGVjdG9ycz86IHJlYWRvbmx5IExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3RvcltdXHJcbiAgICApOiBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBjb25zdCBpdGVtQ29uZmlnOiBDb21wb25lbnRJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiAnY29tcG9uZW50JyxcclxuICAgICAgICAgICAgY29tcG9uZW50VHlwZSxcclxuICAgICAgICAgICAgY29tcG9uZW50U3RhdGUsXHJcbiAgICAgICAgICAgIHRpdGxlLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmFkZEl0ZW1BdExvY2F0aW9uKGl0ZW1Db25maWcsIGxvY2F0aW9uU2VsZWN0b3JzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBuZXcgQ29udGVudEl0ZW0uICBXaWxsIHVzZSBkZWZhdWx0IGxvY2F0aW9uIHNlbGVjdG9ycyB0byBlbnN1cmUgYSBsb2NhdGlvbiBpcyBmb3VuZCBhbmRcclxuICAgICAqIGNvbXBvbmVudCBpcyBzdWNjZXNzZnVsbHkgYWRkZWRcclxuICAgICAqIEBwYXJhbSBpdGVtQ29uZmlnIC0gUmVzb2x2ZWRJdGVtQ29uZmlnIG9mIGNoaWxkIHRvIGJlIGFkZGVkLlxyXG4gICAgICogQHJldHVybnMgTmV3IENvbnRlbnRJdGVtIGNyZWF0ZWQuXHJcbiAgICAqL1xyXG4gICAgbmV3SXRlbShpdGVtQ29uZmlnOiBSb3dPckNvbHVtbkl0ZW1Db25maWcgfCBTdGFja0l0ZW1Db25maWcgfCBDb21wb25lbnRJdGVtQ29uZmlnKTogQ29udGVudEl0ZW0ge1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gdGhpcy5uZXdJdGVtQXRMb2NhdGlvbihpdGVtQ29uZmlnKTtcclxuICAgICAgICBpZiAoY29udGVudEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNTkM2NTU4OCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjb250ZW50SXRlbTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgbmV3IGNoaWxkIENvbnRlbnRJdGVtIHVuZGVyIHRoZSByb290IENvbnRlbnRJdGVtLiAgSWYgYSByb290IGRvZXMgbm90IGV4aXN0LCB0aGVuIGNyZWF0ZSByb290IENvbnRlbnRJdGVtIGluc3RlYWRcclxuICAgICAqIEBwYXJhbSBpdGVtQ29uZmlnIC0gUmVzb2x2ZWRJdGVtQ29uZmlnIG9mIGNoaWxkIHRvIGJlIGFkZGVkLlxyXG4gICAgICogQHBhcmFtIGxvY2F0aW9uU2VsZWN0b3JzIC0gQXJyYXkgb2YgbG9jYXRpb24gc2VsZWN0b3JzIHVzZWQgdG8gZmluZCBkZXRlcm1pbmUgbG9jYXRpb24gaW4gbGF5b3V0IHdoZXJlIENvbnRlbnRJdGVtXHJcbiAgICAgKiB3aWxsIGJlIGFkZGVkLiBGaXJzdCBsb2NhdGlvbiBpbiBhcnJheSB3aGljaCBpcyB2YWxpZCB3aWxsIGJlIHVzZWQuIElmIHVuZGVmaW5lZCxcclxuICAgICAqIHtAbGluayAoTGF5b3V0TWFuYWdlcjpuYW1lc3BhY2UpLmRlZmF1bHRMb2NhdGlvblNlbGVjdG9yc30gd2lsbCBiZSB1c2VkLlxyXG4gICAgICogQHJldHVybnMgTmV3IENvbnRlbnRJdGVtIGNyZWF0ZWQgb3IgdW5kZWZpbmVkIGlmIG5vIHZhbGlkIGxvY2F0aW9uIHNlbGVjdG9yIHdhcyBpbiBhcnJheS4gKi9cclxuICAgIG5ld0l0ZW1BdExvY2F0aW9uKGl0ZW1Db25maWc6IFJvd09yQ29sdW1uSXRlbUNvbmZpZyB8IFN0YWNrSXRlbUNvbmZpZyB8IENvbXBvbmVudEl0ZW1Db25maWcsXHJcbiAgICAgICAgbG9jYXRpb25TZWxlY3RvcnM/OiByZWFkb25seSBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uU2VsZWN0b3JbXVxyXG4gICAgKTogQ29udGVudEl0ZW0gfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWRkIGNvbXBvbmVudCBiZWZvcmUgaW5pdCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gdGhpcy5hZGRJdGVtQXRMb2NhdGlvbihpdGVtQ29uZmlnLCBsb2NhdGlvblNlbGVjdG9ycyk7XHJcbiAgICAgICAgICAgIGlmIChsb2NhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZEl0ZW0gPSBsb2NhdGlvbi5wYXJlbnRJdGVtLmNvbnRlbnRJdGVtc1tsb2NhdGlvbi5pbmRleF07XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlZEl0ZW07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgbmV3IENvbnRlbnRJdGVtLiAgV2lsbCB1c2UgZGVmYXVsdCBsb2NhdGlvbiBzZWxlY3RvcnMgdG8gZW5zdXJlIGEgbG9jYXRpb24gaXMgZm91bmQgYW5kXHJcbiAgICAgKiBjb21wb25lbnQgaXMgc3VjY2Vzc2Z1bGx5IGFkZGVkLlxyXG4gICAgICogQHBhcmFtIGl0ZW1Db25maWcgLSBSZXNvbHZlZEl0ZW1Db25maWcgb2YgY2hpbGQgdG8gYmUgYWRkZWQuXHJcbiAgICAgKiBAcmV0dXJucyBMb2NhdGlvbiBvZiBuZXcgQ29udGVudEl0ZW0gY3JlYXRlZC4gKi9cclxuICAgIGFkZEl0ZW0oaXRlbUNvbmZpZzogUm93T3JDb2x1bW5JdGVtQ29uZmlnIHwgU3RhY2tJdGVtQ29uZmlnIHwgQ29tcG9uZW50SXRlbUNvbmZpZyk6IExheW91dE1hbmFnZXIuTG9jYXRpb24ge1xyXG4gICAgICAgIGNvbnN0IGxvY2F0aW9uID0gdGhpcy5hZGRJdGVtQXRMb2NhdGlvbihpdGVtQ29uZmlnKTtcclxuICAgICAgICBpZiAobG9jYXRpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNQUk5OTk0MycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgQ29udGVudEl0ZW0gYXQgdGhlIGZpcnN0IHZhbGlkIHNlbGVjdG9yIGxvY2F0aW9uLlxyXG4gICAgICogQHBhcmFtIGl0ZW1Db25maWcgLSBSZXNvbHZlZEl0ZW1Db25maWcgb2YgY2hpbGQgdG8gYmUgYWRkZWQuXHJcbiAgICAgKiBAcGFyYW0gbG9jYXRpb25TZWxlY3RvcnMgLSBBcnJheSBvZiBsb2NhdGlvbiBzZWxlY3RvcnMgdXNlZCB0byBmaW5kIGRldGVybWluZSBsb2NhdGlvbiBpbiBsYXlvdXQgd2hlcmUgQ29udGVudEl0ZW1cclxuICAgICAqIHdpbGwgYmUgYWRkZWQuIEZpcnN0IGxvY2F0aW9uIGluIGFycmF5IHdoaWNoIGlzIHZhbGlkIHdpbGwgYmUgdXNlZC4gSWYgdW5kZWZpbmVkLFxyXG4gICAgICoge0BsaW5rIChMYXlvdXRNYW5hZ2VyOm5hbWVzcGFjZSkuZGVmYXVsdExvY2F0aW9uU2VsZWN0b3JzfSB3aWxsIGJlIHVzZWQuXHJcbiAgICAgKiBAcmV0dXJucyBMb2NhdGlvbiBvZiBuZXcgQ29udGVudEl0ZW0gY3JlYXRlZCBvciB1bmRlZmluZWQgaWYgbm8gdmFsaWQgbG9jYXRpb24gc2VsZWN0b3Igd2FzIGluIGFycmF5LiAqL1xyXG4gICAgYWRkSXRlbUF0TG9jYXRpb24oaXRlbUNvbmZpZzogUm93T3JDb2x1bW5JdGVtQ29uZmlnIHwgU3RhY2tJdGVtQ29uZmlnIHwgQ29tcG9uZW50SXRlbUNvbmZpZyxcclxuICAgICAgICBsb2NhdGlvblNlbGVjdG9ycz86IHJlYWRvbmx5IExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3RvcltdXHJcbiAgICApOiBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGFkZCBjb21wb25lbnQgYmVmb3JlIGluaXQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAobG9jYXRpb25TZWxlY3RvcnMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gZGVmYXVsdExvY2F0aW9uU2VsZWN0b3JzIHNob3VsZCBhbHdheXMgZmluZCBhIGxvY2F0aW9uXHJcbiAgICAgICAgICAgICAgICBsb2NhdGlvblNlbGVjdG9ycyA9IExheW91dE1hbmFnZXIuZGVmYXVsdExvY2F0aW9uU2VsZWN0b3JzO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMuZmluZEZpcnN0TG9jYXRpb24obG9jYXRpb25TZWxlY3RvcnMpO1xyXG4gICAgICAgICAgICBpZiAobG9jYXRpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRJdGVtID0gbG9jYXRpb24ucGFyZW50SXRlbTtcclxuICAgICAgICAgICAgICAgIGxldCBhZGRJZHg6IG51bWJlcjtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAocGFyZW50SXRlbS50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5ncm91bmQ6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdW5kSXRlbSA9IHBhcmVudEl0ZW0gYXMgR3JvdW5kSXRlbTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkSWR4ID0gZ3JvdW5kSXRlbS5hZGRJdGVtKGl0ZW1Db25maWcsIGxvY2F0aW9uLmluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkZElkeCA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRJdGVtID0gdGhpcy5fZ3JvdW5kSXRlbS5jb250ZW50SXRlbXNbMF07IC8vIHdhcyBhZGRlZCB0byByb290SXRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkSWR4ID0gMDsgLy8gd2FzIGFkZGVkIGFzIHJvb3RJdGVtICh3aGljaCBpcyB0aGUgZmlyc3QgYW5kIG9ubHkgQ29udGVudEl0ZW0gaW4gR3JvdW5kSXRlbSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5yb3c6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb2x1bW46IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm93T3JDb2x1bW4gPSBwYXJlbnRJdGVtIGFzIFJvd09yQ29sdW1uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRJZHggPSByb3dPckNvbHVtbi5hZGRJdGVtKGl0ZW1Db25maWcsIGxvY2F0aW9uLmluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuc3RhY2s6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFJdGVtQ29uZmlnLmlzQ29tcG9uZW50KGl0ZW1Db25maWcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihpMThuU3RyaW5nc1tJMThuU3RyaW5nSWQuSXRlbUNvbmZpZ0lzTm90VHlwZUNvbXBvbmVudF0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSBwYXJlbnRJdGVtIGFzIFN0YWNrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkSWR4ID0gc3RhY2suYWRkSXRlbShpdGVtQ29uZmlnLCBsb2NhdGlvbi5pbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbXBvbmVudDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNQUlBTEM4NzQ0NDYwMicpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWFjaGFibGVDYXNlRXJyb3IoJ0xNQUlBTFU5ODg4MTczMycsIHBhcmVudEl0ZW0udHlwZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKEl0ZW1Db25maWcuaXNDb21wb25lbnQoaXRlbUNvbmZpZykpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaWYgc3RhY2sgd2FzIGluc2VydGVkXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IHBhcmVudEl0ZW0uY29udGVudEl0ZW1zW2FkZElkeF07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKENvbnRlbnRJdGVtLmlzU3RhY2soaXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50SXRlbSA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZElkeCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxvY2F0aW9uLnBhcmVudEl0ZW0gPSBwYXJlbnRJdGVtO1xyXG4gICAgICAgICAgICAgICAgbG9jYXRpb24uaW5kZXggPSBhZGRJZHg7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBMb2FkcyB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudCBSZXNvbHZlZEl0ZW1Db25maWcgYXMgcm9vdC5cclxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gZGlzcGxheSBhIENvbXBvbmVudCBhbGwgYnkgaXRzZWxmLiAgVGhlIGxheW91dCBjYW5ub3QgYmUgY2hhbmdlZCBvdGhlciB0aGFuIGhhdmluZyBhbm90aGVyIG5ldyBsYXlvdXQgbG9hZGVkLlxyXG4gICAgICogTm90ZSB0aGF0LCBpZiB0aGlzIGxheW91dCBpcyBzYXZlZCBhbmQgcmVsb2FkZWQsIGl0IHdpbGwgcmVsb2FkIHdpdGggdGhlIENvbXBvbmVudCBhcyBhIGNoaWxkIG9mIGEgU3RhY2suXHJcbiAgICAqL1xyXG4gICAgbG9hZENvbXBvbmVudEFzUm9vdChpdGVtQ29uZmlnOiBDb21wb25lbnRJdGVtQ29uZmlnKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhZGQgaXRlbSBiZWZvcmUgaW5pdCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2dyb3VuZEl0ZW0ubG9hZENvbXBvbmVudEFzUm9vdChpdGVtQ29uZmlnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgKExheW91dE1hbmFnZXI6Y2xhc3MpLnNldFNpemV9ICovXHJcbiAgICB1cGRhdGVTaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgbGF5b3V0IG1hbmFnZXJzIHNpemVcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gd2lkdGggLSBXaWR0aCBpbiBwaXhlbHNcclxuICAgICAqIEBwYXJhbSBoZWlnaHQgLSBIZWlnaHQgaW4gcGl4ZWxzXHJcbiAgICAgKi9cclxuICAgIHNldFNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl93aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIHRoaXMuX2hlaWdodCA9IGhlaWdodDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2lzSW5pdGlhbGlzZWQgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1VUzE4ODgxJyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ncm91bmRJdGVtLnNldFNpemUodGhpcy5fd2lkdGgsIHRoaXMuX2hlaWdodCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX21heGltaXNlZFN0YWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBnZXRFbGVtZW50Q2xpZW50V2lkdGhBbmRIZWlnaHQodGhpcy5fY29udGFpbmVyRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0RWxlbWVudFdpZHRoKHRoaXMuX21heGltaXNlZFN0YWNrLmVsZW1lbnQsIHdpZHRoKTtcclxuICAgICAgICAgICAgICAgICAgICBzZXRFbGVtZW50SGVpZ2h0KHRoaXMuX21heGltaXNlZFN0YWNrLmVsZW1lbnQsIGhlaWdodCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWF4aW1pc2VkU3RhY2sudXBkYXRlU2l6ZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGp1c3RDb2x1bW5zUmVzcG9uc2l2ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGJlZ2luU2l6ZUludmFsaWRhdGlvbigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9zaXplSW52YWxpZGF0aW9uQmVnaW5Db3VudCsrO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGVuZFNpemVJbnZhbGlkYXRpb24oKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKC0tdGhpcy5fc2l6ZUludmFsaWRhdGlvbkJlZ2luQ291bnQgPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplRnJvbUNvbnRhaW5lcigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICB1cGRhdGVTaXplRnJvbUNvbnRhaW5lcigpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGdldEVsZW1lbnRDbGllbnRXaWR0aEFuZEhlaWdodCh0aGlzLl9jb250YWluZXJFbGVtZW50KTtcclxuICAgICAgICB0aGlzLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGUgdGhlIHNpemUgb2YgdGhlIHJvb3QgQ29udGVudEl0ZW0uICBUaGlzIHdpbGwgdXBkYXRlIHRoZSBzaXplIG9mIGFsbCBjb250ZW50SXRlbXMgaW4gdGhlIHRyZWVcclxuICAgICAqIEBwYXJhbSBmb3JjZSAtIEluIHNvbWUgY2FzZXMgdGhlIHNpemUgaXMgbm90IHVwZGF0ZWQgaWYgaXQgaGFzIG5vdCBjaGFuZ2VkLiBJbiB0aGlzIGNhc2UsIGV2ZW50c1xyXG4gICAgICogKHN1Y2ggYXMgQ29tcG9uZW50Q29udGFpbmVyLnZpcnR1YWxSZWN0aW5nUmVxdWlyZWRFdmVudCkgYXJlIG5vdCBmaXJlZC4gU2V0dGluZyBmb3JjZSB0byB0cnVlLCBlbnN1cmVzIHRoZSBzaXplIGlzIHVwZGF0ZWQgcmVnYXJkbGVzcywgYW5kXHJcbiAgICAgKiB0aGUgcmVzcGVjdGl2ZSBldmVudHMgYXJlIGZpcmVkLiBUaGlzIGlzIHNvbWV0aW1lcyBuZWNlc3Nhcnkgd2hlbiBhIGNvbXBvbmVudCdzIHNpemUgaGFzIG5vdCBjaGFuZ2VkIGJ1dCBpdCBoYXMgYmVjb21lIHZpc2libGUsIGFuZCB0aGVcclxuICAgICAqIHJlbGV2YW50IGV2ZW50cyBuZWVkIHRvIGJlIGZpcmVkLlxyXG4gICAgICovXHJcbiAgICB1cGRhdGVSb290U2l6ZShmb3JjZSA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTVVSUzI4ODgxJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZ3JvdW5kSXRlbS51cGRhdGVTaXplKGZvcmNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwdWJsaWMgKi9cclxuICAgIGNyZWF0ZUFuZEluaXRDb250ZW50SXRlbShjb25maWc6IFJlc29sdmVkSXRlbUNvbmZpZywgcGFyZW50OiBDb250ZW50SXRlbSk6IENvbnRlbnRJdGVtIHtcclxuICAgICAgICBjb25zdCBuZXdJdGVtID0gdGhpcy5jcmVhdGVDb250ZW50SXRlbShjb25maWcsIHBhcmVudCk7XHJcbiAgICAgICAgbmV3SXRlbS5pbml0KCk7XHJcbiAgICAgICAgcmV0dXJuIG5ld0l0ZW07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWN1cnNpdmVseSBjcmVhdGVzIG5ldyBpdGVtIHRyZWUgc3RydWN0dXJlcyBiYXNlZCBvbiBhIHByb3ZpZGVkXHJcbiAgICAgKiBJdGVtQ29uZmlndXJhdGlvbiBvYmplY3RcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gY29uZmlnIC0gUmVzb2x2ZWRJdGVtQ29uZmlnXHJcbiAgICAgKiBAcGFyYW0gcGFyZW50IC0gVGhlIGl0ZW0gdGhlIG5ld2x5IGNyZWF0ZWQgaXRlbSBzaG91bGQgYmUgYSBjaGlsZCBvZlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZUNvbnRlbnRJdGVtKGNvbmZpZzogUmVzb2x2ZWRJdGVtQ29uZmlnLCBwYXJlbnQ6IENvbnRlbnRJdGVtKTogQ29udGVudEl0ZW0ge1xyXG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLnR5cGUgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoJ01pc3NpbmcgcGFyYW1ldGVyIFxcJ3R5cGVcXCcnLCBKU09OLnN0cmluZ2lmeShjb25maWcpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdlIGFkZCBhbiBhZGRpdGlvbmFsIHN0YWNrIGFyb3VuZCBldmVyeSBjb21wb25lbnQgdGhhdCdzIG5vdCB3aXRoaW4gYSBzdGFjayBhbnl3YXlzLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGNvbXBvbmVudFxyXG4gICAgICAgICAgICBSZXNvbHZlZEl0ZW1Db25maWcuaXNDb21wb25lbnRJdGVtKGNvbmZpZykgJiZcclxuXHJcbiAgICAgICAgICAgIC8vIGFuZCBpdCdzIG5vdCBhbHJlYWR5IHdpdGhpbiBhIHN0YWNrXHJcbiAgICAgICAgICAgICEocGFyZW50IGluc3RhbmNlb2YgU3RhY2spICYmXHJcblxyXG4gICAgICAgICAgICAvLyBhbmQgd2UgaGF2ZSBhIHBhcmVudFxyXG4gICAgICAgICAgICAhIXBhcmVudCAmJlxyXG5cclxuICAgICAgICAgICAgLy8gYW5kIGl0J3Mgbm90IHRoZSB0b3Btb3N0IGl0ZW0gaW4gYSBuZXcgd2luZG93XHJcbiAgICAgICAgICAgICEodGhpcy5pc1N1YldpbmRvdyA9PT0gdHJ1ZSAmJiBwYXJlbnQgaW5zdGFuY2VvZiBHcm91bmRJdGVtKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFja0NvbmZpZzogUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBJdGVtVHlwZS5zdGFjayxcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IFtjb25maWddLFxyXG4gICAgICAgICAgICAgICAgc2l6ZTogY29uZmlnLnNpemUsXHJcbiAgICAgICAgICAgICAgICBzaXplVW5pdDogY29uZmlnLnNpemVVbml0LFxyXG4gICAgICAgICAgICAgICAgbWluU2l6ZTogY29uZmlnLm1pblNpemUsXHJcbiAgICAgICAgICAgICAgICBtaW5TaXplVW5pdDogY29uZmlnLm1pblNpemVVbml0LFxyXG4gICAgICAgICAgICAgICAgaWQ6IGNvbmZpZy5pZCxcclxuICAgICAgICAgICAgICAgIG1heGltaXNlZDogY29uZmlnLm1heGltaXNlZCxcclxuICAgICAgICAgICAgICAgIGlzQ2xvc2FibGU6IGNvbmZpZy5pc0Nsb3NhYmxlLFxyXG4gICAgICAgICAgICAgICAgYWN0aXZlSXRlbUluZGV4OiAwLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjb25maWcgPSBzdGFja0NvbmZpZztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gdGhpcy5jcmVhdGVDb250ZW50SXRlbUZyb21Db25maWcoY29uZmlnLCBwYXJlbnQpO1xyXG4gICAgICAgIHJldHVybiBjb250ZW50SXRlbTtcclxuICAgIH1cclxuXHJcbiAgICBmaW5kRmlyc3RDb21wb25lbnRJdGVtQnlJZChpZDogc3RyaW5nKTogQ29tcG9uZW50SXRlbSB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTUZGQ0lCSTgyNDQ2Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluZEZpcnN0Q29udGVudEl0ZW1UeXBlQnlJZFJlY3Vyc2l2ZShJdGVtVHlwZS5jb21wb25lbnQsIGlkLCB0aGlzLl9ncm91bmRJdGVtKSBhcyBDb21wb25lbnRJdGVtO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjcmVhdGVQb3BvdXRGcm9tQ29udGVudEl0ZW0oaXRlbTogQ29udGVudEl0ZW0sXHJcbiAgICAgICAgd2luZG93OiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZy5XaW5kb3cgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgcGFyZW50SWQ6IHN0cmluZyB8IG51bGwsXHJcbiAgICAgICAgZG9ja1BvaW50OiBDb250ZW50SXRlbS5Eb2NrUG9pbnQgfCBudWxsIHwgdW5kZWZpbmVkLFxyXG4gICAgKTogQnJvd3NlclBvcG91dCB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgdGhlIGl0ZW0gaXMgdGhlIG9ubHkgY29tcG9uZW50IHdpdGhpbiBhIHN0YWNrIG9yIGZvciBzb21lXHJcbiAgICAgICAgICogb3RoZXIgcmVhc29uIHRoZSBvbmx5IGNoaWxkIG9mIGl0cyBwYXJlbnQgdGhlIHBhcmVudCB3aWxsIGJlIGRlc3Ryb3llZFxyXG4gICAgICAgICAqIHdoZW4gdGhlIGNoaWxkIGlzIHJlbW92ZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBJbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgd2UgbW92ZSB1cCB0aGUgdHJlZSB1bnRpbCB3ZSBmaW5kIHNvbWV0aGluZ1xyXG4gICAgICAgICAqIHRoYXQgd2lsbCByZW1haW4gYWZ0ZXIgdGhlIGl0ZW0gaXMgYmVpbmcgcG9wcGVkIG91dFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IGRvY2sgPSBkb2NrUG9pbnQgPz8gaXRlbS5maW5kRG9ja1BvaW50KCk7XHJcblxyXG4gICAgICAgIGlmIChkb2NrID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdMTUNQRkNJMDA4MzQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAocGFyZW50SWQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGRvY2sucGFyZW50LmFkZFBvcEluUGFyZW50SWQocGFyZW50SWQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAod2luZG93ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyU2NyZWVuID0gZ2V0V2luZG93SW5uZXJTY3JlZW5Qb3NpdGlvbihnbG9iYWxUaGlzKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNsaWVudFJlY3QgPSAoaXRlbSBpbnN0YW5jZW9mIENvbXBvbmVudEl0ZW0pID8gaXRlbS5nZXRPdXRlckJvdW5kaW5nQ2xpZW50UmVjdCgpIDogaXRlbS5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIHdpbmRvdyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBpbm5lclNjcmVlbi5sZWZ0ICsgY2xpZW50UmVjdC5sZWZ0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRvcDogaW5uZXJTY3JlZW4udG9wICsgY2xpZW50UmVjdC50b3AsXHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGNsaWVudFJlY3Qud2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBjbGllbnRSZWN0LmhlaWdodCxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1Db25maWcgPSBpdGVtLnRvQ29uZmlnKCk7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLnBhcmVudD8uY29udGVudEl0ZW1zLmluY2x1ZGVzKGl0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIVJlc29sdmVkUm9vdEl0ZW1Db25maWcuaXNSb290SXRlbUNvbmZpZyhpdGVtQ29uZmlnKSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2kxOG5TdHJpbmdzW0kxOG5TdHJpbmdJZC5Qb3BvdXRDYW5ub3RCZUNyZWF0ZWRXaXRoR3JvdW5kSXRlbUNvbmZpZ119YCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVQb3BvdXRGcm9tSXRlbUNvbmZpZyhpdGVtQ29uZmlnLCB3aW5kb3csIHBhcmVudElkLCBkb2NrLmluZGV4KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBiZWdpblZpcnR1YWxTaXplZENvbnRhaW5lckFkZGluZygpOiB2b2lkIHtcclxuICAgICAgICBpZiAoKyt0aGlzLl92aXJ0dWFsU2l6ZWRDb250YWluZXJBZGRpbmdCZWdpbkNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZpcnR1YWxTaXplZENvbnRhaW5lcnMubGVuZ3RoID0gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgYWRkVmlydHVhbFNpemVkQ29udGFpbmVyKGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdmlydHVhbFNpemVkQ29udGFpbmVycy5wdXNoKGNvbnRhaW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZW5kVmlydHVhbFNpemVkQ29udGFpbmVyQWRkaW5nKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICgtLXRoaXMuX3ZpcnR1YWxTaXplZENvbnRhaW5lckFkZGluZ0JlZ2luQ291bnQgPT09IDApIHtcclxuICAgICAgICAgICAgY29uc3QgY291bnQgPSB0aGlzLl92aXJ0dWFsU2l6ZWRDb250YWluZXJzLmxlbmd0aDtcclxuICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maXJlQmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudChjb3VudCk7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLl92aXJ0dWFsU2l6ZWRDb250YWluZXJzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5ub3RpZnlWaXJ0dWFsUmVjdGluZ1JlcXVpcmVkKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVBZnRlclZpcnR1YWxSZWN0aW5nRXZlbnQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZpcnR1YWxTaXplZENvbnRhaW5lcnMubGVuZ3RoID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBmaXJlQmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudChjb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuYmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudChjb3VudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGZpcmVBZnRlclZpcnR1YWxSZWN0aW5nRXZlbnQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuYWZ0ZXJWaXJ0dWFsUmVjdGluZ0V2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5hZnRlclZpcnR1YWxSZWN0aW5nRXZlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVQb3BvdXRGcm9tSXRlbUNvbmZpZyhyb290SXRlbUNvbmZpZzogUmVzb2x2ZWRSb290SXRlbUNvbmZpZyxcclxuICAgICAgICB3aW5kb3c6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLldpbmRvdyxcclxuICAgICAgICBwYXJlbnRJZDogc3RyaW5nIHwgbnVsbCxcclxuICAgICAgICBpbmRleEluUGFyZW50OiBudW1iZXIgfCBudWxsXHJcbiAgICApIHtcclxuICAgICAgICBjb25zdCBsYXlvdXRDb25maWcgPSB0aGlzLnRvQ29uZmlnKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHBvcG91dExheW91dENvbmZpZzogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcgPSB7XHJcbiAgICAgICAgICAgIHJvb3Q6IHJvb3RJdGVtQ29uZmlnLFxyXG4gICAgICAgICAgICBvcGVuUG9wb3V0czogW10sXHJcbiAgICAgICAgICAgIHNldHRpbmdzOiBsYXlvdXRDb25maWcuc2V0dGluZ3MsXHJcbiAgICAgICAgICAgIGRpbWVuc2lvbnM6IGxheW91dENvbmZpZy5kaW1lbnNpb25zLFxyXG4gICAgICAgICAgICBoZWFkZXI6IGxheW91dENvbmZpZy5oZWFkZXIsXHJcbiAgICAgICAgICAgIHdpbmRvdyxcclxuICAgICAgICAgICAgcGFyZW50SWQsXHJcbiAgICAgICAgICAgIGluZGV4SW5QYXJlbnQsXHJcbiAgICAgICAgICAgIHJlc29sdmVkOiB0cnVlLFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUG9wb3V0RnJvbVBvcG91dExheW91dENvbmZpZyhwb3BvdXRMYXlvdXRDb25maWcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNyZWF0ZVBvcG91dEZyb21Qb3BvdXRMYXlvdXRDb25maWcoY29uZmlnOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyk6IEJyb3dzZXJQb3BvdXQge1xyXG4gICAgICAgIC8vIElmIHRoaXMgaXMgYWxyZWFkeSBhIHBvcG91dCwgbGV0IHRoZSBwYXJlbnQgbGF5b3V0IG1hbmFnZXIgaGFuZGxlIHRoZSBuZXcgb25lLlxyXG4gICAgICAgIGlmICh0aGlzLl9wYXJlbnQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudC5jcmVhdGVQb3BvdXRGcm9tUG9wb3V0TGF5b3V0Q29uZmlnKGNvbmZpZyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjb25maWdXaW5kb3cgPSBjb25maWcud2luZG93O1xyXG4gICAgICAgIGNvbnN0IGluaXRpYWxXaW5kb3c6IFJlY3QgPSB7XHJcbiAgICAgICAgICAgIGxlZnQ6IGNvbmZpZ1dpbmRvdy5sZWZ0ID8/IChnbG9iYWxUaGlzLnNjcmVlblggfHwgZ2xvYmFsVGhpcy5zY3JlZW5MZWZ0ICsgMjApLFxyXG4gICAgICAgICAgICB0b3A6IGNvbmZpZ1dpbmRvdy50b3AgPz8gKGdsb2JhbFRoaXMuc2NyZWVuWSB8fCBnbG9iYWxUaGlzLnNjcmVlblRvcCArIDIwKSxcclxuICAgICAgICAgICAgd2lkdGg6IGNvbmZpZ1dpbmRvdy53aWR0aCA/PyA1MDAsXHJcbiAgICAgICAgICAgIGhlaWdodDogY29uZmlnV2luZG93LmhlaWdodCA/PyAzMDksXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgYnJvd3NlclBvcG91dCA9IG5ldyBCcm93c2VyUG9wb3V0KGNvbmZpZywgaW5pdGlhbFdpbmRvdywgdGhpcyk7XHJcblxyXG4gICAgICAgIGJyb3dzZXJQb3BvdXQub24oJ2luaXRpYWxpc2VkJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBsbSA9IGJyb3dzZXJQb3BvdXQuZ2V0R2xJbnN0YW5jZSgpO1xyXG5cclxuICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIHBvcG91dCB3aGVuIHRoZSBsYXN0IGNvbXBvbmVudCBpdGVtIGlzIGRlc3Ryb3llZC5cclxuICAgICAgICAgICAgY29uc3QgZGVzdHJveUlmRW1wdHkgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWxtLmlzRHJhZ2dpbmcgJiYgbG0uZ3JvdW5kSXRlbT8uZ2V0QWxsQ29tcG9uZW50SXRlbXMoKT8ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJvd3NlclBvcG91dC5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgbG0ub24oJ2l0ZW1Ecm9wcGVkJywgZGVzdHJveUlmRW1wdHkpO1xyXG4gICAgICAgICAgICBsbS5vbignaXRlbURlc3Ryb3llZCcsIGRlc3Ryb3lJZkVtcHR5KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnd2luZG93T3BlbmVkJywgYnJvd3NlclBvcG91dCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGJyb3dzZXJQb3BvdXQub24oJ2Nsb3NlZCcsICgpID0+IHRoaXMucmVjb25jaWxlUG9wb3V0V2luZG93cygpKTtcclxuXHJcbiAgICAgICAgdGhpcy5fb3BlblBvcG91dHMucHVzaChicm93c2VyUG9wb3V0KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubGF5b3V0Q29uZmlnLnNldHRpbmdzLmNsb3NlUG9wb3V0c09uVW5sb2FkICYmICF0aGlzLl93aW5kb3dCZWZvcmVVbmxvYWRMaXN0ZW5pbmcpIHtcclxuICAgICAgICAgICAgZ2xvYmFsVGhpcy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCB0aGlzLl93aW5kb3dCZWZvcmVVbmxvYWRMaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB0aGlzLl93aW5kb3dCZWZvcmVVbmxvYWRMaXN0ZW5pbmcgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGJyb3dzZXJQb3BvdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbG9zZXMgYWxsIE9wZW4gUG9wb3V0c1xyXG4gICAgICogQXBwbGljYXRpb25zIGNhbiBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gYSBwYWdlIGlzIHVubG9hZGVkIHRvIHJlbW92ZSBpdHMgb3BlbiBwb3BvdXRzXHJcbiAgICAgKi9cclxuXHJcbiAgICBjbG9zZUFsbE9wZW5Qb3BvdXRzKHByZXZlbnRQb3BJbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9vcGVuUG9wb3V0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLl9vcGVuUG9wb3V0c1tpXS5jbG9zZShwcmV2ZW50UG9wSW4pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fb3BlblBvcG91dHMubGVuZ3RoID0gMDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3dpbmRvd0JlZm9yZVVubG9hZExpc3RlbmluZykge1xyXG4gICAgICAgICAgICBnbG9iYWxUaGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIHRoaXMuX3dpbmRvd0JlZm9yZVVubG9hZExpc3RlbmVyKTtcclxuICAgICAgICAgICAgdGhpcy5fd2luZG93QmVmb3JlVW5sb2FkTGlzdGVuaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXR0YWNoZXMgRHJhZ0xpc3RlbmVyIHRvIGFueSBnaXZlbiBET00gZWxlbWVudFxyXG4gICAgICogYW5kIHR1cm5zIGl0IGludG8gYSB3YXkgb2YgY3JlYXRpbmcgbmV3IENvbXBvbmVudEl0ZW1zXHJcbiAgICAgKiBieSAnZHJhZ2dpbmcnIHRoZSBET00gZWxlbWVudCBpbnRvIHRoZSBsYXlvdXRcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZWxlbWVudCAtIFRoZSBIVE1MIGVsZW1lbnQgd2hpY2ggd2lsbCBiZSBsaXN0ZW5lZCB0byBmb3IgY29tbWVuY2VtZW50IG9mIGRyYWcuXHJcbiAgICAgKiBAcGFyYW0gY29tcG9uZW50VHlwZU9ySXRlbUNvbmZpZ0NhbGxiYWNrIC0gVHlwZSBvZiBjb21wb25lbnQgdG8gYmUgY3JlYXRlZCwgb3IgYSBjYWxsYmFjayB3aGljaCB3aWxsIHByb3ZpZGUgdGhlIEl0ZW1Db25maWdcclxuICAgICAqIHRvIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBjb21wb25lbnQuXHJcbiAgICAgKiBAcGFyYW0gY29tcG9uZW50U3RhdGUgLSBPcHRpb25hbCBpbml0aWFsIHN0YXRlIG9mIGNvbXBvbmVudC4gIFRoaXMgd2lsbCBiZSBpZ25vcmVkIGlmIGNvbXBvbmVudFR5cGVPckZ0biBpcyBhIGZ1bmN0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIGFuIG9wYXF1ZSBvYmplY3QgdGhhdCBpZGVudGlmaWVzIHRoZSBET00gZWxlbWVudFxyXG5cdCAqICAgICAgICAgIGFuZCB0aGUgYXR0YWNoZWQgaXRlbUNvbmZpZy4gVGhpcyBjYW4gYmUgdXNlZCBpblxyXG5cdCAqICAgICAgICAgIHJlbW92ZURyYWdTb3VyY2UoKSBsYXRlciB0byBnZXQgcmlkIG9mIHRoZSBkcmFnIGxpc3RlbmVycy5cclxuICAgICAqL1xyXG4gICAgbmV3RHJhZ1NvdXJjZShlbGVtZW50OiBIVE1MRWxlbWVudCwgaXRlbUNvbmZpZ0NhbGxiYWNrOiAoKSA9PiAoRHJhZ1NvdXJjZS5Db21wb25lbnRJdGVtQ29uZmlnIHwgQ29tcG9uZW50SXRlbUNvbmZpZykpOiBEcmFnU291cmNlO1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIHdpbGwgYmUgcmVwbGFjZWQgaW4gdmVyc2lvbiAzIHdpdGggbmV3RHJhZ1NvdXJjZShlbGVtZW50OiBIVE1MRWxlbWVudCwgaXRlbUNvbmZpZzogQ29tcG9uZW50SXRlbUNvbmZpZykgKi9cclxuICAgIG5ld0RyYWdTb3VyY2UoZWxlbWVudDogSFRNTEVsZW1lbnQsIGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZSwgY29tcG9uZW50U3RhdGU/OiBKc29uVmFsdWUsIHRpdGxlPzogSnNvblZhbHVlLCBpZD86IHN0cmluZyk6IERyYWdTb3VyY2U7XHJcbiAgICBuZXdEcmFnU291cmNlKGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxyXG4gICAgICAgIGNvbXBvbmVudFR5cGVPckl0ZW1Db25maWdDYWxsYmFjazogSnNvblZhbHVlIHwgKCgpID0+IChEcmFnU291cmNlLkNvbXBvbmVudEl0ZW1Db25maWcgfCBDb21wb25lbnRJdGVtQ29uZmlnKSksXHJcbiAgICAgICAgY29tcG9uZW50U3RhdGU/OiBKc29uVmFsdWUsXHJcbiAgICAgICAgdGl0bGU/OiBzdHJpbmcsXHJcbiAgICAgICAgaWQ/OiBzdHJpbmcsXHJcbiAgICApOiBEcmFnU291cmNlIHtcclxuICAgICAgICBjb25zdCBkcmFnU291cmNlID0gbmV3IERyYWdTb3VyY2UodGhpcywgZWxlbWVudCwgW10sIGNvbXBvbmVudFR5cGVPckl0ZW1Db25maWdDYWxsYmFjaywgY29tcG9uZW50U3RhdGUsIHRpdGxlLCBpZCk7XHJcbiAgICAgICAgdGhpcy5fZHJhZ1NvdXJjZXMucHVzaChkcmFnU291cmNlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRyYWdTb3VyY2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcblx0ICogUmVtb3ZlcyBhIERyYWdMaXN0ZW5lciBhZGRlZCBieSBjcmVhdGVEcmFnU291cmNlKCkgc28gdGhlIGNvcnJlc3BvbmRpbmdcclxuXHQgKiBET00gZWxlbWVudCBpcyBub3QgYSBkcmFnIHNvdXJjZSBhbnkgbW9yZS5cclxuXHQgKi9cclxuXHRyZW1vdmVEcmFnU291cmNlKGRyYWdTb3VyY2U6IERyYWdTb3VyY2UpOiB2b2lkIHtcclxuXHRcdHJlbW92ZUZyb21BcnJheShkcmFnU291cmNlLCB0aGlzLl9kcmFnU291cmNlcyApO1xyXG5cdFx0ZHJhZ1NvdXJjZS5kZXN0cm95KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBzdGFydEV4dGVybmFsQ29tcG9uZW50RHJhZyhwYXJlbnQ6IERyYWdBY3Rpb24pIHtcclxuICAgICAgICBEcmFnQWN0aW9uLnNwYXduKHRoaXMsIHBhcmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc3RhcnRDb21wb25lbnREcmFnKHg6IG51bWJlciwgeTogbnVtYmVyLCBkcmFnTGlzdGVuZXI6IERyYWdMaXN0ZW5lciwgY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGlzTGFzdCA9IGNvbXBvbmVudEl0ZW0uZmluZEFuY2VzdG9yV2l0aFNpYmxpbmdzKCkgPT09IG51bGw7XHJcblxyXG4gICAgICAgIGNvbnN0IGFsbG93UG9wb3V0ID1cclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRDb25maWcuc2V0dGluZ3MuZHJhZ1RvTmV3V2luZG93ICYmXHJcbiAgICAgICAgICAgICh0aGlzLnBhcmVudCA9PT0gbnVsbCB8fCAhaXNMYXN0KTsgICAgICAgICAgICAgICAgICAvLyBQb3BvdXQgaXMgZGVzdHJveWVkIHdoZW4gbGFzdCBjb21wb25lbnQgaXMgcmVtb3ZlZCwgZHJhZyB0byBuZXcgcG9wb3V0IG1ha2VzIG5vIHNlbnNlXHJcblxyXG4gICAgICAgIGNvbnN0IGNhbk1vdmVCZXR3ZWVuV2luZG93cyA9XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0Q29uZmlnLnNldHRpbmdzLmRyYWdCZXR3ZWVuV2luZG93cyAmJlxyXG4gICAgICAgICAgICAodGhpcy5fcGFyZW50ID8/IHRoaXMpLl9vcGVuUG9wb3V0cy5sZW5ndGggPiAwOyAgICAgLy8gQXJlIHRoZXJlIGV2ZW4gbXVsdGlwbGUgd2luZG93cz9cclxuXHJcbiAgICAgICAgLy8gQ2FuY2VsIHRoZSBkcmFnIGlmIHRoaXMgaXMgdGhlIGxhc3QgY29tcG9uZW50IGFuZCB0aGVyZSBhcmUgbm8gdmFsaWQgZXh0ZXJuYWwgdGFyZ2V0cy5cclxuICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIG9ubHkgdGhlIGN1cnJlbnQgbGF5b3V0IGNvbmZpZ3VyYXRpb24gaXMgcG9zc2libGUsIHNvIHRoZXJlIGlzIG5vIHBvaW50IGluIGRyYWdnaW5nLlxyXG4gICAgICAgIGlmIChpc0xhc3QgJiYgIWFsbG93UG9wb3V0ICYmICFjYW5Nb3ZlQmV0d2VlbldpbmRvd3MpIHtcclxuICAgICAgICAgICAgZHJhZ0xpc3RlbmVyLmNhbmNlbERyYWcoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgYWN0aW9uID0gRHJhZ0FjdGlvbi5zdGFydCh0aGlzLCBkcmFnTGlzdGVuZXIsIGNvbXBvbmVudEl0ZW0sIHgsIHksIGFsbG93UG9wb3V0KTtcclxuXHJcbiAgICAgICAgaWYgKGNhbk1vdmVCZXR3ZWVuV2luZG93cykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBsbSBvZiB0aGlzLmluc3RhbmNlcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGxtICE9PSB0aGlzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG0uc3RhcnRFeHRlcm5hbENvbXBvbmVudERyYWcoYWN0aW9uKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBoaWRlRHJvcFRhcmdldEluZGljYXRvcigpIHtcclxuICAgICAgICB0aGlzLnRhYkRyb3BQbGFjZWhvbGRlci5yZW1vdmUoKTtcclxuICAgICAgICB0aGlzLmRyb3BUYXJnZXRJbmRpY2F0b3I/LmhpZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb2dyYW1tYXRpY2FsbHkgZm9jdXNlcyBhbiBpdGVtLiBUaGlzIGZvY3VzZXMgdGhlIHNwZWNpZmllZCBjb21wb25lbnQgaXRlbVxyXG4gICAgICogYW5kIHRoZSBpdGVtIGVtaXRzIGEgZm9jdXMgZXZlbnRcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaXRlbSAtIFRoZSBjb21wb25lbnQgaXRlbSB0byBiZSBmb2N1c2VkXHJcbiAgICAgKiBAcGFyYW0gc3VwcHJlc3NFdmVudCAtIFdoZXRoZXIgdG8gZW1pdCBmb2N1cyBldmVudFxyXG4gICAgICovXHJcbiAgICBmb2N1c0NvbXBvbmVudChpdGVtOiBDb21wb25lbnRJdGVtLCBzdXBwcmVzc0V2ZW50ID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICBpdGVtLmZvY3VzKHN1cHByZXNzRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvZ3JhbW1hdGljYWxseSBibHVycyAoZGVmb2N1c2VzKSB0aGUgY3VycmVudGx5IGZvY3VzZWQgY29tcG9uZW50LlxyXG4gICAgICogSWYgYSBjb21wb25lbnQgaXRlbSBpcyBmb2N1c2VkLCB0aGVuIGl0IGlzIGJsdXJyZWQgYW5kIGFuZCB0aGUgaXRlbSBlbWl0cyBhIGJsdXIgZXZlbnRcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaXRlbSAtIFRoZSBjb21wb25lbnQgaXRlbSB0byBiZSBibHVycmVkXHJcbiAgICAgKiBAcGFyYW0gc3VwcHJlc3NFdmVudCAtIFdoZXRoZXIgdG8gZW1pdCBibHVyIGV2ZW50XHJcbiAgICAgKi9cclxuICAgIGNsZWFyQ29tcG9uZW50Rm9jdXMoc3VwcHJlc3NFdmVudCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXRGb2N1c2VkQ29tcG9uZW50SXRlbSh1bmRlZmluZWQsIHN1cHByZXNzRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvZ3JhbW1hdGljYWxseSBmb2N1c2VzIGEgY29tcG9uZW50IGl0ZW0gb3IgcmVtb3ZlcyBmb2N1cyAoYmx1cnMpIGZyb20gYW4gZXhpc3RpbmcgZm9jdXNlZCBjb21wb25lbnQgaXRlbS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaXRlbSAtIElmIGRlZmluZWQsIHNwZWNpZmllcyB0aGUgY29tcG9uZW50IGl0ZW0gdG8gYmUgZ2l2ZW4gZm9jdXMuICBJZiB1bmRlZmluZWQsIGNsZWFyIGNvbXBvbmVudCBmb2N1cy5cclxuICAgICAqIEBwYXJhbSBzdXBwcmVzc0V2ZW50cyAtIFdoZXRoZXIgdG8gZW1pdCBmb2N1cyBhbmQgYmx1ciBldmVudHNcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBzZXRGb2N1c2VkQ29tcG9uZW50SXRlbShpdGVtOiBDb21wb25lbnRJdGVtIHwgdW5kZWZpbmVkLCBzdXBwcmVzc0V2ZW50cyA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGl0ZW0gIT09IHRoaXMuX2ZvY3VzZWRDb21wb25lbnRJdGVtKSB7XHJcblxyXG4gICAgICAgICAgICBsZXQgbmV3Rm9jdXNlZFBhcmVudEl0ZW06IENvbXBvbmVudFBhcmVudGFibGVJdGVtIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBuZXdGb2N1c2VkUGFyZW50SXRlbSA9PT0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbmV3Rm9jdXNlZFBhcmVudEl0ZW0gPSBpdGVtLnBhcmVudEl0ZW07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9mb2N1c2VkQ29tcG9uZW50SXRlbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvbGRGb2N1c2VkSXRlbSA9IHRoaXMuX2ZvY3VzZWRDb21wb25lbnRJdGVtO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNlZENvbXBvbmVudEl0ZW0gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBvbGRGb2N1c2VkSXRlbS5zZXRCbHVycmVkKHN1cHByZXNzRXZlbnRzKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9sZEZvY3VzZWRQYXJlbnRJdGVtID0gb2xkRm9jdXNlZEl0ZW0ucGFyZW50SXRlbTtcclxuICAgICAgICAgICAgICAgIGlmIChuZXdGb2N1c2VkUGFyZW50SXRlbSA9PT0gb2xkRm9jdXNlZFBhcmVudEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXdGb2N1c2VkUGFyZW50SXRlbSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2xkRm9jdXNlZFBhcmVudEl0ZW0uc2V0Rm9jdXNlZFZhbHVlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGl0ZW0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNlZENvbXBvbmVudEl0ZW0gPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgaXRlbS5zZXRGb2N1c2VkKHN1cHByZXNzRXZlbnRzKTtcclxuICAgICAgICAgICAgICAgIGlmIChuZXdGb2N1c2VkUGFyZW50SXRlbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3Rm9jdXNlZFBhcmVudEl0ZW0uc2V0Rm9jdXNlZFZhbHVlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlQ29udGVudEl0ZW1Gcm9tQ29uZmlnKGNvbmZpZzogUmVzb2x2ZWRJdGVtQ29uZmlnLCBwYXJlbnQ6IENvbnRlbnRJdGVtKTogQ29udGVudEl0ZW0ge1xyXG4gICAgICAgIHN3aXRjaCAoY29uZmlnLnR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5ncm91bmQ6IHRocm93IG5ldyBBc3NlcnRFcnJvcignTE1DQ0lGQzY4ODcxJyk7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUucm93OiByZXR1cm4gbmV3IFJvd09yQ29sdW1uKGZhbHNlLCB0aGlzLCBjb25maWcgYXMgUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcsIHBhcmVudCk7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29sdW1uOiByZXR1cm4gbmV3IFJvd09yQ29sdW1uKHRydWUsIHRoaXMsIGNvbmZpZyBhcyBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZywgcGFyZW50KTtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5zdGFjazogcmV0dXJuIG5ldyBTdGFjayh0aGlzLCBjb25maWcgYXMgUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcsIHBhcmVudCk7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29tcG9uZW50OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRJdGVtKHRoaXMsIGNvbmZpZyBhcyBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcsIHBhcmVudCBhcyBTdGFjayk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWFjaGFibGVDYXNlRXJyb3IoJ0NDQzkxMzU2NCcsIGNvbmZpZy50eXBlLCAnSW52YWxpZCBDb25maWcgSXRlbSB0eXBlIHNwZWNpZmllZCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gc3RhY2sgY29tcG9uZW50LlxyXG4gICAgICogU3RhY2sgd2lsbCBsb29rIGFmdGVyIGRvY2tpbmcgcHJvY2Vzc2luZyBhc3NvY2lhdGVkIHdpdGggbWF4aW1pc2UvbWluaW1pc2VcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICoqL1xyXG4gICAgc2V0TWF4aW1pc2VkU3RhY2soc3RhY2s6IFN0YWNrIHwgdW5kZWZpbmVkKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHN0YWNrID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX21heGltaXNlZFN0YWNrICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc01pbmltaXNlTWF4aW1pc2VkU3RhY2soKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChzdGFjayAhPT0gdGhpcy5fbWF4aW1pc2VkU3RhY2spIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXhpbWlzZWRTdGFjayAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzTWluaW1pc2VNYXhpbWlzZWRTdGFjaygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc01heGltaXNlU3RhY2soc3RhY2spO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrTWluaW1pc2VNYXhpbWlzZWRTdGFjaygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fbWF4aW1pc2VkU3RhY2sgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9tYXhpbWlzZWRTdGFjay5taW5pbWlzZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBzaG93QWxsQWN0aXZlQ29udGVudEl0ZW1zKCkgd2FzIGNhbGxlZCBmcm9tIENvbnRlbnRJdGVtLnNob3coKS4gIE5vdCBzdXJlIHdoYXQgaXRzIHB1cnBvc2Ugd2FzIHNvIGhhdmUgY29tbWVudGVkIG91dFxyXG4gICAgLy8gRXZlcnl0aGluZyBzZWVtcyB0byB3b3JrIG9rIHdpdGhvdXQgdGhpcy4gIEhhdmUgbGVmdCBjb21tZW50ZWQgY29kZSBqdXN0IGluIGNhc2UgdGhlcmUgd2FzIGEgcmVhc29uIGZvciBpdCBiZWNvbWVzXHJcbiAgICAvLyBhcHBhcmVudFxyXG5cclxuICAgIC8vIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIC8vIHNob3dBbGxBY3RpdmVDb250ZW50SXRlbXMoKTogdm9pZCB7XHJcbiAgICAvLyAgICAgY29uc3QgYWxsU3RhY2tzID0gdGhpcy5nZXRBbGxTdGFja3MoKTtcclxuXHJcbiAgICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxTdGFja3MubGVuZ3RoOyBpKyspIHtcclxuICAgIC8vICAgICAgICAgY29uc3Qgc3RhY2sgPSBhbGxTdGFja3NbaV07XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGFjdGl2ZUNvbnRlbnRJdGVtID0gc3RhY2suZ2V0QWN0aXZlQ29tcG9uZW50SXRlbSgpO1xyXG5cclxuICAgIC8vICAgICAgICAgaWYgKGFjdGl2ZUNvbnRlbnRJdGVtICE9PSB1bmRlZmluZWQpIHtcclxuICAgIC8vICAgICAgICAgICAgIGlmICghKGFjdGl2ZUNvbnRlbnRJdGVtIGluc3RhbmNlb2YgQ29tcG9uZW50SXRlbSkpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNU0FBQ0lTMjIyOTgnKTtcclxuICAgIC8vICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgYWN0aXZlQ29udGVudEl0ZW0uY29udGFpbmVyLnNob3coKTtcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBoaWRlQWxsQWN0aXZlQ29udGVudEl0ZW1zKCkgd2FzIGNhbGxlZCBmcm9tIENvbnRlbnRJdGVtLmhpZGUoKS4gIE5vdCBzdXJlIHdoYXQgaXRzIHB1cnBvc2Ugd2FzIHNvIGhhdmUgY29tbWVudGVkIG91dFxyXG4gICAgLy8gRXZlcnl0aGluZyBzZWVtcyB0byB3b3JrIG9rIHdpdGhvdXQgdGhpcy4gIEhhdmUgbGVmdCBjb21tZW50ZWQgY29kZSBqdXN0IGluIGNhc2UgdGhlcmUgd2FzIGEgcmVhc29uIGZvciBpdCBiZWNvbWVzXHJcbiAgICAvLyBhcHBhcmVudFxyXG5cclxuICAgIC8vIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIC8vIGhpZGVBbGxBY3RpdmVDb250ZW50SXRlbXMoKTogdm9pZCB7XHJcbiAgICAvLyAgICAgY29uc3QgYWxsU3RhY2tzID0gdGhpcy5nZXRBbGxTdGFja3MoKTtcclxuXHJcbiAgICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxTdGFja3MubGVuZ3RoOyBpKyspIHtcclxuICAgIC8vICAgICAgICAgY29uc3Qgc3RhY2sgPSBhbGxTdGFja3NbaV07XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGFjdGl2ZUNvbnRlbnRJdGVtID0gc3RhY2suZ2V0QWN0aXZlQ29tcG9uZW50SXRlbSgpO1xyXG5cclxuICAgIC8vICAgICAgICAgaWYgKGFjdGl2ZUNvbnRlbnRJdGVtICE9PSB1bmRlZmluZWQpIHtcclxuICAgIC8vICAgICAgICAgICAgIGlmICghKGFjdGl2ZUNvbnRlbnRJdGVtIGluc3RhbmNlb2YgQ29tcG9uZW50SXRlbSkpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNU0FBQ0lIMjIyOTgnKTtcclxuICAgIC8vICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgYWN0aXZlQ29udGVudEl0ZW0uY29udGFpbmVyLmhpZGUoKTtcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGNsZWFudXBCZWZvcmVNYXhpbWlzZWRTdGFja0Rlc3Ryb3llZChldmVudDogRXZlbnRFbWl0dGVyLkJ1YmJsaW5nRXZlbnQpIHtcclxuXHRcdGlmICh0aGlzLl9tYXhpbWlzZWRTdGFjayAhPT0gbnVsbCAmJiB0aGlzLl9tYXhpbWlzZWRTdGFjayA9PT0gZXZlbnQudGFyZ2V0KSB7XHJcblx0XHRcdHRoaXMuX21heGltaXNlZFN0YWNrLm9mZignYmVmb3JlSXRlbURlc3Ryb3llZCcsIHRoaXMuX21heGltaXNlZFN0YWNrQmVmb3JlRGVzdHJveWVkTGlzdGVuZXIpO1xyXG5cdFx0XHR0aGlzLl9tYXhpbWlzZWRTdGFjayA9IHVuZGVmaW5lZDtcclxuXHRcdH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IGFyb3VuZCBzYW5kYm94ZWQgaWZyYW1lIHJlc3RyaWN0aW9ucy5cclxuICAgICAqIElmICdhbGxvdy10b3AtbmF2aWdhdGlvbicgaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgaWZyYW1lJ3MgJ3NhbmRib3gnIGF0dHJpYnV0ZVxyXG4gICAgICogKGFzIGlzIHRoZSBjYXNlIHdpdGggY29kZXBlbnMpIHRoZSBwYXJlbnQgd2luZG93IGlzIGZvcmJpZGRlbiBmcm9tIGNhbGxpbmcgY2VydGFpblxyXG4gICAgICogbWV0aG9kcyBvbiB0aGUgY2hpbGQsIHN1Y2ggYXMgd2luZG93LmNsb3NlKCkgb3Igc2V0dGluZyBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgcHJldmVudGVkIEdvbGRlbkxheW91dCBwb3BvdXRzIGZyb20gcG9wcGluZyBpbiBpbiBjb2RlcGVucy4gVGhlIGZpeCBpcyB0byBjYWxsXHJcbiAgICAgKiBfJGNsb3NlV2luZG93IG9uIHRoZSBjaGlsZCB3aW5kb3cncyBnbCBpbnN0YW5jZSB3aGljaCAoYWZ0ZXIgYSB0aW1lb3V0IHRvIGRpc2Nvbm5lY3RcclxuICAgICAqIHRoZSBpbnZva2luZyBtZXRob2QgZnJvbSB0aGUgY2xvc2UgY2FsbCkgY2xvc2VzIGl0c2VsZi5cclxuICAgICAqXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgY2xvc2VXaW5kb3coKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsVGhpcy5zZXRUaW1lb3V0KCgpID0+IGdsb2JhbFRoaXMuY2xvc2UoKSwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZ2V0QXJlYSh4OiBudW1iZXIsIHk6IG51bWJlcik6IENvbnRlbnRJdGVtLkFyZWEgfCBudWxsIHtcclxuICAgICAgICBsZXQgbWF0Y2hpbmdBcmVhOiBDb250ZW50SXRlbS5BcmVhIHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgbGV0IHNtYWxsZXN0U3VyZmFjZSA9IEluZmluaXR5O1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2l0ZW1BcmVhcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBhcmVhID0gdGhpcy5faXRlbUFyZWFzW2ldO1xyXG5cclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgeCA+PSBhcmVhLngxICYmXHJcbiAgICAgICAgICAgICAgICB4IDwgYXJlYS54MiAmJiAvLyB4MiBpcyBub3QgaW5jbHVkZWQgaW4gYXJlYVxyXG4gICAgICAgICAgICAgICAgeSA+PSBhcmVhLnkxICYmXHJcbiAgICAgICAgICAgICAgICB5IDwgYXJlYS55MiAmJiAvLyB5MiBpcyBub3QgaW5jbHVkZWQgaW4gYXJlYVxyXG4gICAgICAgICAgICAgICAgc21hbGxlc3RTdXJmYWNlID4gYXJlYS5zdXJmYWNlXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgc21hbGxlc3RTdXJmYWNlID0gYXJlYS5zdXJmYWNlO1xyXG4gICAgICAgICAgICAgICAgbWF0Y2hpbmdBcmVhID0gYXJlYTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG1hdGNoaW5nQXJlYTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjYWxjdWxhdGVJdGVtQXJlYXMoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgYWxsQ29udGVudEl0ZW1zID0gdGhpcy5nZXRBbGxDb250ZW50SXRlbXMoKTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0aGUgbGFzdCBpdGVtIGlzIGRyYWdnZWQgb3V0LCBoaWdobGlnaHQgdGhlIGVudGlyZSBjb250YWluZXIgc2l6ZSB0b1xyXG4gICAgICAgICAqIGFsbG93IHRvIHJlLWRyb3AgaXQuIHRoaXMuZ3JvdW5kLmNvbnRlbnRpSXRlbXMubGVuZ3RoID09PSAwIGF0IHRoaXMgcG9pbnRcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIERvbid0IGluY2x1ZGUgZ3JvdW5kIGludG8gdGhlIHBvc3NpYmxlIGRyb3AgYXJlYXMgdGhvdWdoIG90aGVyd2lzZSBzaW5jZSBpdFxyXG4gICAgICAgICAqIHdpbGwgdXNlZCBmb3IgZXZlcnkgZ2FwIGluIHRoZSBsYXlvdXQsIGUuZy4gc3BsaXR0ZXJzXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgZ3JvdW5kSXRlbSA9IHRoaXMuX2dyb3VuZEl0ZW07XHJcbiAgICAgICAgaWYgKGdyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTUNJQVI0NDM2NScpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChhbGxDb250ZW50SXRlbXMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBObyByb290IENvbnRlbnRJdGVtIChqdXN0IEdyb3VuZCBDb250ZW50SXRlbSlcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VuZEFyZWEgPSBncm91bmRJdGVtLmdldEVsZW1lbnRBcmVhKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdW5kQXJlYSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdMTUNJQVJBNDQzNjUnKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pdGVtQXJlYXMgPSBbZ3JvdW5kQXJlYV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdW5kSXRlbS5jb250ZW50SXRlbXNbMF0uaXNTdGFjaykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHJvb3QgaXMgU3RhY2ssIHRoZW4gc3BsaXQgc3RhY2sgYW5kIHNpZGVzIG9mIExheW91dCBhcmUgc2FtZSwgc28gc2tpcCBzaWRlc1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2l0ZW1BcmVhcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBzaWRlcyBvZiBsYXlvdXRcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pdGVtQXJlYXMgPSBncm91bmRJdGVtLmNyZWF0ZVNpZGVBcmVhcygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsQ29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSBhbGxDb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKENvbnRlbnRJdGVtLmlzU3RhY2soc3RhY2spKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZWEgPSBzdGFjay5nZXRBcmVhKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJlYSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pdGVtQXJlYXMucHVzaChhcmVhKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrQ29udGVudEFyZWFEaW1lbnNpb25zID0gc3RhY2suY29udGVudEFyZWFEaW1lbnNpb25zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrQ29udGVudEFyZWFEaW1lbnNpb25zID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTUNJQVNDNDU1OTknKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlnaGxpZ2h0QXJlYSA9IHN0YWNrQ29udGVudEFyZWFEaW1lbnNpb25zLmhlYWRlci5oaWdobGlnaHRBcmVhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VyZmFjZSA9IChoaWdobGlnaHRBcmVhLngyIC0gaGlnaGxpZ2h0QXJlYS54MSkgKiAoaGlnaGxpZ2h0QXJlYS55MiAtIGhpZ2hsaWdodEFyZWEueTEpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXI6IENvbnRlbnRJdGVtLkFyZWEgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxOiBoaWdobGlnaHRBcmVhLngxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MjogaGlnaGxpZ2h0QXJlYS54MixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTE6IGhpZ2hsaWdodEFyZWEueTEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkyOiBoaWdobGlnaHRBcmVhLnkyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50SXRlbTogc3RhY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pdGVtQXJlYXMucHVzaChoZWFkZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGFzIHBhcnQgb2YgbG9hZGluZyBhIG5ldyBsYXlvdXQgKGluY2x1ZGluZyBpbml0aWFsIGluaXQoKSkuXHJcbiAgICAgKiBDaGVja3MgdG8gc2VlIGxheW91dCBoYXMgYSBtYXhpbWlzZWQgaXRlbS4gSWYgc28sIGl0IG1heGltaXNlcyB0aGF0IGl0ZW0uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjaGVja0xvYWRlZExheW91dE1heGltaXNlSXRlbSgpIHtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0xNQ0xMTUk0MzQzMicpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZ01heGltaXNlZEl0ZW1zID0gdGhpcy5fZ3JvdW5kSXRlbS5nZXRDb25maWdNYXhpbWlzZWRJdGVtcygpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNvbmZpZ01heGltaXNlZEl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGxldCBpdGVtID0gY29uZmlnTWF4aW1pc2VkSXRlbXNbMF07XHJcbiAgICAgICAgICAgICAgICBpZiAoQ29udGVudEl0ZW0uaXNDb21wb25lbnRJdGVtKGl0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSBpdGVtLnBhcmVudDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2sgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0xNWExMTUk2OTk5OScpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBzdGFjaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIUNvbnRlbnRJdGVtLmlzU3RhY2soaXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNQ0xMTUkxOTk5MycpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLm1heGltaXNlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBwcm9jZXNzTWF4aW1pc2VTdGFjayhzdGFjazogU3RhY2spOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9tYXhpbWlzZWRTdGFjayA9IHN0YWNrO1xyXG4gICAgICAgIHN0YWNrLm9uKCdiZWZvcmVJdGVtRGVzdHJveWVkJywgdGhpcy5fbWF4aW1pc2VkU3RhY2tCZWZvcmVEZXN0cm95ZWRMaXN0ZW5lcik7XHJcbiAgICAgICAgc3RhY2suZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuTWF4aW1pc2VkKTtcclxuICAgICAgICBzdGFjay5lbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCB0aGlzLl9tYXhpbWlzZVBsYWNlaG9sZGVyKTtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0xNTVhJMTk5OTMnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9ncm91bmRJdGVtLmVsZW1lbnQucHJlcGVuZChzdGFjay5lbGVtZW50KTtcclxuICAgICAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBnZXRFbGVtZW50Q2xpZW50V2lkdGhBbmRIZWlnaHQodGhpcy5fY29udGFpbmVyRWxlbWVudCk7XHJcbiAgICAgICAgICAgIHNldEVsZW1lbnRXaWR0aChzdGFjay5lbGVtZW50LCB3aWR0aCk7XHJcbiAgICAgICAgICAgIHNldEVsZW1lbnRIZWlnaHQoc3RhY2suZWxlbWVudCwgaGVpZ2h0KTtcclxuICAgICAgICAgICAgc3RhY2sudXBkYXRlU2l6ZSh0cnVlKTtcclxuICAgICAgICAgICAgc3RhY2suZm9jdXNBY3RpdmVDb250ZW50SXRlbSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9tYXhpbWlzZWRTdGFjay5lbWl0KCdtYXhpbWlzZWQnKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdzdGF0ZUNoYW5nZWQnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBwcm9jZXNzTWluaW1pc2VNYXhpbWlzZWRTdGFjaygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fbWF4aW1pc2VkU3RhY2sgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNTU1TNzQ0MjInKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFjayA9IHRoaXMuX21heGltaXNlZFN0YWNrO1xyXG4gICAgICAgICAgICBpZiAoc3RhY2sucGFyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignTE1NSTEzNjY4Jyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzdGFjay5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5NYXhpbWlzZWQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4aW1pc2VQbGFjZWhvbGRlci5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgc3RhY2suZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhpbWlzZVBsYWNlaG9sZGVyLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVSb290U2l6ZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21heGltaXNlZFN0YWNrID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgc3RhY2sub2ZmKCdiZWZvcmVJdGVtRGVzdHJveWVkJywgdGhpcy5fbWF4aW1pc2VkU3RhY2tCZWZvcmVEZXN0cm95ZWRMaXN0ZW5lcik7XHJcbiAgICAgICAgICAgICAgICBzdGFjay5lbWl0KCdtaW5pbWlzZWQnKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnc3RhdGVDaGFuZ2VkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdGVyYXRlcyB0aHJvdWdoIHRoZSBhcnJheSBvZiBvcGVuIHBvcG91dCB3aW5kb3dzIGFuZCByZW1vdmVzIHRoZSBvbmVzXHJcbiAgICAgKiB0aGF0IGFyZSBlZmZlY3RpdmVseSBjbG9zZWQuIFRoaXMgaXMgbmVjZXNzYXJ5IGR1ZSB0byB0aGUgbGFjayBvZiByZWxpYWJseVxyXG4gICAgICogbGlzdGVuaW5nIGZvciB3aW5kb3cuY2xvc2UgLyB1bmxvYWQgZXZlbnRzIGluIGEgY3Jvc3MgYnJvd3NlciBjb21wYXRpYmxlIGZhc2hpb24uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByZWNvbmNpbGVQb3BvdXRXaW5kb3dzKCkge1xyXG4gICAgICAgIGNvbnN0IG9wZW5Qb3BvdXRzOiBCcm93c2VyUG9wb3V0W10gPSBbXTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9vcGVuUG9wb3V0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fb3BlblBvcG91dHNbaV0uZ2V0V2luZG93KCkuY2xvc2VkID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgb3BlblBvcG91dHMucHVzaCh0aGlzLl9vcGVuUG9wb3V0c1tpXSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3dpbmRvd0Nsb3NlZCcsIHRoaXMuX29wZW5Qb3BvdXRzW2ldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX29wZW5Qb3BvdXRzLmxlbmd0aCAhPT0gb3BlblBvcG91dHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX29wZW5Qb3BvdXRzID0gb3BlblBvcG91dHM7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnc3RhdGVDaGFuZ2VkJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBmbGF0dGVuZWQgYXJyYXkgb2YgYWxsIGNvbnRlbnQgaXRlbXMsXHJcbiAgICAgKiByZWdhcmRsZXMgb2YgbGV2ZWwgb3IgdHlwZVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0QWxsQ29udGVudEl0ZW1zKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1HQUNJMTMxMzAnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZ3JvdW5kSXRlbS5nZXRBbGxDb250ZW50SXRlbXMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIFN1YndpbmRvd3MgKGlmIHRoZXJlIGFyZSBhbnkpLiBUaHJvd3MgYW4gZXJyb3JcclxuICAgICAqIGlmIHBvcG91dHMgYXJlIGJsb2NrZWQuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVTdWJXaW5kb3dzKCkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5sYXlvdXRDb25maWcub3BlblBvcG91dHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgcG9wb3V0Q29uZmlnID0gdGhpcy5sYXlvdXRDb25maWcub3BlblBvcG91dHNbaV07XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlUG9wb3V0RnJvbVBvcG91dExheW91dENvbmZpZyhwb3BvdXRDb25maWcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlYm91bmNlcyByZXNpemUgZXZlbnRzXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVDb250YWluZXJSZXNpemUoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMucmVzaXplV2l0aENvbnRhaW5lckF1dG9tYXRpY2FsbHkpIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmVzaXplV2l0aERlYm91bmNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVib3VuY2VzIHJlc2l6ZSBldmVudHNcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHByb2Nlc3NSZXNpemVXaXRoRGVib3VuY2UoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMucmVzaXplRGVib3VuY2VFeHRlbmRlZFdoZW5Qb3NzaWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrQ2xlYXJSZXNpemVUaW1lb3V0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fcmVzaXplVGltZW91dElkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fcmVzaXplVGltZW91dElkID0gc2V0VGltZW91dChcclxuICAgICAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXNpemVUaW1lb3V0SWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iZWdpblNpemVJbnZhbGlkYXRpb24oKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZFNpemVJbnZhbGlkYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2l6ZURlYm91bmNlSW50ZXJ2YWwsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2hlY2tDbGVhclJlc2l6ZVRpbWVvdXQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3Jlc2l6ZVRpbWVvdXRJZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9yZXNpemVUaW1lb3V0SWQpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXNpemVUaW1lb3V0SWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGV0ZXJtaW5lcyB3aGF0IGVsZW1lbnQgdGhlIGxheW91dCB3aWxsIGJlIGNyZWF0ZWQgaW5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHNldENvbnRhaW5lcigpIHtcclxuICAgICAgICBjb25zdCBib2R5RWxlbWVudCA9IGRvY3VtZW50LmJvZHk7XHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IHRoaXMuX2NvbnRhaW5lckVsZW1lbnQgPz8gYm9keUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIGlmIChjb250YWluZXJFbGVtZW50ID09PSBib2R5RWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVdpdGhDb250YWluZXJBdXRvbWF0aWNhbGx5ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcclxuICAgICAgICAgICAgZG9jdW1lbnRFbGVtZW50LnN0eWxlLmhlaWdodCA9ICcxMDAlJztcclxuICAgICAgICAgICAgZG9jdW1lbnRFbGVtZW50LnN0eWxlLm1hcmdpbiA9ICcwJztcclxuICAgICAgICAgICAgZG9jdW1lbnRFbGVtZW50LnN0eWxlLnBhZGRpbmcgPSAnMCc7XHJcbiAgICAgICAgICAgIGRvY3VtZW50RWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xyXG4gICAgICAgICAgICBib2R5RWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7XHJcbiAgICAgICAgICAgIGJvZHlFbGVtZW50LnN0eWxlLm1hcmdpbiA9ICcwJztcclxuICAgICAgICAgICAgYm9keUVsZW1lbnQuc3R5bGUucGFkZGluZyA9ICcwJztcclxuICAgICAgICAgICAgYm9keUVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lckVsZW1lbnQgPSBjb250YWluZXJFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIHdoZW4gdGhlIHdpbmRvdyBpcyBjbG9zZWQgb3IgdGhlIHVzZXIgbmF2aWdhdGVzIGF3YXlcclxuICAgICAqIGZyb20gdGhlIHBhZ2VcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICogQGRlcHJlY2F0ZWQgdG8gYmUgcmVtb3ZlZCBpbiB2ZXJzaW9uIDNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvbkJlZm9yZVVubG9hZCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkanVzdHMgdGhlIG51bWJlciBvZiBjb2x1bW5zIHRvIGJlIGxvd2VyIHRvIGZpdCB0aGUgc2NyZWVuIGFuZCBzdGlsbCBtYWludGFpbiBtaW5JdGVtV2lkdGguXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhZGp1c3RDb2x1bW5zUmVzcG9uc2l2ZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0xNQUNSMjA4ODMnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9maXJzdExvYWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gbWluIHdpZHRoIHNldCwgb3Igbm90IGNvbnRlbnQgaXRlbXMsIGRvIG5vdGhpbmcuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnVzZVJlc3BvbnNpdmVMYXlvdXQoKSAmJlxyXG4gICAgICAgICAgICAgICAgIXRoaXMuX3VwZGF0aW5nQ29sdW1uc1Jlc3BvbnNpdmUgJiZcclxuICAgICAgICAgICAgICAgIHRoaXMuX2dyb3VuZEl0ZW0uY29udGVudEl0ZW1zLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgIHRoaXMuX2dyb3VuZEl0ZW0uY29udGVudEl0ZW1zWzBdLmlzUm93KVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuX3dpZHRoID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1BQ1I3NzQxMicpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBvbmx5IG9uZSBjb2x1bW4sIGRvIG5vdGhpbmcuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sdW1uQ291bnQgPSB0aGlzLl9ncm91bmRJdGVtLmNvbnRlbnRJdGVtc1swXS5jb250ZW50SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW5Db3VudCA8PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGV5IGFsbCBzdGlsbCBmaXQsIGRvIG5vdGhpbmcuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1pbkl0ZW1XaWR0aCA9IHRoaXMubGF5b3V0Q29uZmlnLmRpbWVuc2lvbnMuZGVmYXVsdE1pbkl0ZW1XaWR0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG90YWxNaW5XaWR0aCA9IGNvbHVtbkNvdW50ICogbWluSXRlbVdpZHRoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG90YWxNaW5XaWR0aCA8PSB0aGlzLl93aWR0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJldmVudCB1cGRhdGVzIHdoaWxlIGl0IGlzIGFscmVhZHkgaGFwcGVuaW5nLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdDb2x1bW5zUmVzcG9uc2l2ZSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlndXJlIG91dCBob3cgbWFueSBjb2x1bW5zIHRvIHN0YWNrLCBhbmQgcHV0IHRoZW0gYWxsIGluIHRoZSBmaXJzdCBzdGFjayBjb250YWluZXIuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaW5hbENvbHVtbkNvdW50ID0gTWF0aC5tYXgoTWF0aC5mbG9vcih0aGlzLl93aWR0aCAvIG1pbkl0ZW1XaWR0aCksIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2tDb2x1bW5Db3VudCA9IGNvbHVtbkNvdW50IC0gZmluYWxDb2x1bW5Db3VudDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByb290Q29udGVudEl0ZW0gPSB0aGlzLl9ncm91bmRJdGVtLmNvbnRlbnRJdGVtc1swXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbFN0YWNrcyA9IHRoaXMuZ2V0QWxsU3RhY2tzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxsU3RhY2tzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignTE1BQ1JTNzc0MTMnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFN0YWNrQ29udGFpbmVyID0gYWxsU3RhY2tzWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhY2tDb2x1bW5Db3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0YWNrIGZyb20gcmlnaHQuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHJvb3RDb250ZW50SXRlbS5jb250ZW50SXRlbXNbcm9vdENvbnRlbnRJdGVtLmNvbnRlbnRJdGVtcy5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDaGlsZENvbnRlbnRJdGVtc1RvQ29udGFpbmVyKGZpcnN0U3RhY2tDb250YWluZXIsIGNvbHVtbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ0NvbHVtbnNSZXNwb25zaXZlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHJlc3BvbnNpdmUgbGF5b3V0IHNob3VsZCBiZSB1c2VkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIFRydWUgaWYgcmVzcG9uc2l2ZSBsYXlvdXQgc2hvdWxkIGJlIHVzZWQ7IG90aGVyd2lzZSBmYWxzZS5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHVzZVJlc3BvbnNpdmVMYXlvdXQoKSB7XHJcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLmxheW91dENvbmZpZy5zZXR0aW5ncztcclxuICAgICAgICBjb25zdCBhbHdheXNSZXNwb25zaXZlTW9kZSA9IHNldHRpbmdzLnJlc3BvbnNpdmVNb2RlID09PSBSZXNwb25zaXZlTW9kZS5hbHdheXM7XHJcbiAgICAgICAgY29uc3Qgb25Mb2FkUmVzcG9uc2l2ZU1vZGVBbmRGaXJzdCA9IHNldHRpbmdzLnJlc3BvbnNpdmVNb2RlID09PSBSZXNwb25zaXZlTW9kZS5vbmxvYWQgJiYgdGhpcy5fZmlyc3RMb2FkO1xyXG4gICAgICAgIHJldHVybiBhbHdheXNSZXNwb25zaXZlTW9kZSB8fCBvbkxvYWRSZXNwb25zaXZlTW9kZUFuZEZpcnN0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhbGwgY2hpbGRyZW4gb2YgYSBub2RlIHRvIGFub3RoZXIgY29udGFpbmVyIHJlY3Vyc2l2ZWx5LlxyXG4gICAgICogQHBhcmFtIGNvbnRhaW5lciAtIENvbnRhaW5lciB0byBhZGQgY2hpbGQgY29udGVudCBpdGVtcyB0by5cclxuICAgICAqIEBwYXJhbSBub2RlIC0gTm9kZSB0byBzZWFyY2ggZm9yIGNvbnRlbnQgaXRlbXMuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhZGRDaGlsZENvbnRlbnRJdGVtc1RvQ29udGFpbmVyKGNvbnRhaW5lcjogQ29udGVudEl0ZW0sIG5vZGU6IENvbnRlbnRJdGVtKSB7XHJcbiAgICAgICAgY29uc3QgY29udGVudEl0ZW1zID0gbm9kZS5jb250ZW50SXRlbXM7XHJcbiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBTdGFjaykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlQ2hpbGQoaXRlbSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIuYWRkQ2hpbGQoaXRlbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGRDb250ZW50SXRlbXNUb0NvbnRhaW5lcihjb250YWluZXIsIGl0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmluZHMgYWxsIHRoZSBzdGFja3MuXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgZm91bmQgc3RhY2sgY29udGFpbmVycy5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldEFsbFN0YWNrcygpIHtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0xNRkFTQzUyNzc4Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3Qgc3RhY2tzOiBTdGFja1tdID0gW107XHJcbiAgICAgICAgICAgIHRoaXMuZmluZEFsbFN0YWNrc1JlY3Vyc2l2ZShzdGFja3MsIHRoaXMuX2dyb3VuZEl0ZW0pO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHN0YWNrcztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBmaW5kRmlyc3RDb250ZW50SXRlbVR5cGUodHlwZTogSXRlbVR5cGUpOiBDb250ZW50SXRlbSB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTUZGQ0lUODI0NDYnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kRmlyc3RDb250ZW50SXRlbVR5cGVSZWN1cnNpdmUodHlwZSwgdGhpcy5fZ3JvdW5kSXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgZmluZEZpcnN0Q29udGVudEl0ZW1UeXBlUmVjdXJzaXZlKHR5cGU6IEl0ZW1UeXBlLCBub2RlOiBDb250ZW50SXRlbSk6IENvbnRlbnRJdGVtIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBjb25zdCBjb250ZW50SXRlbXMgPSBub2RlLmNvbnRlbnRJdGVtcztcclxuICAgICAgICBjb25zdCBjb250ZW50SXRlbUNvdW50ID0gY29udGVudEl0ZW1zLmxlbmd0aDtcclxuICAgICAgICBpZiAoY29udGVudEl0ZW1Db3VudCA9PT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudEl0ZW1Db3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IGNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgIGlmIChjb250ZW50SXRlbS50eXBlID09PSB0eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRJdGVtO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnRJdGVtQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSBjb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmb3VuZENvbnRlbnRJdGVtID0gdGhpcy5maW5kRmlyc3RDb250ZW50SXRlbVR5cGVSZWN1cnNpdmUodHlwZSwgY29udGVudEl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kQ29udGVudEl0ZW0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZENvbnRlbnRJdGVtO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGZpbmRGaXJzdENvbnRlbnRJdGVtVHlwZUJ5SWRSZWN1cnNpdmUodHlwZTogSXRlbVR5cGUsIGlkOiBzdHJpbmcsIG5vZGU6IENvbnRlbnRJdGVtKTogQ29udGVudEl0ZW0gfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtcyA9IG5vZGUuY29udGVudEl0ZW1zO1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtQ291bnQgPSBjb250ZW50SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgIGlmIChjb250ZW50SXRlbUNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50SXRlbUNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRJdGVtLnR5cGUgPT09IHR5cGUgJiYgY29udGVudEl0ZW0uaWQgPT09IGlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRJdGVtO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnRJdGVtQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSBjb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmb3VuZENvbnRlbnRJdGVtID0gdGhpcy5maW5kRmlyc3RDb250ZW50SXRlbVR5cGVCeUlkUmVjdXJzaXZlKHR5cGUsIGlkLCBjb250ZW50SXRlbSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZm91bmRDb250ZW50SXRlbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kQ29udGVudEl0ZW07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmluZHMgYWxsIHRoZSBzdGFjayBjb250YWluZXJzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBzdGFja3MgLSBTZXQgb2YgY29udGFpbmVycyB0byBwb3B1bGF0ZS5cclxuICAgICAqIEBwYXJhbSBub2RlIC0gQ3VycmVudCBub2RlIHRvIHByb2Nlc3MuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBmaW5kQWxsU3RhY2tzUmVjdXJzaXZlKHN0YWNrczogU3RhY2tbXSwgbm9kZTogQ29udGVudEl0ZW0pIHtcclxuICAgICAgICBjb25zdCBjb250ZW50SXRlbXMgPSBub2RlLmNvbnRlbnRJdGVtcztcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtID0gY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFN0YWNrKSB7XHJcbiAgICAgICAgICAgICAgICBzdGFja3MucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICghaXRlbS5pc0NvbXBvbmVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZEFsbFN0YWNrc1JlY3Vyc2l2ZShzdGFja3MsIGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgZmluZEZpcnN0TG9jYXRpb24oc2VsZWN0b3JzOiByZWFkb25seSBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uU2VsZWN0b3JbXSk6IExheW91dE1hbmFnZXIuTG9jYXRpb24gfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGNvbnN0IGNvdW50ID0gc2VsZWN0b3JzLmxlbmd0aDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBzZWxlY3RvcnNbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gdGhpcy5maW5kTG9jYXRpb24oc2VsZWN0b3IpO1xyXG4gICAgICAgICAgICBpZiAobG9jYXRpb24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBmaW5kTG9jYXRpb24oc2VsZWN0b3I6IExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3Rvcik6IExheW91dE1hbmFnZXIuTG9jYXRpb24gfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdG9ySW5kZXggPSBzZWxlY3Rvci5pbmRleDtcclxuICAgICAgICBzd2l0Y2ggKHNlbGVjdG9yLnR5cGVJZCkge1xyXG4gICAgICAgICAgICBjYXNlIExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuRm9jdXNlZEl0ZW06IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9mb2N1c2VkQ29tcG9uZW50SXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRJdGVtID0gdGhpcy5fZm9jdXNlZENvbXBvbmVudEl0ZW0ucGFyZW50SXRlbTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRDb250ZW50SXRlbXMgPSBwYXJlbnRJdGVtLmNvbnRlbnRJdGVtcztcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRDb250ZW50SXRlbUNvdW50ID0gcGFyZW50Q29udGVudEl0ZW1zLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3JJbmRleCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHBhcmVudEl0ZW0sIGluZGV4OiBwYXJlbnRDb250ZW50SXRlbUNvdW50IH07XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9jdXNlZEluZGV4ID0gcGFyZW50Q29udGVudEl0ZW1zLmluZGV4T2YodGhpcy5fZm9jdXNlZENvbXBvbmVudEl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGZvY3VzZWRJbmRleCArIHNlbGVjdG9ySW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBwYXJlbnRDb250ZW50SXRlbUNvdW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgcGFyZW50SXRlbSwgaW5kZXggfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuRm9jdXNlZFN0YWNrOiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZm9jdXNlZENvbXBvbmVudEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50SXRlbSA9IHRoaXMuX2ZvY3VzZWRDb21wb25lbnRJdGVtLnBhcmVudEl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJ5Q3JlYXRlTG9jYXRpb25Gcm9tUGFyZW50SXRlbShwYXJlbnRJdGVtLCBzZWxlY3RvckluZGV4KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuRmlyc3RTdGFjazoge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50SXRlbSA9IHRoaXMuZmluZEZpcnN0Q29udGVudEl0ZW1UeXBlKEl0ZW1UeXBlLnN0YWNrKTtcclxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cnlDcmVhdGVMb2NhdGlvbkZyb21QYXJlbnRJdGVtKHBhcmVudEl0ZW0sIHNlbGVjdG9ySW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgTGF5b3V0TWFuYWdlci5Mb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5GaXJzdFJvd09yQ29sdW1uOiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50SXRlbSA9IHRoaXMuZmluZEZpcnN0Q29udGVudEl0ZW1UeXBlKEl0ZW1UeXBlLnJvdyk7XHJcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50SXRlbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJ5Q3JlYXRlTG9jYXRpb25Gcm9tUGFyZW50SXRlbShwYXJlbnRJdGVtLCBzZWxlY3RvckluZGV4KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50SXRlbSA9IHRoaXMuZmluZEZpcnN0Q29udGVudEl0ZW1UeXBlKEl0ZW1UeXBlLmNvbHVtbik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudEl0ZW0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cnlDcmVhdGVMb2NhdGlvbkZyb21QYXJlbnRJdGVtKHBhcmVudEl0ZW0sIHNlbGVjdG9ySW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgTGF5b3V0TWFuYWdlci5Mb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5GaXJzdFJvdzoge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50SXRlbSA9IHRoaXMuZmluZEZpcnN0Q29udGVudEl0ZW1UeXBlKEl0ZW1UeXBlLnJvdyk7XHJcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50SXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJ5Q3JlYXRlTG9jYXRpb25Gcm9tUGFyZW50SXRlbShwYXJlbnRJdGVtLCBzZWxlY3RvckluZGV4KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuRmlyc3RDb2x1bW46IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudEl0ZW0gPSB0aGlzLmZpbmRGaXJzdENvbnRlbnRJdGVtVHlwZShJdGVtVHlwZS5jb2x1bW4pO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyeUNyZWF0ZUxvY2F0aW9uRnJvbVBhcmVudEl0ZW0ocGFyZW50SXRlbSwgc2VsZWN0b3JJbmRleCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uU2VsZWN0b3IuVHlwZUlkLkVtcHR5OiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1GTFJJRjE4MjQ0Jyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJvb3RJdGVtICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3JJbmRleCA9PT0gdW5kZWZpbmVkIHx8IHNlbGVjdG9ySW5kZXggPT09IDApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBwYXJlbnRJdGVtOiB0aGlzLl9ncm91bmRJdGVtLCBpbmRleDogMCB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uU2VsZWN0b3IuVHlwZUlkLlJvb3Q6IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTUZMRjE4MjQ0Jyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VuZENvbnRlbnRJdGVtcyA9IHRoaXMuX2dyb3VuZEl0ZW0uY29udGVudEl0ZW1zO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChncm91bmRDb250ZW50SXRlbXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RvckluZGV4ID09PSB1bmRlZmluZWQgfHwgc2VsZWN0b3JJbmRleCA9PT0gMClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHBhcmVudEl0ZW06IHRoaXMuX2dyb3VuZEl0ZW0sIGluZGV4OiAwIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudEl0ZW0gPSBncm91bmRDb250ZW50SXRlbXNbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyeUNyZWF0ZUxvY2F0aW9uRnJvbVBhcmVudEl0ZW0ocGFyZW50SXRlbSwgc2VsZWN0b3JJbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgdHJ5Q3JlYXRlTG9jYXRpb25Gcm9tUGFyZW50SXRlbShwYXJlbnRJdGVtOiBDb250ZW50SXRlbSxcclxuICAgICAgICBzZWxlY3RvckluZGV4OiBudW1iZXIgfCB1bmRlZmluZWRcclxuICAgICk6IExheW91dE1hbmFnZXIuTG9jYXRpb24gfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGNvbnN0IHBhcmVudENvbnRlbnRJdGVtcyA9IHBhcmVudEl0ZW0uY29udGVudEl0ZW1zO1xyXG4gICAgICAgIGNvbnN0IHBhcmVudENvbnRlbnRJdGVtQ291bnQgPSBwYXJlbnRDb250ZW50SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgIGlmIChzZWxlY3RvckluZGV4ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHsgcGFyZW50SXRlbSwgaW5kZXg6IHBhcmVudENvbnRlbnRJdGVtQ291bnQgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0b3JJbmRleCA8IDAgfHwgc2VsZWN0b3JJbmRleCA+IHBhcmVudENvbnRlbnRJdGVtQ291bnQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBwYXJlbnRJdGVtLCBpbmRleDogc2VsZWN0b3JJbmRleCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIExheW91dE1hbmFnZXIge1xyXG4gICAgZXhwb3J0IHR5cGUgQmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudCA9ICh0aGlzOiB2b2lkLCBjb3VudDogbnVtYmVyKSA9PiB2b2lkO1xyXG4gICAgZXhwb3J0IHR5cGUgQWZ0ZXJWaXJ0dWFsUmVjdGluZ0V2ZW50ID0gKHRoaXM6IHZvaWQpID0+IHZvaWQ7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGludGVyZmFjZSBDb25zdHJ1Y3RvclBhcmFtZXRlcnMge1xyXG4gICAgICAgIGNvbnN0cnVjdG9yT3JTdWJXaW5kb3dMYXlvdXRDb25maWc6IExheW91dENvbmZpZyB8IHVuZGVmaW5lZDtcclxuICAgICAgICBpc1N1YldpbmRvdzogYm9vbGVhbjtcclxuICAgICAgICBjb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlTWF4aW1pc2VQbGFjZUVsZW1lbnQoZG9jdW1lbnQ6IERvY3VtZW50KTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5NYXhpbWlzZVBsYWNlKTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlVGFiRHJvcFBsYWNlaG9sZGVyRWxlbWVudChkb2N1bWVudDogRG9jdW1lbnQpOiBIVE1MRWxlbWVudCB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkRyb3BUYWJQbGFjZWhvbGRlcik7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTcGVjaWZpZXMgYSBsb2NhdGlvbiBvZiBhIENvbnRlbnRJdGVtIHdpdGhvdXQgcmVmZXJlbmNpbmcgdGhlIGNvbnRlbnQgaXRlbS5cclxuICAgICAqIFVzZWQgdG8gc3BlY2lmeSB3aGVyZSBhIG5ldyBpdGVtIGlzIHRvIGJlIGFkZGVkXHJcbiAgICAgKiBAcHVibGljXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgTG9jYXRpb24ge1xyXG4gICAgICAgIHBhcmVudEl0ZW06IENvbnRlbnRJdGVtO1xyXG4gICAgICAgIGluZGV4OiBudW1iZXI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHNlbGVjdG9yIHVzZWQgdG8gc3BlY2lmeSBhIHVuaXF1ZSBsb2NhdGlvbiBpbiB0aGUgbGF5b3V0XHJcbiAgICAgKiBAcHVibGljXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgTG9jYXRpb25TZWxlY3RvciB7XHJcbiAgICAgICAgLyoqIFNwZWNpZmllcyBzZWxlY3RvciBhbGdvcml0aG0gKi9cclxuICAgICAgICB0eXBlSWQ6IExvY2F0aW9uU2VsZWN0b3IuVHlwZUlkO1xyXG4gICAgICAgIC8qKiBVc2VkIGJ5IGFsZ29yaXRobSB0byBkZXRlcm1pbmUgaW5kZXggaW4gZm91bmQgQ29udGVudEl0ZW0gKi9cclxuICAgICAgICBpbmRleD86IG51bWJlcjtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQHB1YmxpYyAqL1xyXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBMb2NhdGlvblNlbGVjdG9yIHtcclxuICAgICAgICBleHBvcnQgY29uc3QgZW51bSBUeXBlSWQge1xyXG4gICAgICAgICAgICAvKiogU3RhY2sgd2l0aCBmb2N1c2VkIEl0ZW0uIEluZGV4IHNwZWNpZmllcyBvZmZzZXQgZnJvbSBpbmRleCBvZiBmb2N1c2VkIGl0ZW0gKGVnIDEgaXMgdGhlIHBvc2l0aW9uIGFmdGVyIGZvY3VzZWQgaXRlbSkgKi9cclxuICAgICAgICAgICAgRm9jdXNlZEl0ZW0sXHJcbiAgICAgICAgICAgIC8qKiBTdGFjayB3aXRoIGZvY3VzZWQgSXRlbS4gSW5kZXggc3BlY2ZpZXMgQ29udGVudEl0ZW1zIGluZGV4ICovXHJcbiAgICAgICAgICAgIEZvY3VzZWRTdGFjayxcclxuICAgICAgICAgICAgLyoqIEZpcnN0IHN0YWNrIGZvdW5kIGluIGxheW91dCAqL1xyXG4gICAgICAgICAgICBGaXJzdFN0YWNrLFxyXG4gICAgICAgICAgICAvKiogRmlyc3QgUm93IG9yIENvbHVtbiBmb3VuZCBpbiBsYXlvdXQgKHJvd3MgYXJlIHNlYXJjaGVkIGZpcnN0KSAqL1xyXG4gICAgICAgICAgICBGaXJzdFJvd09yQ29sdW1uLFxyXG4gICAgICAgICAgICAvKiogRmlyc3QgUm93IGluIGxheW91dCAqL1xyXG4gICAgICAgICAgICBGaXJzdFJvdyxcclxuICAgICAgICAgICAgLyoqIEZpcnN0IENvbHVtbiBpbiBsYXlvdXQgKi9cclxuICAgICAgICAgICAgRmlyc3RDb2x1bW4sXHJcbiAgICAgICAgICAgIC8qKiBGaW5kcyBhIGxvY2F0aW9uIGlmIGxheW91dCBpcyBlbXB0eS4gVGhlIGZvdW5kIGxvY2F0aW9uIHdpbGwgYmUgdGhlIHJvb3QgQ29udGVudEl0ZW0uICovXHJcbiAgICAgICAgICAgIEVtcHR5LFxyXG4gICAgICAgICAgICAvKiogRmluZHMgcm9vdCBpZiBsYXlvdXQgaXMgZW1wdHksIG90aGVyd2lzZSBhIGNoaWxkIHVuZGVyIHJvb3QgKi9cclxuICAgICAgICAgICAgUm9vdCxcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWZhdWx0IExvY2F0aW9uU2VsZWN0b3JzIGFycmF5IHVzZWQgaWYgbm9uZSBpcyBzcGVjaWZpZWQuICBXaWxsIGFsd2F5cyBmaW5kIGEgbG9jYXRpb24uXHJcbiAgICAgKiBAcHVibGljXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBjb25zdCBkZWZhdWx0TG9jYXRpb25TZWxlY3RvcnM6IHJlYWRvbmx5IExvY2F0aW9uU2VsZWN0b3JbXSA9IFtcclxuICAgICAgICB7IHR5cGVJZDogTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuRm9jdXNlZFN0YWNrLCBpbmRleDogdW5kZWZpbmVkIH0sXHJcbiAgICAgICAgeyB0eXBlSWQ6IExvY2F0aW9uU2VsZWN0b3IuVHlwZUlkLkZpcnN0U3RhY2ssIGluZGV4OiB1bmRlZmluZWQgfSxcclxuICAgICAgICB7IHR5cGVJZDogTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuRmlyc3RSb3dPckNvbHVtbiwgaW5kZXg6IHVuZGVmaW5lZCB9LFxyXG4gICAgICAgIHsgdHlwZUlkOiBMb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5Sb290LCBpbmRleDogdW5kZWZpbmVkIH0sXHJcbiAgICBdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTG9jYXRpb25TZWxlY3RvcnMgdG8gdHJ5IHRvIGdldCBsb2NhdGlvbiBuZXh0IHRvIGV4aXN0aW5nIGZvY3VzZWQgaXRlbVxyXG4gICAgICogQHB1YmxpY1xyXG4gICAgICovXHJcbiAgICBleHBvcnQgY29uc3QgYWZ0ZXJGb2N1c2VkSXRlbUlmUG9zc2libGVMb2NhdGlvblNlbGVjdG9yczogcmVhZG9ubHkgTG9jYXRpb25TZWxlY3RvcltdID0gW1xyXG4gICAgICAgIHsgdHlwZUlkOiBMb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5Gb2N1c2VkSXRlbSwgaW5kZXg6IDEgfSxcclxuICAgICAgICB7IHR5cGVJZDogTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuRmlyc3RTdGFjaywgaW5kZXg6IHVuZGVmaW5lZCB9LFxyXG4gICAgICAgIHsgdHlwZUlkOiBMb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5GaXJzdFJvd09yQ29sdW1uLCBpbmRleDogdW5kZWZpbmVkIH0sXHJcbiAgICAgICAgeyB0eXBlSWQ6IExvY2F0aW9uU2VsZWN0b3IuVHlwZUlkLlJvb3QsIGluZGV4OiB1bmRlZmluZWQgfSxcclxuICAgIF07XHJcbn1cclxuIiwiLyoqXHJcbiAqIE1pbmlmaWVzIGFuZCB1bm1pbmlmaWVzIGNvbmZpZ3MgYnkgcmVwbGFjaW5nIGZyZXF1ZW50IGtleXNcclxuICogYW5kIHZhbHVlcyB3aXRoIG9uZSBsZXR0ZXIgc3Vic3RpdHV0ZXMuIENvbmZpZyBvcHRpb25zIG11c3RcclxuICogcmV0YWluIGFycmF5IHBvc2l0aW9uL2luZGV4LCBhZGQgbmV3IG9wdGlvbnMgYXQgdGhlIGVuZC5cclxuICogQGludGVybmFsXHJcbiovXHJcblxyXG5leHBvcnQgbmFtZXNwYWNlIENvbmZpZ01pbmlmaWVyIHtcclxuXHJcbiAgICBleHBvcnQgdHlwZSBZWSA9ICdpZCcgfCAndGl0bGUnO1xyXG4gICAgZXhwb3J0IGNvbnN0IGVudW0gWFgge1xyXG4gICAgICAgIGlkID0gJ2lkJ1xyXG4gICAgfVxyXG4gICAgY29uc3Qga2V5czogcmVhZG9ubHkgc3RyaW5nW10gPSBbXHJcbiAgICAgICAgJ3NldHRpbmdzJyxcclxuICAgICAgICAnaGFzSGVhZGVycycsXHJcbiAgICAgICAgJ2RyYWdCZXR3ZWVuV2luZG93cycsXHJcbiAgICAgICAgJ2RyYWdUb05ld1dpbmRvdycsXHJcbiAgICAgICAgJ3NlbGVjdGlvbkVuYWJsZWQnLFxyXG4gICAgICAgICdkaW1lbnNpb25zJyxcclxuICAgICAgICAnYm9yZGVyV2lkdGgnLFxyXG4gICAgICAgICdtaW5JdGVtSGVpZ2h0JyxcclxuICAgICAgICAnbWluSXRlbVdpZHRoJyxcclxuICAgICAgICAnaGVhZGVySGVpZ2h0JyxcclxuICAgICAgICAnZHJhZ1Byb3h5V2lkdGgnLFxyXG4gICAgICAgICdkcmFnUHJveHlIZWlnaHQnLFxyXG4gICAgICAgICdsYWJlbHMnLFxyXG4gICAgICAgICdjbG9zZScsXHJcbiAgICAgICAgJ21heGltaXNlJyxcclxuICAgICAgICAnbWluaW1pc2UnLFxyXG4gICAgICAgICdwb3BvdXQnLFxyXG4gICAgICAgICdjb250ZW50JyxcclxuICAgICAgICAnY29tcG9uZW50VHlwZScsXHJcbiAgICAgICAgJ2NvbXBvbmVudFN0YXRlJyxcclxuICAgICAgICAnaWQnLFxyXG4gICAgICAgICd3aWR0aCcsXHJcbiAgICAgICAgJ3R5cGUnLFxyXG4gICAgICAgICdoZWlnaHQnLFxyXG4gICAgICAgICdpc0Nsb3NhYmxlJyxcclxuICAgICAgICAndGl0bGUnLFxyXG4gICAgICAgICdwb3BvdXRXaG9sZVN0YWNrJyxcclxuICAgICAgICAnb3BlblBvcG91dHMnLFxyXG4gICAgICAgICdwYXJlbnRJZCcsXHJcbiAgICAgICAgJ2FjdGl2ZUl0ZW1JbmRleCcsXHJcbiAgICAgICAgJ3Jlb3JkZXJFbmFibGVkJyxcclxuICAgICAgICAnYm9yZGVyR3JhYldpZHRoJyxcclxuXHJcblxyXG5cclxuICAgICAgICAvL01heGltdW0gMzYgZW50cmllcywgZG8gbm90IGNyb3NzIHRoaXMgbGluZSFcclxuICAgIF07XHJcblxyXG4gICAgY29uc3QgdmFsdWVzOiByZWFkb25seSAoYm9vbGVhbiB8IHN0cmluZylbXSA9IFtcclxuICAgICAgICB0cnVlLFxyXG4gICAgICAgIGZhbHNlLFxyXG4gICAgICAgICdyb3cnLFxyXG4gICAgICAgICdjb2x1bW4nLFxyXG4gICAgICAgICdzdGFjaycsXHJcbiAgICAgICAgJ2NvbXBvbmVudCcsXHJcbiAgICAgICAgJ2Nsb3NlJyxcclxuICAgICAgICAnbWF4aW1pc2UnLFxyXG4gICAgICAgICdtaW5pbWlzZScsXHJcbiAgICAgICAgJ29wZW4gaW4gbmV3IHdpbmRvdydcclxuICAgIF07XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSW5pdGlhbGlzZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAoa2V5cy5sZW5ndGggPiAzNikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RvbyBtYW55IGtleXMgaW4gY29uZmlnIG1pbmlmaWVyIG1hcCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlT2JqZWN0KGZyb206IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBtaW5pZnk6IGJvb2xlYW4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XHJcbiAgICAgICAgY29uc3QgdG86IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZnJvbSkge1xyXG4gICAgICAgICAgICBpZiAoZnJvbS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7IC8vIEluIGNhc2Ugc29tZXRoaW5nIGhhcyBleHRlbmRlZCBPYmplY3QgcHJvdG90eXBlc1xyXG4gICAgICAgICAgICAgICAgbGV0IHRyYW5zbGF0ZWRLZXk6IHN0cmluZztcclxuICAgICAgICAgICAgICAgIGlmIChtaW5pZnkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVkS2V5ID0gbWluaWZ5S2V5KGtleSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZWRLZXkgPSB1bm1pbmlmeUtleShrZXkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGZyb21WYWx1ZSA9IGZyb21ba2V5XTtcclxuICAgICAgICAgICAgICAgIHRvW3RyYW5zbGF0ZWRLZXldID0gdHJhbnNsYXRlVmFsdWUoZnJvbVZhbHVlLCBtaW5pZnkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdG87XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlQXJyYXkoZnJvbTogdW5rbm93bltdLCBtaW5pZnk6IGJvb2xlYW4pIHtcclxuICAgICAgICBjb25zdCBsZW5ndGggPSBmcm9tLmxlbmd0aDtcclxuICAgICAgICBjb25zdCB0byA9IG5ldyBBcnJheTx1bmtub3duPihsZW5ndGgpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgLy8gSW4gb3JpZ2luYWwgY29kZSwgYXJyYXkgaW5kaWNlcyB3ZXJlIG51bWJlcnMgYW5kIG5vdCB0cmFuc2xhdGVkXHJcbiAgICAgICAgICAgIGNvbnN0IGZyb21WYWx1ZSA9IGZyb21baV07XHJcbiAgICAgICAgICAgIHRvW2ldID0gdHJhbnNsYXRlVmFsdWUoZnJvbVZhbHVlLCBtaW5pZnkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdG87XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlVmFsdWUoZnJvbTogdW5rbm93biwgbWluaWZ5OiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBmcm9tID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICBpZiAoZnJvbSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmcm9tKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGVBcnJheShmcm9tLCBtaW5pZnkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlT2JqZWN0KGZyb20gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG1pbmlmeSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAobWluaWZ5KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbWluaWZ5VmFsdWUoZnJvbSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5taW5pZnlWYWx1ZShmcm9tKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBtaW5pZnlLZXkodmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElmIGEgdmFsdWUgYWN0dWFsbHkgaXMgYSBzaW5nbGUgY2hhcmFjdGVyLCBwcmVmaXggaXRcclxuICAgICAgICAgKiB3aXRoIF9fXyB0byBhdm9pZCBtaXN0YWtpbmcgaXQgZm9yIGEgbWluaWZpY2F0aW9uIGNvZGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdfX18nICsgdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBpbmRleE9mS2V5KHZhbHVlKTtcclxuICAgIFxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIHZhbHVlIG5vdCBmb3VuZCBpbiB0aGUgZGljdGlvbmFyeSwgcmV0dXJuIGl0IHVubW9kaWZpZWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIFxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogdmFsdWUgZm91bmQgaW4gZGljdGlvbmFyeSwgcmV0dXJuIGl0cyBiYXNlMzYgY291bnRlcnBhcnRcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGluZGV4LnRvU3RyaW5nKDM2KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdW5taW5pZnlLZXkoa2V5OiBzdHJpbmcpIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiB2YWx1ZSBpcyBhIHNpbmdsZSBjaGFyYWN0ZXIuIEFzc3VtZSB0aGF0IGl0J3MgYSB0cmFuc2xhdGlvblxyXG4gICAgICAgICAqIGFuZCByZXR1cm4gdGhlIG9yaWdpbmFsIHZhbHVlIGZyb20gdGhlIGRpY3Rpb25hcnlcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICByZXR1cm4ga2V5c1twYXJzZUludChrZXksIDM2KV07XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogdmFsdWUgb3JpZ2luYWxseSB3YXMgYSBzaW5nbGUgY2hhcmFjdGVyIGFuZCB3YXMgcHJlZml4ZWQgd2l0aCBfX19cclxuICAgICAgICAgKiB0byBhdm9pZCBtaXN0YWtpbmcgaXQgZm9yIGEgdHJhbnNsYXRpb24uIFJlbW92ZSB0aGUgcHJlZml4XHJcbiAgICAgICAgICogYW5kIHJldHVybiB0aGUgb3JpZ2luYWwgY2hhcmFjdGVyXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKGtleS5zdWJzdHIoMCwgMykgPT09ICdfX18nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBrZXlbM107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIHZhbHVlIHdhcyBub3QgbWluaWZpZWRcclxuICAgICAgICAgKi9cclxuICAgICAgICByZXR1cm4ga2V5O1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIG1pbmlmeVZhbHVlKHZhbHVlOiB1bmtub3duKSB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgYSB2YWx1ZSBhY3R1YWxseSBpcyBhIHNpbmdsZSBjaGFyYWN0ZXIsIHByZWZpeCBpdFxyXG4gICAgICAgICAqIHdpdGggX19fIHRvIGF2b2lkIG1pc3Rha2luZyBpdCBmb3IgYSBtaW5pZmljYXRpb24gY29kZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gJ19fXycgKyB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICBjb25zdCBpbmRleCA9IGluZGV4T2ZWYWx1ZSh2YWx1ZSk7XHJcbiAgICBcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiB2YWx1ZSBub3QgZm91bmQgaW4gdGhlIGRpY3Rpb25hcnksIHJldHVybiBpdCB1bm1vZGlmaWVkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICBcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIHZhbHVlIGZvdW5kIGluIGRpY3Rpb25hcnksIHJldHVybiBpdHMgYmFzZTM2IGNvdW50ZXJwYXJ0XHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpbmRleC50b1N0cmluZygzNik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHVubWluaWZ5VmFsdWUodmFsdWU6IHVua25vd24pIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiB2YWx1ZSBpcyBhIHNpbmdsZSBjaGFyYWN0ZXIuIEFzc3VtZSB0aGF0IGl0J3MgYSB0cmFuc2xhdGlvblxyXG4gICAgICAgICAqIGFuZCByZXR1cm4gdGhlIG9yaWdpbmFsIHZhbHVlIGZyb20gdGhlIGRpY3Rpb25hcnlcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlc1twYXJzZUludCh2YWx1ZSwgMzYpXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIHZhbHVlIG9yaWdpbmFsbHkgd2FzIGEgc2luZ2xlIGNoYXJhY3RlciBhbmQgd2FzIHByZWZpeGVkIHdpdGggX19fXHJcbiAgICAgICAgICogdG8gYXZvaWQgbWlzdGFraW5nIGl0IGZvciBhIHRyYW5zbGF0aW9uLiBSZW1vdmUgdGhlIHByZWZpeFxyXG4gICAgICAgICAqIGFuZCByZXR1cm4gdGhlIG9yaWdpbmFsIGNoYXJhY3RlclxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnN1YnN0cigwLCAzKSA9PT0gJ19fXycpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlWzNdO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiB2YWx1ZSB3YXMgbm90IG1pbmlmaWVkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGluZGV4T2ZLZXkoa2V5OiBzdHJpbmcpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGtleXNbaV0gPT09IGtleSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIGluZGV4T2ZWYWx1ZSh2YWx1ZTogdW5rbm93bikge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZXNbaV0gPT09IHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gLTE7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgRG9tQ29uc3RhbnRzIH0gZnJvbSAnLi9kb20tY29uc3RhbnRzJztcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi9ldmVudC1lbWl0dGVyJztcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGNsYXNzIERyYWdMaXN0ZW5lciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBwcml2YXRlIF90aW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcclxuICAgIHByaXZhdGUgX2FsbG93YWJsZVRhcmdldHM6IEhUTUxFbGVtZW50W107XHJcbiAgICBwcml2YXRlIF9vRG9jdW1lbnQ6IERvY3VtZW50O1xyXG4gICAgcHJpdmF0ZSBfZUJvZHk6IEhUTUxFbGVtZW50O1xyXG4gICAgcHJpdmF0ZSBfbkRlbGF5OiBudW1iZXI7XHJcbiAgICBwcml2YXRlIF9uRGlzdGFuY2U6IG51bWJlcjtcclxuICAgIHByaXZhdGUgX29yaWdpbmFsRXZlbnQ6IEV2ZW50RW1pdHRlci5EcmFnRXZlbnQ7XHJcbiAgICBwcml2YXRlIF9kcmFnZ2luZzogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgX3BvaW50ZXJUcmFja2luZyA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgX3BvaW50ZXJEb3duRXZlbnRMaXN0ZW5lciA9IChldjogUG9pbnRlckV2ZW50KSA9PiB0aGlzLm9uUG9pbnRlckRvd24oZXYpO1xyXG4gICAgcHJpdmF0ZSBfcG9pbnRlck1vdmVFdmVudExpc3RlbmVyID0gKGV2OiBQb2ludGVyRXZlbnQpID0+IHRoaXMub25Qb2ludGVyTW92ZShldik7XHJcbiAgICBwcml2YXRlIF9wb2ludGVyVXBFdmVudExpc3RlbmVyID0gKGV2OiBQb2ludGVyRXZlbnQpID0+IHRoaXMub25Qb2ludGVyVXAoZXYpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2VFbGVtZW50OiBIVE1MRWxlbWVudCwgZXh0cmFBbGxvd2FibGVDaGlsZFRhcmdldHM6IEhUTUxFbGVtZW50W10pIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICB0aGlzLl90aW1lb3V0ID0gdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICB0aGlzLl9hbGxvd2FibGVUYXJnZXRzID0gW19lRWxlbWVudCwgLi4uZXh0cmFBbGxvd2FibGVDaGlsZFRhcmdldHNdO1xyXG4gICAgICAgIHRoaXMuX29Eb2N1bWVudCA9IGRvY3VtZW50O1xyXG4gICAgICAgIHRoaXMuX2VCb2R5ID0gZG9jdW1lbnQuYm9keTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGRlbGF5IGFmdGVyIHdoaWNoIHRvIHN0YXJ0IHRoZSBkcmFnIGluIG1pbGxpc2Vjb25kc1xyXG4gICAgICAgICAqIERvIE5PVCBtYWtlIHRvbyBzaG9ydCAocHJldmlvdXMgdmFsdWUgb2YgMjAwIHdhcyBub3QgbG9uZyBlbm91Z2ggZm9yIG15IHRvdWNocGFkKVxyXG4gICAgICAgICAqIFNob3VsZCBnZW5lcmFsbHkgcmVseSBvbiB0aGUgbW91c2UgbW92ZSB0byBzdGFydCBkcmFnLiAgTm90IHRoaXMgZGVsYXkuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fbkRlbGF5ID0gMTgwMDtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIGRpc3RhbmNlIHRoZSBtb3VzZSBuZWVkcyB0byBiZSBtb3ZlZCB0byBxdWFsaWZ5IGFzIGEgZHJhZ1xyXG4gICAgICAgICAqIFByZXZpb3VzIGNvbW1lbnQ6IHdvcmtzIGJldHRlciB3aXRoIGRlbGF5IG9ubHlcclxuICAgICAgICAgKiA/Pz9cclxuICAgICAgICAgKiBQcm9iYWJseSBzb21laG93IG5lZWRzIHR1bmluZyBmb3IgZGlmZmVyZW50IGRldmljZXNcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9uRGlzdGFuY2UgPSAxMDtcclxuXHJcbiAgICAgICAgdGhpcy5fb3JpZ2luYWxFdmVudCA9IHsgcGFnZVg6IDAsIHBhZ2VZOiAwLCBzY3JlZW5YOiAwLCBzY3JlZW5ZOiAwfTtcclxuXHJcbiAgICAgICAgdGhpcy5fZHJhZ2dpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdGhpcy5fZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLl9wb2ludGVyRG93bkV2ZW50TGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY2hlY2tSZW1vdmVQb2ludGVyVHJhY2tpbmdFdmVudExpc3RlbmVycygpO1xyXG5cclxuICAgICAgICB0aGlzLl9lRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIHRoaXMuX3BvaW50ZXJEb3duRXZlbnRMaXN0ZW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgY2FuY2VsRHJhZygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnByb2Nlc3NEcmFnU3RvcCh1bmRlZmluZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Qb2ludGVyRG93bihvRXZlbnQ6IFBvaW50ZXJFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9hbGxvd2FibGVUYXJnZXRzLmluY2x1ZGVzKG9FdmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpICYmIG9FdmVudC5pc1ByaW1hcnkpIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzUG9pbnRlckRvd24ob0V2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwcm9jZXNzUG9pbnRlckRvd24oZXZlbnQ6IFBvaW50ZXJFdmVudCkge1xyXG4gICAgICAgIHRoaXMuX29yaWdpbmFsRXZlbnQgPSBldmVudDtcclxuXHJcbiAgICAgICAgdGhpcy5fb0RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgdGhpcy5fcG9pbnRlck1vdmVFdmVudExpc3RlbmVyKTtcclxuICAgICAgICB0aGlzLl9vRG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgdGhpcy5fcG9pbnRlclVwRXZlbnRMaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgIHRoaXMuX2VCb2R5LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Qb2ludGVyVHJhY2tpbmcpO1xyXG4gICAgICAgIHRoaXMuX3BvaW50ZXJUcmFja2luZyA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuX3RpbWVvdXQgPSBzZXRUaW1lb3V0KFxyXG4gICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnREcmFnKClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICwgdGhpcy5fbkRlbGF5KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uUG9pbnRlck1vdmUob0V2ZW50OiBQb2ludGVyRXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5fcG9pbnRlclRyYWNraW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0RyYWdNb3ZlKG9FdmVudCk7XHJcbiAgICAgICAgICAgIG9FdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHByb2Nlc3NEcmFnTW92ZShldmVudDogUG9pbnRlckV2ZW50KSB7XHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0WCA9IGV2ZW50LnBhZ2VYIC0gdGhpcy5fb3JpZ2luYWxFdmVudC5wYWdlWDtcclxuICAgICAgICBjb25zdCBvZmZzZXRZID0gZXZlbnQucGFnZVkgLSB0aGlzLl9vcmlnaW5hbEV2ZW50LnBhZ2VZO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fZHJhZ2dpbmcgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIE1hdGguYWJzKG9mZnNldFgpID4gdGhpcy5fbkRpc3RhbmNlIHx8XHJcbiAgICAgICAgICAgICAgICBNYXRoLmFicyhvZmZzZXRZKSA+IHRoaXMuX25EaXN0YW5jZVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnREcmFnKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9kcmFnZ2luZykge1xyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2RyYWcnLCBvZmZzZXRYLCBvZmZzZXRZLCBldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25Qb2ludGVyVXAob0V2ZW50OiBQb2ludGVyRXZlbnQpIHtcclxuICAgICAgICB0aGlzLnByb2Nlc3NEcmFnU3RvcChvRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcHJvY2Vzc0RyYWdTdG9wKGRyYWdFdmVudD86IFBvaW50ZXJFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLl90aW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpO1xyXG4gICAgICAgICAgICB0aGlzLl90aW1lb3V0ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jaGVja1JlbW92ZVBvaW50ZXJUcmFja2luZ0V2ZW50TGlzdGVuZXJzKCk7XHJcbiAgICBcclxuICAgICAgICBpZiAodGhpcy5fZHJhZ2dpbmcgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgdGhpcy5fZUJvZHkuY2xhc3NMaXN0LnJlbW92ZShEb21Db25zdGFudHMuQ2xhc3NOYW1lLkRyYWdnaW5nKTtcclxuICAgICAgICAgICAgdGhpcy5fZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShEb21Db25zdGFudHMuQ2xhc3NOYW1lLkRyYWdnaW5nKTtcclxuICAgICAgICAgICAgdGhpcy5fZHJhZ2dpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdkcmFnU3RvcCcsIGRyYWdFdmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2hlY2tSZW1vdmVQb2ludGVyVHJhY2tpbmdFdmVudExpc3RlbmVycygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fcG9pbnRlclRyYWNraW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX29Eb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIHRoaXMuX3BvaW50ZXJNb3ZlRXZlbnRMaXN0ZW5lcik7XHJcbiAgICAgICAgICAgIHRoaXMuX29Eb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwb2ludGVydXAnLCB0aGlzLl9wb2ludGVyVXBFdmVudExpc3RlbmVyKTtcclxuICAgICAgICAgICAgdGhpcy5fZUJvZHkuY2xhc3NMaXN0LnJlbW92ZShEb21Db25zdGFudHMuQ2xhc3NOYW1lLlBvaW50ZXJUcmFja2luZyk7XHJcbiAgICAgICAgICAgIHRoaXMuX3BvaW50ZXJUcmFja2luZyA9IGZhbHNlO1xyXG4gICAgICAgIH0gICAgXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGFydERyYWcoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3RpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3RpbWVvdXQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2RyYWdnaW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9lQm9keS5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuRHJhZ2dpbmcpO1xyXG4gICAgICAgIHRoaXMuX2VFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5EcmFnZ2luZyk7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdkcmFnU3RhcnQnLCB0aGlzLl9vcmlnaW5hbEV2ZW50LnBhZ2VYLCB0aGlzLl9vcmlnaW5hbEV2ZW50LnBhZ2VZKTtcclxuICAgICAgICB0aGlzLmVtaXQoJ2RyYWcnLCAwLCAwLCB0aGlzLl9vcmlnaW5hbEV2ZW50KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7IEJyb3dzZXJQb3BvdXQgfSBmcm9tICcuLi9jb250cm9scy9icm93c2VyLXBvcG91dCc7XHJcbmltcG9ydCB7IFRhYiB9IGZyb20gJy4uL2NvbnRyb2xzL3RhYic7XHJcbmltcG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuLi9pdGVtcy9jb21wb25lbnQtaXRlbSc7XHJcblxyXG4vKipcclxuICogQSBnZW5lcmljIGFuZCB2ZXJ5IGZhc3QgRXZlbnRFbWl0dGVyIGltcGxlbWVudGF0aW9uLiBPbiB0b3Agb2YgZW1pdHRpbmcgdGhlIGFjdHVhbCBldmVudCBpdCBlbWl0cyBhblxyXG4gKiB7QGxpbmsgKEV2ZW50RW1pdHRlcjpuYW1lc3BhY2UpLkFMTF9FVkVOVH0gZXZlbnQgZm9yIGV2ZXJ5IGV2ZW50IHRyaWdnZXJlZC4gVGhpcyBhbGxvd3MgdG8gaG9vayBpbnRvIGl0IGFuZCBwcm94eSBldmVudHMgZm9yd2FyZHNcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEV2ZW50RW1pdHRlciB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9hbGxFdmVudFN1YnNjcmlwdGlvbnM6IEV2ZW50RW1pdHRlci5Vbmtub3duQ2FsbGJhY2tbXSA9IFtdO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9uc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBFdmVudEVtaXR0ZXIuVW5rbm93bkNhbGxiYWNrW10+KCk7XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgdHJ5QnViYmxlRXZlbnQobmFtZTogc3RyaW5nLCBhcmdzOiB1bmtub3duW10pOiB2b2lkIHtcclxuICAgICAgICAvLyBvdmVycmlkZGVuIGJ5IENvbnRlbnRJdGVtXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbWl0IGFuIGV2ZW50IGFuZCBub3RpZnkgbGlzdGVuZXJzXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudFxyXG4gICAgICogQHBhcmFtIGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBsaXN0ZW5lclxyXG4gICAgICovXHJcbiAgICBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBFdmVudEVtaXR0ZXIuRXZlbnRQYXJhbXNNYXA+KGV2ZW50TmFtZTogSywgLi4uYXJnczogRXZlbnRFbWl0dGVyLkV2ZW50UGFyYW1zTWFwW0tdKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IHN1YmNyaXB0aW9ucyA9IHRoaXMuX3N1YnNjcmlwdGlvbnNNYXAuZ2V0KGV2ZW50TmFtZSk7XHJcblxyXG4gICAgICAgIGlmIChzdWJjcmlwdGlvbnMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBzdWJjcmlwdGlvbnMgPSBzdWJjcmlwdGlvbnMuc2xpY2UoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJjcmlwdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHN1YmNyaXB0aW9uc1tpXTtcclxuICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbiguLi5hcmdzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5lbWl0QWxsRXZlbnQoZXZlbnROYW1lLCBhcmdzKTtcclxuICAgICAgICB0aGlzLnRyeUJ1YmJsZUV2ZW50KGV2ZW50TmFtZSwgYXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZW1pdFVua25vd24oZXZlbnROYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IEV2ZW50RW1pdHRlci5Vbmtub3duUGFyYW1zKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IHN1YnMgPSB0aGlzLl9zdWJzY3JpcHRpb25zTWFwLmdldChldmVudE5hbWUpO1xyXG5cclxuICAgICAgICBpZiAoc3VicyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHN1YnMgPSBzdWJzLnNsaWNlKCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3Vicy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgc3Vic1tpXSguLi5hcmdzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5lbWl0QWxsRXZlbnQoZXZlbnROYW1lLCBhcmdzKTtcclxuICAgICAgICB0aGlzLnRyeUJ1YmJsZUV2ZW50KGV2ZW50TmFtZSwgYXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyogQGludGVybmFsICoqL1xyXG4gICAgZW1pdEJhc2VCdWJibGluZ0V2ZW50PEsgZXh0ZW5kcyBrZXlvZiBFdmVudEVtaXR0ZXIuRXZlbnRQYXJhbXNNYXA+KGV2ZW50TmFtZTogSyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlci5CdWJibGluZ0V2ZW50KGV2ZW50TmFtZSwgdGhpcyk7XHJcbiAgICAgICAgdGhpcy5lbWl0VW5rbm93bihldmVudE5hbWUsIGV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBlbWl0VW5rbm93bkJ1YmJsaW5nRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudEVtaXR0ZXIuQnViYmxpbmdFdmVudChldmVudE5hbWUsIHRoaXMpO1xyXG4gICAgICAgIHRoaXMuZW1pdFVua25vd24oZXZlbnROYW1lLCBldmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZm9yIGFuIGV2ZW50LlxyXG4gICAgICogQHBhcmFtIGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudFxyXG4gICAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBjYWxsYmFjayBtZXRob2QgKG9wdGlvbmFsKVxyXG4gICAgICovXHJcbiAgICByZW1vdmVFdmVudExpc3RlbmVyPEsgZXh0ZW5kcyBrZXlvZiBFdmVudEVtaXR0ZXIuRXZlbnRQYXJhbXNNYXA+KGV2ZW50TmFtZTogSywgY2FsbGJhY2s6IEV2ZW50RW1pdHRlci5DYWxsYmFjazxLPik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHVua25vd25DYWxsYmFjayA9IGNhbGxiYWNrIGFzIEV2ZW50RW1pdHRlci5Vbmtub3duQ2FsbGJhY2s7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVVbmtub3duRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIHVua25vd25DYWxsYmFjayk7XHJcbiAgICB9XHJcblxyXG4gICAgb2ZmPEsgZXh0ZW5kcyBrZXlvZiBFdmVudEVtaXR0ZXIuRXZlbnRQYXJhbXNNYXA+KGV2ZW50TmFtZTogSywgY2FsbGJhY2s6IEV2ZW50RW1pdHRlci5DYWxsYmFjazxLPik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFsaWFzIGZvciBvZmZcclxuICAgICAqL1xyXG4gICAgdW5iaW5kID0gdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWxpYXMgZm9yIGVtaXRcclxuICAgICAqL1xyXG4gICAgdHJpZ2dlciA9IHRoaXMuZW1pdDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIExpc3RlbiBmb3IgZXZlbnRzXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0byBsaXN0ZW4gdG9cclxuICAgICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IG9jY3Vyc1xyXG4gICAgICovXHJcbiAgICBhZGRFdmVudExpc3RlbmVyPEsgZXh0ZW5kcyBrZXlvZiBFdmVudEVtaXR0ZXIuRXZlbnRQYXJhbXNNYXA+KGV2ZW50TmFtZTogSywgY2FsbGJhY2s6IEV2ZW50RW1pdHRlci5DYWxsYmFjazxLPik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHVua25vd25DYWxsYmFjayA9IGNhbGxiYWNrIGFzIEV2ZW50RW1pdHRlci5Vbmtub3duQ2FsbGJhY2s7XHJcbiAgICAgICAgdGhpcy5hZGRVbmtub3duRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIHVua25vd25DYWxsYmFjayk7XHJcbiAgICB9XHJcblxyXG4gICAgb248SyBleHRlbmRzIGtleW9mIEV2ZW50RW1pdHRlci5FdmVudFBhcmFtc01hcD4oZXZlbnROYW1lOiBLLCBjYWxsYmFjazogRXZlbnRFbWl0dGVyLkNhbGxiYWNrPEs+KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgY2FsbGJhY2spO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgYWRkVW5rbm93bkV2ZW50TGlzdGVuZXIoZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiBFdmVudEVtaXR0ZXIuVW5rbm93bkNhbGxiYWNrKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGV2ZW50TmFtZSA9PT0gRXZlbnRFbWl0dGVyLkFMTF9FVkVOVCkge1xyXG4gICAgICAgICAgICB0aGlzLl9hbGxFdmVudFN1YnNjcmlwdGlvbnMucHVzaChjYWxsYmFjayk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHN1YnNjcmlwdGlvbnMgPSB0aGlzLl9zdWJzY3JpcHRpb25zTWFwLmdldChldmVudE5hbWUpO1xyXG4gICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25zLnB1c2goY2FsbGJhY2spO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9ucyA9IFtjYWxsYmFja107XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb25zTWFwLnNldChldmVudE5hbWUsIHN1YnNjcmlwdGlvbnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVtb3ZlVW5rbm93bkV2ZW50TGlzdGVuZXIoZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiBFdmVudEVtaXR0ZXIuVW5rbm93bkNhbGxiYWNrKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGV2ZW50TmFtZSA9PT0gRXZlbnRFbWl0dGVyLkFMTF9FVkVOVCkge1xyXG4gICAgICAgICAgICB0aGlzLnJlbW92ZVN1YnNjcmlwdGlvbihldmVudE5hbWUsIHRoaXMuX2FsbEV2ZW50U3Vic2NyaXB0aW9ucywgY2FsbGJhY2spO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbnMgPSB0aGlzLl9zdWJzY3JpcHRpb25zTWFwLmdldChldmVudE5hbWUpO1xyXG4gICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHN1YnNjcmlidGlvbnMgdG8gdW5zdWJzY3JpYmUgZm9yIGV2ZW50ICcgKyBldmVudE5hbWUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVTdWJzY3JpcHRpb24oZXZlbnROYW1lLCBzdWJzY3JpcHRpb25zLCBjYWxsYmFjayk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZW1vdmVTdWJzY3JpcHRpb24oZXZlbnROYW1lOiBzdHJpbmcsIHN1YnNjcmlwdGlvbnM6IEV2ZW50RW1pdHRlci5Vbmtub3duQ2FsbGJhY2tbXSwgY2FsbGJhY2s6IEV2ZW50RW1pdHRlci5Vbmtub3duQ2FsbGJhY2spIHtcclxuICAgICAgICBjb25zdCBpZHggPSBzdWJzY3JpcHRpb25zLmluZGV4T2YoY2FsbGJhY2spO1xyXG4gICAgICAgIGlmIChpZHggPCAwKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm90aGluZyB0byB1bmJpbmQgZm9yICcgKyBldmVudE5hbWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbnMuc3BsaWNlKGlkeCwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgZW1pdEFsbEV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBhcmdzOiB1bmtub3duW10pIHtcclxuICAgICAgICBjb25zdCBhbGxFdmVudFN1YnNjcmlwdGlvbnNDb3VudCA9IHRoaXMuX2FsbEV2ZW50U3Vic2NyaXB0aW9ucy5sZW5ndGg7XHJcbiAgICAgICAgaWYgKGFsbEV2ZW50U3Vic2NyaXB0aW9uc0NvdW50ID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCB1bmtub3duQXJncyA9IGFyZ3Muc2xpY2UoKSBhcyBFdmVudEVtaXR0ZXIuVW5rbm93blBhcmFtcztcclxuICAgICAgICAgICAgdW5rbm93bkFyZ3MudW5zaGlmdChldmVudE5hbWUpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgYWxsRXZlbnRTdWJjcmlwdGlvbnMgPSB0aGlzLl9hbGxFdmVudFN1YnNjcmlwdGlvbnMuc2xpY2UoKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsRXZlbnRTdWJzY3JpcHRpb25zQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgYWxsRXZlbnRTdWJjcmlwdGlvbnNbaV0oLi4udW5rbm93bkFyZ3MpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIEV2ZW50RW1pdHRlciB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0aGF0J3MgdHJpZ2dlcmVkIGZvciBldmVyeSBldmVudFxyXG4gICAgICovXHJcbiAgICBleHBvcnQgY29uc3QgQUxMX0VWRU5UID0gJ19fYWxsJztcclxuXHJcbiAgICBleHBvcnQgY29uc3QgaGVhZGVyQ2xpY2tFdmVudE5hbWUgPSAnc3RhY2tIZWFkZXJDbGljayc7XHJcbiAgICBleHBvcnQgY29uc3QgaGVhZGVyVG91Y2hTdGFydEV2ZW50TmFtZSA9ICdzdGFja0hlYWRlclRvdWNoU3RhcnQnO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIFVua25vd25DYWxsYmFjayA9ICh0aGlzOiB2b2lkLCAuLi5hcmdzOiBVbmtub3duUGFyYW1zKSA9PiB2b2lkO1xyXG4gICAgZXhwb3J0IHR5cGUgQ2FsbGJhY2s8SyBleHRlbmRzIGtleW9mIEV2ZW50RW1pdHRlci5FdmVudFBhcmFtc01hcD4gPSAodGhpczogdm9pZCwgLi4uYXJnczogRXZlbnRQYXJhbXNNYXBbS10pID0+IHZvaWQ7XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBFdmVudFBhcmFtc01hcCB7XHJcbiAgICAgICAgXCJfX2FsbFwiOiBVbmtub3duUGFyYW1zO1xyXG4gICAgICAgIFwiYWN0aXZlQ29udGVudEl0ZW1DaGFuZ2VkXCI6IENvbXBvbmVudEl0ZW1QYXJhbTtcclxuICAgICAgICBcImNsb3NlXCI6IE5vUGFyYW1zO1xyXG4gICAgICAgIFwiY2xvc2VkXCI6IE5vUGFyYW1zO1xyXG4gICAgICAgIFwiZGVzdHJveVwiOiBOb1BhcmFtcztcclxuICAgICAgICBcImRyYWdcIjogRHJhZ1BhcmFtcztcclxuICAgICAgICBcImRyYWdTdGFydFwiOiBEcmFnU3RhcnRQYXJhbXM7XHJcbiAgICAgICAgXCJkcmFnU3RvcFwiOiBEcmFnU3RvcFBhcmFtcztcclxuICAgICAgICBcImhpZGVcIjogTm9QYXJhbXM7XHJcbiAgICAgICAgXCJpbml0aWFsaXNlZFwiOiBOb1BhcmFtcztcclxuICAgICAgICBcIml0ZW1Ecm9wcGVkXCI6IENvbXBvbmVudEl0ZW1QYXJhbTtcclxuICAgICAgICBcIm1heGltaXNlZFwiOiBOb1BhcmFtcztcclxuICAgICAgICBcIm1pbmltaXNlZFwiOiBOb1BhcmFtcztcclxuICAgICAgICBcIm9wZW5cIjogTm9QYXJhbXM7XHJcbiAgICAgICAgXCJwb3BJblwiOiBOb1BhcmFtcztcclxuICAgICAgICBcInJlc2l6ZVwiOiBOb1BhcmFtcztcclxuICAgICAgICBcInNob3dcIjogTm9QYXJhbXM7XHJcbiAgICAgICAgLyoqIEBkZXByZWNhdGVkIC0gdXNlIHNob3cgaW5zdGVhZCAqL1xyXG4gICAgICAgIFwic2hvd25cIjogTm9QYXJhbXM7XHJcbiAgICAgICAgXCJzdGF0ZUNoYW5nZWRcIjogTm9QYXJhbXM7XHJcbiAgICAgICAgXCJ0YWJcIjogVGFiUGFyYW07XHJcbiAgICAgICAgXCJ0YWJDcmVhdGVkXCI6IFRhYlBhcmFtO1xyXG4gICAgICAgIFwidGl0bGVDaGFuZ2VkXCI6IFN0cmluZ1BhcmFtO1xyXG4gICAgICAgIFwid2luZG93Q2xvc2VkXCI6IFBvcG91dFBhcmFtO1xyXG4gICAgICAgIFwid2luZG93T3BlbmVkXCI6IFBvcG91dFBhcmFtO1xyXG4gICAgICAgIFwiYmVmb3JlQ29tcG9uZW50UmVsZWFzZVwiOiBCZWZvcmVDb21wb25lbnRSZWxlYXNlUGFyYW1zO1xyXG4gICAgICAgIFwiYmVmb3JlSXRlbURlc3Ryb3llZFwiOiBCdWJibGluZ0V2ZW50UGFyYW07XHJcbiAgICAgICAgXCJpdGVtQ3JlYXRlZFwiOiBCdWJibGluZ0V2ZW50UGFyYW07XHJcbiAgICAgICAgXCJpdGVtRGVzdHJveWVkXCI6IEJ1YmJsaW5nRXZlbnRQYXJhbTtcclxuICAgICAgICBcImZvY3VzXCI6IEJ1YmJsaW5nRXZlbnRQYXJhbTtcclxuICAgICAgICBcImJsdXJcIjogQnViYmxpbmdFdmVudFBhcmFtO1xyXG4gICAgICAgIFwic3RhY2tIZWFkZXJDbGlja1wiOiBDbGlja0J1YmJsaW5nRXZlbnRQYXJhbTtcclxuICAgICAgICBcInN0YWNrSGVhZGVyVG91Y2hTdGFydFwiOiBUb3VjaFN0YXJ0QnViYmxpbmdFdmVudFBhcmFtO1xyXG4gICAgICAgIFwidXNlckJyb2FkY2FzdFwiOiBVbmtub3duUGFyYW1zO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCB0eXBlIFVua25vd25QYXJhbXMgPSB1bmtub3duW107XHJcbiAgICBleHBvcnQgdHlwZSBOb1BhcmFtcyA9IFtdO1xyXG4gICAgZXhwb3J0IHR5cGUgVW5rbm93blBhcmFtID0gW3Vua25vd25dO1xyXG4gICAgZXhwb3J0IHR5cGUgUG9wb3V0UGFyYW0gPSBbQnJvd3NlclBvcG91dF07XHJcbiAgICBleHBvcnQgdHlwZSBDb21wb25lbnRJdGVtUGFyYW0gPSBbQ29tcG9uZW50SXRlbV07XHJcbiAgICBleHBvcnQgdHlwZSBUYWJQYXJhbSA9IFtUYWJdO1xyXG4gICAgZXhwb3J0IHR5cGUgQnViYmxpbmdFdmVudFBhcmFtID0gW0V2ZW50RW1pdHRlci5CdWJibGluZ0V2ZW50XVxyXG4gICAgZXhwb3J0IHR5cGUgU3RyaW5nUGFyYW0gPSBbc3RyaW5nXTtcclxuICAgIGV4cG9ydCB0eXBlIERyYWdTdGFydFBhcmFtcyA9IFtvcmlnaW5hbFg6IG51bWJlciwgb3JpZ2luYWxZOiBudW1iZXJdO1xyXG4gICAgZXhwb3J0IHR5cGUgRHJhZ1N0b3BQYXJhbXMgPSBbZXZlbnQ6IFBvaW50ZXJFdmVudCB8IHVuZGVmaW5lZF07XHJcbiAgICBleHBvcnQgdHlwZSBEcmFnUGFyYW1zID0gW29mZnNldFg6IG51bWJlciwgb2Zmc2V0WTogbnVtYmVyLCBldmVudDogRXZlbnRFbWl0dGVyLkRyYWdFdmVudF07XHJcbiAgICBleHBvcnQgdHlwZSBCZWZvcmVDb21wb25lbnRSZWxlYXNlUGFyYW1zID0gW2NvbXBvbmVudDogdW5rbm93bl07XHJcbiAgICBleHBvcnQgdHlwZSBDbGlja0J1YmJsaW5nRXZlbnRQYXJhbSA9IFtDbGlja0J1YmJsaW5nRXZlbnRdO1xyXG4gICAgZXhwb3J0IHR5cGUgVG91Y2hTdGFydEJ1YmJsaW5nRXZlbnRQYXJhbSA9IFtUb3VjaFN0YXJ0QnViYmxpbmdFdmVudF07XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBEcmFnRXZlbnQge1xyXG4gICAgICAgIHJlYWRvbmx5IHBhZ2VYOiBudW1iZXI7XHJcbiAgICAgICAgcmVhZG9ubHkgcGFnZVk6IG51bWJlcjtcclxuICAgICAgICByZWFkb25seSBzY3JlZW5YOiBudW1iZXI7XHJcbiAgICAgICAgcmVhZG9ubHkgc2NyZWVuWTogbnVtYmVyO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBjbGFzcyBCdWJibGluZ0V2ZW50IHtcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfaXNQcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgZ2V0IG5hbWUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX25hbWU7IH1cclxuICAgICAgICBnZXQgdGFyZ2V0KCk6IEV2ZW50RW1pdHRlciB7IHJldHVybiB0aGlzLl90YXJnZXQ7IH1cclxuICAgICAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAoRXZlbnRFbWl0dGVyOm5hbWVzcGFjZSkuKEJ1YmJsaW5nRXZlbnQ6Y2xhc3MpLnRhcmdldH0gaW5zdGVhZCAqL1xyXG4gICAgICAgIGdldCBvcmlnaW4oKTogRXZlbnRFbWl0dGVyIHsgcmV0dXJuIHRoaXMuX3RhcmdldDsgfVxyXG4gICAgICAgIGdldCBpc1Byb3BhZ2F0aW9uU3RvcHBlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2lzUHJvcGFnYXRpb25TdG9wcGVkOyB9XHJcblxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9uYW1lOiBzdHJpbmcsXHJcbiAgICAgICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfdGFyZ2V0OiBFdmVudEVtaXR0ZXIpIHtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN0b3BQcm9wYWdhdGlvbigpOiB2b2lkIHtcclxuICAgICAgICAgICAgdGhpcy5faXNQcm9wYWdhdGlvblN0b3BwZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgY2xhc3MgQ2xpY2tCdWJibGluZ0V2ZW50IGV4dGVuZHMgQnViYmxpbmdFdmVudCB7XHJcbiAgICAgICAgZ2V0IG1vdXNlRXZlbnQoKTogTW91c2VFdmVudCB7IHJldHVybiB0aGlzLl9tb3VzZUV2ZW50OyB9XHJcblxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHRhcmdldDogRXZlbnRFbWl0dGVyLFxyXG4gICAgICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX21vdXNlRXZlbnQ6IE1vdXNlRXZlbnRcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgc3VwZXIobmFtZSwgdGFyZ2V0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGNsYXNzIFRvdWNoU3RhcnRCdWJibGluZ0V2ZW50IGV4dGVuZHMgQnViYmxpbmdFdmVudCB7XHJcbiAgICAgICAgZ2V0IHRvdWNoRXZlbnQoKTogVG91Y2hFdmVudCB7IHJldHVybiB0aGlzLl90b3VjaEV2ZW50OyB9XHJcblxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHRhcmdldDogRXZlbnRFbWl0dGVyLFxyXG4gICAgICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX3RvdWNoRXZlbnQ6IFRvdWNoRXZlbnRcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgc3VwZXIobmFtZSwgdGFyZ2V0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgVW5leHBlY3RlZE51bGxFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuLi9sYXlvdXQtbWFuYWdlcic7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4vZXZlbnQtZW1pdHRlcic7XHJcblxyXG4vLyBBZGQgb3VyIENoaWxkRXZlbnQgdG8gV2luZG93RXZlbnRNYXAgZm9yIHR5cGUgc2FmZXR5XHJcbi8qKiBAcHVibGljICovXHJcbmRlY2xhcmUgZ2xvYmFsIHtcclxuICAgIGludGVyZmFjZSBXaW5kb3dFdmVudE1hcCB7XHJcbiAgICAgICAgW0V2ZW50SHViLkNoaWxkRXZlbnROYW1lXTogQ3VzdG9tRXZlbnQ8RXZlbnRIdWIuQ2hpbGRFdmVudERldGFpbD47XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBbiBFdmVudEVtaXR0ZXIgc2luZ2xldG9uIHRoYXQgcHJvcGFnYXRlcyBldmVudHNcclxuICogYWNyb3NzIG11bHRpcGxlIHdpbmRvd3MuIFRoaXMgaXMgYSBsaXR0bGUgYml0IHRyaWNraWVyIHNpbmNlXHJcbiAqIHdpbmRvd3MgYXJlIGFsbG93ZWQgdG8gb3BlbiBjaGlsZFdpbmRvd3MgaW4gdGhlaXIgb3duIHJpZ2h0LlxyXG4gKlxyXG4gKiBUaGlzIG1lYW5zIHRoYXQgd2UgZGVhbCB3aXRoIGEgdHJlZSBvZiB3aW5kb3dzLiBUaGVyZWZvcmUsIHdlIGRvIHRoZSBldmVudCBwcm9wYWdhdGlvbiBpbiB0d28gcGhhc2VzOlxyXG4gKlxyXG4gKiAtIFByb3BhZ2F0ZSBldmVudHMgZnJvbSB0aGlzIGxheW91dCB0byB0aGUgcGFyZW50IGxheW91dFxyXG4gKiAgIC0gUmVwZWF0IHVudGlsIHRoZSBldmVudCBhcnJpdmVkIGF0IHRoZSByb290IGxheW91dFxyXG4gKiAtIFByb3BhZ2F0ZSBldmVudHMgdG8gdGhpcyBsYXlvdXQgYW5kIHRvIGFsbCBjaGlsZHJlblxyXG4gKiAgIC0gUmVwZWF0IHVudGlsIGFsbCBsYXlvdXRzIGdvdCB0aGUgZXZlbnRcclxuICpcclxuICogKipXQVJOSU5HKio6IE9ubHkgdXNlckJyb2FkY2FzdCBldmVudHMgYXJlIHByb3BhZ2F0ZWQgYmV0d2VlbiB3aW5kb3dzLlxyXG4gKiBUaGlzIG1lYW5zIHRoZSB5b3UgaGF2ZSB0byB0YWtlIGNhcmUgb2YgcHJvcGFnYXRpbmcgc3RhdGUgY2hhbmdlcyBiZXR3ZWVuIHdpbmRvd3MgeW91cnNlbGYuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBjbGFzcyBFdmVudEh1YiBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfY2hpbGRFdmVudExpc3RlbmVyID0gKGNoaWxkRXZlbnQ6IEN1c3RvbUV2ZW50PEV2ZW50SHViLkNoaWxkRXZlbnREZXRhaWw+KSA9PiB0aGlzLm9uRXZlbnRGcm9tQ2hpbGQoY2hpbGRFdmVudCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEV2ZW50SHViIGluc3RhbmNlXHJcbiAgICAgKiBAcGFyYW0gX2xheW91dE1hbmFnZXIgLSB0aGUgbGF5b3V0IG1hbmFnZXIgdG8gc3luY2hyb25pemUgYmV0d2VlbiB0aGUgd2luZG93c1xyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9sYXlvdXRNYW5hZ2VyOiBMYXlvdXRNYW5hZ2VyXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIGdsb2JhbFRoaXMuYWRkRXZlbnRMaXN0ZW5lcihFdmVudEh1Yi5DaGlsZEV2ZW50TmFtZSwgdGhpcy5fY2hpbGRFdmVudExpc3RlbmVyLCB7IHBhc3NpdmU6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbWl0IGFuIGV2ZW50IGFuZCBub3RpZnkgbGlzdGVuZXJzXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudFxyXG4gICAgICogQHBhcmFtIGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBsaXN0ZW5lclxyXG4gICAgICogQHB1YmxpY1xyXG4gICAgICovXHJcbiAgICBvdmVycmlkZSBlbWl0PEsgZXh0ZW5kcyBrZXlvZiBFdmVudEVtaXR0ZXIuRXZlbnRQYXJhbXNNYXA+KGV2ZW50TmFtZTogSywgLi4uYXJnczogRXZlbnRFbWl0dGVyLkV2ZW50UGFyYW1zTWFwW0tdKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGV2ZW50TmFtZSA9PT0gJ3VzZXJCcm9hZGNhc3QnKSB7XHJcbiAgICAgICAgICAgIC8vIEV4cGxpY2l0bHkgcmVkaXJlY3QgdGhlIHVzZXIgYnJvYWRjYXN0IHRvIG91ciBvdmVycmlkZGVuIG1ldGhvZC5cclxuICAgICAgICAgICAgdGhpcy5lbWl0VXNlckJyb2FkY2FzdCguLi5hcmdzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzdXBlci5lbWl0KGV2ZW50TmFtZSwgLi4uYXJncyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQnJvYWRjYXN0cyBhIG1lc3NhZ2UgdG8gYWxsIG90aGVyIGN1cnJlbnRseSBvcGVuZWQgd2luZG93cy5cclxuICAgICAqIEBwdWJsaWNcclxuICAgICAqL1xyXG4gICAgZW1pdFVzZXJCcm9hZGNhc3QoLi4uYXJnczogRXZlbnRFbWl0dGVyLlVua25vd25QYXJhbXMpOiB2b2lkIHtcclxuICAgICAgICAvLyBTdGVwIDE6IEJ1YmJsZSB1cCB0aGUgZXZlbnRcclxuICAgICAgICB0aGlzLmhhbmRsZVVzZXJCcm9hZGNhc3RFdmVudCgndXNlckJyb2FkY2FzdCcsIGFyZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVzdHJveXMgdGhlIEV2ZW50SHViXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICBnbG9iYWxUaGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoRXZlbnRIdWIuQ2hpbGRFdmVudE5hbWUsIHRoaXMuX2NoaWxkRXZlbnRMaXN0ZW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnRlcm5hbCBwcm9jZXNzb3IgdG8gcHJvY2VzcyBsb2NhbCBldmVudHMuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVVc2VyQnJvYWRjYXN0RXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGFyZ3M6IHVua25vd25bXSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9sYXlvdXRNYW5hZ2VyLmlzU3ViV2luZG93KSB7XHJcbiAgICAgICAgICAgIC8vIFdlIGFyZSBhIHN1YiB3aW5kb3cgYW5kIHJlY2VpdmVkIGFuIGV2ZW50IGZyb20gb25lIG9mIG91ciBjaGlsZHJlbi5cclxuICAgICAgICAgICAgLy8gU28gcHJvcGFnYXRlIGl0IHRvIHRoZSBSb290LlxyXG4gICAgICAgICAgICB0aGlzLnByb3BhZ2F0ZVRvUGFyZW50KGV2ZW50TmFtZSwgYXJncyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gV2UgYXJlIHRoZSByb290IHdpbmRvdywgcHJvcGFnYXRlIGl0IHRvIHRoZSBzdWJ0cmVlIGJlbG93IHVzLlxyXG4gICAgICAgICAgICB0aGlzLnByb3BhZ2F0ZVRvVGhpc0FuZFN1YnRyZWUoZXZlbnROYW1lLCBhcmdzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayBmb3IgY2hpbGQgZXZlbnRzIHJhaXNlZCBvbiB0aGUgd2luZG93XHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvbkV2ZW50RnJvbUNoaWxkKGV2ZW50OiBDdXN0b21FdmVudDxFdmVudEh1Yi5DaGlsZEV2ZW50RGV0YWlsPikge1xyXG4gICAgICAgIGNvbnN0IGRldGFpbCA9IGV2ZW50LmRldGFpbDtcclxuICAgICAgICB0aGlzLmhhbmRsZVVzZXJCcm9hZGNhc3RFdmVudChkZXRhaWwuZXZlbnROYW1lLCBkZXRhaWwuYXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9wYWdhdGVzIHRoZSBldmVudCB0byB0aGUgcGFyZW50IGJ5IGVtaXR0aW5nXHJcbiAgICAgKiBpdCBvbiB0aGUgcGFyZW50J3MgRE9NIHdpbmRvd1xyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcHJvcGFnYXRlVG9QYXJlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGFyZ3M6IHVua25vd25bXSkge1xyXG4gICAgICAgIGNvbnN0IGRldGFpbDogRXZlbnRIdWIuQ2hpbGRFdmVudERldGFpbCA9IHtcclxuICAgICAgICAgICAgbGF5b3V0TWFuYWdlcjogdGhpcy5fbGF5b3V0TWFuYWdlcixcclxuICAgICAgICAgICAgZXZlbnROYW1lLFxyXG4gICAgICAgICAgICBhcmdzOiBhcmdzLFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZXZlbnRJbml0OiBFdmVudEh1Yi5DaGlsZEV2ZW50SW5pdCA9IHtcclxuICAgICAgICAgICAgYnViYmxlczogdHJ1ZSxcclxuICAgICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZSxcclxuICAgICAgICAgICAgZGV0YWlsLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50PEV2ZW50SHViLkNoaWxkRXZlbnREZXRhaWw+KEV2ZW50SHViLkNoaWxkRXZlbnROYW1lLCBldmVudEluaXQpO1xyXG4gICAgICAgIGNvbnN0IG9wZW5lciA9IGdsb2JhbFRoaXMub3BlbmVyO1xyXG4gICAgICAgIGlmIChvcGVuZXIgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0VIUFRQMTU3NzgnKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgb3BlbmVyLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvcGFnYXRlIGV2ZW50cyB0byB0aGUgd2hvbGUgc3VidHJlZSB1bmRlciB0aGlzIGV2ZW50IGh1Yi5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHByb3BhZ2F0ZVRvVGhpc0FuZFN1YnRyZWUoZXZlbnROYW1lOiBzdHJpbmcsIGFyZ3M6IHVua25vd25bXSkge1xyXG4gICAgICAgIHRoaXMuZW1pdFVua25vd24oZXZlbnROYW1lLCAuLi5hcmdzKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2xheW91dE1hbmFnZXIub3BlblBvcG91dHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgY2hpbGRHbCA9IHRoaXMuX2xheW91dE1hbmFnZXIub3BlblBvcG91dHNbaV0uZ2V0R2xJbnN0YW5jZSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNoaWxkR2wpIHtcclxuICAgICAgICAgICAgICAgIGNoaWxkR2wuZXZlbnRIdWIucHJvcGFnYXRlVG9UaGlzQW5kU3VidHJlZShldmVudE5hbWUsIGFyZ3MpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIEV2ZW50SHViIHtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgY29uc3QgQ2hpbGRFdmVudE5hbWUgPSAnZ2xfY2hpbGRfZXZlbnQnO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIENoaWxkRXZlbnREZXRhaWwgPSB7XHJcbiAgICAgICAgbGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlcjtcclxuICAgICAgICBldmVudE5hbWU6IHN0cmluZztcclxuICAgICAgICBhcmdzOiB1bmtub3duW107XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIENoaWxkRXZlbnRJbml0ID0gQ3VzdG9tRXZlbnRJbml0PENoaWxkRXZlbnREZXRhaWw+O1xyXG59XHJcbiIsImltcG9ydCB7IEFzc2VydEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBjb25zdCBlbnVtIEkxOG5TdHJpbmdJZCB7XHJcbiAgICBQb3BvdXRDYW5ub3RCZUNyZWF0ZWRXaXRoR3JvdW5kSXRlbUNvbmZpZyxcclxuICAgIFBsZWFzZVJlZ2lzdGVyQUNvbnN0cnVjdG9yRnVuY3Rpb24sXHJcbiAgICBDb21wb25lbnRUeXBlTm90UmVnaXN0ZXJlZEFuZEJpbmRDb21wb25lbnRFdmVudEhhbmRsZXJOb3RBc3NpZ25lZCxcclxuICAgIENvbXBvbmVudElzQWxyZWFkeVJlZ2lzdGVyZWQsXHJcbiAgICBDb21wb25lbnRJc05vdFZpcnR1YWJsZSxcclxuICAgIFZpcnR1YWxDb21wb25lbnREb2VzTm90SGF2ZVJvb3RIdG1sRWxlbWVudCxcclxuICAgIEl0ZW1Db25maWdJc05vdFR5cGVDb21wb25lbnQsXHJcbiAgICBJbnZhbGlkTnVtYmVyUGFydEluU2l6ZVN0cmluZyxcclxuICAgIFVua25vd25Vbml0SW5TaXplU3RyaW5nLFxyXG4gICAgVW5zdXBwb3J0ZWRVbml0SW5TaXplU3RyaW5nLFxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIEkxOG5TdHJpbmdzIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGxldCBpbml0aWFsaXNlZCA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGludGVyZmFjZSBJbmZvIHtcclxuICAgICAgICByZWFkb25seSBpZDogSTE4blN0cmluZ0lkO1xyXG4gICAgICAgIHJlYWRvbmx5IGRlZmF1bHQ6IHN0cmluZztcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICB0eXBlIEluZm9zT2JqZWN0ID0geyBbaWQgaW4ga2V5b2YgdHlwZW9mIEkxOG5TdHJpbmdJZF06IEluZm8gfTtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdCBpbmZvc09iamVjdDogSW5mb3NPYmplY3QgPSB7XHJcbiAgICAgICAgUG9wb3V0Q2Fubm90QmVDcmVhdGVkV2l0aEdyb3VuZEl0ZW1Db25maWc6IHtcclxuICAgICAgICAgICAgaWQ6IEkxOG5TdHJpbmdJZC5Qb3BvdXRDYW5ub3RCZUNyZWF0ZWRXaXRoR3JvdW5kSXRlbUNvbmZpZyxcclxuICAgICAgICAgICAgZGVmYXVsdDogJ1BvcG91dCBjYW5ub3QgYmUgY3JlYXRlZCB3aXRoIGdyb3VuZCBJdGVtQ29uZmlnJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgUGxlYXNlUmVnaXN0ZXJBQ29uc3RydWN0b3JGdW5jdGlvbjoge1xyXG4gICAgICAgICAgICBpZDogSTE4blN0cmluZ0lkLlBsZWFzZVJlZ2lzdGVyQUNvbnN0cnVjdG9yRnVuY3Rpb24sXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6ICdQbGVhc2UgcmVnaXN0ZXIgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbidcclxuICAgICAgICB9LFxyXG4gICAgICAgIENvbXBvbmVudFR5cGVOb3RSZWdpc3RlcmVkQW5kQmluZENvbXBvbmVudEV2ZW50SGFuZGxlck5vdEFzc2lnbmVkOiB7XHJcbiAgICAgICAgICAgIGlkOiBJMThuU3RyaW5nSWQuQ29tcG9uZW50VHlwZU5vdFJlZ2lzdGVyZWRBbmRCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyTm90QXNzaWduZWQsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6ICdDb21wb25lbnQgdHlwZSBub3QgcmVnaXN0ZXJlZCBhbmQgQmluZENvbXBvbmVudEV2ZW50IGhhbmRsZXIgbm90IGFzc2lnbmVkJyxcclxuICAgICAgICB9LFxyXG4gICAgICAgIENvbXBvbmVudElzQWxyZWFkeVJlZ2lzdGVyZWQ6IHtcclxuICAgICAgICAgICAgaWQ6IEkxOG5TdHJpbmdJZC5Db21wb25lbnRJc0FscmVhZHlSZWdpc3RlcmVkLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAnQ29tcG9uZW50IGlzIGFscmVhZHkgcmVnaXN0ZXJlZCcsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBDb21wb25lbnRJc05vdFZpcnR1YWJsZToge1xyXG4gICAgICAgICAgICBpZDogSTE4blN0cmluZ0lkLkNvbXBvbmVudElzTm90VmlydHVhYmxlLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAnQ29tcG9uZW50IGlzIG5vdCB2aXJ0dWFibGUuIFJlcXVpcmVzIHJvb3RIdG1sRWxlbWVudCBmaWVsZC9nZXR0ZXInLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgVmlydHVhbENvbXBvbmVudERvZXNOb3RIYXZlUm9vdEh0bWxFbGVtZW50OiB7XHJcbiAgICAgICAgICAgIGlkOiBJMThuU3RyaW5nSWQuVmlydHVhbENvbXBvbmVudERvZXNOb3RIYXZlUm9vdEh0bWxFbGVtZW50LFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAnVmlydHVhbCBjb21wb25lbnQgZG9lcyBub3QgaGF2ZSBnZXR0ZXIgXCJyb290SHRtbEVsZW1lbnRcIicsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBJdGVtQ29uZmlnSXNOb3RUeXBlQ29tcG9uZW50OiB7XHJcbiAgICAgICAgICAgIGlkOiBJMThuU3RyaW5nSWQuSXRlbUNvbmZpZ0lzTm90VHlwZUNvbXBvbmVudCxcclxuICAgICAgICAgICAgZGVmYXVsdDogJ0l0ZW1Db25maWcgaXMgbm90IG9mIHR5cGUgY29tcG9uZW50JyxcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICBJbnZhbGlkTnVtYmVyUGFydEluU2l6ZVN0cmluZzoge1xyXG4gICAgICAgICAgICBpZDogSTE4blN0cmluZ0lkLkludmFsaWROdW1iZXJQYXJ0SW5TaXplU3RyaW5nLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAnSW52YWxpZCBudW1iZXIgcGFydCBpbiBzaXplIHN0cmluZycsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBVbmtub3duVW5pdEluU2l6ZVN0cmluZzoge1xyXG4gICAgICAgICAgICBpZDogSTE4blN0cmluZ0lkLlVua25vd25Vbml0SW5TaXplU3RyaW5nLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAnVW5rbm93biB1bml0IGluIHNpemUgc3RyaW5nJyxcclxuICAgICAgICB9LFxyXG4gICAgICAgIFVuc3VwcG9ydGVkVW5pdEluU2l6ZVN0cmluZzoge1xyXG4gICAgICAgICAgICBpZDogSTE4blN0cmluZ0lkLlVuc3VwcG9ydGVkVW5pdEluU2l6ZVN0cmluZyxcclxuICAgICAgICAgICAgZGVmYXVsdDogJ1Vuc3VwcG9ydGVkIHVuaXQgaW4gc2l6ZSBzdHJpbmcnLFxyXG4gICAgICAgIH0sXHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGNvbnN0IGlkQ291bnQgPSBPYmplY3Qua2V5cyhpbmZvc09iamVjdCkubGVuZ3RoO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3QgaW5mb3MgPSBPYmplY3QudmFsdWVzKGluZm9zT2JqZWN0KTtcclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY2hlY2tJbml0aWFsaXNlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghaW5pdGlhbGlzZWQpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZENvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGluZm8gPSBpbmZvc1tpXTtcclxuICAgICAgICAgICAgICAgIGlmIChpbmZvLmlkICE9PSBpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdJTlNJMDAxMTAnLCBgJHtpfTogJHtpbmZvLmlkfWApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpMThuU3RyaW5nc1tpXSA9IGluZm8uZGVmYXVsdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpbml0aWFsaXNlZCA9IHRydWU7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBjb25zdCBpMThuU3RyaW5ncyA9IG5ldyBBcnJheTxzdHJpbmc+KEkxOG5TdHJpbmdzLmlkQ291bnQpO1xyXG4iLCIvKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFN0eWxlQ29uc3RhbnRzIHtcclxuICAgIGV4cG9ydCBjb25zdCBkZWZhdWx0Q29tcG9uZW50QmFzZVpJbmRleCA9ICdhdXRvJztcclxuICAgIGV4cG9ydCBjb25zdCBkZWZhdWx0Q29tcG9uZW50RHJhZ1pJbmRleCA9ICczMic7XHJcbiAgICBleHBvcnQgY29uc3QgZGVmYXVsdENvbXBvbmVudFN0YWNrTWF4aW1pc2VkWkluZGV4ID0gJzQxJztcclxufVxyXG4iLCJpbXBvcnQgeyBVbnJlYWNoYWJsZUNhc2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IFN0eWxlQ29uc3RhbnRzIH0gZnJvbSAnLi9zdHlsZS1jb25zdGFudHMnO1xyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgdHlwZSBXaWR0aE9ySGVpZ2h0UHJvcGVydHlOYW1lID0gJ3dpZHRoJyB8ICdoZWlnaHQnO1xyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFdpZHRoT3JIZWlnaHRQcm9wZXJ0eU5hbWUge1xyXG4gICAgZXhwb3J0IGNvbnN0IHdpZHRoID0gJ3dpZHRoJztcclxuICAgIGV4cG9ydCBjb25zdCBoZWlnaHQgPSAnaGVpZ2h0JztcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFdpZHRoQW5kSGVpZ2h0IHtcclxuICAgIHdpZHRoOiBudW1iZXI7XHJcbiAgICBoZWlnaHQ6IG51bWJlcjtcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIExlZnRBbmRUb3Age1xyXG4gICAgbGVmdDogbnVtYmVyO1xyXG4gICAgdG9wOiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCB0eXBlIFNpZGUgPSAndG9wJyB8ICdsZWZ0JyB8ICdyaWdodCcgfCAnYm90dG9tJztcclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBTaWRlIHtcclxuICAgIGV4cG9ydCBjb25zdCB0b3AgPSAndG9wJztcclxuICAgIGV4cG9ydCBjb25zdCBsZWZ0ID0gJ2xlZnQnO1xyXG4gICAgZXhwb3J0IGNvbnN0IHJpZ2h0ID0gJ3JpZ2h0JztcclxuICAgIGV4cG9ydCBjb25zdCBib3R0b20gPSAnYm90dG9tJztcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IHR5cGUgTG9naWNhbFpJbmRleCA9ICdiYXNlJyB8ICdkcmFnJyB8ICdzdGFja01heGltaXNlZCc7XHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgTG9naWNhbFpJbmRleCB7XHJcbiAgICBleHBvcnQgY29uc3QgYmFzZSA9ICdiYXNlJztcclxuICAgIGV4cG9ydCBjb25zdCBkcmFnID0gJ2RyYWcnO1xyXG4gICAgZXhwb3J0IGNvbnN0IHN0YWNrTWF4aW1pc2VkID0gJ3N0YWNrTWF4aW1pc2VkJztcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGNvbnN0IExvZ2ljYWxaSW5kZXhUb0RlZmF1bHRNYXAgPSB7XHJcbiAgICBiYXNlOiBTdHlsZUNvbnN0YW50cy5kZWZhdWx0Q29tcG9uZW50QmFzZVpJbmRleCxcclxuICAgIGRyYWc6IFN0eWxlQ29uc3RhbnRzLmRlZmF1bHRDb21wb25lbnREcmFnWkluZGV4LFxyXG4gICAgc3RhY2tNYXhpbWlzZWQ6IFN0eWxlQ29uc3RhbnRzLmRlZmF1bHRDb21wb25lbnRTdGFja01heGltaXNlZFpJbmRleCxcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFJlY3Qge1xyXG4gICAgbGVmdDogbnVtYmVyLFxyXG4gICAgdG9wOiBudW1iZXIsXHJcbiAgICB3aWR0aDogbnVtYmVyLFxyXG4gICAgaGVpZ2h0OiBudW1iZXIsXHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGludGVyZmFjZSBBcmVhTGlua2VkUmVjdCB7XHJcbiAgICB4MTogbnVtYmVyLCAvLyBsZWZ0XHJcbiAgICB4MjogbnVtYmVyLCAvLyBuZXh0TGVmdFxyXG4gICAgeTE6IG51bWJlciwgLy8gdG9wXHJcbiAgICB5MjogbnVtYmVyLCAvLyBuZXh0VG9wXHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXHJcbmV4cG9ydCB0eXBlIEpzb25WYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIHwgSnNvbiB8IG9iamVjdCB8IEpzb25WYWx1ZUFycmF5O1xyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEpzb24ge1xyXG4gICAgW25hbWU6IHN0cmluZ106IEpzb25WYWx1ZTtcclxufVxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgdHlwZSBKc29uVmFsdWVBcnJheSA9IEFycmF5PEpzb25WYWx1ZT5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBKc29uVmFsdWUge1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzSnNvbih2YWx1ZTogSnNvblZhbHVlKTogdmFsdWUgaXMgSnNvbiB7XHJcbiAgICAgICAgcmV0dXJuIGlzSnNvbk9iamVjdCh2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0pzb25PYmplY3QodmFsdWU6IEpzb25WYWx1ZSk6IHZhbHVlIGlzIEpzb24gfCBvYmplY3Qge1xyXG4gICAgICAgIHJldHVybiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JztcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IHR5cGUgSXRlbVR5cGUgPSAnZ3JvdW5kJyB8ICdyb3cnIHwgJ2NvbHVtbicgfCAnc3RhY2snIHwgJ2NvbXBvbmVudCc7XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIEl0ZW1UeXBlIHtcclxuICAgIGV4cG9ydCBjb25zdCBncm91bmQgPSAnZ3JvdW5kJztcclxuICAgIGV4cG9ydCBjb25zdCByb3cgPSAncm93JztcclxuICAgIGV4cG9ydCBjb25zdCBjb2x1bW4gPSAnY29sdW1uJztcclxuICAgIGV4cG9ydCBjb25zdCBzdGFjayA9ICdzdGFjayc7XHJcbiAgICBleHBvcnQgY29uc3QgY29tcG9uZW50ID0gJ2NvbXBvbmVudCc7XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCB0eXBlIFJlc3BvbnNpdmVNb2RlID0gJ25vbmUnIHwgJ2Fsd2F5cycgfCAnb25sb2FkJztcclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBSZXNwb25zaXZlTW9kZSB7XHJcbiAgICBleHBvcnQgY29uc3Qgbm9uZSA9ICdub25lJztcclxuICAgIGV4cG9ydCBjb25zdCBhbHdheXMgPSAnYWx3YXlzJztcclxuICAgIGV4cG9ydCBjb25zdCBvbmxvYWQgPSAnb25sb2FkJztcclxufVxyXG5cclxuLyoqXHJcbiAqIExlbmd0aCB1bml0cyB3aGljaCBjYW4gc3BlY2lmeSB0aGUgc2l6ZSBvZiBhIENvbXBvbmVudCBJdGVtXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCB0eXBlIFNpemVVbml0ID0gJ3B4JyB8ICclJyB8ICdmcicgfCAnZW0nO1xyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGVudW0gU2l6ZVVuaXRFbnVtIHtcclxuICAgIFBpeGVsID0gJ3B4JyxcclxuICAgIFBlcmNlbnQgPSAnJScsXHJcbiAgICBGcmFjdGlvbmFsID0gJ2ZyJyxcclxuICAgIEVtID0gJ2VtJyxcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBTaXplVW5pdEVudW0ge1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHRyeVBhcnNlKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgU2l6ZVVuaXRFbnVtLlBpeGVsOiByZXR1cm4gU2l6ZVVuaXRFbnVtLlBpeGVsO1xyXG4gICAgICAgICAgICBjYXNlIFNpemVVbml0RW51bS5QZXJjZW50OiByZXR1cm4gU2l6ZVVuaXRFbnVtLlBlcmNlbnQ7XHJcbiAgICAgICAgICAgIGNhc2UgU2l6ZVVuaXRFbnVtLkZyYWN0aW9uYWw6IHJldHVybiBTaXplVW5pdEVudW0uRnJhY3Rpb25hbDtcclxuICAgICAgICAgICAgY2FzZSBTaXplVW5pdEVudW0uRW06IHJldHVybiBTaXplVW5pdEVudW0uRW07XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBmb3JtYXQodmFsdWU6IFNpemVVbml0RW51bSkge1xyXG4gICAgICAgIHN3aXRjaCAodmFsdWUpIHtcclxuICAgICAgICAgICAgY2FzZSBTaXplVW5pdEVudW0uUGl4ZWw6IHJldHVybiBTaXplVW5pdEVudW0uUGl4ZWw7XHJcbiAgICAgICAgICAgIGNhc2UgU2l6ZVVuaXRFbnVtLlBlcmNlbnQ6IHJldHVybiBTaXplVW5pdEVudW0uUGVyY2VudDtcclxuICAgICAgICAgICAgY2FzZSBTaXplVW5pdEVudW0uRnJhY3Rpb25hbDogcmV0dXJuIFNpemVVbml0RW51bS5GcmFjdGlvbmFsO1xyXG4gICAgICAgICAgICBjYXNlIFNpemVVbml0RW51bS5FbTogcmV0dXJuIFNpemVVbml0RW51bS5FbTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnJlYWNoYWJsZUNhc2VFcnJvcignU1VFRjQ0OTk4JywgdmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBMZWZ0QW5kVG9wLCBXaWR0aEFuZEhlaWdodCB9IGZyb20gJy4vdHlwZXMnO1xyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbnVtYmVyVG9QaXhlbHModmFsdWU6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoMTApICsgJ3B4JztcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcGl4ZWxzVG9OdW1iZXIodmFsdWU6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBjb25zdCBudW1iZXJTdHIgPSB2YWx1ZS5yZXBsYWNlKFwicHhcIiwgXCJcIik7XHJcbiAgICByZXR1cm4gcGFyc2VGbG9hdChudW1iZXJTdHIpO1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU3BsaXRTdHJpbmdBdEZpcnN0Tm9uTnVtZXJpY0NoYXJSZXN1bHQge1xyXG4gICAgbnVtZXJpY1BhcnQ6IHN0cmluZztcclxuICAgIGZpcnN0Tm9uTnVtZXJpY0NoYXJQYXJ0OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0U3RyaW5nQXRGaXJzdE5vbk51bWVyaWNDaGFyKHZhbHVlOiBzdHJpbmcpOiBTcGxpdFN0cmluZ0F0Rmlyc3ROb25OdW1lcmljQ2hhclJlc3VsdCB7XHJcbiAgICB2YWx1ZSA9IHZhbHVlLnRyaW1TdGFydCgpO1xyXG5cclxuICAgIGNvbnN0IGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcclxuICAgIGlmIChsZW5ndGggPT09IDApIHtcclxuICAgICAgICByZXR1cm4geyBudW1lcmljUGFydDogJycsIGZpcnN0Tm9uTnVtZXJpY0NoYXJQYXJ0OiAnJyB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBmaXJzdE5vbkRpZ2l0UGFydEluZGV4ID0gbGVuZ3RoO1xyXG4gICAgICAgIGxldCBnb3REZWNpbWFsUG9pbnQgPSBmYWxzZTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoYXIgPSB2YWx1ZVtpXTtcclxuICAgICAgICAgICAgaWYgKCFpc0RpZ2l0KGNoYXIpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2hhciAhPT0gJy4nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlyc3ROb25EaWdpdFBhcnRJbmRleCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChnb3REZWNpbWFsUG9pbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3ROb25EaWdpdFBhcnRJbmRleCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdvdERlY2ltYWxQb2ludCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGRpZ2l0c1BhcnQgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgZmlyc3ROb25EaWdpdFBhcnRJbmRleCk7XHJcbiAgICAgICAgY29uc3QgZmlyc3ROb25EaWdpdFBhcnQgPSB2YWx1ZS5zdWJzdHJpbmcoZmlyc3ROb25EaWdpdFBhcnRJbmRleCkudHJpbSgpO1xyXG5cclxuICAgICAgICByZXR1cm4geyBudW1lcmljUGFydDogZGlnaXRzUGFydCwgZmlyc3ROb25OdW1lcmljQ2hhclBhcnQ6IGZpcnN0Tm9uRGlnaXRQYXJ0IH07XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzRGlnaXQoY2hhcjogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gY2hhciA+PSAnMCcgJiYgY2hhciA8PSAnOSc7XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEVsZW1lbnRXaWR0aChlbGVtZW50OiBIVE1MRWxlbWVudCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gZWxlbWVudC5vZmZzZXRXaWR0aDtcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc2V0RWxlbWVudFdpZHRoKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCB3aWR0aDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCB3aWR0aEFzUGl4ZWxzID0gbnVtYmVyVG9QaXhlbHMoTWF0aC5tYXgoMCwgd2lkdGgpKTtcclxuICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSB3aWR0aEFzUGl4ZWxzO1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRFbGVtZW50SGVpZ2h0KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogbnVtYmVyIHtcclxuICAgIHJldHVybiBlbGVtZW50Lm9mZnNldEhlaWdodDtcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc2V0RWxlbWVudEhlaWdodChlbGVtZW50OiBIVE1MRWxlbWVudCwgaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGNvbnN0IGhlaWdodEFzUGl4ZWxzID0gbnVtYmVyVG9QaXhlbHMoTWF0aC5tYXgoMCwgaGVpZ2h0KSk7XHJcbiAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9IGhlaWdodEFzUGl4ZWxzO1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRFbGVtZW50V2lkdGhBbmRIZWlnaHQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBXaWR0aEFuZEhlaWdodCB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHdpZHRoOiBlbGVtZW50Lm9mZnNldFdpZHRoLFxyXG4gICAgICAgIGhlaWdodDogZWxlbWVudC5vZmZzZXRIZWlnaHQsXHJcbiAgICB9O1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRFbGVtZW50Q2xpZW50V2lkdGhBbmRIZWlnaHQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBXaWR0aEFuZEhlaWdodCB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHdpZHRoOiBlbGVtZW50LmNsaWVudFdpZHRoLFxyXG4gICAgICAgIGhlaWdodDogZWxlbWVudC5jbGllbnRIZWlnaHQsXHJcbiAgICB9O1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRXaW5kb3dUb3BMZWZ0Qm9yZGVyKHdpbmRvdzogV2luZG93IHwgdHlwZW9mIGdsb2JhbFRoaXMpOiBXaWR0aEFuZEhlaWdodCB7XHJcbiAgICBsZXQgaW5uZXJTY3JlZW5YOiBudW1iZXIgfCB1bmRlZmluZWQgPSAoPGFueT53aW5kb3cpLm1veklubmVyU2NyZWVuWDtcclxuICAgIGxldCBpbm5lclNjcmVlblk6IG51bWJlciB8IHVuZGVmaW5lZCA9ICg8YW55PndpbmRvdykubW96SW5uZXJTY3JlZW5ZO1xyXG4gICAgbGV0IGJvcmRlclg6IG51bWJlciwgYm9yZGVyWTogbnVtYmVyO1xyXG5cclxuICAgIGlmIChpbm5lclNjcmVlblggPT09IHVuZGVmaW5lZCB8fCBpbm5lclNjcmVlblkgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGJvcmRlclggPSAod2luZG93Lm91dGVyV2lkdGggLSB3aW5kb3cuaW5uZXJXaWR0aCkgLyAyOyAgICAgICAgLy8gQXNzdW1lIGxlZnQgLyByaWdodCBib3JkZXIgaXMgdGhlIHNhbWVcclxuICAgICAgICBib3JkZXJZID0gd2luZG93Lm91dGVySGVpZ2h0IC0gd2luZG93LmlubmVySGVpZ2h0IC0gYm9yZGVyWDsgIC8vIEFzc3VtZSBib3R0b20gYm9yZGVyIGlzIHRoZSBzYW1lIGFzIGxlZnQgLyByaWdodFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBib3JkZXJYID0gaW5uZXJTY3JlZW5YIC0gd2luZG93LnNjcmVlblg7XHJcbiAgICAgICAgYm9yZGVyWSA9IGlubmVyU2NyZWVuWSAtIHdpbmRvdy5zY3JlZW5ZO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7IHdpZHRoOiBNYXRoLm1heCgwLCBib3JkZXJYKSwgaGVpZ2h0OiBNYXRoLm1heCgwLCBib3JkZXJZKSB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFdpbmRvd0lubmVyU2NyZWVuUG9zaXRpb24od2luZG93OiBXaW5kb3cgfCB0eXBlb2YgZ2xvYmFsVGhpcyk6IExlZnRBbmRUb3Age1xyXG4gICAgbGV0IGlubmVyU2NyZWVuWDogbnVtYmVyIHwgdW5kZWZpbmVkID0gKDxhbnk+d2luZG93KS5tb3pJbm5lclNjcmVlblg7XHJcbiAgICBsZXQgaW5uZXJTY3JlZW5ZOiBudW1iZXIgfCB1bmRlZmluZWQgPSAoPGFueT53aW5kb3cpLm1veklubmVyU2NyZWVuWTtcclxuXHJcbiAgICBpZiAoaW5uZXJTY3JlZW5YID09PSB1bmRlZmluZWQgfHwgaW5uZXJTY3JlZW5ZID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBjb25zdCBib3JkZXIgPSBnZXRXaW5kb3dUb3BMZWZ0Qm9yZGVyKHdpbmRvdyk7XHJcbiAgICAgICAgaW5uZXJTY3JlZW5YID0gd2luZG93LnNjcmVlblggKyBib3JkZXIud2lkdGg7XHJcbiAgICAgICAgaW5uZXJTY3JlZW5ZID0gd2luZG93LnNjcmVlblkgKyBib3JkZXIuaGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7IGxlZnQ6IGlubmVyU2NyZWVuWCwgdG9wOiBpbm5lclNjcmVlblkgfTtcclxufVxyXG5cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNldEVsZW1lbnREaXNwbGF5VmlzaWJpbGl0eShlbGVtZW50OiBIVE1MRWxlbWVudCwgdmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHZpc2libGUpIHtcclxuICAgICAgICBlbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVFbGVtZW50UG9zaXRpb25BYnNvbHV0ZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgYWJzb2x1dGVQb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XHJcbiAgICBpZiAoZWxlbWVudC5zdHlsZS5wb3NpdGlvbiAhPT0gYWJzb2x1dGVQb3NpdGlvbikge1xyXG4gICAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBhYnNvbHV0ZVBvc2l0aW9uO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogUmVwbGFjZW1lbnQgZm9yIEpRdWVyeSAkLmV4dGVuZCh0YXJnZXQsIG9iailcclxuICogQGludGVybmFsXHJcbiovXHJcbmV4cG9ydCBmdW5jdGlvbiBleHRlbmQodGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xyXG4gICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgICAgICB0YXJnZXRba2V5XSA9IG9ialtrZXldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0YXJnZXQ7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXBsYWNlbWVudCBmb3IgSlF1ZXJ5ICQuZXh0ZW5kKHRydWUsIHRhcmdldCwgb2JqKVxyXG4gKiBAaW50ZXJuYWxcclxuKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBFeHRlbmQodGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgb2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcclxuICAgIGlmIChvYmogIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xyXG4gICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1RhcmdldCA9IHRhcmdldFtrZXldO1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBkZWVwRXh0ZW5kVmFsdWUoZXhpc3RpbmdUYXJnZXQsIHZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGFyZ2V0O1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWVwRXh0ZW5kVmFsdWUoZXhpc3RpbmdUYXJnZXQ6IHVua25vd24sIHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jykge1xyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IHZhbHVlLmxlbmd0aDtcclxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0QXJyYXkgPSBuZXcgQXJyYXk8dW5rbm93bj4obGVuZ3RoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHZhbHVlW2ldO1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0QXJyYXlbaV0gPSBkZWVwRXh0ZW5kVmFsdWUoe30sIGVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXRBcnJheTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVPYmogPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcclxuICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1RhcmdldCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZXBFeHRlbmQoe30sIHZhbHVlT2JqKTsgLy8gb3ZlcndyaXRlXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZXhpc3RpbmdUYXJnZXQgIT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZXBFeHRlbmQoe30sIHZhbHVlT2JqKTsgLy8gb3ZlcndyaXRlXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXhpc3RpbmdUYXJnZXQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVlcEV4dGVuZCh7fSwgdmFsdWVPYmopOyAvLyBvdmVyd3JpdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1RhcmdldCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWVwRXh0ZW5kKHt9LCB2YWx1ZU9iaik7IC8vIG92ZXJ3cml0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1RhcmdldE9iaiA9IGV4aXN0aW5nVGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWVwRXh0ZW5kKGV4aXN0aW5nVGFyZ2V0T2JqLCB2YWx1ZU9iaik7IC8vIG1lcmdlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUZyb21BcnJheTxUPihpdGVtOiBULCBhcnJheTogVFtdKTogdm9pZCB7XHJcbiAgICBjb25zdCBpbmRleCA9IGFycmF5LmluZGV4T2YoaXRlbSk7XHJcblxyXG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuXFwndCByZW1vdmUgaXRlbSBmcm9tIGFycmF5LiBJdGVtIGlzIG5vdCBpbiB0aGUgYXJyYXknKTtcclxuICAgIH1cclxuXHJcbiAgICBhcnJheS5zcGxpY2UoaW5kZXgsIDEpO1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRVbmlxdWVJZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIChNYXRoLnJhbmRvbSgpICogMTAwMDAwMDAwMDAwMDAwMClcclxuICAgICAgICAudG9TdHJpbmcoMzYpXHJcbiAgICAgICAgLnJlcGxhY2UoJy4nLCAnJyk7XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEVycm9yTWVzc2FnZShlOiB1bmtub3duKTogc3RyaW5nIHtcclxuICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcclxuICAgICAgICByZXR1cm4gZS5tZXNzYWdlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAodHlwZW9mIGUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnVW5rbm93biBFcnJvcic7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IExheW91dENvbmZpZyB9IGZyb20gJy4vY29uZmlnL2NvbmZpZyc7XHJcbmltcG9ydCB7IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZywgUmVzb2x2ZWRMYXlvdXRDb25maWcsIFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnIH0gZnJvbSAnLi9jb25maWcvcmVzb2x2ZWQtY29uZmlnJztcclxuaW1wb3J0IHsgQ29tcG9uZW50Q29udGFpbmVyIH0gZnJvbSAnLi9jb250YWluZXIvY29tcG9uZW50LWNvbnRhaW5lcic7XHJcbmltcG9ydCB7IEJpbmRFcnJvciB9IGZyb20gJy4vZXJyb3JzL2V4dGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yIH0gZnJvbSAnLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi9sYXlvdXQtbWFuYWdlcic7XHJcbmltcG9ydCB7IERvbUNvbnN0YW50cyB9IGZyb20gJy4vdXRpbHMvZG9tLWNvbnN0YW50cyc7XHJcbmltcG9ydCB7IEkxOG5TdHJpbmdJZCwgaTE4blN0cmluZ3MgfSBmcm9tICcuL3V0aWxzL2kxOG4tc3RyaW5ncyc7XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgY2xhc3MgVmlydHVhbExheW91dCBleHRlbmRzIExheW91dE1hbmFnZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIChWaXJ0dWFsTGF5b3V0OmNsYXNzKS5iaW5kQ29tcG9uZW50RXZlbnR9IGFuZFxyXG4gICAgICoge0BsaW5rIChWaXJ0dWFsTGF5b3V0OmNsYXNzKS51bmJpbmRDb21wb25lbnRFdmVudH0gd2l0aCB2aXJ0dWFsIGNvbXBvbmVudHNcclxuICAgICAqL1xyXG4gICAgZ2V0Q29tcG9uZW50RXZlbnQ6IFZpcnR1YWxMYXlvdXQuR2V0Q29tcG9uZW50RXZlbnRIYW5kbGVyIHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIChWaXJ0dWFsTGF5b3V0OmNsYXNzKS5iaW5kQ29tcG9uZW50RXZlbnR9IGFuZFxyXG4gICAgICoge0BsaW5rIChWaXJ0dWFsTGF5b3V0OmNsYXNzKS51bmJpbmRDb21wb25lbnRFdmVudH0gd2l0aCB2aXJ0dWFsIGNvbXBvbmVudHNcclxuICAgICAqL1xyXG4gICAgcmVsZWFzZUNvbXBvbmVudEV2ZW50OiBWaXJ0dWFsTGF5b3V0LlJlbGVhc2VDb21wb25lbnRFdmVudEhhbmRsZXIgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgYmluZENvbXBvbmVudEV2ZW50OiBWaXJ0dWFsTGF5b3V0LkJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgfCB1bmRlZmluZWQ7XHJcbiAgICB1bmJpbmRDb21wb25lbnRFdmVudDogVmlydHVhbExheW91dC5VbmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCBAZGVwcmVjYXRlZCB1c2Ugd2hpbGUgY29uc3RydWN0b3IgaXMgbm90IGRldGVybWluYXRlICovXHJcbiAgICBwcml2YXRlIF9iaW5kQ29tcG9uZW50RXZlbnRIYW5sZGVyUGFzc2VkSW5Db25zdHJ1Y3RvciA9IGZhbHNlOyAvLyByZW1vdmUgd2hlbiBjb25zdHJ1Y3RvciBpcyBkZXRlcm1pbmF0ZVxyXG4gICAgLyoqIEBpbnRlcm5hbCAgQGRlcHJlY2F0ZWQgdXNlIHdoaWxlIGNvbnN0cnVjdG9yIGlzIG5vdCBkZXRlcm1pbmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBfY3JlYXRpb25UaW1lb3V0UGFzc2VkID0gZmFsc2U7IC8vIHJlbW92ZSB3aGVuIGNvbnN0cnVjdG9yIGlzIGRldGVybWluYXRlXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0gY29udGFpbmVyIC0gQSBEb20gSFRNTCBlbGVtZW50LiBEZWZhdWx0cyB0byBib2R5XHJcbiAgICAgKiBAcGFyYW0gYmluZENvbXBvbmVudEV2ZW50SGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgdG8gYmluZCBjb21wb25lbnRzXHJcbiAgICAgKiBAcGFyYW0gYmluZENvbXBvbmVudEV2ZW50SGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgdG8gdW5iaW5kIGNvbXBvbmVudHNcclxuICAgICAqIElmIGJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgaXMgZGVmaW5lZCwgdGhlbiBjb25zdHJ1Y3RvciB3aWxsIGJlIGRldGVybWluYXRlLiBJdCB3aWxsIGFsd2F5cyBjYWxsIHRoZSBpbml0KClcclxuICAgICAqIGZ1bmN0aW9uIGFuZCB0aGUgaW5pdCgpIGZ1bmN0aW9uIHdpbGwgYWx3YXlzIGNvbXBsZXRlLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgd2lsbCBiZSBjYWxsZWRcclxuICAgICAqIGlmIGNvbnN0cnVjdG9yIGlzIGZvciBhIHBvcG91dCB3aW5kb3cuIE1ha2Ugc3VyZSBiaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyIGlzIHJlYWR5IGZvciBldmVudHMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIGNvbnRhaW5lcj86IEhUTUxFbGVtZW50LFxyXG4gICAgICAgIGJpbmRDb21wb25lbnRFdmVudEhhbmRsZXI/OiBWaXJ0dWFsTGF5b3V0LkJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIsXHJcbiAgICAgICAgdW5iaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyPzogVmlydHVhbExheW91dC5VbmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIsXHJcbiAgICApO1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIHNwZWNpZnkgbGF5b3V0Q29uZmlnIGluIHtAbGluayAoTGF5b3V0TWFuYWdlcjpjbGFzcykubG9hZExheW91dH0gKi9cclxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogTGF5b3V0Q29uZmlnLCBjb250YWluZXI/OiBIVE1MRWxlbWVudCk7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3Rvcihjb25maWdPck9wdGlvbmFsQ29udGFpbmVyOiBMYXlvdXRDb25maWcgfCBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCxcclxuICAgICAgICBjb250YWluZXJPckJpbmRDb21wb25lbnRFdmVudEhhbmRsZXI6IEhUTUxFbGVtZW50IHwgVmlydHVhbExheW91dC5CaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIHVuYmluZENvbXBvbmVudEV2ZW50SGFuZGxlcjogVmlydHVhbExheW91dC5VbmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgc2tpcEluaXQ6IHRydWUsXHJcbiAgICApO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IoY29uZmlnT3JPcHRpb25hbENvbnRhaW5lcjogTGF5b3V0Q29uZmlnIHwgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgY29udGFpbmVyT3JCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyPzogSFRNTEVsZW1lbnQgfCBWaXJ0dWFsTGF5b3V0LkJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIsXHJcbiAgICAgICAgdW5iaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyPzogVmlydHVhbExheW91dC5VbmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIsXHJcbiAgICAgICAgc2tpcEluaXQ/OiB0cnVlLFxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoVmlydHVhbExheW91dC5jcmVhdGVMYXlvdXRNYW5hZ2VyQ29uc3RydWN0b3JQYXJhbWV0ZXJzKGNvbmZpZ09yT3B0aW9uYWxDb250YWluZXIsIGNvbnRhaW5lck9yQmluZENvbXBvbmVudEV2ZW50SGFuZGxlcikpO1xyXG5cclxuICAgICAgICBpZiAoY29udGFpbmVyT3JCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjb250YWluZXJPckJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmluZENvbXBvbmVudEV2ZW50ID0gY29udGFpbmVyT3JCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYmluZENvbXBvbmVudEV2ZW50SGFubGRlclBhc3NlZEluQ29uc3RydWN0b3IgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh1bmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudW5iaW5kQ29tcG9uZW50RXZlbnQgPSB1bmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fYmluZENvbXBvbmVudEV2ZW50SGFubGRlclBhc3NlZEluQ29uc3RydWN0b3IpIHtcclxuICAgICAgICAgICAgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNTdWJXaW5kb3cpIHtcclxuICAgICAgICAgICAgICAgIC8vIGRvY3VtZW50LmJvZHkuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xyXG4gICAgICAgICAgICAgICAgLy8gU2V0IHVwIGxheW91dENvbmZpZyBzaW5jZSBjb25zdHJ1Y3RvciBpcyBub3QgZGV0ZXJtaW5hdGUgYW5kIG1heSBleGl0IGVhcmx5LiBPdGhlciBmdW5jdGlvbnMgbWF5IG5lZWRcclxuICAgICAgICAgICAgICAgIC8vIHRoaXMubGF5b3V0Q29uZmlnLiB0aGlzLmxheW91dENvbmZpZyBpcyBhZ2FpbiBjYWxjdWxhdGVkIGluIHRoZSBzYW1lIHdheSB3aGVuIGluaXQoKSBjb21wbGV0ZXMuXHJcbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhpcyB3aGVuIGNvbnN0cnVjdG9yIGlzIGRldGVybWluYXRlLlxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnN0cnVjdG9yT3JTdWJXaW5kb3dMYXlvdXRDb25maWcgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ1ZMQzk4ODIzJyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkTGF5b3V0Q29uZmlnID0gTGF5b3V0Q29uZmlnLnJlc29sdmUodGhpcy5fY29uc3RydWN0b3JPclN1YldpbmRvd0xheW91dENvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHJvb3QgZnJvbSBsYXlvdXRDb25maWdcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dENvbmZpZyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmVzb2x2ZWRMYXlvdXRDb25maWcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3Q6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChza2lwSW5pdCAhPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZGVwcmVjYXRlZENvbnN0cnVjdG9yKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvdmVycmlkZSBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYmluZENvbXBvbmVudEV2ZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMudW5iaW5kQ29tcG9uZW50RXZlbnQgPSB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIHRoZSBhY3R1YWwgbGF5b3V0LiBNdXN0IGJlIGNhbGxlZCBhZnRlciBhbGwgaW5pdGlhbCBjb21wb25lbnRzXHJcbiAgICAgKiBhcmUgcmVnaXN0ZXJlZC4gUmVjdXJzZXMgdGhyb3VnaCB0aGUgY29uZmlndXJhdGlvbiBhbmQgc2V0cyB1cFxyXG4gICAgICogdGhlIGl0ZW0gdHJlZS5cclxuICAgICAqXHJcbiAgICAgKiBJZiBjYWxsZWQgYmVmb3JlIHRoZSBkb2N1bWVudCBpcyByZWFkeSBpdCBhZGRzIGl0c2VsZiBhcyBhIGxpc3RlbmVyXHJcbiAgICAgKiB0byB0aGUgZG9jdW1lbnQucmVhZHkgZXZlbnRcclxuICAgICAqIEBkZXByZWNhdGVkIExheW91dENvbmZpZyBzaG91bGQgbm90IGJlIGxvYWRlZCBpbiB7QGxpbmsgKExheW91dE1hbmFnZXI6Y2xhc3MpfSBjb25zdHJ1Y3RvciwgYnV0IHJhdGhlciBpbiBhXHJcbiAgICAgKiB7QGxpbmsgKExheW91dE1hbmFnZXI6Y2xhc3MpLmxvYWRMYXlvdXR9IGNhbGwuICBJZiBMYXlvdXRDb25maWcgaXMgbm90IHNwZWNpZmllZCBpbiB7QGxpbmsgKExheW91dE1hbmFnZXI6Y2xhc3MpfSBjb25zdHJ1Y3RvcixcclxuICAgICAqIHRoZW4gaW5pdCgpIHdpbGwgYmUgYXV0b21hdGljYWxseSBjYWxsZWQgaW50ZXJuYWxseSBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZXh0ZXJuYWxseS5cclxuICAgICAqL1xyXG4gICAgb3ZlcnJpZGUgaW5pdCgpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgdGhlIGRvY3VtZW50IGlzbid0IHJlYWR5IHlldCwgd2FpdCBmb3IgaXQuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKCF0aGlzLl9iaW5kQ29tcG9uZW50RXZlbnRIYW5sZGVyUGFzc2VkSW5Db25zdHJ1Y3RvciAmJiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnIHx8IGRvY3VtZW50LmJvZHkgPT09IG51bGwpKSB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB0aGlzLmluaXQoKSwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0aGlzIGlzIGEgc3Vid2luZG93LCB3YWl0IGEgZmV3IG1pbGxpc2Vjb25kcyBmb3IgdGhlIG9yaWdpbmFsXHJcbiAgICAgICAgICogcGFnZSdzIGpzIGNhbGxzIHRvIGJlIGV4ZWN1dGVkLCB0aGVuIHJlcGxhY2UgdGhlIGJvZGllcyBjb250ZW50XHJcbiAgICAgICAgICogd2l0aCBHb2xkZW5MYXlvdXRcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoIXRoaXMuX2JpbmRDb21wb25lbnRFdmVudEhhbmxkZXJQYXNzZWRJbkNvbnN0cnVjdG9yICYmIHRoaXMuaXNTdWJXaW5kb3cgPT09IHRydWUgJiYgIXRoaXMuX2NyZWF0aW9uVGltZW91dFBhc3NlZCkge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuaW5pdCgpLCA3KTtcclxuICAgICAgICAgICAgdGhpcy5fY3JlYXRpb25UaW1lb3V0UGFzc2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNTdWJXaW5kb3cgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLl9iaW5kQ29tcG9uZW50RXZlbnRIYW5sZGVyUGFzc2VkSW5Db25zdHJ1Y3Rvcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhckh0bWxBbmRBZGp1c3RTdHlsZXNGb3JTdWJXaW5kb3coKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gRXhwb3NlIHRoaXMgaW5zdGFuY2Ugb24gdGhlIHdpbmRvdyBvYmplY3QgdG8gYWxsb3cgdGhlIG9wZW5pbmcgd2luZG93IHRvIGludGVyYWN0IHdpdGggaXRcclxuICAgICAgICAgICAgd2luZG93Ll9fZ2xJbnN0YW5jZSA9IHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdXBlci5pbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhcnMgZXhpc3RpbmcgSFRNTCBhbmQgYWRqdXN0cyBzdHlsZSB0byBtYWtlIHdpbmRvdyBzdWl0YWJsZSB0byBiZSBhIHBvcG91dCBzdWIgd2luZG93XHJcbiAgICAgKiBDdXJlbnRseSBpcyBhdXRvbWF0aWNhbGx5IGNhbGxlZCB3aGVuIHdpbmRvdyBpcyBhIHN1YldpbmRvdyBhbmQgYmluZENvbXBvbmVudEV2ZW50IGlzIG5vdCBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yXHJcbiAgICAgKiBJZiBiaW5kQ29tcG9uZW50RXZlbnQgaXMgbm90IHBhc3NlZCBpbiB0aGUgY29uc3RydWN0b3IsIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGVpdGhlciBjYWxsIHRoaXMgZnVuY3Rpb24gZXhwbGljaXRseSBvclxyXG4gICAgICogKHByZWZlcmFibHkpIG1ha2UgdGhlIHdpbmRvdyBzdWl0YWJsZSBhcyBhIHN1YndpbmRvdy5cclxuICAgICAqIEluIHRoZSBmdXR1cmUsIGl0IGlzIHBsYW5uZWQgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIE5PVCBhdXRvbWF0aWNhbGx5IGNhbGxlZCBpbiBhbnkgY2lyY3Vtc3RhbmNlcy4gIEFwcGxpY2F0aW9ucyB3aWxsXHJcbiAgICAgKiBuZWVkIHRvIGRldGVybWluZSB3aGV0aGVyIGEgd2luZG93IGlzIGEgR29sZGVuIExheW91dCBwb3BvdXQgd2luZG93IGFuZCBlaXRoZXIgY2FsbCB0aGlzIGZ1bmN0aW9uIGV4cGxpY2l0bHkgb3JcclxuICAgICAqIGhpZGUgSFRNTCBub3QgcmVsZXZhbnQgdG8gdGhlIHBvcG91dC5cclxuICAgICAqIFNlZSBhcGl0ZXN0IGZvciBhbiBleGFtcGxlIG9mIGhvdyBIVE1MIGlzIGhpZGRlbiB3aGVuIHBvcG91dCB3aW5kb3dzIGFyZSBkaXNwbGF5ZWRcclxuICAgICAqL1xyXG4gICAgY2xlYXJIdG1sQW5kQWRqdXN0U3R5bGVzRm9yU3ViV2luZG93KCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGhlYWRFbGVtZW50ID0gZG9jdW1lbnQuaGVhZDtcclxuXHJcbiAgICAgICAgY29uc3QgYXBwZW5kTm9kZUxpc3RzID0gbmV3IEFycmF5PE5vZGVMaXN0T2Y8RWxlbWVudD4+KDQpO1xyXG4gICAgICAgIGFwcGVuZE5vZGVMaXN0c1swXSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2JvZHkgbGluaycpO1xyXG4gICAgICAgIGFwcGVuZE5vZGVMaXN0c1sxXSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2JvZHkgc3R5bGUnKTtcclxuICAgICAgICBhcHBlbmROb2RlTGlzdHNbMl0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCd0ZW1wbGF0ZScpO1xyXG4gICAgICAgIGFwcGVuZE5vZGVMaXN0c1szXSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5nbF9rZWVwJyk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGxpc3RJZHggPSAwOyBsaXN0SWR4IDwgYXBwZW5kTm9kZUxpc3RzLmxlbmd0aDsgbGlzdElkeCsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFwcGVuZE5vZGVMaXN0ID0gYXBwZW5kTm9kZUxpc3RzW2xpc3RJZHhdO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBub2RlSWR4ID0gMDsgbm9kZUlkeCA8IGFwcGVuZE5vZGVMaXN0Lmxlbmd0aDsgbm9kZUlkeCsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gYXBwZW5kTm9kZUxpc3Rbbm9kZUlkeF07XHJcbiAgICAgICAgICAgICAgICBoZWFkRWxlbWVudC5hcHBlbmRDaGlsZChub2RlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgYm9keUVsZW1lbnQgPSBkb2N1bWVudC5ib2R5O1xyXG4gICAgICAgIGJvZHlFbGVtZW50LmlubmVySFRNTCA9ICcnO1xyXG4gICAgICAgIGJvZHlFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XHJcbiAgICAgICAgdGhpcy5jaGVja0FkZERlZmF1bHRQb3BpbkJ1dHRvbigpO1xyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICogVGhpcyBzZWVtcyBhIGJpdCBwb2ludGxlc3MsIGJ1dCBhY3R1YWxseSBjYXVzZXMgYSByZWZsb3cvcmUtZXZhbHVhdGlvbiBnZXR0aW5nIGFyb3VuZFxyXG4gICAgICAgICogc2xpY2tncmlkJ3MgXCJDYW5ub3QgZmluZCBzdHlsZXNoZWV0LlwiIGJ1ZyBpbiBjaHJvbWVcclxuICAgICAgICAqL1xyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgICAgICBjb25zdCB4ID0gZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFdpbGwgYWRkIGJ1dHRvbiBpZiBub3QgcG9waW5PbkNsb3NlIHNwZWNpZmllZCBpbiBzZXR0aW5nc1xyXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBhZGRlZCBvdGhlcndpc2UgZmFsc2VcclxuICAgICAqL1xyXG4gICAgY2hlY2tBZGREZWZhdWx0UG9waW5CdXR0b24oKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHRoaXMubGF5b3V0Q29uZmlnLnNldHRpbmdzLnBvcEluT25DbG9zZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgcG9wSW5CdXR0b25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIHBvcEluQnV0dG9uRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuUG9waW4pO1xyXG4gICAgICAgICAgICBwb3BJbkJ1dHRvbkVsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsIHRoaXMubGF5b3V0Q29uZmlnLmhlYWRlci5wb3Bpbik7XHJcbiAgICAgICAgICAgIGNvbnN0IGljb25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIGljb25FbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5JY29uKTtcclxuICAgICAgICAgICAgY29uc3QgYmdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgICAgIGJnRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuQmcpO1xyXG4gICAgICAgICAgICBwb3BJbkJ1dHRvbkVsZW1lbnQuYXBwZW5kQ2hpbGQoaWNvbkVsZW1lbnQpO1xyXG4gICAgICAgICAgICBwb3BJbkJ1dHRvbkVsZW1lbnQuYXBwZW5kQ2hpbGQoYmdFbGVtZW50KTtcclxuICAgICAgICAgICAgcG9wSW5CdXR0b25FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5lbWl0KCdwb3BJbicpKTtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChwb3BJbkJ1dHRvbkVsZW1lbnQpO1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgYmluZENvbXBvbmVudChjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgaXRlbUNvbmZpZzogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnKTogQ29tcG9uZW50Q29udGFpbmVyLkJpbmRhYmxlQ29tcG9uZW50IHtcclxuICAgICAgICBpZiAodGhpcy5iaW5kQ29tcG9uZW50RXZlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCBiaW5kYWJsZUNvbXBvbmVudCA9IHRoaXMuYmluZENvbXBvbmVudEV2ZW50KGNvbnRhaW5lciwgaXRlbUNvbmZpZyk7XHJcbiAgICAgICAgICAgIHJldHVybiBiaW5kYWJsZUNvbXBvbmVudDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5nZXRDb21wb25lbnRFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHZpcnR1YWw6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcy5nZXRDb21wb25lbnRFdmVudChjb250YWluZXIsIGl0ZW1Db25maWcpLFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8gY29tcG9uZW50IHJlZ2lzdGVyZWQgZm9yIHRoaXMgdHlwZSwgYW5kIHdlIGRvbid0IGhhdmUgYSBnZXRDb21wb25lbnRFdmVudCBkZWZpbmVkLlxyXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBtaWdodCBoYXBwZW4gd2hlbiB0aGUgdXNlciBwb3BzIG91dCBhIGRpYWxvZyBhbmQgdGhlIGNvbXBvbmVudCB0eXBlcyBhcmUgbm90IHJlZ2lzdGVyZWQgdXBmcm9udC5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSBpMThuU3RyaW5nc1tJMThuU3RyaW5nSWQuQ29tcG9uZW50VHlwZU5vdFJlZ2lzdGVyZWRBbmRCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyTm90QXNzaWduZWRdO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGAke3RleHR9OiAke0pTT04uc3RyaW5naWZ5KGl0ZW1Db25maWcpfWBcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBCaW5kRXJyb3IobWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgdW5iaW5kQ29tcG9uZW50KGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCB2aXJ0dWFsOiBib29sZWFuLCBjb21wb25lbnQ6IENvbXBvbmVudENvbnRhaW5lci5Db21wb25lbnQgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy51bmJpbmRDb21wb25lbnRFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMudW5iaW5kQ29tcG9uZW50RXZlbnQoY29udGFpbmVyKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoIXZpcnR1YWwgJiYgdGhpcy5yZWxlYXNlQ29tcG9uZW50RXZlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignVkNVQ1JDVTMzMzk5OCcpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbGVhc2VDb21wb25lbnRFdmVudChjb250YWluZXIsIGNvbXBvbmVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgVmlydHVhbExheW91dCB7XHJcbiAgICAvKipcclxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB2aXJ0dWFsIGNvbXBvbmVudHMgd2l0aCB7QGxpbmsgKFZpcnR1YWxMYXlvdXQ6Y2xhc3MpLmJpbmRDb21wb25lbnRFdmVudH0gYW5kXHJcbiAgICAgKiB7QGxpbmsgKFZpcnR1YWxMYXlvdXQ6Y2xhc3MpLnVuYmluZENvbXBvbmVudEV2ZW50fSBldmVudHMuXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCB0eXBlIEdldENvbXBvbmVudEV2ZW50SGFuZGxlciA9XHJcbiAgICAgICAgKHRoaXM6IHZvaWQsIGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCBpdGVtQ29uZmlnOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcpID0+IENvbXBvbmVudENvbnRhaW5lci5Db21wb25lbnQ7XHJcbiAgICAvKipcclxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB2aXJ0dWFsIGNvbXBvbmVudHMgd2l0aCB7QGxpbmsgKFZpcnR1YWxMYXlvdXQ6Y2xhc3MpLmJpbmRDb21wb25lbnRFdmVudH0gYW5kXHJcbiAgICAgKiB7QGxpbmsgKFZpcnR1YWxMYXlvdXQ6Y2xhc3MpLnVuYmluZENvbXBvbmVudEV2ZW50fSBldmVudHMuXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCB0eXBlIFJlbGVhc2VDb21wb25lbnRFdmVudEhhbmRsZXIgPVxyXG4gICAgICAgICh0aGlzOiB2b2lkLCBjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgY29tcG9uZW50OiBDb21wb25lbnRDb250YWluZXIuQ29tcG9uZW50KSA9PiB2b2lkO1xyXG5cclxuICAgIGV4cG9ydCB0eXBlIEJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgPVxyXG4gICAgICAgICh0aGlzOiB2b2lkLCBjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgaXRlbUNvbmZpZzogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnKSA9PiBDb21wb25lbnRDb250YWluZXIuQmluZGFibGVDb21wb25lbnQ7XHJcbiAgICBleHBvcnQgdHlwZSBVbmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgPVxyXG4gICAgICAgICh0aGlzOiB2b2lkLCBjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lcikgPT4gdm9pZDtcclxuXHJcbiAgICBleHBvcnQgdHlwZSBCZWZvcmVWaXJ0dWFsUmVjdGluZ0V2ZW50ID0gKHRoaXM6IHZvaWQpID0+IHZvaWQ7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbFxyXG4gICAgICogVmVyaWFibGUgdG8gaG9sZCB0aGUgc3RhdGUgd2hldGhlciB3ZSBhbHJlYWR5IGNoZWNrZWQgaWYgd2UgYXJlIHJ1bm5pbmcgaW4gYSBzdWIgd2luZG93LlxyXG4gICAgICogRml4ZXMgcG9wb3V0IGFuZCBjcmVhdGlvbiBvZiBuZXN0ZWQgZ29sZGVuLWxheW91dHMuXHJcbiAgICAgKi9cclxuICAgIGxldCBzdWJXaW5kb3dDaGVja2VkID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxheW91dE1hbmFnZXJDb25zdHJ1Y3RvclBhcmFtZXRlcnMoY29uZmlnT3JPcHRpb25hbENvbnRhaW5lcjogTGF5b3V0Q29uZmlnIHwgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgY29udGFpbmVyT3JCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyPzogSFRNTEVsZW1lbnQgfCAgVmlydHVhbExheW91dC5CaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyKTpcclxuICAgICAgICBMYXlvdXRNYW5hZ2VyLkNvbnN0cnVjdG9yUGFyYW1ldGVyc1xyXG4gICAge1xyXG4gICAgICAgIGNvbnN0IHdpbmRvd0NvbmZpZ0tleSA9IHN1YldpbmRvd0NoZWNrZWQgPyBudWxsIDogbmV3IFVSTChkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KCdnbC13aW5kb3cnKTtcclxuICAgICAgICBzdWJXaW5kb3dDaGVja2VkID0gdHJ1ZTtcclxuICAgICAgICBjb25zdCBpc1N1YldpbmRvdyA9IHdpbmRvd0NvbmZpZ0tleSAhPT0gbnVsbDtcclxuXHJcbiAgICAgICAgbGV0IGNvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGxldCBjb25maWc6IExheW91dENvbmZpZyB8IHVuZGVmaW5lZDtcclxuICAgICAgICBpZiAod2luZG93Q29uZmlnS2V5ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHdpbmRvd0NvbmZpZ1N0ciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHdpbmRvd0NvbmZpZ0tleSk7XHJcbiAgICAgICAgICAgIGlmICh3aW5kb3dDb25maWdTdHIgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTnVsbCBnbC13aW5kb3cgQ29uZmlnJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0od2luZG93Q29uZmlnS2V5KTtcclxuICAgICAgICAgICAgY29uc3QgbWluaWZpZWRXaW5kb3dDb25maWcgPSBKU09OLnBhcnNlKHdpbmRvd0NvbmZpZ1N0cikgYXMgUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWc7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkQ29uZmlnID0gUmVzb2x2ZWRMYXlvdXRDb25maWcudW5taW5pZnlDb25maWcobWluaWZpZWRXaW5kb3dDb25maWcpO1xyXG4gICAgICAgICAgICBjb25maWcgPSBMYXlvdXRDb25maWcuZnJvbVJlc29sdmVkKHJlc29sdmVkQ29uZmlnKVxyXG5cclxuICAgICAgICAgICAgaWYgKGNvbmZpZ09yT3B0aW9uYWxDb250YWluZXIgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyRWxlbWVudCA9IGNvbmZpZ09yT3B0aW9uYWxDb250YWluZXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoY29uZmlnT3JPcHRpb25hbENvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25maWcgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29uZmlnT3JPcHRpb25hbENvbnRhaW5lciBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lckVsZW1lbnQgPSBjb25maWdPck9wdGlvbmFsQ29udGFpbmVyO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IGNvbmZpZ09yT3B0aW9uYWxDb250YWluZXI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChjb250YWluZXJFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb250YWluZXJPckJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lckVsZW1lbnQgPSBjb250YWluZXJPckJpbmRDb21wb25lbnRFdmVudEhhbmRsZXI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGNvbnN0cnVjdG9yT3JTdWJXaW5kb3dMYXlvdXRDb25maWc6IGNvbmZpZyxcclxuICAgICAgICAgICAgaXNTdWJXaW5kb3csXHJcbiAgICAgICAgICAgIGNvbnRhaW5lckVsZW1lbnQsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsImV4cG9ydCAqIGZyb20gJy4vdHMvY29uZmlnL2NvbmZpZyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vdHMvY29uZmlnL3Jlc29sdmVkLWNvbmZpZyc7XHJcbmV4cG9ydCB7IENvbXBvbmVudENvbnRhaW5lciB9IGZyb20gJy4vdHMvY29udGFpbmVyL2NvbXBvbmVudC1jb250YWluZXInO1xyXG5leHBvcnQgeyBCcm93c2VyUG9wb3V0IH0gZnJvbSAnLi90cy9jb250cm9scy9icm93c2VyLXBvcG91dCc7XHJcbmV4cG9ydCB7IERyYWdTb3VyY2UgfSBmcm9tICcuL3RzL2NvbnRyb2xzL2RyYWctc291cmNlJztcclxuZXhwb3J0IHsgSGVhZGVyIH0gZnJvbSAnLi90cy9jb250cm9scy9oZWFkZXInO1xyXG5leHBvcnQgeyBUYWIgfSBmcm9tICcuL3RzL2NvbnRyb2xzL3RhYic7XHJcbmV4cG9ydCAqIGZyb20gJy4vdHMvZXJyb3JzL2V4dGVybmFsLWVycm9yJztcclxuZXhwb3J0IHsgR29sZGVuTGF5b3V0IH0gZnJvbSAnLi90cy9nb2xkZW4tbGF5b3V0JztcclxuZXhwb3J0IHsgQ29tcG9uZW50SXRlbSB9IGZyb20gJy4vdHMvaXRlbXMvY29tcG9uZW50LWl0ZW0nO1xyXG5leHBvcnQgeyBDb250ZW50SXRlbSB9IGZyb20gJy4vdHMvaXRlbXMvY29udGVudC1pdGVtJztcclxuZXhwb3J0IHsgUm93T3JDb2x1bW4gfSBmcm9tICcuL3RzL2l0ZW1zL3Jvdy1vci1jb2x1bW4nO1xyXG5leHBvcnQgeyBTdGFjayB9IGZyb20gJy4vdHMvaXRlbXMvc3RhY2snO1xyXG5leHBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi90cy9sYXlvdXQtbWFuYWdlcic7XHJcbmV4cG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4vdHMvdXRpbHMvZXZlbnQtZW1pdHRlcic7XHJcbmV4cG9ydCB7IEV2ZW50SHViIH0gZnJvbSAnLi90cy91dGlscy9ldmVudC1odWInO1xyXG5leHBvcnQgKiBmcm9tICcuL3RzL3V0aWxzL2kxOG4tc3RyaW5ncyc7XHJcbmV4cG9ydCB7IFN0eWxlQ29uc3RhbnRzIH0gZnJvbSAnLi90cy91dGlscy9zdHlsZS1jb25zdGFudHMnO1xyXG5leHBvcnQgKiBmcm9tICcuL3RzL3V0aWxzL3R5cGVzJztcclxuZXhwb3J0IHsgVmlydHVhbExheW91dCB9IGZyb20gJy4vdHMvdmlydHVhbC1sYXlvdXQnO1xyXG5cclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9idW5kbGUvdW1kL2dvbGRlbi1sYXlvdXQuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1Y4RDtBQUN5QztBQUNyQztBQUN1QjtBQUNOO0FBVXhEO0FBbUYzQixjQUFjO0FBQ1AsSUFBVSxVQUFVLENBMEkxQjtBQTFJRCxXQUFpQixVQUFVO0lBUXZCLGdCQUFnQjtJQUNoQixTQUFnQixPQUFPLENBQUMsVUFBc0IsRUFBRSxrQ0FBMkM7UUFDdkYsUUFBUSxVQUFVLENBQUMsSUFBSSxFQUFFO1lBQ3JCLEtBQUssa0RBQVEsQ0FBQyxNQUFNO2dCQUNoQixNQUFNLElBQUksc0VBQWtCLENBQUMsdUNBQXVDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ3RHLEtBQUssa0RBQVEsQ0FBQyxHQUFHLENBQUM7WUFDbEIsS0FBSyxrREFBUSxDQUFDLE1BQU07Z0JBQ2hCLE9BQU8scUJBQXFCLENBQUMsT0FBTyxDQUFDLFVBQW1DLEVBQUUsa0NBQWtDLENBQUMsQ0FBQztZQUVsSCxLQUFLLGtEQUFRLENBQUMsS0FBSztnQkFDZixPQUFPLGVBQWUsQ0FBQyxPQUFPLENBQUMsVUFBNkIsRUFBRSxrQ0FBa0MsQ0FBQyxDQUFDO1lBRXRHLEtBQUssa0RBQVEsQ0FBQyxTQUFTO2dCQUNuQixPQUFPLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxVQUFpQyxFQUFFLGtDQUFrQyxDQUFDLENBQUM7WUFFOUc7Z0JBQ0ksTUFBTSxJQUFJLHdFQUFvQixDQUFDLGFBQWEsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdEU7SUFDTCxDQUFDO0lBakJlLGtCQUFPLFVBaUJ0QjtJQUVELGdCQUFnQjtJQUNoQixTQUFnQixjQUFjLENBQUMsT0FBaUM7UUFDNUQsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFO1lBQ3ZCLE9BQU8sRUFBRSxDQUFDO1NBQ2I7YUFBTTtZQUNILE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFDN0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQXFCLEtBQUssQ0FBQyxDQUFDO1lBQ3BELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzVCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUNyRDtZQUNELE9BQU8sTUFBTSxDQUFDO1NBQ2pCO0lBQ0wsQ0FBQztJQVhlLHlCQUFjLGlCQVc3QjtJQUVELGdCQUFnQjtJQUNoQixTQUFnQixTQUFTLENBQUMsRUFBaUM7UUFDdkQsSUFBSSxFQUFFLEtBQUssU0FBUyxFQUFFO1lBQ2xCLE9BQU8sZ0VBQWtCLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztTQUN6QzthQUFNO1lBQ0gsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUNuQixJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO29CQUNqQixPQUFPLGdFQUFrQixDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7aUJBQ3pDO3FCQUFNO29CQUNILE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNoQjthQUNKO2lCQUFNO2dCQUNILE9BQU8sRUFBRSxDQUFDO2FBQ2I7U0FDSjtJQUNMLENBQUM7SUFkZSxvQkFBUyxZQWN4QjtJQUVELGdCQUFnQjtJQUNoQixTQUFnQixXQUFXLENBQ3ZCLElBQXdCLEVBQ3hCLEtBQXlCLEVBQ3pCLE1BQTBCLEVBQzFCLGtDQUEyQztRQUUzQyxtRkFBbUY7UUFFbkYsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQ3BCLE9BQU8sU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLHNEQUFZLENBQUMsT0FBTyxFQUFFLHNEQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztTQUMzRTthQUFNO1lBQ0gsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7Z0JBQzdDLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtvQkFDckIsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLHNEQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7aUJBQzFEO3FCQUFNO29CQUNILElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTt3QkFDdEIsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLHNEQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7cUJBQzNEO3lCQUFNO3dCQUNILE1BQU0sSUFBSSw0RUFBd0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztxQkFDbEQ7aUJBQ0o7YUFDSjtpQkFBTTtnQkFDSCxJQUFJLGtDQUFrQyxFQUFFO29CQUNwQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsc0RBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztpQkFDdkQ7cUJBQU07b0JBQ0gsT0FBTyxFQUFFLElBQUksRUFBRSxnRUFBa0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxnRUFBa0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7aUJBQ3JHO2FBQ0o7U0FDSjtJQUNMLENBQUM7SUE3QmUsc0JBQVcsY0E2QjFCO0lBRUQsZ0JBQWdCO0lBQ2hCLFNBQWdCLGNBQWMsQ0FBQyxPQUEyQixFQUFFLFFBQTRCLEVBQUUsU0FBNkI7UUFDbkgsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFO1lBQ3ZCLE9BQU8sU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLHNEQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUNuRDthQUFNO1lBQ0gsTUFBTSxlQUFlLEdBQUcsUUFBUSxLQUFLLFNBQVMsQ0FBQztZQUMvQyxNQUFNLGdCQUFnQixHQUFHLFNBQVMsS0FBSyxTQUFTLENBQUM7WUFDakQsSUFBSSxlQUFlLElBQUksZ0JBQWdCLEVBQUU7Z0JBQ3JDLElBQUksZUFBZSxFQUFFO29CQUNqQixPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsc0RBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDM0Q7cUJBQU07b0JBQ0gsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLHNEQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7aUJBQzVEO2FBQ0o7aUJBQU07Z0JBQ0gsT0FBTyxFQUFFLElBQUksRUFBRSxnRUFBa0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxnRUFBa0IsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7YUFDM0c7U0FDSjtJQUNMLENBQUM7SUFoQmUseUJBQWMsaUJBZ0I3QjtJQUVELGdCQUFnQjtJQUNoQixTQUFnQix5Q0FBeUMsQ0FBQyxNQUFrQjtRQUN4RSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQzNCLG9CQUE2QztTQUNoRDthQUFNO1lBQ0gsSUFBSSxNQUFNLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRTtnQkFDM0QsNkJBQXNEO2FBQ3pEO2lCQUFNO2dCQUNILG9CQUE2QzthQUNoRDtTQUNKO0lBQ0wsQ0FBQztJQVZlLG9EQUF5Qyw0Q0FVeEQ7SUFFRCxTQUFnQixRQUFRLENBQUMsTUFBa0I7UUFDdkMsT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLGtEQUFRLENBQUMsTUFBTSxDQUFDO0lBQzNDLENBQUM7SUFGZSxtQkFBUSxXQUV2QjtJQUNELFNBQWdCLEtBQUssQ0FBQyxNQUFrQjtRQUNwQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLEtBQUssa0RBQVEsQ0FBQyxHQUFHLENBQUM7SUFDeEMsQ0FBQztJQUZlLGdCQUFLLFFBRXBCO0lBQ0QsU0FBZ0IsUUFBUSxDQUFDLE1BQWtCO1FBQ3ZDLE9BQU8sTUFBTSxDQUFDLElBQUksS0FBSyxrREFBUSxDQUFDLE1BQU0sQ0FBQztJQUMzQyxDQUFDO0lBRmUsbUJBQVEsV0FFdkI7SUFDRCxTQUFnQixPQUFPLENBQUMsTUFBa0I7UUFDdEMsT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLGtEQUFRLENBQUMsS0FBSyxDQUFDO0lBQzFDLENBQUM7SUFGZSxrQkFBTyxVQUV0QjtJQUNELFNBQWdCLFdBQVcsQ0FBQyxNQUFrQjtRQUMxQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLEtBQUssa0RBQVEsQ0FBQyxTQUFTLENBQUM7SUFDOUMsQ0FBQztJQUZlLHNCQUFXLGNBRTFCO0FBQ0wsQ0FBQyxFQTFJZ0IsVUFBVSxLQUFWLFVBQVUsUUEwSTFCO0FBV0QsY0FBYztBQUNQLElBQVUsa0JBQWtCLENBaUVsQztBQWpFRCxXQUFpQixrQkFBa0I7SUFDL0IsTUFBTSxpQkFBaUIsR0FBRyxlQUFlLENBQUM7SUFZMUMsSUFBaUIsTUFBTSxDQWdCdEI7SUFoQkQsV0FBaUIsTUFBTTtRQUNuQixTQUFnQixPQUFPLENBQUMsTUFBMEIsRUFBRSxVQUErQjs7WUFDL0UsSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUU7Z0JBQ2xELE9BQU8sU0FBUyxDQUFDO2FBQ3BCO2lCQUFNO2dCQUNILE1BQU0sTUFBTSxHQUFzQztvQkFDOUMsSUFBSSxFQUFFLFlBQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxJQUFJLG1DQUFJLENBQUMsVUFBVSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGtFQUFvQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7b0JBQzdILE1BQU0sRUFBRSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsTUFBTTtvQkFDdEIsUUFBUSxFQUFFLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxRQUFRO29CQUMxQixLQUFLLEVBQUUsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLEtBQUs7b0JBQ3BCLFFBQVEsRUFBRSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsUUFBUTtvQkFDMUIsV0FBVyxFQUFFLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxXQUFXO2lCQUNuQztnQkFDRCxPQUFPLE1BQU0sQ0FBQzthQUNqQjtRQUNMLENBQUM7UUFkZSxjQUFPLFVBY3RCO0lBQ0wsQ0FBQyxFQWhCZ0IsTUFBTSxHQUFOLHlCQUFNLEtBQU4seUJBQU0sUUFnQnRCO0lBRUQsZ0JBQWdCO0lBQ2hCLFNBQWdCLHFCQUFxQixDQUFDLE1BQTBCO1FBQzVELElBQUksRUFBVSxDQUFDO1FBQ2Ysd0hBQXdIO1FBQ3hILElBQUksUUFBUSxHQUFrQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ3hELElBQUksZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM1QixJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDeEIsRUFBRSxHQUFHLGdFQUFrQixDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7U0FDdkM7YUFBTTtZQUNILElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDekIsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLGlCQUFpQixDQUFDO2dCQUNoRSxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUU7b0JBQ1QsZUFBZSxHQUFHLElBQUksQ0FBQztvQkFDdkIsUUFBUSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUN0QztnQkFDRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUNyQixFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNwQjtxQkFBTTtvQkFDSCxFQUFFLEdBQUcsZ0VBQWtCLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztpQkFDdkM7YUFDSjtpQkFBTTtnQkFDSCxFQUFFLEdBQUcsUUFBUSxDQUFDO2FBQ2pCO1NBQ0o7UUFFRCxJQUFJLFNBQWtCLENBQUM7UUFDdkIsSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRTtZQUNoQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztTQUNoQzthQUFNO1lBQ0gsU0FBUyxHQUFHLGVBQWUsQ0FBQztTQUMvQjtRQUVELE9BQU8sRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFO0lBQzVCLENBQUM7SUFoQ2Usd0NBQXFCLHdCQWdDcEM7QUFDTCxDQUFDLEVBakVnQixrQkFBa0IsS0FBbEIsa0JBQWtCLFFBaUVsQztBQVVELGNBQWM7QUFDUCxJQUFVLGVBQWUsQ0FzRS9CO0FBdEVELFdBQWlCLGVBQWU7SUFDNUIsZ0JBQWdCO0lBQ2hCLFNBQWdCLE9BQU8sQ0FBQyxVQUEyQixFQUFFLGtDQUEyQzs7UUFDNUYsTUFBTSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvRSxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsa0NBQWtDLENBQUMsQ0FBQztRQUM1SSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTFJLE1BQU0sTUFBTSxHQUE0QjtZQUNwQyxJQUFJLEVBQUUsa0RBQVEsQ0FBQyxLQUFLO1lBQ3BCLE9BQU8sRUFBRSxjQUFjLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQztZQUMzQyxJQUFJO1lBQ0osUUFBUTtZQUNSLE9BQU87WUFDUCxXQUFXO1lBQ1gsRUFBRTtZQUNGLFNBQVM7WUFDVCxVQUFVLEVBQUUsZ0JBQVUsQ0FBQyxVQUFVLG1DQUFJLGdFQUFrQixDQUFDLFFBQVEsQ0FBQyxVQUFVO1lBQzNFLGVBQWUsRUFBRSxnQkFBVSxDQUFDLGVBQWUsbUNBQUkscUVBQXVCLENBQUMsc0JBQXNCO1lBQzdGLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQztTQUN0RixDQUFDO1FBQ0YsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQW5CZSx1QkFBTyxVQW1CdEI7SUFFRCxnQkFBZ0I7SUFDaEIsU0FBZ0IsWUFBWSxDQUFDLGNBQXVDO1FBQ2hFLE1BQU0sTUFBTSxHQUFvQjtZQUM1QixJQUFJLEVBQUUsa0RBQVEsQ0FBQyxLQUFLO1lBQ3BCLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDO1lBQ3BELElBQUksRUFBRSxVQUFVLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsUUFBUSxDQUFDO1lBQzlELE9BQU8sRUFBRSxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxXQUFXLENBQUM7WUFDbEYsRUFBRSxFQUFFLGNBQWMsQ0FBQyxFQUFFO1lBQ3JCLFNBQVMsRUFBRSxjQUFjLENBQUMsU0FBUztZQUNuQyxVQUFVLEVBQUUsY0FBYyxDQUFDLFVBQVU7WUFDckMsZUFBZSxFQUFFLGNBQWMsQ0FBQyxlQUFlO1lBQy9DLE1BQU0sRUFBRSx3RUFBMEIsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUM7U0FDOUUsQ0FBQztRQUVGLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFkZSw0QkFBWSxlQWMzQjtJQUVELGdCQUFnQjtJQUNoQixTQUFTLGNBQWMsQ0FBQyxPQUEwQztRQUM5RCxJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUU7WUFDdkIsT0FBTyxFQUFFLENBQUM7U0FDYjthQUFNO1lBQ0gsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztZQUM3QixNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBOEIsS0FBSyxDQUFDLENBQUM7WUFDN0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDNUIsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuQyxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDOUQsSUFBSSxDQUFDLGdFQUFrQixDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsRUFBRTtvQkFDakQsTUFBTSxJQUFJLCtEQUFXLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztpQkFDdEU7cUJBQU07b0JBQ0gsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQztpQkFDMUI7YUFDSjtZQUNELE9BQU8sTUFBTSxDQUFDO1NBQ2pCO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixTQUFTLG1CQUFtQixDQUFDLGVBQThDO1FBQ3ZFLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUM7UUFDckMsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQXNCLEtBQUssQ0FBQyxDQUFDO1FBQ3JELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDNUIsTUFBTSxxQkFBcUIsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakQsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1NBQ3ZFO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztBQUNMLENBQUMsRUF0RWdCLGVBQWUsS0FBZixlQUFlLFFBc0UvQjtBQXdDRCxjQUFjO0FBQ1AsSUFBVSxtQkFBbUIsQ0FtRW5DO0FBbkVELFdBQWlCLG1CQUFtQjtJQUNoQyxnQkFBZ0I7SUFDaEIsU0FBZ0IsT0FBTyxDQUFDLFVBQStCLEVBQUUsa0NBQTJDOztRQUNoRyxJQUFJLGFBQWEsR0FBMEIsVUFBVSxDQUFDLGFBQWEsQ0FBQztRQUNwRSxJQUFJLGFBQWEsS0FBSyxTQUFTLEVBQUU7WUFDN0IsYUFBYSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUM7U0FDNUM7UUFDRCxJQUFJLGFBQWEsS0FBSyxTQUFTLEVBQUU7WUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO1NBQ3JFO2FBQU07WUFDSCxNQUFNLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLGtCQUFrQixDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQy9FLElBQUksS0FBYSxDQUFDO1lBQ2xCLElBQUksVUFBVSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksVUFBVSxDQUFDLEtBQUssS0FBSyxFQUFFLEVBQUU7Z0JBQzNELEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUNuRTtpQkFBTTtnQkFDSCxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQzthQUM1QjtZQUNELE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLE1BQU0sRUFBRSxrQ0FBa0MsQ0FBQyxDQUFDO1lBQzVJLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUksTUFBTSxNQUFNLEdBQWdDO2dCQUN4QyxJQUFJLEVBQUUsVUFBVSxDQUFDLElBQUk7Z0JBQ3JCLE9BQU8sRUFBRSxFQUFFO2dCQUNYLElBQUk7Z0JBQ0osUUFBUTtnQkFDUixPQUFPO2dCQUNQLFdBQVc7Z0JBQ1gsRUFBRTtnQkFDRixTQUFTO2dCQUNULFVBQVUsRUFBRSxnQkFBVSxDQUFDLFVBQVUsbUNBQUksZ0VBQWtCLENBQUMsUUFBUSxDQUFDLFVBQVU7Z0JBQzNFLGNBQWMsRUFBRSxnQkFBVSxDQUFDLGNBQWMsbUNBQUkseUVBQTJCLENBQUMscUJBQXFCO2dCQUM5RixLQUFLO2dCQUNMLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQztnQkFDbkYsYUFBYTtnQkFDYixjQUFjLEVBQUUsZ0JBQVUsQ0FBQyxjQUFjLG1DQUFJLEVBQUU7YUFDbEQsQ0FBQztZQUNGLE9BQU8sTUFBTSxDQUFDO1NBQ2pCO0lBQ0wsQ0FBQztJQW5DZSwyQkFBTyxVQW1DdEI7SUFFRCxnQkFBZ0I7SUFDaEIsU0FBZ0IsWUFBWSxDQUFDLGNBQTJDO1FBQ3BFLE1BQU0sTUFBTSxHQUF3QjtZQUNoQyxJQUFJLEVBQUUsa0RBQVEsQ0FBQyxTQUFTO1lBQ3hCLElBQUksRUFBRSxVQUFVLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsUUFBUSxDQUFDO1lBQzlELE9BQU8sRUFBRSxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxXQUFXLENBQUM7WUFDbEYsRUFBRSxFQUFFLGNBQWMsQ0FBQyxFQUFFO1lBQ3JCLFNBQVMsRUFBRSxjQUFjLENBQUMsU0FBUztZQUNuQyxVQUFVLEVBQUUsY0FBYyxDQUFDLFVBQVU7WUFDckMsY0FBYyxFQUFFLGNBQWMsQ0FBQyxjQUFjO1lBQzdDLEtBQUssRUFBRSxjQUFjLENBQUMsS0FBSztZQUMzQixNQUFNLEVBQUUsd0VBQTBCLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDO1lBQzNFLGFBQWEsRUFBRSxjQUFjLENBQUMsYUFBYTtZQUMzQyxjQUFjLEVBQUUsNkRBQWUsQ0FBQyxTQUFTLEVBQUUsY0FBYyxDQUFDLGNBQWMsQ0FBYztTQUN6RjtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFoQmUsZ0NBQVksZUFnQjNCO0lBRUQsU0FBZ0Isb0JBQW9CLENBQUMsYUFBd0I7UUFDekQsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLGFBQWEsQ0FBQztRQUMvQyxRQUFRLGlCQUFpQixFQUFFO1lBQ3ZCLEtBQUssUUFBUSxDQUFDLENBQUMsT0FBTyxhQUF1QixDQUFDO1lBQzlDLEtBQUssUUFBUSxDQUFDLENBQUMsT0FBUSxhQUF3QixDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzNELEtBQUssU0FBUyxDQUFDLENBQUMsT0FBUSxhQUF5QixDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzdELE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ3RCO0lBQ0wsQ0FBQztJQVJlLHdDQUFvQix1QkFRbkM7QUFDTCxDQUFDLEVBbkVnQixtQkFBbUIsS0FBbkIsbUJBQW1CLFFBbUVuQztBQVNELGNBQWM7QUFDUCxJQUFVLHFCQUFxQixDQW9JckM7QUFwSUQsV0FBaUIscUJBQXFCO0lBR2xDLFNBQWdCLGlCQUFpQixDQUFDLFVBQXNCO1FBQ3BELFFBQVEsVUFBVSxDQUFDLElBQUksRUFBRTtZQUNyQixLQUFLLGtEQUFRLENBQUMsR0FBRyxDQUFDO1lBQ2xCLEtBQUssa0RBQVEsQ0FBQyxNQUFNLENBQUM7WUFDckIsS0FBSyxrREFBUSxDQUFDLEtBQUssQ0FBQztZQUNwQixLQUFLLGtEQUFRLENBQUMsU0FBUztnQkFDbkIsT0FBTyxJQUFJLENBQUM7WUFDaEIsS0FBSyxrREFBUSxDQUFDLE1BQU07Z0JBQ2hCLE9BQU8sS0FBSyxDQUFDO1lBQ2pCO2dCQUNJLE1BQU0sSUFBSSx3RUFBb0IsQ0FBQyxtQkFBbUIsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDNUU7SUFDTCxDQUFDO0lBWmUsdUNBQWlCLG9CQVloQztJQUVELGdCQUFnQjtJQUNoQixTQUFnQixPQUFPLENBQUMsVUFBaUMsRUFBRSxrQ0FBMkM7O1FBQ2xHLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLE1BQU0sRUFBRSxrQ0FBa0MsQ0FBQyxDQUFDO1FBQzVJLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsR0FBRyxVQUFVLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUksTUFBTSxNQUFNLEdBQWtDO1lBQzFDLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSTtZQUNyQixPQUFPLEVBQUUscUJBQXFCLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7WUFDakUsSUFBSTtZQUNKLFFBQVE7WUFDUixPQUFPO1lBQ1AsV0FBVztZQUNYLEVBQUUsRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDdkMsVUFBVSxFQUFFLGdCQUFVLENBQUMsVUFBVSxtQ0FBSSxnRUFBa0IsQ0FBQyxRQUFRLENBQUMsVUFBVTtTQUM5RTtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFkZSw2QkFBTyxVQWN0QjtJQUVELGdCQUFnQjtJQUNoQixTQUFnQixZQUFZLENBQUMsY0FBNkM7UUFDdEUsTUFBTSxNQUFNLEdBQTBCO1lBQ2xDLElBQUksRUFBRSxjQUFjLENBQUMsSUFBSTtZQUN6QixPQUFPLEVBQUUsbUJBQW1CLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQztZQUNwRCxJQUFJLEVBQUUsVUFBVSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLFFBQVEsQ0FBQztZQUM5RCxPQUFPLEVBQUUscUJBQXFCLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsV0FBVyxDQUFDO1lBQ2xGLEVBQUUsRUFBRSxjQUFjLENBQUMsRUFBRTtZQUNyQixVQUFVLEVBQUUsY0FBYyxDQUFDLFVBQVU7U0FDeEM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBWGUsa0NBQVksZUFXM0I7SUFFRCxnQkFBZ0I7SUFDaEIsU0FBZ0IsY0FBYyxDQUFDLE9BQXNDO1FBQ2pFLElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRTtZQUN2QixPQUFPLEVBQUUsQ0FBQztTQUNiO2FBQU07WUFDSCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1lBQzdCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxLQUFLLENBQXdDLEtBQUssQ0FBQyxDQUFDO1lBQ2pGLElBQUksaUNBQWlDLEdBQUcsS0FBSyxDQUFDO1lBQzlDLElBQUksd0JBQXdCLEdBQUcsS0FBSyxDQUFDO1lBQ3JDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzVCLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxFQUFFO29CQUMzRCxNQUFNLElBQUksc0VBQWtCLENBQUMsd0NBQXdDLEVBQUUsZUFBZSxDQUFDLENBQUM7aUJBQzNGO3FCQUFNO29CQUNILElBQUksQ0FBQyx3QkFBd0IsRUFBRTt3QkFDM0IsTUFBTSxnQ0FBZ0MsR0FBRyxVQUFVLENBQUMseUNBQXlDLENBQUMsZUFBZSxDQUFDLENBQUM7d0JBQy9HLFFBQVEsZ0NBQWdDLEVBQUU7NEJBQ3RDO2dDQUNJLE1BQU07NEJBQ1Y7Z0NBQ0ksaUNBQWlDLEdBQUcsSUFBSSxDQUFDO2dDQUN6QyxNQUFNOzRCQUNWO2dDQUNJLHdCQUF3QixHQUFHLElBQUksQ0FBQztnQ0FDaEMsTUFBTTs0QkFDVjtnQ0FDSSxNQUFNLElBQUksd0VBQW9CLENBQUMsY0FBYyxFQUFFLGdDQUFnQyxDQUFDLENBQUM7eUJBQ3hGO3FCQUNKO29CQUNELGdCQUFnQixDQUFDLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQztpQkFDekM7YUFDSjtZQUVELElBQUksaUJBQTBCLENBQUM7WUFDL0IsSUFBSSx3QkFBd0IsRUFBRTtnQkFDMUIsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO2FBQzdCO2lCQUFNO2dCQUNILElBQUksaUNBQWlDLEVBQUU7b0JBQ25DLGlCQUFpQixHQUFHLElBQUksQ0FBQztpQkFDNUI7cUJBQU07b0JBQ0gsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO2lCQUM3QjthQUNKO1lBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQWdELEtBQUssQ0FBQyxDQUFDO1lBQy9FLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzVCLE1BQU0sZUFBZSxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1QyxNQUFNLHVCQUF1QixHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLGlCQUFpQixDQUFDLENBQUM7Z0JBQ3ZGLElBQUksQ0FBQywyRUFBNkIsQ0FBQyxpQkFBaUIsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFO29CQUMzRSxNQUFNLElBQUksK0RBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQztpQkFDcEY7cUJBQU07b0JBQ0gsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLHVCQUF1QixDQUFDO2lCQUN2QzthQUNKO1lBQ0QsT0FBTyxNQUFNLENBQUM7U0FDakI7SUFDTCxDQUFDO0lBdkRlLG9DQUFjLGlCQXVEN0I7SUFFRCxnQkFBZ0I7SUFDaEIsU0FBUyxtQkFBbUIsQ0FBQyxlQUF5RTtRQUNsRyxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxDQUF3QyxLQUFLLENBQUMsQ0FBQztRQUN2RSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzVCLE1BQU0scUJBQXFCLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sSUFBSSxHQUFHLHFCQUFxQixDQUFDLElBQUksQ0FBQztZQUN4QyxJQUFJLGFBQW9ELENBQUM7WUFDekQsUUFBUSxJQUFJLEVBQUU7Z0JBQ1YsS0FBSyxrREFBUSxDQUFDLEdBQUcsQ0FBQztnQkFDbEIsS0FBSyxrREFBUSxDQUFDLE1BQU07b0JBQ2hCLGFBQWEsR0FBRyxxQkFBcUIsQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsQ0FBQztvQkFDMUUsTUFBTTtnQkFDVixLQUFLLGtEQUFRLENBQUMsS0FBSztvQkFDZixhQUFhLEdBQUcsZUFBZSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO29CQUNwRSxNQUFNO2dCQUNWLEtBQUssa0RBQVEsQ0FBQyxTQUFTO29CQUNuQixhQUFhLEdBQUcsbUJBQW1CLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUFDLENBQUM7b0JBQ3hFLE1BQU07Z0JBQ1Y7b0JBQ0ksTUFBTSxJQUFJLHdFQUFvQixDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUM3RDtZQUNELE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUM7U0FDN0I7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0FBQ0wsQ0FBQyxFQXBJZ0IscUJBQXFCLEtBQXJCLHFCQUFxQixRQW9JckM7QUFLRCxjQUFjO0FBQ1AsSUFBVSxjQUFjLENBZ0Q5QjtBQWhERCxXQUFpQixjQUFjO0lBQzNCLFNBQWdCLGdCQUFnQixDQUFDLFVBQXNCO1FBQ25ELFFBQVEsVUFBVSxDQUFDLElBQUksRUFBRTtZQUNyQixLQUFLLGtEQUFRLENBQUMsR0FBRyxDQUFDO1lBQ2xCLEtBQUssa0RBQVEsQ0FBQyxNQUFNLENBQUM7WUFDckIsS0FBSyxrREFBUSxDQUFDLEtBQUssQ0FBQztZQUNwQixLQUFLLGtEQUFRLENBQUMsU0FBUztnQkFDbkIsT0FBTyxJQUFJLENBQUM7WUFDaEIsS0FBSyxrREFBUSxDQUFDLE1BQU07Z0JBQ2hCLE9BQU8sS0FBSyxDQUFDO1lBQ2pCO2dCQUNJLE1BQU0sSUFBSSx3RUFBb0IsQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3RFO0lBQ0wsQ0FBQztJQVplLCtCQUFnQixtQkFZL0I7SUFFRCxnQkFBZ0I7SUFDaEIsU0FBZ0IsT0FBTyxDQUFDLFVBQXNDO1FBQzFELElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTtZQUMxQixPQUFPLFNBQVMsQ0FBQztTQUNwQjthQUFNO1lBQ0gsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLG9FQUFzQixDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNsRCxNQUFNLElBQUksc0VBQWtCLENBQUMsd0NBQXdDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2FBQ3RHO2lCQUFNO2dCQUNILE9BQU8sTUFBTSxDQUFDO2FBQ2pCO1NBQ0o7SUFDTCxDQUFDO0lBWGUsc0JBQU8sVUFXdEI7SUFFRCxnQkFBZ0I7SUFDaEIsU0FBZ0IsdUJBQXVCLENBQUMsa0JBQXNEO1FBQzFGLElBQUksa0JBQWtCLEtBQUssU0FBUyxFQUFFO1lBQ2xDLE9BQU8sU0FBUyxDQUFDO1NBQ3BCO2FBQU07WUFDSCxNQUFNLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7WUFDckMsUUFBUSxJQUFJLEVBQUU7Z0JBQ1YsS0FBSyxrREFBUSxDQUFDLEdBQUcsQ0FBQztnQkFDbEIsS0FBSyxrREFBUSxDQUFDLE1BQU07b0JBQ2hCLE9BQU8scUJBQXFCLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBQ2xFLEtBQUssa0RBQVEsQ0FBQyxLQUFLO29CQUNmLE9BQU8sZUFBZSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2dCQUM1RCxLQUFLLGtEQUFRLENBQUMsU0FBUztvQkFDbkIsT0FBTyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsQ0FBQztnQkFDaEU7b0JBQ0ksTUFBTSxJQUFJLHdFQUFvQixDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUM1RDtTQUNKO0lBQ0wsQ0FBQztJQWpCZSxzQ0FBdUIsMEJBaUJ0QztBQUNMLENBQUMsRUFoRGdCLGNBQWMsS0FBZCxjQUFjLFFBZ0Q5QjtBQWVEOzs7O0dBSUc7QUFDSSxJQUFVLFlBQVksQ0FzWTVCO0FBdFlELFdBQWlCLFlBQVk7SUFpR3pCLElBQWlCLFFBQVEsQ0FpQnhCO0lBakJELFdBQWlCLFFBQVE7UUFDckIsU0FBZ0IsT0FBTyxDQUFDLFFBQThCOztZQUNsRCxNQUFNLE1BQU0sR0FBa0M7Z0JBQzFDLGtCQUFrQixFQUFFLGNBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxrQkFBa0IsbUNBQUksa0VBQW9CLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0I7Z0JBQzdHLGVBQWUsRUFBRSxjQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsZUFBZSxtQ0FBSSxrRUFBb0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGVBQWU7Z0JBQ3BHLGNBQWMsRUFBRSxjQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsY0FBYyxtQ0FBSSxrRUFBb0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGNBQWM7Z0JBQ2pHLGdCQUFnQixFQUFFLGNBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxnQkFBZ0IsbUNBQUksa0VBQW9CLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0I7Z0JBQ3ZHLHdCQUF3QixFQUFFLGNBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSx3QkFBd0IsbUNBQUksa0VBQW9CLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyx3QkFBd0I7Z0JBQy9ILG9CQUFvQixFQUFFLGNBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxvQkFBb0IsbUNBQUksa0VBQW9CLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0I7Z0JBQ25ILGNBQWMsRUFBRSxjQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsY0FBYyxtQ0FBSSxrRUFBb0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGNBQWM7Z0JBQ2pHLG1CQUFtQixFQUFFLGNBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxtQkFBbUIsbUNBQUksa0VBQW9CLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUI7Z0JBQ2hILHFCQUFxQixFQUFFLGNBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxxQkFBcUIsbUNBQUksa0VBQW9CLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUI7Z0JBQ3RILGdCQUFnQixFQUFFLGNBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxnQkFBZ0IsbUNBQUksa0VBQW9CLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0I7Z0JBQ3ZHLFlBQVksRUFBRSxjQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsWUFBWSxtQ0FBSSxrRUFBb0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFlBQVk7YUFDOUY7WUFDRCxPQUFPLE1BQU0sQ0FBQztRQUNsQixDQUFDO1FBZmUsZ0JBQU8sVUFldEI7SUFDTCxDQUFDLEVBakJnQixRQUFRLEdBQVIscUJBQVEsS0FBUixxQkFBUSxRQWlCeEI7SUEyREQsSUFBaUIsVUFBVSxDQXFEMUI7SUFyREQsV0FBaUIsVUFBVTtRQUN2QixnQkFBZ0I7UUFDaEIsU0FBZ0IsT0FBTyxDQUFDLFVBQWtDOztZQUN0RCxNQUFNLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFFLFFBQVEsRUFBRSx3QkFBd0IsRUFBRSxHQUFHLFVBQVUsQ0FBQywyQkFBMkIsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM5SCxNQUFNLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLFFBQVEsRUFBRSx1QkFBdUIsRUFBRSxHQUFHLFVBQVUsQ0FBQywwQkFBMEIsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMzSCxNQUFNLE1BQU0sR0FBb0M7Z0JBQzVDLFdBQVcsRUFBRSxnQkFBVSxhQUFWLFVBQVUsdUJBQVYsVUFBVSxDQUFFLFdBQVcsbUNBQUksa0VBQW9CLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxXQUFXO2dCQUM1RixlQUFlLEVBQUUsZ0JBQVUsYUFBVixVQUFVLHVCQUFWLFVBQVUsQ0FBRSxlQUFlLG1DQUFJLGtFQUFvQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsZUFBZTtnQkFDeEcsb0JBQW9CO2dCQUNwQix3QkFBd0I7Z0JBQ3hCLG1CQUFtQjtnQkFDbkIsdUJBQXVCO2dCQUN2QixZQUFZLEVBQUUsZ0JBQVUsYUFBVixVQUFVLHVCQUFWLFVBQVUsQ0FBRSxZQUFZLG1DQUFJLGtFQUFvQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsWUFBWTtnQkFDL0YsY0FBYyxFQUFFLGdCQUFVLGFBQVYsVUFBVSx1QkFBVixVQUFVLENBQUUsY0FBYyxtQ0FBSSxrRUFBb0IsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLGNBQWM7Z0JBQ3JHLGVBQWUsRUFBRSxnQkFBVSxhQUFWLFVBQVUsdUJBQVYsVUFBVSxDQUFFLGVBQWUsbUNBQUksa0VBQW9CLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxlQUFlO2FBQzNHO1lBQ0QsT0FBTyxNQUFNLENBQUM7UUFDbEIsQ0FBQztRQWZlLGtCQUFPLFVBZXRCO1FBRUQsZ0JBQWdCO1FBQ2hCLFNBQWdCLFlBQVksQ0FBQyxrQkFBbUQ7WUFDNUUsTUFBTSxNQUFNLEdBQWU7Z0JBQ3ZCLFdBQVcsRUFBRSxrQkFBa0IsQ0FBQyxXQUFXO2dCQUMzQyxlQUFlLEVBQUUsa0JBQWtCLENBQUMsZUFBZTtnQkFDbkQsb0JBQW9CLEVBQUUsVUFBVSxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixFQUFFLGtCQUFrQixDQUFDLHdCQUF3QixDQUFDO2dCQUN0SCxtQkFBbUIsRUFBRSxVQUFVLENBQUMsa0JBQWtCLENBQUMsbUJBQW1CLEVBQUUsa0JBQWtCLENBQUMsdUJBQXVCLENBQUM7Z0JBQ25ILFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxZQUFZO2dCQUM3QyxjQUFjLEVBQUUsa0JBQWtCLENBQUMsY0FBYztnQkFDakQsZUFBZSxFQUFFLGtCQUFrQixDQUFDLGVBQWU7YUFDdEQsQ0FBQztZQUVGLE9BQU8sTUFBTSxDQUFDO1FBQ2xCLENBQUM7UUFaZSx1QkFBWSxlQVkzQjtRQUVELGdCQUFnQjtRQUNoQixTQUFnQiwyQkFBMkIsQ0FBQyxVQUFrQztZQUMxRSxNQUFNLE1BQU0sR0FBRyxVQUFVLGFBQVYsVUFBVSx1QkFBVixVQUFVLENBQUUsb0JBQW9CLENBQUM7WUFDaEQsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO2dCQUN0QixPQUFPLEVBQUUsSUFBSSxFQUFFLGtFQUFvQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLGtFQUFvQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsd0JBQXdCLEVBQUUsQ0FBQzthQUMvSjtpQkFBTTtnQkFDSCxPQUFPLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxzREFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDbEQ7UUFDTCxDQUFDO1FBUGUsc0NBQTJCLDhCQU8xQztRQUVELGdCQUFnQjtRQUNoQixTQUFnQiwwQkFBMEIsQ0FBQyxVQUFrQztZQUN6RSxNQUFNLEtBQUssR0FBRyxVQUFVLGFBQVYsVUFBVSx1QkFBVixVQUFVLENBQUUsbUJBQW1CLENBQUM7WUFDOUMsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO2dCQUNyQixPQUFPLEVBQUUsSUFBSSxFQUFFLGtFQUFvQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLGtFQUFvQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsdUJBQXVCLEVBQUUsQ0FBQzthQUM3SjtpQkFBTTtnQkFDSCxPQUFPLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxzREFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDakQ7UUFDTCxDQUFDO1FBUGUscUNBQTBCLDZCQU96QztJQUNMLENBQUMsRUFyRGdCLFVBQVUsR0FBVix1QkFBVSxLQUFWLHVCQUFVLFFBcUQxQjtJQXlFRCxJQUFpQixNQUFNLENBNkJ0QjtJQTdCRCxXQUFpQixNQUFNO1FBQ25CLGdCQUFnQjtRQUNoQixTQUFnQixPQUFPLENBQUMsTUFBMEIsRUFDOUMsUUFBMkMsRUFBRSxNQUF1Qzs7WUFFcEYsSUFBSSxJQUFrQixDQUFDO1lBQ3ZCLElBQUksT0FBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLElBQUksTUFBSyxTQUFTLEVBQUU7Z0JBQzVCLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO2FBQ3RCO2lCQUFNO2dCQUNILElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRTtvQkFDN0QsSUFBSSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGtFQUFvQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7aUJBQ2xGO3FCQUFNO29CQUNILElBQUksR0FBRyxrRUFBb0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztpQkFDcEQ7YUFDSjtZQUNELE1BQU0sTUFBTSxHQUFnQztnQkFDeEMsSUFBSTtnQkFDSixNQUFNLEVBQUUsa0JBQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxNQUFNLG1DQUFJLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxNQUFNLG1DQUNwQyxDQUFDLFNBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxjQUFjLE1BQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGtFQUFvQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO2dCQUM5RixLQUFLLEVBQUUsa0JBQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxLQUFLLG1DQUFJLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxLQUFLLG1DQUFJLGtFQUFvQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSztnQkFDbkYsUUFBUSxFQUFFLGtCQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsUUFBUSxtQ0FBSSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsUUFBUSxtQ0FDMUMsQ0FBQyxTQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsZ0JBQWdCLE1BQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGtFQUFvQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO2dCQUNsRyxLQUFLLEVBQUUsa0JBQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxLQUFLLG1DQUFJLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxLQUFLLG1DQUNqQyxDQUFDLFNBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxhQUFhLE1BQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGtFQUFvQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO2dCQUM1RixRQUFRLEVBQUUsa0JBQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxRQUFRLG1DQUFJLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxRQUFRLG1DQUFJLGtFQUFvQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUTtnQkFDL0YsV0FBVyxFQUFFLGtCQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsV0FBVyxtQ0FBSSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsV0FBVyxtQ0FBSSxrRUFBb0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVc7YUFDOUc7WUFDRCxPQUFPLE1BQU0sQ0FBQztRQUNsQixDQUFDO1FBMUJlLGNBQU8sVUEwQnRCO0lBQ0wsQ0FBQyxFQTdCZ0IsTUFBTSxHQUFOLG1CQUFNLEtBQU4sbUJBQU0sUUE2QnRCO0lBRUQsU0FBZ0IsUUFBUSxDQUFDLE1BQW9CO1FBQ3pDLE9BQU8sVUFBVSxJQUFJLE1BQU0sSUFBSSxlQUFlLElBQUksTUFBTSxJQUFJLFFBQVEsSUFBSSxNQUFNLENBQUM7SUFDbkYsQ0FBQztJQUZlLHFCQUFRLFdBRXZCO0lBRUQsZ0JBQWdCO0lBQ2hCLFNBQWdCLE9BQU8sQ0FBQyxZQUEwQjtRQUM5QyxJQUFJLFFBQVEsQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUN4QixPQUFPLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNuRDthQUFNO1lBQ0gsSUFBSSxJQUFnQyxDQUFDO1lBQ3JDLElBQUksWUFBWSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7Z0JBQ2pDLElBQUksR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDO2FBQzVCO2lCQUFNO2dCQUNILElBQUksWUFBWSxDQUFDLE9BQU8sS0FBSyxTQUFTLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUN2RSxJQUFJLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDbEM7cUJBQU07b0JBQ0gsSUFBSSxHQUFHLFNBQVMsQ0FBQztpQkFDcEI7YUFDSjtZQUNELE1BQU0sTUFBTSxHQUF5QjtnQkFDakMsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsSUFBSSxFQUFFLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUNsQyxXQUFXLEVBQUUsWUFBWSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUM7Z0JBQ3RFLFVBQVUsRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO2dCQUNwRSxRQUFRLEVBQUUsWUFBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQztnQkFDOUQsTUFBTSxFQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsTUFBTSxDQUFDO2FBQ3ZHO1lBQ0QsT0FBTyxNQUFNLENBQUM7U0FDakI7SUFDTCxDQUFDO0lBeEJlLG9CQUFPLFVBd0J0QjtJQUVELFNBQWdCLFlBQVksQ0FBQyxNQUE0QjtRQUNyRCxNQUFNLE1BQU0sR0FBaUI7WUFDekIsSUFBSSxFQUFFLGNBQWMsQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ3pELFdBQVcsRUFBRSxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1lBQ3JFLFFBQVEsRUFBRSxrRUFBb0IsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7WUFDbkUsVUFBVSxFQUFFLFlBQVksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7WUFDbkUsTUFBTSxFQUFFLGtFQUFvQixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztTQUNoRSxDQUFDO1FBQ0YsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQVRlLHlCQUFZLGVBUzNCO0lBRUQsU0FBZ0IsVUFBVSxDQUFDLHNCQUEyRDtRQUNsRixNQUFNLE1BQU0sR0FBRyxzQkFBOEMsQ0FBQztRQUM5RCxPQUFPLE1BQU0sQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBSGUsdUJBQVUsYUFHekI7SUFFRCxnQkFBZ0I7SUFDaEIsU0FBZ0Isa0JBQWtCLENBQUMsYUFBK0M7UUFDOUUsSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFO1lBQzdCLE9BQU8sRUFBRSxDQUFDO1NBQ2I7YUFBTTtZQUNILE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUM7WUFDbkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQTZCLEtBQUssQ0FBQyxDQUFDO1lBQzVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzVCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDNUQ7WUFDRCxPQUFPLE1BQU0sQ0FBQztTQUNqQjtJQUNMLENBQUM7SUFYZSwrQkFBa0IscUJBV2pDO0FBQ0wsQ0FBQyxFQXRZZ0IsWUFBWSxLQUFaLFlBQVksUUFzWTVCO0FBaUJELGNBQWM7QUFDUCxJQUFVLGtCQUFrQixDQWlIbEM7QUFqSEQsV0FBaUIsa0JBQWtCO0lBcUIvQixJQUFpQixNQUFNLENBb0N0QjtJQXBDRCxXQUFpQixNQUFNO1FBQ25CLGdCQUFnQjtRQUNoQixTQUFnQixPQUFPLENBQUMsTUFBMEIsRUFDOUMsVUFBa0M7O1lBRWxDLElBQUksTUFBeUMsQ0FBQztZQUM5QyxNQUFNLFFBQVEsR0FBRyx3RUFBMEIsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1lBQzVELElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtnQkFDdEIsTUFBTSxHQUFHO29CQUNMLEtBQUssRUFBRSxZQUFNLENBQUMsS0FBSyxtQ0FBSSxRQUFRLENBQUMsS0FBSztvQkFDckMsTUFBTSxFQUFFLFlBQU0sQ0FBQyxNQUFNLG1DQUFJLFFBQVEsQ0FBQyxNQUFNO29CQUN4QyxJQUFJLEVBQUUsWUFBTSxDQUFDLElBQUksbUNBQUksUUFBUSxDQUFDLElBQUk7b0JBQ2xDLEdBQUcsRUFBRSxZQUFNLENBQUMsR0FBRyxtQ0FBSSxRQUFRLENBQUMsR0FBRztpQkFDbEM7YUFDSjtpQkFBTTtnQkFDSCxNQUFNLEdBQUc7b0JBQ0wsS0FBSyxFQUFFLGdCQUFVLGFBQVYsVUFBVSx1QkFBVixVQUFVLENBQUUsS0FBSyxtQ0FBSSxRQUFRLENBQUMsS0FBSztvQkFDMUMsTUFBTSxFQUFFLGdCQUFVLGFBQVYsVUFBVSx1QkFBVixVQUFVLENBQUUsTUFBTSxtQ0FBSSxRQUFRLENBQUMsTUFBTTtvQkFDN0MsSUFBSSxFQUFFLGdCQUFVLGFBQVYsVUFBVSx1QkFBVixVQUFVLENBQUUsSUFBSSxtQ0FBSSxRQUFRLENBQUMsSUFBSTtvQkFDdkMsR0FBRyxFQUFFLGdCQUFVLGFBQVYsVUFBVSx1QkFBVixVQUFVLENBQUUsR0FBRyxtQ0FBSSxRQUFRLENBQUMsR0FBRztpQkFDdkM7YUFDSjtZQUNELE9BQU8sTUFBTSxDQUFDO1FBQ2xCLENBQUM7UUFyQmUsY0FBTyxVQXFCdEI7UUFFRCxnQkFBZ0I7UUFDaEIsU0FBZ0IsWUFBWSxDQUFDLGNBQWlEO1lBQzFFLE1BQU0sTUFBTSxHQUFXO2dCQUNuQixLQUFLLEVBQUUsY0FBYyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEtBQUs7Z0JBQ3ZFLE1BQU0sRUFBRSxjQUFjLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsTUFBTTtnQkFDMUUsSUFBSSxFQUFFLGNBQWMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJO2dCQUNwRSxHQUFHLEVBQUUsY0FBYyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEdBQUc7YUFDcEU7WUFFRCxPQUFPLE1BQU0sQ0FBQztRQUNsQixDQUFDO1FBVGUsbUJBQVksZUFTM0I7SUFDTCxDQUFDLEVBcENnQixNQUFNLEdBQU4seUJBQU0sS0FBTix5QkFBTSxRQW9DdEI7SUFFRCxnQkFBZ0I7SUFDaEIsU0FBZ0IsT0FBTyxDQUFDLFlBQWdDOztRQUNwRCxJQUFJLElBQWdDLENBQUM7UUFDckMsSUFBSSxZQUFZLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtZQUNqQyxJQUFJLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQztTQUM1QjthQUFNO1lBQ0gsSUFBSSxZQUFZLENBQUMsT0FBTyxLQUFLLFNBQVMsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3ZFLElBQUksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2xDO2lCQUFNO2dCQUNILElBQUksR0FBRyxTQUFTLENBQUM7YUFDcEI7U0FDSjtRQUVELE1BQU0sTUFBTSxHQUErQjtZQUN2QyxJQUFJLEVBQUUsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDbEMsV0FBVyxFQUFFLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDO1lBQ3RFLFVBQVUsRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO1lBQ3BFLFFBQVEsRUFBRSxZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO1lBQzlELE1BQU0sRUFBRSxZQUFZLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLE1BQU0sQ0FBQztZQUNwRyxRQUFRLEVBQUUsa0JBQVksQ0FBQyxRQUFRLG1DQUFJLElBQUk7WUFDdkMsYUFBYSxFQUFFLGtCQUFZLENBQUMsYUFBYSxtQ0FBSSxJQUFJO1lBQ2pELE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLFVBQVUsQ0FBQztZQUN2RixRQUFRLEVBQUUsSUFBSTtTQUNqQjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUF4QmUsMEJBQU8sVUF3QnRCO0lBRUQsZ0JBQWdCO0lBQ2hCLFNBQWdCLFlBQVksQ0FBQyxjQUEwQztRQUNuRSxNQUFNLE1BQU0sR0FBdUI7WUFDL0IsSUFBSSxFQUFFLGNBQWMsQ0FBQyx1QkFBdUIsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO1lBQ2pFLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO1lBQzFELFVBQVUsRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDO1lBQzNFLFFBQVEsRUFBRSxrRUFBb0IsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUM7WUFDM0UsTUFBTSxFQUFFLGtFQUFvQixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQztZQUNyRSxRQUFRLEVBQUUsY0FBYyxDQUFDLFFBQVE7WUFDakMsYUFBYSxFQUFFLGNBQWMsQ0FBQyxhQUFhO1lBQzNDLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUM7U0FDeEU7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBYmUsK0JBQVksZUFhM0I7SUFFRCxnQkFBZ0I7SUFDaEIsU0FBZ0IsaUJBQWlCLENBQUMsYUFBMkM7UUFDekUsTUFBTSx1QkFBdUIsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDO1FBQ3JELE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxDQUFxQix1QkFBdUIsQ0FBQyxDQUFDO1FBQ3RFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyx1QkFBdUIsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM5QyxNQUFNLGtCQUFrQixHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUM7U0FDbkU7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBVGUsb0NBQWlCLG9CQVNoQztBQUNMLENBQUMsRUFqSGdCLGtCQUFrQixLQUFsQixrQkFBa0IsUUFpSGxDO0FBY0QsZ0JBQWdCO0FBQ1QsU0FBUyxTQUFTLENBQUMsVUFBa0IsRUFBRSxrQkFBMkM7SUFDckYsTUFBTSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyw4RUFBZ0MsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM3SCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM3QyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNiLE1BQU0sSUFBSSxzRUFBa0IsQ0FBQyxHQUFHLDREQUFXLHVDQUE0QyxLQUFLLFVBQVUsRUFBRSxDQUFDLENBQUM7S0FDN0c7U0FBTTtRQUNILE1BQU0sUUFBUSxHQUFHLHNEQUFZLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDMUQsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFO1lBQ3hCLE1BQU0sSUFBSSxzRUFBa0IsQ0FBQyxHQUFHLDREQUFXLGlDQUFzQyxLQUFLLFVBQVUsRUFBRSxDQUFDO1NBQ3RHO2FBQU07WUFDSCxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUN4QyxNQUFNLElBQUksc0VBQWtCLENBQUMsR0FBRyw0REFBVyxxQ0FBMEMsS0FBSyxVQUFVLEVBQUUsQ0FBQzthQUMxRztpQkFBTTtnQkFDSCxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDO2FBQzdCO1NBQ0o7S0FDSjtBQUNMLENBQUM7QUFFRCxnQkFBZ0I7QUFDVCxTQUFTLFVBQVUsQ0FBQyxJQUFZLEVBQUUsUUFBc0I7SUFDM0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxHQUFHLHNEQUFZLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzdELENBQUM7QUFFRCxnQkFBZ0I7QUFDVCxTQUFTLHFCQUFxQixDQUFDLElBQXVCLEVBQUUsUUFBc0I7SUFDakYsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO1FBQ3BCLE9BQU8sU0FBUyxDQUFDO0tBQ3BCO1NBQU07UUFDSCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsc0RBQVksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDNUQ7QUFDTCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyd0M0RTtBQUNuQjtBQUMrQjtBQUN4QztBQWdCakQsY0FBYztBQUNQLElBQVUsa0JBQWtCLENBK0RsQztBQS9ERCxXQUFpQixrQkFBa0I7SUFDbEIsMkJBQVEsR0FBdUI7UUFDeEMsSUFBSSxFQUFFLGtEQUFRLENBQUMsTUFBTTtRQUNyQixPQUFPLEVBQUUsRUFBRTtRQUNYLElBQUksRUFBRSxDQUFDO1FBQ1AsUUFBUSxFQUFFLHNEQUFZLENBQUMsVUFBVTtRQUNqQyxPQUFPLEVBQUUsU0FBUztRQUNsQixXQUFXLEVBQUUsc0RBQVksQ0FBQyxLQUFLO1FBQy9CLEVBQUUsRUFBRSxFQUFFO1FBQ04sVUFBVSxFQUFFLElBQUk7S0FDVixDQUFDO0lBRVgsa0dBQWtHO0lBQ2xHLFNBQWdCLFVBQVUsQ0FBQyxRQUE0QixFQUFFLE9BQThCO1FBQ25GLFFBQVEsUUFBUSxDQUFDLElBQUksRUFBRTtZQUNuQixLQUFLLGtEQUFRLENBQUMsTUFBTSxDQUFDO1lBQ3JCLEtBQUssa0RBQVEsQ0FBQyxHQUFHLENBQUM7WUFDbEIsS0FBSyxrREFBUSxDQUFDLE1BQU07Z0JBQ2hCLE9BQU8sNkJBQTZCLENBQUMsVUFBVSxDQUFDLFFBQXlDLEVBQ3JGLE9BQTBELENBQUMsQ0FBQztZQUVwRSxLQUFLLGtEQUFRLENBQUMsS0FBSztnQkFDZixPQUFPLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxRQUFtQyxFQUFFLE9BQXdDLENBQUMsQ0FBQztZQUU3SCxLQUFLLGtEQUFRLENBQUMsU0FBUztnQkFDbkIsT0FBTywyQkFBMkIsQ0FBQyxVQUFVLENBQUMsUUFBdUMsQ0FBQyxDQUFDO1lBRTNGO2dCQUNJLE1BQU0sSUFBSSx3RUFBb0IsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxvQ0FBb0MsQ0FBQyxDQUFDO1NBQ3hHO0lBQ0wsQ0FBQztJQWpCZSw2QkFBVSxhQWlCekI7SUFFRCxTQUFnQixhQUFhLENBQUMsSUFBYztRQUN4QyxRQUFRLElBQUksRUFBRTtZQUNWLEtBQUssa0RBQVEsQ0FBQyxNQUFNO2dCQUNoQixNQUFNLElBQUksK0RBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLHFDQUFxQztZQUMvRSxLQUFLLGtEQUFRLENBQUMsR0FBRyxDQUFDO1lBQ2xCLEtBQUssa0RBQVEsQ0FBQyxNQUFNO2dCQUNoQixPQUFPLDZCQUE2QixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUU3RCxLQUFLLGtEQUFRLENBQUMsS0FBSztnQkFDZixPQUFPLHVCQUF1QixDQUFDLGFBQWEsRUFBRSxDQUFDO1lBRW5ELEtBQUssa0RBQVEsQ0FBQyxTQUFTO2dCQUNuQixPQUFPLDJCQUEyQixDQUFDLGFBQWEsRUFBRSxDQUFDO1lBRXZEO2dCQUNJLE1BQU0sSUFBSSx3RUFBb0IsQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLG9DQUFvQyxDQUFDLENBQUM7U0FDakc7SUFDTCxDQUFDO0lBakJlLGdDQUFhLGdCQWlCNUI7SUFFRCxTQUFnQixlQUFlLENBQUMsVUFBOEI7UUFDMUQsT0FBTyxVQUFVLENBQUMsSUFBSSxLQUFLLGtEQUFRLENBQUMsU0FBUyxDQUFDO0lBQ2xELENBQUM7SUFGZSxrQ0FBZSxrQkFFOUI7SUFFRCxTQUFnQixXQUFXLENBQUMsVUFBOEI7UUFDdEQsT0FBTyxVQUFVLENBQUMsSUFBSSxLQUFLLGtEQUFRLENBQUMsS0FBSyxDQUFDO0lBQzlDLENBQUM7SUFGZSw4QkFBVyxjQUUxQjtJQUVELGdCQUFnQjtJQUNoQixTQUFnQixZQUFZLENBQUMsVUFBOEI7UUFDdkQsT0FBTyxVQUFVLENBQUMsSUFBSSxLQUFLLGtEQUFRLENBQUMsTUFBTSxDQUFDO0lBQy9DLENBQUM7SUFGZSwrQkFBWSxlQUUzQjtBQUNMLENBQUMsRUEvRGdCLGtCQUFrQixLQUFsQixrQkFBa0IsUUErRGxDO0FBU0QsY0FBYztBQUNQLElBQVUsMEJBQTBCLENBNkIxQztBQTdCRCxXQUFpQiwwQkFBMEI7SUFDMUIsMkNBQWdCLEdBQUcsS0FBSyxDQUFDO0lBWXRDLElBQWlCLE1BQU0sQ0FldEI7SUFmRCxXQUFpQixNQUFNO1FBQ25CLFNBQWdCLFVBQVUsQ0FBQyxRQUE0QixFQUFFLElBQW1CO1lBQ3hFLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtnQkFDeEIsT0FBTyxTQUFTLENBQUM7YUFDcEI7aUJBQU07Z0JBQ0gsT0FBTztvQkFDSCxJQUFJLEVBQUUsSUFBSSxhQUFKLElBQUksY0FBSixJQUFJLEdBQUksUUFBUSxDQUFDLElBQUk7b0JBQzNCLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTtvQkFDdkIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLO29CQUNyQixRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7b0JBQzNCLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUTtvQkFDM0IsV0FBVyxFQUFFLFFBQVEsQ0FBQyxXQUFXO2lCQUNwQzthQUNKO1FBQ0wsQ0FBQztRQWJlLGlCQUFVLGFBYXpCO0lBQ0wsQ0FBQyxFQWZnQixNQUFNLEdBQU4saUNBQU0sS0FBTixpQ0FBTSxRQWV0QjtBQUNMLENBQUMsRUE3QmdCLDBCQUEwQixLQUExQiwwQkFBMEIsUUE2QjFDO0FBVUQsY0FBYztBQUNQLElBQVUsdUJBQXVCLENBNkN2QztBQTdDRCxXQUFpQix1QkFBdUI7SUFDdkIsOENBQXNCLEdBQUcsQ0FBQyxDQUFDO0lBRXhDLFNBQWdCLFVBQVUsQ0FBQyxRQUFpQyxFQUFFLE9BQXVDO1FBQ2pHLE1BQU0sTUFBTSxHQUE0QjtZQUNwQyxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7WUFDbkIsT0FBTyxFQUFFLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDckYsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO1lBQ25CLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUTtZQUMzQixPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU87WUFDekIsV0FBVyxFQUFFLFFBQVEsQ0FBQyxXQUFXO1lBQ2pDLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRTtZQUNmLFNBQVMsRUFBRSxRQUFRLENBQUMsU0FBUztZQUM3QixVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVU7WUFDL0IsZUFBZSxFQUFFLFFBQVEsQ0FBQyxlQUFlO1lBQ3pDLE1BQU0sRUFBRSwwQkFBMEIsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7U0FDeEU7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBZmUsa0NBQVUsYUFlekI7SUFFRCxTQUFnQixXQUFXLENBQUMsUUFBdUM7UUFDL0QsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUM5QixNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBOEIsS0FBSyxDQUFDLENBQUM7UUFDN0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM1QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsa0JBQWtCLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBZ0MsQ0FBQztTQUN6RjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFQZSxtQ0FBVyxjQU8xQjtJQUVELFNBQWdCLGFBQWE7UUFDekIsTUFBTSxNQUFNLEdBQTRCO1lBQ3BDLElBQUksRUFBRSxrREFBUSxDQUFDLEtBQUs7WUFDcEIsT0FBTyxFQUFFLEVBQUU7WUFDWCxJQUFJLEVBQUUsa0JBQWtCLENBQUMsUUFBUSxDQUFDLElBQUk7WUFDdEMsUUFBUSxFQUFFLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxRQUFRO1lBQzlDLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsT0FBTztZQUM1QyxXQUFXLEVBQUUsa0JBQWtCLENBQUMsUUFBUSxDQUFDLFdBQVc7WUFDcEQsRUFBRSxFQUFFLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ2xDLFNBQVMsRUFBRSwwQkFBMEIsQ0FBQyxnQkFBZ0I7WUFDdEQsVUFBVSxFQUFFLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxVQUFVO1lBQ2xELGVBQWUsRUFBRSw4Q0FBc0I7WUFDdkMsTUFBTSxFQUFFLFNBQVM7U0FDcEI7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBZmUscUNBQWEsZ0JBZTVCO0FBQ0wsQ0FBQyxFQTdDZ0IsdUJBQXVCLEtBQXZCLHVCQUF1QixRQTZDdkM7QUFnQkQsY0FBYztBQUNQLElBQVUsMkJBQTJCLENBdUQzQztBQXZERCxXQUFpQiwyQkFBMkI7SUFDM0IsaURBQXFCLEdBQUcsSUFBSSxDQUFDO0lBRTFDLFNBQWdCLHdCQUF3QixDQUFDLFVBQXVDO1FBQzVFLE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUM7UUFDL0MsSUFBSSxPQUFPLGFBQWEsS0FBSyxRQUFRLEVBQUU7WUFDbkMsT0FBTyxhQUFhLENBQUM7U0FDeEI7YUFBTTtZQUNILE9BQU8sU0FBUyxDQUFDO1NBQ3BCO0lBQ0wsQ0FBQztJQVBlLG9EQUF3QiwyQkFPdkM7SUFFRCxTQUFnQixVQUFVLENBQUMsUUFBcUM7UUFDNUQsTUFBTSxNQUFNLEdBQWdDO1lBQ3hDLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtZQUNuQixPQUFPLEVBQUUsRUFBRTtZQUNYLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtZQUNuQixRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7WUFDM0IsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPO1lBQ3pCLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVztZQUNqQyxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUU7WUFDZixTQUFTLEVBQUUsUUFBUSxDQUFDLFNBQVM7WUFDN0IsVUFBVSxFQUFFLFFBQVEsQ0FBQyxVQUFVO1lBQy9CLGNBQWMsRUFBRSxRQUFRLENBQUMsY0FBYztZQUN2QyxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUs7WUFDckIsTUFBTSxFQUFFLDBCQUEwQixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUNyRSxhQUFhLEVBQUUsUUFBUSxDQUFDLGFBQWE7WUFDckMsY0FBYyxFQUFFLDZEQUFlLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxjQUFjLENBQWM7U0FDbkY7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBbEJlLHNDQUFVLGFBa0J6QjtJQUVELFNBQWdCLGFBQWEsQ0FBQyxnQkFBMkIsRUFBRSxFQUFFLGNBQTBCLEVBQUUsS0FBSyxHQUFHLEVBQUU7UUFDL0YsTUFBTSxNQUFNLEdBQWdDO1lBQ3hDLElBQUksRUFBRSxrREFBUSxDQUFDLFNBQVM7WUFDeEIsT0FBTyxFQUFFLEVBQUU7WUFDWCxJQUFJLEVBQUUsa0JBQWtCLENBQUMsUUFBUSxDQUFDLElBQUk7WUFDdEMsUUFBUSxFQUFFLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxRQUFRO1lBQzlDLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsT0FBTztZQUM1QyxXQUFXLEVBQUUsa0JBQWtCLENBQUMsUUFBUSxDQUFDLFdBQVc7WUFDcEQsRUFBRSxFQUFFLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ2xDLFNBQVMsRUFBRSwwQkFBMEIsQ0FBQyxnQkFBZ0I7WUFDdEQsVUFBVSxFQUFFLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxVQUFVO1lBQ2xELGNBQWMsRUFBRSwyQkFBMkIsQ0FBQyxxQkFBcUI7WUFDakUsS0FBSztZQUNMLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLGFBQWE7WUFDYixjQUFjO1NBQ2pCO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQWxCZSx5Q0FBYSxnQkFrQjVCO0lBRUQsU0FBZ0IsaUJBQWlCLENBQUMsYUFBd0I7UUFDdEQsT0FBTyw2REFBZSxDQUFDLEVBQUUsRUFBRSxhQUFhLENBQWM7SUFDMUQsQ0FBQztJQUZlLDZDQUFpQixvQkFFaEM7QUFDTCxDQUFDLEVBdkRnQiwyQkFBMkIsS0FBM0IsMkJBQTJCLFFBdUQzQztBQWFELGNBQWM7QUFDUCxJQUFVLDZCQUE2QixDQXFEN0M7QUFyREQsV0FBaUIsNkJBQTZCO0lBRzFDLFNBQWdCLGlCQUFpQixDQUFDLFVBQThCO1FBQzVELFFBQVEsVUFBVSxDQUFDLElBQUksRUFBRTtZQUNyQixLQUFLLGtEQUFRLENBQUMsR0FBRyxDQUFDO1lBQ2xCLEtBQUssa0RBQVEsQ0FBQyxNQUFNLENBQUM7WUFDckIsS0FBSyxrREFBUSxDQUFDLEtBQUssQ0FBQztZQUNwQixLQUFLLGtEQUFRLENBQUMsU0FBUztnQkFDbkIsT0FBTyxJQUFJLENBQUM7WUFDaEIsS0FBSyxrREFBUSxDQUFDLE1BQU07Z0JBQ2hCLE9BQU8sS0FBSyxDQUFDO1lBQ2pCO2dCQUNJLE1BQU0sSUFBSSx3RUFBb0IsQ0FBQyxtQkFBbUIsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDNUU7SUFDTCxDQUFDO0lBWmUsK0NBQWlCLG9CQVloQztJQUVELFNBQWdCLFVBQVUsQ0FBQyxRQUF1QyxFQUFFLE9BQTJCO1FBQzNGLE1BQU0sTUFBTSxHQUFrQztZQUMxQyxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7WUFDbkIsT0FBTyxFQUFFLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDckYsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO1lBQ25CLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUTtZQUMzQixPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU87WUFDekIsV0FBVyxFQUFFLFFBQVEsQ0FBQyxXQUFXO1lBQ2pDLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRTtZQUNmLFVBQVUsRUFBRSxRQUFRLENBQUMsVUFBVTtTQUNsQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFaZSx3Q0FBVSxhQVl6QjtJQUVELFNBQWdCLFdBQVcsQ0FBQyxRQUFvQztRQUM1RCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQzlCLE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxDQUFrQixLQUFLLENBQUMsQ0FBQztRQUNqRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzVCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFvQixDQUFDO1NBQzdFO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQVBlLHlDQUFXLGNBTzFCO0lBRUQsU0FBZ0IsYUFBYSxDQUFDLElBQXNCO1FBQ2hELE1BQU0sTUFBTSxHQUFrQztZQUMxQyxJQUFJO1lBQ0osT0FBTyxFQUFFLEVBQUU7WUFDWCxJQUFJLEVBQUUsa0JBQWtCLENBQUMsUUFBUSxDQUFDLElBQUk7WUFDdEMsUUFBUSxFQUFFLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxRQUFRO1lBQzlDLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsT0FBTztZQUM1QyxXQUFXLEVBQUUsa0JBQWtCLENBQUMsUUFBUSxDQUFDLFdBQVc7WUFDcEQsRUFBRSxFQUFFLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ2xDLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsVUFBVTtTQUNyRDtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFaZSwyQ0FBYSxnQkFZNUI7QUFDTCxDQUFDLEVBckRnQiw2QkFBNkIsS0FBN0IsNkJBQTZCLFFBcUQ3QztBQVdELGNBQWM7QUFDUCxJQUFVLHNCQUFzQixDQWtCdEM7QUFsQkQsV0FBaUIsc0JBQXNCO0lBQ25DLFNBQWdCLFVBQVUsQ0FBQyxNQUE4QjtRQUNyRCxPQUFPLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQTJCLENBQUM7SUFDM0UsQ0FBQztJQUZlLGlDQUFVLGFBRXpCO0lBRUQsU0FBZ0IsZ0JBQWdCLENBQUMsVUFBOEI7UUFDM0QsUUFBUSxVQUFVLENBQUMsSUFBSSxFQUFFO1lBQ3JCLEtBQUssa0RBQVEsQ0FBQyxHQUFHLENBQUM7WUFDbEIsS0FBSyxrREFBUSxDQUFDLE1BQU0sQ0FBQztZQUNyQixLQUFLLGtEQUFRLENBQUMsS0FBSyxDQUFDO1lBQ3BCLEtBQUssa0RBQVEsQ0FBQyxTQUFTO2dCQUNuQixPQUFPLElBQUksQ0FBQztZQUNoQixLQUFLLGtEQUFRLENBQUMsTUFBTTtnQkFDaEIsT0FBTyxLQUFLLENBQUM7WUFDakI7Z0JBQ0ksTUFBTSxJQUFJLHdFQUFvQixDQUFDLG1CQUFtQixFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM1RTtJQUNMLENBQUM7SUFaZSx1Q0FBZ0IsbUJBWS9CO0FBQ0wsQ0FBQyxFQWxCZ0Isc0JBQXNCLEtBQXRCLHNCQUFzQixRQWtCdEM7QUFlRCxnQkFBZ0I7QUFDVCxJQUFVLHdCQUF3QixDQWdCeEM7QUFoQkQsV0FBaUIsd0JBQXdCO0lBQ3JDLFNBQWdCLE1BQU0sQ0FBQyxjQUFrRDtRQUNyRSxNQUFNLE9BQU8sR0FBRyxjQUFjLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDckUsT0FBTztZQUNILElBQUksRUFBRSxrREFBUSxDQUFDLE1BQU07WUFDckIsT0FBTztZQUNQLElBQUksRUFBRSxHQUFHO1lBQ1QsUUFBUSxFQUFFLHNEQUFZLENBQUMsT0FBTztZQUM5QixPQUFPLEVBQUUsQ0FBQztZQUNWLFdBQVcsRUFBRSxzREFBWSxDQUFDLEtBQUs7WUFDL0IsRUFBRSxFQUFFLEVBQUU7WUFDTixVQUFVLEVBQUUsS0FBSztZQUNqQixLQUFLLEVBQUUsRUFBRTtZQUNULGNBQWMsRUFBRSxLQUFLO1NBQ3hCO0lBQ0wsQ0FBQztJQWRlLCtCQUFNLFNBY3JCO0FBQ0wsQ0FBQyxFQWhCZ0Isd0JBQXdCLEtBQXhCLHdCQUF3QixRQWdCeEM7QUFZRCxjQUFjO0FBQ1AsSUFBVSxvQkFBb0IsQ0FxTHBDO0FBckxELFdBQWlCLG9CQUFvQjtJQWlCakMsSUFBaUIsUUFBUSxDQThCeEI7SUE5QkQsV0FBaUIsUUFBUTtRQUNSLGlCQUFRLEdBQWtDO1lBQ25ELGtCQUFrQixFQUFFLElBQUk7WUFDeEIsZUFBZSxFQUFFLElBQUk7WUFDckIsY0FBYyxFQUFFLElBQUk7WUFDcEIsZ0JBQWdCLEVBQUUsS0FBSztZQUN2Qix3QkFBd0IsRUFBRSxJQUFJO1lBQzlCLG9CQUFvQixFQUFFLElBQUk7WUFDMUIsY0FBYyxFQUFFLHdEQUFjLENBQUMsSUFBSTtZQUNuQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3RCLHFCQUFxQixFQUFFLElBQUk7WUFDM0IsZ0JBQWdCLEVBQUUsRUFBRTtZQUNwQixZQUFZLEVBQUUsS0FBSztTQUNiLENBQUM7UUFFWCxTQUFnQixVQUFVLENBQUMsUUFBa0I7WUFDekMsT0FBTztnQkFDSCxrQkFBa0IsRUFBRSxRQUFRLENBQUMsa0JBQWtCO2dCQUMvQyxlQUFlLEVBQUUsUUFBUSxDQUFDLGVBQWU7Z0JBQ3pDLGNBQWMsRUFBRSxRQUFRLENBQUMsY0FBYztnQkFDdkMsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLGdCQUFnQjtnQkFDM0Msd0JBQXdCLEVBQUUsUUFBUSxDQUFDLHdCQUF3QjtnQkFDM0Qsb0JBQW9CLEVBQUUsUUFBUSxDQUFDLG9CQUFvQjtnQkFDbkQsY0FBYyxFQUFFLFFBQVEsQ0FBQyxjQUFjO2dCQUN2QyxtQkFBbUIsRUFBRSxRQUFRLENBQUMsbUJBQW1CO2dCQUNqRCxxQkFBcUIsRUFBRSxRQUFRLENBQUMscUJBQXFCO2dCQUNyRCxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsZ0JBQWdCO2dCQUMzQyxZQUFZLEVBQUUsUUFBUSxDQUFDLFlBQVk7YUFDdEM7UUFDTCxDQUFDO1FBZGUsbUJBQVUsYUFjekI7SUFDTCxDQUFDLEVBOUJnQixRQUFRLEdBQVIsNkJBQVEsS0FBUiw2QkFBUSxRQThCeEI7SUFlRCxJQUFpQixVQUFVLENBMEIxQjtJQTFCRCxXQUFpQixVQUFVO1FBQ3ZCLFNBQWdCLFVBQVUsQ0FBQyxRQUFvQjtZQUMzQyxPQUFPO2dCQUNILFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVztnQkFDakMsZUFBZSxFQUFFLFFBQVEsQ0FBQyxlQUFlO2dCQUN6QyxvQkFBb0IsRUFBRSxRQUFRLENBQUMsb0JBQW9CO2dCQUNuRCx3QkFBd0IsRUFBRSxRQUFRLENBQUMsd0JBQXdCO2dCQUMzRCxtQkFBbUIsRUFBRSxRQUFRLENBQUMsbUJBQW1CO2dCQUNqRCx1QkFBdUIsRUFBRSxRQUFRLENBQUMsdUJBQXVCO2dCQUN6RCxZQUFZLEVBQUUsUUFBUSxDQUFDLFlBQVk7Z0JBQ25DLGNBQWMsRUFBRSxRQUFRLENBQUMsY0FBYztnQkFDdkMsZUFBZSxFQUFFLFFBQVEsQ0FBQyxlQUFlO2FBQzVDO1FBQ0wsQ0FBQztRQVplLHFCQUFVLGFBWXpCO1FBRVksbUJBQVEsR0FBb0M7WUFDckQsV0FBVyxFQUFFLENBQUM7WUFDZCxlQUFlLEVBQUUsQ0FBQztZQUNsQixvQkFBb0IsRUFBRSxDQUFDO1lBQ3ZCLHdCQUF3QixFQUFFLHNEQUFZLENBQUMsS0FBSztZQUM1QyxtQkFBbUIsRUFBRSxFQUFFO1lBQ3ZCLHVCQUF1QixFQUFFLHNEQUFZLENBQUMsS0FBSztZQUMzQyxZQUFZLEVBQUUsRUFBRTtZQUNoQixjQUFjLEVBQUUsR0FBRztZQUNuQixlQUFlLEVBQUUsR0FBRztTQUNkLENBQUM7SUFDZixDQUFDLEVBMUJnQixVQUFVLEdBQVYsK0JBQVUsS0FBViwrQkFBVSxRQTBCMUI7SUFZRCxJQUFpQixNQUFNLENBc0J0QjtJQXRCRCxXQUFpQixNQUFNO1FBQ25CLFNBQWdCLFVBQVUsQ0FBQyxRQUFnQjtZQUN2QyxPQUFPO2dCQUNILElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtnQkFDbkIsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO2dCQUN2QixLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUs7Z0JBQ3JCLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSztnQkFDckIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRO2dCQUMzQixRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7Z0JBQzNCLFdBQVcsRUFBRSxRQUFRLENBQUMsV0FBVzthQUNwQztRQUNMLENBQUM7UUFWZSxpQkFBVSxhQVV6QjtRQUVZLGVBQVEsR0FBZ0M7WUFDakQsSUFBSSxFQUFFLDhDQUFJLENBQUMsR0FBRztZQUNkLE1BQU0sRUFBRSxvQkFBb0I7WUFDNUIsS0FBSyxFQUFFLE1BQU07WUFDYixRQUFRLEVBQUUsVUFBVTtZQUNwQixRQUFRLEVBQUUsVUFBVTtZQUNwQixLQUFLLEVBQUUsT0FBTztZQUNkLFdBQVcsRUFBRSxpQkFBaUI7U0FDeEIsQ0FBQztJQUNmLENBQUMsRUF0QmdCLE1BQU0sR0FBTiwyQkFBTSxLQUFOLDJCQUFNLFFBc0J0QjtJQUVELFNBQWdCLFFBQVEsQ0FBQyxNQUE0QjtRQUNqRCxPQUFPLFVBQVUsSUFBSSxNQUFNLENBQUM7SUFDaEMsQ0FBQztJQUZlLDZCQUFRLFdBRXZCO0lBRUQsU0FBZ0IsYUFBYTtRQUN6QixNQUFNLE1BQU0sR0FBeUI7WUFDakMsSUFBSSxFQUFFLFNBQVM7WUFDZixXQUFXLEVBQUUsRUFBRTtZQUNmLFVBQVUsRUFBRSxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsUUFBUTtZQUNwRCxRQUFRLEVBQUUsb0JBQW9CLENBQUMsUUFBUSxDQUFDLFFBQVE7WUFDaEQsTUFBTSxFQUFFLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxRQUFRO1lBQzVDLFFBQVEsRUFBRSxJQUFJO1NBQ2pCO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQVZlLGtDQUFhLGdCQVU1QjtJQUVELFNBQWdCLFVBQVUsQ0FBQyxNQUE0QjtRQUNuRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNsQixPQUFPLDBCQUEwQixDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN4RDthQUFNO1lBQ0gsTUFBTSxNQUFNLEdBQXlCO2dCQUNqQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQzVGLFdBQVcsRUFBRSxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztnQkFDckUsUUFBUSxFQUFFLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztnQkFDbkUsVUFBVSxFQUFFLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztnQkFDekUsTUFBTSxFQUFFLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDN0QsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO2FBQzVCO1lBQ0QsT0FBTyxNQUFNLENBQUM7U0FDakI7SUFDTCxDQUFDO0lBZGUsK0JBQVUsYUFjekI7SUFFRCxTQUFnQixlQUFlLENBQUMsUUFBc0M7UUFDbEUsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUM5QixNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBNkIsS0FBSyxDQUFDLENBQUM7UUFDNUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM1QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsMEJBQTBCLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2xFO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQVBlLG9DQUFlLGtCQU85QjtJQUVEOzs7O09BSUc7SUFDSCxTQUFnQixZQUFZLENBQUMsWUFBa0M7UUFDM0QsT0FBTyxrRUFBYyxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUF5QixDQUFDO0lBQ3RGLENBQUM7SUFGZSxpQ0FBWSxlQUUzQjtJQUVEOzs7T0FHRztJQUNILFNBQWdCLGNBQWMsQ0FBQyxjQUFvQztRQUMvRCxPQUFPLGtFQUFjLENBQUMsZUFBZSxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQXlCLENBQUM7SUFDekYsQ0FBQztJQUZlLG1DQUFjLGlCQUU3QjtBQUNMLENBQUMsRUFyTGdCLG9CQUFvQixLQUFwQixvQkFBb0IsUUFxTHBDO0FBU0QsY0FBYztBQUNQLElBQVUsMEJBQTBCLENBd0MxQztBQXhDRCxXQUFpQiwwQkFBMEI7SUFRdkMsSUFBaUIsTUFBTSxDQWdCdEI7SUFoQkQsV0FBaUIsTUFBTTtRQUNuQixTQUFnQixVQUFVLENBQUMsUUFBZ0I7WUFDdkMsT0FBTztnQkFDSCxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUs7Z0JBQ3JCLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTtnQkFDdkIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO2dCQUNuQixHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUc7YUFDcEI7UUFDTCxDQUFDO1FBUGUsaUJBQVUsYUFPekI7UUFFWSxlQUFRLEdBQXNDO1lBQ3ZELEtBQUssRUFBRSxJQUFJO1lBQ1gsTUFBTSxFQUFFLElBQUk7WUFDWixJQUFJLEVBQUUsSUFBSTtZQUNWLEdBQUcsRUFBRSxJQUFJO1NBQ0gsQ0FBQztJQUNmLENBQUMsRUFoQmdCLE1BQU0sR0FBTixpQ0FBTSxLQUFOLGlDQUFNLFFBZ0J0QjtJQUVELFNBQWdCLFVBQVUsQ0FBQyxRQUFvQztRQUMzRCxNQUFNLE1BQU0sR0FBK0I7WUFDdkMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ2hHLFdBQVcsRUFBRSxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztZQUN2RSxRQUFRLEVBQUUsb0JBQW9CLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1lBQ3JFLFVBQVUsRUFBRSxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7WUFDM0UsTUFBTSxFQUFFLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUMvRCxRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7WUFDM0IsYUFBYSxFQUFFLFFBQVEsQ0FBQyxhQUFhO1lBQ3JDLE1BQU0sRUFBRSwwQkFBMEIsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFDckUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRO1NBQzlCO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQWJlLHFDQUFVLGFBYXpCO0FBQ0wsQ0FBQyxFQXhDZ0IsMEJBQTBCLEtBQTFCLDBCQUEwQixRQXdDMUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDL21Ca0U7QUFHUztBQUl0QjtBQUMrQjtBQUNOO0FBRS9FLGNBQWM7QUFDUCxNQUFNLGtCQUFtQixTQUFRLDhEQUFZO0lBa0RoRCxnQkFBZ0I7SUFDaEI7SUFDSSxnQkFBZ0I7SUFDQyxPQUFvQztJQUNyRCxnQkFBZ0I7SUFDQyxPQUFzQjtJQUN2QyxnQkFBZ0I7SUFDQyxjQUE2QjtJQUM5QyxnQkFBZ0I7SUFDQyxRQUFxQjtJQUN0QyxnQkFBZ0I7SUFDQyxzQkFBdUU7SUFDeEYsZ0JBQWdCO0lBQ0MsVUFBK0M7SUFDaEUsZ0JBQWdCO0lBQ0MsVUFBK0M7SUFDaEUsZ0JBQWdCO0lBQ0MsV0FBaUQ7SUFDbEUsZ0JBQWdCO0lBQ0MsVUFBK0M7UUFFaEUsS0FBSyxFQUFFLENBQUM7UUFsQlMsWUFBTyxHQUFQLE9BQU8sQ0FBNkI7UUFFcEMsWUFBTyxHQUFQLE9BQU8sQ0FBZTtRQUV0QixtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUU3QixhQUFRLEdBQVIsUUFBUSxDQUFhO1FBRXJCLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBaUQ7UUFFdkUsZUFBVSxHQUFWLFVBQVUsQ0FBcUM7UUFFL0MsZUFBVSxHQUFWLFVBQVUsQ0FBcUM7UUFFL0MsZ0JBQVcsR0FBWCxXQUFXLENBQXNDO1FBRWpELGVBQVUsR0FBVixVQUFVLENBQXFDO1FBaERwRSxnQkFBZ0I7UUFDUixvQkFBZSxHQUFHLEtBQUssQ0FBQztRQW1ENUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQztRQUV2QyxJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7UUFDNUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztRQUM1QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFFakMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFdkUsSUFBSSxDQUFDLCtDQUErQyxFQUFFLENBQUM7SUFDM0QsQ0FBQztJQXZERCxJQUFJLEtBQUssS0FBYSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzNDLElBQUksTUFBTSxLQUFhLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDN0MsSUFBSSxNQUFNLEtBQW9CLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDcEQsaUZBQWlGO0lBQ2pGLElBQUksYUFBYSxLQUFnQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQzlELElBQUksYUFBYSxLQUFnQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQzlELElBQUksT0FBTyxLQUFjLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQy9ELElBQUksU0FBUyxLQUFtQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUN4RixJQUFJLEdBQUcsS0FBVSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLElBQUksS0FBSyxLQUFhLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2xELElBQUksYUFBYSxLQUFvQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLElBQUksUUFBUSxLQUFjLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNsRCxJQUFJLE9BQU8sS0FBYyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ2hELElBQUksS0FBSyxLQUE0QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzFELHlDQUF5QztJQUN6QyxJQUFJLFlBQVksS0FBNEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUN4RSxpRkFBaUY7SUFDakYsSUFBSSxPQUFPLEtBQWtCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUF3Q3BELGdCQUFnQjtJQUNoQixPQUFPO1FBQ0gsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztRQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxrRUFBa0U7SUFDbEUsVUFBVTtRQUNOLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSTtRQUNBLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSTtRQUNBLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsYUFBYSxHQUFHLEtBQUs7UUFDdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUs7UUFDdEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNILE9BQU8sQ0FBQyxLQUFhLEVBQUUsTUFBYztRQUNqQyxJQUFJLFlBQVksR0FBdUIsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUNwRCxJQUFJLFlBQVksQ0FBQyxRQUFRLElBQUksWUFBWSxDQUFDLEtBQUssSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRTtZQUM3RSxNQUFNLElBQUksK0RBQVcsQ0FBQyxTQUFTLEVBQUUsaURBQWlELENBQUMsQ0FBQztTQUN2RjthQUFNO1lBQ0gsSUFBSSxpQkFBOEIsQ0FBQztZQUNuQyxHQUFHO2dCQUNDLGlCQUFpQixHQUFHLFlBQVksQ0FBQztnQkFDakMsWUFBWSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUM7YUFDdEMsUUFBUSxZQUFZLEtBQUssSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUU7WUFFakYsSUFBSSxZQUFZLEtBQUssSUFBSSxFQUFFO2dCQUN2Qix5QkFBeUI7Z0JBQ3pCLE9BQU8sS0FBSyxDQUFDO2FBQ2hCO2lCQUFNO2dCQUNILGdDQUFnQztnQkFDaEMsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQzdELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDcEMsSUFBSSxXQUFXLEtBQUssSUFBSSxFQUFFO29CQUN0QixNQUFNLElBQUksdUVBQW1CLENBQUMsYUFBYSxDQUFDLENBQUM7aUJBQ2hEO3FCQUFNO29CQUNILE1BQU0sT0FBTyxHQUFHLFNBQVMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO29CQUV4RCxNQUFNLFVBQVUsR0FBRyxXQUFXLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDdEUsTUFBTSxVQUFVLEdBQUcsQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLEdBQUcsR0FBRyxDQUFDO29CQUNoRCxNQUFNLEtBQUssR0FBRyxDQUFDLGlCQUFpQixDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUU3RixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7d0JBQ3ZELE1BQU0sdUJBQXVCLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDN0QsSUFBSSx1QkFBdUIsS0FBSyxpQkFBaUIsRUFBRTs0QkFDL0MsdUJBQXVCLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQzt5QkFDN0M7NkJBQU07NEJBQ0gsdUJBQXVCLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQzt5QkFDekM7cUJBQ0o7b0JBRUQsWUFBWSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFFL0IsT0FBTyxJQUFJLENBQUM7aUJBQ2Y7YUFDSjtTQUNKO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUN4QjtJQUNMLENBQUM7SUFFRCxrREFBa0Q7SUFDbEQsZ0JBQWdCLENBQUMsVUFBK0I7UUFDNUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFeEIsSUFBSSxDQUFDLHNEQUFVLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUM7U0FDeEU7YUFBTTtZQUNILE1BQU0sTUFBTSxHQUFHLCtEQUFtQixDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDOUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDO1lBQzNDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUNqQyxJQUFJLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7WUFFM0MsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRXBDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3RFLElBQUksQ0FBQywrQ0FBK0MsRUFBRSxDQUFDO1lBRXZELElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUU7Z0JBQzlCLElBQUksSUFBSSxDQUFDLG9DQUFvQyxLQUFLLFNBQVMsRUFBRTtvQkFDekQsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ2xFO2dCQUNELElBQUksSUFBSSxDQUFDLDJCQUEyQixLQUFLLFNBQVMsRUFBRTtvQkFDaEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDckQsSUFBSTt3QkFDQSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3FCQUNyRTs0QkFBUzt3QkFDTixJQUFJLENBQUMsY0FBYyxDQUFDLDRCQUE0QixFQUFFLENBQUM7cUJBQ3REO2lCQUNKO2dCQUNELElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2FBQy9CO1lBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUM3QjtJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsUUFBUTtRQUNKLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsV0FBVyxDQUFDLEtBQThCO1FBQ3RDLE1BQU0sYUFBYSxHQUFHLHdEQUFVLENBQUMsSUFBSSxDQUFDLE1BQWlDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDaEYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUEwQixDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7T0FHRztJQUNILFFBQVEsQ0FBQyxLQUFnQjtRQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVEsQ0FBQyxLQUFhO1FBQ2xCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsTUFBTSxDQUFDLEdBQVE7UUFDWCxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7SUFDekIsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixhQUFhLENBQUMsS0FBYztRQUN4QixJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFO1lBQzlCLElBQUksSUFBSSxDQUFDLG9DQUFvQyxLQUFLLFNBQVMsRUFBRTtnQkFDekQsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQzthQUMxRDtTQUNKO1FBRUQsSUFBSSxLQUFLLEVBQUU7WUFDUCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDaEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7Z0JBQ3JCLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7b0JBQ3pDLElBQUksQ0FBQywwQkFBMEIsR0FBRyxJQUFJLENBQUM7aUJBQzFDO3FCQUFNO29CQUNILElBQUksQ0FBQywwQkFBMEIsR0FBRyxLQUFLLENBQUM7b0JBQ3hDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ3hELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztpQkFDbkI7YUFDSjtpQkFBTTtnQkFDSCxJQUFJLElBQUksQ0FBQywwQkFBMEIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLEVBQUU7b0JBQzlFLElBQUksQ0FBQywwQkFBMEIsR0FBRyxLQUFLLENBQUM7b0JBQ3hDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ3hELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztpQkFDbkI7YUFDSjtTQUNKO2FBQU07WUFDSCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7Z0JBQ3RCLElBQUksQ0FBQywwQkFBMEIsR0FBRyxLQUFLLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzthQUNuQjtTQUNKO0lBQ0wsQ0FBQztJQUVELG9CQUFvQjtRQUNoQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsdURBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsYUFBNEI7UUFDekMsSUFBSSxhQUFhLEtBQUssSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QyxJQUFJLENBQUMsY0FBYyxHQUFHLGFBQWEsQ0FBQztZQUVwQyxJQUFJLENBQUMsaUNBQWlDLEVBQUUsQ0FBQztTQUM1QztJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsYUFBYSxDQUFDLEtBQWEsRUFBRSxNQUFjO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQ3RCLDZEQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN0Qyw4REFBZ0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXhDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx1REFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNoQixDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLFlBQVk7UUFDUixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLG1CQUFtQjtRQUNmLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyx1REFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsa0JBQWtCO1FBQ2QsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFDakMsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixJQUFJO1FBQ0EsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRTtZQUM5QixJQUFJLElBQUksQ0FBQywyQkFBMkIsS0FBSyxTQUFTLEVBQUU7Z0JBQ2hELElBQUksQ0FBQyxjQUFjLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JELElBQUk7b0JBQ0EsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDckU7d0JBQVM7b0JBQ04sSUFBSSxDQUFDLGNBQWMsQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO2lCQUN0RDthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxpQkFBaUIsQ0FBQyxLQUFhLEVBQUUsTUFBYyxFQUFFLEtBQWM7UUFDM0QsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLE1BQU0sSUFBSSxNQUFNLEtBQUssSUFBSSxDQUFDLE9BQU8sSUFBSSxLQUFLLEVBQUU7WUFDM0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFDcEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7WUFDdEIsNkRBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLDhEQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFeEMsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRTtnQkFDOUIsSUFBSSxDQUFDLHVDQUF1QyxFQUFFLENBQUM7YUFDbEQ7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7YUFDdkM7U0FDSjtJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsNEJBQTRCO1FBQ3hCLElBQUksSUFBSSxDQUFDLDJCQUEyQixLQUFLLFNBQVMsRUFBRTtZQUNoRCxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2xFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDcEIsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7U0FDdkM7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IsaUNBQWlDO1FBQ3JDLElBQUksSUFBSSxDQUFDLGdDQUFnQyxLQUFLLFNBQVMsRUFBRTtZQUNyRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQzFDLE1BQU0sYUFBYSxHQUFHLG1FQUF5QixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQy9ELElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxJQUFJLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1NBQzdFO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNSLCtDQUErQztRQUNuRCxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFO1lBQzlCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7U0FDM0M7YUFBTTtZQUNILElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUMsQ0FBQyxpQ0FBaUM7U0FDdkU7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IsdUNBQXVDO1FBQzNDLElBQUksQ0FBQyxjQUFjLENBQUMsZ0NBQWdDLEVBQUUsQ0FBQztRQUN2RCxJQUFJO1lBQ0EsSUFBSSxDQUFDLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN0RDtnQkFBUztZQUNOLElBQUksQ0FBQyxjQUFjLENBQUMsOEJBQThCLEVBQUUsQ0FBQztTQUN4RDtJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDUiw0QkFBNEI7UUFDaEMsSUFBSSxJQUFJLENBQUMsMEJBQTBCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQzlFLElBQUksQ0FBQywwQkFBMEIsR0FBRyxLQUFLLENBQUM7WUFDeEMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ25CO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNSLFFBQVE7UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUVELGdCQUFnQjtJQUNSLFFBQVE7UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxnQkFBZ0I7SUFDUixnQkFBZ0I7UUFDcEIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1NBQzdCO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzNHLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3RkMkg7QUFDOUQ7QUFDMkI7QUFFcEM7QUFFQztBQUNOO0FBQ2tEO0FBRWxHOzs7Ozs7Ozs7O0dBVUc7QUFFSSxNQUFNLGFBQWMsU0FBUSw4REFBWTtJQVkzQzs7OztPQUlHO0lBQ0g7SUFDSSxnQkFBZ0I7SUFDUixPQUFtQztJQUMzQyxnQkFBZ0I7SUFDUixrQkFBd0I7SUFDaEMsZ0JBQWdCO0lBQ1IsY0FBNkI7UUFFckMsS0FBSyxFQUFFLENBQUM7UUFOQSxZQUFPLEdBQVAsT0FBTyxDQUE0QjtRQUVuQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQU07UUFFeEIsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFJckMsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDNUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztRQUNsQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQXJCRCxJQUFJLGFBQWEsS0FBYyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBdUI1RCxRQUFROztRQUNKLElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxLQUFLLEVBQUU7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO1NBQ3ZFO1FBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRWpELElBQUksSUFBbUIsQ0FBQztRQUN4QixJQUFJLEdBQWtCLENBQUM7UUFDdkIsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLElBQUksRUFBRTtZQUM3QixJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQ1osR0FBRyxHQUFHLElBQUksQ0FBQztTQUNkO2FBQU07WUFDSCxJQUFJLEdBQUcsVUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLG1DQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDO1lBQ25FLEdBQUcsR0FBRyxVQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sbUNBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUM7U0FDcEU7UUFFRCxNQUFNLE1BQU0sR0FBc0M7WUFDOUMsS0FBSyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxLQUFLO1lBQ2pDLE1BQU0sRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsTUFBTTtZQUNuQyxJQUFJO1lBQ0osR0FBRztTQUNOLENBQUM7UUFFRixNQUFNLE1BQU0sR0FBK0I7WUFDdkMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLElBQUk7WUFDM0IsV0FBVyxFQUFFLGdCQUFnQixDQUFDLFdBQVc7WUFDekMsUUFBUSxFQUFFLGdCQUFnQixDQUFDLFFBQVE7WUFDbkMsVUFBVSxFQUFFLGdCQUFnQixDQUFDLFVBQVU7WUFDdkMsTUFBTSxFQUFFLGdCQUFnQixDQUFDLE1BQU07WUFDL0IsTUFBTTtZQUNOLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVE7WUFDL0IsYUFBYSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYTtZQUN6QyxRQUFRLEVBQUUsSUFBSTtTQUNqQixDQUFDO1FBRUYsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVELGFBQWE7UUFDVCxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSSxFQUFFO1lBQzdCLE1BQU0sSUFBSSx1RUFBbUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUMvQztRQUNELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxTQUFTO1FBQ0wsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLElBQUksRUFBRTtZQUM3QixNQUFNLElBQUksdUVBQW1CLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDL0M7UUFDRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDOUIsQ0FBQztJQUVELEtBQUssQ0FBQyxZQUFZLEdBQUcsS0FBSztRQUN0QixJQUFJLFlBQVksRUFBRTtZQUNkLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7U0FDcEM7UUFFRCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRTtZQUN0QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDdEM7YUFBTTtZQUNILElBQUk7Z0JBQ0EsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO2FBQzVCO1lBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ1IsRUFBRTthQUNMO1NBQ0o7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSztRQUNELElBQUksVUFBVSxHQUF1QixJQUFJLENBQUM7UUFDMUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7UUFFdkM7Ozs7Ozs7O1VBUUU7UUFDRixNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNqRSxNQUFNLDRCQUE0QixHQUFHLHdEQUFVLENBQUMsRUFBRSxFQUFFLHNCQUFzQixDQUF5QixDQUFDO1FBQ3BHLElBQUksVUFBVSxHQUFHLDRCQUE0QixDQUFDLElBQUksQ0FBQztRQUNuRCxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUU7WUFDMUIsT0FBTztTQUNWO1FBQ0QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUM7UUFDbEQsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFO1lBQzFCLE1BQU0sSUFBSSw0RUFBd0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNwRDtRQUVELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUU7WUFDdkIsVUFBVSxHQUFHLFVBQVUsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzdFO1FBRUQ7OztVQUdFO1FBQ0YsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNiLElBQUksVUFBVSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUNwQyxVQUFVLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMzQztpQkFBTTtnQkFDSCxVQUFVLEdBQUcsVUFBVSxDQUFDO2FBQzNCO1lBQ0QsS0FBSyxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO1NBQzFDO1FBRUQsSUFBSSxVQUFVLENBQUMsT0FBTyxFQUFFO1lBQ3BCLHVHQUF1RztZQUN2RyxPQUFPLFVBQVUsQ0FBQyxJQUFJLEtBQUssa0RBQVEsQ0FBQyxTQUFTLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUM5RSxVQUFVLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN0QztZQUVELDZGQUE2RjtZQUM3RixJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssa0RBQVEsQ0FBQyxTQUFTLEVBQUU7Z0JBQ3hDLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxJQUFJLEVBQUU7b0JBQzVCLE1BQU0sSUFBSSx1RUFBbUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztpQkFDL0M7Z0JBRUQsTUFBTSxHQUFHLEdBQUcsSUFBSSw2REFBVyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLGtGQUE2QixDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQy9ILFVBQVUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZELEdBQUcsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3pCLFVBQVUsR0FBRyxHQUFHLENBQUM7Z0JBQ2pCLEtBQUssR0FBRyxDQUFDLENBQUM7YUFDYjtTQUNKO1FBRUQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFNUYsS0FBSyxHQUFHLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUMvRixVQUFVLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUU7WUFDeEQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ25CO2FBQU07WUFDSCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDaEI7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLFlBQVk7UUFDaEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRTdCOzs7O1dBSUc7UUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFaEU7O1dBRUc7UUFDSCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUM7WUFDMUMsSUFBSSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJO1lBQ2xDLEdBQUcsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRztZQUNoQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUs7WUFDcEMsTUFBTSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNO1lBQ3RDLFVBQVUsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSztZQUN6QyxXQUFXLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU07WUFDM0MsT0FBTyxFQUFFLElBQUk7WUFDYixPQUFPLEVBQUUsSUFBSTtZQUNiLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLEtBQUs7WUFDaEIsVUFBVSxFQUFFLElBQUk7WUFDaEIsTUFBTSxFQUFFLElBQUk7U0FDZixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsYUFBYSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUU1RCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNyQixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyx3QkFBd0IsS0FBSyxJQUFJLEVBQUU7Z0JBQzdFLE1BQU0sS0FBSyxHQUFHLElBQUksc0VBQWtCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDdkQsTUFBTSxLQUFLLENBQUM7YUFDZjtpQkFBTTtnQkFDSCxPQUFPO2FBQ1Y7U0FDSjtRQUVELElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRTtZQUM3QyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUUvQixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRTtvQkFDckQsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFO3dCQUN0RixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7cUJBQ2hCO3lCQUFNO3dCQUNILElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztxQkFDbkI7Z0JBQ0wsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7YUFDekI7UUFDTCxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUV0Qjs7Ozs7V0FLRztRQUNILElBQUksQ0FBQyxtQkFBbUIsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRCxnQkFBZ0I7SUFDUixVQUFVO1FBQ2QsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLElBQUksRUFBRTtZQUM3QixNQUFNLElBQUksdUVBQW1CLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDOUM7YUFBTTtZQUNILElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFO2dCQUNsRixJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztnQkFDN0QsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUNyQixJQUFJLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxTQUFTLEVBQUU7b0JBQ3hDLGFBQWEsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztvQkFDeEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFNBQVMsQ0FBQztpQkFDeEM7YUFDSjtTQUNKO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ssdUJBQXVCO1FBQzNCLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxJQUFJLEVBQUU7WUFDN0IsTUFBTSxJQUFJLHVFQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQzVDO1FBRUQsZ0ZBQWdGO1FBQ2hGLDBGQUEwRjtRQUMxRixvRUFBb0U7UUFDcEUsd0dBQXdHO1FBQ3hHLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLENBQUM7WUFDdkUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLENBQUM7WUFDdkUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVO1lBQzlELElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFO1lBRWxFLE1BQU0sTUFBTSxHQUFHLG9FQUFzQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMxRCxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FDckIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxFQUMzQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQzlDO1lBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQ3ZCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxFQUMvRixJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FDckcsQ0FBQztTQUNMO1FBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNLLHVCQUF1QixDQUFDLGFBQThDO1FBQzFFLE1BQU0sbUJBQW1CLEdBQWEsRUFBRSxDQUFDO1FBRXpDLEtBQUssTUFBTSxHQUFHLElBQUksYUFBYSxFQUFFO1lBQzdCLG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQ3ZFO1FBRUQsT0FBTyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLFNBQVM7UUFDYixNQUFNLFVBQVUsR0FBRyxtQkFBbUIsR0FBRyx5REFBVyxFQUFFLENBQUM7UUFDdkQsTUFBTSxNQUFNLEdBQUcseUVBQW9CLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUvRCxJQUFJO1lBQ0EsWUFBWSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1NBQzVEO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDUixNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxHQUFHLDZEQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNoRjtRQUVELE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkQsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRTlDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDMUQsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3JCLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUMzQztRQUVELE9BQU8sR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssYUFBYTtRQUNqQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRDs7O09BR0c7SUFDSyxRQUFRO1FBQ1osVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDOUMsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2xZd0M7QUFFZ0Q7QUFDbkM7QUFFRTtBQUVNO0FBRTlELGdCQUFnQjtBQUNoQixNQUFNLFVBQVU7SUFDWixZQUNxQixNQUFrQixFQUNsQixLQUF1QixFQUN2QixNQUFjLEVBQ2QsTUFBYztRQUhkLFdBQU0sR0FBTixNQUFNLENBQVk7UUFDbEIsVUFBSyxHQUFMLEtBQUssQ0FBa0I7UUFDdkIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDL0IsSUFBSSxNQUFNLENBQUMsYUFBYSxLQUFLLEtBQUssQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFO1lBQzFELE1BQU0sS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7U0FDakU7SUFDTCxDQUFDO0lBRUQsSUFBSSxLQUFLLEtBQWlCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDL0MsSUFBSSxJQUFJLEtBQXVCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFFbkQsSUFBSSxDQUFDLElBQW1CO1FBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxpQkFBaUI7UUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xGLENBQUM7Q0FDSjtBQUVELGdCQUFnQjtBQUNULE1BQU0sVUFBVyxTQUFRLDhEQUFZO0lBaUJ4QyxZQUNxQixjQUE2QixFQUM3QixlQUF3QixLQUFLLEVBQzdCLFVBQTZCLElBQUk7UUFFbEQsS0FBSyxFQUFFLENBQUM7UUFKUyxtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUM3QixpQkFBWSxHQUFaLFlBQVksQ0FBaUI7UUFDN0IsWUFBTyxHQUFQLE9BQU8sQ0FBMEI7UUFuQjlDLGVBQVUsR0FBcUIsSUFBSSxDQUFDO1FBQ3BDLG1CQUFjLEdBQXNCLElBQUksQ0FBQztRQUN6QyxrQkFBYSxHQUF3QixJQUFJLENBQUM7UUFFMUMsYUFBUSxHQUFpQixFQUFFLENBQUM7UUFFbkIsc0JBQWlCLEdBQUcsQ0FBQyxRQUFnQixFQUFFLFFBQWdCLEVBQUUsS0FBNkIsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5RywwQkFBcUIsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFlN0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUNoRCxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQWZELElBQUksYUFBYSxLQUFvQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLElBQUksTUFBTSxLQUF3QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3hELElBQUksS0FBSyxLQUF1QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ3pELElBQVksWUFBWSxhQUFpQixPQUFPLFVBQUksQ0FBQyxPQUFPLG1DQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDdkUsSUFBSSxhQUFhLEtBQXdCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ25GLElBQVksYUFBYSxDQUFDLEtBQXlCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztJQVkxRixtQkFBbUI7UUFDdkIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsS0FBSyxTQUFTLEVBQUU7WUFDOUMsTUFBTSxJQUFJLDRFQUF3QixDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ3BEO2FBQU07WUFDSCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUM1RSxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUM7Z0JBQ3BCLENBQUMsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSTtnQkFDdkMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHO2dCQUNyQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7Z0JBQ2pCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTthQUN0QixDQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7SUFFTyxZQUFZLENBQUMsT0FBZSxFQUFFLE9BQWU7UUFDakQsTUFBTSxXQUFXLEdBQUcsMEVBQTRCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFN0QsT0FBTztZQUNILENBQUMsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLEdBQUcsV0FBVyxDQUFDLElBQUk7WUFDeEQsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sR0FBRyxXQUFXLENBQUMsR0FBRztTQUN6RCxDQUFDO0lBQ04sQ0FBQztJQUVPLGNBQWMsQ0FBQyxLQUFnQixFQUFFLEtBQWMsRUFBRSxLQUFhO1FBQ2xFLE9BQU8sQ0FDSCxLQUFLLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLFVBQVU7WUFDbkQsS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSztZQUNoQyxLQUFLLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLFdBQVc7WUFDbkQsS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUNwQyxDQUFDO0lBQ04sQ0FBQztJQUVPLFdBQVcsQ0FBQyxJQUFtQixFQUFFLENBQVMsRUFBRSxDQUFTO1FBQ3pELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxrREFBUyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFTyxTQUFTLENBQUMsS0FBYSxFQUFFLEtBQWE7UUFDMUMsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksRUFBRTtZQUMxQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDaEQsT0FBTyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztTQUM1RTthQUFNO1lBQ0gsT0FBTyxJQUFJLENBQUM7U0FDZjtJQUNMLENBQUM7SUFFTyxVQUFVLENBQUMsT0FBZSxFQUFFLE9BQWU7O1FBQy9DLE1BQU0sTUFBTSxHQUFHLFVBQUksQ0FBQyxPQUFPLDBDQUFFLFVBQVUsQ0FBQztRQUN4QyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1QsTUFBTSxJQUFJLHVFQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzFDO1FBRUQsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ25FLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxlQUFlLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVwRyxJQUFJLE9BQU8sRUFBRTtZQUNULElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJLEVBQUU7Z0JBQzFCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDO2dCQUU3QyxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7b0JBQ3RCLE1BQU0sSUFBSSw0RUFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDL0M7Z0JBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDL0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxnRUFBYSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUN2RSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDNUM7U0FDSjthQUFNO1lBQ0gsMEVBQTBFO1lBQzFFLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJLElBQUksV0FBSSxDQUFDLGFBQWEsMENBQUUsS0FBSyxNQUFLLElBQUksRUFBRTtnQkFDaEUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2FBQ3JCO1NBQ0o7UUFFRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFTyxVQUFVOztRQUNkLEtBQUssTUFBTSxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNoQyxNQUFNLENBQUMsYUFBYSxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDL0MsWUFBTSxDQUFDLFVBQVUsMENBQUUsSUFBSSxFQUFFLENBQUM7WUFDMUIsTUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7U0FDNUI7UUFFRCxVQUFJLENBQUMsYUFBYSwwQ0FBRSxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3hELFVBQUksQ0FBQyxhQUFhLDBDQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDMUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7SUFDL0IsQ0FBQztJQUVPLE1BQU0sQ0FBQyxLQUE2QjtRQUN4QyxJQUFJLE1BQU0sR0FBc0IsSUFBSSxDQUFDO1FBRXJDLHFEQUFxRDtRQUNyRCxnRkFBZ0Y7UUFDaEYsa0hBQWtIO1FBQ2xILEtBQUssTUFBTSxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNoQyxJQUFJLENBQUMsR0FBc0IsSUFBSSxDQUFDO1lBRWhDLElBQUksTUFBTSxLQUFLLElBQUksRUFBRTtnQkFDakIsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDdkQ7aUJBQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksRUFBRTtnQkFDakMsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDaEQ7WUFFRCw4RUFBOEU7WUFDOUUsb0hBQW9IO1lBQ3BILElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxFQUFFO2dCQUMvRSxNQUFNLEdBQUcsQ0FBQyxDQUFDO2FBQ2Q7U0FDSjtRQUVELElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RDLHNGQUFzRjtZQUN0RixJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxNQUFLLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxLQUFLLEdBQUU7Z0JBQzNFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2FBQ3BFO1lBRUQsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFO2dCQUNqQixvR0FBb0c7Z0JBQ3BHLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMvQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRXBDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUMzQixNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsQ0FBQzthQUM5QztZQUVELElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDO1NBQy9CO0lBQ0wsQ0FBQztJQUVELHVHQUF1RztJQUN2RyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQTRCLEVBQUUsTUFBa0I7UUFDekQsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLElBQUksRUFBRTtZQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7U0FDNUU7UUFFRCxPQUFPLElBQUksVUFBVSxDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELDREQUE0RDtJQUM1RCxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQTRCLEVBQUUsUUFBc0IsRUFBRSxJQUFtQixFQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsV0FBb0I7UUFDOUgsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzFELE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvQixNQUFNLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQztRQUNoQyxRQUFRLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM5QyxRQUFRLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUN0RCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0NBQ0o7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDak53RjtBQUdsRDtBQUdlO0FBQ0E7QUFLOUI7QUFHeEI7Ozs7O0dBS0c7QUFDSSxNQUFNLFNBQVUsU0FBUSw4REFBWTtJQWtCdkM7Ozs7T0FJRztJQUNILFlBQ3FCLE9BQW1CLEVBQ25CLGNBQTZCLEVBQzlDLENBQVMsRUFBRSxDQUFTO1FBRXBCLEtBQUssRUFBRSxDQUFDO1FBSlMsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQUNuQixtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQWYxQyxjQUFTLEdBQTRCLElBQUksQ0FBQztRQW9COUMsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUV6QywwRkFBMEY7UUFDMUYsZ0ZBQWdGO1FBQ2hGLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLFlBQVksK0NBQUssRUFBRTtZQUM3QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQ25FLElBQUksTUFBTSxFQUFFO2dCQUNSLGNBQWMsR0FBRyxNQUFNLENBQUM7YUFDM0I7U0FDSjtRQUVELElBQUksQ0FBQyxhQUFhLEdBQUcsY0FBYyxDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFDakUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUVuQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRTtZQUNyQyxxR0FBcUc7WUFDckcsTUFBTSxJQUFJLHVFQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzdDO1FBRUQsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDO1FBQ3pELElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQzVCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDOUI7UUFFRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFdEQsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRTtZQUN2RSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNyRTtRQUVELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUVyQixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFekMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsS0FBSyxTQUFTLEVBQUU7WUFDN0MsTUFBTSxJQUFJLDRFQUF3QixDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ2xEO1FBRUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNsRSxJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQTNERCxJQUFJLE9BQU8sS0FBa0IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNwRCxJQUFJLFVBQVUsS0FBYSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQ3JELElBQUksV0FBVyxLQUFhLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDdkQsSUFBSSxhQUFhLEtBQW9CLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFDbEUsSUFBSSxhQUFhLEtBQW9CLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBeUR6RSxtRUFBbUU7SUFDM0QsdUJBQXVCLENBQUMsUUFBZ0IsRUFBRSxRQUFnQjs7UUFDOUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsZ0NBQWtDLENBQUM7UUFDOUQsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwRCxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsMEJBQStCLENBQUM7UUFDM0QsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsRCxXQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsc0JBQTZCLENBQUM7UUFDdkQsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqRCxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsb0JBQTRCLENBQUM7UUFDckQsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwRCxZQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsd0JBQThCLENBQUM7UUFDekQsVUFBVSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNyQyxXQUFXLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3BDLGFBQWEsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFdkMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxHQUFHLDRCQUFnQyxDQUFDO1FBRTFFLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBRXZELE1BQU0sSUFBSSxHQUFHLFVBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSwwQ0FBRSxJQUFJLENBQUM7UUFDcEQsSUFBSSxJQUFJLEVBQUU7WUFDTixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsOENBQUksQ0FBQyxLQUFLLEVBQUUsOENBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQztZQUMxQyxJQUFJLENBQUMsOENBQUksQ0FBQyxLQUFLLEVBQUUsOENBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUM5QyxJQUFJLENBQUMsc0JBQXNCLENBQUMscUJBQXFCLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDO2FBQ2hGO1NBQ0o7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsNERBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsNERBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuRCxVQUFVLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVELFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILElBQUksQ0FBQyxDQUFTLEVBQUUsQ0FBUztRQUNyQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzNCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssZUFBZSxDQUFDLENBQVMsRUFBRSxDQUFTO1FBQ3hDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyw0REFBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyw0REFBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTVDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUU5Qyw4R0FBOEc7UUFDOUcsb0VBQW9FO1FBQ3BFLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUU7WUFDN0gsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7U0FDekI7UUFFRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFJO1FBQ0EsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVuQyxJQUFJLElBQUksR0FBNEIsSUFBSSxDQUFDO1FBQ3pDLElBQUksb0JBQW9CLEdBQXlCLElBQUksQ0FBQztRQUV0RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztRQUMxQyxJQUFJLE9BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxLQUFLLE1BQUssSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztTQUN0QjtRQUVEOztVQUVFO1FBQ0YsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQ2Ysb0JBQW9CLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUMzQyxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7WUFDOUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3hELElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFckM7OztlQUdHO1NBQ0Y7YUFBTSxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssSUFBSSxFQUFFO1lBQ3hELE1BQU0sV0FBVyxHQUFHLDBFQUE0QixDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRTdELE1BQU0sTUFBTSxHQUF1QztnQkFDL0MsSUFBSSxFQUFFLFdBQVcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVO2dCQUNoRCxHQUFHLEVBQUUsV0FBVyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVM7Z0JBQzdDLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUs7Z0JBQy9CLE1BQU0sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU07YUFDcEM7WUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLHlEQUFXLEVBQUUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDNUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUVsQzs7OztlQUlHO1NBQ0Y7YUFBTTtZQUNILElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxpREFBaUQ7U0FDbkY7UUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRTVELElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQzVCLG9CQUFvQixhQUFwQixvQkFBb0IsdUJBQXBCLG9CQUFvQixDQUFFLEtBQUssRUFBRSxDQUFDO1NBQ2pDO1FBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssYUFBYTtRQUNqQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUM7UUFDOUQsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFO1lBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztTQUNwRTtRQUVELElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBQyxjQUFjLENBQUM7UUFDdEMsSUFBSSxNQUFNLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQztRQUN4QyxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtZQUM3QyxNQUFNLElBQUksS0FBSyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7U0FDN0U7UUFFRCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQztRQUMzQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDO1FBQ3pHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyw0REFBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyw0REFBYyxDQUFDLE1BQU0sQ0FBQztRQUNuRCxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyw0REFBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLDREQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDL0IsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDalFtRixDQUFDLDRCQUE0QjtBQUN2QztBQUNlO0FBQ2pDO0FBQ047QUFFSTtBQUVYO0FBRTNDOzs7O0dBSUc7QUFDSSxNQUFNLFVBQVU7SUFRbkIsZ0JBQWdCO0lBQ2hCO0lBQ0ksZ0JBQWdCO0lBQ1IsY0FBNkI7SUFDckMsZ0JBQWdCO0lBQ0MsUUFBcUI7SUFDdEMsZ0JBQWdCO0lBQ0MsMkJBQTBDO0lBQzNELCtFQUErRTtJQUN2RSxtQkFBcUc7SUFDN0csZ0RBQWdEO0lBQ3hDLGVBQXNDO0lBQzlDLGdEQUFnRDtJQUN4QyxNQUEwQjtJQUNsQyxnREFBZ0Q7SUFDeEMsR0FBdUI7UUFadkIsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFFcEIsYUFBUSxHQUFSLFFBQVEsQ0FBYTtRQUVyQixnQ0FBMkIsR0FBM0IsMkJBQTJCLENBQWU7UUFFbkQsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFrRjtRQUVyRyxvQkFBZSxHQUFmLGVBQWUsQ0FBdUI7UUFFdEMsV0FBTSxHQUFOLE1BQU0sQ0FBb0I7UUFFMUIsUUFBRyxHQUFILEdBQUcsQ0FBb0I7UUFFL0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFFMUIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFM0QsTUFBTSxtQkFBbUIsR0FBRyxrRkFBNkIsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0UsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksMERBQVUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLG1CQUFtQixFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBRXBILElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFSjs7O09BR0c7SUFDSCxPQUFPO1FBQ04sSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGtCQUFrQjtRQUN0QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUUxQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksOERBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQ3ZGLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxXQUFXLENBQUMsQ0FBUyxFQUFFLENBQVM7O1FBQ3BDLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQztRQUN6QixJQUFJLG9CQUErQyxDQUFDO1FBRXBELElBQUksT0FBTyxJQUFJLENBQUMsbUJBQW1CLEtBQUssVUFBVSxFQUFFO1lBQ2hELE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFrRSxDQUFDO1lBQzNILGtHQUFrRztZQUNsRyxJQUFJLFVBQVUsQ0FBQywrQkFBK0IsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFO2dCQUNyRSxvQkFBb0IsR0FBRztvQkFDbkIsSUFBSTtvQkFDSixjQUFjLEVBQUUsdUJBQXVCLENBQUMsS0FBSztvQkFDN0MsYUFBYSxFQUFFLHVCQUF1QixDQUFDLElBQUk7b0JBQzNDLEtBQUssRUFBRSw2QkFBdUIsQ0FBQyxLQUFLLG1DQUFJLElBQUksQ0FBQyxNQUFNO2lCQUN0RCxDQUFDO2FBQ0w7aUJBQU07Z0JBQ0gsb0JBQW9CLEdBQUcsdUJBQXVCLENBQUM7YUFDbEQ7U0FDSjthQUFNO1lBQ0gsb0JBQW9CLEdBQUc7Z0JBQ25CLElBQUk7Z0JBQ0osY0FBYyxFQUFFLElBQUksQ0FBQyxlQUFlO2dCQUNwQyxhQUFhLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtnQkFDdkMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNO2dCQUNsQixFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUc7YUFDZixDQUFDO1NBQ0w7UUFFRCxvREFBb0Q7UUFDcEQsa0dBQWtHO1FBQ2xHLG9JQUFvSTtRQUNwSSxxRUFBcUU7UUFFckUsTUFBTSxrQkFBa0IsR0FBRywrREFBeUIsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFMUYsTUFBTSxhQUFhLEdBQUcsSUFBSSxnRUFBYSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1FBQzlHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRTlELElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxJQUFJLEVBQUU7WUFDN0IsTUFBTSxJQUFJLHVFQUFtQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ2hEO2FBQU07WUFDSCxNQUFNLE1BQU0sR0FBRyxvREFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFckcsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDO1lBQ3BFLElBQUksbUJBQW1CLEtBQUssSUFBSSxFQUFFO2dCQUM5QixNQUFNLElBQUksdUVBQW1CLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDaEQ7aUJBQU07Z0JBQ0gsTUFBTSxZQUFZLEdBQUcsWUFBTSxDQUFDLEtBQUssMENBQUUsT0FBTyxDQUFDO2dCQUMzQyxJQUFJLFlBQVksS0FBSyxTQUFTLEVBQUU7b0JBQzVCLE1BQU0sSUFBSSw0RUFBd0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztpQkFDckQ7Z0JBRUQsbUJBQW1CLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQzthQUN2RTtTQUNKO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNSLFVBQVU7UUFDZCxvREFBb0Q7UUFDcEQsMkRBQTJEO1FBQzNELFdBQVc7UUFDWCw2Q0FBNkM7UUFDN0MsZ0RBQWdEO1FBQ2hELElBQUk7UUFDSixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQ7OztPQUdBO0lBQ0ssa0JBQWtCO1FBQ3pCLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxJQUFJLEVBQUc7WUFDeEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztTQUNuQztJQUNGLENBQUM7Q0FDRDtBQUVELGNBQWM7QUFDZCxXQUFpQixVQUFVO0lBUXZCLHNDQUFzQztJQUN0QyxTQUFnQiwrQkFBK0IsQ0FDM0MsTUFBa0U7UUFFbEUsT0FBTyxDQUFDLENBQUMsZUFBZSxJQUFJLE1BQU0sQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFKZSwwQ0FBK0Isa0NBSTlDO0FBQ0wsQ0FBQyxFQWRnQixVQUFVLEtBQVYsVUFBVSxRQWMxQjs7Ozs7Ozs7Ozs7Ozs7OztBQ3pLK0M7QUFFaEQsZ0JBQWdCO0FBQ1QsTUFBTSxtQkFBbUI7SUFHNUI7UUFDSSxnREFBZ0Q7UUFDaEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsb0RBQTRDLENBQUM7UUFDeEUsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuRCxZQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsd0JBQThCLENBQUM7UUFDekQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFeEMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxPQUFPO1FBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsYUFBYSxDQUFDLElBQW9CLEVBQUUsTUFBYztRQUM5QyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsNERBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyw0REFBYyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLDREQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsNERBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7SUFDL0MsQ0FBQztJQUVELElBQUk7UUFDQSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDO0lBQzlDLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7Ozs7O0FDaENELGdCQUFnQjtBQUNULE1BQU0sWUFBWTtJQU9yQixZQUFvQixPQUFlLEVBQUUsS0FBYSxFQUFFLFFBQWdCLEVBQVUsVUFBa0M7UUFBNUYsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUEyQyxlQUFVLEdBQVYsVUFBVSxDQUF3QjtRQUx4Ryx3QkFBbUIsR0FBRyxDQUFDLEVBQWMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzRCw2QkFBd0IsR0FBRyxDQUFDLEVBQWMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUt6RSxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDckYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDL0YsSUFBSSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFWRCxJQUFJLE9BQU8sS0FBa0IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQVlwRCxPQUFPOztRQUNILElBQUksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQy9FLFVBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSwwQ0FBRSxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFTyxPQUFPLENBQUMsRUFBYztRQUMxQixJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFTyxZQUFZLENBQUMsRUFBYztRQUMvQixJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDakNtRTtBQU1kO0FBQ2hCO0FBQ3VDO0FBQzlCO0FBRUU7QUFFakQ7OztHQUdHO0FBQ0ksTUFBTSxNQUFPLFNBQVEsOERBQVk7SUErRHBDLGdCQUFnQjtJQUNoQjtJQUNJLGdCQUFnQjtJQUNSLGNBQTZCO0lBQ3JDLGdCQUFnQjtJQUNSLE9BQWMsRUFDdEIsUUFBeUI7SUFDekIsZ0JBQWdCO0lBQ1IsNEJBQWdFLEVBQ3hFLFVBQTZCO0lBQzdCLGdCQUFnQjtJQUNSLFlBQTRDO0lBQ3BELGdCQUFnQjtJQUNSLG9CQUE0RDtJQUNwRSxnQkFBZ0I7SUFDUixXQUEwQztJQUNsRCxnQkFBZ0I7SUFDUixnQkFBb0Q7SUFDNUQsZ0JBQWdCO0lBQ1IscUJBQThEO0lBQ3RFLGdCQUFnQjtJQUNSLG9CQUE0RDtJQUNwRSxnQkFBZ0I7SUFDUix3QkFBb0U7UUFFNUUsS0FBSyxFQUFFLENBQUM7UUF0QkEsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFFN0IsWUFBTyxHQUFQLE9BQU8sQ0FBTztRQUdkLGlDQUE0QixHQUE1Qiw0QkFBNEIsQ0FBb0M7UUFHaEUsaUJBQVksR0FBWixZQUFZLENBQWdDO1FBRTVDLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBd0M7UUFFNUQsZ0JBQVcsR0FBWCxXQUFXLENBQStCO1FBRTFDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBb0M7UUFFcEQsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF5QztRQUU5RCx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXdDO1FBRTVELDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBNEM7UUE1RGhGLGdCQUFnQjtRQUNDLG1CQUFjLEdBQUcsQ0FBQyxFQUFjLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkUsZ0JBQWdCO1FBQ0Msd0JBQW1CLEdBQUcsQ0FBQyxFQUFjLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7UUFHakYsZ0JBQWdCO1FBQ0MseUJBQW9CLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBeURqRSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksMERBQWEsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUN2RCxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHNDQUFzQyxDQUFDLElBQUksQ0FBQyxFQUMzRCxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHFDQUFxQyxDQUFDLElBQUksQ0FBQyxFQUMxRCxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxFQUM3RixHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsK0JBQStCLEVBQUUsQ0FDL0MsQ0FBQztRQUVGLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7UUFDekMsSUFBSSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDO1FBQzdDLElBQUksQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQztRQUM3QyxJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFDdkMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQztRQUN2RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDO1FBQ25ELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTVCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLDBCQUErQixDQUFDO1FBQzNELElBQUksQ0FBQyx5QkFBeUIsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxTQUFTLENBQUMsR0FBRyw4QkFBaUMsQ0FBQztRQUM5RSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFL0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2hGLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRTFGLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLDBCQUEwQixFQUFFO1FBQ3RGLFVBQVUsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRWxHLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUM7UUFFcEYsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7WUFDMUIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksd0RBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixzQ0FDbkUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQywwQkFBMEIsRUFBRSxDQUN6RCxDQUFDO1NBQ0w7UUFFRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksd0RBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksNEJBQWlDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLENBQUM7UUFFcEk7O1dBRUc7UUFDSCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksd0RBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWMsZ0NBQzdELENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsK0JBQStCLENBQUMsRUFBRSxDQUFDLENBQ25ELENBQUM7UUFFRjs7V0FFRztRQUNILElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSx3REFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVywwQkFBZ0MsR0FBRyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUUvRyxJQUFJLENBQUMsK0JBQStCLEVBQUUsQ0FBQztRQUV2QyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBbEdELG1CQUFtQjtJQUNuQixpR0FBaUc7SUFFakcsSUFBSSxJQUFJLEtBQWMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUMxQyxJQUFJLElBQUksS0FBVyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLElBQUksY0FBYyxLQUFjLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7SUFFOUQsSUFBSSxhQUFhLEtBQW9CLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFDbEUsSUFBSSxNQUFNLEtBQVksT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUM1QyxJQUFJLElBQUksS0FBWSxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN0RCxJQUFJLG1CQUFtQixLQUFhLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFFckYsSUFBSSxPQUFPLEtBQWtCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDcEQsSUFBSSxvQkFBb0IsS0FBa0IsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDL0UsSUFBSSx3QkFBd0IsS0FBa0IsT0FBTyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDO0lBc0Z0Rjs7O09BR0c7SUFDSCxPQUFPO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVyQixJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQztRQUM5QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsU0FBUyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO1FBQzdCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUM7UUFDbEMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLFNBQVMsQ0FBQztRQUN2QyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsU0FBUyxDQUFDO1FBQ3RDLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxTQUFTLENBQUM7UUFFMUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUU5QixVQUFVLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUNsRixJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNsRixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsU0FBUyxDQUFDLGFBQTRCLEVBQUUsS0FBYTtRQUNqRCxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxTQUFTLENBQUMsYUFBNEI7UUFDbEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELGdCQUFnQjtJQUNoQiw2QkFBNkIsQ0FBQyxzQkFBcUM7UUFDL0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyw2QkFBNkIsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzFFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLE9BQU8sQ0FBQyxLQUFXO1FBQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLDhDQUFJLENBQUMsS0FBSyxFQUFFLDhDQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssYUFBYTs7UUFDakIsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztRQUNoRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLHdCQUF3QixFQUFFLEtBQUssSUFBSSxDQUFDO1FBQ2hFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQztRQUVsRCxzRUFBc0U7UUFDdEUsMEVBQTBFO1FBQzFFLDZFQUE2RTtRQUM3RSx3QkFBd0I7UUFDeEIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sS0FBSyxHQUFHLDBCQUFtQixhQUFuQixtQkFBbUIsdUJBQW5CLG1CQUFtQixDQUFFLFlBQVksMENBQUUsS0FBSyxNQUFLLEtBQUssQ0FBQztRQUNqRSx5RUFBMkIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxXQUFXLElBQUksS0FBSyxDQUFDLENBQUM7UUFFN0Usa0ZBQWtGO1FBQ2xGLG1GQUFtRjtRQUNuRixJQUFJLE1BQU0sR0FBRywwQkFBbUIsYUFBbkIsbUJBQW1CLHVCQUFuQixtQkFBbUIsQ0FBRSxZQUFZLDBDQUFFLE1BQU0sTUFBSyxLQUFLLENBQUM7UUFDakUsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUU7WUFDNUQsTUFBTSxLQUFOLE1BQU0sR0FBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLEVBQUU7U0FDbEM7YUFBTTtZQUNILE1BQU0sS0FBTixNQUFNLEdBQU0sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE1BQU0sRUFBRTtTQUMxRDtRQUNELHlFQUEyQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRWhFLHdIQUF3SDtRQUN4SCx3REFBd0Q7UUFDeEQsTUFBTSxRQUFRLEdBQUcsQ0FBQywwQkFBbUIsYUFBbkIsbUJBQW1CLHVCQUFuQixtQkFBbUIsQ0FBRSxZQUFZLDBDQUFFLFFBQVEsTUFBSyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNoSCx5RUFBMkIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLGlCQUFpQixDQUFDLEtBQWM7UUFDNUIsSUFBSSxLQUFLLEVBQUU7WUFDUCxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLDRCQUFnQyxDQUFDO1NBQy9EO2FBQU07WUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLDRCQUFnQyxDQUFDO1NBQ2xFO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixnQkFBZ0I7UUFDWixJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssU0FBUyxFQUFFO1lBQ3BDLE1BQU0sSUFBSSw0RUFBd0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNwRDthQUFNO1lBQ0gsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDM0U7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLGdCQUFnQjtRQUNaLElBQUksSUFBSSxDQUFDLGVBQWUsS0FBSyxTQUFTLEVBQUU7WUFDcEMsTUFBTSxJQUFJLDRFQUF3QixDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ3BEO2FBQU07WUFDSCxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUMzRTtJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCxjQUFjO1FBQ1YsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUU7WUFDbEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRS9GLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtnQkFDdEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLDREQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDNUQ7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLDREQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDN0Q7WUFDRCxJQUFJLGNBQXNCLENBQUM7WUFDM0IsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUN0QixjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUM7YUFDdEg7aUJBQU07Z0JBQ0gsY0FBYyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO2FBQ3BIO1lBRUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDLENBQUM7U0FDM0Y7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1Isc0NBQXNDLENBQUMsYUFBNEI7UUFDdkUsSUFBSSxJQUFJLENBQUMscUJBQXFCLEtBQUssU0FBUyxFQUFFO1lBQzFDLE1BQU0sSUFBSSw0RUFBd0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNwRDthQUFNO1lBQ0gsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQzdDO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNSLHFDQUFxQyxDQUFDLGFBQTRCO1FBQ3RFLElBQUksSUFBSSxDQUFDLG9CQUFvQixLQUFLLFNBQVMsRUFBRTtZQUN6QyxNQUFNLElBQUksNEVBQXdCLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDcEQ7YUFBTTtZQUNILElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUM1QztJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDUixnQ0FBZ0MsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLFlBQTBCLEVBQUUsYUFBNEI7UUFDbkgsSUFBSSxJQUFJLENBQUMsd0JBQXdCLEtBQUssU0FBUyxFQUFFO1lBQzdDLE1BQU0sSUFBSSw0RUFBd0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUNyRDthQUFNO1lBQ0gsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsWUFBWSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1NBQ3BFO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNSLCtCQUErQjtRQUNuQyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxTQUFTLEVBQUU7WUFDdkMseUVBQTJCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ3BHO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNSLHVCQUF1QjtRQUMzQixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRTtZQUM1RCxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssU0FBUyxFQUFFO2dCQUNqQyxNQUFNLElBQUksNEVBQXdCLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDckQ7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2FBQ3ZCO1NBQ0o7YUFBTTtZQUNILE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7WUFDaEUsSUFBSSxtQkFBbUIsRUFBRTtnQkFDckIsbUJBQW1CLENBQUMsTUFBTSxFQUFFLENBQUM7YUFDaEM7WUFDRCxvRkFBb0Y7U0FDdkY7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLDZEQUE2RDtJQUNyRCwrQkFBK0IsQ0FBQyxFQUFTO1FBQzdDLElBQUksSUFBSSxDQUFDLG9CQUFvQixLQUFLLFNBQVMsRUFBRTtZQUN6QyxNQUFNLElBQUksNEVBQXdCLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDckQ7YUFBTTtZQUNILElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1NBQy9CO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNLLE9BQU8sQ0FBQyxLQUFpQjtRQUM3QixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNoQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzNCO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNLLFlBQVksQ0FBQyxLQUFpQjtRQUNsQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNoQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDaEM7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IsZUFBZTtRQUNuQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELGdCQUFnQjtJQUNSLFdBQVcsQ0FBQyxFQUFjO1FBQzlCLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUU7WUFDaEMsTUFBTSxJQUFJLDRFQUF3QixDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ25EO2FBQU07WUFDSCxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3hCO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNSLGdCQUFnQixDQUFDLEVBQWM7UUFDbkMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssU0FBUyxFQUFFO1lBQ3JDLE1BQU0sSUFBSSw0RUFBd0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNwRDthQUFNO1lBQ0gsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzdCO0lBQ0wsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3BacUQ7QUFFTjtBQUVoRCxnQkFBZ0I7QUFDVCxNQUFNLFFBQVE7SUFRakIsWUFBb0IsV0FBb0IsRUFBVSxLQUFhLEVBQUUsUUFBZ0I7UUFBN0QsZ0JBQVcsR0FBWCxXQUFXLENBQVM7UUFBVSxVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQzNELElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUUvRCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyw4QkFBaUMsQ0FBQztRQUM3RCxNQUFNLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEQsaUJBQWlCLENBQUMsU0FBUyxDQUFDLEdBQUcsbUNBQW1DLENBQUM7UUFFbkUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDckQsTUFBTSxlQUFlLEdBQUcsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO1FBRTdDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNsQixpQkFBaUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLDREQUFjLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUMvRCxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLDREQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQy9FLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsOEJBQWlDLENBQUM7WUFDN0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLDREQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzNEO2FBQU07WUFDSCxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLDREQUFjLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNoRSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLDREQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzlFLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsa0NBQW1DLENBQUM7WUFDL0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLDREQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzFEO1FBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUU3QyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksOERBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUE1QkQsSUFBSSxPQUFPLEtBQXFCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUE4QnZELE9BQU87UUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxFQUFFLENBQThDLFNBQVksRUFBRSxRQUFrQztRQUM1RixJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBSSxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbEQsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7Ozs7OztBQ2pEbUU7QUFJZDtBQUV0RDs7O0dBR0c7QUFDSSxNQUFNLEdBQUc7SUFpRFosZ0JBQWdCO0lBQ2hCO0lBQ0ksZ0JBQWdCO0lBQ0MsY0FBNkI7SUFDOUMsZ0JBQWdCO0lBQ1IsY0FBNkI7SUFDckMsZ0JBQWdCO0lBQ1IsV0FBdUM7SUFDL0MsZ0JBQWdCO0lBQ1IsV0FBdUM7SUFDL0MsZ0JBQWdCO0lBQ1IsZUFBK0M7O1FBUnRDLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBRXRDLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBRTdCLGdCQUFXLEdBQVgsV0FBVyxDQUE0QjtRQUV2QyxnQkFBVyxHQUFYLFdBQVcsQ0FBNEI7UUFFdkMsb0JBQWUsR0FBZixlQUFlLENBQWdDO1FBbEQzRCxnQkFBZ0I7UUFDUixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRTFCLGdCQUFnQjtRQUNDLHNCQUFpQixHQUFHLENBQUMsRUFBYyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pGLGdCQUFnQjtRQUNDLDJCQUFzQixHQUFHLENBQUMsRUFBYyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZGLGdCQUFnQjtRQUNDLHdCQUFtQixHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNqRSxnQkFBZ0I7UUFDQyw2QkFBd0IsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMzRSxtQkFBbUI7UUFDbkIsNEVBQTRFO1FBQzVFLGdCQUFnQjtRQUNDLHVCQUFrQixHQUFHLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkYsZ0JBQWdCO1FBQ0MsZ0NBQTJCLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDakYsZ0JBQWdCO1FBQ0MsNkJBQXdCLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBa0MvRSxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxvQkFBNEIsQ0FBQztRQUN4RCxJQUFJLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsR0FBRyx3QkFBOEIsQ0FBQztRQUMvRCxJQUFJLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsR0FBRywrQkFBaUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRTlDLElBQUksY0FBYyxDQUFDLFVBQVUsRUFBRTtZQUMzQixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsOEJBQWlDLENBQUM7U0FDL0Q7YUFBTTtZQUNILElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7U0FDN0M7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFFdEUsTUFBTSxjQUFjLEdBQUcsb0JBQWMsQ0FBQyxjQUFjLG1DQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUM7UUFFakgsSUFBSSxjQUFjLEVBQUU7WUFDaEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQ3hCO1FBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbkYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFN0YsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRTtZQUNoQyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMxRixJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNwRyxxR0FBcUc7U0FDeEc7YUFBTTtZQUNILElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7U0FDbEM7UUFFRCxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQXZFRCxJQUFJLFFBQVEsS0FBYyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ2xELGdEQUFnRDtJQUNoRCxJQUFJLGFBQWEsS0FBb0IsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztJQUNsRSx3REFBd0Q7SUFDeEQsSUFBSSxXQUFXLEtBQW9CLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFDaEUsSUFBSSxPQUFPLEtBQWtCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDcEQsSUFBSSxZQUFZLEtBQWtCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFDOUQsSUFBSSxZQUFZLEtBQThCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFDMUUsSUFBSSxjQUFjLEtBQWMsT0FBTyxJQUFJLENBQUMsYUFBYSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDMUUsSUFBSSxjQUFjLENBQUMsS0FBYztRQUM3QixJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQy9CLElBQUksS0FBSyxFQUFFO2dCQUNQLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQzthQUN4QjtpQkFBTTtnQkFDSCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7YUFDekI7U0FDSjtJQUNMLENBQUM7SUF3REQ7Ozs7T0FJRztJQUNILFFBQVEsQ0FBQyxLQUFhO1FBQ2xCLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUNyQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILFNBQVMsQ0FBQyxRQUFpQjtRQUN2QixJQUFJLFFBQVEsS0FBSyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQzdCLE9BQU87U0FDVjtRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBRTFCLElBQUksUUFBUSxFQUFFO1lBQ1YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRywwQkFBK0IsQ0FBQztTQUM5RDthQUFNO1lBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSwwQkFBK0IsQ0FBQztTQUNqRTtJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCxPQUFPOztRQUNILElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO1FBQzdCLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO1FBQzdCLElBQUksQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzdFLFVBQUksQ0FBQyxhQUFhLDBDQUFFLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUMzRSxVQUFJLENBQUMsYUFBYSwwQ0FBRSxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDckYsc0ZBQXNGO1FBQ3RGLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUN2RSxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDckIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3pCO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLFVBQVU7UUFDTixJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLDRCQUFnQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLE1BQU0sNEJBQWdDLENBQUM7SUFDeEUsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixVQUFVO1FBQ04sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyw0QkFBZ0MsQ0FBQztRQUM1RCxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLDRCQUFnQyxDQUFDO0lBQ3JFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLFdBQVcsQ0FBQyxDQUFTLEVBQUUsQ0FBUztRQUNwQyxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssU0FBUyxFQUFFO1lBQ2xDLE1BQU0sSUFBSSw0RUFBd0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUN0RDthQUFNO1lBQ0gsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLFNBQVMsRUFBRTtnQkFDcEMsTUFBTSxJQUFJLDRFQUF3QixDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ25EO2lCQUFNO2dCQUNILElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUN0RTtTQUNKO0lBRUwsQ0FBQztJQUVELGdCQUFnQjtJQUNSLG9CQUFvQjtRQUN4QixJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssU0FBUyxFQUFFO1lBQ2xDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7U0FDbEM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssY0FBYyxDQUFDLEtBQWlCO1FBQ3BDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDNUIsSUFBSSxNQUFNLEtBQUssSUFBSSxDQUFDLFFBQVEsSUFBSSxNQUFNLEtBQUssSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUMzRCxvQkFBb0I7WUFDcEIsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDcEIsMkJBQTJCO2dCQUMzQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBRW5CLHNCQUFzQjthQUN6QjtpQkFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFO2dCQUM3RCwyQkFBMkI7Z0JBQzNCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzthQUN0QjtTQUNKO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNSLGVBQWUsQ0FBQyxLQUFpQjtRQUNyQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNoQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDdEI7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssWUFBWTtRQUNoQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELGdCQUFnQjtJQUNSLGlCQUFpQjtRQUNyQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxxQ0FBcUM7SUFDckMsa0NBQWtDO0lBQ2xDLElBQUk7SUFFSixnQkFBZ0I7SUFDUixXQUFXO1FBQ2YsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtZQUNoQyxNQUFNLElBQUksNEVBQXdCLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDbEQ7YUFBTTtZQUNILElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ3pDO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNSLFdBQVc7UUFDZixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQ2hDLE1BQU0sSUFBSSw0RUFBd0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUNsRDthQUFNO1lBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDekM7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IsYUFBYTtRQUNqQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksOERBQVksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDM0UsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IsY0FBYztRQUNsQixJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssU0FBUyxFQUFFO1lBQ2xDLE1BQU0sSUFBSSw0RUFBd0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUNsRDthQUFNO1lBQ0gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1lBQ3JFLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztTQUNsQztJQUNMLENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDM1JzRDtBQUtTO0FBQ3BDO0FBRTVCLGdCQUFnQjtBQUNULE1BQU0sYUFBYTtJQWlCdEIsWUFBb0IsY0FBNkIsRUFDckMscUJBQTZELEVBQzdELG9CQUEyRCxFQUMzRCx3QkFBbUUsRUFDbkUsMkJBQXFFO1FBSjdELG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBQ3JDLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBd0M7UUFDN0QseUJBQW9CLEdBQXBCLG9CQUFvQixDQUF1QztRQUMzRCw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQTJDO1FBQ25FLGdDQUEyQixHQUEzQiwyQkFBMkIsQ0FBMEM7UUFwQmpGLHlGQUF5RjtRQUN4RSxVQUFLLEdBQVUsRUFBRSxDQUFDO1FBSTNCLHlCQUFvQixHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFCLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBZ0I1QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxzQkFBNkIsQ0FBQztRQUV6RCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEdBQUcsNkNBQXdDLENBQUM7UUFDNUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQ2pELENBQUM7SUFwQkQsSUFBSSxJQUFJLEtBQVksT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN4QyxJQUFJLFFBQVEsS0FBYSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNwRCxJQUFJLG1CQUFtQixLQUFhLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQztJQUV2RSxJQUFJLE9BQU8sS0FBa0IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNwRCxJQUFJLGVBQWUsS0FBa0IsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLElBQUksY0FBYyxLQUFjLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7SUFnQjlELE9BQU87UUFDSCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUMzQjtJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTLENBQUMsYUFBNEIsRUFBRSxLQUFhO1FBQ2pELDBDQUEwQztRQUMxQyxpQ0FBaUM7UUFDakMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3hDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLEtBQUssYUFBYSxFQUFFO2dCQUMvQyxPQUFPO2FBQ1Y7U0FDSjtRQUVELE1BQU0sR0FBRyxHQUFHLElBQUkscUNBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUNuQyxhQUFhLEVBQ2IsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsRUFDeEMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsRUFDeEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRTFGLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUNyQixLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7U0FDN0I7UUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRWpDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRTtZQUN6QyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDNUU7YUFBTTtZQUNILElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUMxQztJQUNMLENBQUM7SUFFRCxTQUFTLENBQUMsYUFBNEI7UUFDbEMsOENBQThDO1FBQzlDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxLQUFLLGFBQWEsRUFBRTtnQkFDL0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDMUIsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNkLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDeEIsT0FBTzthQUNWO1NBQ0o7UUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVELDZCQUE2QixDQUFDLHNCQUFxQztRQUMvRCxJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNyQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDeEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLEtBQUssc0JBQXNCLENBQUM7WUFDeEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbEMsSUFBSSxRQUFRLEVBQUU7Z0JBQ1YsV0FBVyxHQUFHLENBQUMsQ0FBQzthQUNuQjtTQUNKO1FBRUQsSUFBSSxXQUFXLEdBQUcsQ0FBQyxFQUFFO1lBQ2pCLE1BQU0sSUFBSSwrREFBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ3ZDO2FBQU07WUFDSCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRTtnQkFDakU7OzttQkFHRztnQkFDSCxJQUFJLElBQUksQ0FBQyxvQkFBb0IsS0FBSyxDQUFDLENBQUMsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFO29CQUM3RSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUMxQyxLQUFLLElBQUksQ0FBQyxHQUFHLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO3dCQUNsQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO3FCQUNyQztvQkFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztvQkFFMUIsc0ZBQXNGO2lCQUN6RjthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxjQUFjLENBQUMsY0FBc0IsRUFBRSxtQkFBOEM7UUFDakYsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzNCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLEVBQUUsY0FBYyxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDNUYsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNWLGNBQWMsR0FBRyxJQUFJLENBQUM7WUFDdEIsMkJBQTJCO1lBQzNCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLEVBQUUsY0FBYyxFQUFFLG1CQUFtQixDQUFDO1NBQzlFO1FBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLDREQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUUzRSxJQUFJLGNBQWMsS0FBSyxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3pDLElBQUksQ0FBQyxlQUFlLEdBQUcsY0FBYyxDQUFDO1lBQ3RDLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1NBQ3RDO0lBQ0wsQ0FBQztJQUVELGlCQUFpQixDQUFDLGNBQXVCLEVBQUUsY0FBc0IsRUFBRSxtQkFBOEM7UUFDN0csSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdkIsSUFBSSxtQkFBbUIsS0FBSyxTQUFTLEVBQUU7Z0JBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQzthQUNyRTtZQUVELElBQUksa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO1lBQzNCLElBQUksMkJBQTJCLEdBQUcsS0FBSyxDQUFDO1lBQ3hDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDO1lBQzFGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDMUMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRS9CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDeEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBRXpDLGtFQUFrRTtnQkFDbEUsSUFBSSxVQUFVLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQyxRQUFRLEVBQUU7b0JBQzVDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUN6QztnQkFDRCxNQUFNLG9CQUFvQixHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLENBQUM7Z0JBQzdFLE1BQU0sY0FBYyxHQUFHLDREQUFjLENBQUMsb0JBQW9CLENBQUMsQ0FBQztnQkFDNUQsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLFdBQVcsR0FBRyxjQUFjLENBQUM7Z0JBRXpELGtCQUFrQixJQUFJLFFBQVEsQ0FBQztnQkFFL0Isb0RBQW9EO2dCQUNwRCx3REFBd0Q7Z0JBQ3hELElBQUksZUFBZSxHQUFHLENBQUMsQ0FBQztnQkFDeEIsSUFBSSxXQUFXLElBQUksQ0FBQyxFQUFFO29CQUNsQixlQUFlLEdBQUcsa0JBQWtCLENBQUM7aUJBQ3hDO3FCQUFNO29CQUNILE1BQU0sMEJBQTBCLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsQ0FBQztvQkFDbkYsTUFBTSxvQkFBb0IsR0FBRyw0REFBYyxDQUFDLDBCQUEwQixDQUFDLENBQUM7b0JBQ3hFLGVBQWUsR0FBRyxrQkFBa0IsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxvQkFBb0IsQ0FBQztpQkFDL0Y7Z0JBRUQsc0RBQXNEO2dCQUN0RCxJQUFJLGVBQWUsR0FBRyxjQUFjLEVBQUU7b0JBRWxDLDREQUE0RDtvQkFDNUQsSUFBSSxDQUFDLDJCQUEyQixFQUFFO3dCQUU5Qix3Q0FBd0M7d0JBQ3hDLGtEQUFrRDt3QkFDbEQsSUFBSSxPQUFlLENBQUM7d0JBQ3BCLElBQUksV0FBVyxHQUFHLENBQUMsSUFBSSxXQUFXLElBQUksQ0FBQyxFQUFFOzRCQUNyQyxPQUFPLEdBQUcsQ0FBQyxlQUFlLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7eUJBQzFEOzZCQUFNOzRCQUNILE9BQU8sR0FBRyxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7eUJBQ3BEO3dCQUVELGtDQUFrQzt3QkFDbEMsSUFBSSxPQUFPLEdBQUcsbUJBQW1CLEVBQUU7NEJBQy9CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0NBQ3pCLE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQyxLQUFLLFdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyw0REFBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0NBQ3ZGLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsNERBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0NBQzNELElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDOzZCQUN2RDs0QkFDRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDOzRCQUM5QixJQUFJLFVBQVUsQ0FBQyxhQUFhLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRTtnQ0FDNUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7NkJBQ3pDO3lCQUNKOzZCQUFNOzRCQUNILDJCQUEyQixHQUFHLElBQUksQ0FBQzt5QkFDdEM7cUJBRUo7eUJBQU0sSUFBSSxDQUFDLEtBQUssV0FBVyxFQUFFO3dCQUMxQixvRUFBb0U7d0JBQ3BFLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQzt3QkFDakMsVUFBVSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO3dCQUNqQyxJQUFJLFVBQVUsQ0FBQyxhQUFhLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRTs0QkFDNUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7eUJBQ3pDO3FCQUNKO29CQUVELElBQUksMkJBQTJCLElBQUksQ0FBQyxLQUFLLFdBQVcsRUFBRTt3QkFDbEQsSUFBSSxjQUFjLEVBQUU7NEJBQ2hCLCtDQUErQzs0QkFDL0MsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDOzRCQUNqQyxVQUFVLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7NEJBRWpDLElBQUksVUFBVSxDQUFDLGFBQWEsS0FBSyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0NBQ3BELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7NkJBQ2pEO3lCQUNKOzZCQUFNOzRCQUNILCtFQUErRTs0QkFDL0UsT0FBTyxLQUFLLENBQUM7eUJBQ2hCO3FCQUNKO2lCQUVKO3FCQUFNO29CQUNILElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLENBQUM7b0JBQzlCLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztvQkFDakMsVUFBVSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO29CQUNqQyxJQUFJLFVBQVUsQ0FBQyxhQUFhLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRTt3QkFDNUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7cUJBQ3pDO2lCQUNKO2FBQ0o7U0FDSjtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7T0FFRztJQUNILDBCQUEwQjtRQUN0QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUVEOztPQUVHO0lBQ0gsMEJBQTBCO1FBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztJQUNqRCxDQUFDO0lBRU8sbUJBQW1CLENBQUMsYUFBNEI7UUFDcEQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxhQUE0QjtRQUNwRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVPLHVCQUF1QixDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsWUFBMEIsRUFBRSxhQUE0QjtRQUMxRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDckUsQ0FBQztDQUVKOzs7Ozs7Ozs7Ozs7Ozs7QUMvUUQsMENBQTBDO0FBQ25DLE1BQU0sbUJBQW1CO0lBTzVCO1FBQ0ksSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcscURBQTRDLENBQUM7UUFDeEUsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXpDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxHQUFHLENBQUM7UUFDbkMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztJQUNwQyxDQUFDO0lBRUQsT0FBTztRQUNILElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELDZEQUE2RDtJQUM3RCxrQkFBa0IsQ0FBQyxXQUF3QixFQUFFLFNBQXNCO1FBQy9EOztXQUVHO1FBQ0gsT0FBTztRQUNQLCtCQUErQjtRQUMvQixvQ0FBb0M7UUFDcEMscURBQXFEO1FBQ3JELHNDQUFzQztRQUN0QyxrREFBa0Q7UUFDbEQscURBQXFEO0lBQ3pELENBQUM7SUFFTyxrQkFBa0I7UUFDdEIsd0dBQXdHO1FBQ3hHLHFEQUFxRDtRQUNyRCxXQUFXO1FBQ1gsMERBQTBEO1FBQzFELG1HQUFtRztRQUNuRyxxQ0FBcUM7UUFDckMseUJBQXlCO1FBRXpCLG9DQUFvQztRQUNwQyxnREFBZ0Q7UUFDaEQsa0JBQWtCO1FBQ2xCLFFBQVE7UUFFUixnQ0FBZ0M7UUFFaEMsd0RBQXdEO1FBQ3hELGdGQUFnRjtRQUNoRixnRkFBZ0Y7UUFDaEYsaUNBQWlDO1FBQ2pDLFFBQVE7UUFFUiw2Q0FBNkM7UUFDN0MseURBQXlEO1FBQ3pELElBQUk7SUFDUixDQUFDO0lBRU8sT0FBTyxDQUFDLE9BQW9CO1FBQ2hDLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBRTdDLE9BQU87WUFDSCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7WUFDYixLQUFLLEVBQUUsT0FBTyxDQUFDLFdBQVc7WUFDMUIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxZQUFZO1NBQy9CLENBQUM7SUFDTixDQUFDO0NBQ0o7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3RUQsY0FBYztBQUNQLE1BQWUsYUFBYyxTQUFRLEtBQUs7SUFDN0MsZ0JBQWdCO0lBQ2hCLFlBQTRCLElBQVksRUFBRSxPQUFlO1FBQ3JELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQURTLFNBQUksR0FBSixJQUFJLENBQVE7SUFFeEMsQ0FBQztDQUNKO0FBRUQsY0FBYztBQUNQLE1BQU0sa0JBQW1CLFNBQVEsYUFBYTtJQUNqRCxnQkFBZ0I7SUFDaEIsWUFBWSxPQUFlLEVBQWtCLElBQWE7UUFDdEQsS0FBSyxDQUFDLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQURTLFNBQUksR0FBSixJQUFJLENBQVM7SUFFMUQsQ0FBQztDQUNKO0FBRUQsY0FBYztBQUNQLE1BQU0sa0JBQW1CLFNBQVEsYUFBYTtJQUNqRCxnQkFBZ0I7SUFDaEIsWUFBWSxPQUFlO1FBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDcEMsQ0FBQztDQUNKO0FBRUQsY0FBYztBQUNQLE1BQU0sUUFBUyxTQUFRLGFBQWE7SUFDdkMsZ0JBQWdCO0lBQ2hCLFlBQVksT0FBZTtRQUN2QixLQUFLLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzFCLENBQUM7Q0FDSjtBQUVELGNBQWM7QUFDUCxNQUFNLFNBQVUsU0FBUSxhQUFhO0lBQ3hDLGdCQUFnQjtJQUNoQixZQUFZLE9BQWU7UUFDdkIsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMzQixDQUFDO0NBQ0o7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3RDRCxnQkFBZ0I7QUFDaEIsTUFBZSxhQUFjLFNBQVEsS0FBSztJQUN0QyxZQUFZLElBQVksRUFBRSxJQUFZLEVBQUUsT0FBZ0I7UUFDcEQsS0FBSyxDQUFDLEdBQUcsSUFBSSxLQUFLLElBQUksR0FBRyxPQUFPLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxPQUFPLEVBQUUsQ0FBQztJQUMzRSxDQUFDO0NBQ0o7QUFFRCxnQkFBZ0I7QUFDVCxNQUFNLFdBQVksU0FBUSxhQUFhO0lBQzFDLFlBQVksSUFBWSxFQUFFLE9BQWdCO1FBQ3RDLEtBQUssQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQztJQUNsQyxDQUFDO0NBQ0o7QUFFRCxnQkFBZ0I7QUFDVCxNQUFNLG9CQUFxQixTQUFRLGFBQWE7SUFDbkQsWUFBWSxJQUFZLEVBQUUsYUFBb0IsRUFBRSxPQUFnQjtRQUM1RCxLQUFLLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLEdBQUcsYUFBYSxHQUFHLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLE9BQU8sRUFBRSxDQUFDO0lBQ3BHLENBQUM7Q0FDSjtBQUVELGdCQUFnQjtBQUNULE1BQU0sbUJBQW9CLFNBQVEsYUFBYTtJQUNsRCxZQUFZLElBQVksRUFBRSxPQUFnQjtRQUN0QyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQztJQUMxQyxDQUFDO0NBQ0o7QUFFRCxnQkFBZ0I7QUFDVCxNQUFNLHdCQUF5QixTQUFRLGFBQWE7SUFDdkQsWUFBWSxJQUFZLEVBQUUsT0FBZ0I7UUFDdEMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLElBQUksRUFBRSxPQUFPLENBQUM7SUFDL0MsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoQ3NFO0FBRVQ7QUFDa0I7QUFDZjtBQUU4RjtBQUM5RztBQUVqRCxjQUFjO0FBQ1AsTUFBTSxZQUFhLFNBQVEsMERBQWE7SUF1QzNDLGdCQUFnQjtJQUNoQixZQUFZLHlCQUFpRSxFQUN6RSxvQ0FBNEYsRUFDNUYsMkJBQXVFO1FBRXZFLEtBQUssQ0FBQyx5QkFBeUIsRUFBRSxvQ0FBb0MsRUFBRSwyQkFBMkIsRUFBRSxJQUFJLENBQUMsQ0FBQztRQTNDOUcsZ0JBQWdCO1FBQ1IsdUJBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQThDLENBQUM7UUFJbkYsZ0JBQWdCO1FBQ1IsNEJBQXVCLEdBQUcsSUFBSSxHQUFHLEVBQW9ELENBQUM7UUFDOUYsZ0JBQWdCO1FBQ1IsMkJBQXNCLEdBQUcsSUFBSSxHQUFHLEVBQXVELENBQUM7UUFJaEcsZ0JBQWdCO1FBQ1Isa0RBQTZDLEdBQ2pELENBQUMsU0FBNkIsRUFBRSxLQUFhLEVBQUUsTUFBYyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsMENBQTBDLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNoSixnQkFBZ0I7UUFDUiwyREFBc0QsR0FDMUQsQ0FBQyxTQUE2QixFQUFFLE9BQWdCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxtREFBbUQsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdEksZ0JBQWdCO1FBQ1IsdURBQWtELEdBQ3RELENBQUMsU0FBNkIsRUFBRSxhQUE0QixFQUFFLGFBQXFCLEVBQUUsRUFBRSxDQUNuRixJQUFJLENBQUMsK0NBQStDLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxhQUFhLENBQUMsQ0FBQztRQXVCbEcsNElBQTRJO1FBQzVJLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDN0IsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ2Y7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsaUJBQWlCLENBQUMsSUFBWSxFQUMxQixnQ0FBMkcsRUFDM0csT0FBTyxHQUFHLEtBQUs7UUFFZixJQUFJLE9BQU8sZ0NBQWdDLEtBQUssVUFBVSxFQUFFO1lBQ3hELE1BQU0sSUFBSSw0REFBUSxDQUFDLGtGQUFrRixDQUFDO1NBQ3pHO2FBQU07WUFDSCxJQUFJLGdDQUFnQyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDOUQsTUFBTSxvQkFBb0IsR0FBRyxnQ0FBcUUsQ0FBQztnQkFDbkcsSUFBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksRUFBRSxvQkFBb0IsRUFBRSxPQUFPLENBQUMsQ0FBQzthQUMxRTtpQkFBTTtnQkFDSCxNQUFNLG1CQUFtQixHQUFHLGdDQUF5RSxDQUFDO2dCQUN0RyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxDQUFDO2FBQzdFO1NBQ0o7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCw0QkFBNEIsQ0FBQyxRQUFnQixFQUFFLG9CQUF1RCxFQUFFLE9BQU8sR0FBRyxLQUFLO1FBQ25ILElBQUksT0FBTyxvQkFBb0IsS0FBSyxVQUFVLEVBQUU7WUFDNUMsTUFBTSxJQUFJLEtBQUssQ0FBQyw0REFBVyw0Q0FBaUQsQ0FBQyxDQUFDO1NBQ2pGO1FBRUQsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXBFLElBQUkscUJBQXFCLEtBQUssU0FBUyxFQUFFO1lBQ3JDLE1BQU0sSUFBSSw2REFBUyxDQUFDLEdBQUcsNERBQVcsc0NBQTJDLEtBQUssUUFBUSxFQUFFLENBQUMsQ0FBQztTQUNqRztRQUVELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFO1lBQzlCLFdBQVcsRUFBRSxvQkFBb0I7WUFDakMsZUFBZSxFQUFFLFNBQVM7WUFDMUIsT0FBTztTQUNWLENBQ0osQ0FBQztJQUNOLENBQUM7SUFFRDs7T0FFRztJQUNILGdDQUFnQyxDQUFDLFFBQWdCLEVBQUUsd0JBQStELEVBQUUsT0FBTyxHQUFHLEtBQUs7UUFDL0gsSUFBSSxPQUFPLHdCQUF3QixLQUFLLFVBQVUsRUFBRTtZQUNoRCxNQUFNLElBQUksNkRBQVMsQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1NBQ2pFO1FBRUQsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRXBFLElBQUkscUJBQXFCLEtBQUssU0FBUyxFQUFFO1lBQ3JDLE1BQU0sSUFBSSw2REFBUyxDQUFDLEdBQUcsNERBQVcsc0NBQTJDLEtBQUssUUFBUSxFQUFFLENBQUMsQ0FBQztTQUNqRztRQUVELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFO1lBQzlCLFdBQVcsRUFBRSxTQUFTO1lBQ3RCLGVBQWUsRUFBRSx3QkFBd0I7WUFDekMsT0FBTztTQUNWLENBQ0osQ0FBQztJQUNOLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gseUJBQXlCLENBQUMsUUFBc0Q7UUFDNUUsSUFBSSxDQUFDLHVDQUF1QyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCx1Q0FBdUMsQ0FBQyxRQUFzRDtRQUMxRixJQUFJLE9BQU8sUUFBUSxLQUFLLFVBQVUsRUFBRTtZQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7U0FDMUQ7UUFFRCxJQUFJLElBQUksQ0FBQywyQkFBMkIsS0FBSyxTQUFTLEVBQUU7WUFDaEQsT0FBTyxDQUFDLElBQUksQ0FBQyxzR0FBc0csQ0FBQztTQUN2SDtRQUVELElBQUksQ0FBQywyQkFBMkIsR0FBRyxRQUFRLENBQUM7SUFDaEQsQ0FBQztJQUVELCtCQUErQjtRQUMzQixNQUFNLHlCQUF5QixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqRSxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCx3QkFBd0IsQ0FBQyxNQUFtQztRQUN4RCxJQUFJLFlBQTRELENBQUM7UUFFakUsTUFBTSxRQUFRLEdBQUcsZ0ZBQTJCLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDO1FBQzdFLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtZQUN4QixZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUN4RDtRQUNELElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRTtZQUM1QixJQUFJLElBQUksQ0FBQywyQkFBMkIsS0FBSyxTQUFTLEVBQUU7Z0JBQ2hELFlBQVksR0FBRztvQkFDWCxXQUFXLEVBQUUsSUFBSSxDQUFDLDJCQUEyQixDQUFDLE1BQU0sQ0FBQztvQkFDckQsZUFBZSxFQUFFLFNBQVM7b0JBQzFCLE9BQU8sRUFBRSxLQUFLO2lCQUNqQjthQUNKO1NBQ0o7UUFFRCxPQUFPLFlBQVksQ0FBQztJQUN4QixDQUFDO0lBRUQsZ0JBQWdCO0lBQ1AsYUFBYSxDQUFDLFNBQTZCLEVBQUUsVUFBdUM7UUFDekYsSUFBSSxZQUE0RCxDQUFDO1FBRWpFLE1BQU0sUUFBUSxHQUFHLGdGQUEyQixDQUFDLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xGLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtZQUN4QixZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUN4RDtRQUNELElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRTtZQUM1QixJQUFJLElBQUksQ0FBQywyQkFBMkIsS0FBSyxTQUFTLEVBQUU7Z0JBQ2hELFlBQVksR0FBRztvQkFDWCxXQUFXLEVBQUUsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFVBQVUsQ0FBQztvQkFDekQsZUFBZSxFQUFFLFNBQVM7b0JBQzFCLE9BQU8sRUFBRSxLQUFLO2lCQUNqQjthQUNKO1NBQ0o7UUFFRCxJQUFJLE1BQTRDLENBQUM7UUFDakQsSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFO1lBQzVCLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUM7WUFDckMsb0ZBQW9GO1lBQ3BGLElBQUksY0FBcUMsQ0FBQztZQUMxQyxJQUFJLFVBQVUsQ0FBQyxjQUFjLEtBQUssU0FBUyxFQUFFO2dCQUN6QyxjQUFjLEdBQUcsU0FBUyxDQUFDO2FBQzlCO2lCQUFNO2dCQUNILFlBQVk7Z0JBQ1osY0FBYyxHQUFHLDZEQUFlLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxjQUFjLENBQWMsQ0FBQzthQUNoRjtZQUVELElBQUksU0FBbUQsQ0FBQztZQUN4RCxNQUFNLG9CQUFvQixHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUM7WUFDdEQsSUFBSSxvQkFBb0IsS0FBSyxTQUFTLEVBQUU7Z0JBQ3BDLFNBQVMsR0FBRyxJQUFJLG9CQUFvQixDQUFDLFNBQVMsRUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUM7YUFDNUU7aUJBQU07Z0JBQ0gsTUFBTSxlQUFlLEdBQUcsWUFBWSxDQUFDLGVBQWUsQ0FBQztnQkFDckQsSUFBSSxlQUFlLEtBQUssU0FBUyxFQUFFO29CQUMvQixTQUFTLEdBQUcsZUFBZSxDQUFDLFNBQVMsRUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUM7aUJBQ25FO3FCQUFNO29CQUNILE1BQU0sSUFBSSwrREFBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDO2lCQUN6QzthQUNKO1lBRUQsSUFBSSxPQUFPLEVBQUU7Z0JBQ1QsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFO29CQUN6QixNQUFNLElBQUksNEVBQXdCLENBQUMsZUFBZSxDQUFDLENBQUM7aUJBQ3ZEO3FCQUFNO29CQUNILE1BQU0sa0JBQWtCLEdBQUcsU0FBNEMsQ0FBQztvQkFDeEUsTUFBTSxvQkFBb0IsR0FBRyxrQkFBa0IsQ0FBQyxlQUFlLENBQUM7b0JBQ2hFLElBQUksb0JBQW9CLEtBQUssU0FBUyxFQUFFO3dCQUNwQyxNQUFNLElBQUksNkRBQVMsQ0FBQyxHQUFHLDREQUFXLG9EQUF5RCxLQUFLLFFBQVEsRUFBRSxDQUFDLENBQUM7cUJBQy9HO3lCQUFNO3dCQUNILDJFQUE2QixDQUFDLG9CQUFvQixDQUFDLENBQUM7d0JBQ3BELElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLENBQUM7d0JBQ2pELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLGtCQUFrQixDQUFDLENBQUM7d0JBQy9ELFNBQVMsQ0FBQywyQkFBMkIsR0FBRyxJQUFJLENBQUMsNkNBQTZDLENBQUM7d0JBQzNGLFNBQVMsQ0FBQyxvQ0FBb0MsR0FBRyxJQUFJLENBQUMsc0RBQXNELENBQUM7d0JBQzdHLFNBQVMsQ0FBQyxnQ0FBZ0MsR0FBRyxJQUFJLENBQUMsa0RBQWtELENBQUM7cUJBQ3hHO2lCQUNKO2FBQ0o7WUFFRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUV2RCxNQUFNLEdBQUc7Z0JBQ0wsT0FBTyxFQUFFLFlBQVksQ0FBQyxPQUFPO2dCQUM3QixTQUFTO2FBQ1osQ0FBQztTQUVMO2FBQU07WUFDSCx3QkFBd0I7WUFDeEIsTUFBTSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQ3ZEO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVELGdCQUFnQjtJQUNQLGVBQWUsQ0FBQyxTQUE2QixFQUFFLE9BQWdCLEVBQUUsU0FBbUQ7UUFDekgsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hFLElBQUksbUJBQW1CLEtBQUssU0FBUyxFQUFFO1lBQ25DLEtBQUssQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLGlFQUFpRTtTQUMxSDthQUFNO1lBQ0gsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3RFLElBQUksa0JBQWtCLEtBQUssU0FBUyxFQUFFO2dCQUNsQyxNQUFNLG9CQUFvQixHQUFHLGtCQUFrQixDQUFDLGVBQWUsQ0FBQztnQkFDaEUsSUFBSSxvQkFBb0IsS0FBSyxTQUFTLEVBQUU7b0JBQ3BDLE1BQU0sSUFBSSwrREFBVyxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3ZEO3FCQUFNO29CQUNILElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLENBQUM7b0JBQ2pELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQ2pEO2FBQ0o7U0FDSjtJQUNMLENBQUM7SUFFUSw2QkFBNkIsQ0FBQyxLQUFhO1FBQ2hELElBQUksQ0FBQywrQkFBK0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDOUUsS0FBSyxDQUFDLDZCQUE2QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFHRCxnQkFBZ0I7SUFDUiwwQ0FBMEMsQ0FBQyxTQUE2QixFQUFFLEtBQWEsRUFBRSxNQUFjO1FBQzNHLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0RSxJQUFJLGtCQUFrQixLQUFLLFNBQVMsRUFBRTtZQUNsQyxNQUFNLElBQUksNEVBQXdCLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDdEQ7YUFBTTtZQUNILE1BQU0sV0FBVyxHQUFHLGtCQUFrQixDQUFDLGVBQWUsQ0FBQztZQUN2RCxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUU7Z0JBQzNCLE1BQU0sSUFBSSw2REFBUyxDQUFDLDREQUFXLGlDQUFzQyxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDbEc7aUJBQU07Z0JBQ0gsTUFBTSwyQkFBMkIsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUM7Z0JBQzlFLE1BQU0sSUFBSSxHQUFHLDJCQUEyQixDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsK0JBQStCLENBQUMsSUFBSSxDQUFDO2dCQUMxRixXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyw0REFBYyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM5QyxNQUFNLEdBQUcsR0FBRywyQkFBMkIsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLCtCQUErQixDQUFDLEdBQUcsQ0FBQztnQkFDdkYsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsNERBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDNUMsNkRBQWUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3BDLDhEQUFnQixDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQzthQUN6QztTQUNKO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNSLG1EQUFtRCxDQUFDLFNBQTZCLEVBQUUsT0FBZ0I7UUFDdkcsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RFLElBQUksa0JBQWtCLEtBQUssU0FBUyxFQUFFO1lBQ2xDLE1BQU0sSUFBSSw0RUFBd0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1NBQ3hEO2FBQU07WUFDSCxNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxlQUFlLENBQUM7WUFDdkQsSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFO2dCQUMzQixNQUFNLElBQUksNkRBQVMsQ0FBQyw0REFBVyxpQ0FBc0MsR0FBRyxHQUFHLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2xHO2lCQUFNO2dCQUNILHlFQUEyQixDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQzthQUNyRDtTQUNKO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNSLCtDQUErQyxDQUFDLFNBQTZCLEVBQUUsYUFBNEIsRUFBRSxhQUFxQjtRQUN0SSxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEUsSUFBSSxrQkFBa0IsS0FBSyxTQUFTLEVBQUU7WUFDbEMsTUFBTSxJQUFJLDRFQUF3QixDQUFDLGlCQUFpQixDQUFDLENBQUM7U0FDekQ7YUFBTTtZQUNILE1BQU0sV0FBVyxHQUFHLGtCQUFrQixDQUFDLGVBQWUsQ0FBQztZQUN2RCxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUU7Z0JBQzNCLE1BQU0sSUFBSSw2REFBUyxDQUFDLDREQUFXLGlDQUFzQyxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDbEc7aUJBQU07Z0JBQ0gsV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDO2FBQzVDO1NBQ0o7SUFDTCxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzNWeUg7QUFDcEQ7QUFFUDtBQUdWO0FBQ3dDO0FBRWhEO0FBRTdDLGNBQWM7QUFDUCxNQUFNLGFBQWMsU0FBUSxzREFBVztJQStCMUMsZ0JBQWdCO0lBQ2hCLFlBQ0ksYUFBNEIsRUFDNUIsTUFBbUM7SUFDbkMsZ0JBQWdCO0lBQ1IsV0FBb0M7UUFFNUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUZqRSxnQkFBVyxHQUFYLFdBQVcsQ0FBeUI7UUF2QmhELGdCQUFnQjtRQUNSLGFBQVEsR0FBRyxLQUFLLENBQUM7UUEwQnJCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBRXhCLElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQztRQUU3QyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFbEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7UUFFN0MsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZELGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxHQUFHLDRCQUFnQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLDhFQUFrQixDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUNsRixDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFVBQVUsQ0FBQyxFQUM1RCxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQ2pCLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFDakIsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEVBQzVDLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUM5QyxDQUFDO0lBQ04sQ0FBQztJQTFDRCw0RUFBNEU7SUFDNUUsSUFBSSxhQUFhLEtBQWdCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLElBQUksYUFBYSxLQUFnQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUN4RSxJQUFJLGNBQWMsS0FBYyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0lBQzlELGdCQUFnQjtJQUNoQixJQUFJLG1CQUFtQixLQUFjLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQztJQUN4RSxJQUFJLFNBQVMsS0FBK0MsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDL0YsSUFBSSxTQUFTLEtBQXlCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDL0QsSUFBSSxVQUFVLEtBQThCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFFdEUsSUFBSSxZQUFZLEtBQW9ELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFDaEcsSUFBSSxLQUFLLEtBQWEsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUMzQyxJQUFJLEdBQUcsS0FBVSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLElBQUksT0FBTyxLQUFjLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUErQmhELGdCQUFnQjtJQUNQLE9BQU87UUFDWixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRTtRQUN6QixLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVELG9CQUFvQixDQUFDLE1BQW1DO1FBQ3BELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUN2QyxDQUFDO0lBRUQsUUFBUTtRQUNKLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQztRQUM1RCxNQUFNLEtBQUssR0FBRyxpQkFBaUIsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRTVGLE1BQU0sTUFBTSxHQUFnQztZQUN4QyxJQUFJLEVBQUUsa0RBQVEsQ0FBQyxTQUFTO1lBQ3hCLE9BQU8sRUFBRSxFQUFFO1lBQ1gsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDN0IsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ1gsU0FBUyxFQUFFLEtBQUs7WUFDaEIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzNCLGNBQWMsRUFBRSxJQUFJLENBQUMsZUFBZTtZQUNwQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbEIsTUFBTSxFQUFFLCtFQUEwQixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUN4RSxhQUFhLEVBQUUsZ0ZBQTJCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUNoRixjQUFjLEVBQUUsS0FBSztTQUN4QjtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxLQUFLO1FBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRTtZQUN0QixNQUFNLElBQUksdUVBQW1CLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDN0M7YUFBTTtZQUNILElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztTQUN4QztJQUNMLENBQUM7SUFFRCxxQkFBcUI7SUFDckIsZ0JBQWdCO0lBQ2hCLGFBQWEsQ0FBQyxLQUFhLEVBQUUsTUFBYztRQUN2Qyw2REFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckMsOERBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixZQUFZO1FBQ1IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLG1CQUFtQjtRQUNmLElBQUksQ0FBQyxVQUFVLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLGtCQUFrQjtRQUNkLElBQUksQ0FBQyxVQUFVLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQscUJBQXFCO0lBQ3JCLGdCQUFnQjtJQUNoQixJQUFJO1FBQ0EsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLDBCQUEwQjs7UUFDdEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ2xELE1BQU0sSUFBSSxHQUFHLFVBQUksQ0FBQyxZQUFZLDBDQUFFLElBQUksQ0FBQztRQUNyQyxNQUFNLE1BQU0sR0FBRyx5RUFBb0IsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUVyRSxNQUFNLFdBQVcsR0FBRyxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RSxNQUFNLFlBQVksR0FBRyxDQUFDLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTlGLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQztZQUNwQixDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxXQUFXO1lBQzFCLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLFlBQVk7WUFDMUIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsV0FBVztZQUMvQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxZQUFZO1NBQ3JDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxnQkFBZ0I7SUFDUCxVQUFVLENBQUMsS0FBYztRQUM5QixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxnQkFBZ0I7SUFDUCxJQUFJO1FBQ1QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUzQixLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFFSCxRQUFRLENBQUMsS0FBYTtRQUNsQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxNQUFNLENBQUMsR0FBUTtRQUNYLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztRQUNyQixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1AsSUFBSTtRQUNULEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxnQkFBZ0I7SUFDUCxJQUFJO1FBQ1QsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGFBQWEsR0FBRyxLQUFLO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLFVBQVUsQ0FBQyxhQUFzQjtRQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDaEIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3ZDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLO1FBQ3RCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNmLElBQUksQ0FBQyxhQUFhLENBQUMsdUJBQXVCLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1NBQ3hFO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixVQUFVLENBQUMsYUFBc0I7UUFDN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ2hCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN0QztJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDRyxTQUFTLENBQUMsTUFBbUI7UUFDNUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFpQyxDQUFDO1FBQ3JELEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELGdCQUFnQjtJQUNSLDJCQUEyQixDQUFDLFVBQXVDO1FBQ3ZFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IsY0FBYyxDQUFDLEtBQWM7UUFDakMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEtBQUssTUFBTSxFQUFFO1lBQ3ZDLHNFQUFzRTtZQUV0RSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLHNFQUF3QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNqRSxJQUFJLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDM0Q7SUFDTCxDQUFDO0NBQ0o7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuUTRDO0FBRXRDLE1BQWUsdUJBQXdCLFNBQVEsc0RBQVc7SUFBakU7O1FBQ0ksZ0JBQWdCO1FBQ1IsYUFBUSxHQUFHLEtBQUssQ0FBQztJQVU3QixDQUFDO0lBUkcsSUFBSSxPQUFPLEtBQWMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUVoRCxnQkFBZ0I7SUFDaEIsZUFBZSxDQUFDLEtBQWM7UUFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDMUIsQ0FBQztDQUdKOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNiMEU7QUFFdEI7QUFFb0I7QUFLekU7Ozs7OztHQU1HO0FBRUksTUFBZSxXQUFZLFNBQVEsOERBQVk7SUF3RGxELGdCQUFnQjtJQUNoQixZQUE0QixhQUE0QixFQUNwRCxNQUEwQjtJQUMxQixnQkFBZ0I7SUFDUixPQUEyQjtJQUNuQyxnQkFBZ0I7SUFDQyxRQUFxQjtRQUV0QyxLQUFLLEVBQUUsQ0FBQztRQVBnQixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUc1QyxZQUFPLEdBQVAsT0FBTyxDQUFvQjtRQUVsQixhQUFRLEdBQVIsUUFBUSxDQUFhO1FBekQxQyxnQkFBZ0I7UUFDUixvQkFBZSxHQUFhLEVBQUUsQ0FBQztRQTREbkMsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUVyQixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNyQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUV6QixJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUM5QixJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7UUFFdEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO1FBRXJDLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFekMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUF0REQsSUFBSSxJQUFJLEtBQWUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUMzQyxJQUFJLEVBQUUsS0FBYSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLElBQUksRUFBRSxDQUFDLEtBQWEsSUFBSSxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDM0MsZ0JBQWdCO0lBQ2hCLElBQUksY0FBYyxLQUFlLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7SUFDL0QsSUFBSSxNQUFNLEtBQXlCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDekQsSUFBSSxZQUFZLEtBQW9CLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFDaEUsSUFBSSxVQUFVLEtBQWMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUN0RCxJQUFJLE9BQU8sS0FBa0IsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNwRCxJQUFJLGFBQWEsS0FBYyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBRTVELE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBaUI7UUFDNUIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxNQUFNLENBQUMsZUFBZSxDQUFDLElBQWlCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUM1QixDQUFDO0lBRUQsTUFBTSxDQUFDLHlCQUF5QixDQUFDLElBQWlCO1FBQzlDLE9BQU8sSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3pDLENBQUM7SUE2Q0Q7Ozs7T0FJRztJQUNILFdBQVcsQ0FBQyxXQUF3QixFQUFFLFNBQVMsR0FBRyxLQUFLO1FBQ25EOztXQUVHO1FBQ0gsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFdEQ7O1dBRUc7UUFDSCxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQztTQUNyRTtRQUVEOzs7V0FHSDtRQUNHLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDckIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUM5QjtRQUVEOztXQUVHO1FBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXBDOztXQUVHO1FBQ0gsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDL0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMxQjthQUFNO1lBQ0g7O2VBRUc7WUFDSCxxREFBcUQ7WUFDckQsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2hCLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJLEVBQUU7b0JBQ3ZCLE1BQU0sSUFBSSx1RUFBbUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztpQkFDOUM7cUJBQU07b0JBQ0gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ2xDO2FBQ0o7U0FDSjtJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILDZEQUE2RDtJQUM3RCxRQUFRLENBQUMsV0FBd0IsRUFBRSxLQUFxQixFQUFFLGFBQXVCO1FBQzdFLEtBQUssYUFBTCxLQUFLLGNBQUwsS0FBSyxJQUFMLEtBQUssR0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBQztRQUVwQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ2pELFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFNUIsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLElBQUksSUFBSSxXQUFXLENBQUMsY0FBYyxLQUFLLEtBQUssRUFBRTtZQUN0RSxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDdEI7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxZQUFZLENBQUMsUUFBcUIsRUFBRSxRQUFxQixFQUFFLGVBQWUsR0FBRyxLQUFLO1FBQzlFLHNEQUFzRDtRQUN0RCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuRCxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztRQUVoRCxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNkLE1BQU0sSUFBSSwrREFBVyxDQUFDLFlBQVksRUFBRSxxREFBcUQsQ0FBQyxDQUFDO1NBQzlGO1FBRUQsSUFBSSxVQUFVLEtBQUssSUFBSSxFQUFFO1lBQ3JCLE1BQU0sSUFBSSx1RUFBbUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUMvQzthQUFNO1lBQ0gsVUFBVSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUU5RDs7Y0FFRTtZQUNGLElBQUksZUFBZSxLQUFLLElBQUksRUFBRTtnQkFDMUIsUUFBUSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7Z0JBQ3hCLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLGlEQUFpRDthQUN4RTtZQUVEOztjQUVFO1lBQ0YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxRQUFRLENBQUM7WUFDckMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QixrREFBa0Q7WUFDbEQsUUFBUSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQzlCLFFBQVEsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUN0QyxRQUFRLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDcEMsUUFBUSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1lBRTVDLDhGQUE4RjtZQUM5RixJQUFJLFFBQVEsQ0FBQyxPQUFPLEtBQUssSUFBSSxFQUFFO2dCQUMzQixNQUFNLElBQUksdUVBQW1CLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDaEQ7aUJBQU07Z0JBQ0gsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLGNBQWMsS0FBSyxJQUFJLElBQUksUUFBUSxDQUFDLGNBQWMsS0FBSyxLQUFLLEVBQUU7b0JBQy9FLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztpQkFDbkI7Z0JBRUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUMxQjtTQUNKO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU07UUFDRixJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxFQUFFO1lBQ3ZCLE1BQU0sSUFBSSx1RUFBbUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUM3QzthQUFNO1lBQ0gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbEM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTTtRQUNGLE1BQU0sUUFBUSxHQUFHLHlEQUFXLEVBQUUsQ0FBQztRQUMvQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzNHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUMzQyxPQUFPLGFBQWEsQ0FBQztJQUN6QixDQUFDO0lBSUQsZ0JBQWdCO0lBQ2hCLHNCQUFzQjtRQUNsQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3hDLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUM7UUFDbEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQXFCLEtBQUssQ0FBQyxDQUFDO1FBQ3BELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDNUIsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDL0I7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLGlCQUFpQixDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsSUFBb0I7UUFDeEQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDO1FBQ25FLElBQUksbUJBQW1CLEtBQUssSUFBSSxFQUFFO1lBQzlCLE1BQU0sSUFBSSx1RUFBbUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUMvQzthQUFNO1lBQ0gsbUJBQW1CLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztTQUM5QztJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsNkRBQTZEO0lBQzdELE1BQU0sQ0FBQyxXQUF3QixFQUFFLElBQXNCO1FBQ25ELElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixJQUFJO1FBQ0EsSUFBSSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzNDLElBQUk7WUFDQSx3SEFBd0g7WUFDeEgsc0RBQXNEO1lBQ3RELGtEQUFrRDtZQUNsRCx5RUFBMkIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2pELGdEQUFnRDtZQUVoRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2hELElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDaEM7U0FDSjtnQkFBUztZQUNOLElBQUksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztTQUM1QztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCxPQUFPO1FBQ0gsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2hELElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDbkM7UUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUV4QixJQUFJLENBQUMscUJBQXFCLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsY0FBYyxDQUFDLE9BQXFCO1FBQ2hDLE9BQU8sR0FBRyxPQUFPLGFBQVAsT0FBTyxjQUFQLE9BQU8sR0FBSSxJQUFJLENBQUMsUUFBUSxDQUFDO1FBRW5DLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDL0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUVsRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3pCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFFM0IsT0FBTztZQUNILEVBQUUsRUFBRSxJQUFJO1lBQ1IsRUFBRSxFQUFFLEdBQUc7WUFDUCxFQUFFLEVBQUUsSUFBSSxHQUFHLEtBQUs7WUFDaEIsRUFBRSxFQUFFLEdBQUcsR0FBRyxNQUFNO1lBQ2hCLE9BQU8sRUFBRSxLQUFLLEdBQUcsTUFBTTtZQUN2QixXQUFXLEVBQUUsSUFBSTtTQUNwQixDQUFDO0lBQ04sQ0FBQztJQUVELGdCQUFnQjtJQUNoQix3QkFBd0I7UUFDcEIsSUFBSSxJQUFJLEdBQXVCLElBQUksQ0FBQztRQUVwQyxPQUFPLElBQUksS0FBSyxJQUFJLEVBQUU7WUFDbEIsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUM3RCxPQUFPLElBQUksQ0FBQzthQUNmO1lBQ0QsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7U0FDdEI7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7OzttQkFHZTtJQUNmLGFBQWE7UUFDVCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUUvQyxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxJQUFJLEVBQUU7WUFDM0MsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQztTQUUzQzthQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUU7WUFDdEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7U0FDakU7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILElBQUk7UUFDQSxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELGdCQUFnQjtJQUNOLFNBQVMsQ0FBQyxNQUFtQjtRQUNuQyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztJQUMxQixDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLGdCQUFnQixDQUFDLEVBQVU7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ25DLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ2hDO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNOLGdCQUFnQjtRQUN0QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDaEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNoQztJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDTixJQUFJO1FBQ1YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzNDLElBQUk7WUFDQSx5RUFBMkIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2xELGdEQUFnRDtTQUNuRDtnQkFBUztZQUNOLElBQUksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztTQUM1QztJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDTixzQkFBc0IsQ0FBQyxLQUFjO1FBQzNDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNoRCxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMzQztJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssa0JBQWtCLENBQUMsT0FBc0M7UUFDN0QsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUM3QixNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBYyxLQUFLLENBQUMsQ0FBQztRQUM3QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNyQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDdEU7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNLLGNBQWMsQ0FBQyxJQUFZLEVBQUUsSUFBZTtRQUNoRCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ25CLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLEtBQUssWUFBWSw4REFBWSxDQUFDLGFBQWE7Z0JBQzNDLEtBQUssQ0FBQyxvQkFBb0IsS0FBSyxLQUFLO2dCQUNwQyxJQUFJLENBQUMsY0FBYyxLQUFLLElBQUksRUFBRTtnQkFFOUI7Ozs7O21CQUtHO2dCQUNILElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtvQkFDekMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO2lCQUN6QztxQkFBTTtvQkFDSCxJQUFJLENBQUMsdUNBQXVDLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO2lCQUM3RDthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBRVEsY0FBYyxDQUFDLElBQVksRUFBRSxJQUFlO1FBQ2pELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDbkIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLElBQUksS0FBSyxZQUFZLDhEQUFZLENBQUMsYUFBYTtnQkFDM0MsS0FBSyxDQUFDLG9CQUFvQixLQUFLLEtBQUs7Z0JBQ3BDLElBQUksQ0FBQyxjQUFjLEtBQUssSUFBSSxFQUM5QjtnQkFDRTs7Ozs7bUJBS0c7Z0JBQ0gsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO29CQUN6QyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7aUJBQ3pDO3FCQUFNO29CQUNILElBQUksQ0FBQyx1Q0FBdUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7aUJBQzdEO2FBQ0o7U0FDSjtJQUNMLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssdUNBQXVDLENBQUMsSUFBWSxFQUFFLEtBQWlDO1FBQzNGLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUM1QyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDL0M7YUFBTTtZQUNILElBQUksSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDL0MsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztnQkFDNUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQzthQUMzRjtTQUNKO0lBRUwsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssNkJBQTZCLENBQUMsSUFBWSxFQUFFLEtBQWlDO1FBQ2pGLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDN0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2hELENBQUM7Q0FDSjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDcmhCMEc7QUFDd0Y7QUFDdkg7QUFHSjtBQUMyQjtBQUNsRDtBQUNxQjtBQUN6QjtBQUNDO0FBRTlDOzs7OztHQUtHO0FBQ0ksTUFBTSxVQUFXLFNBQVEsK0VBQXVCO0lBSW5ELFlBQVksYUFBNEIsRUFBRSxjQUFrRCxFQUFFLGdCQUE2QjtRQUV2SCxLQUFLLENBQUMsYUFBYSxFQUFFLDZFQUF3QixDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBRWhILElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzNDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQztRQUUxQyxrREFBa0Q7UUFDbEQsSUFBSSxNQUFNLEdBQXFCLElBQUksQ0FBQztRQUNwQyxPQUFPLElBQUksRUFBRTtZQUNULE1BQU0sSUFBSSxHQUNOLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQztZQUN2RSxJQUFJLElBQUksWUFBWSxPQUFPO21CQUNwQixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsNEJBQWdDLEVBQUU7Z0JBQzVELE1BQU0sR0FBRyxJQUFJLENBQUM7YUFDakI7aUJBQU07Z0JBQ0gsTUFBTTthQUNUO1NBQ0o7UUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVRLElBQUk7UUFDVCxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSTtZQUFFLE9BQU87UUFFeEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRXRCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMvQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDekU7UUFFRCxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFYixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsUUFBUSxDQUFDLGNBQWtEO1FBQ3ZELG9DQUFvQztRQUNwQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFakIsSUFBSSxjQUFjLEtBQUssU0FBUyxFQUFFO1lBQzlCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzFGLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3JDO0lBQ0wsQ0FBQztJQUVELFNBQVM7UUFDTCxvQ0FBb0M7UUFDcEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUN2QyxRQUFRLFlBQVksQ0FBQyxNQUFNLEVBQUU7WUFDekIsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDSixPQUFPO2FBQ1Y7WUFDRCxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNKLE1BQU0sdUJBQXVCLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoRCx1QkFBdUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDakMsT0FBTzthQUNWO1lBQ0QsT0FBTyxDQUFDLENBQUM7Z0JBQ0wsTUFBTSxJQUFJLCtEQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDdEM7U0FDSjtJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsT0FBTyxDQUFDLFVBQXlFLEVBQzdFLEtBQWM7UUFFZCxJQUFJLENBQUMsYUFBYSxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFFakQsTUFBTSxrQkFBa0IsR0FBRyxzREFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDakUsSUFBSSxNQUFtQixDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzlCLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2pDO2FBQU07WUFDSCw0REFBNEQ7WUFDNUQsTUFBTSxHQUFHLElBQUksQ0FBQztTQUNqQjtRQUNELElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRTtZQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7U0FDaEU7YUFBTTtZQUNILE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDNUYsS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzVDLE9BQU8sQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7U0FDekM7SUFDTCxDQUFDO0lBRUQsbUJBQW1CLENBQUMsVUFBK0I7UUFDL0Msb0NBQW9DO1FBQ3BDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUVqQixNQUFNLGtCQUFrQixHQUFHLHNEQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQWdDLENBQUM7UUFFaEcsSUFBSSxrQkFBa0IsQ0FBQyxTQUFTLEVBQUU7WUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1NBQ3pEO2FBQU07WUFDSCxNQUFNLGVBQWUsR0FBRyxJQUFJLDBEQUFhLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN4RixlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDckM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ00sUUFBUSxDQUFDLFdBQXdCLEVBQUUsS0FBYztRQUN0RCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7U0FDL0Q7YUFBTTtZQUNILDhFQUE4RTtZQUM5RSxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM3RCxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFM0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLENBQUM7WUFFM0MsT0FBTyxLQUFLLENBQUM7U0FDaEI7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1Asc0JBQXNCO1FBQzNCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDdkMsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQztRQUNsQyxNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBeUIsS0FBSyxDQUFDLENBQUM7UUFDeEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM1QixNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25DLElBQUksMkVBQXNCLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLEVBQUU7Z0JBQ3JELE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUM7YUFDMUI7aUJBQU07Z0JBQ0gsTUFBTSxJQUFJLCtEQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDdEM7U0FDSjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsT0FBTyxDQUFDLEtBQWEsRUFBRSxNQUFjO1FBQ2pDLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQzdDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyw0Q0FBNEM7U0FDdkU7YUFBTTtZQUNILDZEQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNyQyw4REFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRXZDLDBCQUEwQjtZQUMxQixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDOUIsNkRBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDckQsOERBQWdCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7YUFDMUQ7WUFFRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDckM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ00sVUFBVSxDQUFDLEtBQWM7UUFDOUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQ0FBZ0MsRUFBRSxDQUFDO1FBQ3RELElBQUk7WUFDQSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3RDO2dCQUFTO1lBQ04sSUFBSSxDQUFDLGFBQWEsQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1NBQ3ZEO0lBQ0wsQ0FBQztJQUVELGVBQWU7UUFDWCxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFFcEIsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDcEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQWtCLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0UsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBRVosS0FBSyxNQUFNLEdBQUcsSUFBSSxhQUFhLEVBQUU7WUFDN0IsTUFBTSxJQUFJLEdBQUcsR0FBa0MsQ0FBQztZQUNoRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFxQixDQUFDO1lBQ3RELElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtnQkFDZixNQUFNLElBQUksdUVBQW1CLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDOUM7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7Z0JBQ2pCLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUc7b0JBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDOztvQkFFbEQsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUM7Z0JBQ3RELElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUN6RCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7YUFDeEI7U0FDSjtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFUSxpQkFBaUIsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLElBQW9CO1FBQ2pFLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDL0MsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVRLE1BQU0sQ0FBQyxXQUF3QixFQUFFLElBQXFCO1FBRTNELElBQUksV0FBVyxDQUFDLFdBQVcsRUFBRTtZQUN6QixNQUFNLFVBQVUsR0FBRyw0RUFBdUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMzRCx5RkFBeUY7WUFDekYsTUFBTSxTQUFTLEdBQUcsV0FBNEIsQ0FBQztZQUMvQyxVQUFVLENBQUMsTUFBTSxHQUFHLCtFQUEwQixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3pGLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzVFLEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDNUIsV0FBVyxHQUFHLEtBQUssQ0FBQztTQUN2QjtRQUVELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDOUI7YUFBTTtZQUNIOzs7O2VBSUc7WUFDSCxJQUFHLFdBQVcsQ0FBQyxJQUFJLEtBQUssa0RBQVEsQ0FBQyxHQUFHLElBQUksV0FBVyxDQUFDLElBQUksS0FBSyxrREFBUSxDQUFDLE1BQU0sRUFBQztnQkFDekUsTUFBTSxVQUFVLEdBQUcsNEVBQXVCLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQzNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNyRSxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztnQkFDM0IsV0FBVyxHQUFHLEtBQUs7YUFDdEI7WUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsa0RBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGtEQUFRLENBQUMsTUFBTSxDQUFDO1lBQ2xFLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDO1lBQ3pDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEMsSUFBSSxDQUFDLENBQUMsTUFBTSxZQUFZLHVEQUFXLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRTtnQkFDMUQsTUFBTSxVQUFVLEdBQUcsdUVBQWtCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMxRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDM0UsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQ3ZDLFdBQVcsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3RFLFdBQVcsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ2pFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNqQixXQUFXLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDdEIsV0FBVyxDQUFDLFFBQVEsR0FBRyxzREFBWSxDQUFDLE9BQU8sQ0FBQztnQkFDNUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNqQztpQkFBTTtnQkFDSCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Z0JBQ3RGLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ2pFLE9BQU8sQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDO2dCQUNwQixXQUFXLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ2hDLFdBQVcsQ0FBQyxRQUFRLEdBQUcsc0RBQVksQ0FBQyxPQUFPLENBQUM7Z0JBQzVDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDNUI7U0FDSjtJQUNMLENBQUM7SUFFRCwrR0FBK0c7SUFDL0csdUhBQXVIO0lBQ3ZILGtCQUFrQjtJQUNsQixJQUFJO1FBQ0EsTUFBTSxJQUFJLCtEQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELCtHQUErRztJQUMvRyxrSUFBa0k7SUFDbEksa0JBQWtCO0lBQ2xCLGVBQWU7UUFDWCxNQUFNLElBQUksK0RBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsa0JBQWtCO1FBQ2QsTUFBTSxNQUFNLEdBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdkQsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVELG9CQUFvQjtRQUNoQixNQUFNLE1BQU0sR0FBa0IsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25GLE9BQXdCLE1BQU0sQ0FBQztJQUNuQyxDQUFDO0lBRUQsdUJBQXVCO1FBQ25CLE1BQU0sTUFBTSxHQUFrQixFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDNUQsSUFBSSxzREFBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7Z0JBQ3ZELE9BQU8sSUFBSSxDQUFDO2FBQ2Y7aUJBQU07Z0JBQ0gsSUFBSSxzREFBVyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7b0JBQy9ELE9BQU8sSUFBSSxDQUFDO2lCQUNmO3FCQUFNO29CQUNILE9BQU8sS0FBSyxDQUFDO2lCQUNoQjthQUNKO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQsdUJBQXVCLENBQUMsYUFBcUI7UUFDekMsTUFBTSxNQUFNLEdBQWtCLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDOUcsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVELFFBQVE7UUFDSixNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELDZEQUE2RDtJQUM3RCxzQkFBc0IsQ0FBQyxJQUFtQixFQUFFLEtBQWMsRUFBRSxrQkFBMkI7UUFDbkYsd0VBQXdFO0lBQzVFLENBQUM7SUFFTyxjQUFjO1FBQ2xCLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsNEVBQThCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFakYsNkRBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLDhEQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFdkM7O1dBRUc7UUFDSCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM5Qiw2REFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JELDhEQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQzFEO0lBQ0wsQ0FBQztJQUVPLHNCQUFzQixDQUFDLE9BQStCLEVBQUUsTUFBcUI7UUFDakYsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDckMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDekIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDakU7SUFDTCxDQUFDO0lBRU8sc0JBQXNCLENBQUMsT0FBK0IsRUFBRSxNQUFxQixFQUNqRixjQUE0RDtRQUU1RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNyQyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxjQUFjLENBQUMsV0FBVyxDQUFDLEVBQUU7Z0JBQzdCLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDNUI7WUFDRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7U0FDakY7SUFDTCxDQUFDO0NBRUo7QUFFRCxnQkFBZ0I7QUFDaEIsV0FBaUIsVUFBVTtJQUt2QixJQUFpQixJQUFJLENBZ0JwQjtJQWhCRCxXQUFpQixJQUFJO1FBVUosa0JBQWEsR0FBVTtZQUNoQyxFQUFFLEVBQUUsSUFBSTtZQUNSLEVBQUUsRUFBRSxJQUFJO1lBQ1IsRUFBRSxFQUFFLElBQUk7WUFDUixFQUFFLEVBQUUsSUFBSTtTQUNYLENBQUM7SUFDTixDQUFDLEVBaEJnQixJQUFJLEdBQUosZUFBSSxLQUFKLGVBQUksUUFnQnBCO0lBRUQsU0FBZ0IsYUFBYSxDQUFDLFFBQWtCO1FBQzVDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLHNDQUFxQyxDQUFDO1FBQzNELE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxzQkFBNkIsQ0FBQztRQUNuRCxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsc0JBQTZCLENBQUM7UUFDbkQsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQU5lLHdCQUFhLGdCQU01QjtBQUNMLENBQUMsRUE5QmdCLFVBQVUsS0FBVixVQUFVLFFBOEIxQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDelp5RztBQUUzRDtBQUM0QjtBQUdrQjtBQVV0RTtBQUVxQjtBQUU1QyxjQUFjO0FBQ1AsTUFBTSxXQUFZLFNBQVEsc0RBQVc7SUF3QnhDLGdCQUFnQjtJQUNoQixZQUFZLFFBQWlCLEVBQUUsYUFBNEIsRUFBRSxNQUFxQztJQUM5RixnQkFBZ0I7SUFDUixrQkFBK0I7UUFFdkMsS0FBSyxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUZ4Rix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQWE7UUFkM0MsZ0JBQWdCO1FBQ0MsY0FBUyxHQUFlLEVBQUUsQ0FBQztRQU81QyxnQkFBZ0I7UUFDQyxvQ0FBK0IsR0FBRyxzREFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBUzFHLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxRQUFRLENBQUM7UUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFFekIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDM0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUM7UUFDdkUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGFBQWEsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQztRQUMvRSxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztRQUMxQixJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDaEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUM5QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7UUFFakMsUUFBUSxNQUFNLENBQUMsSUFBSSxFQUFFO1lBQ2pCLEtBQUssa0RBQVEsQ0FBQyxHQUFHLENBQUM7WUFDbEIsS0FBSyxrREFBUSxDQUFDLE1BQU07Z0JBQ2hCLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDL0IsTUFBTTtZQUNWO2dCQUNJLE1BQU0sSUFBSSwrREFBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQzVDO0lBQ0wsQ0FBQztJQUVELFlBQVksQ0FBQyxhQUF3QixFQUFFLGNBQTBCLEVBQUUsS0FBYyxFQUFFLEtBQWM7UUFDN0YsTUFBTSxVQUFVLEdBQXdCO1lBQ3BDLElBQUksRUFBRSxXQUFXO1lBQ2pCLGFBQWE7WUFDYixjQUFjO1lBQ2QsS0FBSztTQUNSLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBa0IsQ0FBQztJQUM1RCxDQUFDO0lBRUQsWUFBWSxDQUFDLGFBQXdCLEVBQUUsY0FBMEIsRUFBRSxLQUFjLEVBQUUsS0FBYztRQUM3RixNQUFNLFVBQVUsR0FBd0I7WUFDcEMsSUFBSSxFQUFFLFdBQVc7WUFDakIsYUFBYTtZQUNiLGNBQWM7WUFDZCxLQUFLO1NBQ1IsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELE9BQU8sQ0FBQyxVQUF5RSxFQUFHLEtBQWM7UUFDOUYsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFN0MsSUFBSSxzREFBVyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLHNEQUFVLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUU7WUFDMUUsdUZBQXVGO1lBQ3ZGLE9BQU8sV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN0QzthQUFNO1lBQ0gsT0FBTyxXQUFXLENBQUM7U0FDdEI7SUFDTCxDQUFDO0lBRUQsT0FBTyxDQUFDLFVBQXlFLEVBQzdFLEtBQWM7UUFFZCxJQUFJLENBQUMsYUFBYSxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFDakQsTUFBTSxrQkFBa0IsR0FBRyxzREFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDakUsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxRixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDTSxRQUFRLENBQUMsV0FBd0IsRUFBRSxLQUFjLEVBQUUsYUFBdUI7UUFFL0UsOEVBQThFO1FBRTlFLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUNyQixLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7U0FDcEM7UUFFRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM5QixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUU1RSxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxlQUFlLENBQUMsQ0FBQztnQkFDeEYsZUFBZSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDMUU7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsYUFBYSxFQUFFLGVBQWUsQ0FBQyxDQUFDO2dCQUNuRixlQUFlLENBQUMscUJBQXFCLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUM3RTtTQUNKO2FBQU07WUFDSCxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNoRTtRQUVELEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRW5DLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBRXpELElBQUksYUFBYSxLQUFLLElBQUksRUFBRTtZQUN4QixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUM3QixPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMvQyxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEQsSUFBSSxrQkFBa0IsS0FBSyxXQUFXLEVBQUU7Z0JBQ3BDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDO2FBQ2xDO2lCQUFNO2dCQUNILE1BQU0sUUFBUSxHQUFHLGtCQUFrQixDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxXQUFXLENBQUMsR0FBRyxHQUFHLENBQUM7Z0JBQ3RFLGtCQUFrQixDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7YUFDdEM7U0FDSjtRQUVELElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFFN0IsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNNLFdBQVcsQ0FBQyxXQUF3QixFQUFFLFNBQWtCO1FBQzdELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUU3QyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMscUVBQXFFLENBQUMsQ0FBQztTQUMxRjtRQUVEOzs7V0FHRztRQUNILElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUMzQztRQUVELEtBQUssQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRTFDLG9FQUFvRTtRQUNwRSw4Q0FBOEM7UUFDOUMsb0NBQW9DO1FBQ3BDLG1FQUFtRTtRQUNuRSxXQUFXO1FBQ1gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUM3QixJQUFJO0lBQ1IsQ0FBQztJQUVEOztPQUVHO0lBQ00sWUFBWSxDQUFDLFFBQXFCLEVBQUUsUUFBcUI7UUFDOUQsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztRQUMzQixLQUFLLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN2QyxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUNNLFVBQVUsQ0FBQyxLQUFjO1FBQzlCLElBQUksQ0FBQyxhQUFhLENBQUMsZ0NBQWdDLEVBQUUsQ0FBQztRQUN0RCxJQUFJO1lBQ0EsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN0QztnQkFBUztZQUNOLElBQUksQ0FBQyxhQUFhLENBQUMsOEJBQThCLEVBQUUsQ0FBQztTQUN2RDtJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNNLElBQUk7UUFDVCxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSTtZQUFFLE9BQU87UUFFeEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRXRCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMvQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDekU7UUFFRCxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFYixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ25ELElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2xHO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELFFBQVE7UUFDSixNQUFNLE1BQU0sR0FBa0M7WUFDMUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUF3QjtZQUNuQyxPQUFPLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixFQUFpRTtZQUNyRyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7WUFDWCxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7U0FDOUI7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQsZ0JBQWdCO0lBQ0csU0FBUyxDQUFDLE1BQW1CO1FBQzVDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxNQUFNLENBQUM7UUFDakMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IsY0FBYztRQUNsQixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM5QixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztTQUMzQjtRQUNELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxnQkFBZ0I7UUFDcEIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFFcEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQy9DLElBQUksYUFBYSxDQUFDLGVBQWUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUN2QyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDaEM7WUFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ2hCLDZEQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUMzRSw4REFBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDOUU7aUJBQU07Z0JBQ0gsNkRBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzFFLDhEQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUMvRTtTQUNKO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxzQkFBc0I7UUFDMUIsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDOUUsTUFBTSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxHQUFHLHNFQUF3QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU5RixJQUFJLFNBQWlCLENBQUM7UUFDdEIsSUFBSSxhQUFxQixDQUFDO1FBQzFCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNoQixTQUFTLEdBQUcsYUFBYSxHQUFHLGlCQUFpQixDQUFDO1lBQzlDLGFBQWEsR0FBRyxZQUFZLENBQUM7U0FDaEM7YUFBTTtZQUNILFNBQVMsR0FBRyxZQUFZLEdBQUcsaUJBQWlCLENBQUM7WUFDN0MsYUFBYSxHQUFHLGFBQWEsQ0FBQztTQUNqQztRQUVELElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztRQUN0QixNQUFNLFNBQVMsR0FBYSxFQUFFLENBQUM7UUFFL0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQy9DLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekMsSUFBSSxRQUFnQixDQUFDO1lBQ3JCLElBQUksV0FBVyxDQUFDLFFBQVEsS0FBSyxzREFBWSxDQUFDLE9BQU8sRUFBRTtnQkFDL0MsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQy9EO2lCQUFNO2dCQUNILE1BQU0sSUFBSSwrREFBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ3ZDO1lBRUQsYUFBYSxJQUFJLFFBQVEsQ0FBQztZQUMxQixTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzVCO1FBRUQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsYUFBYSxDQUFDLENBQUM7UUFFOUQsT0FBTztZQUNILFNBQVM7WUFDVCxlQUFlO1lBQ2YsU0FBUztZQUNULGFBQWE7U0FDaEIsQ0FBQztJQUNOLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQW1CRztJQUNLLHNCQUFzQjtRQUUxQixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxNQUFNLHVCQUF1QixHQUFrQixFQUFFLENBQUM7UUFDbEQsSUFBSSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7UUFFNUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQy9DLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekMsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQztZQUN0QyxRQUFRLFFBQVEsRUFBRTtnQkFDZCxLQUFLLHNEQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3ZCLEtBQUssSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDO29CQUMxQixNQUFNO2lCQUNUO2dCQUNELEtBQUssc0RBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDMUIsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUMxQyxtQkFBbUIsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDO29CQUN4QyxNQUFNO2lCQUNUO2dCQUNEO29CQUNJLE1BQU0sSUFBSSwrREFBVyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7YUFDekU7U0FDSjtRQUVEOztXQUVHO1FBQ0gsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsRUFBRTtZQUMzQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMxQixPQUFPO1NBQ1Y7YUFBTTtZQUNIOztlQUVHO1lBQ0gsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSx1QkFBdUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMvRCxNQUFNLHVCQUF1QixHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUM7Z0JBQzVDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyx1QkFBdUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ3JELE1BQU0sV0FBVyxHQUFHLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMvQyxXQUFXLENBQUMsSUFBSSxHQUFHLHVCQUF1QixHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxtQkFBbUIsQ0FBQyxDQUFDO29CQUN0RixXQUFXLENBQUMsUUFBUSxHQUFHLHNEQUFZLENBQUMsT0FBTyxDQUFDO2lCQUMvQztnQkFDRCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDMUIsT0FBTzthQUNWO2lCQUFNO2dCQUVIOzs7OzttQkFLRztnQkFDSCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLHVCQUF1QixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQy9ELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyx1QkFBdUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7d0JBQ3JELE1BQU0sV0FBVyxHQUFHLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUMvQyxXQUFXLENBQUMsSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsbUJBQW1CLENBQUMsQ0FBQzt3QkFDakUsV0FBVyxDQUFDLFFBQVEsR0FBRyxzREFBWSxDQUFDLE9BQU8sQ0FBQztxQkFDL0M7b0JBQ0QsS0FBSyxJQUFJLEVBQUUsQ0FBQztpQkFDZjtnQkFFRDs7bUJBRUc7Z0JBQ0gsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUMvQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN6QyxXQUFXLENBQUMsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUM7aUJBQ3ZEO2dCQUVELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2FBQzdCO1NBQ0o7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssa0JBQWtCO1FBS3RCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUzRCxJQUFJLFdBQVcsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1lBQ25ELE9BQU87U0FDVjthQUFNO1lBQ0gsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO1lBQ3JCLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztZQUN0QixNQUFNLGNBQWMsR0FBWSxFQUFFLENBQUM7WUFDbkMsTUFBTSxVQUFVLEdBQVksRUFBRSxDQUFDO1lBRS9CLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBRXBEOztlQUVHO1lBQ0gsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNyRCxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUU1QyxJQUFJLEtBQVksQ0FBQztnQkFDakIsSUFBSSxRQUFRLEdBQUcsV0FBVyxFQUFFO29CQUN4QixhQUFhLElBQUksV0FBVyxHQUFHLFFBQVEsQ0FBQztvQkFDeEMsS0FBSyxHQUFHO3dCQUNKLElBQUksRUFBRSxXQUFXO3FCQUNwQixDQUFDO2lCQUVMO3FCQUFNO29CQUNILFlBQVksSUFBSSxRQUFRLEdBQUcsV0FBVyxDQUFDO29CQUN2QyxLQUFLLEdBQUc7d0JBQ0osSUFBSSxFQUFFLFFBQVE7cUJBQ2pCLENBQUM7b0JBQ0YsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDOUI7Z0JBRUQsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUMxQjtZQUVEOztlQUVHO1lBQ0gsSUFBSSxhQUFhLEtBQUssQ0FBQyxJQUFJLGFBQWEsR0FBRyxZQUFZLEVBQUU7Z0JBQ3JELE9BQU87YUFDVjtpQkFBTTtnQkFDSDs7bUJBRUc7Z0JBQ0gsTUFBTSxhQUFhLEdBQUcsYUFBYSxHQUFHLFlBQVksQ0FBQztnQkFDbkQsSUFBSSxhQUFhLEdBQUcsYUFBYSxDQUFDO2dCQUNsQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDNUMsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNoQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsR0FBRyxhQUFhLENBQUMsQ0FBQztvQkFDM0UsYUFBYSxJQUFJLFdBQVcsQ0FBQztvQkFDN0IsS0FBSyxDQUFDLElBQUksSUFBSSxXQUFXLENBQUM7aUJBQzdCO2dCQUVEOzttQkFFRztnQkFDSCxJQUFJLGFBQWEsS0FBSyxDQUFDLEVBQUU7b0JBQ3JCLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxhQUFhLENBQUM7aUJBQzNEO2dCQUVEOzttQkFFRztnQkFDSCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQy9DLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3pDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLENBQUM7aUJBQzNFO2FBQ0o7U0FDSjtJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ssY0FBYyxDQUFDLEtBQWE7UUFDaEMsTUFBTSxRQUFRLEdBQUcsSUFBSSx3REFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMxRixRQUFRLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzNGLFFBQVEsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLFFBQVEsQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDMUMsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ssYUFBYSxDQUFDLFFBQWtCO1FBQ3BDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRS9DLE9BQU87WUFDSCxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7WUFDaEMsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztTQUN0QyxDQUFDO0lBQ04sQ0FBQztJQUVPLDJCQUEyQixDQUFDLFdBQXdCO1FBQ3hELE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUM7UUFDcEMsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFO1lBQ3ZCLElBQUksV0FBVyxDQUFDLFdBQVcsS0FBSyxzREFBWSxDQUFDLEtBQUssRUFBRTtnQkFDaEQsT0FBTyxPQUFPLENBQUM7YUFDbEI7aUJBQU07Z0JBQ0gsTUFBTSxJQUFJLCtEQUFXLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQzthQUNyRTtTQUNKO2FBQU07WUFDSCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUM7WUFDOUQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQztTQUM1RjtJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSyxpQ0FBaUMsQ0FBQyxXQUF3QjtRQUM5RCxJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUM7UUFFeEIsS0FBSyxNQUFNLEtBQUssSUFBSSxXQUFXLENBQUMsWUFBWSxFQUFFO1lBQzFDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUU5RCxJQUFJLFdBQVcsWUFBWSxXQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRTtnQkFDakYsZUFBZSxJQUFJLE9BQU8sQ0FBQyxDQUFDLGtFQUFrRTthQUNqRztpQkFBTTtnQkFDSCxlQUFlLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7YUFDeEQ7U0FDSjtRQUVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM5RCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssbUJBQW1CLENBQUMsUUFBa0I7UUFDMUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUUzQyxNQUFNLFdBQVcsR0FBRyw0REFBYyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUNoRixNQUFNLFNBQVMsR0FBRyw0REFBYyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUM3RSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsaUNBQWlDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNFLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFekUsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsU0FBUyxHQUFHLFlBQVksQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNLLGNBQWMsQ0FBQyxRQUFrQixFQUFFLE9BQWUsRUFBRSxPQUFlO1FBQ3ZFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBRWhELElBQUksSUFBSSxDQUFDLG9CQUFvQixLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsb0JBQW9CLEtBQUssSUFBSSxFQUFFO1lBQzFFLE1BQU0sSUFBSSx1RUFBbUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUNoRDtRQUNELE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNyRCxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFFckQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQztRQUNoQyxNQUFNLFlBQVksR0FBRyw0REFBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNoQixRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsWUFBWSxDQUFDO1NBQzdDO2FBQU07WUFDSCxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDO1NBQzlDO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssa0JBQWtCLENBQUMsUUFBa0I7UUFDekMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEtBQUssSUFBSSxFQUFFO1lBQ2pDLE1BQU0sSUFBSSx1RUFBbUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUNqRDthQUFNO1lBQ0gsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzQyxNQUFNLFVBQVUsR0FBRyw0REFBYyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUMvRSxNQUFNLFNBQVMsR0FBRyw0REFBYyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUM3RSxNQUFNLHVCQUF1QixHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxDQUFDO1lBQ2pHLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFFL0QsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsdUJBQXVCLEdBQUcsaUJBQWlCLENBQUM7WUFDaEUsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsdUJBQXVCLENBQUMsR0FBRyxpQkFBaUIsQ0FBQztZQUVyRSxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsNERBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsNERBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVoRCxVQUFVLENBQUMscUJBQXFCLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQ2xFO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNSLHFCQUFxQixDQUFDLFFBQVEsR0FBRyxLQUFLO1FBQzFDLElBQUksUUFBUSxFQUFFO1lBQ1YsSUFBSSxDQUFDLCtCQUErQixFQUFFLENBQUM7U0FDMUM7YUFBTTtZQUNILElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUM5QztJQUNMLENBQUM7Q0FDSjtBQUVELGNBQWM7QUFDZCxXQUFpQixXQUFXO0lBU3hCLGdCQUFnQjtJQUNoQixTQUFnQix1QkFBdUIsQ0FBQyxPQUFvQixFQUFFLFNBQW9DO1FBQzlGLElBQUksU0FBUyxLQUFLLE9BQU8sRUFBRTtZQUN2QixPQUFPLDZEQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDbkM7YUFBTTtZQUNILE9BQU8sOERBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDcEM7SUFDTCxDQUFDO0lBTmUsbUNBQXVCLDBCQU10QztJQUVELGdCQUFnQjtJQUNoQixTQUFnQix1QkFBdUIsQ0FBQyxPQUFvQixFQUFFLFNBQW9DLEVBQUUsS0FBYTtRQUM3RyxJQUFJLFNBQVMsS0FBSyxPQUFPLEVBQUU7WUFDdkIsT0FBTyw2REFBZSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztTQUMxQzthQUFNO1lBQ0gsT0FBTyw4REFBZ0IsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDM0M7SUFDTCxDQUFDO0lBTmUsbUNBQXVCLDBCQU10QztJQUVELGdCQUFnQjtJQUNoQixTQUFnQixhQUFhLENBQUMsUUFBa0IsRUFBRSxRQUFpQjtRQUMvRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxzQkFBNkIsQ0FBQztRQUNuRCxJQUFJLFFBQVEsRUFBRTtZQUNWLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRywwQkFBK0IsQ0FBQztTQUN4RDthQUFNO1lBQ0gsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLG9CQUE0QixDQUFDO1NBQ3JEO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQVRlLHlCQUFhLGdCQVM1QjtBQUNMLENBQUMsRUF0Q2dCLFdBQVcsS0FBWCxXQUFXLFFBc0MzQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3J0QmtFO0FBQzhFO0FBQ3JHO0FBQzBEO0FBSWhEO0FBQzhFO0FBTzVHO0FBQ3lCO0FBQ3FCO0FBQ3pCO0FBRTdDLGNBQWM7QUFDUCxNQUFNLEtBQU0sU0FBUSwrRUFBdUI7SUFrRDlDLGdCQUFnQjtJQUNoQixZQUFZLGFBQTRCLEVBQUUsTUFBK0IsRUFBRSxNQUFtQjs7UUFDMUYsS0FBSyxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQW5DeEUsZ0JBQWdCO1FBQ1IsdUJBQWtCLEdBQUcsS0FBSyxDQUFDO1FBTW5DLGdCQUFnQjtRQUNSLG9CQUFlLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BELGdCQUFnQjtRQUNSLHVCQUFrQixHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUMxRCxnQkFBZ0I7UUFDUix1QkFBa0IsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDMUQsZ0JBQWdCO1FBQ0Msb0NBQStCLEdBQUcsc0RBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztRQXVCMUcsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQ25DLE1BQU0sa0JBQWtCLEdBQUcsYUFBYSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7UUFDN0QsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUNyQyxtRkFBbUY7UUFDbkYsSUFBSSxxQkFBb0UsQ0FBQztRQUN6RSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzVCLHFCQUFxQixHQUFHLFNBQVMsQ0FBQztTQUNyQzthQUFNO1lBQ0gsTUFBTSxvQkFBb0IsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUMscUJBQXFCLEdBQUksb0JBQW1ELENBQUMsTUFBTSxDQUFDLENBQUMseURBQXlEO1NBQ2pKO1FBRUQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7UUFDN0MsSUFBSSxDQUFDLHVCQUF1QixHQUFHLFlBQU0sQ0FBQyxlQUFlLG1DQUFJLENBQUMsQ0FBQyxDQUFDLG9CQUFvQjtRQUVoRix5R0FBeUc7UUFDekcsTUFBTSxJQUFJLEdBQUcsc0JBQUksQ0FBQyxhQUFhLDBDQUFFLElBQUksbUNBQUkscUJBQXFCLGFBQXJCLHFCQUFxQix1QkFBckIscUJBQXFCLENBQUUsSUFBSSxtQ0FBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7UUFDaEcsTUFBTSxNQUFNLEdBQUcsc0JBQUksQ0FBQyxhQUFhLDBDQUFFLE1BQU0sbUNBQUkscUJBQXFCLGFBQXJCLHFCQUFxQix1QkFBckIscUJBQXFCLENBQUUsTUFBTSxtQ0FBSSxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7UUFDeEcsTUFBTSxRQUFRLEdBQUcsc0JBQUksQ0FBQyxhQUFhLDBDQUFFLFFBQVEsbUNBQUkscUJBQXFCLGFBQXJCLHFCQUFxQix1QkFBckIscUJBQXFCLENBQUUsUUFBUSxtQ0FBSSxrQkFBa0IsQ0FBQyxRQUFRLENBQUM7UUFDaEgsTUFBTSxLQUFLLEdBQUcsc0JBQUksQ0FBQyxhQUFhLDBDQUFFLEtBQUssbUNBQUkscUJBQXFCLGFBQXJCLHFCQUFxQix1QkFBckIscUJBQXFCLENBQUUsS0FBSyxtQ0FBSSxrQkFBa0IsQ0FBQyxLQUFLLENBQUM7UUFDcEcsTUFBTSxRQUFRLEdBQUcsc0JBQUksQ0FBQyxhQUFhLDBDQUFFLFFBQVEsbUNBQUkscUJBQXFCLGFBQXJCLHFCQUFxQix1QkFBckIscUJBQXFCLENBQUUsUUFBUSxtQ0FBSSxrQkFBa0IsQ0FBQyxRQUFRLENBQUM7UUFDaEgsTUFBTSxXQUFXLEdBQUcsc0JBQUksQ0FBQyxhQUFhLDBDQUFFLFdBQVcsbUNBQUkscUJBQXFCLGFBQXJCLHFCQUFxQix1QkFBckIscUJBQXFCLENBQUUsV0FBVyxtQ0FBSSxrQkFBa0IsQ0FBQyxXQUFXLENBQUM7UUFDNUgsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFFBQVEsS0FBSyxLQUFLLENBQUM7UUFDNUMsTUFBTSxjQUFjLEdBQW9CO1lBQ3BDLElBQUksRUFBRSxJQUFJLEtBQUssS0FBSztZQUNwQixJQUFJLEVBQUUsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsOENBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDdEMsYUFBYSxFQUFFLE1BQU0sS0FBSyxLQUFLO1lBQy9CLFdBQVcsRUFBRSxNQUFNLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU07WUFDM0MsZUFBZSxFQUFFLElBQUksQ0FBQyxpQkFBaUI7WUFDdkMsYUFBYSxFQUFFLFFBQVEsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUTtZQUNqRCxZQUFZLEVBQUUsS0FBSyxLQUFLLEtBQUs7WUFDN0IsVUFBVSxFQUFFLEtBQUssS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSztZQUN4QyxlQUFlLEVBQUUsSUFBSTtZQUNyQixhQUFhLEVBQUUsUUFBUTtZQUN2QixrQkFBa0IsRUFBRSxXQUFXLEtBQUssS0FBSztZQUN6QyxnQkFBZ0IsRUFBRSxXQUFXLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVc7U0FDN0QsQ0FBQztRQUVGLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxvREFBTSxDQUFDLGFBQWEsRUFDbkMsSUFBSSxFQUFFLGNBQWMsRUFDcEIsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLEVBQ25DLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFDbkIsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEVBQzlCLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFDM0IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUMsRUFDdkMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxFQUFFLENBQUMsRUFDNUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxJQUFJLENBQUMsRUFDckQsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxJQUFJLENBQUMsRUFDcEQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FDbkcsQ0FBQztRQUVGLHdCQUF3QjtRQUV4QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUVwQixJQUFJLENBQUMsc0JBQXNCLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLEdBQUcsd0JBQThCLENBQUM7UUFFeEUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3hDLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQ3hCLElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1NBQ2pEO1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUV0RCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBekZELElBQUkscUJBQXFCLEtBQWtCLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQztJQUNoRixJQUFJLE1BQU0sS0FBYSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzdDLElBQUksVUFBVSxLQUFjLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELElBQUksVUFBVSxLQUFXLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3BELElBQUksb0JBQW9CLEtBQWMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFDM0UsZ0JBQWdCO0lBQ2hCLElBQUkscUJBQXFCLEtBQThDLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQztJQUM1RyxnQkFBZ0I7SUFDaEIsSUFBSSxtQkFBbUIsS0FBYyxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7SUFDeEUsSUFBSSxXQUFXLEtBQWMsT0FBTyxJQUFJLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLElBQUksV0FBVztRQUNYLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1NBQ3hEO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUE0RUQsZ0JBQWdCO0lBQ1AsVUFBVSxDQUFDLEtBQWM7UUFDOUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQ0FBZ0MsRUFBRSxDQUFDO1FBQ3RELElBQUk7WUFDQSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3RDO2dCQUFTO1lBQ04sSUFBSSxDQUFDLGFBQWEsQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1NBQ3ZEO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNQLElBQUk7UUFDVCxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSTtZQUFFLE9BQU87UUFFeEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRXRCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMvQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDekU7UUFFRCxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFYixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3ZDLE1BQU0sZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQztRQUM3QyxJQUFJLGdCQUFnQixHQUFHLENBQUMsRUFBRSxFQUFFLDBDQUEwQztZQUNsRSxJQUFJLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLHVCQUF1QixJQUFJLGdCQUFnQixFQUFFO2dCQUN0RixNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxJQUFJLENBQUMsdUJBQXVCLFFBQVEsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7YUFDbkc7aUJBQU07Z0JBQ0gsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGdCQUFnQixFQUFFLENBQUMsRUFBRSxFQUFFO29CQUN2QyxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3BDLElBQUksQ0FBQyxDQUFDLFdBQVcsWUFBWSwwREFBYSxDQUFDLEVBQUU7d0JBQ3pDLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsUUFBUSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztxQkFDM0Y7eUJBQU07d0JBQ0gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUN2QyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7d0JBQ25CLFdBQVcsQ0FBQyxTQUFTLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztxQkFDaEQ7aUJBQ0o7Z0JBRUQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBRWhHLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7YUFDakM7U0FDSjtRQUVELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxtRUFBbUU7SUFDbkUsb0JBQW9CLENBQUMsSUFBaUI7UUFDbEMsSUFBSSxDQUFDLHNEQUFXLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQUMseURBQXlELENBQUMsQ0FBQztTQUM5RTthQUFNO1lBQ0gsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztTQUM1QztJQUNMLENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxhQUE0QixFQUFFLEtBQWMsRUFBRSxrQkFBa0IsR0FBRyxLQUFLO1FBQzNGLElBQUksSUFBSSxDQUFDLG9CQUFvQixLQUFLLGFBQWEsRUFBRTtZQUM3QyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO2dCQUNqRCxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7YUFDakU7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUMzQyxJQUFJO29CQUNBLElBQUksSUFBSSxDQUFDLG9CQUFvQixLQUFLLFNBQVMsRUFBRTt3QkFDekMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxDQUFDO3FCQUNwQztvQkFDRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsYUFBYSxDQUFDO29CQUMxQyxJQUFJLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUMxRCxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7aUJBQ3hCO3dCQUFTO29CQUNOLElBQUksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztpQkFDNUM7Z0JBRUQsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxhQUFhLENBQUMsQ0FBQztnQkFDckQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsYUFBYSxDQUFDLENBQUM7Z0JBQ25FLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2FBQ2hDO1NBQ0o7UUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksS0FBSyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxhQUFhLENBQUMsdUJBQXVCLENBQUMsYUFBYSxFQUFFLGtCQUFrQixDQUFDLENBQUM7U0FDakY7SUFDTCxDQUFDO0lBRUQsbUVBQW1FO0lBQ25FLG9CQUFvQjs7UUFDaEIsT0FBTyxVQUFJLENBQUMsc0JBQXNCLEVBQUUsbUNBQUksSUFBSSxDQUFDO0lBQ2pELENBQUM7SUFFRCxzQkFBc0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDckMsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixzQkFBc0I7O1FBQ2xCLFVBQUksQ0FBQyxvQkFBb0IsMENBQUUsS0FBSyxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVELGdCQUFnQjtJQUNQLGVBQWUsQ0FBQyxLQUFjO1FBQ25DLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsWUFBWSxDQUFDLGFBQXdCLEVBQUUsY0FBMEIsRUFBRSxLQUFjLEVBQUUsS0FBYztRQUM3RixNQUFNLFVBQVUsR0FBd0I7WUFDcEMsSUFBSSxFQUFFLFdBQVc7WUFDakIsYUFBYTtZQUNiLGNBQWM7WUFDZCxLQUFLO1NBQ1IsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFrQixDQUFDO0lBQzVELENBQUM7SUFFRCxZQUFZLENBQUMsYUFBd0IsRUFBRSxjQUEwQixFQUFFLEtBQWMsRUFBRSxLQUFjO1FBQzdGLE1BQU0sVUFBVSxHQUF3QjtZQUNwQyxJQUFJLEVBQUUsV0FBVztZQUNqQixhQUFhO1lBQ2IsY0FBYztZQUNkLEtBQUs7U0FDUixDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsT0FBTyxDQUFDLFVBQStCLEVBQUcsS0FBYztRQUNwRCxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxPQUFPLENBQUMsVUFBK0IsRUFBRSxLQUFjO1FBQ25ELElBQUksQ0FBQyxhQUFhLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUVqRCxNQUFNLGtCQUFrQixHQUFHLHNEQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqRSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFGLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVRLFFBQVEsQ0FBQyxXQUF3QixFQUFFLEtBQWMsRUFBRSxLQUFLLEdBQUcsS0FBSztRQUNyRSxJQUFHLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFDO1lBQ3ZELEtBQUssSUFBSSxDQUFDLENBQUM7WUFDWCxNQUFNLElBQUksK0RBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLG9FQUFvRTtTQUMxRztRQUVELElBQUksQ0FBQyxDQUFDLFdBQVcsWUFBWSwwREFBYSxDQUFDLEVBQUU7WUFDekMsTUFBTSxJQUFJLCtEQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQywwQ0FBMEM7U0FDakY7YUFBTTtZQUNILEtBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDM0MsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNoRCxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkIsV0FBVyxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzdDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQzdCLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO0lBQ0wsQ0FBQztJQUVRLFdBQVcsQ0FBQyxXQUF3QixFQUFFLFNBQWtCO1FBQzdELE1BQU0sYUFBYSxHQUFHLFdBQTRCLENBQUM7UUFDbkQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdkQsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7UUFFMUQsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEtBQUssYUFBYSxFQUFFO1lBQzdDLElBQUksYUFBYSxDQUFDLE9BQU8sRUFBRTtnQkFDdkIsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO2FBQ3hCO1lBQ0QsSUFBSSxDQUFDLGtCQUFrQixFQUFFO2dCQUNyQixrRkFBa0Y7Z0JBQ2xGLDBFQUEwRTtnQkFDMUUsa0ZBQWtGO2dCQUNsRixNQUFNLHFCQUFxQixHQUFHLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDMUQsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDakc7U0FDSjtRQUVELElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXRDLEtBQUssQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRTVDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWM7UUFDVixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ25CO2FBQU07WUFDSCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDbkI7SUFDTCxDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ25CLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0MsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUN2QyxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUM7WUFDN0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGdCQUFnQixFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN2QyxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BDLElBQUksV0FBVyxZQUFZLDBEQUFhLEVBQUU7b0JBQ3RDLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2lCQUNyQztxQkFBTTtvQkFDSCxNQUFNLElBQUksK0RBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztpQkFDdkM7YUFDSjtZQUNELElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1NBQ2hDO0lBQ0wsQ0FBQztJQUVELFFBQVE7UUFDSixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDbEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQ3ZDLE1BQU0sZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQztZQUM3QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3ZDLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEMsSUFBSSxXQUFXLFlBQVksMERBQWEsRUFBRTtvQkFDdEMsV0FBVyxDQUFDLGtCQUFrQixFQUFFLENBQUM7aUJBQ3BDO3FCQUFNO29CQUNILE1BQU0sSUFBSSwrREFBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO2lCQUN2QzthQUNKO1lBQ0QsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7U0FDaEM7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1AsT0FBTzs7UUFDWixJQUFJLFVBQUksQ0FBQyxvQkFBb0IsMENBQUUsT0FBTyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNwQztRQUNELEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDekMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDeEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7U0FDbEQ7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxRQUFRO1FBQ0osSUFBSSxlQUFtQyxDQUFDO1FBQ3hDLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQzNCLGVBQWUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUN2RSxJQUFJLGVBQWUsR0FBRyxDQUFDLEVBQUU7Z0JBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQzthQUMvRDtTQUNKO1FBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksZUFBZSxLQUFLLFNBQVMsRUFBRTtZQUMvRCxNQUFNLElBQUksS0FBSyxDQUFDLDJEQUEyRCxDQUFDLENBQUM7U0FDaEY7YUFBTTtZQUNILE1BQU0sTUFBTSxHQUE0QjtnQkFDcEMsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsT0FBTyxFQUFFLElBQUksQ0FBQyxzQkFBc0IsRUFBbUM7Z0JBQ3ZFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtnQkFDZixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7Z0JBQ3ZCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDckIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUM3QixFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ1gsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO2dCQUMzQixTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVc7Z0JBQzNCLE1BQU0sRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7Z0JBQ2pDLGVBQWU7YUFDbEI7WUFDRCxPQUFPLE1BQU0sQ0FBQztTQUNqQjtJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Ba0JHO0lBQ0gsNkRBQTZEO0lBQ3BELE1BQU0sQ0FBQyxXQUF3QixFQUFFLElBQXNCO1FBQzVEOzs7V0FHRztRQUNILElBQUksSUFBSSxDQUFDLFlBQVksMEJBQXlCLEVBQUU7WUFDNUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDM0IsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRTtnQkFDL0IsTUFBTSxJQUFJLDRFQUF3QixDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ3BEO2lCQUFNO2dCQUNILElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDNUMsT0FBTzthQUNWO1NBQ0o7UUFFRDs7V0FFRztRQUNILElBQUksSUFBSSxDQUFDLFlBQVksc0JBQXVCLEVBQUU7WUFDMUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3BDLE9BQU87U0FDVjtRQUVEOzs7V0FHRztRQUNILE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLG9CQUFzQixJQUFJLElBQUksQ0FBQyxZQUFZLDBCQUF5QixDQUFDO1FBQ3pHLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLHNCQUF1QixJQUFJLElBQUksQ0FBQyxZQUFZLHdCQUF3QixDQUFDO1FBQzNHLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLG9CQUFzQixJQUFJLElBQUksQ0FBQyxZQUFZLHNCQUF1QixDQUFDO1FBQ3pHLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRS9HOztXQUVHO1FBQ0gsSUFBSSxXQUFXLENBQUMsV0FBVyxFQUFFO1lBQ3pCLE1BQU0sVUFBVSxHQUFHLDRFQUF1QixDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzNELFVBQVUsQ0FBQyxNQUFNLEdBQUksV0FBNkIsQ0FBQyxZQUFZLENBQUM7WUFDaEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDNUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM1QixXQUFXLEdBQUcsS0FBSyxDQUFDO1NBQ3ZCO1FBR0Q7Ozs7V0FJRztRQUNILElBQUcsV0FBVyxDQUFDLElBQUksS0FBSyxrREFBUSxDQUFDLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLGtEQUFRLENBQUMsTUFBTSxFQUFDO1lBQ3pFLE1BQU0sVUFBVSxHQUFHLDRFQUF1QixDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzNELFVBQVUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDOUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDckUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7WUFDM0IsV0FBVyxHQUFHLEtBQUs7U0FDdEI7UUFFRDs7O1dBR0c7UUFDSCxJQUFJLGdCQUFnQixFQUFFO1lBQ2xCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxRCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDL0UsSUFBSSxDQUFDLElBQUksSUFBSSxHQUFHLENBQUM7WUFDakIsV0FBVyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQzdCLFdBQVcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUNyQyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQzs7O2VBR0c7U0FDTjthQUFNO1lBQ0gsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxrREFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsa0RBQVEsQ0FBQyxHQUFHLENBQUM7WUFDekQsTUFBTSxVQUFVLEdBQUcsdUVBQWtCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBdUIsQ0FBQztZQUNoRixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUMzRSxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFFakQsV0FBVyxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN0RSxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRS9ELElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ2YsV0FBVyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7WUFDdEIsV0FBVyxDQUFDLFFBQVEsR0FBRyxzREFBWSxDQUFDLE9BQU8sQ0FBQztZQUM1QyxXQUFXLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2pDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDTSxpQkFBaUIsQ0FBQyxDQUFTLEVBQUUsQ0FBUztRQUMzQyxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtZQUMzQyxNQUFNLE9BQU8sR0FBRyxHQUFvQixDQUFDO1lBQ3JDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFFNUQsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRTtnQkFFMUQsSUFBSSxPQUFPLDBCQUF5QixFQUFFO29CQUNsQyxJQUFJLENBQUMsWUFBWSx3QkFBdUIsQ0FBQztvQkFDekMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNyRTtxQkFBTTtvQkFDSCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztvQkFDM0IsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUN2QztnQkFFRCxPQUFPO2FBQ1Y7U0FDSjtJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsT0FBTztRQUNILElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxLQUFLLE1BQU0sRUFBRTtZQUN2QyxPQUFPLElBQUksQ0FBQztTQUNmO1FBRUQsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlELE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDdEUsSUFBSSxVQUFVLEtBQUssSUFBSSxJQUFJLFdBQVcsS0FBSyxJQUFJLEVBQUU7WUFDN0MsTUFBTSxJQUFJLHVFQUFtQixDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQy9DO1FBQ0QsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLEVBQUUsR0FBRyxXQUFXLENBQUMsRUFBRSxDQUFDO1FBQ3JELE1BQU0sYUFBYSxHQUFHLFdBQVcsQ0FBQyxFQUFFLEdBQUcsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUV0RCxJQUFJLENBQUMsc0JBQXNCLEdBQUc7WUFDMUIsTUFBTSxFQUFFO2dCQUNKLFNBQVMsRUFBRTtvQkFDUCxFQUFFLEVBQUUsVUFBVSxDQUFDLEVBQUU7b0JBQ2pCLEVBQUUsRUFBRSxVQUFVLENBQUMsRUFBRTtvQkFDakIsRUFBRSxFQUFFLFVBQVUsQ0FBQyxFQUFFO29CQUNqQixFQUFFLEVBQUUsVUFBVSxDQUFDLEVBQUU7aUJBQ3BCO2dCQUNELGFBQWEsRUFBRTtvQkFDWCxFQUFFLEVBQUUsVUFBVSxDQUFDLEVBQUU7b0JBQ2pCLEVBQUUsRUFBRSxVQUFVLENBQUMsRUFBRTtvQkFDakIsRUFBRSxFQUFFLFVBQVUsQ0FBQyxFQUFFO29CQUNqQixFQUFFLEVBQUUsVUFBVSxDQUFDLEVBQUU7aUJBQ3BCO2FBQ0o7U0FDSixDQUFDO1FBRUY7O1dBRUc7UUFDSCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUVoQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxHQUFHO2dCQUMvQixTQUFTLEVBQUU7b0JBQ1AsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFO29CQUNsQixFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUU7b0JBQ2xCLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRTtvQkFDbEIsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFO2lCQUNyQjtnQkFDRCxhQUFhLEVBQUU7b0JBQ1gsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFO29CQUNsQixFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUU7b0JBQ2xCLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRTtvQkFDbEIsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFO2lCQUNyQjthQUNKLENBQUM7WUFFRixPQUFPLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzdDO2FBQU07WUFDSCxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxHQUFHO2dCQUMvQixTQUFTLEVBQUU7b0JBQ1AsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFO29CQUNsQixFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUU7b0JBQ2xCLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRSxHQUFHLFlBQVksR0FBRyxJQUFJO29CQUN4QyxFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUU7aUJBQ3JCO2dCQUNELGFBQWEsRUFBRTtvQkFDWCxFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUU7b0JBQ2xCLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRTtvQkFDbEIsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFLEdBQUcsWUFBWSxHQUFHLEdBQUc7b0JBQ3ZDLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRTtpQkFDckI7YUFDSixDQUFDO1lBRUYsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsR0FBRztnQkFDOUIsU0FBUyxFQUFFO29CQUNQLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRSxHQUFHLFlBQVksR0FBRyxJQUFJO29CQUN4QyxFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUU7b0JBQ2xCLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRSxHQUFHLFlBQVksR0FBRyxJQUFJO29CQUN4QyxFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUUsR0FBRyxhQUFhLEdBQUcsR0FBRztpQkFDM0M7Z0JBQ0QsYUFBYSxFQUFFO29CQUNYLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRTtvQkFDbEIsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFO29CQUNsQixFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUU7b0JBQ2xCLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRSxHQUFHLGFBQWEsR0FBRyxHQUFHO2lCQUMzQzthQUNKLENBQUM7WUFFRixJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxHQUFHO2dCQUNoQyxTQUFTLEVBQUU7b0JBQ1AsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFLEdBQUcsWUFBWSxHQUFHLElBQUk7b0JBQ3hDLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRTtvQkFDbEIsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFO29CQUNsQixFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUU7aUJBQ3JCO2dCQUNELGFBQWEsRUFBRTtvQkFDWCxFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUUsR0FBRyxZQUFZLEdBQUcsR0FBRztvQkFDdkMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFO29CQUNsQixFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUU7b0JBQ2xCLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRTtpQkFDckI7YUFDSixDQUFDO1lBRUYsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sR0FBRztnQkFDakMsU0FBUyxFQUFFO29CQUNQLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRSxHQUFHLFlBQVksR0FBRyxJQUFJO29CQUN4QyxFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUUsR0FBRyxhQUFhLEdBQUcsR0FBRztvQkFDeEMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFLEdBQUcsWUFBWSxHQUFHLElBQUk7b0JBQ3hDLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRTtpQkFDckI7Z0JBQ0QsYUFBYSxFQUFFO29CQUNYLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRTtvQkFDbEIsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFLEdBQUcsYUFBYSxHQUFHLEdBQUc7b0JBQ3hDLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRTtvQkFDbEIsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFO2lCQUNyQjthQUNKLENBQUM7WUFFRixPQUFPLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzdDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxjQUFjLENBQUMsUUFBYztRQUN6QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUNoQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1lBQy9CLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1NBQzlCO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNSLGNBQWM7UUFDbEIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEtBQUssTUFBTSxFQUFFO1lBQ3ZDLE1BQU0sT0FBTyxHQUFtQixzRUFBd0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFdkUsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRTtnQkFDbkIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLG1FQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsbUVBQXlCLENBQUMsTUFBTSxDQUFDO2dCQUNuSCxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQzthQUNqRjtZQUNELDZEQUFlLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1RCw4REFBZ0IsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRTlELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDL0MsNkRBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzdELDhEQUFnQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNsRTtZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDcEIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3BDO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNSLHVCQUF1QixDQUFDLENBQVM7UUFDckMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQixHQUFHLENBQUMsQ0FBQztRQUMvRCxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUM7UUFDL0QsTUFBTSw4QkFBOEIsR0FBRyxvQkFBb0IsQ0FBQyxVQUFVLENBQUM7UUFFdkUsaUhBQWlIO1FBQ2pILE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxLQUFLLENBQWMsaUJBQWlCLENBQUMsQ0FBQztRQUNyRSxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDakIsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLE9BQU8sUUFBUSxHQUFHLGlCQUFpQixFQUFFO1lBQ2pDLE1BQU0saUJBQWlCLEdBQUcsOEJBQThCLENBQUMsUUFBUSxFQUFFLENBQWdCLENBQUM7WUFDcEYsSUFBSSxpQkFBaUIsS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixFQUFFO2dCQUM3RCxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFHLGlCQUFpQixDQUFDO2FBQ3REO1NBQ0o7UUFFRCxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUM7UUFDbkUsSUFBSSxtQkFBbUIsS0FBSyxJQUFJLEVBQUU7WUFDOUIsTUFBTSxJQUFJLHVFQUFtQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQ2xEO1FBRUQsSUFBSSxJQUFvQixDQUFDO1FBRXpCLGNBQWM7UUFDZCxJQUFJLGlCQUFpQixLQUFLLENBQUMsRUFBRTtZQUN6QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ2hFLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDM0QsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUU5RCxJQUFJLEdBQUc7Z0JBQ0gsRUFBRSxFQUFFLFVBQVU7Z0JBQ2QsRUFBRSxFQUFFLFVBQVUsR0FBRyxHQUFHO2dCQUNwQixFQUFFLEVBQUUsU0FBUyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEdBQUcsRUFBRTtnQkFDdEMsRUFBRSxFQUFFLFNBQVMsR0FBRyxVQUFVLENBQUMsTUFBTTthQUNwQyxDQUFDO1lBRUYsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7U0FDdkI7YUFBTTtZQUNILElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztZQUNqQiwwREFBMEQ7WUFDMUQsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLElBQUksTUFBYyxDQUFDO1lBQ25CLElBQUksT0FBZSxDQUFDO1lBQ3BCLElBQUksUUFBZ0IsQ0FBQztZQUNyQixJQUFJLFVBQXVCLENBQUM7WUFDNUIsR0FBRztnQkFDQyxVQUFVLEdBQUcsa0JBQWtCLENBQUMsUUFBUSxDQUFnQixDQUFDO2dCQUN6RCxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDbkQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDekQsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztnQkFFNUQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRTtvQkFDN0IsT0FBTyxHQUFHLFVBQVUsQ0FBQztvQkFDckIsTUFBTSxHQUFHLFdBQVcsQ0FBQztvQkFDckIsUUFBUSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7aUJBQzdCO3FCQUFNO29CQUNILE9BQU8sR0FBRyxXQUFXLENBQUM7b0JBQ3RCLE1BQU0sR0FBRyxVQUFVLENBQUM7b0JBQ3BCLFFBQVEsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO2lCQUM1QjtnQkFFRCxJQUFJLENBQUMsSUFBSSxPQUFPLElBQUksQ0FBQyxHQUFHLE9BQU8sR0FBRyxRQUFRLEVBQUU7b0JBQ3hDLFVBQVUsR0FBRyxJQUFJLENBQUM7aUJBQ3JCO3FCQUFNO29CQUNILFFBQVEsRUFBRSxDQUFDO2lCQUNkO2FBQ0osUUFBUSxRQUFRLEdBQUcsaUJBQWlCLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFFdEQsOEZBQThGO1lBQzlGLElBQUksVUFBVSxLQUFLLEtBQUssSUFBSSxDQUFDLEdBQUcsT0FBTyxFQUFFO2dCQUNyQyxPQUFPO2FBQ1Y7WUFFRCxNQUFNLEtBQUssR0FBRyxPQUFPLEdBQUcsUUFBUSxHQUFHLENBQUMsQ0FBQztZQUVyQyxJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUM7Z0JBQzNCLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2FBQzFGO2lCQUFNO2dCQUNILElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUM7Z0JBQzVELFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2FBQ3ZGO1lBRUQsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDN0YsTUFBTSx5QkFBeUIsR0FBRyxzQkFBc0IsQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDdkYsTUFBTSwwQkFBMEIsR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7WUFFMUYsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRTtnQkFDN0IsTUFBTSxjQUFjLEdBQUcseUJBQXlCLENBQUM7Z0JBQ2pELE1BQU0sMkJBQTJCLEdBQUcsc0JBQXNCLENBQUMsTUFBTSxDQUFDO2dCQUVsRSxJQUFJLEdBQUc7b0JBQ0gsRUFBRSxFQUFFLE1BQU07b0JBQ1YsRUFBRSxFQUFFLE1BQU0sR0FBRyxVQUFVLENBQUMsWUFBWTtvQkFDcEMsRUFBRSxFQUFFLGNBQWM7b0JBQ2xCLEVBQUUsRUFBRSxjQUFjLEdBQUcsMkJBQTJCO2lCQUNuRCxDQUFDO2FBQ0w7aUJBQU07Z0JBQ0gsTUFBTSxlQUFlLEdBQUcsMEJBQTBCLENBQUM7Z0JBQ25ELE1BQU0sMkJBQTJCLEdBQUcsc0JBQXNCLENBQUMsS0FBSyxDQUFDO2dCQUVqRSxJQUFJLEdBQUc7b0JBQ0gsRUFBRSxFQUFFLGVBQWU7b0JBQ25CLEVBQUUsRUFBRSxlQUFlLEdBQUcsMkJBQTJCO29CQUNqRCxFQUFFLEVBQUUsTUFBTTtvQkFDVixFQUFFLEVBQUUsTUFBTSxHQUFHLFVBQVUsQ0FBQyxZQUFZO2lCQUN2QyxDQUFDO2FBQ0w7U0FDSjtRQUVELG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0MsT0FBTztJQUNYLENBQUM7SUFFRCxnQkFBZ0I7SUFDUixtQkFBbUI7UUFDdkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IsbUJBQW1CO1FBQ3ZCLHlFQUEyQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSx3RUFBMEYsQ0FBQztRQUN4SCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLDhDQUFJLENBQUMsR0FBRyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN6RDtRQUVELDhEQUE4RDtRQUM5RCw0Q0FBNEM7UUFDNUMscURBQXFEO1FBQ3JELEdBQUc7UUFDSCxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRCxnQkFBZ0I7SUFDUixxQkFBcUIsQ0FBQyxPQUFzQjtRQUNoRCxJQUFJLElBQUksQ0FBQyxzQkFBc0IsS0FBSyxTQUFTLEVBQUU7WUFDM0MsTUFBTSxJQUFJLDRFQUF3QixDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ3JEO2FBQU07WUFDSCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUMsYUFBYSxDQUFDO1lBQ3pFLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQztZQUNuRSxJQUFJLG1CQUFtQixLQUFLLElBQUksRUFBRTtnQkFDOUIsTUFBTSxJQUFJLHVFQUFtQixDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQ2hEO2lCQUFNO2dCQUNILG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BELElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDO2FBQy9CO1NBQ0o7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IsWUFBWTtRQUNoQixJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRTtJQUNqQyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IsZUFBZTtRQUNuQixJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELGdCQUFnQjtJQUNSLGVBQWU7UUFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxnQkFBZ0I7SUFDUixpQkFBaUI7UUFDckIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxnQkFBZ0I7SUFDUixzQkFBc0IsQ0FBQyxFQUFjO1FBQ3pDLE1BQU0sU0FBUyxHQUFHLDhEQUFZLENBQUMsb0JBQW9CLENBQUM7UUFDcEQsTUFBTSxhQUFhLEdBQUcsSUFBSSw4REFBWSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDL0UsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELGdCQUFnQjtJQUNSLDJCQUEyQixDQUFDLEVBQWM7UUFDOUMsTUFBTSxTQUFTLEdBQUcsOERBQVksQ0FBQyx5QkFBeUIsQ0FBQztRQUN6RCxNQUFNLGFBQWEsR0FBRyxJQUFJLDhEQUFZLENBQUMsdUJBQXVCLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNwRixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IsZ0NBQWdDLENBQUMsSUFBbUI7UUFDeEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELGdCQUFnQjtJQUNSLCtCQUErQixDQUFDLElBQW1CO1FBQ3ZELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELGdCQUFnQjtJQUNSLG1DQUFtQyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsWUFBMEIsRUFBRSxhQUE0QjtRQUN0SCxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSSxFQUFFO1lBQzNCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN6QjtRQUNELElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVELGdCQUFnQjtJQUNSLGtCQUFrQjtRQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQzFCLE9BQU8sK0VBQTBCLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDM0U7YUFBTTtZQUNILE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBRTNELElBQUksTUFBTSxHQUFHLCtFQUEwQixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwRixJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7Z0JBQ3RCLE1BQU0sR0FBRztvQkFDTCxJQUFJO29CQUNKLE1BQU0sRUFBRSxTQUFTO29CQUNqQixRQUFRLEVBQUUsU0FBUztvQkFDbkIsS0FBSyxFQUFFLFNBQVM7b0JBQ2hCLFFBQVEsRUFBRSxTQUFTO29CQUNuQixXQUFXLEVBQUUsU0FBUztpQkFDekIsQ0FBQzthQUNMO1lBQ0QsT0FBTyxNQUFNLENBQUM7U0FDakI7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IscUJBQXFCLENBQUMsUUFBUSxHQUFHLEtBQUs7UUFDMUMsSUFBSSxRQUFRLEVBQUU7WUFDVixJQUFJLENBQUMsK0JBQStCLEVBQUUsQ0FBQztTQUMxQzthQUFNO1lBQ0gsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQzlDO0lBQ0wsQ0FBQztDQUNKO0FBRUQsY0FBYztBQUNkLFdBQWlCLEtBQUs7SUFzQmxCLGdCQUFnQjtJQUNoQixTQUFnQixhQUFhLENBQUMsUUFBa0I7UUFDNUMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsc0JBQTZCLENBQUM7UUFDbkQsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLHdCQUE4QixDQUFDO1FBQ3BELE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7SUFMZSxtQkFBYSxnQkFLNUI7QUFDTCxDQUFDLEVBN0JnQixLQUFLLEtBQUwsS0FBSyxRQTZCckI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNThCdUg7QUFTdEY7QUFFd0I7QUFDTjtBQUNBO0FBQ21CO0FBQ0Q7QUFDVDtBQUM4RDtBQUNwRTtBQUVKO0FBQ0Y7QUFDRztBQUNkO0FBQ21CO0FBR0o7QUFDUjtBQUNpQztBQUNZO0FBT25FO0FBU3ZCOztHQUVHO0FBRUgsY0FBYztBQUNQLE1BQWUsYUFBYyxTQUFRLDhEQUFZO0lBbUpwRDs7O01BR0U7SUFDRixZQUFZLFVBQStDO1FBQ3ZELEtBQUssRUFBRSxDQUFDO1FBdkpaOzs7V0FHRztRQUNILHFDQUFnQyxHQUFHLEtBQUssQ0FBQztRQUN6QyxrSEFBa0g7UUFDbEgsMkJBQXNCLEdBQUcsR0FBRyxDQUFDO1FBQzdCOzs7V0FHRztRQUNILHVDQUFrQyxHQUFHLElBQUksQ0FBQztRQUkxQyxnQkFBZ0I7UUFDUixtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUMvQixnQkFBZ0I7UUFDUixnQkFBVyxHQUEyQixTQUFTLENBQUM7UUFDeEQsZ0JBQWdCO1FBQ1IsaUJBQVksR0FBb0IsRUFBRSxDQUFDO1FBQzNDLGdCQUFnQjtRQUNSLHlCQUFvQixHQUErQixJQUFJLENBQUM7UUFDaEUsZ0JBQWdCO1FBQ1IseUJBQW9CLEdBQStCLElBQUksQ0FBQztRQUdoRSxnQkFBZ0I7UUFDUixlQUFVLEdBQXVCLEVBQUUsQ0FBQztRQUc1QyxnQkFBZ0I7UUFDUix5QkFBb0IsR0FBRyxhQUFhLENBQUMsMEJBQTBCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEYsZ0JBQWdCO1FBQ1Isd0JBQW1CLEdBQUcsYUFBYSxDQUFDLCtCQUErQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RGLGdCQUFnQjtRQUNSLGlCQUFZLEdBQWlCLEVBQUUsQ0FBQztRQUN4QyxnQkFBZ0I7UUFDUiwrQkFBMEIsR0FBRyxLQUFLLENBQUM7UUFDM0MsZ0JBQWdCO1FBQ1IsZUFBVSxHQUFHLElBQUksQ0FBQztRQUMxQixnQkFBZ0I7UUFDUixjQUFTLEdBQUcsSUFBSSxzREFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLGdCQUFnQjtRQUNSLFdBQU0sR0FBa0IsSUFBSSxDQUFDO1FBQ3JDLGdCQUFnQjtRQUNSLFlBQU8sR0FBa0IsSUFBSSxDQUFDO1FBR3RDLGdCQUFnQjtRQUNSLDRCQUF1QixHQUF5QixFQUFFLENBQUM7UUFDM0QsZ0JBQWdCO1FBQ1IsMkNBQXNDLEdBQUcsQ0FBQyxDQUFDO1FBQ25ELGdCQUFnQjtRQUNSLGdDQUEyQixHQUFHLENBQUMsQ0FBQztRQUd4QyxnQkFBZ0I7UUFDUixZQUFPLEdBQXlCLElBQUksQ0FBQztRQUU3QyxnQkFBZ0I7UUFDUixvQkFBZSxHQUFHLElBQUksY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUM7UUFDakYsdURBQXVEO1FBQy9DLGdDQUEyQixHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNsRSx1REFBdUQ7UUFDL0MsaUNBQTRCLEdBQUcsS0FBSyxDQUFDO1FBQzdDLGdCQUFnQjtRQUNSLDJDQUFzQyxHQUFHLENBQUMsRUFBOEIsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBUW5JOzs7O1dBSUc7UUFDSCxrQkFBYSxHQUF5QixHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFFL0M7Ozs7V0FJRztRQUNILGdCQUFXLEdBQXlCLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQWtFekQsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDO1FBRTFDLElBQUksQ0FBQyxtQ0FBbUMsR0FBRyxVQUFVLENBQUMsa0NBQWtDLENBQUM7UUFFekYsNERBQVcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUM5QixrRUFBYyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRWpDLElBQUksVUFBVSxDQUFDLGdCQUFnQixLQUFLLFNBQVMsRUFBRTtZQUMzQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsVUFBVSxDQUFDLGdCQUFnQixDQUFDO1NBQ3hEO0lBQ0wsQ0FBQztJQTFFRCxJQUFJLFNBQVMsS0FBa0IsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO0lBQy9ELElBQUksYUFBYSxLQUFjLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFDNUQsSUFBSSxVQUFVLEtBQWMsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLDhCQUFpQyxDQUFDLENBQUMsQ0FBQztJQUN2RyxnQkFBZ0I7SUFDaEIsSUFBSSxVQUFVLEtBQTZCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDckUsaUZBQWlGO0lBQ2pGLElBQUksSUFBSSxLQUE2QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQy9ELElBQUksV0FBVyxLQUFzQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLGdCQUFnQjtJQUNoQixJQUFJLG1CQUFtQixLQUFpQyxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7SUFDM0YsMENBQTBDO0lBQzFDLElBQUksbUJBQW1CLEtBQWlDLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQztJQUMzRixJQUFJLEtBQUssS0FBb0IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNsRCxJQUFJLE1BQU0sS0FBb0IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNwRDs7OztPQUlHO0lBQ0gsSUFBSSxRQUFRLEtBQWUsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNuRCxJQUFJLFFBQVE7UUFDUixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztTQUN6RDthQUFNO1lBQ0gsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQztZQUN6RCxJQUFJLGtCQUFrQixDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQ2pDLE9BQU8sU0FBUyxDQUFDO2FBQ3BCO2lCQUFNO2dCQUNILE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDM0M7U0FDSjtJQUNMLENBQUM7SUFDRCxJQUFJLG9CQUFvQixLQUFnQyxPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7SUFDNUYsZ0JBQWdCO0lBQ2hCLElBQUksa0JBQWtCLEtBQWtCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztJQUMxRSxJQUFJLGNBQWMsS0FBd0IsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztJQUV4RSx1REFBdUQ7SUFDdkQsSUFBSSxxQkFBcUIsS0FBYyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsbUNBQW1DLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztJQUU1SCxJQUFJLE1BQU0sS0FBMkIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUMzRCxJQUFJLE1BQU0sQ0FBQyxLQUEyQixJQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUVqRSxJQUFJLFNBQVM7O1FBQ1QsTUFBTSxNQUFNLEdBQW9CLEVBQUUsQ0FBQztRQUVuQyxNQUFNLElBQUksR0FBRyxVQUFJLENBQUMsTUFBTSxtQ0FBSSxJQUFJLENBQUM7UUFDakMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVsQixLQUFLLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDakMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDdEI7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBcUJEOzs7Ozs7O09BT0c7SUFDSCxPQUFPO1FBQ0gsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3JCLElBQUksSUFBSSxDQUFDLDRCQUE0QixFQUFFO2dCQUNuQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO2dCQUNqRixJQUFJLENBQUMsNEJBQTRCLEdBQUcsS0FBSyxDQUFDO2FBQzdDO1lBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsS0FBSyxJQUFJLEVBQUU7Z0JBQzFELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2FBQzlCO1lBRUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUUvQixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO2dCQUNoQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQzlCO1lBQ0QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xDLElBQUksSUFBSSxDQUFDLG9CQUFvQixLQUFLLElBQUksRUFBRTtnQkFDcEMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ3ZDO1lBQ0QsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEtBQUssSUFBSSxFQUFFO2dCQUNwQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDdkM7WUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBRXpCLEtBQUssTUFBTSxVQUFVLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDeEMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ3hCO1lBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7WUFFdkIsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7U0FDL0I7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxZQUFZLENBQUMsTUFBNEI7UUFDckMsT0FBTyx5RUFBb0IsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsTUFBNEI7UUFDdkMsT0FBTyx5RUFBb0IsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQU9EOzs7T0FHRztJQUNILElBQUk7O1FBQ0EsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLGdGQUFtQixFQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksK0VBQW1CLEVBQUUsQ0FBQztRQUN0RCxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUUvQixJQUFJLENBQUMsWUFBWSxHQUFHLHlFQUFvQixDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsNENBQTRDO1FBQ3RHLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSwwREFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN4RixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRXhCLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO1FBRXJDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzNCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFekIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLG1DQUFtQyxDQUFDO1FBRXRELElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO1lBQzFDLCtEQUErRDtZQUMvRCxJQUFJLGFBQU0sQ0FBQyxJQUFJLDBDQUFFLElBQUksS0FBSSxrREFBUSxDQUFDLFNBQVMsRUFBRTtnQkFDekMsTUFBTSxDQUFDLElBQUksR0FBRztvQkFDVixJQUFJLEVBQUUsa0RBQVEsQ0FBQyxLQUFLO29CQUNwQixPQUFPLEVBQUUsQ0FBRSxNQUFNLENBQUMsSUFBSSxDQUFFO2lCQUMzQixDQUFDO2FBQ0w7WUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzNCO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNILFVBQVUsQ0FBQyxZQUEwQjtRQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNyQiw2REFBNkQ7WUFDN0QsTUFBTSxJQUFJLEtBQUssQ0FBQywyRkFBMkYsQ0FBQztTQUMvRzthQUFNO1lBQ0gsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtnQkFDaEMsTUFBTSxJQUFJLDRFQUF3QixDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ25EO2lCQUFNO2dCQUNILElBQUksQ0FBQyxZQUFZLEdBQUcseURBQVksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3ZELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsMkJBQTJCO2dCQUNwRCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNsRCxJQUFJLENBQUMsNkJBQTZCLEVBQUUsQ0FBQztnQkFDckMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7YUFDbEM7U0FDSjtJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFVBQVU7UUFDTixJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssS0FBSyxFQUFFO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsa0RBQWtELENBQUMsQ0FBQztTQUN2RTthQUFNO1lBRUgsOERBQThEO1lBQzlELHFEQUFxRDtZQUNyRCxJQUFJO1lBRUo7O2NBRUU7WUFDRixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO2dCQUNoQyxNQUFNLElBQUksNEVBQXdCLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDbkQ7aUJBQU07Z0JBQ0gsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO2dCQUVoRSxJQUFJLGNBQWtELENBQUM7Z0JBQ3ZELElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7b0JBQzVCLGNBQWMsR0FBRyxTQUFTLENBQUM7aUJBQzlCO3FCQUFNO29CQUNILGNBQWMsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3JDO2dCQUVEOztrQkFFRTtnQkFDRixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztnQkFDOUIsTUFBTSxXQUFXLEdBQWlDLEVBQUUsQ0FBQztnQkFDckQsS0FBSyxNQUFNLE1BQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO29CQUNwQyxJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUU7d0JBQ3RCLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7cUJBQ3ZDO2lCQUNKO2dCQUVELE1BQU0sTUFBTSxHQUF5QjtvQkFDakMsSUFBSSxFQUFFLGNBQWM7b0JBQ3BCLFdBQVc7b0JBQ1gsUUFBUSxFQUFHLHlFQUFvQixDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUM7b0JBQy9FLFVBQVUsRUFBRSx5RUFBb0IsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO29CQUNwRixNQUFNLEVBQUUseUVBQW9CLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztvQkFDeEUsUUFBUSxFQUFFLElBQUk7aUJBQ2pCO2dCQUVELE9BQU8sTUFBTSxDQUFDO2FBQ2pCO1NBQ0o7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFFSCxLQUFLO1FBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtZQUNoQyxNQUFNLElBQUksNEVBQXdCLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDbkQ7YUFBTTtZQUNILElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDaEM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxRQUFRO1FBQ0osT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILFlBQVksQ0FBQyxhQUF3QixFQUFFLGNBQTBCLEVBQUUsS0FBYztRQUM3RSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsYUFBYSxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN4RixJQUFJLGFBQWEsS0FBSyxTQUFTLEVBQUU7WUFDN0IsTUFBTSxJQUFJLCtEQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDdEM7YUFBTTtZQUNILE9BQU8sYUFBYSxDQUFDO1NBQ3hCO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsc0JBQXNCLENBQUMsYUFBd0IsRUFBRSxjQUEwQixFQUFFLEtBQWMsRUFDdkYsaUJBQW9EO1FBRXBELElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUU7WUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1NBQ3ZEO2FBQU07WUFDSCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsYUFBYSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUN0RyxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7Z0JBQ3hCLE9BQU8sU0FBUyxDQUFDO2FBQ3BCO2lCQUFNO2dCQUNILE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDckUsSUFBSSxDQUFDLDZEQUFXLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxFQUFFO29CQUMzQyxNQUFNLElBQUksK0RBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQztpQkFDMUM7cUJBQU07b0JBQ0gsT0FBTyxXQUFXLENBQUM7aUJBQ3RCO2FBQ0o7U0FDSjtJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxZQUFZLENBQUMsYUFBd0IsRUFBRSxjQUEwQixFQUFFLEtBQWM7UUFDN0UsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsRUFBRSxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbkYsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFO1lBQ3hCLE1BQU0sSUFBSSwrREFBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ3RDO2FBQU07WUFDSCxPQUFPLFFBQVEsQ0FBQztTQUNuQjtJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILHNCQUFzQixDQUFDLGFBQXdCLEVBQUUsY0FBMEIsRUFBRSxLQUFjLEVBQ3ZGLGlCQUE2RDtRQUU3RCxNQUFNLFVBQVUsR0FBd0I7WUFDcEMsSUFBSSxFQUFFLFdBQVc7WUFDakIsYUFBYTtZQUNiLGNBQWM7WUFDZCxLQUFLO1NBQ1IsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRDs7Ozs7TUFLRTtJQUNGLE9BQU8sQ0FBQyxVQUF5RTtRQUM3RSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdkQsSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQzNCLE1BQU0sSUFBSSwrREFBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ3RDO2FBQU07WUFDSCxPQUFPLFdBQVcsQ0FBQztTQUN0QjtJQUNMLENBQUM7SUFFRDs7Ozs7O21HQU0rRjtJQUMvRixpQkFBaUIsQ0FBQyxVQUF5RSxFQUN2RixpQkFBNkQ7UUFFN0QsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtZQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7U0FDdkQ7YUFBTTtZQUNILE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUN2RSxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7Z0JBQ3hCLE9BQU8sU0FBUyxDQUFDO2FBQ3BCO2lCQUFNO2dCQUNILE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDckUsT0FBTyxXQUFXLENBQUM7YUFDdEI7U0FDSjtJQUNMLENBQUM7SUFFRDs7Ozt1REFJbUQ7SUFDbkQsT0FBTyxDQUFDLFVBQXlFO1FBQzdFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwRCxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDeEIsTUFBTSxJQUFJLCtEQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDdEM7YUFBTTtZQUNILE9BQU8sUUFBUSxDQUFDO1NBQ25CO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7K0dBTTJHO0lBQzNHLGlCQUFpQixDQUFDLFVBQXlFLEVBQ3ZGLGlCQUE2RDtRQUU3RCxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztTQUN2RDthQUFNO1lBQ0gsSUFBSSxpQkFBaUIsS0FBSyxTQUFTLEVBQUU7Z0JBQ2pDLHlEQUF5RDtnQkFDekQsaUJBQWlCLEdBQUcsYUFBYSxDQUFDLHdCQUF3QixDQUFDO2FBQzlEO1lBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDM0QsSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFO2dCQUN4QixPQUFPLFNBQVMsQ0FBQzthQUNwQjtpQkFBTTtnQkFDSCxJQUFJLFVBQVUsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDO2dCQUNyQyxJQUFJLE1BQWMsQ0FBQztnQkFDbkIsUUFBUSxVQUFVLENBQUMsSUFBSSxFQUFFO29CQUNyQixLQUFLLGtEQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQ2xCLE1BQU0sVUFBVSxHQUFHLFVBQXdCLENBQUM7d0JBQzVDLE1BQU0sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ3hELElBQUksTUFBTSxJQUFJLENBQUMsRUFBRTs0QkFDYixVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyx3QkFBd0I7eUJBQzFFOzZCQUFNOzRCQUNILE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxnRkFBZ0Y7eUJBQy9GO3dCQUNELE1BQU07cUJBQ1Q7b0JBQ0QsS0FBSyxrREFBUSxDQUFDLEdBQUcsQ0FBQztvQkFDbEIsS0FBSyxrREFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUNsQixNQUFNLFdBQVcsR0FBRyxVQUF5QixDQUFDO3dCQUM5QyxNQUFNLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUN6RCxNQUFNO3FCQUNUO29CQUNELEtBQUssa0RBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDakIsSUFBSSxDQUFDLHVEQUFVLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxFQUFFOzRCQUNyQyxNQUFNLEtBQUssQ0FBQyw0REFBVyxzQ0FBMkMsQ0FBQyxDQUFDO3lCQUN2RTs2QkFBTTs0QkFDSCxNQUFNLEtBQUssR0FBRyxVQUFtQixDQUFDOzRCQUNsQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDOzRCQUNuRCxNQUFNO3lCQUNUO3FCQUNKO29CQUNELEtBQUssa0RBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQzt3QkFDckIsTUFBTSxJQUFJLCtEQUFXLENBQUMsaUJBQWlCLENBQUMsQ0FBQztxQkFDNUM7b0JBQ0Q7d0JBQ0ksTUFBTSxJQUFJLHdFQUFvQixDQUFDLGlCQUFpQixFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDMUU7Z0JBRUQsSUFBSSx1REFBVSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsRUFBRTtvQkFDcEMsNEJBQTRCO29CQUM1QixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUM3QyxJQUFJLDZEQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO3dCQUMzQixVQUFVLEdBQUcsSUFBSSxDQUFDO3dCQUNsQixNQUFNLEdBQUcsQ0FBQyxDQUFDO3FCQUNkO2lCQUNKO2dCQUVELFFBQVEsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO2dCQUNqQyxRQUFRLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztnQkFFeEIsT0FBTyxRQUFRLENBQUM7YUFDbkI7U0FDSjtJQUNMLENBQUM7SUFFRDs7O01BR0U7SUFDRixtQkFBbUIsQ0FBQyxVQUErQjtRQUMvQyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztTQUNsRDthQUFNO1lBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUNwRDtJQUNMLENBQUM7SUFFRCw0REFBNEQ7SUFDNUQsVUFBVSxDQUFDLEtBQWEsRUFBRSxNQUFjO1FBQ3BDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE9BQU8sQ0FBQyxLQUFhLEVBQUUsTUFBYztRQUNqQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUV0QixJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssSUFBSSxFQUFFO1lBQzlCLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUU7Z0JBQ2hDLE1BQU0sSUFBSSw0RUFBd0IsQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUNuRDtpQkFBTTtnQkFDSCxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFFcEQsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO29CQUN0QixNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLDZFQUE4QixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO29CQUNqRiw4REFBZSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUNyRCwrREFBZ0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztvQkFDdkQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQzFDO2dCQUVELElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2FBQ2xDO1NBQ0o7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLHFCQUFxQjtRQUNqQixJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLG1CQUFtQjtRQUNmLElBQUksRUFBRSxJQUFJLENBQUMsMkJBQTJCLEtBQUssQ0FBQyxFQUFFO1lBQzFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1NBQ2xDO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNoQix1QkFBdUI7UUFDbkIsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyw2RUFBOEIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNqRixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsY0FBYyxDQUFDLEtBQUssR0FBRyxLQUFLO1FBQ3hCLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUU7WUFDaEMsTUFBTSxJQUFJLDRFQUF3QixDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ3BEO2FBQU07WUFDSCxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN0QztJQUNMLENBQUM7SUFFRCxjQUFjO0lBQ2Qsd0JBQXdCLENBQUMsTUFBMEIsRUFBRSxNQUFtQjtRQUNwRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZELE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNmLE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsaUJBQWlCLENBQUMsTUFBMEIsRUFBRSxNQUFtQjtRQUM3RCxJQUFJLE9BQU8sTUFBTSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDakMsTUFBTSxJQUFJLHVFQUFrQixDQUFDLDRCQUE0QixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUN0RjtRQUVEOztXQUVHO1FBQ0g7UUFDSSx5QkFBeUI7UUFDekIsdUVBQWtCLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQztZQUUxQyxzQ0FBc0M7WUFDdEMsQ0FBQyxDQUFDLE1BQU0sWUFBWSxnREFBSyxDQUFDO1lBRTFCLHVCQUF1QjtZQUN2QixDQUFDLENBQUMsTUFBTTtZQUVSLGdEQUFnRDtZQUNoRCxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJLElBQUksTUFBTSxZQUFZLDBEQUFVLENBQUMsRUFDOUQ7WUFDRSxNQUFNLFdBQVcsR0FBNEI7Z0JBQ3pDLElBQUksRUFBRSxrREFBUSxDQUFDLEtBQUs7Z0JBQ3BCLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQztnQkFDakIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO2dCQUNqQixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7Z0JBQ3pCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztnQkFDdkIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO2dCQUMvQixFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUU7Z0JBQ2IsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO2dCQUMzQixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7Z0JBQzdCLGVBQWUsRUFBRSxDQUFDO2dCQUNsQixNQUFNLEVBQUUsU0FBUzthQUNwQixDQUFDO1lBRUYsTUFBTSxHQUFHLFdBQVcsQ0FBQztTQUN4QjtRQUVELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDckUsT0FBTyxXQUFXLENBQUM7SUFDdkIsQ0FBQztJQUVELDBCQUEwQixDQUFDLEVBQVU7UUFDakMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtZQUNoQyxNQUFNLElBQUksNEVBQXdCLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDdkQ7YUFBTTtZQUNILE9BQU8sSUFBSSxDQUFDLHFDQUFxQyxDQUFDLGtEQUFRLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFrQixDQUFDO1NBQ2hIO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNoQiwyQkFBMkIsQ0FBQyxJQUFpQixFQUN6QyxNQUFxRCxFQUNyRCxRQUF1QixFQUN2QixTQUFtRDs7UUFFbkQ7Ozs7Ozs7V0FPRztRQUNILE1BQU0sSUFBSSxHQUFHLFNBQVMsYUFBVCxTQUFTLGNBQVQsU0FBUyxHQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUUvQyxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUU7WUFDZixNQUFNLElBQUksdUVBQW1CLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDakQ7YUFBTTtZQUNILElBQUksUUFBUSxLQUFLLElBQUksRUFBRTtnQkFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUMxQztZQUVELElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtnQkFDdEIsTUFBTSxXQUFXLEdBQUcsMkVBQTRCLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzdELE1BQU0sVUFBVSxHQUFHLENBQUMsSUFBSSxZQUFZLGlFQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFFOUgsTUFBTSxHQUFHO29CQUNMLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJO29CQUN4QyxHQUFHLEVBQUUsV0FBVyxDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUMsR0FBRztvQkFDckMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLO29CQUN2QixNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU07aUJBQzVCLENBQUM7YUFDTDtZQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQyxJQUFJLFVBQUksQ0FBQyxNQUFNLDBDQUFFLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUNqQjtZQUVELElBQUksQ0FBQywyRUFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsRUFBRTtnQkFDdEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLDREQUFXLG1EQUF3RCxFQUFFLENBQUMsQ0FBQzthQUM3RjtpQkFBTTtnQkFDSCxPQUFPLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDcEY7U0FDSjtJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsZ0NBQWdDO1FBQzVCLElBQUksRUFBRSxJQUFJLENBQUMsc0NBQXNDLEtBQUssQ0FBQyxFQUFFO1lBQ3JELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1NBQzNDO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNoQix3QkFBd0IsQ0FBQyxTQUE2QjtRQUNsRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsOEJBQThCO1FBQzFCLElBQUksRUFBRSxJQUFJLENBQUMsc0NBQXNDLEtBQUssQ0FBQyxFQUFFO1lBQ3JELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUM7WUFDbEQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO2dCQUNYLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDMUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDNUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNsRCxTQUFTLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztpQkFDNUM7Z0JBQ0QsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2FBQzNDO1NBQ0o7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLDZCQUE2QixDQUFDLEtBQWE7UUFDdkMsSUFBSSxJQUFJLENBQUMseUJBQXlCLEtBQUssU0FBUyxFQUFFO1lBQzlDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN6QztJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsNEJBQTRCO1FBQ3hCLElBQUksSUFBSSxDQUFDLHdCQUF3QixLQUFLLFNBQVMsRUFBRTtZQUM3QyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztTQUNuQztJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDUiwwQkFBMEIsQ0FBQyxjQUFzQyxFQUNyRSxNQUF5QyxFQUN6QyxRQUF1QixFQUN2QixhQUE0QjtRQUU1QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFckMsTUFBTSxrQkFBa0IsR0FBK0I7WUFDbkQsSUFBSSxFQUFFLGNBQWM7WUFDcEIsV0FBVyxFQUFFLEVBQUU7WUFDZixRQUFRLEVBQUUsWUFBWSxDQUFDLFFBQVE7WUFDL0IsVUFBVSxFQUFFLFlBQVksQ0FBQyxVQUFVO1lBQ25DLE1BQU0sRUFBRSxZQUFZLENBQUMsTUFBTTtZQUMzQixNQUFNO1lBQ04sUUFBUTtZQUNSLGFBQWE7WUFDYixRQUFRLEVBQUUsSUFBSTtTQUNqQjtRQUVELE9BQU8sSUFBSSxDQUFDLGtDQUFrQyxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixrQ0FBa0MsQ0FBQyxNQUFrQzs7UUFDakUsaUZBQWlGO1FBQ2pGLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJLEVBQUU7WUFDdkIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGtDQUFrQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ2xFO1FBRUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNuQyxNQUFNLGFBQWEsR0FBUztZQUN4QixJQUFJLEVBQUUsa0JBQVksQ0FBQyxJQUFJLG1DQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxVQUFVLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztZQUM3RSxHQUFHLEVBQUUsa0JBQVksQ0FBQyxHQUFHLG1DQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxVQUFVLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztZQUMxRSxLQUFLLEVBQUUsa0JBQVksQ0FBQyxLQUFLLG1DQUFJLEdBQUc7WUFDaEMsTUFBTSxFQUFFLGtCQUFZLENBQUMsTUFBTSxtQ0FBSSxHQUFHO1NBQ3JDLENBQUM7UUFFRixNQUFNLGFBQWEsR0FBRyxJQUFJLG9FQUFhLENBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVyRSxhQUFhLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUU7WUFDakMsTUFBTSxFQUFFLEdBQUcsYUFBYSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBRXpDLDhEQUE4RDtZQUM5RCxNQUFNLGNBQWMsR0FBRzs7Z0JBQ25CLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxJQUFJLGVBQUUsQ0FBQyxVQUFVLDBDQUFFLG9CQUFvQixFQUFFLDBDQUFFLE1BQU0sTUFBSyxDQUFDLEVBQUU7b0JBQ3ZFLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDekI7WUFDTCxDQUFDLENBQUM7WUFFRixFQUFFLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUNyQyxFQUFFLENBQUMsRUFBRSxDQUFDLGVBQWUsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUV2QyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FBQztRQUVILGFBQWEsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUM7UUFFaEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFdEMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRTtZQUN2RixVQUFVLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQywyQkFBMkIsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2pHLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxJQUFJLENBQUM7U0FDNUM7UUFFRCxPQUFPLGFBQWEsQ0FBQztJQUN6QixDQUFDO0lBRUQ7OztPQUdHO0lBRUgsbUJBQW1CLENBQUMsWUFBWSxHQUFHLEtBQUs7UUFDcEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQy9DLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQzVDO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBRTdCLElBQUksSUFBSSxDQUFDLDRCQUE0QixFQUFFO1lBQ25DLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUM7WUFDakYsSUFBSSxDQUFDLDRCQUE0QixHQUFHLEtBQUssQ0FBQztTQUM3QztJQUNMLENBQUM7SUFtQkQsYUFBYSxDQUFDLE9BQW9CLEVBQzlCLGlDQUE2RyxFQUM3RyxjQUEwQixFQUMxQixLQUFjLEVBQ2QsRUFBVztRQUVYLE1BQU0sVUFBVSxHQUFHLElBQUksOERBQVUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxpQ0FBaUMsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ25ILElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRW5DLE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7O09BR0E7SUFDSCxnQkFBZ0IsQ0FBQyxVQUFzQjtRQUN0Qyw4REFBZSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFFLENBQUM7UUFDaEQsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRCxnQkFBZ0I7SUFDUiwwQkFBMEIsQ0FBQyxNQUFrQjtRQUNqRCw4REFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixrQkFBa0IsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLFlBQTBCLEVBQUUsYUFBNEI7O1FBQzdGLE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyx3QkFBd0IsRUFBRSxLQUFLLElBQUksQ0FBQztRQUVqRSxNQUFNLFdBQVcsR0FDYixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxlQUFlO1lBQzFDLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFrQix3RkFBd0Y7UUFFaEosTUFBTSxxQkFBcUIsR0FDdkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsa0JBQWtCO1lBQzdDLENBQUMsVUFBSSxDQUFDLE9BQU8sbUNBQUksSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBSyxtQ0FBbUM7UUFFM0YseUZBQXlGO1FBQ3pGLHFHQUFxRztRQUNyRyxJQUFJLE1BQU0sSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQ2xELFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMxQixPQUFPO1NBQ1Y7UUFFRCxNQUFNLE1BQU0sR0FBRyw4REFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRXRGLElBQUkscUJBQXFCLEVBQUU7WUFDdkIsS0FBSyxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUMzQixJQUFJLEVBQUUsS0FBSyxJQUFJLEVBQUU7b0JBQ2IsRUFBRSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUN6QzthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLHVCQUF1Qjs7UUFDbkIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2pDLFVBQUksQ0FBQyxtQkFBbUIsMENBQUUsSUFBSSxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILGNBQWMsQ0FBQyxJQUFtQixFQUFFLGFBQWEsR0FBRyxLQUFLO1FBQ3JELElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILG1CQUFtQixDQUFDLGFBQWEsR0FBRyxLQUFLO1FBQ3JDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILHVCQUF1QixDQUFDLElBQStCLEVBQUUsY0FBYyxHQUFHLEtBQUs7UUFDM0UsSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBRXJDLElBQUksb0JBQXlELENBQUM7WUFDOUQsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO2dCQUNwQixvQkFBb0IsS0FBSyxTQUFTLENBQUM7YUFDdEM7aUJBQU07Z0JBQ0gsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQzthQUMxQztZQUVELElBQUksSUFBSSxDQUFDLHFCQUFxQixLQUFLLFNBQVMsRUFBRTtnQkFDMUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDO2dCQUNsRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsU0FBUyxDQUFDO2dCQUN2QyxjQUFjLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUMxQyxNQUFNLG9CQUFvQixHQUFHLGNBQWMsQ0FBQyxVQUFVLENBQUM7Z0JBQ3ZELElBQUksb0JBQW9CLEtBQUssb0JBQW9CLEVBQUU7b0JBQy9DLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztpQkFDcEM7cUJBQU07b0JBQ0gsb0JBQW9CLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUMvQzthQUNKO1lBRUQsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO2dCQUNwQixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUNoQyxJQUFJLG9CQUFvQixLQUFLLFNBQVMsRUFBRTtvQkFDcEMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUM5QzthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IsMkJBQTJCLENBQUMsTUFBMEIsRUFBRSxNQUFtQjtRQUMvRSxRQUFRLE1BQU0sQ0FBQyxJQUFJLEVBQUU7WUFDakIsS0FBSyxrREFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sSUFBSSwrREFBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzVELEtBQUssa0RBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLElBQUksOERBQVcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQXVDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDeEcsS0FBSyxrREFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sSUFBSSw4REFBVyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBdUMsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUMxRyxLQUFLLGtEQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxJQUFJLGdEQUFLLENBQUMsSUFBSSxFQUFFLE1BQWlDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDdkYsS0FBSyxrREFBUSxDQUFDLFNBQVM7Z0JBQ25CLE9BQU8sSUFBSSxpRUFBYSxDQUFDLElBQUksRUFBRSxNQUFxQyxFQUFFLE1BQWUsQ0FBQyxDQUFDO1lBQzNGO2dCQUNJLE1BQU0sSUFBSSx3RUFBb0IsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxvQ0FBb0MsQ0FBQyxDQUFDO1NBQ3RHO0lBQ0wsQ0FBQztJQUVEOzs7O1FBSUk7SUFDSixpQkFBaUIsQ0FBQyxLQUF3QjtRQUN0QyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDckIsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLFNBQVMsRUFBRTtnQkFDcEMsSUFBSSxDQUFDLDZCQUE2QixFQUFFLENBQUM7YUFDeEM7U0FDSjthQUFNO1lBQ0gsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLGVBQWUsRUFBRTtnQkFDaEMsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLFNBQVMsRUFBRTtvQkFDcEMsSUFBSSxDQUFDLDZCQUE2QixFQUFFLENBQUM7aUJBQ3hDO2dCQUVELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNwQztTQUNKO0lBQ0wsQ0FBQztJQUVELDJCQUEyQjtRQUN2QixJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssU0FBUyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDbkM7SUFDTCxDQUFDO0lBRUQsdUhBQXVIO0lBQ3ZILHFIQUFxSDtJQUNySCxXQUFXO0lBRVgsbUJBQW1CO0lBQ25CLHNDQUFzQztJQUN0Qyw2Q0FBNkM7SUFFN0MsbURBQW1EO0lBQ25ELHNDQUFzQztJQUN0QyxvRUFBb0U7SUFFcEUsaURBQWlEO0lBQ2pELG1FQUFtRTtJQUNuRSwwREFBMEQ7SUFDMUQsdUJBQXVCO0lBQ3ZCLHNEQUFzRDtJQUN0RCxnQkFBZ0I7SUFDaEIsWUFBWTtJQUNaLFFBQVE7SUFDUixJQUFJO0lBRUosdUhBQXVIO0lBQ3ZILHFIQUFxSDtJQUNySCxXQUFXO0lBRVgsbUJBQW1CO0lBQ25CLHNDQUFzQztJQUN0Qyw2Q0FBNkM7SUFFN0MsbURBQW1EO0lBQ25ELHNDQUFzQztJQUN0QyxvRUFBb0U7SUFFcEUsaURBQWlEO0lBQ2pELG1FQUFtRTtJQUNuRSwwREFBMEQ7SUFDMUQsdUJBQXVCO0lBQ3ZCLHNEQUFzRDtJQUN0RCxnQkFBZ0I7SUFDaEIsWUFBWTtJQUNaLFFBQVE7SUFDUixJQUFJO0lBRUosZ0JBQWdCO0lBQ1Isb0NBQW9DLENBQUMsS0FBaUM7UUFDaEYsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDM0UsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDN0YsSUFBSSxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUM7U0FDakM7SUFDQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxXQUFXO1FBQ1AsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixPQUFPLENBQUMsQ0FBUyxFQUFFLENBQVM7UUFDeEIsSUFBSSxZQUFZLEdBQTRCLElBQUksQ0FBQztRQUNqRCxJQUFJLGVBQWUsR0FBRyxRQUFRLENBQUM7UUFFL0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzdDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFaEMsSUFDSSxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUU7Z0JBQ1osQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksNkJBQTZCO2dCQUM1QyxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUU7Z0JBQ1osQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksNkJBQTZCO2dCQUM1QyxlQUFlLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFDaEM7Z0JBQ0UsZUFBZSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQy9CLFlBQVksR0FBRyxJQUFJLENBQUM7YUFDdkI7U0FDSjtRQUVELE9BQU8sWUFBWSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsa0JBQWtCO1FBQ2QsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDbEQ7Ozs7OztXQU1HO1FBQ0gsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUNwQyxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUU7WUFDMUIsTUFBTSxJQUFJLDRFQUF3QixDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ3JEO2FBQU07WUFDSCxJQUFJLGVBQWUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUM5QixnREFBZ0Q7Z0JBQ2hELE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDL0MsSUFBSSxVQUFVLEtBQUssSUFBSSxFQUFFO29CQUNyQixNQUFNLElBQUksdUVBQW1CLENBQUMsY0FBYyxDQUFDO2lCQUNoRDtxQkFBTTtvQkFDSCxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQ2xDO2dCQUNELE9BQU87YUFDVjtpQkFBTTtnQkFDSCxJQUFJLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFO29CQUNwQyxpRkFBaUY7b0JBQ2pGLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO2lCQUN4QjtxQkFBTTtvQkFDSCxrQkFBa0I7b0JBQ2xCLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLGVBQWUsRUFBRSxDQUFDO2lCQUNsRDtnQkFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDN0MsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNqQyxJQUFJLDZEQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO3dCQUM1QixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBRTdCLElBQUksSUFBSSxLQUFLLElBQUksRUFBRTs0QkFDZixTQUFTO3lCQUNaOzZCQUFNOzRCQUNILElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUMzQixNQUFNLDBCQUEwQixHQUFHLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQzs0QkFDL0QsSUFBSSwwQkFBMEIsS0FBSyxTQUFTLEVBQUU7Z0NBQzFDLE1BQU0sSUFBSSw0RUFBd0IsQ0FBQyxjQUFjLENBQUMsQ0FBQzs2QkFDdEQ7aUNBQU07Z0NBQ0gsTUFBTSxhQUFhLEdBQUcsMEJBQTBCLENBQUMsTUFBTSxDQUFDLGFBQWE7Z0NBQ3JFLE1BQU0sT0FBTyxHQUFHLENBQUMsYUFBYSxDQUFDLEVBQUUsR0FBRyxhQUFhLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsRUFBRSxHQUFHLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQ0FFOUYsTUFBTSxNQUFNLEdBQXFCO29DQUM3QixFQUFFLEVBQUUsYUFBYSxDQUFDLEVBQUU7b0NBQ3BCLEVBQUUsRUFBRSxhQUFhLENBQUMsRUFBRTtvQ0FDcEIsRUFBRSxFQUFFLGFBQWEsQ0FBQyxFQUFFO29DQUNwQixFQUFFLEVBQUUsYUFBYSxDQUFDLEVBQUU7b0NBQ3BCLFdBQVcsRUFBRSxLQUFLO29DQUNsQixPQUFPO2lDQUNWLENBQUM7Z0NBQ0YsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7NkJBQ2hDO3lCQUNKO3FCQUNKO2lCQUNKO2FBQ0o7U0FDSjtJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssNkJBQTZCO1FBQ2pDLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUU7WUFDaEMsTUFBTSxJQUFJLDRFQUF3QixDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ3REO2FBQU07WUFDSCxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUV4RSxJQUFJLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ2pDLElBQUksSUFBSSxHQUFHLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuQyxJQUFJLDZEQUFXLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUNuQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO29CQUMxQixJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUU7d0JBQ2hCLE1BQU0sSUFBSSx1RUFBbUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztxQkFDakQ7eUJBQU07d0JBQ0gsSUFBSSxHQUFHLEtBQUssQ0FBQztxQkFDaEI7aUJBQ0o7Z0JBQ0QsSUFBSSxDQUFDLDZEQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUM1QixNQUFNLElBQUksK0RBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztpQkFDekM7cUJBQU07b0JBQ0gsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2lCQUNuQjthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1Isb0JBQW9CLENBQUMsS0FBWTtRQUNyQyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM3QixLQUFLLENBQUMsRUFBRSxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1FBQzdFLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsZ0NBQWtDLENBQUM7UUFDOUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDM0UsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtZQUNoQyxNQUFNLElBQUksNEVBQXdCLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDcEQ7YUFBTTtZQUNILElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDaEQsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyw2RUFBOEIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNqRiw4REFBZSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdEMsK0RBQWdCLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUN4QyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDN0I7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IsNkJBQTZCO1FBQ2pDLElBQUksSUFBSSxDQUFDLGVBQWUsS0FBSyxTQUFTLEVBQUU7WUFDcEMsTUFBTSxJQUFJLCtEQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDdkM7YUFBTTtZQUNILE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDbkMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRTtnQkFDdkIsTUFBTSxJQUFJLHVFQUFtQixDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQzlDO2lCQUFNO2dCQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sZ0NBQWtDLENBQUM7Z0JBQ2pFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMzRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDO2dCQUNqQyxLQUFLLENBQUMsR0FBRyxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO2dCQUM5RSxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2FBQzdCO1NBQ0o7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxzQkFBc0I7UUFDMUIsTUFBTSxXQUFXLEdBQW9CLEVBQUUsQ0FBQztRQUV4QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDL0MsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sS0FBSyxLQUFLLEVBQUU7Z0JBQ25ELFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQzFDO2lCQUFNO2dCQUNILElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNuRDtTQUNKO1FBRUQsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBSyxXQUFXLENBQUMsTUFBTSxFQUFFO1lBQ2pELElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDN0I7SUFFTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGtCQUFrQjtRQUN0QixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQ2hDLE1BQU0sSUFBSSw0RUFBd0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUNyRDthQUFNO1lBQ0gsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixFQUFFLENBQUM7U0FDaEQ7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGdCQUFnQjtRQUNwQixLQUFLLE1BQU0sTUFBTSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFO1lBQ2hELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUV2QyxNQUFNLGtCQUFrQixHQUErQjtnQkFDbkQsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO2dCQUNqQixXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7Z0JBQy9CLFFBQVEsRUFBRSxZQUFZLENBQUMsUUFBUTtnQkFDL0IsVUFBVSxFQUFFLFlBQVksQ0FBQyxVQUFVO2dCQUNuQyxNQUFNLEVBQUUsWUFBWSxDQUFDLE1BQU07Z0JBQzNCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtnQkFDckIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO2dCQUN6QixhQUFhLEVBQUUsTUFBTSxDQUFDLGFBQWE7Z0JBQ25DLFFBQVEsRUFBRSxJQUFJO2FBQ2pCO1lBRUQsSUFBSSxDQUFDLGtDQUFrQyxDQUFDLGtCQUFrQixDQUFDLENBQUM7U0FDL0Q7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0sscUJBQXFCO1FBQ3pCLElBQUksSUFBSSxDQUFDLGdDQUFnQyxFQUFFO1lBQ3ZDLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1NBQ3BDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNLLHlCQUF5QjtRQUM3QixJQUFJLElBQUksQ0FBQyxrQ0FBa0MsRUFBRTtZQUN6QyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztTQUNsQztRQUVELElBQUksSUFBSSxDQUFDLGdCQUFnQixLQUFLLFNBQVMsRUFBRTtZQUNyQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsVUFBVSxDQUM5QixHQUFHLEVBQUU7Z0JBQ0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQy9CLENBQUMsRUFDRCxJQUFJLENBQUMsc0JBQXNCLENBQzlCLENBQUM7U0FDTDtJQUNMLENBQUM7SUFFTyx1QkFBdUI7UUFDM0IsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssU0FBUyxFQUFFO1lBQ3JDLFlBQVksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDO1NBQ3JDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNLLFlBQVk7O1FBQ2hCLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDbEMsTUFBTSxnQkFBZ0IsR0FBRyxVQUFJLENBQUMsaUJBQWlCLG1DQUFJLFdBQVcsQ0FBQztRQUUvRCxJQUFJLGdCQUFnQixLQUFLLFdBQVcsRUFBRTtZQUNsQyxJQUFJLENBQUMsZ0NBQWdDLEdBQUcsSUFBSSxDQUFDO1lBRTdDLE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUM7WUFDakQsZUFBZSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1lBQ3RDLGVBQWUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztZQUNuQyxlQUFlLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7WUFDcEMsZUFBZSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1lBQzFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztZQUNsQyxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7WUFDL0IsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO1lBQ2hDLFdBQVcsQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztTQUN6QztRQUVELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxjQUFjO1FBQ2xCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssdUJBQXVCO1FBQzNCLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUU7WUFDaEMsTUFBTSxJQUFJLDRFQUF3QixDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ3BEO2FBQU07WUFDSCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztZQUN4QixrRUFBa0U7WUFDbEUsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7Z0JBQzFCLENBQUMsSUFBSSxDQUFDLDBCQUEwQjtnQkFDaEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQ3hDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFDMUM7Z0JBQ0ksSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRTtvQkFDeEQsTUFBTSxJQUFJLDRFQUF3QixDQUFDLFlBQVksQ0FBQyxDQUFDO2lCQUNwRDtxQkFBTTtvQkFDSCwyQ0FBMkM7b0JBQzNDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7b0JBQ3pFLElBQUksV0FBVyxJQUFJLENBQUMsRUFBRTt3QkFDbEIsT0FBTztxQkFDVjt5QkFBTTt3QkFDSCxxQ0FBcUM7d0JBQ3JDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDO3dCQUN0RSxNQUFNLGFBQWEsR0FBRyxXQUFXLEdBQUcsWUFBWSxDQUFDO3dCQUNqRCxJQUFJLGFBQWEsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFOzRCQUM5QixPQUFPO3lCQUNWOzZCQUFNOzRCQUNILGlEQUFpRDs0QkFDakQsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQzs0QkFFdkMsdUZBQXVGOzRCQUN2RixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOzRCQUM3RSxNQUFNLGdCQUFnQixHQUFHLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQzs0QkFFeEQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQ3pELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQzs0QkFDdEMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQ0FDeEIsTUFBTSxJQUFJLCtEQUFXLENBQUMsYUFBYSxDQUFDOzZCQUN2QztpQ0FBTTtnQ0FDSCxNQUFNLG1CQUFtQixHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQ0FDekMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGdCQUFnQixFQUFFLENBQUMsRUFBRSxFQUFFO29DQUN2QyxvQkFBb0I7b0NBQ3BCLE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0NBQ3JGLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxtQkFBbUIsRUFBRSxNQUFNLENBQUMsQ0FBQztpQ0FDckU7Z0NBRUQsSUFBSSxDQUFDLDBCQUEwQixHQUFHLEtBQUssQ0FBQzs2QkFDM0M7eUJBQ0o7cUJBQ0o7aUJBQ0o7YUFDSjtTQUNKO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssbUJBQW1CO1FBQ3ZCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO1FBQzVDLE1BQU0sb0JBQW9CLEdBQUcsUUFBUSxDQUFDLGNBQWMsS0FBSyx3REFBYyxDQUFDLE1BQU0sQ0FBQztRQUMvRSxNQUFNLDRCQUE0QixHQUFHLFFBQVEsQ0FBQyxjQUFjLEtBQUssd0RBQWMsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUMxRyxPQUFPLG9CQUFvQixJQUFJLDRCQUE0QixDQUFDO0lBQ2hFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLCtCQUErQixDQUFDLFNBQXNCLEVBQUUsSUFBaUI7UUFDN0UsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUN2QyxJQUFJLElBQUksWUFBWSxnREFBSyxFQUFFO1lBQ3ZCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUMxQyxNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUM3QixTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzVCO1NBQ0o7YUFBTTtZQUNILEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUMxQyxNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdCLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDekQ7U0FDSjtJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssWUFBWTtRQUNoQixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQ2hDLE1BQU0sSUFBSSw0RUFBd0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUNyRDthQUFNO1lBQ0gsTUFBTSxNQUFNLEdBQVksRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRXRELE9BQU8sTUFBTSxDQUFDO1NBQ2pCO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNSLHdCQUF3QixDQUFDLElBQWM7UUFDM0MsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtZQUNoQyxNQUFNLElBQUksNEVBQXdCLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDdEQ7YUFBTTtZQUNILE9BQU8sSUFBSSxDQUFDLGlDQUFpQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDekU7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IsaUNBQWlDLENBQUMsSUFBYyxFQUFFLElBQWlCO1FBQ3ZFLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDdkMsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDO1FBQzdDLElBQUksZ0JBQWdCLEtBQUssQ0FBQyxFQUFFO1lBQ3hCLE9BQU8sU0FBUyxDQUFDO1NBQ3BCO2FBQU07WUFDSCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3ZDLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEMsSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRTtvQkFDM0IsT0FBTyxXQUFXLENBQUM7aUJBQ3RCO2FBQ0o7WUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3ZDLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsaUNBQWlDLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUNuRixJQUFJLGdCQUFnQixLQUFLLFNBQVMsRUFBRTtvQkFDaEMsT0FBTyxnQkFBZ0IsQ0FBQztpQkFDM0I7YUFDSjtZQUVELE9BQU8sU0FBUyxDQUFDO1NBQ3BCO0lBQ0wsQ0FBQztJQUVELGdCQUFnQjtJQUNSLHFDQUFxQyxDQUFDLElBQWMsRUFBRSxFQUFVLEVBQUUsSUFBaUI7UUFDdkYsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUN2QyxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUM7UUFDN0MsSUFBSSxnQkFBZ0IsS0FBSyxDQUFDLEVBQUU7WUFDeEIsT0FBTyxTQUFTLENBQUM7U0FDcEI7YUFBTTtZQUNILEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDdkMsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLFdBQVcsQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLFdBQVcsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFO29CQUNwRCxPQUFPLFdBQVcsQ0FBQztpQkFDdEI7YUFDSjtZQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDdkMsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwQyxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUMzRixJQUFJLGdCQUFnQixLQUFLLFNBQVMsRUFBRTtvQkFDaEMsT0FBTyxnQkFBZ0IsQ0FBQztpQkFDM0I7YUFDSjtZQUVELE9BQU8sU0FBUyxDQUFDO1NBQ3BCO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLHNCQUFzQixDQUFDLE1BQWUsRUFBRSxJQUFpQjtRQUM3RCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3ZDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFDLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QixJQUFJLElBQUksWUFBWSxnREFBSyxFQUFFO2dCQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3JCO2lCQUFNO2dCQUNILElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO29CQUNuQixJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUM3QzthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IsaUJBQWlCLENBQUMsU0FBb0Q7UUFDMUUsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztRQUMvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzVCLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzdDLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtnQkFDeEIsT0FBTyxRQUFRLENBQUM7YUFDbkI7U0FDSjtRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxnQkFBZ0I7SUFDUixZQUFZLENBQUMsUUFBd0M7UUFDekQsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUNyQyxRQUFRLFFBQVEsQ0FBQyxNQUFNLEVBQUU7WUFDckIsd0JBQXNELENBQUMsQ0FBQztnQkFDcEQsSUFBSSxJQUFJLENBQUMscUJBQXFCLEtBQUssU0FBUyxFQUFFO29CQUMxQyxPQUFPLFNBQVM7aUJBQ25CO3FCQUFNO29CQUNILE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUM7b0JBQ3pELE1BQU0sa0JBQWtCLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQztvQkFDbkQsTUFBTSxzQkFBc0IsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7b0JBQ3pELElBQUksYUFBYSxLQUFLLFNBQVMsRUFBRTt3QkFDN0IsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQztxQkFDeEQ7eUJBQU07d0JBQ0gsTUFBTSxZQUFZLEdBQUcsa0JBQWtCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO3dCQUM1RSxNQUFNLEtBQUssR0FBRyxZQUFZLEdBQUcsYUFBYSxDQUFDO3dCQUMzQyxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLHNCQUFzQixFQUFFOzRCQUM3QyxPQUFPLFNBQVMsQ0FBQzt5QkFDcEI7NkJBQU07NEJBQ0gsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQzt5QkFDaEM7cUJBQ0o7aUJBQ0o7YUFDSjtZQUNELHlCQUF1RCxDQUFDLENBQUM7Z0JBQ3JELElBQUksSUFBSSxDQUFDLHFCQUFxQixLQUFLLFNBQVMsRUFBRTtvQkFDMUMsT0FBTyxTQUFTO2lCQUNuQjtxQkFBTTtvQkFDSCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDO29CQUN6RCxPQUFPLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7aUJBQzFFO2FBQ0o7WUFDRCx1QkFBcUQsQ0FBQyxDQUFDO2dCQUNuRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsa0RBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDakUsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFO29CQUMxQixPQUFPLFNBQVMsQ0FBQztpQkFDcEI7cUJBQU07b0JBQ0gsT0FBTyxJQUFJLENBQUMsK0JBQStCLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDO2lCQUMxRTthQUNKO1lBQ0QsNkJBQTJELENBQUMsQ0FBQztnQkFDekQsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGtEQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzdELElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTtvQkFDMUIsT0FBTyxJQUFJLENBQUMsK0JBQStCLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDO2lCQUMxRTtxQkFBTTtvQkFDSCxVQUFVLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGtEQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQzVELElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRTt3QkFDMUIsT0FBTyxJQUFJLENBQUMsK0JBQStCLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDO3FCQUMxRTt5QkFBTTt3QkFDSCxPQUFPLFNBQVMsQ0FBQztxQkFDcEI7aUJBQ0o7YUFDSjtZQUNELHFCQUFtRCxDQUFDLENBQUM7Z0JBQ2pELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxrREFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMvRCxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUU7b0JBQzFCLE9BQU8sU0FBUyxDQUFDO2lCQUNwQjtxQkFBTTtvQkFDSCxPQUFPLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7aUJBQzFFO2FBQ0o7WUFDRCx3QkFBc0QsQ0FBQyxDQUFDO2dCQUNwRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsa0RBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDbEUsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFO29CQUMxQixPQUFPLFNBQVMsQ0FBQztpQkFDcEI7cUJBQU07b0JBQ0gsT0FBTyxJQUFJLENBQUMsK0JBQStCLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDO2lCQUMxRTthQUNKO1lBQ0Qsa0JBQWdELENBQUMsQ0FBQztnQkFDOUMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRTtvQkFDaEMsTUFBTSxJQUFJLDRFQUF3QixDQUFDLGNBQWMsQ0FBQyxDQUFDO2lCQUN0RDtxQkFBTTtvQkFDSCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO3dCQUM3QixPQUFPLFNBQVMsQ0FBQztxQkFDcEI7eUJBQU07d0JBQ0gsSUFBSSxhQUFhLEtBQUssU0FBUyxJQUFJLGFBQWEsS0FBSyxDQUFDOzRCQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOzZCQUNqRDs0QkFDRCxPQUFPLFNBQVMsQ0FBQzt5QkFDcEI7cUJBQ0o7aUJBQ0o7YUFDSjtZQUNELGlCQUErQyxDQUFDLENBQUM7Z0JBQzdDLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUU7b0JBQ2hDLE1BQU0sSUFBSSw0RUFBd0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztpQkFDcEQ7cUJBQU07b0JBQ0gsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQztvQkFDekQsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO3dCQUNqQyxJQUFJLGFBQWEsS0FBSyxTQUFTLElBQUksYUFBYSxLQUFLLENBQUM7NEJBQ2xELE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7NkJBQ2pEOzRCQUNELE9BQU8sU0FBUyxDQUFDO3lCQUNwQjtxQkFDSjt5QkFBTTt3QkFDSCxNQUFNLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDekMsT0FBTyxJQUFJLENBQUMsK0JBQStCLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDO3FCQUMxRTtpQkFDSjthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IsK0JBQStCLENBQUMsVUFBdUIsRUFDM0QsYUFBaUM7UUFFakMsTUFBTSxrQkFBa0IsR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDO1FBQ25ELE1BQU0sc0JBQXNCLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDO1FBQ3pELElBQUksYUFBYSxLQUFLLFNBQVMsRUFBRTtZQUM3QixPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxzQkFBc0IsRUFBRSxDQUFDO1NBQ3hEO2FBQU07WUFDSCxJQUFJLGFBQWEsR0FBRyxDQUFDLElBQUksYUFBYSxHQUFHLHNCQUFzQixFQUFFO2dCQUM3RCxPQUFPLFNBQVMsQ0FBQzthQUNwQjtpQkFBTTtnQkFDSCxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsQ0FBQzthQUMvQztTQUNKO0lBQ0wsQ0FBQztDQUNKO0FBRUQsY0FBYztBQUNkLFdBQWlCLGFBQWE7SUFXMUIsZ0JBQWdCO0lBQ2hCLFNBQWdCLDBCQUEwQixDQUFDLFFBQWtCO1FBQ3pELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLHlDQUFzQyxDQUFDO1FBQzVELE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7SUFKZSx3Q0FBMEIsNkJBSXpDO0lBRUQsZ0JBQWdCO0lBQ2hCLFNBQWdCLCtCQUErQixDQUFDLFFBQWtCO1FBQzlELE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLG9EQUEyQyxDQUFDO1FBQ2pFLE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7SUFKZSw2Q0FBK0Isa0NBSTlDO0lBNkNEOzs7T0FHRztJQUNVLHNDQUF3QixHQUFnQztRQUNqRSxFQUFFLE1BQU0sc0JBQXNDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtRQUNsRSxFQUFFLE1BQU0sb0JBQW9DLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtRQUNoRSxFQUFFLE1BQU0sMEJBQTBDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtRQUN0RSxFQUFFLE1BQU0sY0FBOEIsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO0tBQzdELENBQUM7SUFFRjs7O09BR0c7SUFDVSx5REFBMkMsR0FBZ0M7UUFDcEYsRUFBRSxNQUFNLHFCQUFxQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7UUFDekQsRUFBRSxNQUFNLG9CQUFvQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7UUFDaEUsRUFBRSxNQUFNLDBCQUEwQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7UUFDdEUsRUFBRSxNQUFNLGNBQThCLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtLQUM3RCxDQUFDO0FBQ04sQ0FBQyxFQXpGZ0IsYUFBYSxLQUFiLGFBQWEsUUF5RjdCOzs7Ozs7Ozs7Ozs7Ozs7QUM3MkREOzs7OztFQUtFO0FBRUssSUFBVSxjQUFjLENBbU85QjtBQW5PRCxXQUFpQixjQUFjO0lBTTNCLE1BQU0sSUFBSSxHQUFzQjtRQUM1QixVQUFVO1FBQ1YsWUFBWTtRQUNaLG9CQUFvQjtRQUNwQixpQkFBaUI7UUFDakIsa0JBQWtCO1FBQ2xCLFlBQVk7UUFDWixhQUFhO1FBQ2IsZUFBZTtRQUNmLGNBQWM7UUFDZCxjQUFjO1FBQ2QsZ0JBQWdCO1FBQ2hCLGlCQUFpQjtRQUNqQixRQUFRO1FBQ1IsT0FBTztRQUNQLFVBQVU7UUFDVixVQUFVO1FBQ1YsUUFBUTtRQUNSLFNBQVM7UUFDVCxlQUFlO1FBQ2YsZ0JBQWdCO1FBQ2hCLElBQUk7UUFDSixPQUFPO1FBQ1AsTUFBTTtRQUNOLFFBQVE7UUFDUixZQUFZO1FBQ1osT0FBTztRQUNQLGtCQUFrQjtRQUNsQixhQUFhO1FBQ2IsVUFBVTtRQUNWLGlCQUFpQjtRQUNqQixnQkFBZ0I7UUFDaEIsaUJBQWlCO1FBSWpCLDZDQUE2QztLQUNoRCxDQUFDO0lBRUYsTUFBTSxNQUFNLEdBQWtDO1FBQzFDLElBQUk7UUFDSixLQUFLO1FBQ0wsS0FBSztRQUNMLFFBQVE7UUFDUixPQUFPO1FBQ1AsV0FBVztRQUNYLE9BQU87UUFDUCxVQUFVO1FBQ1YsVUFBVTtRQUNWLG9CQUFvQjtLQUN2QixDQUFDO0lBRUYsU0FBZ0IsZUFBZTtRQUMzQixJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxFQUFFO1lBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztTQUMzRDtJQUNMLENBQUM7SUFKZSw4QkFBZSxrQkFJOUI7SUFFRCxTQUFnQixlQUFlLENBQUMsSUFBNkIsRUFBRSxNQUFlO1FBQzFFLE1BQU0sRUFBRSxHQUE0QixFQUFFLENBQUM7UUFDdkMsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUU7WUFDcEIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsbURBQW1EO2dCQUMvRSxJQUFJLGFBQXFCLENBQUM7Z0JBQzFCLElBQUksTUFBTSxFQUFFO29CQUNSLGFBQWEsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ2xDO3FCQUFNO29CQUNILGFBQWEsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7aUJBQ3BDO2dCQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDNUIsRUFBRSxDQUFDLGFBQWEsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7YUFDekQ7U0FDSjtRQUVELE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQWpCZSw4QkFBZSxrQkFpQjlCO0lBRUQsU0FBUyxjQUFjLENBQUMsSUFBZSxFQUFFLE1BQWU7UUFDcEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQixNQUFNLEVBQUUsR0FBRyxJQUFJLEtBQUssQ0FBVSxNQUFNLENBQUMsQ0FBQztRQUN0QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzdCLGtFQUFrRTtZQUNsRSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDN0M7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFRCxTQUFTLGNBQWMsQ0FBQyxJQUFhLEVBQUUsTUFBZTtRQUNsRCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUMxQixJQUFJLElBQUksS0FBSyxJQUFJLEVBQUU7Z0JBQ2YsT0FBTyxJQUFJLENBQUM7YUFDZjtpQkFBTTtnQkFDSCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ3JCLE9BQU8sY0FBYyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztpQkFDdkM7cUJBQU07b0JBQ0gsT0FBTyxlQUFlLENBQUMsSUFBK0IsRUFBRSxNQUFNLENBQUMsQ0FBQztpQkFDbkU7YUFDSjtTQUNKO2FBQU07WUFDSCxJQUFJLE1BQU0sRUFBRTtnQkFDUixPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUM1QjtpQkFBTTtnQkFDSCxPQUFPLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUM5QjtTQUNKO0lBQ0wsQ0FBQztJQUVELFNBQVMsU0FBUyxDQUFDLEtBQWE7UUFDNUI7OztXQUdHO1FBQ0gsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDakQsT0FBTyxLQUFLLEdBQUcsS0FBSyxDQUFDO1NBQ3hCO1FBRUQsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWhDOztXQUVHO1FBQ0gsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDZCxPQUFPLEtBQUssQ0FBQztZQUViOztlQUVHO1NBQ047YUFBTTtZQUNILE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUM3QjtJQUNMLENBQUM7SUFFRCxTQUFTLFdBQVcsQ0FBQyxHQUFXO1FBQzVCOzs7V0FHRztRQUNILElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDbEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ2xDO1FBRUQ7Ozs7V0FJRztRQUNILElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssS0FBSyxFQUFFO1lBQzVCLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2pCO1FBQ0Q7O1dBRUc7UUFDSCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFRCxTQUFTLFdBQVcsQ0FBQyxLQUFjO1FBQy9COzs7V0FHRztRQUNILElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2pELE9BQU8sS0FBSyxHQUFHLEtBQUssQ0FBQztTQUN4QjtRQUVELE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVsQzs7V0FFRztRQUNILElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ2QsT0FBTyxLQUFLLENBQUM7WUFFYjs7ZUFFRztTQUNOO2FBQU07WUFDSCxPQUFPLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDN0I7SUFDTCxDQUFDO0lBRUQsU0FBUyxhQUFhLENBQUMsS0FBYztRQUNqQzs7O1dBR0c7UUFDSCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNqRCxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDdEM7UUFFRDs7OztXQUlHO1FBQ0gsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssS0FBSyxFQUFFO1lBQzNELE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ25CO1FBQ0Q7O1dBRUc7UUFDSCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQsU0FBUyxVQUFVLENBQUMsR0FBVztRQUMzQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNsQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7Z0JBQ2pCLE9BQU8sQ0FBQyxDQUFDO2FBQ1o7U0FDSjtRQUNELE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDZCxDQUFDO0lBRUQsU0FBUyxZQUFZLENBQUMsS0FBYztRQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNwQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUU7Z0JBQ3JCLE9BQU8sQ0FBQyxDQUFDO2FBQ1o7U0FDSjtRQUNELE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDZCxDQUFDO0FBQ0wsQ0FBQyxFQW5PZ0IsY0FBYyxLQUFkLGNBQWMsUUFtTzlCOzs7Ozs7Ozs7Ozs7Ozs7O0FDek84QztBQUUvQyxnQkFBZ0I7QUFDVCxNQUFNLFlBQWEsU0FBUSx3REFBWTtJQWUxQyxZQUFvQixTQUFzQixFQUFFLDBCQUF5QztRQUNqRixLQUFLLEVBQUUsQ0FBQztRQURRLGNBQVMsR0FBVCxTQUFTLENBQWE7UUFObEMscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBRXpCLDhCQUF5QixHQUFHLENBQUMsRUFBZ0IsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6RSw4QkFBeUIsR0FBRyxDQUFDLEVBQWdCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDekUsNEJBQXVCLEdBQUcsQ0FBQyxFQUFnQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBS3pFLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO1FBRTFCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLFNBQVMsRUFBRSxHQUFHLDBCQUEwQixDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBRTVCOzs7O1dBSUc7UUFDSCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUVwQjs7Ozs7V0FLRztRQUNILElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBRXJCLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFDLENBQUM7UUFFcEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFFdkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLHlCQUF5QixFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdEcsQ0FBQztJQUVELE9BQU87UUFDSCxJQUFJLENBQUMsd0NBQXdDLEVBQUUsQ0FBQztRQUVoRCxJQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRUQsVUFBVTtRQUNOLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVPLGFBQWEsQ0FBQyxNQUFvQjtRQUN0QyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQXFCLENBQUMsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFO1lBQ25GLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNuQztJQUNMLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxLQUFtQjtRQUMxQyxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUU1QixJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUNoRixJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMvRixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLDZDQUF3QyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFFN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQ3RCLEdBQUcsRUFBRTtZQUNELElBQUk7Z0JBQ0EsSUFBSSxDQUFDLFNBQVMsRUFBRTthQUNuQjtZQUNELE9BQU8sR0FBRyxFQUFFO2dCQUNSLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ25CLE1BQU0sR0FBRyxDQUFDO2FBQ2I7UUFDTCxDQUFDLEVBQ0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFTyxhQUFhLENBQUMsTUFBb0I7UUFDdEMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDdkIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3QixNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDM0I7SUFDTCxDQUFDO0lBRU8sZUFBZSxDQUFDLEtBQW1CO1FBQ3ZDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7UUFDeEQsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQztRQUV4RCxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxFQUFFO1lBQzFCLElBQ0ksSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVTtnQkFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUNyQztnQkFDRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7YUFDcEI7U0FDSjtRQUVELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzlDO0lBQ0wsQ0FBQztJQUVPLFdBQVcsQ0FBQyxNQUFvQjtRQUNwQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFTyxlQUFlLENBQUMsU0FBd0I7UUFDNUMsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRTtZQUM3QixZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO1NBQzdCO1FBRUQsSUFBSSxDQUFDLHdDQUF3QyxFQUFFLENBQUM7UUFFaEQsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksRUFBRTtZQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLDhCQUFpQyxDQUFDO1lBQzlELElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sOEJBQWlDLENBQUM7WUFDakUsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7U0FDcEM7SUFDTCxDQUFDO0lBRU8sd0NBQXdDO1FBQzVDLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1lBQ25GLElBQUksQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1lBQy9FLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sNkNBQXdDLENBQUM7WUFDckUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztTQUNqQztJQUNMLENBQUM7SUFFTyxTQUFTO1FBQ2IsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRTtZQUM3QixZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzVCLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO1NBQzdCO1FBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyw4QkFBaUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLDhCQUFpQyxDQUFDO1FBQzlELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0UsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDakQsQ0FBQztDQUNKOzs7Ozs7Ozs7Ozs7Ozs7QUNwSkQ7Ozs7R0FJRztBQUNJLE1BQU0sWUFBWTtJQUF6QjtRQUNJLGdCQUFnQjtRQUNSLDJCQUFzQixHQUFtQyxFQUFFLENBQUM7UUFDcEUsZ0JBQWdCO1FBQ1Isc0JBQWlCLEdBQUcsSUFBSSxHQUFHLEVBQTBDLENBQUM7UUFxRTlFOztXQUVHO1FBQ0gsV0FBTSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztRQUVsQzs7V0FFRztRQUNILFlBQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBc0V4QixDQUFDO0lBakpHLDZEQUE2RDtJQUM3RCxjQUFjLENBQUMsSUFBWSxFQUFFLElBQWU7UUFDeEMsNEJBQTRCO0lBQ2hDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQUksQ0FBOEMsU0FBWSxFQUFFLEdBQUcsSUFBb0M7UUFDbkcsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV6RCxJQUFJLFlBQVksS0FBSyxTQUFTLEVBQUU7WUFDNUIsWUFBWSxHQUFHLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNwQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDMUMsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyQyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQzthQUN6QjtTQUNKO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixXQUFXLENBQUMsU0FBaUIsRUFBRSxHQUFHLElBQWdDO1FBQzlELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFakQsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQ3BCLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDcEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO2FBQ3BCO1NBQ0o7UUFFRCxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLHFCQUFxQixDQUE4QyxTQUFZO1FBQzNFLE1BQU0sS0FBSyxHQUFHLElBQUksWUFBWSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELGdCQUFnQjtJQUNoQix3QkFBd0IsQ0FBQyxTQUFpQjtRQUN0QyxNQUFNLEtBQUssR0FBRyxJQUFJLFlBQVksQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsbUJBQW1CLENBQThDLFNBQVksRUFBRSxRQUFrQztRQUM3RyxNQUFNLGVBQWUsR0FBRyxRQUF3QyxDQUFDO1FBQ2pFLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxTQUFTLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVELEdBQUcsQ0FBOEMsU0FBWSxFQUFFLFFBQWtDO1FBQzdGLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQVlEOzs7OztPQUtHO0lBQ0gsZ0JBQWdCLENBQThDLFNBQVksRUFBRSxRQUFrQztRQUMxRyxNQUFNLGVBQWUsR0FBRyxRQUF3QyxDQUFDO1FBQ2pFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELEVBQUUsQ0FBOEMsU0FBWSxFQUFFLFFBQWtDO1FBQzVGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELGdCQUFnQjtJQUNSLHVCQUF1QixDQUFDLFNBQWlCLEVBQUUsUUFBc0M7UUFDckYsSUFBSSxTQUFTLEtBQUssWUFBWSxDQUFDLFNBQVMsRUFBRTtZQUN0QyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzlDO2FBQU07WUFDSCxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzFELElBQUksYUFBYSxLQUFLLFNBQVMsRUFBRTtnQkFDN0IsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNoQztpQkFBTTtnQkFDSCxhQUFhLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUM7YUFDeEQ7U0FDSjtJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDUiwwQkFBMEIsQ0FBQyxTQUFpQixFQUFFLFFBQXNDO1FBQ3hGLElBQUksU0FBUyxLQUFLLFlBQVksQ0FBQyxTQUFTLEVBQUU7WUFDdEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDN0U7YUFBTTtZQUNILE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDNUQsSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFO2dCQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxHQUFHLFNBQVMsQ0FBQyxDQUFDO2FBQzdFO2lCQUFNO2dCQUNILElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2FBQy9EO1NBQ0o7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1Isa0JBQWtCLENBQUMsU0FBaUIsRUFBRSxhQUE2QyxFQUFFLFFBQXNDO1FBQy9ILE1BQU0sR0FBRyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFO1lBQ1QsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsR0FBRyxTQUFTLENBQUMsQ0FBQztTQUN6RDthQUFNO1lBQ0gsYUFBYSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDaEM7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1IsWUFBWSxDQUFDLFNBQWlCLEVBQUUsSUFBZTtRQUNuRCxNQUFNLDBCQUEwQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUM7UUFDdEUsSUFBSSwwQkFBMEIsR0FBRyxDQUFDLEVBQUU7WUFDaEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBZ0MsQ0FBQztZQUMvRCxXQUFXLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRS9CLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssRUFBRSxDQUFDO1lBRWpFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRywwQkFBMEIsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDakQsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQzthQUMzQztTQUNKO0lBQ0wsQ0FBQztDQUNKO0FBRUQsY0FBYztBQUNkLFdBQWlCLFlBQVk7SUFDekI7O09BRUc7SUFDVSxzQkFBUyxHQUFHLE9BQU8sQ0FBQztJQUVwQixpQ0FBb0IsR0FBRyxrQkFBa0IsQ0FBQztJQUMxQyxzQ0FBeUIsR0FBRyx1QkFBdUIsQ0FBQztJQWlFakUsTUFBYSxhQUFhO1FBVXRCLGdCQUFnQjtRQUNoQjtRQUNJLGdCQUFnQjtRQUNDLEtBQWE7UUFDOUIsZ0JBQWdCO1FBQ0MsT0FBcUI7WUFGckIsVUFBSyxHQUFMLEtBQUssQ0FBUTtZQUViLFlBQU8sR0FBUCxPQUFPLENBQWM7WUFkMUMsZ0JBQWdCO1lBQ1IsMEJBQXFCLEdBQUcsS0FBSyxDQUFDO1FBY3RDLENBQUM7UUFaRCxJQUFJLElBQUksS0FBYSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLElBQUksTUFBTSxLQUFtQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ25ELDRGQUE0RjtRQUM1RixJQUFJLE1BQU0sS0FBbUIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNuRCxJQUFJLG9CQUFvQixLQUFjLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQztRQVUxRSxlQUFlO1lBQ1gsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztRQUN0QyxDQUFDO0tBQ0o7SUFyQlksMEJBQWEsZ0JBcUJ6QjtJQUVELE1BQWEsa0JBQW1CLFNBQVEsYUFBYTtRQUdqRCxnQkFBZ0I7UUFDaEIsWUFBWSxJQUFZLEVBQUUsTUFBb0I7UUFDMUMsZ0JBQWdCO1FBQ0MsV0FBdUI7WUFFeEMsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUZILGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBRzVDLENBQUM7UUFSRCxJQUFJLFVBQVUsS0FBaUIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztLQVM1RDtJQVZZLCtCQUFrQixxQkFVOUI7SUFFRCxNQUFhLHVCQUF3QixTQUFRLGFBQWE7UUFHdEQsZ0JBQWdCO1FBQ2hCLFlBQVksSUFBWSxFQUFFLE1BQW9CO1FBQzFDLGdCQUFnQjtRQUNDLFdBQXVCO1lBRXhDLEtBQUssQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFGSCxnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUc1QyxDQUFDO1FBUkQsSUFBSSxVQUFVLEtBQWlCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7S0FTNUQ7SUFWWSxvQ0FBdUIsMEJBVW5DO0FBQ0wsQ0FBQyxFQXRIZ0IsWUFBWSxLQUFaLFlBQVksUUFzSDVCOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3pSOEQ7QUFFaEI7QUFVL0M7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSSxNQUFNLFFBQVMsU0FBUSx3REFBWTtJQUt0Qzs7OztPQUlHO0lBQ0g7SUFDSSxnQkFBZ0I7SUFDUixjQUE2QjtRQUVyQyxLQUFLLEVBQUUsQ0FBQztRQUZBLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBVnpDLGdCQUFnQjtRQUNSLHdCQUFtQixHQUFHLENBQUMsVUFBa0QsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBWXBILFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3RHLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDTSxJQUFJLENBQThDLFNBQVksRUFBRSxHQUFHLElBQW9DO1FBQzVHLElBQUksU0FBUyxLQUFLLGVBQWUsRUFBRTtZQUMvQixtRUFBbUU7WUFDbkUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7U0FDbkM7YUFBTTtZQUNILEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7U0FDbEM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsaUJBQWlCLENBQUMsR0FBRyxJQUFnQztRQUNqRCw4QkFBOEI7UUFDOUIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsT0FBTztRQUNILFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFFRDs7O09BR0c7SUFDSyx3QkFBd0IsQ0FBQyxTQUFpQixFQUFFLElBQWU7UUFDL0QsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRTtZQUNqQyxzRUFBc0U7WUFDdEUsK0JBQStCO1lBQy9CLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDM0M7YUFBTTtZQUNILGdFQUFnRTtZQUNoRSxJQUFJLENBQUMseUJBQXlCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ25EO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGdCQUFnQixDQUFDLEtBQTZDO1FBQ2xFLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDNUIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssaUJBQWlCLENBQUMsU0FBaUIsRUFBRSxJQUFlO1FBQ3hELE1BQU0sTUFBTSxHQUE4QjtZQUN0QyxhQUFhLEVBQUUsSUFBSSxDQUFDLGNBQWM7WUFDbEMsU0FBUztZQUNULElBQUksRUFBRSxJQUFJO1NBQ2I7UUFFRCxNQUFNLFNBQVMsR0FBNEI7WUFDdkMsT0FBTyxFQUFFLElBQUk7WUFDYixVQUFVLEVBQUUsSUFBSTtZQUNoQixNQUFNO1NBQ1QsQ0FBQztRQUVGLE1BQU0sS0FBSyxHQUFHLElBQUksV0FBVyxDQUE0QixRQUFRLENBQUMsY0FBYyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzdGLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFDakMsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFO1lBQ2pCLE1BQU0sSUFBSSx1RUFBbUIsQ0FBQyxZQUFZLENBQUM7U0FDOUM7UUFFRCxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7O09BR0c7SUFDSyx5QkFBeUIsQ0FBQyxTQUFpQixFQUFFLElBQWU7UUFDaEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNyQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzdELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBRW5FLElBQUksT0FBTyxFQUFFO2dCQUNULE9BQU8sQ0FBQyxRQUFRLENBQUMseUJBQXlCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQy9EO1NBQ0o7SUFDTCxDQUFDO0NBQ0o7QUFFRCxjQUFjO0FBQ2QsV0FBaUIsUUFBUTtJQUVyQixnQkFBZ0I7SUFDSCx1QkFBYyxHQUFHLGdCQUFnQixDQUFDO0FBV25ELENBQUMsRUFkZ0IsUUFBUSxLQUFSLFFBQVEsUUFjeEI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbEtzRDtBQWdCdkQsY0FBYztBQUNQLElBQVUsV0FBVyxDQTJFM0I7QUEzRUQsV0FBaUIsV0FBVztJQUN4QixnQkFBZ0I7SUFDaEIsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBV3hCLGdCQUFnQjtJQUNoQixNQUFNLFdBQVcsR0FBZ0I7UUFDN0IseUNBQXlDLEVBQUU7WUFDdkMsRUFBRSxtREFBd0Q7WUFDMUQsT0FBTyxFQUFFLGlEQUFpRDtTQUM3RDtRQUNELGtDQUFrQyxFQUFFO1lBQ2hDLEVBQUUsNENBQWlEO1lBQ25ELE9BQU8sRUFBRSx3Q0FBd0M7U0FDcEQ7UUFDRCxpRUFBaUUsRUFBRTtZQUMvRCxFQUFFLDJFQUFnRjtZQUNsRixPQUFPLEVBQUUsMkVBQTJFO1NBQ3ZGO1FBQ0QsNEJBQTRCLEVBQUU7WUFDMUIsRUFBRSxzQ0FBMkM7WUFDN0MsT0FBTyxFQUFFLGlDQUFpQztTQUM3QztRQUNELHVCQUF1QixFQUFFO1lBQ3JCLEVBQUUsaUNBQXNDO1lBQ3hDLE9BQU8sRUFBRSxtRUFBbUU7U0FDL0U7UUFDRCwwQ0FBMEMsRUFBRTtZQUN4QyxFQUFFLG9EQUF5RDtZQUMzRCxPQUFPLEVBQUUsMERBQTBEO1NBQ3RFO1FBQ0QsNEJBQTRCLEVBQUU7WUFDMUIsRUFBRSxzQ0FBMkM7WUFDN0MsT0FBTyxFQUFFLHFDQUFxQztTQUNqRDtRQUVELDZCQUE2QixFQUFFO1lBQzNCLEVBQUUsdUNBQTRDO1lBQzlDLE9BQU8sRUFBRSxvQ0FBb0M7U0FDaEQ7UUFDRCx1QkFBdUIsRUFBRTtZQUNyQixFQUFFLGlDQUFzQztZQUN4QyxPQUFPLEVBQUUsNkJBQTZCO1NBQ3pDO1FBQ0QsMkJBQTJCLEVBQUU7WUFDekIsRUFBRSxxQ0FBMEM7WUFDNUMsT0FBTyxFQUFFLGlDQUFpQztTQUM3QztLQUNKO0lBRVksbUJBQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN2RCxnQkFBZ0I7SUFDaEIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUV6QyxTQUFnQixlQUFlO1FBQzNCLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDZCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsbUJBQU8sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDOUIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN0QixJQUFJLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFO29CQUNmLE1BQU0sSUFBSSwrREFBVyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztpQkFDMUQ7cUJBQU07b0JBQ0gsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7aUJBQ2pDO2FBQ0o7U0FDSjtRQUNELFdBQVcsR0FBRyxJQUFJLENBQUM7SUFDdkIsQ0FBQztJQVplLDJCQUFlLGtCQVk5QjtBQUNMLENBQUMsRUEzRWdCLFdBQVcsS0FBWCxXQUFXLFFBMkUzQjtBQUVELGNBQWM7QUFDUCxNQUFNLFdBQVcsR0FBRyxJQUFJLEtBQUssQ0FBUyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQy9GbEUsY0FBYztBQUNQLElBQVUsY0FBYyxDQUk5QjtBQUpELFdBQWlCLGNBQWM7SUFDZCx5Q0FBMEIsR0FBRyxNQUFNLENBQUM7SUFDcEMseUNBQTBCLEdBQUcsSUFBSSxDQUFDO0lBQ2xDLG1EQUFvQyxHQUFHLElBQUksQ0FBQztBQUM3RCxDQUFDLEVBSmdCLGNBQWMsS0FBZCxjQUFjLFFBSTlCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNMK0Q7QUFDYjtBQUtuRCxnQkFBZ0I7QUFDVCxJQUFVLHlCQUF5QixDQUd6QztBQUhELFdBQWlCLHlCQUF5QjtJQUN6QiwrQkFBSyxHQUFHLE9BQU8sQ0FBQztJQUNoQixnQ0FBTSxHQUFHLFFBQVEsQ0FBQztBQUNuQyxDQUFDLEVBSGdCLHlCQUF5QixLQUF6Qix5QkFBeUIsUUFHekM7QUFnQkQsY0FBYztBQUNQLElBQVUsSUFBSSxDQUtwQjtBQUxELFdBQWlCLElBQUk7SUFDSixRQUFHLEdBQUcsS0FBSyxDQUFDO0lBQ1osU0FBSSxHQUFHLE1BQU0sQ0FBQztJQUNkLFVBQUssR0FBRyxPQUFPLENBQUM7SUFDaEIsV0FBTSxHQUFHLFFBQVEsQ0FBQztBQUNuQyxDQUFDLEVBTGdCLElBQUksS0FBSixJQUFJLFFBS3BCO0FBSUQsY0FBYztBQUNQLElBQVUsYUFBYSxDQUk3QjtBQUpELFdBQWlCLGFBQWE7SUFDYixrQkFBSSxHQUFHLE1BQU0sQ0FBQztJQUNkLGtCQUFJLEdBQUcsTUFBTSxDQUFDO0lBQ2QsNEJBQWMsR0FBRyxnQkFBZ0IsQ0FBQztBQUNuRCxDQUFDLEVBSmdCLGFBQWEsS0FBYixhQUFhLFFBSTdCO0FBRUQsY0FBYztBQUNQLE1BQU0seUJBQXlCLEdBQUc7SUFDckMsSUFBSSxFQUFFLDREQUFjLENBQUMsMEJBQTBCO0lBQy9DLElBQUksRUFBRSw0REFBYyxDQUFDLDBCQUEwQjtJQUMvQyxjQUFjLEVBQUUsNERBQWMsQ0FBQyxvQ0FBb0M7Q0FDdEU7QUEyQkQsY0FBYztBQUNQLElBQVUsU0FBUyxDQVN6QjtBQVRELFdBQWlCLFNBQVM7SUFDdEIsU0FBZ0IsTUFBTSxDQUFDLEtBQWdCO1FBQ25DLE9BQU8sWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFGZSxnQkFBTSxTQUVyQjtJQUVELHdEQUF3RDtJQUN4RCxTQUFnQixZQUFZLENBQUMsS0FBZ0I7UUFDekMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUM7SUFDaEYsQ0FBQztJQUZlLHNCQUFZLGVBRTNCO0FBQ0wsQ0FBQyxFQVRnQixTQUFTLEtBQVQsU0FBUyxRQVN6QjtBQUtELGNBQWM7QUFDUCxJQUFVLFFBQVEsQ0FNeEI7QUFORCxXQUFpQixRQUFRO0lBQ1IsZUFBTSxHQUFHLFFBQVEsQ0FBQztJQUNsQixZQUFHLEdBQUcsS0FBSyxDQUFDO0lBQ1osZUFBTSxHQUFHLFFBQVEsQ0FBQztJQUNsQixjQUFLLEdBQUcsT0FBTyxDQUFDO0lBQ2hCLGtCQUFTLEdBQUcsV0FBVyxDQUFDO0FBQ3pDLENBQUMsRUFOZ0IsUUFBUSxLQUFSLFFBQVEsUUFNeEI7QUFJRCxjQUFjO0FBQ1AsSUFBVSxjQUFjLENBSTlCO0FBSkQsV0FBaUIsY0FBYztJQUNkLG1CQUFJLEdBQUcsTUFBTSxDQUFDO0lBQ2QscUJBQU0sR0FBRyxRQUFRLENBQUM7SUFDbEIscUJBQU0sR0FBRyxRQUFRLENBQUM7QUFDbkMsQ0FBQyxFQUpnQixjQUFjLEtBQWQsY0FBYyxRQUk5QjtBQVFELGNBQWM7QUFDZCxJQUFZLFlBS1g7QUFMRCxXQUFZLFlBQVk7SUFDcEIsNEJBQVk7SUFDWiw2QkFBYTtJQUNiLGlDQUFpQjtJQUNqQix5QkFBUztBQUNiLENBQUMsRUFMVyxZQUFZLEtBQVosWUFBWSxRQUt2QjtBQUVELGNBQWM7QUFDZCxXQUFpQixZQUFZO0lBQ3pCLFNBQWdCLFFBQVEsQ0FBQyxLQUFhO1FBQ2xDLFFBQVEsS0FBSyxFQUFFO1lBQ1gsS0FBSyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxZQUFZLENBQUMsS0FBSyxDQUFDO1lBQ25ELEtBQUssWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sWUFBWSxDQUFDLE9BQU8sQ0FBQztZQUN2RCxLQUFLLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLFlBQVksQ0FBQyxVQUFVLENBQUM7WUFDN0QsS0FBSyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQzdDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sU0FBUyxDQUFDO1NBQzdCO0lBQ0wsQ0FBQztJQVJlLHFCQUFRLFdBUXZCO0lBRUQsU0FBZ0IsTUFBTSxDQUFDLEtBQW1CO1FBQ3RDLFFBQVEsS0FBSyxFQUFFO1lBQ1gsS0FBSyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxZQUFZLENBQUMsS0FBSyxDQUFDO1lBQ25ELEtBQUssWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sWUFBWSxDQUFDLE9BQU8sQ0FBQztZQUN2RCxLQUFLLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLFlBQVksQ0FBQyxVQUFVLENBQUM7WUFDN0QsS0FBSyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQzdDO2dCQUNJLE1BQU0sSUFBSSx3RUFBb0IsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDMUQ7SUFDTCxDQUFDO0lBVGUsbUJBQU0sU0FTckI7QUFDTCxDQUFDLEVBckJnQixZQUFZLEtBQVosWUFBWSxRQXFCNUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDOUlELGdCQUFnQjtBQUNULFNBQVMsY0FBYyxDQUFDLEtBQWE7SUFDeEMsT0FBTyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUNyQyxDQUFDO0FBRUQsZ0JBQWdCO0FBQ1QsU0FBUyxjQUFjLENBQUMsS0FBYTtJQUN4QyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMxQyxPQUFPLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNqQyxDQUFDO0FBUUQsZ0JBQWdCO0FBQ1QsU0FBUyxnQ0FBZ0MsQ0FBQyxLQUFhO0lBQzFELEtBQUssR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7SUFFMUIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUM1QixJQUFJLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDZCxPQUFPLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSx1QkFBdUIsRUFBRSxFQUFFLEVBQUU7S0FDMUQ7U0FBTTtRQUNILElBQUksc0JBQXNCLEdBQUcsTUFBTSxDQUFDO1FBQ3BDLElBQUksZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM1QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzdCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNoQixJQUFJLElBQUksS0FBSyxHQUFHLEVBQUU7b0JBQ2Qsc0JBQXNCLEdBQUcsQ0FBQyxDQUFDO29CQUMzQixNQUFNO2lCQUNUO3FCQUFNO29CQUNILElBQUksZUFBZSxFQUFFO3dCQUNqQixzQkFBc0IsR0FBRyxDQUFDLENBQUM7d0JBQzNCLE1BQU07cUJBQ1Q7eUJBQU07d0JBQ0gsZUFBZSxHQUFHLElBQUksQ0FBQztxQkFDMUI7aUJBQ0o7YUFDSjtTQUNKO1FBQ0QsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztRQUM5RCxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUV6RSxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxDQUFDO0tBQ2xGO0FBQ0wsQ0FBQztBQUVELGdCQUFnQjtBQUNULFNBQVMsT0FBTyxDQUFDLElBQVk7SUFDaEMsT0FBTyxJQUFJLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxHQUFHLENBQUM7QUFDdEMsQ0FBQztBQUVELGdCQUFnQjtBQUNULFNBQVMsZUFBZSxDQUFDLE9BQW9CO0lBQ2hELE9BQU8sT0FBTyxDQUFDLFdBQVcsQ0FBQztBQUMvQixDQUFDO0FBRUQsZ0JBQWdCO0FBQ1QsU0FBUyxlQUFlLENBQUMsT0FBb0IsRUFBRSxLQUFhO0lBQy9ELE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3pELE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLGFBQWEsQ0FBQztBQUN4QyxDQUFDO0FBRUQsZ0JBQWdCO0FBQ1QsU0FBUyxnQkFBZ0IsQ0FBQyxPQUFvQjtJQUNqRCxPQUFPLE9BQU8sQ0FBQyxZQUFZLENBQUM7QUFDaEMsQ0FBQztBQUVELGdCQUFnQjtBQUNULFNBQVMsZ0JBQWdCLENBQUMsT0FBb0IsRUFBRSxNQUFjO0lBQ2pFLE1BQU0sY0FBYyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzNELE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLGNBQWMsQ0FBQztBQUMxQyxDQUFDO0FBRUQsZ0JBQWdCO0FBQ1QsU0FBUyx3QkFBd0IsQ0FBQyxPQUFvQjtJQUN6RCxPQUFPO1FBQ0gsS0FBSyxFQUFFLE9BQU8sQ0FBQyxXQUFXO1FBQzFCLE1BQU0sRUFBRSxPQUFPLENBQUMsWUFBWTtLQUMvQixDQUFDO0FBQ04sQ0FBQztBQUVELGdCQUFnQjtBQUNULFNBQVMsOEJBQThCLENBQUMsT0FBb0I7SUFDL0QsT0FBTztRQUNILEtBQUssRUFBRSxPQUFPLENBQUMsV0FBVztRQUMxQixNQUFNLEVBQUUsT0FBTyxDQUFDLFlBQVk7S0FDL0IsQ0FBQztBQUNOLENBQUM7QUFFRCxnQkFBZ0I7QUFDVCxTQUFTLHNCQUFzQixDQUFDLE1BQWtDO0lBQ3JFLElBQUksWUFBWSxHQUE2QixNQUFPLENBQUMsZUFBZSxDQUFDO0lBQ3JFLElBQUksWUFBWSxHQUE2QixNQUFPLENBQUMsZUFBZSxDQUFDO0lBQ3JFLElBQUksT0FBZSxFQUFFLE9BQWUsQ0FBQztJQUVyQyxJQUFJLFlBQVksS0FBSyxTQUFTLElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRTtRQUMxRCxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBUSx5Q0FBeUM7UUFDdkcsT0FBTyxHQUFHLE1BQU0sQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsQ0FBRSxtREFBbUQ7S0FDcEg7U0FBTTtRQUNILE9BQU8sR0FBRyxZQUFZLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUN4QyxPQUFPLEdBQUcsWUFBWSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7S0FDM0M7SUFFRCxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRTtBQUN4RSxDQUFDO0FBRUQsZ0JBQWdCO0FBQ1QsU0FBUyw0QkFBNEIsQ0FBQyxNQUFrQztJQUMzRSxJQUFJLFlBQVksR0FBNkIsTUFBTyxDQUFDLGVBQWUsQ0FBQztJQUNyRSxJQUFJLFlBQVksR0FBNkIsTUFBTyxDQUFDLGVBQWUsQ0FBQztJQUVyRSxJQUFJLFlBQVksS0FBSyxTQUFTLElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRTtRQUMxRCxNQUFNLE1BQU0sR0FBRyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QyxZQUFZLEdBQUcsTUFBTSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQzdDLFlBQVksR0FBRyxNQUFNLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7S0FDakQ7SUFFRCxPQUFPLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLENBQUM7QUFDckQsQ0FBQztBQUdELGdCQUFnQjtBQUNULFNBQVMsMkJBQTJCLENBQUMsT0FBb0IsRUFBRSxPQUFnQjtJQUM5RSxJQUFJLE9BQU8sRUFBRTtRQUNULE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztLQUM5QjtTQUFNO1FBQ0gsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO0tBQ2xDO0FBQ0wsQ0FBQztBQUVELGdCQUFnQjtBQUNULFNBQVMsNkJBQTZCLENBQUMsT0FBb0I7SUFDOUQsTUFBTSxnQkFBZ0IsR0FBRyxVQUFVLENBQUM7SUFDcEMsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsS0FBSyxnQkFBZ0IsRUFBRTtRQUM3QyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQztLQUM3QztBQUNMLENBQUM7QUFFRDs7O0VBR0U7QUFDSyxTQUFTLE1BQU0sQ0FBQyxNQUErQixFQUFFLEdBQTRCO0lBQ2hGLEtBQUssTUFBTSxHQUFHLElBQUksR0FBRyxFQUFFO1FBQ25CLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN6QixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzFCO0tBQ0o7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBRUQ7OztFQUdFO0FBQ0ssU0FBUyxVQUFVLENBQUMsTUFBK0IsRUFBRSxHQUF3QztJQUNoRyxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUU7UUFDbkIsS0FBSyxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQUU7WUFDbkIsSUFBSSxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUN6QixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZCLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDeEQ7U0FDSjtLQUNKO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQUVELGdCQUFnQjtBQUNULFNBQVMsZUFBZSxDQUFDLGNBQXVCLEVBQUUsS0FBYztJQUNuRSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtRQUMzQixPQUFPLEtBQUssQ0FBQztLQUNoQjtTQUFNO1FBQ0gsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3RCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDNUIsTUFBTSxXQUFXLEdBQUcsSUFBSSxLQUFLLENBQVUsTUFBTSxDQUFDLENBQUM7WUFDL0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDN0IsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN6QixXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQzthQUNqRDtZQUNELE9BQU8sV0FBVyxDQUFDO1NBQ3RCO2FBQU07WUFDSCxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUU7Z0JBQ2hCLE9BQU8sSUFBSSxDQUFDO2FBQ2Y7aUJBQU07Z0JBQ0gsTUFBTSxRQUFRLEdBQUcsS0FBZ0MsQ0FBQztnQkFDbEQsSUFBSSxjQUFjLEtBQUssU0FBUyxFQUFFO29CQUM5QixPQUFPLFVBQVUsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZO2lCQUNoRDtxQkFBTTtvQkFDSCxJQUFJLE9BQU8sY0FBYyxLQUFLLFFBQVEsRUFBRTt3QkFDcEMsT0FBTyxVQUFVLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWTtxQkFDaEQ7eUJBQU07d0JBQ0gsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFOzRCQUMvQixPQUFPLFVBQVUsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZO3lCQUNoRDs2QkFBTTs0QkFDSCxJQUFJLGNBQWMsS0FBSyxJQUFJLEVBQUU7Z0NBQ3pCLE9BQU8sVUFBVSxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVk7NkJBQ2hEO2lDQUFNO2dDQUNILE1BQU0saUJBQWlCLEdBQUcsY0FBeUMsQ0FBQztnQ0FDcEUsT0FBTyxVQUFVLENBQUMsaUJBQWlCLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFROzZCQUMzRDt5QkFDSjtxQkFDSjtpQkFDSjthQUNKO1NBQ0o7S0FDSjtBQUNMLENBQUM7QUFFRCxnQkFBZ0I7QUFDVCxTQUFTLGVBQWUsQ0FBSSxJQUFPLEVBQUUsS0FBVTtJQUNsRCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRWxDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFO1FBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyx5REFBeUQsQ0FBQyxDQUFDO0tBQzlFO0lBRUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0IsQ0FBQztBQUVELGdCQUFnQjtBQUNULFNBQVMsV0FBVztJQUN2QixPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLGdCQUFnQixDQUFDO1NBQ3BDLFFBQVEsQ0FBQyxFQUFFLENBQUM7U0FDWixPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFCLENBQUM7QUFFRCxnQkFBZ0I7QUFDVCxTQUFTLGVBQWUsQ0FBQyxDQUFVO0lBQ3RDLElBQUksQ0FBQyxZQUFZLEtBQUssRUFBRTtRQUNwQixPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUM7S0FDcEI7U0FBTTtRQUNILElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFO1lBQ3ZCLE9BQU8sQ0FBQyxDQUFDO1NBQ1o7YUFBTTtZQUNILE9BQU8sZUFBZSxDQUFDO1NBQzFCO0tBQ0o7QUFDTCxDQUFDO0FBRUQsZ0JBQWdCO0FBQ1QsU0FBUyxRQUFRLENBQXNELElBQU8sRUFBRSxPQUFPLEdBQUcsR0FBRztJQUNoRyxJQUFJLE9BQXNDLENBQUM7SUFFM0MsTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFHLElBQW1CLEVBQUUsRUFBRTtRQUN6QyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEIsT0FBTyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN2RCxDQUFDLENBQUM7SUFFRixPQUFPLFNBQVMsQ0FBQztBQUNyQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqUThDO0FBQzBFO0FBRXJFO0FBQ2U7QUFDbEI7QUFFZ0I7QUFFakUsY0FBYztBQUNQLE1BQU0sYUFBYyxTQUFRLDBEQUFhO0lBeUM1QyxnQkFBZ0I7SUFDaEIsWUFBWSx5QkFBaUUsRUFDekUsb0NBQTRGLEVBQzVGLDJCQUF1RSxFQUN2RSxRQUFlO1FBRWYsS0FBSyxDQUFDLGFBQWEsQ0FBQyx3Q0FBd0MsQ0FBQyx5QkFBeUIsRUFBRSxvQ0FBb0MsQ0FBQyxDQUFDLENBQUM7UUFoQ25JLHFFQUFxRTtRQUM3RCxrREFBNkMsR0FBRyxLQUFLLENBQUMsQ0FBQyx5Q0FBeUM7UUFDeEcsc0VBQXNFO1FBQzlELDJCQUFzQixHQUFHLEtBQUssQ0FBQyxDQUFDLHlDQUF5QztRQStCN0UsSUFBSSxvQ0FBb0MsS0FBSyxTQUFTLEVBQUU7WUFDcEQsSUFBSSxPQUFPLG9DQUFvQyxLQUFLLFVBQVUsRUFBRTtnQkFDNUQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLG9DQUFvQyxDQUFDO2dCQUMvRCxJQUFJLENBQUMsNkNBQTZDLEdBQUcsSUFBSSxDQUFDO2dCQUUxRCxJQUFJLDJCQUEyQixLQUFLLFNBQVMsRUFBRTtvQkFDM0MsSUFBSSxDQUFDLG9CQUFvQixHQUFHLDJCQUEyQixDQUFDO2lCQUMzRDthQUNKO1NBQ0o7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLDZDQUE2QyxFQUFFO1lBQ3JELHlCQUF5QjtZQUV6QixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ2xCLDZDQUE2QztnQkFDN0Msd0dBQXdHO2dCQUN4RyxrR0FBa0c7Z0JBQ2xHLCtDQUErQztnQkFDL0MsSUFBSSxJQUFJLENBQUMsbUNBQW1DLEtBQUssU0FBUyxFQUFFO29CQUN4RCxNQUFNLElBQUksNEVBQXdCLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQ2xEO3FCQUFNO29CQUNILE1BQU0sb0JBQW9CLEdBQUcsd0RBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLG1DQUFtQyxDQUFDLENBQUM7b0JBQzVGLGdDQUFnQztvQkFDaEMsSUFBSSxDQUFDLFlBQVksbUNBQ1Ysb0JBQW9CLEtBQ3ZCLElBQUksRUFBRSxTQUFTLEdBQ2xCO2lCQUNKO2FBQ0o7U0FDSjtRQUVELElBQUksUUFBUSxLQUFLLElBQUksRUFBRTtZQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFO2dCQUM3QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDZjtTQUNKO0lBQ0wsQ0FBQztJQUVRLE9BQU87UUFDWixJQUFJLENBQUMsa0JBQWtCLEdBQUcsU0FBUyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxTQUFTLENBQUM7UUFFdEMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFHRDs7Ozs7Ozs7OztPQVVHO0lBQ00sSUFBSTtRQUVUOztXQUVHO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyw2Q0FBNkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEtBQUssU0FBUyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7WUFDdEgsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3BGLE9BQU87U0FDVjtRQUVEOzs7O1dBSUc7UUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLDZDQUE2QyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQ2xILFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQztZQUNuQyxPQUFPO1NBQ1Y7UUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSSxFQUFFO1lBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsNkNBQTZDLEVBQUU7Z0JBQ3JELElBQUksQ0FBQyxvQ0FBb0MsRUFBRSxDQUFDO2FBQy9DO1lBRUQsNEZBQTRGO1lBQzVGLE1BQU0sQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1NBQzlCO1FBRUQsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxvQ0FBb0M7UUFDaEMsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztRQUVsQyxNQUFNLGVBQWUsR0FBRyxJQUFJLEtBQUssQ0FBc0IsQ0FBQyxDQUFDLENBQUM7UUFDMUQsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM1RCxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzdELGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDM0QsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUUzRCxLQUFLLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxPQUFPLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUMvRCxNQUFNLGNBQWMsR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDaEQsS0FBSyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsT0FBTyxHQUFHLGNBQWMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEVBQUU7Z0JBQzlELE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDckMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNqQztTQUNKO1FBRUQsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztRQUNsQyxXQUFXLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUMzQixXQUFXLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDekMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7UUFFbEM7OztVQUdFO1FBQ0YsNkRBQTZEO1FBQzdELE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQ3pDLENBQUM7SUFDRDs7O09BR0c7SUFDSCwwQkFBMEI7UUFDdEIsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUU7WUFDekMsT0FBTyxLQUFLLENBQUM7U0FDaEI7YUFBTTtZQUNILE1BQU0sa0JBQWtCLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6RCxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsR0FBRyx3QkFBOEIsQ0FBQztZQUMvRCxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pFLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEQsV0FBVyxDQUFDLFNBQVMsQ0FBQyxHQUFHLHNCQUE2QixDQUFDO1lBQ3ZELE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEQsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLGtCQUEyQixDQUFDO1lBQ25ELGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM1QyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUN2RSxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQzlDLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO0lBQ1AsYUFBYSxDQUFDLFNBQTZCLEVBQUUsVUFBdUM7UUFDekYsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEtBQUssU0FBUyxFQUFFO1lBQ3ZDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUN6RSxPQUFPLGlCQUFpQixDQUFDO1NBQzVCO2FBQU07WUFDSCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxTQUFTLEVBQUU7Z0JBQ3RDLE9BQU87b0JBQ0gsT0FBTyxFQUFFLEtBQUs7b0JBQ2QsU0FBUyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDO2lCQUMzRDthQUNKO2lCQUFNO2dCQUNILGlHQUFpRztnQkFDakcsd0dBQXdHO2dCQUN4RyxNQUFNLElBQUksR0FBRyw0REFBVywyRUFBZ0YsQ0FBQztnQkFDekcsTUFBTSxPQUFPLEdBQUcsR0FBRyxJQUFJLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFBRTtnQkFDeEQsTUFBTSxJQUFJLDZEQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDaEM7U0FDSjtJQUNMLENBQUM7SUFFRCxnQkFBZ0I7SUFDUCxlQUFlLENBQUMsU0FBNkIsRUFBRSxPQUFnQixFQUFFLFNBQW1EO1FBQ3pILElBQUksSUFBSSxDQUFDLG9CQUFvQixLQUFLLFNBQVMsRUFBRTtZQUN6QyxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDeEM7YUFBTTtZQUNILElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLHFCQUFxQixLQUFLLFNBQVMsRUFBRTtnQkFDdEQsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFO29CQUN6QixNQUFNLElBQUksNEVBQXdCLENBQUMsZUFBZSxDQUFDLENBQUM7aUJBQ3ZEO3FCQUFNO29CQUNILElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7aUJBQ3BEO2FBQ0o7U0FDSjtJQUNMLENBQUM7Q0FDSjtBQUVELGNBQWM7QUFDZCxXQUFpQixhQUFhO0lBcUIxQjs7O09BR0c7SUFDSCxJQUFJLGdCQUFnQixHQUFHLEtBQUssQ0FBQztJQUU3QixnQkFBZ0I7SUFDaEIsU0FBZ0Isd0NBQXdDLENBQUMseUJBQWlFLEVBQ3RILG9DQUE2RjtRQUc3RixNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEgsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLE1BQU0sV0FBVyxHQUFHLGVBQWUsS0FBSyxJQUFJLENBQUM7UUFFN0MsSUFBSSxnQkFBeUMsQ0FBQztRQUM5QyxJQUFJLE1BQWdDLENBQUM7UUFDckMsSUFBSSxlQUFlLEtBQUssSUFBSSxFQUFFO1lBQzFCLE1BQU0sZUFBZSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDOUQsSUFBSSxlQUFlLEtBQUssSUFBSSxFQUFFO2dCQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7YUFDNUM7WUFDRCxZQUFZLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQStCLENBQUM7WUFDdkYsTUFBTSxjQUFjLEdBQUcseUVBQW9CLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDakYsTUFBTSxHQUFHLHdEQUFZLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQztZQUVsRCxJQUFJLHlCQUF5QixZQUFZLFdBQVcsRUFBRTtnQkFDbEQsZ0JBQWdCLEdBQUcseUJBQXlCLENBQUM7YUFDaEQ7U0FDSjthQUFNO1lBQ0gsSUFBSSx5QkFBeUIsS0FBSyxTQUFTLEVBQUU7Z0JBQ3pDLE1BQU0sR0FBRyxTQUFTLENBQUM7YUFDdEI7aUJBQU07Z0JBQ0gsSUFBSSx5QkFBeUIsWUFBWSxXQUFXLEVBQUU7b0JBQ2xELE1BQU0sR0FBRyxTQUFTLENBQUM7b0JBQ25CLGdCQUFnQixHQUFHLHlCQUF5QixDQUFDO2lCQUNoRDtxQkFBTTtvQkFDSCwwQkFBMEI7b0JBQzFCLE1BQU0sR0FBRyx5QkFBeUIsQ0FBQztpQkFDdEM7YUFDSjtZQUVELElBQUksZ0JBQWdCLEtBQUssU0FBUyxFQUFFO2dCQUNoQyxJQUFJLG9DQUFvQyxZQUFZLFdBQVcsRUFBRTtvQkFDN0QsZ0JBQWdCLEdBQUcsb0NBQW9DLENBQUM7aUJBQzNEO2FBQ0o7U0FDSjtRQUVELE9BQU87WUFDSCxrQ0FBa0MsRUFBRSxNQUFNO1lBQzFDLFdBQVc7WUFDWCxnQkFBZ0I7U0FDbkIsQ0FBQztJQUNOLENBQUM7SUFoRGUsc0RBQXdDLDJDQWdEdkQ7QUFDTCxDQUFDLEVBN0VnQixhQUFhLEtBQWIsYUFBYSxRQTZFN0I7Ozs7Ozs7VUN2VUQ7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTs7VUFFQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTs7Ozs7V0N0QkE7V0FDQTtXQUNBO1dBQ0E7V0FDQSx5Q0FBeUMsd0NBQXdDO1dBQ2pGO1dBQ0E7V0FDQTs7Ozs7V0NQQTs7Ozs7V0NBQTtXQUNBO1dBQ0E7V0FDQSx1REFBdUQsaUJBQWlCO1dBQ3hFO1dBQ0EsZ0RBQWdELGFBQWE7V0FDN0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDTm1DO0FBQ1M7QUFDNEI7QUFDWDtBQUNOO0FBQ1Q7QUFDTjtBQUNHO0FBQ087QUFDUTtBQUNKO0FBQ0M7QUFDZDtBQUNXO0FBQ0k7QUFDUjtBQUNSO0FBQ29CO0FBQzNCO0FBQ21CIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29uZmlnL2NvbmZpZy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29uZmlnL3Jlc29sdmVkLWNvbmZpZy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29udGFpbmVyL2NvbXBvbmVudC1jb250YWluZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2NvbnRyb2xzL2Jyb3dzZXItcG9wb3V0LnRzIiwid2VicGFjazovLy8uL3NyYy90cy9jb250cm9scy9kcmFnLWFjdGlvbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29udHJvbHMvZHJhZy1wcm94eS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29udHJvbHMvZHJhZy1zb3VyY2UudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2NvbnRyb2xzL2Ryb3AtdGFyZ2V0LWluZGljYXRvci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29udHJvbHMvaGVhZGVyLWJ1dHRvbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29udHJvbHMvaGVhZGVyLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9jb250cm9scy9zcGxpdHRlci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29udHJvbHMvdGFiLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9jb250cm9scy90YWJzLWNvbnRhaW5lci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvY29udHJvbHMvdHJhbnNpdGlvbi1pbmRpY2F0b3IudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2Vycm9ycy9leHRlcm5hbC1lcnJvci50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvZXJyb3JzL2ludGVybmFsLWVycm9yLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9nb2xkZW4tbGF5b3V0LnRzIiwid2VicGFjazovLy8uL3NyYy90cy9pdGVtcy9jb21wb25lbnQtaXRlbS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvaXRlbXMvY29tcG9uZW50LXBhcmVudGFibGUtaXRlbS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvaXRlbXMvY29udGVudC1pdGVtLnRzIiwid2VicGFjazovLy8uL3NyYy90cy9pdGVtcy9ncm91bmQtaXRlbS50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvaXRlbXMvcm93LW9yLWNvbHVtbi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvaXRlbXMvc3RhY2sudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL2xheW91dC1tYW5hZ2VyLnRzIiwid2VicGFjazovLy8uL3NyYy90cy91dGlscy9jb25maWctbWluaWZpZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL3V0aWxzL2RyYWctbGlzdGVuZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL3V0aWxzL2V2ZW50LWVtaXR0ZXIudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL3V0aWxzL2V2ZW50LWh1Yi50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvdXRpbHMvaTE4bi1zdHJpbmdzLnRzIiwid2VicGFjazovLy8uL3NyYy90cy91dGlscy9zdHlsZS1jb25zdGFudHMudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RzL3V0aWxzL3R5cGVzLnRzIiwid2VicGFjazovLy8uL3NyYy90cy91dGlscy91dGlscy50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdHMvdmlydHVhbC1sYXlvdXQudHMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovLy93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vLy4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcImdvbGRlbkxheW91dFwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJnb2xkZW5MYXlvdXRcIl0gPSBmYWN0b3J5KCk7XG59KShnbG9iYWxUaGlzLCAoKSA9PiB7XG5yZXR1cm4gIiwiaW1wb3J0IHsgQ29uZmlndXJhdGlvbkVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2V4dGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgQXNzZXJ0RXJyb3IsIFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvciwgVW5yZWFjaGFibGVDYXNlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBJMThuU3RyaW5nSWQsIGkxOG5TdHJpbmdzIH0gZnJvbSAnLi4vdXRpbHMvaTE4bi1zdHJpbmdzJztcclxuaW1wb3J0IHsgSXRlbVR5cGUsIEpzb25WYWx1ZSwgUmVzcG9uc2l2ZU1vZGUsIFNpZGUsIFNpemVVbml0RW51bSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcclxuaW1wb3J0IHsgZGVlcEV4dGVuZFZhbHVlLCBzcGxpdFN0cmluZ0F0Rmlyc3ROb25OdW1lcmljQ2hhciB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuaW1wb3J0IHtcclxuICAgIFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyxcclxuICAgIFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLFxyXG4gICAgUmVzb2x2ZWRJdGVtQ29uZmlnLFxyXG4gICAgUmVzb2x2ZWRMYXlvdXRDb25maWcsXHJcbiAgICBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyxcclxuICAgIFJlc29sdmVkUm9vdEl0ZW1Db25maWcsXHJcbiAgICBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyxcclxuICAgIFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnXHJcbn0gZnJvbSBcIi4vcmVzb2x2ZWQtY29uZmlnXCI7XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1Db25maWcge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgaXRlbS4gUG9zc2libGUgdmFsdWVzIGFyZSAncm93JywgJ2NvbHVtbicsICdzdGFjaycsICdjb21wb25lbnQnLlxyXG4gICAgICovXHJcbiAgICB0eXBlOiBJdGVtVHlwZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFuIGFycmF5IG9mIGNvbmZpZ3VyYXRpb25zIGZvciBpdGVtcyB0aGF0IHdpbGwgYmUgY3JlYXRlZCBhcyBjaGlsZHJlbiBvZiB0aGlzIGl0ZW0uXHJcbiAgICAgKi9cclxuICAgIGNvbnRlbnQ/OiBJdGVtQ29uZmlnW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgd2lkdGggb2YgdGhpcyBpdGVtLCByZWxhdGl2ZSB0byB0aGUgb3RoZXIgY2hpbGRyZW4gb2YgaXRzIHBhcmVudCBpbiBwZXJjZW50XHJcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChJdGVtQ29uZmlnOmludGVyZmFjZSkuc2l6ZX0gaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICB3aWR0aD86IG51bWJlcjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBtaW5pbXVtIHdpZHRoIG9mIHRoaXMgaXRlbSBpbiBwaXhlbHNcclxuICAgICAqIENBVVRJT04gLSBOb3QgdGVzdGVkIC0gZG8gbm90IHVzZVxyXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoSXRlbUNvbmZpZzppbnRlcmZhY2UpLm1pblNpemV9IGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgbWluV2lkdGg/OiBudW1iZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoaXMgaXRlbSwgcmVsYXRpdmUgdG8gdGhlIG90aGVyIGNoaWxkcmVuIG9mIGl0cyBwYXJlbnQgaW4gcGVyY2VudFxyXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoSXRlbUNvbmZpZzppbnRlcmZhY2UpLnNpemV9IGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgaGVpZ2h0PzogbnVtYmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIG1pbmltdW0gaGVpZ2h0IG9mIHRoaXMgaXRlbSBpbiBwaXhlbHNcclxuICAgICAqIENBVVRJT04gLSBOb3QgdGVzdGVkIC0gZG8gbm90IHVzZVxyXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoSXRlbUNvbmZpZzppbnRlcmZhY2UpLm1pblNpemV9IGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgbWluSGVpZ2h0PzogbnVtYmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHNpemUgb2YgdGhpcyBpdGVtLlxyXG4gICAgICogRm9yIHJvd3MsIGl0IHNwZWNpZmllcyBoZWlnaHQuIEZvciBjb2x1bW5zLCBpdCBzcGVjaWZpZXMgd2lkdGguXHJcbiAgICAgKiBIYXMgZm9ybWF0IFxcPG51bWJlclxcPlxcPHtAbGluayBTaXplVW5pdH1cXD4uIEN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIHVuaXRzIGBmcmAgYW5kIGAlYC5cclxuICAgICAqXHJcbiAgICAgKiBTcGFjZSBpcyBmaXJzdCBwcm9wb3J0aW9uYWxseSBhbGxvY2F0ZWQgdG8gaXRlbXMgd2l0aCBzaXplVW5pdCBgJWAuXHJcbiAgICAgKiBJZiB0aGVyZSBpcyBhbnkgc3BhY2UgbGVmdCBvdmVyIChsZXNzIHRoYW4gMTAwJSBhbGxvY2F0ZWQpLCB0aGVuIHRoZVxyXG4gICAgICogcmVtYWluZGVyIGlzIGFsbG9jYXRlZCB0byB0aGUgaXRlbXMgd2l0aCB1bml0IGBmcmAgYWNjb3JkaW5nIHRvIHRoZSBmcmFjdGlvbmFsIHNpemUuXHJcbiAgICAgKiBJZiBtb3JlIHRoYW4gMTAwJSBpcyBhbGxvY2F0ZWQsIHRoZW4gYW4gZXh0cmEgNTAlIGlzIGFsbG9jYXRlZCB0byBpdGVtcyB3aXRoIHVuaXQgYGZyYCBhbmRcclxuICAgICAqIGlzIGFsbG9jYXRlZCB0byBlYWNoIGl0ZW0gYWNjb3JkaW5nIHRvIGl0cyBmcmFjdGlvbmFsIHNpemUuIEFsbCBpdGVtIHNpemVzIGFyZSB0aGVuIGFkanVzdGVkXHJcbiAgICAgKiB0byBicmluZyB0aGUgdG90YWwgYmFjayB0byAxMDAlXHJcbiAgICAgKi9cclxuICAgIHNpemU/OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc2l6ZSBvZiB0aGlzIGl0ZW0uXHJcbiAgICAgKiBGb3Igcm93cywgaXQgc3BlY2lmaWVzIGhlaWdodC4gRm9yIGNvbHVtbnMsIGl0IHNwZWNpZmllcyB3aWR0aC5cclxuICAgICAqIEhhcyBmb3JtYXQgPG51bWJlcj48c2l6ZVVuaXQ+LiBDdXJyZW50bHkgb25seSBzdXBwb3J0cyB1bml0cyBgcHhgXHJcbiAgICAgKi9cclxuICAgIG1pblNpemU/OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IGEgQ29udGVudEl0ZW0uXHJcbiAgICAgKiBEbyBOT1QgYXNzaWduIGFuIGFycmF5LiAgVGhpcyBvbmx5IGV4aXN0cyBmb3IgbGVnYWN5IHB1cnBvc2VzLiAgSWYgYW4gYXJyYXkgaXMgYXNzaWduZWQsIHRoZSBmaXJzdCBlbGVtZW50XHJcbiAgICAgKiB3aWxsIGJlY29tZSB0aGUgaWQuXHJcbiAgICAgKi9cclxuICAgIGlkPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgaXRlbSBpcyBjbG9zYWJsZS4gSWYgZmFsc2UsIHRoZSB4IG9uIHRoZSBpdGVtcyB0YWIgd2lsbCBiZSBoaWRkZW4gYW5kIGNvbnRhaW5lci5jbG9zZSgpXHJcbiAgICAgKiB3aWxsIHJldHVybiBmYWxzZVxyXG4gICAgICogRGVmYXVsdDogdHJ1ZVxyXG4gICAgICovXHJcbiAgICBpc0Nsb3NhYmxlPzogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB0aXRsZSBvZiB0aGUgaXRlbSBhcyBkaXNwbGF5ZWQgb24gaXRzIHRhYiBhbmQgb24gcG9wb3V0IHdpbmRvd3NcclxuICAgICAqIERlZmF1bHQ6IGNvbXBvbmVudFR5cGUudG9TdHJpbmcoKSBvciAnJ1xyXG4gICAgICogQGRlcHJlY2F0ZWQgb25seSBDb21wb25lbnQgaGFzIGEgdGl0bGVcclxuICAgICAqL1xyXG4gICAgdGl0bGU/OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgSXRlbUNvbmZpZyB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgY29uc3QgZW51bSBTaXplV2lkdGhIZWlnaHRTcGVjaWZpY2F0aW9uVHlwZSB7XHJcbiAgICAgICAgTm9uZSxcclxuICAgICAgICBTaXplLFxyXG4gICAgICAgIFdpZHRoT3JIZWlnaHQsXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUoaXRlbUNvbmZpZzogSXRlbUNvbmZpZywgcm93QW5kQ29sdW1uQ2hpbGRMZWdhY3lTaXplRGVmYXVsdDogYm9vbGVhbik6IFJlc29sdmVkSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgc3dpdGNoIChpdGVtQ29uZmlnLnR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5ncm91bmQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKCdJdGVtQ29uZmlnIGNhbm5vdCBzcGVjaWZ5IHR5cGUgZ3JvdW5kJywgSlNPTi5zdHJpbmdpZnkoaXRlbUNvbmZpZykpO1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnJvdzpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb2x1bW46XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUm93T3JDb2x1bW5JdGVtQ29uZmlnLnJlc29sdmUoaXRlbUNvbmZpZyBhcyBSb3dPckNvbHVtbkl0ZW1Db25maWcsIHJvd0FuZENvbHVtbkNoaWxkTGVnYWN5U2l6ZURlZmF1bHQpO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5zdGFjazpcclxuICAgICAgICAgICAgICAgIHJldHVybiBTdGFja0l0ZW1Db25maWcucmVzb2x2ZShpdGVtQ29uZmlnIGFzIFN0YWNrSXRlbUNvbmZpZywgcm93QW5kQ29sdW1uQ2hpbGRMZWdhY3lTaXplRGVmYXVsdCk7XHJcblxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbXBvbmVudDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBDb21wb25lbnRJdGVtQ29uZmlnLnJlc29sdmUoaXRlbUNvbmZpZyBhcyBDb21wb25lbnRJdGVtQ29uZmlnLCByb3dBbmRDb2x1bW5DaGlsZExlZ2FjeVNpemVEZWZhdWx0KTtcclxuXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWFjaGFibGVDYXNlRXJyb3IoJ1VDVUlDUjU1NDk5JywgaXRlbUNvbmZpZy50eXBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVDb250ZW50KGNvbnRlbnQ6IEl0ZW1Db25maWdbXSB8IHVuZGVmaW5lZCk6IFJlc29sdmVkSXRlbUNvbmZpZ1tdIHtcclxuICAgICAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBjb3VudCA9IGNvbnRlbnQubGVuZ3RoO1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8UmVzb2x2ZWRJdGVtQ29uZmlnPihjb3VudCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gSXRlbUNvbmZpZy5yZXNvbHZlKGNvbnRlbnRbaV0sIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUlkKGlkOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5pZDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpZCkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpZC5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLmlkO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWRbMF07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTaXplKFxyXG4gICAgICAgIHNpemU6IHN0cmluZyB8IHVuZGVmaW5lZCxcclxuICAgICAgICB3aWR0aDogbnVtYmVyIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIGhlaWdodDogbnVtYmVyIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIHJvd0FuZENvbHVtbkNoaWxkTGVnYWN5U2l6ZURlZmF1bHQ6IGJvb2xlYW4pOlxyXG4gICAgU2l6ZVdpdGhVbml0IHtcclxuICAgICAgICAvLyBSZW1vdmUgc3VwcG9ydCBmb3Igcm93QW5kQ29sdW1uQ2hpbGRMZWdhY3lTaXplRGVmYXVsdCBpbiBhIG1ham9yIHZlcnNpb24gcmVsZWFzZVxyXG5cclxuICAgICAgICBpZiAoc2l6ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVNpemUoc2l6ZSwgW1NpemVVbml0RW51bS5QZXJjZW50LCBTaXplVW5pdEVudW0uRnJhY3Rpb25hbF0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh3aWR0aCAhPT0gdW5kZWZpbmVkIHx8IGhlaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAod2lkdGggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHNpemU6IHdpZHRoLCBzaXplVW5pdDogU2l6ZVVuaXRFbnVtLlBlcmNlbnQgfTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhlaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHNpemU6IGhlaWdodCwgc2l6ZVVuaXQ6IFNpemVVbml0RW51bS5QZXJjZW50IH07XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignQ1JTMzMzOTAnKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocm93QW5kQ29sdW1uQ2hpbGRMZWdhY3lTaXplRGVmYXVsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHNpemU6IDUwLCBzaXplVW5pdDogU2l6ZVVuaXRFbnVtLlBlcmNlbnQgfTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc2l6ZTogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLnNpemUsIHNpemVVbml0OiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuc2l6ZVVuaXQgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU1pblNpemUobWluU2l6ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBtaW5XaWR0aDogbnVtYmVyIHwgdW5kZWZpbmVkLCBtaW5IZWlnaHQ6IG51bWJlciB8IHVuZGVmaW5lZCk6IFVuZGVmaW5hYmxlU2l6ZVdpdGhVbml0IHtcclxuICAgICAgICBpZiAobWluU2l6ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVNpemUobWluU2l6ZSwgW1NpemVVbml0RW51bS5QaXhlbF0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1pbldpZHRoRGVmaW5lZCA9IG1pbldpZHRoICE9PSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IG1pbkhlaWdodERlZmluZWQgPSBtaW5IZWlnaHQgIT09IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgaWYgKG1pbldpZHRoRGVmaW5lZCB8fCBtaW5IZWlnaHREZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobWluV2lkdGhEZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc2l6ZTogbWluV2lkdGgsIHNpemVVbml0OiBTaXplVW5pdEVudW0uUGl4ZWwgfTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc2l6ZTogbWluSGVpZ2h0LCBzaXplVW5pdDogU2l6ZVVuaXRFbnVtLlBpeGVsIH07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBzaXplOiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMubWluU2l6ZSwgc2l6ZVVuaXQ6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5taW5TaXplVW5pdCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVTaXplV2lkdGhIZWlnaHRTcGVjaWZpY2F0aW9uVHlwZShjb25maWc6IEl0ZW1Db25maWcpOiBTaXplV2lkdGhIZWlnaHRTcGVjaWZpY2F0aW9uVHlwZSB7XHJcbiAgICAgICAgaWYgKGNvbmZpZy5zaXplICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFNpemVXaWR0aEhlaWdodFNwZWNpZmljYXRpb25UeXBlLlNpemU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGNvbmZpZy53aWR0aCAhPT0gdW5kZWZpbmVkIHx8IGNvbmZpZy5oZWlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFNpemVXaWR0aEhlaWdodFNwZWNpZmljYXRpb25UeXBlLldpZHRoT3JIZWlnaHQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gU2l6ZVdpZHRoSGVpZ2h0U3BlY2lmaWNhdGlvblR5cGUuTm9uZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNHcm91bmQoY29uZmlnOiBJdGVtQ29uZmlnKTogY29uZmlnIGlzIEl0ZW1Db25maWcge1xyXG4gICAgICAgIHJldHVybiBjb25maWcudHlwZSA9PT0gSXRlbVR5cGUuZ3JvdW5kO1xyXG4gICAgfVxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzUm93KGNvbmZpZzogSXRlbUNvbmZpZyk6IGNvbmZpZyBpcyBJdGVtQ29uZmlnIHtcclxuICAgICAgICByZXR1cm4gY29uZmlnLnR5cGUgPT09IEl0ZW1UeXBlLnJvdztcclxuICAgIH1cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0NvbHVtbihjb25maWc6IEl0ZW1Db25maWcpOiBjb25maWcgaXMgSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIGNvbmZpZy50eXBlID09PSBJdGVtVHlwZS5jb2x1bW47XHJcbiAgICB9XHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNTdGFjayhjb25maWc6IEl0ZW1Db25maWcpOiBjb25maWcgaXMgSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIGNvbmZpZy50eXBlID09PSBJdGVtVHlwZS5zdGFjaztcclxuICAgIH1cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0NvbXBvbmVudChjb25maWc6IEl0ZW1Db25maWcpOiBjb25maWcgaXMgQ29tcG9uZW50SXRlbUNvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIGNvbmZpZy50eXBlID09PSBJdGVtVHlwZS5jb21wb25lbnQ7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8vIFN0YWNrIG9yIENvbXBvbmVudFxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEhlYWRlcmVkSXRlbUNvbmZpZyBleHRlbmRzIEl0ZW1Db25maWcge1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKEhlYWRlcmVkSXRlbUNvbmZpZzpuYW1lc3BhY2UpLihIZWFkZXI6aW50ZXJmYWNlKS5zaG93fSBpbnN0ZWFkICovXHJcbiAgICBoYXNIZWFkZXJzPzogYm9vbGVhbjtcclxuICAgIGhlYWRlcj86IEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXI7XHJcbiAgICBtYXhpbWlzZWQ/OiBib29sZWFuO1xyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIEhlYWRlcmVkSXRlbUNvbmZpZyB7XHJcbiAgICBjb25zdCBsZWdhY3lNYXhpbWlzZWRJZCA9ICdfX2dsTWF4aW1pc2VkJztcclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIEhlYWRlciB7XHJcbiAgICAgICAgc2hvdz86IGZhbHNlIHwgU2lkZTtcclxuICAgICAgICBwb3BvdXQ/OiBmYWxzZSB8IHN0cmluZztcclxuICAgICAgICBkb2NrPzogZmFsc2UgfCBzdHJpbmc7XHJcbiAgICAgICAgbWF4aW1pc2U/OiBmYWxzZSB8IHN0cmluZztcclxuICAgICAgICBjbG9zZT86IGZhbHNlIHwgc3RyaW5nO1xyXG4gICAgICAgIG1pbmltaXNlPzogc3RyaW5nO1xyXG4gICAgICAgIHRhYkRyb3Bkb3duPzogZmFsc2UgfCBzdHJpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBIZWFkZXIge1xyXG4gICAgICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKGhlYWRlcjogSGVhZGVyIHwgdW5kZWZpbmVkLCBoYXNIZWFkZXJzOiBib29sZWFuIHwgdW5kZWZpbmVkKTogUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICAgICAgaWYgKGhlYWRlciA9PT0gdW5kZWZpbmVkICYmIGhhc0hlYWRlcnMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNob3c6IGhlYWRlcj8uc2hvdyA/PyAoaGFzSGVhZGVycyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogaGFzSGVhZGVycyA/IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlci5kZWZhdWx0cy5zaG93IDogZmFsc2UpLFxyXG4gICAgICAgICAgICAgICAgICAgIHBvcG91dDogaGVhZGVyPy5wb3BvdXQsXHJcbiAgICAgICAgICAgICAgICAgICAgbWF4aW1pc2U6IGhlYWRlcj8ubWF4aW1pc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgY2xvc2U6IGhlYWRlcj8uY2xvc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgbWluaW1pc2U6IGhlYWRlcj8ubWluaW1pc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgdGFiRHJvcGRvd246IGhlYWRlcj8udGFiRHJvcGRvd24sXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlSWRBbmRNYXhpbWlzZWQoY29uZmlnOiBIZWFkZXJlZEl0ZW1Db25maWcpOiB7IGlkOiBzdHJpbmcsIG1heGltaXNlZDogYm9vbGVhbn0ge1xyXG4gICAgICAgIGxldCBpZDogc3RyaW5nO1xyXG4gICAgICAgIC8vIFRvIHN1cHBvcnQgbGVnYWN5IGNvbmZpZ3Mgd2l0aCBJZCBzYXZlZCBhcyBhbiBhcnJheSBvZiBzdHJpbmcsIGFzc2lnbiBjb25maWcuaWQgdG8gYSB0eXBlIHdoaWNoIGluY2x1ZGVzIHN0cmluZyBhcnJheVxyXG4gICAgICAgIGxldCBsZWdhY3lJZDogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQgPSBjb25maWcuaWQ7XHJcbiAgICAgICAgbGV0IGxlZ2FjeU1heGltaXNlZCA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChsZWdhY3lJZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGlkID0gUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLmlkO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxlZ2FjeUlkKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaWR4ID0gbGVnYWN5SWQuZmluZEluZGV4KChpZCkgPT4gaWQgPT09IGxlZ2FjeU1heGltaXNlZElkKVxyXG4gICAgICAgICAgICAgICAgaWYgKGlkeCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBsZWdhY3lNYXhpbWlzZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeUlkID0gbGVnYWN5SWQuc3BsaWNlKGlkeCwgMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAobGVnYWN5SWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlkID0gbGVnYWN5SWRbMF07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlkID0gUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLmlkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWQgPSBsZWdhY3lJZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IG1heGltaXNlZDogYm9vbGVhbjtcclxuICAgICAgICBpZiAoY29uZmlnLm1heGltaXNlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIG1heGltaXNlZCA9IGNvbmZpZy5tYXhpbWlzZWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbWF4aW1pc2VkID0gbGVnYWN5TWF4aW1pc2VkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHsgaWQsIG1heGltaXNlZCB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU3RhY2tJdGVtQ29uZmlnIGV4dGVuZHMgSGVhZGVyZWRJdGVtQ29uZmlnIHtcclxuICAgIHR5cGU6ICdzdGFjayc7XHJcbiAgICBjb250ZW50OiBDb21wb25lbnRJdGVtQ29uZmlnW107XHJcbiAgICAvKiogVGhlIGluZGV4IG9mIHRoZSBpdGVtIGluIGNvbnRlbnQgd2hpY2ggaXMgdG8gYmUgYWN0aXZlKi9cclxuICAgIGFjdGl2ZUl0ZW1JbmRleD86IG51bWJlcjtcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBTdGFja0l0ZW1Db25maWcge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUoaXRlbUNvbmZpZzogU3RhY2tJdGVtQ29uZmlnLCByb3dBbmRDb2x1bW5DaGlsZExlZ2FjeVNpemVEZWZhdWx0OiBib29sZWFuKTogUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcge1xyXG4gICAgICAgIGNvbnN0IHsgaWQsIG1heGltaXNlZCB9ID0gSGVhZGVyZWRJdGVtQ29uZmlnLnJlc29sdmVJZEFuZE1heGltaXNlZChpdGVtQ29uZmlnKTtcclxuICAgICAgICBjb25zdCB7IHNpemUsIHNpemVVbml0IH0gPSBJdGVtQ29uZmlnLnJlc29sdmVTaXplKGl0ZW1Db25maWcuc2l6ZSwgaXRlbUNvbmZpZy53aWR0aCwgaXRlbUNvbmZpZy5oZWlnaHQsIHJvd0FuZENvbHVtbkNoaWxkTGVnYWN5U2l6ZURlZmF1bHQpO1xyXG4gICAgICAgIGNvbnN0IHsgc2l6ZTogbWluU2l6ZSwgc2l6ZVVuaXQ6IG1pblNpemVVbml0IH0gPSBJdGVtQ29uZmlnLnJlc29sdmVNaW5TaXplKGl0ZW1Db25maWcubWluU2l6ZSwgaXRlbUNvbmZpZy5taW5XaWR0aCwgaXRlbUNvbmZpZy5taW5IZWlnaHQpO1xyXG5cclxuICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiBJdGVtVHlwZS5zdGFjayxcclxuICAgICAgICAgICAgY29udGVudDogcmVzb2x2ZUNvbnRlbnQoaXRlbUNvbmZpZy5jb250ZW50KSxcclxuICAgICAgICAgICAgc2l6ZSxcclxuICAgICAgICAgICAgc2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIG1pblNpemUsXHJcbiAgICAgICAgICAgIG1pblNpemVVbml0LFxyXG4gICAgICAgICAgICBpZCxcclxuICAgICAgICAgICAgbWF4aW1pc2VkLFxyXG4gICAgICAgICAgICBpc0Nsb3NhYmxlOiBpdGVtQ29uZmlnLmlzQ2xvc2FibGUgPz8gUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLmlzQ2xvc2FibGUsXHJcbiAgICAgICAgICAgIGFjdGl2ZUl0ZW1JbmRleDogaXRlbUNvbmZpZy5hY3RpdmVJdGVtSW5kZXggPz8gUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcuZGVmYXVsdEFjdGl2ZUl0ZW1JbmRleCxcclxuICAgICAgICAgICAgaGVhZGVyOiBIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyLnJlc29sdmUoaXRlbUNvbmZpZy5oZWFkZXIsIGl0ZW1Db25maWcuaGFzSGVhZGVycyksXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBmcm9tUmVzb2x2ZWQocmVzb2x2ZWRDb25maWc6IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnKTogU3RhY2tJdGVtQ29uZmlnIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IFN0YWNrSXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogSXRlbVR5cGUuc3RhY2ssXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IGZyb21SZXNvbHZlZENvbnRlbnQocmVzb2x2ZWRDb25maWcuY29udGVudCksXHJcbiAgICAgICAgICAgIHNpemU6IGZvcm1hdFNpemUocmVzb2x2ZWRDb25maWcuc2l6ZSwgcmVzb2x2ZWRDb25maWcuc2l6ZVVuaXQpLFxyXG4gICAgICAgICAgICBtaW5TaXplOiBmb3JtYXRVbmRlZmluYWJsZVNpemUocmVzb2x2ZWRDb25maWcubWluU2l6ZSwgcmVzb2x2ZWRDb25maWcubWluU2l6ZVVuaXQpLFxyXG4gICAgICAgICAgICBpZDogcmVzb2x2ZWRDb25maWcuaWQsXHJcbiAgICAgICAgICAgIG1heGltaXNlZDogcmVzb2x2ZWRDb25maWcubWF4aW1pc2VkLFxyXG4gICAgICAgICAgICBpc0Nsb3NhYmxlOiByZXNvbHZlZENvbmZpZy5pc0Nsb3NhYmxlLFxyXG4gICAgICAgICAgICBhY3RpdmVJdGVtSW5kZXg6IHJlc29sdmVkQ29uZmlnLmFjdGl2ZUl0ZW1JbmRleCxcclxuICAgICAgICAgICAgaGVhZGVyOiBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXIuY3JlYXRlQ29weShyZXNvbHZlZENvbmZpZy5oZWFkZXIpLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZnVuY3Rpb24gcmVzb2x2ZUNvbnRlbnQoY29udGVudDogQ29tcG9uZW50SXRlbUNvbmZpZ1tdIHwgdW5kZWZpbmVkKTogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnW10ge1xyXG4gICAgICAgIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gY29udGVudC5sZW5ndGg7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWc+KGNvdW50KTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZEl0ZW1Db25maWcgPSBjb250ZW50W2ldO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbUNvbmZpZyA9IEl0ZW1Db25maWcucmVzb2x2ZShjaGlsZEl0ZW1Db25maWcsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGlmICghUmVzb2x2ZWRJdGVtQ29uZmlnLmlzQ29tcG9uZW50SXRlbShpdGVtQ29uZmlnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignVUNVU0lDUkM5MTExNCcsIEpTT04uc3RyaW5naWZ5KGl0ZW1Db25maWcpKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gaXRlbUNvbmZpZztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBmdW5jdGlvbiBmcm9tUmVzb2x2ZWRDb250ZW50KHJlc29sdmVkQ29udGVudDogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnW10pOiBDb21wb25lbnRJdGVtQ29uZmlnW10ge1xyXG4gICAgICAgIGNvbnN0IGNvdW50ID0gcmVzb2x2ZWRDb250ZW50Lmxlbmd0aDtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8Q29tcG9uZW50SXRlbUNvbmZpZz4oY291bnQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZENvbnRlbnRDb25maWcgPSByZXNvbHZlZENvbnRlbnRbaV07XHJcbiAgICAgICAgICAgIHJlc3VsdFtpXSA9IENvbXBvbmVudEl0ZW1Db25maWcuZnJvbVJlc29sdmVkKHJlc29sdmVkQ29udGVudENvbmZpZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50SXRlbUNvbmZpZyBleHRlbmRzIEhlYWRlcmVkSXRlbUNvbmZpZyB7XHJcbiAgICB0eXBlOiAnY29tcG9uZW50JztcclxuICAgIHJlYWRvbmx5IGNvbnRlbnQ/OiBbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB0aXRsZSBvZiB0aGUgaXRlbSBhcyBkaXNwbGF5ZWQgb24gaXRzIHRhYiBhbmQgb24gcG9wb3V0IHdpbmRvd3NcclxuICAgICAqIERlZmF1bHQ6IGNvbXBvbmVudFR5cGUudG9TdHJpbmcoKSBvciAnJ1xyXG4gICAgICovXHJcbiAgICB0aXRsZT86IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSBjb21wb25lbnQuXHJcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChDb21wb25lbnRJdGVtQ29uZmlnOmludGVyZmFjZSkuY29tcG9uZW50VHlwZX0gaW5zdGVhZFxyXG4gICAgICovXHJcbiAgICBjb21wb25lbnROYW1lPzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGNvbXBvbmVudC5cclxuICAgICAqIGBjb21wb25lbnRUeXBlYCBtdXN0IGJlIG9mIHR5cGUgYHN0cmluZ2AgaWYgaXQgaXMgcmVnaXN0ZXJlZCB3aXRoIGFueSBvZiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczpcclxuICAgICAqICoge0BsaW5rIChHb2xkZW5MYXlvdXQ6Y2xhc3MpLnJlZ2lzdGVyQ29tcG9uZW50fSAoZGVwcmVjYXRlZClcclxuICAgICAqICoge0BsaW5rIChHb2xkZW5MYXlvdXQ6Y2xhc3MpLnJlZ2lzdGVyQ29tcG9uZW50Q29uc3RydWN0b3J9XHJcbiAgICAgKiAqIHtAbGluayAoR29sZGVuTGF5b3V0OmNsYXNzKS5yZWdpc3RlckNvbXBvbmVudEZhY3RvcnlGdW5jdGlvbn1cclxuICAgICAqL1xyXG4gICAgY29tcG9uZW50VHlwZTogSnNvblZhbHVlO1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc3RhdGUgaW5mb3JtYXRpb24gd2l0aCB3aGljaCBhIGNvbXBvbmVudCB3aWxsIGJlIGluaXRpYWxpc2VkIHdpdGguXHJcbiAgICAgKiBXaWxsIGJlIHBhc3NlZCB0byB0aGUgY29tcG9uZW50IGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGFuZCB3aWxsIGJlIHRoZSB2YWx1ZSByZXR1cm5lZCBieVxyXG4gICAgICogY29udGFpbmVyLmluaXRpYWxTdGF0ZS5cclxuICAgICAqL1xyXG4gICAgY29tcG9uZW50U3RhdGU/OiBKc29uVmFsdWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWZhdWx0OiB0cnVlXHJcbiAgICAgKi9cclxuICAgIHJlb3JkZXJFbmFibGVkPzogYm9vbGVhbjsgIC8vIFRha2VzIHByZWNlZGVuY2Ugb3ZlciBMYXlvdXRDb25maWcucmVvcmRlckVuYWJsZWQuXHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgQ29tcG9uZW50SXRlbUNvbmZpZyB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZShpdGVtQ29uZmlnOiBDb21wb25lbnRJdGVtQ29uZmlnLCByb3dBbmRDb2x1bW5DaGlsZExlZ2FjeVNpemVEZWZhdWx0OiBib29sZWFuKTogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnIHtcclxuICAgICAgICBsZXQgY29tcG9uZW50VHlwZTogSnNvblZhbHVlIHwgdW5kZWZpbmVkID0gaXRlbUNvbmZpZy5jb21wb25lbnRUeXBlO1xyXG4gICAgICAgIGlmIChjb21wb25lbnRUeXBlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY29tcG9uZW50VHlwZSA9IGl0ZW1Db25maWcuY29tcG9uZW50TmFtZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbXBvbmVudFR5cGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbXBvbmVudEl0ZW1Db25maWcuY29tcG9uZW50VHlwZSBpcyB1bmRlZmluZWQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCB7IGlkLCBtYXhpbWlzZWQgfSA9IEhlYWRlcmVkSXRlbUNvbmZpZy5yZXNvbHZlSWRBbmRNYXhpbWlzZWQoaXRlbUNvbmZpZyk7XHJcbiAgICAgICAgICAgIGxldCB0aXRsZTogc3RyaW5nO1xyXG4gICAgICAgICAgICBpZiAoaXRlbUNvbmZpZy50aXRsZSA9PT0gdW5kZWZpbmVkIHx8IGl0ZW1Db25maWcudGl0bGUgPT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICB0aXRsZSA9IENvbXBvbmVudEl0ZW1Db25maWcuY29tcG9uZW50VHlwZVRvVGl0bGUoY29tcG9uZW50VHlwZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aXRsZSA9IGl0ZW1Db25maWcudGl0bGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgeyBzaXplLCBzaXplVW5pdCB9ID0gSXRlbUNvbmZpZy5yZXNvbHZlU2l6ZShpdGVtQ29uZmlnLnNpemUsIGl0ZW1Db25maWcud2lkdGgsIGl0ZW1Db25maWcuaGVpZ2h0LCByb3dBbmRDb2x1bW5DaGlsZExlZ2FjeVNpemVEZWZhdWx0KTtcclxuICAgICAgICAgICAgY29uc3QgeyBzaXplOiBtaW5TaXplLCBzaXplVW5pdDogbWluU2l6ZVVuaXQgfSA9IEl0ZW1Db25maWcucmVzb2x2ZU1pblNpemUoaXRlbUNvbmZpZy5taW5TaXplLCBpdGVtQ29uZmlnLm1pbldpZHRoLCBpdGVtQ29uZmlnLm1pbkhlaWdodCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogaXRlbUNvbmZpZy50eXBlLFxyXG4gICAgICAgICAgICAgICAgY29udGVudDogW10sXHJcbiAgICAgICAgICAgICAgICBzaXplLFxyXG4gICAgICAgICAgICAgICAgc2l6ZVVuaXQsXHJcbiAgICAgICAgICAgICAgICBtaW5TaXplLFxyXG4gICAgICAgICAgICAgICAgbWluU2l6ZVVuaXQsXHJcbiAgICAgICAgICAgICAgICBpZCxcclxuICAgICAgICAgICAgICAgIG1heGltaXNlZCxcclxuICAgICAgICAgICAgICAgIGlzQ2xvc2FibGU6IGl0ZW1Db25maWcuaXNDbG9zYWJsZSA/PyBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuaXNDbG9zYWJsZSxcclxuICAgICAgICAgICAgICAgIHJlb3JkZXJFbmFibGVkOiBpdGVtQ29uZmlnLnJlb3JkZXJFbmFibGVkID8/IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZy5kZWZhdWx0UmVvcmRlckVuYWJsZWQsXHJcbiAgICAgICAgICAgICAgICB0aXRsZSxcclxuICAgICAgICAgICAgICAgIGhlYWRlcjogSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlci5yZXNvbHZlKGl0ZW1Db25maWcuaGVhZGVyLCBpdGVtQ29uZmlnLmhhc0hlYWRlcnMpLFxyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50VHlwZSxcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudFN0YXRlOiBpdGVtQ29uZmlnLmNvbXBvbmVudFN0YXRlID8/IHt9LFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZnJvbVJlc29sdmVkKHJlc29sdmVkQ29uZmlnOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcpOiBDb21wb25lbnRJdGVtQ29uZmlnIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IENvbXBvbmVudEl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IEl0ZW1UeXBlLmNvbXBvbmVudCxcclxuICAgICAgICAgICAgc2l6ZTogZm9ybWF0U2l6ZShyZXNvbHZlZENvbmZpZy5zaXplLCByZXNvbHZlZENvbmZpZy5zaXplVW5pdCksXHJcbiAgICAgICAgICAgIG1pblNpemU6IGZvcm1hdFVuZGVmaW5hYmxlU2l6ZShyZXNvbHZlZENvbmZpZy5taW5TaXplLCByZXNvbHZlZENvbmZpZy5taW5TaXplVW5pdCksXHJcbiAgICAgICAgICAgIGlkOiByZXNvbHZlZENvbmZpZy5pZCxcclxuICAgICAgICAgICAgbWF4aW1pc2VkOiByZXNvbHZlZENvbmZpZy5tYXhpbWlzZWQsXHJcbiAgICAgICAgICAgIGlzQ2xvc2FibGU6IHJlc29sdmVkQ29uZmlnLmlzQ2xvc2FibGUsXHJcbiAgICAgICAgICAgIHJlb3JkZXJFbmFibGVkOiByZXNvbHZlZENvbmZpZy5yZW9yZGVyRW5hYmxlZCxcclxuICAgICAgICAgICAgdGl0bGU6IHJlc29sdmVkQ29uZmlnLnRpdGxlLFxyXG4gICAgICAgICAgICBoZWFkZXI6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlci5jcmVhdGVDb3B5KHJlc29sdmVkQ29uZmlnLmhlYWRlciksXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFR5cGU6IHJlc29sdmVkQ29uZmlnLmNvbXBvbmVudFR5cGUsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFN0YXRlOiBkZWVwRXh0ZW5kVmFsdWUodW5kZWZpbmVkLCByZXNvbHZlZENvbmZpZy5jb21wb25lbnRTdGF0ZSkgYXMgSnNvblZhbHVlLFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY29tcG9uZW50VHlwZVRvVGl0bGUoY29tcG9uZW50VHlwZTogSnNvblZhbHVlKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBjb21wb25lbnRUeXBlVHlwZSA9IHR5cGVvZiBjb21wb25lbnRUeXBlO1xyXG4gICAgICAgIHN3aXRjaCAoY29tcG9uZW50VHlwZVR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzogcmV0dXJuIGNvbXBvbmVudFR5cGUgYXMgc3RyaW5nO1xyXG4gICAgICAgICAgICBjYXNlICdudW1iZXInOiByZXR1cm4gKGNvbXBvbmVudFR5cGUgYXMgbnVtYmVyKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICBjYXNlICdib29sZWFuJzogcmV0dXJuIChjb21wb25lbnRUeXBlIGFzIGJvb2xlYW4pLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAnJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8vIFJvd09yQ29sdW1uXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUm93T3JDb2x1bW5JdGVtQ29uZmlnIGV4dGVuZHMgSXRlbUNvbmZpZyB7XHJcbiAgICB0eXBlOiAncm93JyB8ICdjb2x1bW4nO1xyXG4gICAgY29udGVudDogKFJvd09yQ29sdW1uSXRlbUNvbmZpZyB8IFN0YWNrSXRlbUNvbmZpZyB8IENvbXBvbmVudEl0ZW1Db25maWcpW107XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgUm93T3JDb2x1bW5JdGVtQ29uZmlnIHtcclxuICAgIGV4cG9ydCB0eXBlIENoaWxkSXRlbUNvbmZpZyA9IFJvd09yQ29sdW1uSXRlbUNvbmZpZyB8IFN0YWNrSXRlbUNvbmZpZyB8IENvbXBvbmVudEl0ZW1Db25maWc7XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzQ2hpbGRJdGVtQ29uZmlnKGl0ZW1Db25maWc6IEl0ZW1Db25maWcpOiBpdGVtQ29uZmlnIGlzIENoaWxkSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgc3dpdGNoIChpdGVtQ29uZmlnLnR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5yb3c6XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29sdW1uOlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnN0YWNrOlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbXBvbmVudDpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmdyb3VuZDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnJlYWNoYWJsZUNhc2VFcnJvcignVVJPQ09TUENJQ0lDMTM2ODcnLCBpdGVtQ29uZmlnLnR5cGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZShpdGVtQ29uZmlnOiBSb3dPckNvbHVtbkl0ZW1Db25maWcsIHJvd0FuZENvbHVtbkNoaWxkTGVnYWN5U2l6ZURlZmF1bHQ6IGJvb2xlYW4pOiBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgeyBzaXplLCBzaXplVW5pdCB9ID0gSXRlbUNvbmZpZy5yZXNvbHZlU2l6ZShpdGVtQ29uZmlnLnNpemUsIGl0ZW1Db25maWcud2lkdGgsIGl0ZW1Db25maWcuaGVpZ2h0LCByb3dBbmRDb2x1bW5DaGlsZExlZ2FjeVNpemVEZWZhdWx0KTtcclxuICAgICAgICBjb25zdCB7IHNpemU6IG1pblNpemUsIHNpemVVbml0OiBtaW5TaXplVW5pdCB9ID0gSXRlbUNvbmZpZy5yZXNvbHZlTWluU2l6ZShpdGVtQ29uZmlnLm1pblNpemUsIGl0ZW1Db25maWcubWluV2lkdGgsIGl0ZW1Db25maWcubWluSGVpZ2h0KTtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiBpdGVtQ29uZmlnLnR5cGUsXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IFJvd09yQ29sdW1uSXRlbUNvbmZpZy5yZXNvbHZlQ29udGVudChpdGVtQ29uZmlnLmNvbnRlbnQpLFxyXG4gICAgICAgICAgICBzaXplLFxyXG4gICAgICAgICAgICBzaXplVW5pdCxcclxuICAgICAgICAgICAgbWluU2l6ZSxcclxuICAgICAgICAgICAgbWluU2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIGlkOiBJdGVtQ29uZmlnLnJlc29sdmVJZChpdGVtQ29uZmlnLmlkKSxcclxuICAgICAgICAgICAgaXNDbG9zYWJsZTogaXRlbUNvbmZpZy5pc0Nsb3NhYmxlID8/IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5pc0Nsb3NhYmxlLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBmcm9tUmVzb2x2ZWQocmVzb2x2ZWRDb25maWc6IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnKTogUm93T3JDb2x1bW5JdGVtQ29uZmlnIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IFJvd09yQ29sdW1uSXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogcmVzb2x2ZWRDb25maWcudHlwZSxcclxuICAgICAgICAgICAgY29udGVudDogZnJvbVJlc29sdmVkQ29udGVudChyZXNvbHZlZENvbmZpZy5jb250ZW50KSxcclxuICAgICAgICAgICAgc2l6ZTogZm9ybWF0U2l6ZShyZXNvbHZlZENvbmZpZy5zaXplLCByZXNvbHZlZENvbmZpZy5zaXplVW5pdCksXHJcbiAgICAgICAgICAgIG1pblNpemU6IGZvcm1hdFVuZGVmaW5hYmxlU2l6ZShyZXNvbHZlZENvbmZpZy5taW5TaXplLCByZXNvbHZlZENvbmZpZy5taW5TaXplVW5pdCksXHJcbiAgICAgICAgICAgIGlkOiByZXNvbHZlZENvbmZpZy5pZCxcclxuICAgICAgICAgICAgaXNDbG9zYWJsZTogcmVzb2x2ZWRDb25maWcuaXNDbG9zYWJsZSxcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVDb250ZW50KGNvbnRlbnQ6IENoaWxkSXRlbUNvbmZpZ1tdIHwgdW5kZWZpbmVkKTogUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcuQ2hpbGRJdGVtQ29uZmlnW10ge1xyXG4gICAgICAgIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gY29udGVudC5sZW5ndGg7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkSXRlbUNvbmZpZ3MgPSBuZXcgQXJyYXk8Um93T3JDb2x1bW5JdGVtQ29uZmlnLkNoaWxkSXRlbUNvbmZpZz4oY291bnQpO1xyXG4gICAgICAgICAgICBsZXQgd2lkdGhPckhlaWdodFNwZWNpZmllZEF0TGVhc3RPbmNlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGxldCBzaXplU3BlY2lmaWVkQXRMZWFzdE9uY2UgPSBmYWxzZTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZEl0ZW1Db25maWcgPSBjb250ZW50W2ldO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFSb3dPckNvbHVtbkl0ZW1Db25maWcuaXNDaGlsZEl0ZW1Db25maWcoY2hpbGRJdGVtQ29uZmlnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoJ0l0ZW1Db25maWcgaXMgbm90IFJvdywgQ29sdW1uIG9yIFN0YWNrJywgY2hpbGRJdGVtQ29uZmlnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzaXplU3BlY2lmaWVkQXRMZWFzdE9uY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZVdpZHRoSGVpZ2h0U3BlY2lmaWNhdGlvblR5cGUgPSBJdGVtQ29uZmlnLmNhbGN1bGF0ZVNpemVXaWR0aEhlaWdodFNwZWNpZmljYXRpb25UeXBlKGNoaWxkSXRlbUNvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc2l6ZVdpZHRoSGVpZ2h0U3BlY2lmaWNhdGlvblR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbUNvbmZpZy5TaXplV2lkdGhIZWlnaHRTcGVjaWZpY2F0aW9uVHlwZS5Ob25lOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtQ29uZmlnLlNpemVXaWR0aEhlaWdodFNwZWNpZmljYXRpb25UeXBlLldpZHRoT3JIZWlnaHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhPckhlaWdodFNwZWNpZmllZEF0TGVhc3RPbmNlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbUNvbmZpZy5TaXplV2lkdGhIZWlnaHRTcGVjaWZpY2F0aW9uVHlwZS5TaXplOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVTcGVjaWZpZWRBdExlYXN0T25jZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnJlYWNoYWJsZUNhc2VFcnJvcignUk9DSUNSQzg3NTU2Jywgc2l6ZVdpZHRoSGVpZ2h0U3BlY2lmaWNhdGlvblR5cGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkSXRlbUNvbmZpZ3NbaV0gPSBjaGlsZEl0ZW1Db25maWc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBsZWdhY3lTaXplRGVmYXVsdDogYm9vbGVhbjtcclxuICAgICAgICAgICAgaWYgKHNpemVTcGVjaWZpZWRBdExlYXN0T25jZSkge1xyXG4gICAgICAgICAgICAgICAgbGVnYWN5U2l6ZURlZmF1bHQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh3aWR0aE9ySGVpZ2h0U3BlY2lmaWVkQXRMZWFzdE9uY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZWdhY3lTaXplRGVmYXVsdCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGxlZ2FjeVNpemVEZWZhdWx0ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZy5DaGlsZEl0ZW1Db25maWc+KGNvdW50KTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZEl0ZW1Db25maWcgPSBjaGlsZEl0ZW1Db25maWdzW2ldO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRDaGlsZEl0ZW1Db25maWcgPSBJdGVtQ29uZmlnLnJlc29sdmUoY2hpbGRJdGVtQ29uZmlnLCBsZWdhY3lTaXplRGVmYXVsdCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIVJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnLmlzQ2hpbGRJdGVtQ29uZmlnKHJlc29sdmVkQ2hpbGRJdGVtQ29uZmlnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignVVJPQ09TUElDOTk1MTInLCBKU09OLnN0cmluZ2lmeShyZXNvbHZlZENoaWxkSXRlbUNvbmZpZykpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSByZXNvbHZlZENoaWxkSXRlbUNvbmZpZztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBmdW5jdGlvbiBmcm9tUmVzb2x2ZWRDb250ZW50KHJlc29sdmVkQ29udGVudDogcmVhZG9ubHkgUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcuQ2hpbGRJdGVtQ29uZmlnW10pOiBSb3dPckNvbHVtbkl0ZW1Db25maWcuQ2hpbGRJdGVtQ29uZmlnW10ge1xyXG4gICAgICAgIGNvbnN0IGNvdW50ID0gcmVzb2x2ZWRDb250ZW50Lmxlbmd0aDtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8Um93T3JDb2x1bW5JdGVtQ29uZmlnLkNoaWxkSXRlbUNvbmZpZz4oY291bnQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZENvbnRlbnRDb25maWcgPSByZXNvbHZlZENvbnRlbnRbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSByZXNvbHZlZENvbnRlbnRDb25maWcudHlwZTtcclxuICAgICAgICAgICAgbGV0IGNvbnRlbnRDb25maWc6IFJvd09yQ29sdW1uSXRlbUNvbmZpZy5DaGlsZEl0ZW1Db25maWc7XHJcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5yb3c6XHJcbiAgICAgICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbHVtbjpcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50Q29uZmlnID0gUm93T3JDb2x1bW5JdGVtQ29uZmlnLmZyb21SZXNvbHZlZChyZXNvbHZlZENvbnRlbnRDb25maWcpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5zdGFjazpcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50Q29uZmlnID0gU3RhY2tJdGVtQ29uZmlnLmZyb21SZXNvbHZlZChyZXNvbHZlZENvbnRlbnRDb25maWcpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb21wb25lbnQ6XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudENvbmZpZyA9IENvbXBvbmVudEl0ZW1Db25maWcuZnJvbVJlc29sdmVkKHJlc29sdmVkQ29udGVudENvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnJlYWNoYWJsZUNhc2VFcnJvcignUk9DSUNGUkM0NDc5NycsIHR5cGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlc3VsdFtpXSA9IGNvbnRlbnRDb25maWc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCB0eXBlIFJvb3RJdGVtQ29uZmlnID0gUm93T3JDb2x1bW5JdGVtQ29uZmlnIHwgU3RhY2tJdGVtQ29uZmlnIHwgQ29tcG9uZW50SXRlbUNvbmZpZztcclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgUm9vdEl0ZW1Db25maWcge1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzUm9vdEl0ZW1Db25maWcoaXRlbUNvbmZpZzogSXRlbUNvbmZpZyk6IGl0ZW1Db25maWcgaXMgUm9vdEl0ZW1Db25maWcge1xyXG4gICAgICAgIHN3aXRjaCAoaXRlbUNvbmZpZy50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUucm93OlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbHVtbjpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5zdGFjazpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb21wb25lbnQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5ncm91bmQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWFjaGFibGVDYXNlRXJyb3IoJ1VSSUNJUjIzNjg3JywgaXRlbUNvbmZpZy50eXBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUoaXRlbUNvbmZpZzogUm9vdEl0ZW1Db25maWcgfCB1bmRlZmluZWQpOiBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBpZiAoaXRlbUNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gSXRlbUNvbmZpZy5yZXNvbHZlKGl0ZW1Db25maWcsIGZhbHNlKTtcclxuICAgICAgICAgICAgaWYgKCFSZXNvbHZlZFJvb3RJdGVtQ29uZmlnLmlzUm9vdEl0ZW1Db25maWcocmVzdWx0KSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcignSXRlbUNvbmZpZyBpcyBub3QgUm93LCBDb2x1bW4gb3IgU3RhY2snLCBKU09OLnN0cmluZ2lmeShpdGVtQ29uZmlnKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBmcm9tUmVzb2x2ZWRPclVuZGVmaW5lZChyZXNvbHZlZEl0ZW1Db25maWc6IFJlc29sdmVkUm9vdEl0ZW1Db25maWcgfCB1bmRlZmluZWQpOiBSb290SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgaWYgKHJlc29sdmVkSXRlbUNvbmZpZyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgdHlwZSA9IHJlc29sdmVkSXRlbUNvbmZpZy50eXBlO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUucm93OlxyXG4gICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb2x1bW46XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJvd09yQ29sdW1uSXRlbUNvbmZpZy5mcm9tUmVzb2x2ZWQocmVzb2x2ZWRJdGVtQ29uZmlnKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuc3RhY2s6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0YWNrSXRlbUNvbmZpZy5mcm9tUmVzb2x2ZWQocmVzb2x2ZWRJdGVtQ29uZmlnKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29tcG9uZW50OlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBDb21wb25lbnRJdGVtQ29uZmlnLmZyb21SZXNvbHZlZChyZXNvbHZlZEl0ZW1Db25maWcpO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWFjaGFibGVDYXNlRXJyb3IoJ1JJQ0ZST1U4OTkyMScsIHR5cGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIExheW91dENvbmZpZyB7XHJcbiAgICByb290OiBSb290SXRlbUNvbmZpZyB8IHVuZGVmaW5lZDtcclxuICAgIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIChMYXlvdXRDb25maWc6aW50ZXJmYWNlKS5yb290fSAqL1xyXG4gICAgY29udGVudD86IChSb3dPckNvbHVtbkl0ZW1Db25maWcgfCBTdGFja0l0ZW1Db25maWcgfCBDb21wb25lbnRJdGVtQ29uZmlnKVtdO1xyXG4gICAgb3BlblBvcG91dHM/OiBQb3BvdXRMYXlvdXRDb25maWdbXTtcclxuICAgIGRpbWVuc2lvbnM/OiBMYXlvdXRDb25maWcuRGltZW5zaW9ucztcclxuICAgIHNldHRpbmdzPzogTGF5b3V0Q29uZmlnLlNldHRpbmdzO1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKExheW91dENvbmZpZzppbnRlcmZhY2UpLmhlYWRlcn0gaW5zdGVhZCAqL1xyXG4gICAgbGFiZWxzPzogTGF5b3V0Q29uZmlnLkxhYmVscztcclxuICAgIGhlYWRlcj86IExheW91dENvbmZpZy5IZWFkZXI7XHJcbn1cclxuXHJcbi8qKiBVc2UgdG8gc3BlY2lmeSBMYXlvdXRDb25maWcgd2l0aCBkZWZhdWx0cyBvciBkZXNlcmlhbGlzZSBhIExheW91dENvbmZpZy5cclxuICogRGVzZXJpYWxpc2F0aW9uIHdpbGwgaGFuZGxlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxyXG4gKiBOb3RlIHRoYXQgTGF5b3V0Q29uZmlnIHNob3VsZCBiZSB1c2VkIGZvciBzZXJpYWxpc2F0aW9uIChub3QgTGF5b3V0Q29uZmlnKVxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIExheW91dENvbmZpZyB7XHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVwcmVjYXRlZCB1c2UgJHtAbGluayAoTGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKEhlYWRlcjppbnRlcmZhY2UpLnNob3d9IGluc3RlYWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBoYXNIZWFkZXJzPzogYm9vbGVhbjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgdHJ1ZSwgdGhlIHVzZXIgY2FuIGRyYWcgY29tcG9uZW50cyBmcm9tIG9uZSB3aW5kb3cgdG8gYW5vdGhlci5cclxuICAgICAgICAgKiBEZWZhdWx0OiB0cnVlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZHJhZ0JldHdlZW5XaW5kb3dzPzogYm9vbGVhbjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgdHJ1ZSwgdGhlIHVzZXIgY2FuIGRyYWcgYW5kIGRyb3AgY29tcG9uZW50cyBvdXRzaWRlIHRoZWlyIGNvbnRhaW5pbmcgd2luZG93LCBjcmVhdGluZyBhIG5ldyBwb3BvdXQgd2luZG93LlxyXG4gICAgICAgICAqIERlZmF1bHQ6IHRydWVcclxuICAgICAgICAgKi9cclxuICAgICAgICBkcmFnVG9OZXdXaW5kb3c/OiBib29sZWFuO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0cnVlLCB0aGUgdXNlciBjYW4gcmUtYXJyYW5nZSB0aGUgbGF5b3V0IGJ5IGRyYWdnaW5nIGl0ZW1zIGJ5IHRoZWlyIHRhYnMgdG8gdGhlIGRlc2lyZWQgbG9jYXRpb24uXHJcbiAgICAgICAgICogQ2FuIGJlIG92ZXJyaWRkZW4gYnkgSXRlbUNvbmZpZy5yZW9yZGVyRW5hYmxlZCBmb3Igc3BlY2lmaWMgSXRlbUNvbmZpZ3NcclxuICAgICAgICAgKiBEZWZhdWx0OiB0cnVlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcmVvcmRlckVuYWJsZWQ/OiBib29sZWFuO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBEZWNpZGVzIHdoYXQgd2lsbCBiZSBvcGVuZWQgaW4gYSBuZXcgd2luZG93IGlmIHRoZSB1c2VyIGNsaWNrcyB0aGUgcG9wb3V0IGljb24uIElmIHRydWUgdGhlIGVudGlyZSBzdGFjayB3aWxsXHJcbiAgICAgICAgICogYmUgdHJhbnNmZXJyZWQgdG8gdGhlIG5ldyB3aW5kb3csIGlmIGZhbHNlIG9ubHkgdGhlIGFjdGl2ZSBjb21wb25lbnQgd2lsbCBiZSBvcGVuZWQuXHJcbiAgICAgICAgICogRGVmYXVsdDogZmFsc2VcclxuICAgICAgICAgKi9cclxuICAgICAgICBwb3BvdXRXaG9sZVN0YWNrPzogYm9vbGVhbjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU3BlY2lmaWVzIGlmIGFuIGVycm9yIGlzIHRocm93biB3aGVuIGEgcG9wb3V0IGlzIGJsb2NrZWQgYnkgdGhlIGJyb3dzZXIgKGUuZy4gYnkgb3BlbmluZyBpdCBwcm9ncmFtbWF0aWNhbGx5KS5cclxuICAgICAgICAgKiBJZiBmYWxzZSwgdGhlIHBvcG91dCBjYWxsIHdpbGwgZmFpbCBzaWxlbnRseS5cclxuICAgICAgICAgKiBEZWZhdWx0OiB0cnVlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgYmxvY2tlZFBvcG91dHNUaHJvd0Vycm9yPzogYm9vbGVhbjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU3BlY2lmaWVzIGlmIGFsbCBwb3BvdXRzIHNob3VsZCBiZSBjbG9zZWQgd2hlbiB0aGUgcGFnZSB0aGF0IGNyZWF0ZWQgdGhlbSBpcyBjbG9zZWQuIFBvcG91dHMgZG9uJ3QgaGF2ZSBhXHJcbiAgICAgICAgICogc3Ryb25nIGRlcGVuZGVuY3kgb24gdGhlaXIgcGFyZW50IGFuZCBjYW4gZXhpc3Qgb24gdGhlaXIgb3duLCBidXQgY2FuIGJlIHF1aXRlIGFubm95aW5nIHRvIGNsb3NlIGJ5IGhhbmQuIEluXHJcbiAgICAgICAgICogYWRkaXRpb24sIGFueSBjaGFuZ2VzIG1hZGUgdG8gcG9wb3V0cyB3b24ndCBiZSBzdG9yZWQgYWZ0ZXIgdGhlIHBhcmVudCBpcyBjbG9zZWQuXHJcbiAgICAgICAgICogRGVmYXVsdDogdHJ1ZVxyXG4gICAgICAgICAqIEBkZXByZWNhdGVkIFdpbGwgYmUgcmVtb3ZlZCBpbiB2ZXJzaW9uIDMuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY2xvc2VQb3BvdXRzT25VbmxvYWQ/OiBib29sZWFuO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTcGVjaWZpZXMgaWYgdGhlIHBvcG91dCBpY29uIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIGhlYWRlci1iYXIuXHJcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoTGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKEhlYWRlcjppbnRlcmZhY2UpLnBvcG91dH0gaW5zdGVhZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHNob3dQb3BvdXRJY29uPzogYm9vbGVhbjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU3BlY2lmaWVzIGlmIHRoZSBtYXhpbWlzZSBpY29uIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIGhlYWRlci1iYXIuXHJcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoTGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKEhlYWRlcjppbnRlcmZhY2UpLm1heGltaXNlfSBpbnN0ZWFkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgc2hvd01heGltaXNlSWNvbj86IGJvb2xlYW47XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFNwZWNpZmllcyBpZiB0aGUgY2xvc2UgaWNvbiBzaG91bGQgYmUgZGlzcGxheWVkIGluIHRoZSBoZWFkZXItYmFyLlxyXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKExheW91dENvbmZpZzpuYW1lc3BhY2UpLihIZWFkZXI6aW50ZXJmYWNlKS5jbG9zZX0gaW5zdGVhZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHNob3dDbG9zZUljb24/OiBib29sZWFuO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTcGVjaWZpZXMgUmVzcG9uc2l2ZSBNb2RlIChtb3JlIGluZm8gbmVlZGVkKS5cclxuICAgICAgICAgKiBEZWZhdWx0OiBub25lXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcmVzcG9uc2l2ZU1vZGU/OiBSZXNwb25zaXZlTW9kZTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogU3BlY2lmaWVzIE1heGltdW0gcGl4ZWwgb3ZlcmxhcCBwZXIgdGFiLlxyXG4gICAgICAgICAqIERlZmF1bHQ6IDBcclxuICAgICAgICAgKi9cclxuICAgICAgICB0YWJPdmVybGFwQWxsb3dhbmNlPzogbnVtYmVyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIERlZmF1bHQ6IHRydWVcclxuICAgICAgICAgKi9cclxuICAgICAgICByZW9yZGVyT25UYWJNZW51Q2xpY2s/OiBib29sZWFuO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBEZWZhdWx0OiAxMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRhYkNvbnRyb2xPZmZzZXQ/OiBudW1iZXI7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIHBvcCBpbiBlbGVtZW50cyB3aGVuIGNsb3NpbmcgYSBwb3BvdXQgd2luZG93LlxyXG4gICAgICAgICAqIERlZmF1bHQ6IGZhbHNlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcG9wSW5PbkNsb3NlPzogYm9vbGVhbjtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgbmFtZXNwYWNlIFNldHRpbmdzIHtcclxuICAgICAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZShzZXR0aW5nczogU2V0dGluZ3MgfCB1bmRlZmluZWQpOiBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncyB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MgPSB7XHJcbiAgICAgICAgICAgICAgICBkcmFnQmV0d2VlbldpbmRvd3M6IHNldHRpbmdzPy5kcmFnQmV0d2VlbldpbmRvd3MgPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuZGVmYXVsdHMuZHJhZ0JldHdlZW5XaW5kb3dzLFxyXG4gICAgICAgICAgICAgICAgZHJhZ1RvTmV3V2luZG93OiBzZXR0aW5ncz8uZHJhZ1RvTmV3V2luZG93ID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzLmRlZmF1bHRzLmRyYWdUb05ld1dpbmRvdyxcclxuICAgICAgICAgICAgICAgIHJlb3JkZXJFbmFibGVkOiBzZXR0aW5ncz8ucmVvcmRlckVuYWJsZWQgPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuZGVmYXVsdHMucmVvcmRlckVuYWJsZWQsXHJcbiAgICAgICAgICAgICAgICBwb3BvdXRXaG9sZVN0YWNrOiBzZXR0aW5ncz8ucG9wb3V0V2hvbGVTdGFjayA/PyBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5kZWZhdWx0cy5wb3BvdXRXaG9sZVN0YWNrLFxyXG4gICAgICAgICAgICAgICAgYmxvY2tlZFBvcG91dHNUaHJvd0Vycm9yOiBzZXR0aW5ncz8uYmxvY2tlZFBvcG91dHNUaHJvd0Vycm9yID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzLmRlZmF1bHRzLmJsb2NrZWRQb3BvdXRzVGhyb3dFcnJvcixcclxuICAgICAgICAgICAgICAgIGNsb3NlUG9wb3V0c09uVW5sb2FkOiBzZXR0aW5ncz8uY2xvc2VQb3BvdXRzT25VbmxvYWQgPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuZGVmYXVsdHMuY2xvc2VQb3BvdXRzT25VbmxvYWQsXHJcbiAgICAgICAgICAgICAgICByZXNwb25zaXZlTW9kZTogc2V0dGluZ3M/LnJlc3BvbnNpdmVNb2RlID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzLmRlZmF1bHRzLnJlc3BvbnNpdmVNb2RlLFxyXG4gICAgICAgICAgICAgICAgdGFiT3ZlcmxhcEFsbG93YW5jZTogc2V0dGluZ3M/LnRhYk92ZXJsYXBBbGxvd2FuY2UgPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuZGVmYXVsdHMudGFiT3ZlcmxhcEFsbG93YW5jZSxcclxuICAgICAgICAgICAgICAgIHJlb3JkZXJPblRhYk1lbnVDbGljazogc2V0dGluZ3M/LnJlb3JkZXJPblRhYk1lbnVDbGljayA/PyBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5kZWZhdWx0cy5yZW9yZGVyT25UYWJNZW51Q2xpY2ssXHJcbiAgICAgICAgICAgICAgICB0YWJDb250cm9sT2Zmc2V0OiBzZXR0aW5ncz8udGFiQ29udHJvbE9mZnNldCA/PyBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5kZWZhdWx0cy50YWJDb250cm9sT2Zmc2V0LFxyXG4gICAgICAgICAgICAgICAgcG9wSW5PbkNsb3NlOiBzZXR0aW5ncz8ucG9wSW5PbkNsb3NlID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzLmRlZmF1bHRzLnBvcEluT25DbG9zZSxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIERpbWVuc2lvbnMge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgYm9yZGVycyBiZXR3ZWVuIHRoZSBsYXlvdXQgaXRlbXMgaW4gcGl4ZWwuIFBsZWFzZSBub3RlOiBUaGUgYWN0dWFsIGRyYWdnYWJsZSBhcmVhIGlzIHdpZGVyXHJcbiAgICAgICAgICogdGhhbiB0aGUgdmlzaWJsZSBvbmUsIG1ha2luZyBpdCBzYWZlIHRvIHNldCB0aGlzIHRvIHNtYWxsIHZhbHVlcyB3aXRob3V0IGFmZmVjdGluZyB1c2FiaWxpdHkuXHJcbiAgICAgICAgICogRGVmYXVsdDogNVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGJvcmRlcldpZHRoPzogbnVtYmVyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBEZWZhdWx0OiAxNVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGJvcmRlckdyYWJXaWR0aD86IG51bWJlcixcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG1pbmltdW0gaGVpZ2h0IGFuIGl0ZW0gY2FuIGJlIHJlc2l6ZWQgdG8gKGluIHBpeGVsKS5cclxuICAgICAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChMYXlvdXRDb25maWc6bmFtZXNwYWNlKS4oRGltZW5zaW9uczppbnRlcmZhY2UpLmRlZmF1bHRNaW5JdGVtSGVpZ2h0fSBpbnN0ZWFkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgbWluSXRlbUhlaWdodD86IG51bWJlcjtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG1pbmltdW0gaGVpZ2h0IGFuIGl0ZW0gY2FuIGJlIHJlc2l6ZWQgdG8uXHJcbiAgICAgICAgICogRGVmYXVsdDogMFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGRlZmF1bHRNaW5JdGVtSGVpZ2h0Pzogc3RyaW5nO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbWluaW11bSB3aWR0aCBhbiBpdGVtIGNhbiBiZSByZXNpemVkIHRvIChpbiBwaXhlbCkuXHJcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoTGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKERpbWVuc2lvbnM6aW50ZXJmYWNlKS5kZWZhdWx0TWluSXRlbVdpZHRofSBpbnN0ZWFkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgbWluSXRlbVdpZHRoPzogbnVtYmVyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgbWluaW11bSB3aWR0aCBhbiBpdGVtIGNhbiBiZSByZXNpemVkIHRvLlxyXG4gICAgICAgICAqIERlZmF1bHQ6IDEwcHhcclxuICAgICAgICAgKi9cclxuICAgICAgICBkZWZhdWx0TWluSXRlbVdpZHRoPzogc3RyaW5nO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBoZWFkZXIgZWxlbWVudHMgaW4gcGl4ZWwuIFRoaXMgY2FuIGJlIGNoYW5nZWQsIGJ1dCB5b3VyIHRoZW1lJ3MgaGVhZGVyIGNzcyBuZWVkcyB0byBiZVxyXG4gICAgICAgICAqIGFkanVzdGVkIGFjY29yZGluZ2x5LlxyXG4gICAgICAgICAqIERlZmF1bHQ6IDIwXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaGVhZGVySGVpZ2h0PzogbnVtYmVyO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgd2lkdGggb2YgdGhlIGVsZW1lbnQgdGhhdCBhcHBlYXJzIHdoZW4gYW4gaXRlbSBpcyBkcmFnZ2VkIChpbiBwaXhlbCkuXHJcbiAgICAgICAgICogRGVmYXVsdDogMzAwXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZHJhZ1Byb3h5V2lkdGg/OiBudW1iZXI7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIGVsZW1lbnQgdGhhdCBhcHBlYXJzIHdoZW4gYW4gaXRlbSBpcyBkcmFnZ2VkIChpbiBwaXhlbCkuXHJcbiAgICAgICAgICogRGVmYXVsdDogMjAwXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZHJhZ1Byb3h5SGVpZ2h0PzogbnVtYmVyO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBuYW1lc3BhY2UgRGltZW5zaW9ucyB7XHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKGRpbWVuc2lvbnM6IERpbWVuc2lvbnMgfCB1bmRlZmluZWQpOiBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zIHtcclxuICAgICAgICAgICAgY29uc3QgeyBzaXplOiBkZWZhdWx0TWluSXRlbUhlaWdodCwgc2l6ZVVuaXQ6IGRlZmF1bHRNaW5JdGVtSGVpZ2h0VW5pdCB9ID0gRGltZW5zaW9ucy5yZXNvbHZlRGVmYXVsdE1pbkl0ZW1IZWlnaHQoZGltZW5zaW9ucyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgc2l6ZTogZGVmYXVsdE1pbkl0ZW1XaWR0aCwgc2l6ZVVuaXQ6IGRlZmF1bHRNaW5JdGVtV2lkdGhVbml0IH0gPSBEaW1lbnNpb25zLnJlc29sdmVEZWZhdWx0TWluSXRlbVdpZHRoKGRpbWVuc2lvbnMpO1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICBib3JkZXJXaWR0aDogZGltZW5zaW9ucz8uYm9yZGVyV2lkdGggPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucy5kZWZhdWx0cy5ib3JkZXJXaWR0aCxcclxuICAgICAgICAgICAgICAgIGJvcmRlckdyYWJXaWR0aDogZGltZW5zaW9ucz8uYm9yZGVyR3JhYldpZHRoID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMuZGVmYXVsdHMuYm9yZGVyR3JhYldpZHRoLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdE1pbkl0ZW1IZWlnaHQsXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0TWluSXRlbUhlaWdodFVuaXQsXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0TWluSXRlbVdpZHRoLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdE1pbkl0ZW1XaWR0aFVuaXQsXHJcbiAgICAgICAgICAgICAgICBoZWFkZXJIZWlnaHQ6IGRpbWVuc2lvbnM/LmhlYWRlckhlaWdodCA/PyBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zLmRlZmF1bHRzLmhlYWRlckhlaWdodCxcclxuICAgICAgICAgICAgICAgIGRyYWdQcm94eVdpZHRoOiBkaW1lbnNpb25zPy5kcmFnUHJveHlXaWR0aCA/PyBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zLmRlZmF1bHRzLmRyYWdQcm94eVdpZHRoLFxyXG4gICAgICAgICAgICAgICAgZHJhZ1Byb3h5SGVpZ2h0OiBkaW1lbnNpb25zPy5kcmFnUHJveHlIZWlnaHQgPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucy5kZWZhdWx0cy5kcmFnUHJveHlIZWlnaHQsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBleHBvcnQgZnVuY3Rpb24gZnJvbVJlc29sdmVkKHJlc29sdmVkRGltZW5zaW9uczogUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucyk6IERpbWVuc2lvbnMge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IERpbWVuc2lvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICBib3JkZXJXaWR0aDogcmVzb2x2ZWREaW1lbnNpb25zLmJvcmRlcldpZHRoLFxyXG4gICAgICAgICAgICAgICAgYm9yZGVyR3JhYldpZHRoOiByZXNvbHZlZERpbWVuc2lvbnMuYm9yZGVyR3JhYldpZHRoLFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdE1pbkl0ZW1IZWlnaHQ6IGZvcm1hdFNpemUocmVzb2x2ZWREaW1lbnNpb25zLmRlZmF1bHRNaW5JdGVtSGVpZ2h0LCByZXNvbHZlZERpbWVuc2lvbnMuZGVmYXVsdE1pbkl0ZW1IZWlnaHRVbml0KSxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRNaW5JdGVtV2lkdGg6IGZvcm1hdFNpemUocmVzb2x2ZWREaW1lbnNpb25zLmRlZmF1bHRNaW5JdGVtV2lkdGgsIHJlc29sdmVkRGltZW5zaW9ucy5kZWZhdWx0TWluSXRlbVdpZHRoVW5pdCksXHJcbiAgICAgICAgICAgICAgICBoZWFkZXJIZWlnaHQ6IHJlc29sdmVkRGltZW5zaW9ucy5oZWFkZXJIZWlnaHQsXHJcbiAgICAgICAgICAgICAgICBkcmFnUHJveHlXaWR0aDogcmVzb2x2ZWREaW1lbnNpb25zLmRyYWdQcm94eVdpZHRoLFxyXG4gICAgICAgICAgICAgICAgZHJhZ1Byb3h5SGVpZ2h0OiByZXNvbHZlZERpbWVuc2lvbnMuZHJhZ1Byb3h5SGVpZ2h0LFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURlZmF1bHRNaW5JdGVtSGVpZ2h0KGRpbWVuc2lvbnM6IERpbWVuc2lvbnMgfCB1bmRlZmluZWQpOiBTaXplV2l0aFVuaXQge1xyXG4gICAgICAgICAgICBjb25zdCBoZWlnaHQgPSBkaW1lbnNpb25zPy5kZWZhdWx0TWluSXRlbUhlaWdodDtcclxuICAgICAgICAgICAgaWYgKGhlaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBzaXplOiBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zLmRlZmF1bHRzLmRlZmF1bHRNaW5JdGVtSGVpZ2h0LCBzaXplVW5pdDogUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucy5kZWZhdWx0cy5kZWZhdWx0TWluSXRlbUhlaWdodFVuaXQgfTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZVNpemUoaGVpZ2h0LCBbU2l6ZVVuaXRFbnVtLlBpeGVsXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURlZmF1bHRNaW5JdGVtV2lkdGgoZGltZW5zaW9uczogRGltZW5zaW9ucyB8IHVuZGVmaW5lZCk6IFNpemVXaXRoVW5pdCB7XHJcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gZGltZW5zaW9ucz8uZGVmYXVsdE1pbkl0ZW1XaWR0aDtcclxuICAgICAgICAgICAgaWYgKHdpZHRoID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IHNpemU6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMuZGVmYXVsdHMuZGVmYXVsdE1pbkl0ZW1XaWR0aCwgc2l6ZVVuaXQ6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMuZGVmYXVsdHMuZGVmYXVsdE1pbkl0ZW1XaWR0aFVuaXQgfTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZVNpemUod2lkdGgsIFtTaXplVW5pdEVudW0uUGl4ZWxdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIExhYmVscyB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoTGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKEhlYWRlcjppbnRlcmZhY2UpLmNsb3NlfSBpbnN0ZWFkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY2xvc2U/OiBzdHJpbmc7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKExheW91dENvbmZpZzpuYW1lc3BhY2UpLihIZWFkZXI6aW50ZXJmYWNlKS5tYXhpbWlzZX0gaW5zdGVhZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIG1heGltaXNlPzogc3RyaW5nO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChMYXlvdXRDb25maWc6bmFtZXNwYWNlKS4oSGVhZGVyOmludGVyZmFjZSkubWluaW1pc2V9IGluc3RlYWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBtaW5pbWlzZT86IHN0cmluZztcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoTGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKEhlYWRlcjppbnRlcmZhY2UpLnBvcGlufSBpbnN0ZWFkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcG9waW4/OiBzdHJpbmc7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKExheW91dENvbmZpZzpuYW1lc3BhY2UpLihIZWFkZXI6aW50ZXJmYWNlKS5wb3BvdXR9IGluc3RlYWRcclxuICAgICAgICAgKi9cclxuICAgICAgICBwb3BvdXQ/OiBzdHJpbmc7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKExheW91dENvbmZpZzpuYW1lc3BhY2UpLihIZWFkZXI6aW50ZXJmYWNlKS50YWJEcm9wZG93bn0gaW5zdGVhZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRhYkRyb3Bkb3duPzogc3RyaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgSGVhZGVyIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBTcGVjaWZpZXMgd2hldGhlciBoZWFkZXIgc2hvdWxkIGJlIGRpc3BsYXllZCwgYW5kIGlmIHNvLCBvbiB3aGljaCBzaWRlLlxyXG4gICAgICAgICAqIElmIGZhbHNlLCB0aGUgbGF5b3V0IHdpbGwgYmUgZGlzcGxheWVkIHdpdGggc3BsaXR0ZXJzIG9ubHkuXHJcbiAgICAgICAgICogRGVmYXVsdDogJ3RvcCdcclxuICAgICAgICAgKi9cclxuICAgICAgICBzaG93PzogZmFsc2UgfCBTaWRlO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSB0b29sdGlwIHRleHQgdGhhdCBhcHBlYXJzIHdoZW4gaG92ZXJpbmcgb3ZlciB0aGUgcG9wb3V0IGljb24gb3IgZmFsc2UgaWYgcG9wb3V0IGJ1dHRvbiBub3QgZGlzcGxheWVkLlxyXG4gICAgICAgICAqIERlZmF1bHQ6ICdvcGVuIGluIG5ldyB3aW5kb3cnXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcG9wb3V0PzogZmFsc2UgfCBzdHJpbmc7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHRvb2x0aXAgdGV4dCB0aGF0IGFwcGVhcnMgd2hlbiBob3ZlcmluZyBvdmVyIHRoZSBwb3BpbiBpY29uLlxyXG4gICAgICAgICAqIERlZmF1bHQ6ICdwb3AgaW4nXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcG9waW4/OiBzdHJpbmc7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHRvb2x0aXAgdGV4dCB0aGF0IGFwcGVhcnMgd2hlbiBob3ZlcmluZyBvdmVyIHRoZSBtYXhpbWlzZSBpY29uIG9yIGZhbHNlIGlmIG1heGltaXNlZCBidXR0b24gbm90IGRpc3BsYXllZC5cclxuICAgICAgICAgKiBEZWZhdWx0OiAnbWF4aW1pc2UnXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgbWF4aW1pc2U/OiBmYWxzZSB8IHN0cmluZztcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgdG9vbHRpcCB0ZXh0IHRoYXQgYXBwZWFycyB3aGVuIGhvdmVyaW5nIG92ZXIgdGhlIGNsb3NlIGljb24uXHJcbiAgICAgICAgICogRGVmYXVsdDogJ2Nsb3NlJ1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNsb3NlPzogZmFsc2UgfCBzdHJpbmc7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIHRvb2x0aXAgdGV4dCB0aGF0IGFwcGVhcnMgd2hlbiBob3ZlcmluZyBvdmVyIHRoZSBtaW5pbWlzZSBpY29uLlxyXG4gICAgICAgICAqIERlZmF1bHQ6ICdtaW5pbWlzZSdcclxuICAgICAgICAgKi9cclxuICAgICAgICBtaW5pbWlzZT86IHN0cmluZztcclxuICAgICAgICAvKipcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIERlZmF1bHQ6ICdhZGRpdGlvbmFsIHRhYnMnXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGFiRHJvcGRvd24/OiBmYWxzZSB8IHN0cmluZztcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgbmFtZXNwYWNlIEhlYWRlciB7XHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIGV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKGhlYWRlcjogSGVhZGVyIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBzZXR0aW5nczogTGF5b3V0Q29uZmlnLlNldHRpbmdzIHwgdW5kZWZpbmVkLCBsYWJlbHM6IExheW91dENvbmZpZy5MYWJlbHMgfCB1bmRlZmluZWRcclxuICAgICAgICApOiBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIge1xyXG4gICAgICAgICAgICBsZXQgc2hvdzogZmFsc2UgfCBTaWRlO1xyXG4gICAgICAgICAgICBpZiAoaGVhZGVyPy5zaG93ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHNob3cgPSBoZWFkZXIuc2hvdztcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncyAhPT0gdW5kZWZpbmVkICYmIHNldHRpbmdzLmhhc0hlYWRlcnMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNob3cgPSBzZXR0aW5ncy5oYXNIZWFkZXJzID8gUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyLmRlZmF1bHRzLnNob3cgOiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2hvdyA9IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlci5kZWZhdWx0cy5zaG93O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyID0ge1xyXG4gICAgICAgICAgICAgICAgc2hvdyxcclxuICAgICAgICAgICAgICAgIHBvcG91dDogaGVhZGVyPy5wb3BvdXQgPz8gbGFiZWxzPy5wb3BvdXQgPz9cclxuICAgICAgICAgICAgICAgICAgICAoc2V0dGluZ3M/LnNob3dQb3BvdXRJY29uID09PSBmYWxzZSA/IGZhbHNlIDogUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyLmRlZmF1bHRzLnBvcG91dCksXHJcbiAgICAgICAgICAgICAgICBwb3BpbjogaGVhZGVyPy5wb3BpbiA/PyBsYWJlbHM/LnBvcGluID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlci5kZWZhdWx0cy5wb3BpbixcclxuICAgICAgICAgICAgICAgIG1heGltaXNlOiBoZWFkZXI/Lm1heGltaXNlID8/IGxhYmVscz8ubWF4aW1pc2UgPz9cclxuICAgICAgICAgICAgICAgICAgICAoc2V0dGluZ3M/LnNob3dNYXhpbWlzZUljb24gPT09IGZhbHNlID8gZmFsc2UgOiBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIuZGVmYXVsdHMubWF4aW1pc2UpLFxyXG4gICAgICAgICAgICAgICAgY2xvc2U6IGhlYWRlcj8uY2xvc2UgPz8gbGFiZWxzPy5jbG9zZSA/P1xyXG4gICAgICAgICAgICAgICAgICAgIChzZXR0aW5ncz8uc2hvd0Nsb3NlSWNvbiA9PT0gZmFsc2UgPyBmYWxzZSA6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlci5kZWZhdWx0cy5jbG9zZSksXHJcbiAgICAgICAgICAgICAgICBtaW5pbWlzZTogaGVhZGVyPy5taW5pbWlzZSA/PyBsYWJlbHM/Lm1pbmltaXNlID8/IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlci5kZWZhdWx0cy5taW5pbWlzZSxcclxuICAgICAgICAgICAgICAgIHRhYkRyb3Bkb3duOiBoZWFkZXI/LnRhYkRyb3Bkb3duID8/IGxhYmVscz8udGFiRHJvcGRvd24gPz8gUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyLmRlZmF1bHRzLnRhYkRyb3Bkb3duLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc1BvcG91dChjb25maWc6IExheW91dENvbmZpZyk6IGNvbmZpZyBpcyBQb3BvdXRMYXlvdXRDb25maWcge1xyXG4gICAgICAgIHJldHVybiAncGFyZW50SWQnIGluIGNvbmZpZyB8fCAnaW5kZXhJblBhcmVudCcgaW4gY29uZmlnIHx8ICd3aW5kb3cnIGluIGNvbmZpZztcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZShsYXlvdXRDb25maWc6IExheW91dENvbmZpZyk6IFJlc29sdmVkTGF5b3V0Q29uZmlnIHtcclxuICAgICAgICBpZiAoaXNQb3BvdXQobGF5b3V0Q29uZmlnKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gUG9wb3V0TGF5b3V0Q29uZmlnLnJlc29sdmUobGF5b3V0Q29uZmlnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgcm9vdDogUm9vdEl0ZW1Db25maWcgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGlmIChsYXlvdXRDb25maWcucm9vdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByb290ID0gbGF5b3V0Q29uZmlnLnJvb3Q7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobGF5b3V0Q29uZmlnLmNvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiBsYXlvdXRDb25maWcuY29udGVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm9vdCA9IGxheW91dENvbmZpZy5jb250ZW50WzBdO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByb290ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZzogUmVzb2x2ZWRMYXlvdXRDb25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlZDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHJvb3Q6IFJvb3RJdGVtQ29uZmlnLnJlc29sdmUocm9vdCksXHJcbiAgICAgICAgICAgICAgICBvcGVuUG9wb3V0czogTGF5b3V0Q29uZmlnLnJlc29sdmVPcGVuUG9wb3V0cyhsYXlvdXRDb25maWcub3BlblBvcG91dHMpLFxyXG4gICAgICAgICAgICAgICAgZGltZW5zaW9uczogTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMucmVzb2x2ZShsYXlvdXRDb25maWcuZGltZW5zaW9ucyksXHJcbiAgICAgICAgICAgICAgICBzZXR0aW5nczogTGF5b3V0Q29uZmlnLlNldHRpbmdzLnJlc29sdmUobGF5b3V0Q29uZmlnLnNldHRpbmdzKSxcclxuICAgICAgICAgICAgICAgIGhlYWRlcjogTGF5b3V0Q29uZmlnLkhlYWRlci5yZXNvbHZlKGxheW91dENvbmZpZy5oZWFkZXIsIGxheW91dENvbmZpZy5zZXR0aW5ncywgbGF5b3V0Q29uZmlnLmxhYmVscyksXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGNvbmZpZztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGZyb21SZXNvbHZlZChjb25maWc6IFJlc29sdmVkTGF5b3V0Q29uZmlnKTogTGF5b3V0Q29uZmlnIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IExheW91dENvbmZpZyA9IHtcclxuICAgICAgICAgICAgcm9vdDogUm9vdEl0ZW1Db25maWcuZnJvbVJlc29sdmVkT3JVbmRlZmluZWQoY29uZmlnLnJvb3QpLFxyXG4gICAgICAgICAgICBvcGVuUG9wb3V0czogUG9wb3V0TGF5b3V0Q29uZmlnLmZyb21SZXNvbHZlZEFycmF5KGNvbmZpZy5vcGVuUG9wb3V0cyksXHJcbiAgICAgICAgICAgIHNldHRpbmdzOiBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5jcmVhdGVDb3B5KGNvbmZpZy5zZXR0aW5ncyksXHJcbiAgICAgICAgICAgIGRpbWVuc2lvbnM6IExheW91dENvbmZpZy5EaW1lbnNpb25zLmZyb21SZXNvbHZlZChjb25maWcuZGltZW5zaW9ucyksXHJcbiAgICAgICAgICAgIGhlYWRlcjogUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyLmNyZWF0ZUNvcHkoY29uZmlnLmhlYWRlciksXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc1Jlc29sdmVkKGNvbmZpZ09yUmVzb2x2ZWRDb25maWc6IFJlc29sdmVkTGF5b3V0Q29uZmlnIHwgTGF5b3V0Q29uZmlnKTogY29uZmlnT3JSZXNvbHZlZENvbmZpZyBpcyBSZXNvbHZlZExheW91dENvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgY29uZmlnID0gY29uZmlnT3JSZXNvbHZlZENvbmZpZyBhcyBSZXNvbHZlZExheW91dENvbmZpZztcclxuICAgICAgICByZXR1cm4gY29uZmlnLnJlc29sdmVkICE9PSB1bmRlZmluZWQgJiYgKGNvbmZpZy5yZXNvbHZlZCA9PT0gdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVPcGVuUG9wb3V0cyhwb3BvdXRDb25maWdzOiBQb3BvdXRMYXlvdXRDb25maWdbXSB8IHVuZGVmaW5lZCk6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnW10ge1xyXG4gICAgICAgIGlmIChwb3BvdXRDb25maWdzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gcG9wb3V0Q29uZmlncy5sZW5ndGg7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxSZXNvbHZlZFBvcG91dExheW91dENvbmZpZz4oY291bnQpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IFBvcG91dExheW91dENvbmZpZy5yZXNvbHZlKHBvcG91dENvbmZpZ3NbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFBvcG91dExheW91dENvbmZpZyBleHRlbmRzIExheW91dENvbmZpZyB7XHJcbiAgICAvKiogVGhlIGlkIG9mIHRoZSBlbGVtZW50IHRoZSBpdGVtIHdpbGwgYmUgYXBwZW5kZWQgdG8gb24gcG9wSW5cclxuICAgICogSWYgbnVsbCwgYXBwZW5kIHRvIHRvcG1vc3QgbGF5b3V0IGVsZW1lbnRcclxuICAgICovXHJcbiAgICBwYXJlbnRJZDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZDtcclxuICAgIC8qKiBUaGUgcG9zaXRpb24gb2YgdGhpcyBlbGVtZW50IHdpdGhpbiBpdHMgcGFyZW50XHJcbiAgICAqIElmIG51bGwsIHBvc2l0aW9uIGlzIGxhc3RcclxuICAgICovXHJcbiAgICBpbmRleEluUGFyZW50OiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKFBvcG91dExheW91dENvbmZpZzppbnRlcmZhY2UpLndpbmRvd30gKi9cclxuICAgIGRpbWVuc2lvbnM6IFBvcG91dExheW91dENvbmZpZy5EaW1lbnNpb25zIHwgdW5kZWZpbmVkOyAvLyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcclxuICAgIHdpbmRvdzogUG9wb3V0TGF5b3V0Q29uZmlnLldpbmRvdyB8IHVuZGVmaW5lZDtcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBQb3BvdXRMYXlvdXRDb25maWcge1xyXG4gICAgLy8gUHJldmlvdXMgdmVyc2lvbnMga2VwdCB3aW5kb3cgaW5mb3JtYXRpb24gaW4gRGltZW5zaW9ucyBrZXkuICBPbmx5IHVzZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcclxuICAgIC8qKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChQb3BvdXRMYXlvdXRDb25maWc6bmFtZXNwYWNlKS4oV2luZG93OmludGVyZmFjZSl9ICovXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIERpbWVuc2lvbnMgZXh0ZW5kcyBMYXlvdXRDb25maWcuRGltZW5zaW9ucyB7XHJcbiAgICAgICAgLyoqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKFBvcG91dExheW91dENvbmZpZzpuYW1lc3BhY2UpLihXaW5kb3c6aW50ZXJmYWNlKS53aWR0aH0gKi9cclxuICAgICAgICB3aWR0aD86IG51bWJlciB8IG51bGwsXHJcbiAgICAgICAgLyoqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKFBvcG91dExheW91dENvbmZpZzpuYW1lc3BhY2UpLihXaW5kb3c6aW50ZXJmYWNlKS5oZWlnaHR9ICovXHJcbiAgICAgICAgaGVpZ2h0PzogbnVtYmVyIHwgbnVsbCxcclxuICAgICAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoUG9wb3V0TGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkuKFdpbmRvdzppbnRlcmZhY2UpLmxlZnR9ICovXHJcbiAgICAgICAgbGVmdD86IG51bWJlciB8IG51bGwsXHJcbiAgICAgICAgLyoqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKFBvcG91dExheW91dENvbmZpZzpuYW1lc3BhY2UpLihXaW5kb3c6aW50ZXJmYWNlKS50b3B9ICovXHJcbiAgICAgICAgdG9wPzogbnVtYmVyIHwgbnVsbCxcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIFdpbmRvdyB7XHJcbiAgICAgICAgd2lkdGg/OiBudW1iZXIsXHJcbiAgICAgICAgaGVpZ2h0PzogbnVtYmVyLFxyXG4gICAgICAgIGxlZnQ/OiBudW1iZXIsXHJcbiAgICAgICAgdG9wPzogbnVtYmVyLFxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBuYW1lc3BhY2UgV2luZG93IHtcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUod2luZG93OiBXaW5kb3cgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIGRpbWVuc2lvbnM6IERpbWVuc2lvbnMgfCB1bmRlZmluZWQpOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZy5XaW5kb3dcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHQ6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLldpbmRvdztcclxuICAgICAgICAgICAgY29uc3QgZGVmYXVsdHMgPSBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZy5XaW5kb3cuZGVmYXVsdHM7XHJcbiAgICAgICAgICAgIGlmICh3aW5kb3cgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiB3aW5kb3cud2lkdGggPz8gZGVmYXVsdHMud2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiB3aW5kb3cuaGVpZ2h0ID8/IGRlZmF1bHRzLmhlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiB3aW5kb3cubGVmdCA/PyBkZWZhdWx0cy5sZWZ0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRvcDogd2luZG93LnRvcCA/PyBkZWZhdWx0cy50b3AsXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGRpbWVuc2lvbnM/LndpZHRoID8/IGRlZmF1bHRzLndpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogZGltZW5zaW9ucz8uaGVpZ2h0ID8/IGRlZmF1bHRzLmhlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBkaW1lbnNpb25zPy5sZWZ0ID8/IGRlZmF1bHRzLmxlZnQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9wOiBkaW1lbnNpb25zPy50b3AgPz8gZGVmYXVsdHMudG9wLFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGZyb21SZXNvbHZlZChyZXNvbHZlZFdpbmRvdzogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcuV2luZG93KTogV2luZG93IHtcclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBXaW5kb3cgPSB7XHJcbiAgICAgICAgICAgICAgICB3aWR0aDogcmVzb2x2ZWRXaW5kb3cud2lkdGggPT09IG51bGwgPyB1bmRlZmluZWQgOiByZXNvbHZlZFdpbmRvdy53aWR0aCxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogcmVzb2x2ZWRXaW5kb3cuaGVpZ2h0ID09PSBudWxsID8gdW5kZWZpbmVkIDogcmVzb2x2ZWRXaW5kb3cuaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgbGVmdDogcmVzb2x2ZWRXaW5kb3cubGVmdCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IHJlc29sdmVkV2luZG93LmxlZnQsXHJcbiAgICAgICAgICAgICAgICB0b3A6IHJlc29sdmVkV2luZG93LnRvcCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IHJlc29sdmVkV2luZG93LnRvcCxcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUocG9wb3V0Q29uZmlnOiBQb3BvdXRMYXlvdXRDb25maWcpOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyB7XHJcbiAgICAgICAgbGV0IHJvb3Q6IFJvb3RJdGVtQ29uZmlnIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGlmIChwb3BvdXRDb25maWcucm9vdCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJvb3QgPSBwb3BvdXRDb25maWcucm9vdDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAocG9wb3V0Q29uZmlnLmNvbnRlbnQgIT09IHVuZGVmaW5lZCAmJiBwb3BvdXRDb25maWcuY29udGVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICByb290ID0gcG9wb3V0Q29uZmlnLmNvbnRlbnRbMF07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByb290ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjb25maWc6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnID0ge1xyXG4gICAgICAgICAgICByb290OiBSb290SXRlbUNvbmZpZy5yZXNvbHZlKHJvb3QpLFxyXG4gICAgICAgICAgICBvcGVuUG9wb3V0czogTGF5b3V0Q29uZmlnLnJlc29sdmVPcGVuUG9wb3V0cyhwb3BvdXRDb25maWcub3BlblBvcG91dHMpLFxyXG4gICAgICAgICAgICBkaW1lbnNpb25zOiBMYXlvdXRDb25maWcuRGltZW5zaW9ucy5yZXNvbHZlKHBvcG91dENvbmZpZy5kaW1lbnNpb25zKSxcclxuICAgICAgICAgICAgc2V0dGluZ3M6IExheW91dENvbmZpZy5TZXR0aW5ncy5yZXNvbHZlKHBvcG91dENvbmZpZy5zZXR0aW5ncyksXHJcbiAgICAgICAgICAgIGhlYWRlcjogTGF5b3V0Q29uZmlnLkhlYWRlci5yZXNvbHZlKHBvcG91dENvbmZpZy5oZWFkZXIsIHBvcG91dENvbmZpZy5zZXR0aW5ncywgcG9wb3V0Q29uZmlnLmxhYmVscyksXHJcbiAgICAgICAgICAgIHBhcmVudElkOiBwb3BvdXRDb25maWcucGFyZW50SWQgPz8gbnVsbCxcclxuICAgICAgICAgICAgaW5kZXhJblBhcmVudDogcG9wb3V0Q29uZmlnLmluZGV4SW5QYXJlbnQgPz8gbnVsbCxcclxuICAgICAgICAgICAgd2luZG93OiBQb3BvdXRMYXlvdXRDb25maWcuV2luZG93LnJlc29sdmUocG9wb3V0Q29uZmlnLndpbmRvdywgcG9wb3V0Q29uZmlnLmRpbWVuc2lvbnMpLFxyXG4gICAgICAgICAgICByZXNvbHZlZDogdHJ1ZSxcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbmZpZztcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZnJvbVJlc29sdmVkKHJlc29sdmVkQ29uZmlnOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyk6IFBvcG91dExheW91dENvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBQb3BvdXRMYXlvdXRDb25maWcgPSB7XHJcbiAgICAgICAgICAgIHJvb3Q6IFJvb3RJdGVtQ29uZmlnLmZyb21SZXNvbHZlZE9yVW5kZWZpbmVkKHJlc29sdmVkQ29uZmlnLnJvb3QpLFxyXG4gICAgICAgICAgICBvcGVuUG9wb3V0czogZnJvbVJlc29sdmVkQXJyYXkocmVzb2x2ZWRDb25maWcub3BlblBvcG91dHMpLFxyXG4gICAgICAgICAgICBkaW1lbnNpb25zOiBMYXlvdXRDb25maWcuRGltZW5zaW9ucy5mcm9tUmVzb2x2ZWQocmVzb2x2ZWRDb25maWcuZGltZW5zaW9ucyksXHJcbiAgICAgICAgICAgIHNldHRpbmdzOiBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5jcmVhdGVDb3B5KHJlc29sdmVkQ29uZmlnLnNldHRpbmdzKSxcclxuICAgICAgICAgICAgaGVhZGVyOiBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIuY3JlYXRlQ29weShyZXNvbHZlZENvbmZpZy5oZWFkZXIpLFxyXG4gICAgICAgICAgICBwYXJlbnRJZDogcmVzb2x2ZWRDb25maWcucGFyZW50SWQsXHJcbiAgICAgICAgICAgIGluZGV4SW5QYXJlbnQ6IHJlc29sdmVkQ29uZmlnLmluZGV4SW5QYXJlbnQsXHJcbiAgICAgICAgICAgIHdpbmRvdzogUG9wb3V0TGF5b3V0Q29uZmlnLldpbmRvdy5mcm9tUmVzb2x2ZWQocmVzb2x2ZWRDb25maWcud2luZG93KSxcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGZyb21SZXNvbHZlZEFycmF5KHJlc29sdmVkQXJyYXk6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnW10pOiBQb3BvdXRMYXlvdXRDb25maWdbXSB7XHJcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRPcGVuUG9wb3V0Q291bnQgPSByZXNvbHZlZEFycmF5Lmxlbmd0aDtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8UG9wb3V0TGF5b3V0Q29uZmlnPihyZXNvbHZlZE9wZW5Qb3BvdXRDb3VudCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNvbHZlZE9wZW5Qb3BvdXRDb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkT3BlblBvcG91dCA9IHJlc29sdmVkQXJyYXlbaV07XHJcbiAgICAgICAgICAgIHJlc3VsdFtpXSA9IFBvcG91dExheW91dENvbmZpZy5mcm9tUmVzb2x2ZWQocmVzb2x2ZWRPcGVuUG9wb3V0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGludGVyZmFjZSBTaXplV2l0aFVuaXQge1xyXG4gICAgc2l6ZTogbnVtYmVyO1xyXG4gICAgc2l6ZVVuaXQ6IFNpemVVbml0RW51bTtcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFVuZGVmaW5hYmxlU2l6ZVdpdGhVbml0IHtcclxuICAgIHNpemU6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICAgIHNpemVVbml0OiBTaXplVW5pdEVudW07XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2l6ZShzaXplU3RyaW5nOiBzdHJpbmcsIGFsbG93YWJsZVNpemVVbml0czogcmVhZG9ubHkgU2l6ZVVuaXRFbnVtW10pOiBTaXplV2l0aFVuaXQge1xyXG4gICAgY29uc3QgeyBudW1lcmljUGFydDogZGlnaXRzUGFydCwgZmlyc3ROb25OdW1lcmljQ2hhclBhcnQ6IGZpcnN0Tm9uRGlnaXRQYXJ0IH0gPSBzcGxpdFN0cmluZ0F0Rmlyc3ROb25OdW1lcmljQ2hhcihzaXplU3RyaW5nKTtcclxuICAgIGNvbnN0IHNpemUgPSBOdW1iZXIucGFyc2VJbnQoZGlnaXRzUGFydCwgMTApO1xyXG4gICAgaWYgKGlzTmFOKHNpemUpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcihgJHtpMThuU3RyaW5nc1tJMThuU3RyaW5nSWQuSW52YWxpZE51bWJlclBhcnRJblNpemVTdHJpbmddfTogJHtzaXplU3RyaW5nfWApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBzaXplVW5pdCA9IFNpemVVbml0RW51bS50cnlQYXJzZShmaXJzdE5vbkRpZ2l0UGFydCk7XHJcbiAgICAgICAgaWYgKHNpemVVbml0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcihgJHtpMThuU3RyaW5nc1tJMThuU3RyaW5nSWQuVW5rbm93blVuaXRJblNpemVTdHJpbmddfTogJHtzaXplU3RyaW5nfWApXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKCFhbGxvd2FibGVTaXplVW5pdHMuaW5jbHVkZXMoc2l6ZVVuaXQpKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKGAke2kxOG5TdHJpbmdzW0kxOG5TdHJpbmdJZC5VbnN1cHBvcnRlZFVuaXRJblNpemVTdHJpbmddfTogJHtzaXplU3RyaW5nfWApXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBzaXplLCBzaXplVW5pdCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRTaXplKHNpemU6IG51bWJlciwgc2l6ZVVuaXQ6IFNpemVVbml0RW51bSkge1xyXG4gICAgcmV0dXJuIHNpemUudG9TdHJpbmcoMTApICsgU2l6ZVVuaXRFbnVtLmZvcm1hdChzaXplVW5pdCk7XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFVuZGVmaW5hYmxlU2l6ZShzaXplOiBudW1iZXJ8IHVuZGVmaW5lZCwgc2l6ZVVuaXQ6IFNpemVVbml0RW51bSkge1xyXG4gICAgaWYgKHNpemUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBzaXplLnRvU3RyaW5nKDEwKSArIFNpemVVbml0RW51bS5mb3JtYXQoc2l6ZVVuaXQpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyBAZGVwcmVjYXRlZCAtIHVzZSB7QGxpbmsgKExheW91dENvbmZpZzppbnRlcmZhY2UpfSAqL1xyXG5leHBvcnQgdHlwZSBDb25maWcgPSBMYXlvdXRDb25maWc7XHJcbiIsImltcG9ydCB7IEFzc2VydEVycm9yLCBVbnJlYWNoYWJsZUNhc2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IENvbmZpZ01pbmlmaWVyIH0gZnJvbSAnLi4vdXRpbHMvY29uZmlnLW1pbmlmaWVyJztcclxuaW1wb3J0IHsgSXRlbVR5cGUsIEpzb25WYWx1ZSwgUmVzcG9uc2l2ZU1vZGUsIFNpZGUsIFNpemVVbml0RW51bSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcclxuaW1wb3J0IHsgZGVlcEV4dGVuZFZhbHVlIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZEl0ZW1Db25maWcge1xyXG4gICAgLy8gc2VlIEl0ZW1Db25maWcgZm9yIGNvbW1lbnRzXHJcbiAgICByZWFkb25seSB0eXBlOiBJdGVtVHlwZTtcclxuICAgIHJlYWRvbmx5IGNvbnRlbnQ6IHJlYWRvbmx5IFJlc29sdmVkSXRlbUNvbmZpZ1tdO1xyXG4gICAgcmVhZG9ubHkgc2l6ZTogbnVtYmVyO1xyXG4gICAgcmVhZG9ubHkgc2l6ZVVuaXQ6IFNpemVVbml0RW51bTtcclxuICAgIHJlYWRvbmx5IG1pblNpemU6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICAgIHJlYWRvbmx5IG1pblNpemVVbml0OiBTaXplVW5pdEVudW07XHJcbiAgICAvLyBpZCBubyBsb25nZXIgc3BlY2lmaWVzIHdoZXRoZXIgYW4gSXRlbSBpcyBtYXhpbWlzZWQuICBUaGlzIGlzIG5vdyBkb25lIGJ5IEhlYWRlckl0ZW1Db25maWcubWF4aW1pc2VkXHJcbiAgICByZWFkb25seSBpZDogc3RyaW5nO1xyXG4gICAgcmVhZG9ubHkgaXNDbG9zYWJsZTogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBSZXNvbHZlZEl0ZW1Db25maWcge1xyXG4gICAgZXhwb3J0IGNvbnN0IGRlZmF1bHRzOiBSZXNvbHZlZEl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgdHlwZTogSXRlbVR5cGUuZ3JvdW5kLCAvLyBub3QgcmVhbGx5IGRlZmF1bHQgYnV0IG5lZWQgc29tZXRoaW5nXHJcbiAgICAgICAgY29udGVudDogW10sXHJcbiAgICAgICAgc2l6ZTogMSxcclxuICAgICAgICBzaXplVW5pdDogU2l6ZVVuaXRFbnVtLkZyYWN0aW9uYWwsXHJcbiAgICAgICAgbWluU2l6ZTogdW5kZWZpbmVkLFxyXG4gICAgICAgIG1pblNpemVVbml0OiBTaXplVW5pdEVudW0uUGl4ZWwsXHJcbiAgICAgICAgaWQ6ICcnLFxyXG4gICAgICAgIGlzQ2xvc2FibGU6IHRydWUsXHJcbiAgICB9IGFzIGNvbnN0O1xyXG5cclxuICAgIC8qKiBDcmVhdGVzIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgUmVzb2x2ZWRJdGVtQ29uZmlnIHVzaW5nIGFuIGFsdGVybmF0aXZlIGNvbnRlbnQgaWYgc3BlY2lmaWVkICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29weShvcmlnaW5hbDogUmVzb2x2ZWRJdGVtQ29uZmlnLCBjb250ZW50PzogUmVzb2x2ZWRJdGVtQ29uZmlnW10pOiBSZXNvbHZlZEl0ZW1Db25maWcge1xyXG4gICAgICAgIHN3aXRjaCAob3JpZ2luYWwudHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmdyb3VuZDpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5yb3c6XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29sdW1uOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnLmNyZWF0ZUNvcHkob3JpZ2luYWwgYXMgUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCBhcyBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZy5DaGlsZEl0ZW1Db25maWdbXSk7XHJcblxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnN0YWNrOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnLmNyZWF0ZUNvcHkob3JpZ2luYWwgYXMgUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcsIGNvbnRlbnQgYXMgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnW10pO1xyXG5cclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb21wb25lbnQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnLmNyZWF0ZUNvcHkob3JpZ2luYWwgYXMgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnKTtcclxuXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWFjaGFibGVDYXNlRXJyb3IoJ0NJQ0M5MTM1NCcsIG9yaWdpbmFsLnR5cGUsICdJbnZhbGlkIENvbmZpZyBJdGVtIHR5cGUgc3BlY2lmaWVkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0KHR5cGU6IEl0ZW1UeXBlKTogUmVzb2x2ZWRJdGVtQ29uZmlnIHtcclxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5ncm91bmQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0NJQ0NEUjkxNTYyJyk7IC8vIEdldCBkZWZhdWx0IHJvb3QgZnJvbSBMYXlvdXRDb25maWdcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5yb3c6XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29sdW1uOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnLmNyZWF0ZURlZmF1bHQodHlwZSk7XHJcblxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnN0YWNrOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnLmNyZWF0ZURlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29tcG9uZW50OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZy5jcmVhdGVEZWZhdWx0KCk7XHJcblxyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVucmVhY2hhYmxlQ2FzZUVycm9yKCdDSUNDREQ5MTU2MycsIHR5cGUsICdJbnZhbGlkIENvbmZpZyBJdGVtIHR5cGUgc3BlY2lmaWVkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0NvbXBvbmVudEl0ZW0oaXRlbUNvbmZpZzogUmVzb2x2ZWRJdGVtQ29uZmlnKTogaXRlbUNvbmZpZyBpcyBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcge1xyXG4gICAgICAgIHJldHVybiBpdGVtQ29uZmlnLnR5cGUgPT09IEl0ZW1UeXBlLmNvbXBvbmVudDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNTdGFja0l0ZW0oaXRlbUNvbmZpZzogUmVzb2x2ZWRJdGVtQ29uZmlnKTogaXRlbUNvbmZpZyBpcyBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW1Db25maWcudHlwZSA9PT0gSXRlbVR5cGUuc3RhY2s7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzR3JvdW5kSXRlbShpdGVtQ29uZmlnOiBSZXNvbHZlZEl0ZW1Db25maWcpOiBpdGVtQ29uZmlnIGlzIFJlc29sdmVkR3JvdW5kSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW1Db25maWcudHlwZSA9PT0gSXRlbVR5cGUuZ3JvdW5kO1xyXG4gICAgfVxyXG59XHJcblxyXG4vLyBTdGFjayBvciBDb21wb25lbnRcclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZyBleHRlbmRzIFJlc29sdmVkSXRlbUNvbmZpZyB7XHJcbiAgICBoZWFkZXI6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlciB8IHVuZGVmaW5lZDsgLy8gdW5kZWZpbmVkIG1lYW5zIGdldCBoZWFkZXIgc2V0dGluZ3MgZnJvbSBMYXlvdXRDb25maWdcclxuICAgIHJlYWRvbmx5IG1heGltaXNlZDogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZyB7XHJcbiAgICBleHBvcnQgY29uc3QgZGVmYXVsdE1heGltaXNlZCA9IGZhbHNlO1xyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgSGVhZGVyIHtcclxuICAgICAgICAvLyB1bmRlZmluZWQgbWVhbnMgZ2V0IHByb3BlcnR5IHZhbHVlIGZyb20gTGF5b3V0Q29uZmlnXHJcbiAgICAgICAgcmVhZG9ubHkgc2hvdzogZmFsc2UgfCBTaWRlIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIHJlYWRvbmx5IHBvcG91dDogZmFsc2UgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgcmVhZG9ubHkgbWF4aW1pc2U6IGZhbHNlIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIHJlYWRvbmx5IGNsb3NlOiBmYWxzZSB8IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICAgICAgICByZWFkb25seSBtaW5pbWlzZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIHJlYWRvbmx5IHRhYkRyb3Bkb3duOiBmYWxzZSB8IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgbmFtZXNwYWNlIEhlYWRlciB7XHJcbiAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvcHkob3JpZ2luYWw6IEhlYWRlciB8IHVuZGVmaW5lZCwgc2hvdz86IGZhbHNlIHwgU2lkZSk6IEhlYWRlciB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgICAgIGlmIChvcmlnaW5hbCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBzaG93OiBzaG93ID8/IG9yaWdpbmFsLnNob3csXHJcbiAgICAgICAgICAgICAgICAgICAgcG9wb3V0OiBvcmlnaW5hbC5wb3BvdXQsXHJcbiAgICAgICAgICAgICAgICAgICAgY2xvc2U6IG9yaWdpbmFsLmNsb3NlLFxyXG4gICAgICAgICAgICAgICAgICAgIG1heGltaXNlOiBvcmlnaW5hbC5tYXhpbWlzZSxcclxuICAgICAgICAgICAgICAgICAgICBtaW5pbWlzZTogb3JpZ2luYWwubWluaW1pc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgdGFiRHJvcGRvd246IG9yaWdpbmFsLnRhYkRyb3Bkb3duLFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnIGV4dGVuZHMgUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcge1xyXG4gICAgcmVhZG9ubHkgdHlwZTogJ3N0YWNrJztcclxuICAgIHJlYWRvbmx5IGNvbnRlbnQ6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZ1tdO1xyXG4gICAgLyoqIFRoZSBpbmRleCBvZiB0aGUgYWN0aXZlIGl0ZW0gaW4gdGhlIFN0YWNrLiAgT25seSB1bmRlZmluZWQgaWYgdGhlIFN0YWNrIGlzIGVtcHR5LiAqL1xyXG4gICAgcmVhZG9ubHkgYWN0aXZlSXRlbUluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcge1xyXG4gICAgZXhwb3J0IGNvbnN0IGRlZmF1bHRBY3RpdmVJdGVtSW5kZXggPSAwO1xyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb3B5KG9yaWdpbmFsOiBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZywgY29udGVudD86IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZ1tdKTogUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IG9yaWdpbmFsLnR5cGUsXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQgIT09IHVuZGVmaW5lZCA/IGNvcHlDb250ZW50KGNvbnRlbnQpIDogY29weUNvbnRlbnQob3JpZ2luYWwuY29udGVudCksXHJcbiAgICAgICAgICAgIHNpemU6IG9yaWdpbmFsLnNpemUsXHJcbiAgICAgICAgICAgIHNpemVVbml0OiBvcmlnaW5hbC5zaXplVW5pdCxcclxuICAgICAgICAgICAgbWluU2l6ZTogb3JpZ2luYWwubWluU2l6ZSxcclxuICAgICAgICAgICAgbWluU2l6ZVVuaXQ6IG9yaWdpbmFsLm1pblNpemVVbml0LFxyXG4gICAgICAgICAgICBpZDogb3JpZ2luYWwuaWQsXHJcbiAgICAgICAgICAgIG1heGltaXNlZDogb3JpZ2luYWwubWF4aW1pc2VkLFxyXG4gICAgICAgICAgICBpc0Nsb3NhYmxlOiBvcmlnaW5hbC5pc0Nsb3NhYmxlLFxyXG4gICAgICAgICAgICBhY3RpdmVJdGVtSW5kZXg6IG9yaWdpbmFsLmFjdGl2ZUl0ZW1JbmRleCxcclxuICAgICAgICAgICAgaGVhZGVyOiBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXIuY3JlYXRlQ29weShvcmlnaW5hbC5oZWFkZXIpLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjb3B5Q29udGVudChvcmlnaW5hbDogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnW10pOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWdbXSB7XHJcbiAgICAgICAgY29uc3QgY291bnQgPSBvcmlnaW5hbC5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5PFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZz4oY291bnQpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICByZXN1bHRbaV0gPSBSZXNvbHZlZEl0ZW1Db25maWcuY3JlYXRlQ29weShvcmlnaW5hbFtpXSkgYXMgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0KCk6IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiBJdGVtVHlwZS5zdGFjayxcclxuICAgICAgICAgICAgY29udGVudDogW10sXHJcbiAgICAgICAgICAgIHNpemU6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5zaXplLFxyXG4gICAgICAgICAgICBzaXplVW5pdDogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLnNpemVVbml0LFxyXG4gICAgICAgICAgICBtaW5TaXplOiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMubWluU2l6ZSxcclxuICAgICAgICAgICAgbWluU2l6ZVVuaXQ6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5taW5TaXplVW5pdCxcclxuICAgICAgICAgICAgaWQ6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5pZCxcclxuICAgICAgICAgICAgbWF4aW1pc2VkOiBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5kZWZhdWx0TWF4aW1pc2VkLFxyXG4gICAgICAgICAgICBpc0Nsb3NhYmxlOiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuaXNDbG9zYWJsZSxcclxuICAgICAgICAgICAgYWN0aXZlSXRlbUluZGV4OiBkZWZhdWx0QWN0aXZlSXRlbUluZGV4LFxyXG4gICAgICAgICAgICBoZWFkZXI6IHVuZGVmaW5lZCxcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcgZXh0ZW5kcyBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZyB7XHJcbiAgICAvLyBzZWUgQ29tcG9uZW50SXRlbUNvbmZpZyBmb3IgY29tbWVudHNcclxuICAgIHJlYWRvbmx5IHR5cGU6ICdjb21wb25lbnQnO1xyXG4gICAgcmVhZG9ubHkgY29udGVudDogW107XHJcbiAgICByZWFkb25seSB0aXRsZTogc3RyaW5nO1xyXG4gICAgcmVhZG9ubHkgcmVvcmRlckVuYWJsZWQ6IGJvb2xlYW47IC8vIFRha2VzIHByZWNlZGVuY2Ugb3ZlciBMYXlvdXRDb25maWcucmVvcmRlckVuYWJsZWQuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgYXMgc3BlY2lmaWVkIGluIGxheW91dC5yZWdpc3RlckNvbXBvbmVudC4gTWFuZGF0b3J5IGlmIHR5cGUgaXMgJ2NvbXBvbmVudCcuXHJcbiAgICAgKi9cclxuICAgIHJlYWRvbmx5IGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZTtcclxuICAgIHJlYWRvbmx5IGNvbXBvbmVudFN0YXRlPzogSnNvblZhbHVlO1xyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyB7XHJcbiAgICBleHBvcnQgY29uc3QgZGVmYXVsdFJlb3JkZXJFbmFibGVkID0gdHJ1ZTtcclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUNvbXBvbmVudFR5cGVOYW1lKGl0ZW1Db25maWc6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgY29uc3QgY29tcG9uZW50VHlwZSA9IGl0ZW1Db25maWcuY29tcG9uZW50VHlwZTtcclxuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudFR5cGUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRUeXBlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb3B5KG9yaWdpbmFsOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcpOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiBvcmlnaW5hbC50eXBlLFxyXG4gICAgICAgICAgICBjb250ZW50OiBbXSxcclxuICAgICAgICAgICAgc2l6ZTogb3JpZ2luYWwuc2l6ZSxcclxuICAgICAgICAgICAgc2l6ZVVuaXQ6IG9yaWdpbmFsLnNpemVVbml0LFxyXG4gICAgICAgICAgICBtaW5TaXplOiBvcmlnaW5hbC5taW5TaXplLFxyXG4gICAgICAgICAgICBtaW5TaXplVW5pdDogb3JpZ2luYWwubWluU2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIGlkOiBvcmlnaW5hbC5pZCxcclxuICAgICAgICAgICAgbWF4aW1pc2VkOiBvcmlnaW5hbC5tYXhpbWlzZWQsXHJcbiAgICAgICAgICAgIGlzQ2xvc2FibGU6IG9yaWdpbmFsLmlzQ2xvc2FibGUsXHJcbiAgICAgICAgICAgIHJlb3JkZXJFbmFibGVkOiBvcmlnaW5hbC5yZW9yZGVyRW5hYmxlZCxcclxuICAgICAgICAgICAgdGl0bGU6IG9yaWdpbmFsLnRpdGxlLFxyXG4gICAgICAgICAgICBoZWFkZXI6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlci5jcmVhdGVDb3B5KG9yaWdpbmFsLmhlYWRlciksXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFR5cGU6IG9yaWdpbmFsLmNvbXBvbmVudFR5cGUsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFN0YXRlOiBkZWVwRXh0ZW5kVmFsdWUodW5kZWZpbmVkLCBvcmlnaW5hbC5jb21wb25lbnRTdGF0ZSkgYXMgSnNvblZhbHVlLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0KGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZSA9ICcnLCBjb21wb25lbnRTdGF0ZT86IEpzb25WYWx1ZSwgdGl0bGUgPSAnJyk6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IEl0ZW1UeXBlLmNvbXBvbmVudCxcclxuICAgICAgICAgICAgY29udGVudDogW10sXHJcbiAgICAgICAgICAgIHNpemU6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5zaXplLFxyXG4gICAgICAgICAgICBzaXplVW5pdDogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLnNpemVVbml0LFxyXG4gICAgICAgICAgICBtaW5TaXplOiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMubWluU2l6ZSxcclxuICAgICAgICAgICAgbWluU2l6ZVVuaXQ6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5taW5TaXplVW5pdCxcclxuICAgICAgICAgICAgaWQ6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5pZCxcclxuICAgICAgICAgICAgbWF4aW1pc2VkOiBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5kZWZhdWx0TWF4aW1pc2VkLFxyXG4gICAgICAgICAgICBpc0Nsb3NhYmxlOiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuaXNDbG9zYWJsZSxcclxuICAgICAgICAgICAgcmVvcmRlckVuYWJsZWQ6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZy5kZWZhdWx0UmVvcmRlckVuYWJsZWQsXHJcbiAgICAgICAgICAgIHRpdGxlLFxyXG4gICAgICAgICAgICBoZWFkZXI6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgY29tcG9uZW50VHlwZSxcclxuICAgICAgICAgICAgY29tcG9uZW50U3RhdGUsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNvcHlDb21wb25lbnRUeXBlKGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZSk6IEpzb25WYWx1ZSB7XHJcbiAgICAgICAgcmV0dXJuIGRlZXBFeHRlbmRWYWx1ZSh7fSwgY29tcG9uZW50VHlwZSkgYXMgSnNvblZhbHVlXHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBCYXNlIGZvciBSb290IG9yIFJvd09yQ29sdW1uIEl0ZW1Db25maWdzXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcgZXh0ZW5kcyBSZXNvbHZlZEl0ZW1Db25maWcge1xyXG4gICAgcmVhZG9ubHkgdHlwZTogJ3JvdycgfCAnY29sdW1uJztcclxuICAgIC8qKiBOb3RlIHRoYXQgUm93T3JDb2x1bW4gUmVzb2x2ZWRJdGVtQ29uZmlnIGNvbnRlbnRzLCBjYW4gY29udGFpbiBDb21wb25lbnRJdGVtIGl0ZW1Db25maWdzLiAgSG93ZXZlclxyXG4gICAgICogd2hlbiBDb250ZW50SXRlbXMgYXJlIGNyZWF0ZWQsIHRoZXNlIENvbXBvbmVudEl0ZW0gaXRlbUNvbmZpZ3Mgd2lsbCBjcmVhdGUgYSBTdGFjayB3aXRoIGEgY2hpbGQgQ29tcG9uZW50SXRlbS5cclxuICAgICAqL1xyXG4gICAgcmVhZG9ubHkgY29udGVudDogcmVhZG9ubHkgKFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnIHwgUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcgfCBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcpW107XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcge1xyXG4gICAgZXhwb3J0IHR5cGUgQ2hpbGRJdGVtQ29uZmlnID0gUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcgfCBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZyB8IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZztcclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNDaGlsZEl0ZW1Db25maWcoaXRlbUNvbmZpZzogUmVzb2x2ZWRJdGVtQ29uZmlnKTogaXRlbUNvbmZpZyBpcyBDaGlsZEl0ZW1Db25maWcge1xyXG4gICAgICAgIHN3aXRjaCAoaXRlbUNvbmZpZy50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUucm93OlxyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbHVtbjpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5zdGFjazpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb21wb25lbnQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5ncm91bmQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWFjaGFibGVDYXNlRXJyb3IoJ0NST0NPU1BDSUNJQzEzNjg3JywgaXRlbUNvbmZpZy50eXBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvcHkob3JpZ2luYWw6IFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnLCBjb250ZW50PzogQ2hpbGRJdGVtQ29uZmlnW10pOiBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogb3JpZ2luYWwudHlwZSxcclxuICAgICAgICAgICAgY29udGVudDogY29udGVudCAhPT0gdW5kZWZpbmVkID8gY29weUNvbnRlbnQoY29udGVudCkgOiBjb3B5Q29udGVudChvcmlnaW5hbC5jb250ZW50KSxcclxuICAgICAgICAgICAgc2l6ZTogb3JpZ2luYWwuc2l6ZSxcclxuICAgICAgICAgICAgc2l6ZVVuaXQ6IG9yaWdpbmFsLnNpemVVbml0LFxyXG4gICAgICAgICAgICBtaW5TaXplOiBvcmlnaW5hbC5taW5TaXplLFxyXG4gICAgICAgICAgICBtaW5TaXplVW5pdDogb3JpZ2luYWwubWluU2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIGlkOiBvcmlnaW5hbC5pZCxcclxuICAgICAgICAgICAgaXNDbG9zYWJsZTogb3JpZ2luYWwuaXNDbG9zYWJsZSxcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY29weUNvbnRlbnQob3JpZ2luYWw6IHJlYWRvbmx5IENoaWxkSXRlbUNvbmZpZ1tdKTogQ2hpbGRJdGVtQ29uZmlnW10ge1xyXG4gICAgICAgIGNvbnN0IGNvdW50ID0gb3JpZ2luYWwubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxDaGlsZEl0ZW1Db25maWc+KGNvdW50KTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgcmVzdWx0W2ldID0gUmVzb2x2ZWRJdGVtQ29uZmlnLmNyZWF0ZUNvcHkob3JpZ2luYWxbaV0pIGFzIENoaWxkSXRlbUNvbmZpZztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdCh0eXBlOiAncm93JyB8ICdjb2x1bW4nKTogUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGUsXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IFtdLFxyXG4gICAgICAgICAgICBzaXplOiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuc2l6ZSxcclxuICAgICAgICAgICAgc2l6ZVVuaXQ6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5zaXplVW5pdCxcclxuICAgICAgICAgICAgbWluU2l6ZTogUmVzb2x2ZWRJdGVtQ29uZmlnLmRlZmF1bHRzLm1pblNpemUsXHJcbiAgICAgICAgICAgIG1pblNpemVVbml0OiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMubWluU2l6ZVVuaXQsXHJcbiAgICAgICAgICAgIGlkOiBSZXNvbHZlZEl0ZW1Db25maWcuZGVmYXVsdHMuaWQsXHJcbiAgICAgICAgICAgIGlzQ2xvc2FibGU6IFJlc29sdmVkSXRlbUNvbmZpZy5kZWZhdWx0cy5pc0Nsb3NhYmxlLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogUm9vdEl0ZW1Db25maWcgaXMgdGhlIHRvcG1vc3QgUmVzb2x2ZWRJdGVtQ29uZmlnIHNwZWNpZmllZCBieSB0aGUgdXNlci5cclxuICogTm90ZSB0aGF0IGl0IGRvZXMgbm90IGhhdmUgYSBjb3JyZXNwb25kaW5nIGNvbnRlbnRJdGVtLiAgSXQgc3BlY2lmaWVzIHRoZSBvbmUgYW5kIG9ubHkgY2hpbGQgb2YgdGhlIEdyb3VuZCBDb250ZW50SXRlbVxyXG4gKiBOb3RlIHRoYXQgUm9vdEl0ZW1Db25maWcgY2FuIGJlIGFuIENvbXBvbmVudEl0ZW0gaXRlbUNvbmZpZy4gIEhvd2V2ZXIgd2hlbiB0aGUgR3JvdW5kIENvbnRlbnRJdGVtJ3MgY2hpbGQgaXMgY3JlYXRlZFxyXG4gKiBhIENvbXBvbmVudEl0ZW0gaXRlbUNvbmZpZyB3aWxsIGNyZWF0ZSBhIFN0YWNrIHdpdGggYSBjaGlsZCBDb21wb25lbnRJdGVtLlxyXG4gKiBAcHVibGljXHJcbiovXHJcbmV4cG9ydCB0eXBlIFJlc29sdmVkUm9vdEl0ZW1Db25maWcgPSBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyB8IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnIHwgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnO1xyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnIHtcclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb3B5KGNvbmZpZzogUmVzb2x2ZWRSb290SXRlbUNvbmZpZyk6IFJlc29sdmVkUm9vdEl0ZW1Db25maWcge1xyXG4gICAgICAgIHJldHVybiBSZXNvbHZlZEl0ZW1Db25maWcuY3JlYXRlQ29weShjb25maWcpIGFzIFJlc29sdmVkUm9vdEl0ZW1Db25maWc7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzUm9vdEl0ZW1Db25maWcoaXRlbUNvbmZpZzogUmVzb2x2ZWRJdGVtQ29uZmlnKTogaXRlbUNvbmZpZyBpcyBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnIHtcclxuICAgICAgICBzd2l0Y2ggKGl0ZW1Db25maWcudHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnJvdzpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb2x1bW46XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuc3RhY2s6XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29tcG9uZW50OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuZ3JvdW5kOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVucmVhY2hhYmxlQ2FzZUVycm9yKCdDUk9DT1NQQ0lDSUMxMzY4NycsIGl0ZW1Db25maWcudHlwZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRHcm91bmRJdGVtQ29uZmlnIGV4dGVuZHMgUmVzb2x2ZWRJdGVtQ29uZmlnIHtcclxuICAgIHJlYWRvbmx5IHR5cGU6ICdncm91bmQnO1xyXG4gICAgcmVhZG9ubHkgc2l6ZTogMTAwLFxyXG4gICAgcmVhZG9ubHkgc2l6ZVVuaXQ6IFNpemVVbml0RW51bS5QZXJjZW50LFxyXG4gICAgcmVhZG9ubHkgbWluU2l6ZTogMCxcclxuICAgIHJlYWRvbmx5IG1pblNpemVVbml0OiBTaXplVW5pdEVudW0uUGl4ZWwsXHJcbiAgICByZWFkb25seSBpZDogJycsXHJcbiAgICByZWFkb25seSBpc0Nsb3NhYmxlOiBmYWxzZSxcclxuICAgIHJlYWRvbmx5IHRpdGxlOiAnJyxcclxuICAgIHJlYWRvbmx5IHJlb3JkZXJFbmFibGVkOiBmYWxzZSxcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFJlc29sdmVkR3JvdW5kSXRlbUNvbmZpZyB7XHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlKHJvb3RJdGVtQ29uZmlnOiBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnIHwgdW5kZWZpbmVkKTpSZXNvbHZlZEdyb3VuZEl0ZW1Db25maWcge1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSByb290SXRlbUNvbmZpZyA9PT0gdW5kZWZpbmVkID8gW10gOiBbcm9vdEl0ZW1Db25maWddO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHR5cGU6IEl0ZW1UeXBlLmdyb3VuZCxcclxuICAgICAgICAgICAgY29udGVudCxcclxuICAgICAgICAgICAgc2l6ZTogMTAwLFxyXG4gICAgICAgICAgICBzaXplVW5pdDogU2l6ZVVuaXRFbnVtLlBlcmNlbnQsXHJcbiAgICAgICAgICAgIG1pblNpemU6IDAsXHJcbiAgICAgICAgICAgIG1pblNpemVVbml0OiBTaXplVW5pdEVudW0uUGl4ZWwsXHJcbiAgICAgICAgICAgIGlkOiAnJyxcclxuICAgICAgICAgICAgaXNDbG9zYWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIHRpdGxlOiAnJyxcclxuICAgICAgICAgICAgcmVvcmRlckVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZExheW91dENvbmZpZyB7XHJcbiAgICByZWFkb25seSByb290OiBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnIHwgdW5kZWZpbmVkO1xyXG4gICAgcmVhZG9ubHkgb3BlblBvcG91dHM6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnW107XHJcbiAgICByZWFkb25seSBkaW1lbnNpb25zOiBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zO1xyXG4gICAgcmVhZG9ubHkgc2V0dGluZ3M6IFJlc29sdmVkTGF5b3V0Q29uZmlnLlNldHRpbmdzO1xyXG4gICAgcmVhZG9ubHkgaGVhZGVyOiBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXI7XHJcbiAgICByZWFkb25seSByZXNvbHZlZDogdHJ1ZSxcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBSZXNvbHZlZExheW91dENvbmZpZyB7XHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzIHtcclxuICAgICAgICAvLyBzZWUgQ29uZmlnLlNldHRpbmdzIGZvciBjb21tZW50c1xyXG4gICAgICAgIHJlYWRvbmx5IGRyYWdCZXR3ZWVuV2luZG93czogYm9vbGVhbjtcclxuICAgICAgICByZWFkb25seSBkcmFnVG9OZXdXaW5kb3c6IGJvb2xlYW47XHJcbiAgICAgICAgcmVhZG9ubHkgcmVvcmRlckVuYWJsZWQ6IGJvb2xlYW47IC8vIGFsc28gaW4gUmVzb2x2ZWRJdGVtQ29uZmlnIHdoaWNoIHRha2VzIHByZWNlZGVuY2VcclxuICAgICAgICByZWFkb25seSBwb3BvdXRXaG9sZVN0YWNrOiBib29sZWFuO1xyXG4gICAgICAgIHJlYWRvbmx5IGJsb2NrZWRQb3BvdXRzVGhyb3dFcnJvcjogYm9vbGVhbjtcclxuICAgICAgICAvKiogQGRlcHJlY2F0ZWQgV2lsbCBiZSByZW1vdmVkIGluIHZlcnNpb24gMy4gKi9cclxuICAgICAgICByZWFkb25seSBjbG9zZVBvcG91dHNPblVubG9hZDogYm9vbGVhbjtcclxuICAgICAgICByZWFkb25seSByZXNwb25zaXZlTW9kZTogUmVzcG9uc2l2ZU1vZGU7XHJcbiAgICAgICAgcmVhZG9ubHkgdGFiT3ZlcmxhcEFsbG93YW5jZTogbnVtYmVyO1xyXG4gICAgICAgIHJlYWRvbmx5IHJlb3JkZXJPblRhYk1lbnVDbGljazogYm9vbGVhbjtcclxuICAgICAgICByZWFkb25seSB0YWJDb250cm9sT2Zmc2V0OiBudW1iZXI7XHJcbiAgICAgICAgcmVhZG9ubHkgcG9wSW5PbkNsb3NlOiBib29sZWFuO1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBuYW1lc3BhY2UgU2V0dGluZ3Mge1xyXG4gICAgICAgIGV4cG9ydCBjb25zdCBkZWZhdWx0czogUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MgPSB7XHJcbiAgICAgICAgICAgIGRyYWdCZXR3ZWVuV2luZG93czogdHJ1ZSxcclxuICAgICAgICAgICAgZHJhZ1RvTmV3V2luZG93OiB0cnVlLFxyXG4gICAgICAgICAgICByZW9yZGVyRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICAgICAgcG9wb3V0V2hvbGVTdGFjazogZmFsc2UsXHJcbiAgICAgICAgICAgIGJsb2NrZWRQb3BvdXRzVGhyb3dFcnJvcjogdHJ1ZSxcclxuICAgICAgICAgICAgY2xvc2VQb3BvdXRzT25VbmxvYWQ6IHRydWUsXHJcbiAgICAgICAgICAgIHJlc3BvbnNpdmVNb2RlOiBSZXNwb25zaXZlTW9kZS5ub25lLCAvLyB3YXMgb25sb2FkXHJcbiAgICAgICAgICAgIHRhYk92ZXJsYXBBbGxvd2FuY2U6IDAsXHJcbiAgICAgICAgICAgIHJlb3JkZXJPblRhYk1lbnVDbGljazogdHJ1ZSxcclxuICAgICAgICAgICAgdGFiQ29udHJvbE9mZnNldDogMTAsXHJcbiAgICAgICAgICAgIHBvcEluT25DbG9zZTogZmFsc2UsXHJcbiAgICAgICAgfSBhcyBjb25zdDtcclxuXHJcbiAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvcHkob3JpZ2luYWw6IFNldHRpbmdzKTogU2V0dGluZ3Mge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgZHJhZ0JldHdlZW5XaW5kb3dzOiBvcmlnaW5hbC5kcmFnQmV0d2VlbldpbmRvd3MsXHJcbiAgICAgICAgICAgICAgICBkcmFnVG9OZXdXaW5kb3c6IG9yaWdpbmFsLmRyYWdUb05ld1dpbmRvdyxcclxuICAgICAgICAgICAgICAgIHJlb3JkZXJFbmFibGVkOiBvcmlnaW5hbC5yZW9yZGVyRW5hYmxlZCxcclxuICAgICAgICAgICAgICAgIHBvcG91dFdob2xlU3RhY2s6IG9yaWdpbmFsLnBvcG91dFdob2xlU3RhY2ssXHJcbiAgICAgICAgICAgICAgICBibG9ja2VkUG9wb3V0c1Rocm93RXJyb3I6IG9yaWdpbmFsLmJsb2NrZWRQb3BvdXRzVGhyb3dFcnJvcixcclxuICAgICAgICAgICAgICAgIGNsb3NlUG9wb3V0c09uVW5sb2FkOiBvcmlnaW5hbC5jbG9zZVBvcG91dHNPblVubG9hZCxcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNpdmVNb2RlOiBvcmlnaW5hbC5yZXNwb25zaXZlTW9kZSxcclxuICAgICAgICAgICAgICAgIHRhYk92ZXJsYXBBbGxvd2FuY2U6IG9yaWdpbmFsLnRhYk92ZXJsYXBBbGxvd2FuY2UsXHJcbiAgICAgICAgICAgICAgICByZW9yZGVyT25UYWJNZW51Q2xpY2s6IG9yaWdpbmFsLnJlb3JkZXJPblRhYk1lbnVDbGljayxcclxuICAgICAgICAgICAgICAgIHRhYkNvbnRyb2xPZmZzZXQ6IG9yaWdpbmFsLnRhYkNvbnRyb2xPZmZzZXQsXHJcbiAgICAgICAgICAgICAgICBwb3BJbk9uQ2xvc2U6IG9yaWdpbmFsLnBvcEluT25DbG9zZSxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIERpbWVuc2lvbnMge1xyXG4gICAgICAgIC8vIHNlZSBMYXlvdXRDb25maWcuRGltZW5zaW9ucyBmb3IgY29tbWVudHNcclxuICAgICAgICByZWFkb25seSBib3JkZXJXaWR0aDogbnVtYmVyO1xyXG4gICAgICAgIHJlYWRvbmx5IGJvcmRlckdyYWJXaWR0aDogbnVtYmVyLFxyXG4gICAgICAgIHJlYWRvbmx5IGRlZmF1bHRNaW5JdGVtSGVpZ2h0OiBudW1iZXI7XHJcbiAgICAgICAgcmVhZG9ubHkgZGVmYXVsdE1pbkl0ZW1IZWlnaHRVbml0OiBTaXplVW5pdEVudW07XHJcbiAgICAgICAgcmVhZG9ubHkgZGVmYXVsdE1pbkl0ZW1XaWR0aDogbnVtYmVyO1xyXG4gICAgICAgIHJlYWRvbmx5IGRlZmF1bHRNaW5JdGVtV2lkdGhVbml0OiBTaXplVW5pdEVudW07XHJcbiAgICAgICAgcmVhZG9ubHkgaGVhZGVySGVpZ2h0OiBudW1iZXI7XHJcbiAgICAgICAgcmVhZG9ubHkgZHJhZ1Byb3h5V2lkdGg6IG51bWJlcjtcclxuICAgICAgICByZWFkb25seSBkcmFnUHJveHlIZWlnaHQ6IG51bWJlcjtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgbmFtZXNwYWNlIERpbWVuc2lvbnMge1xyXG4gICAgICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb3B5KG9yaWdpbmFsOiBEaW1lbnNpb25zKTogRGltZW5zaW9ucyB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBib3JkZXJXaWR0aDogb3JpZ2luYWwuYm9yZGVyV2lkdGgsXHJcbiAgICAgICAgICAgICAgICBib3JkZXJHcmFiV2lkdGg6IG9yaWdpbmFsLmJvcmRlckdyYWJXaWR0aCxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRNaW5JdGVtSGVpZ2h0OiBvcmlnaW5hbC5kZWZhdWx0TWluSXRlbUhlaWdodCxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRNaW5JdGVtSGVpZ2h0VW5pdDogb3JpZ2luYWwuZGVmYXVsdE1pbkl0ZW1IZWlnaHRVbml0LFxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdE1pbkl0ZW1XaWR0aDogb3JpZ2luYWwuZGVmYXVsdE1pbkl0ZW1XaWR0aCxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRNaW5JdGVtV2lkdGhVbml0OiBvcmlnaW5hbC5kZWZhdWx0TWluSXRlbVdpZHRoVW5pdCxcclxuICAgICAgICAgICAgICAgIGhlYWRlckhlaWdodDogb3JpZ2luYWwuaGVhZGVySGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgZHJhZ1Byb3h5V2lkdGg6IG9yaWdpbmFsLmRyYWdQcm94eVdpZHRoLFxyXG4gICAgICAgICAgICAgICAgZHJhZ1Byb3h5SGVpZ2h0OiBvcmlnaW5hbC5kcmFnUHJveHlIZWlnaHQsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGV4cG9ydCBjb25zdCBkZWZhdWx0czogUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucyA9IHtcclxuICAgICAgICAgICAgYm9yZGVyV2lkdGg6IDUsXHJcbiAgICAgICAgICAgIGJvcmRlckdyYWJXaWR0aDogNSxcclxuICAgICAgICAgICAgZGVmYXVsdE1pbkl0ZW1IZWlnaHQ6IDAsXHJcbiAgICAgICAgICAgIGRlZmF1bHRNaW5JdGVtSGVpZ2h0VW5pdDogU2l6ZVVuaXRFbnVtLlBpeGVsLFxyXG4gICAgICAgICAgICBkZWZhdWx0TWluSXRlbVdpZHRoOiAxMCxcclxuICAgICAgICAgICAgZGVmYXVsdE1pbkl0ZW1XaWR0aFVuaXQ6IFNpemVVbml0RW51bS5QaXhlbCxcclxuICAgICAgICAgICAgaGVhZGVySGVpZ2h0OiAyMCxcclxuICAgICAgICAgICAgZHJhZ1Byb3h5V2lkdGg6IDMwMCxcclxuICAgICAgICAgICAgZHJhZ1Byb3h5SGVpZ2h0OiAyMDBcclxuICAgICAgICB9IGFzIGNvbnN0O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgSGVhZGVyIHtcclxuICAgICAgICByZWFkb25seSBzaG93OiBmYWxzZSB8IFNpZGU7XHJcbiAgICAgICAgcmVhZG9ubHkgcG9wb3V0OiBmYWxzZSB8IHN0cmluZztcclxuICAgICAgICByZWFkb25seSBwb3Bpbjogc3RyaW5nO1xyXG4gICAgICAgIHJlYWRvbmx5IG1heGltaXNlOiBmYWxzZSB8IHN0cmluZztcclxuICAgICAgICByZWFkb25seSBtaW5pbWlzZTogc3RyaW5nO1xyXG4gICAgICAgIHJlYWRvbmx5IGNsb3NlOiBmYWxzZSB8IHN0cmluZztcclxuICAgICAgICByZWFkb25seSB0YWJEcm9wZG93bjogZmFsc2UgfCBzdHJpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBIZWFkZXIge1xyXG4gICAgICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb3B5KG9yaWdpbmFsOiBIZWFkZXIpOiBIZWFkZXIge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgc2hvdzogb3JpZ2luYWwuc2hvdyxcclxuICAgICAgICAgICAgICAgIHBvcG91dDogb3JpZ2luYWwucG9wb3V0LFxyXG4gICAgICAgICAgICAgICAgcG9waW46IG9yaWdpbmFsLnBvcGluLFxyXG4gICAgICAgICAgICAgICAgY2xvc2U6IG9yaWdpbmFsLmNsb3NlLFxyXG4gICAgICAgICAgICAgICAgbWF4aW1pc2U6IG9yaWdpbmFsLm1heGltaXNlLFxyXG4gICAgICAgICAgICAgICAgbWluaW1pc2U6IG9yaWdpbmFsLm1pbmltaXNlLFxyXG4gICAgICAgICAgICAgICAgdGFiRHJvcGRvd246IG9yaWdpbmFsLnRhYkRyb3Bkb3duLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBleHBvcnQgY29uc3QgZGVmYXVsdHM6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkhlYWRlciA9IHtcclxuICAgICAgICAgICAgc2hvdzogU2lkZS50b3AsXHJcbiAgICAgICAgICAgIHBvcG91dDogJ29wZW4gaW4gbmV3IHdpbmRvdycsXHJcbiAgICAgICAgICAgIHBvcGluOiAnZG9jaycsXHJcbiAgICAgICAgICAgIG1heGltaXNlOiAnbWF4aW1pc2UnLFxyXG4gICAgICAgICAgICBtaW5pbWlzZTogJ21pbmltaXNlJyxcclxuICAgICAgICAgICAgY2xvc2U6ICdjbG9zZScsXHJcbiAgICAgICAgICAgIHRhYkRyb3Bkb3duOiAnYWRkaXRpb25hbCB0YWJzJ1xyXG4gICAgICAgIH0gYXMgY29uc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGlzUG9wb3V0KGNvbmZpZzogUmVzb2x2ZWRMYXlvdXRDb25maWcpOiBjb25maWcgaXMgUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcge1xyXG4gICAgICAgIHJldHVybiAncGFyZW50SWQnIGluIGNvbmZpZztcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdCgpOiBSZXNvbHZlZExheW91dENvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZExheW91dENvbmZpZyA9IHtcclxuICAgICAgICAgICAgcm9vdDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBvcGVuUG9wb3V0czogW10sXHJcbiAgICAgICAgICAgIGRpbWVuc2lvbnM6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMuZGVmYXVsdHMsXHJcbiAgICAgICAgICAgIHNldHRpbmdzOiBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5kZWZhdWx0cyxcclxuICAgICAgICAgICAgaGVhZGVyOiBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIuZGVmYXVsdHMsXHJcbiAgICAgICAgICAgIHJlc29sdmVkOiB0cnVlLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb3B5KGNvbmZpZzogUmVzb2x2ZWRMYXlvdXRDb25maWcpOiBSZXNvbHZlZExheW91dENvbmZpZyB7XHJcbiAgICAgICAgaWYgKGlzUG9wb3V0KGNvbmZpZykpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLmNyZWF0ZUNvcHkoY29uZmlnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkTGF5b3V0Q29uZmlnID0ge1xyXG4gICAgICAgICAgICAgICAgcm9vdDogY29uZmlnLnJvb3QgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IFJlc29sdmVkUm9vdEl0ZW1Db25maWcuY3JlYXRlQ29weShjb25maWcucm9vdCksXHJcbiAgICAgICAgICAgICAgICBvcGVuUG9wb3V0czogUmVzb2x2ZWRMYXlvdXRDb25maWcuY29weU9wZW5Qb3BvdXRzKGNvbmZpZy5vcGVuUG9wb3V0cyksXHJcbiAgICAgICAgICAgICAgICBzZXR0aW5nczogUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuY3JlYXRlQ29weShjb25maWcuc2V0dGluZ3MpLFxyXG4gICAgICAgICAgICAgICAgZGltZW5zaW9uczogUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucy5jcmVhdGVDb3B5KGNvbmZpZy5kaW1lbnNpb25zKSxcclxuICAgICAgICAgICAgICAgIGhlYWRlcjogUmVzb2x2ZWRMYXlvdXRDb25maWcuSGVhZGVyLmNyZWF0ZUNvcHkoY29uZmlnLmhlYWRlciksXHJcbiAgICAgICAgICAgICAgICByZXNvbHZlZDogY29uZmlnLnJlc29sdmVkLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjb3B5T3BlblBvcG91dHMob3JpZ2luYWw6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnW10pOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZ1tdIHtcclxuICAgICAgICBjb25zdCBjb3VudCA9IG9yaWdpbmFsLmxlbmd0aDtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8UmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWc+KGNvdW50KTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgcmVzdWx0W2ldID0gUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcuY3JlYXRlQ29weShvcmlnaW5hbFtpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlcyBhIEdvbGRlbkxheW91dCBjb25maWd1cmF0aW9uIG9iamVjdCBhbmRcclxuICAgICAqIHJlcGxhY2VzIGl0cyBrZXlzIGFuZCB2YWx1ZXMgcmVjdXJzaXZlbHkgd2l0aFxyXG4gICAgICogb25lIGxldHRlciBjb3VudGVycGFydHNcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIG1pbmlmeUNvbmZpZyhsYXlvdXRDb25maWc6IFJlc29sdmVkTGF5b3V0Q29uZmlnKTogUmVzb2x2ZWRMYXlvdXRDb25maWcge1xyXG4gICAgICAgIHJldHVybiBDb25maWdNaW5pZmllci50cmFuc2xhdGVPYmplY3QobGF5b3V0Q29uZmlnLCB0cnVlKSBhcyBSZXNvbHZlZExheW91dENvbmZpZztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRha2VzIGEgY29uZmlndXJhdGlvbiBPYmplY3QgdGhhdCB3YXMgcHJldmlvdXNseSBtaW5pZmllZFxyXG4gICAgICogdXNpbmcgbWluaWZ5Q29uZmlnIGFuZCByZXR1cm5zIGl0cyBvcmlnaW5hbCB2ZXJzaW9uXHJcbiAgICAgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiB1bm1pbmlmeUNvbmZpZyhtaW5pZmllZENvbmZpZzogUmVzb2x2ZWRMYXlvdXRDb25maWcpOiBSZXNvbHZlZExheW91dENvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIENvbmZpZ01pbmlmaWVyLnRyYW5zbGF0ZU9iamVjdChtaW5pZmllZENvbmZpZywgZmFsc2UpIGFzIFJlc29sdmVkTGF5b3V0Q29uZmlnO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnIGV4dGVuZHMgUmVzb2x2ZWRMYXlvdXRDb25maWcge1xyXG4gICAgcmVhZG9ubHkgcGFyZW50SWQ6IHN0cmluZyB8IG51bGw7XHJcbiAgICByZWFkb25seSBpbmRleEluUGFyZW50OiBudW1iZXIgfCBudWxsO1xyXG4gICAgcmVhZG9ubHkgd2luZG93OiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZy5XaW5kb3c7XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcge1xyXG4gICAgZXhwb3J0IGludGVyZmFjZSBXaW5kb3cge1xyXG4gICAgICAgIHJlYWRvbmx5IHdpZHRoOiBudW1iZXIgfCBudWxsLFxyXG4gICAgICAgIHJlYWRvbmx5IGhlaWdodDogbnVtYmVyIHwgbnVsbCxcclxuICAgICAgICByZWFkb25seSBsZWZ0OiBudW1iZXIgfCBudWxsLFxyXG4gICAgICAgIHJlYWRvbmx5IHRvcDogbnVtYmVyIHwgbnVsbCxcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgbmFtZXNwYWNlIFdpbmRvdyB7XHJcbiAgICAgICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvcHkob3JpZ2luYWw6IFdpbmRvdyk6IFdpbmRvdyB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB3aWR0aDogb3JpZ2luYWwud2lkdGgsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IG9yaWdpbmFsLmhlaWdodCxcclxuICAgICAgICAgICAgICAgIGxlZnQ6IG9yaWdpbmFsLmxlZnQsXHJcbiAgICAgICAgICAgICAgICB0b3A6IG9yaWdpbmFsLnRvcCxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZXhwb3J0IGNvbnN0IGRlZmF1bHRzOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZy5XaW5kb3cgPSB7XHJcbiAgICAgICAgICAgIHdpZHRoOiBudWxsLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IG51bGwsXHJcbiAgICAgICAgICAgIGxlZnQ6IG51bGwsXHJcbiAgICAgICAgICAgIHRvcDogbnVsbCxcclxuICAgICAgICB9IGFzIGNvbnN0O1xyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb3B5KG9yaWdpbmFsOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyk6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnID0ge1xyXG4gICAgICAgICAgICByb290OiBvcmlnaW5hbC5yb290ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnLmNyZWF0ZUNvcHkob3JpZ2luYWwucm9vdCksXHJcbiAgICAgICAgICAgIG9wZW5Qb3BvdXRzOiBSZXNvbHZlZExheW91dENvbmZpZy5jb3B5T3BlblBvcG91dHMob3JpZ2luYWwub3BlblBvcG91dHMpLFxyXG4gICAgICAgICAgICBzZXR0aW5nczogUmVzb2x2ZWRMYXlvdXRDb25maWcuU2V0dGluZ3MuY3JlYXRlQ29weShvcmlnaW5hbC5zZXR0aW5ncyksXHJcbiAgICAgICAgICAgIGRpbWVuc2lvbnM6IFJlc29sdmVkTGF5b3V0Q29uZmlnLkRpbWVuc2lvbnMuY3JlYXRlQ29weShvcmlnaW5hbC5kaW1lbnNpb25zKSxcclxuICAgICAgICAgICAgaGVhZGVyOiBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIuY3JlYXRlQ29weShvcmlnaW5hbC5oZWFkZXIpLFxyXG4gICAgICAgICAgICBwYXJlbnRJZDogb3JpZ2luYWwucGFyZW50SWQsXHJcbiAgICAgICAgICAgIGluZGV4SW5QYXJlbnQ6IG9yaWdpbmFsLmluZGV4SW5QYXJlbnQsXHJcbiAgICAgICAgICAgIHdpbmRvdzogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcuV2luZG93LmNyZWF0ZUNvcHkob3JpZ2luYWwud2luZG93KSxcclxuICAgICAgICAgICAgcmVzb2x2ZWQ6IG9yaWdpbmFsLnJlc29sdmVkLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IENvbXBvbmVudEl0ZW1Db25maWcsIEl0ZW1Db25maWcgfSBmcm9tICcuLi9jb25maWcvY29uZmlnJztcclxuaW1wb3J0IHsgUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL3Jlc29sdmVkLWNvbmZpZyc7XHJcbmltcG9ydCB7IFRhYiB9IGZyb20gJy4uL2NvbnRyb2xzL3RhYic7XHJcbmltcG9ydCB7IEFzc2VydEVycm9yLCBVbmV4cGVjdGVkTnVsbEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgQ29tcG9uZW50SXRlbSB9IGZyb20gJy4uL2l0ZW1zL2NvbXBvbmVudC1pdGVtJztcclxuaW1wb3J0IHsgQ29udGVudEl0ZW0gfSBmcm9tICcuLi9pdGVtcy9jb250ZW50LWl0ZW0nO1xyXG5pbXBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi4vbGF5b3V0LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi91dGlscy9ldmVudC1lbWl0dGVyJztcclxuaW1wb3J0IHsgSnNvblZhbHVlLCBMb2dpY2FsWkluZGV4LCBMb2dpY2FsWkluZGV4VG9EZWZhdWx0TWFwIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnO1xyXG5pbXBvcnQgeyBkZWVwRXh0ZW5kLCBzZXRFbGVtZW50SGVpZ2h0LCBzZXRFbGVtZW50V2lkdGggfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50Q29udGFpbmVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2NvbXBvbmVudFR5cGU6IEpzb25WYWx1ZTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2JvdW5kQ29tcG9uZW50OiBDb21wb25lbnRDb250YWluZXIuQmluZGFibGVDb21wb25lbnQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF93aWR0aDogbnVtYmVyO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaGVpZ2h0OiBudW1iZXI7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9pc0Nsb3NhYmxlO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaW5pdGlhbFN0YXRlOiBKc29uVmFsdWUgfCB1bmRlZmluZWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9zdGF0ZTogSnNvblZhbHVlIHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfdmlzaWJsZTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2lzU2hvd25XaXRoWmVyb0RpbWVuc2lvbnM7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF90YWI6IFRhYjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3N0YWNrTWF4aW1pc2VkID0gZmFsc2U7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9sb2dpY2FsWkluZGV4OiBMb2dpY2FsWkluZGV4O1xyXG5cclxuICAgIHN0YXRlUmVxdWVzdEV2ZW50OiBDb21wb25lbnRDb250YWluZXIuU3RhdGVSZXF1ZXN0RXZlbnRIYW5kbGVyIHwgdW5kZWZpbmVkO1xyXG4gICAgdmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50OiBDb21wb25lbnRDb250YWluZXIuVmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50IHwgdW5kZWZpbmVkO1xyXG4gICAgdmlydHVhbFZpc2liaWxpdHlDaGFuZ2VSZXF1aXJlZEV2ZW50OiBDb21wb25lbnRDb250YWluZXIuVmlydHVhbFZpc2liaWxpdHlDaGFuZ2VSZXF1aXJlZEV2ZW50IHwgdW5kZWZpbmVkO1xyXG4gICAgdmlydHVhbFpJbmRleENoYW5nZVJlcXVpcmVkRXZlbnQ6IENvbXBvbmVudENvbnRhaW5lci5WaXJ0dWFsWkluZGV4Q2hhbmdlUmVxdWlyZWRFdmVudCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICBnZXQgd2lkdGgoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3dpZHRoOyB9XHJcbiAgICBnZXQgaGVpZ2h0KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9oZWlnaHQ7IH1cclxuICAgIGdldCBwYXJlbnQoKTogQ29tcG9uZW50SXRlbSB7IHJldHVybiB0aGlzLl9wYXJlbnQ7IH1cclxuICAgIC8qKiBAaW50ZXJuYWwgQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoQ29tcG9uZW50Q29udGFpbmVyOmNsYXNzKS5jb21wb25lbnRUeXBlfSAqL1xyXG4gICAgZ2V0IGNvbXBvbmVudE5hbWUoKTogSnNvblZhbHVlIHsgcmV0dXJuIHRoaXMuX2NvbXBvbmVudFR5cGU7IH1cclxuICAgIGdldCBjb21wb25lbnRUeXBlKCk6IEpzb25WYWx1ZSB7IHJldHVybiB0aGlzLl9jb21wb25lbnRUeXBlOyB9XHJcbiAgICBnZXQgdmlydHVhbCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2JvdW5kQ29tcG9uZW50LnZpcnR1YWw7IH1cclxuICAgIGdldCBjb21wb25lbnQoKTogQ29tcG9uZW50Q29udGFpbmVyLkNvbXBvbmVudCB7IHJldHVybiB0aGlzLl9ib3VuZENvbXBvbmVudC5jb21wb25lbnQ7IH1cclxuICAgIGdldCB0YWIoKTogVGFiIHsgcmV0dXJuIHRoaXMuX3RhYjsgfVxyXG4gICAgZ2V0IHRpdGxlKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9wYXJlbnQudGl0bGU7IH1cclxuICAgIGdldCBsYXlvdXRNYW5hZ2VyKCk6IExheW91dE1hbmFnZXIgeyByZXR1cm4gdGhpcy5fbGF5b3V0TWFuYWdlcjsgfVxyXG4gICAgZ2V0IGlzSGlkZGVuKCk6IGJvb2xlYW4geyByZXR1cm4gIXRoaXMuX3Zpc2libGU7IH1cclxuICAgIGdldCB2aXNpYmxlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fdmlzaWJsZTsgfVxyXG4gICAgZ2V0IHN0YXRlKCk6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9zdGF0ZTsgfVxyXG4gICAgLyoqIFJldHVybiB0aGUgaW5pdGlhbCBjb21wb25lbnQgc3RhdGUgKi9cclxuICAgIGdldCBpbml0aWFsU3RhdGUoKTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX2luaXRpYWxTdGF0ZTsgfVxyXG4gICAgLyoqIFRoZSBpbm5lciBET00gZWxlbWVudCB3aGVyZSB0aGUgY29udGFpbmVyJ3MgY29udGVudCBpcyBpbnRlbmRlZCB0byBsaXZlIGluICovXHJcbiAgICBnZXQgZWxlbWVudCgpOiBIVE1MRWxlbWVudCB7IHJldHVybiB0aGlzLl9lbGVtZW50OyB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbmZpZzogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9wYXJlbnQ6IENvbXBvbmVudEl0ZW0sXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2xheW91dE1hbmFnZXI6IExheW91dE1hbmFnZXIsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnQ6IEhUTUxFbGVtZW50LFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF91cGRhdGVJdGVtQ29uZmlnRXZlbnQ6IENvbXBvbmVudENvbnRhaW5lci5VcGRhdGVJdGVtQ29uZmlnRXZlbnRIYW5kbGVyLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9zaG93RXZlbnQ6IENvbXBvbmVudENvbnRhaW5lci5TaG93RXZlbnRIYW5kbGVyLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9oaWRlRXZlbnQ6IENvbXBvbmVudENvbnRhaW5lci5IaWRlRXZlbnRIYW5kbGVyLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9mb2N1c0V2ZW50OiBDb21wb25lbnRDb250YWluZXIuRm9jdXNFdmVudEhhbmRsZXIsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2JsdXJFdmVudDogQ29tcG9uZW50Q29udGFpbmVyLkJsdXJFdmVudEhhbmRsZXIsXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICB0aGlzLl93aWR0aCA9IDA7XHJcbiAgICAgICAgdGhpcy5faGVpZ2h0ID0gMDtcclxuICAgICAgICB0aGlzLl92aXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9pc1Nob3duV2l0aFplcm9EaW1lbnNpb25zID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50VHlwZSA9IF9jb25maWcuY29tcG9uZW50VHlwZTtcclxuICAgICAgICB0aGlzLl9pc0Nsb3NhYmxlID0gX2NvbmZpZy5pc0Nsb3NhYmxlO1xyXG4gICAgICAgIHRoaXMuX2luaXRpYWxTdGF0ZSA9IF9jb25maWcuY29tcG9uZW50U3RhdGU7XHJcbiAgICAgICAgdGhpcy5fc3RhdGUgPSB0aGlzLl9pbml0aWFsU3RhdGU7XHJcblxyXG4gICAgICAgIHRoaXMuX2JvdW5kQ29tcG9uZW50ID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmJpbmRDb21wb25lbnQodGhpcywgX2NvbmZpZyk7XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlRWxlbWVudFBvc2l0aW9uUHJvcGVydHlGcm9tQm91bmRDb21wb25lbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucmVsZWFzZUNvbXBvbmVudCgpO1xyXG4gICAgICAgIHRoaXMuc3RhdGVSZXF1ZXN0RXZlbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdkZXN0cm95Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKENvbXBvbmVudENvbnRhaW5lcjpjbGFzcykuZWxlbWVudCB9ICovXHJcbiAgICBnZXRFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhpZGVzIHRoZSBjb250YWluZXIncyBjb21wb25lbnQgaXRlbSAoYW5kIGhlbmNlLCB0aGUgY29udGFpbmVyKSBpZiBub3QgYWxyZWFkeSBoaWRkZW4uXHJcbiAgICAgKiBFbWl0cyBoaWRlIGV2ZW50IHByaW9yIHRvIGhpZGluZyB0aGUgY29udGFpbmVyLlxyXG4gICAgICovXHJcbiAgICBoaWRlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2hpZGVFdmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hvd3MgdGhlIGNvbnRhaW5lcidzIGNvbXBvbmVudCBpdGVtIChhbmQgaGVuY2UsIHRoZSBjb250YWluZXIpIGlmIG5vdCB2aXNpYmxlLlxyXG4gICAgICogRW1pdHMgc2hvdyBldmVudCBwcmlvciB0byBoaWRpbmcgdGhlIGNvbnRhaW5lci5cclxuICAgICAqL1xyXG4gICAgc2hvdygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9zaG93RXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZvY3VzIHRoaXMgY29tcG9uZW50IGluIExheW91dC5cclxuICAgICAqL1xyXG4gICAgZm9jdXMoc3VwcHJlc3NFdmVudCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZm9jdXNFdmVudChzdXBwcmVzc0V2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZSBmb2N1cyBmcm9tIHRoaXMgY29tcG9uZW50IGluIExheW91dC5cclxuICAgICAqL1xyXG4gICAgYmx1cihzdXBwcmVzc0V2ZW50ID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9ibHVyRXZlbnQoc3VwcHJlc3NFdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHNpemUgZnJvbSB3aXRoaW4gdGhlIGNvbnRhaW5lci4gVHJhdmVyc2VzIHVwXHJcbiAgICAgKiB0aGUgaXRlbSB0cmVlIHVudGlsIGl0IGZpbmRzIGEgcm93IG9yIGNvbHVtbiBlbGVtZW50XHJcbiAgICAgKiBhbmQgcmVzaXplcyBpdHMgaXRlbXMgYWNjb3JkaW5nbHkuXHJcbiAgICAgKlxyXG4gICAgICogSWYgdGhpcyBjb250YWluZXIgaXNuJ3QgYSBkZXNjZW5kYW50IG9mIGEgcm93IG9yIGNvbHVtblxyXG4gICAgICogaXQgcmV0dXJucyBmYWxzZVxyXG4gICAgICogQHBhcmFtIHdpZHRoIC0gVGhlIG5ldyB3aWR0aCBpbiBwaXhlbFxyXG4gICAgICogQHBhcmFtIGhlaWdodCAtIFRoZSBuZXcgaGVpZ2h0IGluIHBpeGVsXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgcmVzaXplU3VjY2VzZnVsXHJcbiAgICAgKlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHNldFNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgYW5jZXN0b3JJdGVtOiBDb250ZW50SXRlbSB8IG51bGwgPSB0aGlzLl9wYXJlbnQ7XHJcbiAgICAgICAgaWYgKGFuY2VzdG9ySXRlbS5pc0NvbHVtbiB8fCBhbmNlc3Rvckl0ZW0uaXNSb3cgfHwgYW5jZXN0b3JJdGVtLnBhcmVudCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0lDU1NQUkMnLCAnQ29tcG9uZW50Q29udGFpbmVyIGNhbm5vdCBoYXZlIFJvd0NvbHVtbiBQYXJlbnQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgYW5jZXN0b3JDaGlsZEl0ZW06IENvbnRlbnRJdGVtO1xyXG4gICAgICAgICAgICBkbyB7XHJcbiAgICAgICAgICAgICAgICBhbmNlc3RvckNoaWxkSXRlbSA9IGFuY2VzdG9ySXRlbTtcclxuICAgICAgICAgICAgICAgIGFuY2VzdG9ySXRlbSA9IGFuY2VzdG9ySXRlbS5wYXJlbnQ7XHJcbiAgICAgICAgICAgIH0gd2hpbGUgKGFuY2VzdG9ySXRlbSAhPT0gbnVsbCAmJiAhYW5jZXN0b3JJdGVtLmlzQ29sdW1uICYmICFhbmNlc3Rvckl0ZW0uaXNSb3cpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFuY2VzdG9ySXRlbSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgLy8gbm8gUm93IG9yIENvbHVtbiBmb3VuZFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gYW5jZXN0b3JJdGVtIGlzIFJvdyBvciBDb2x1bW5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGFuY2VzdG9ySXRlbS5pc0NvbHVtbiA/ICdoZWlnaHQnIDogJ3dpZHRoJztcclxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTaXplID0gdGhpc1tkaXJlY3Rpb25dO1xyXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTaXplID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0lDU1NDUzExMTk0Jyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1NpemUgPSBkaXJlY3Rpb24gPT09ICdoZWlnaHQnID8gaGVpZ2h0IDogd2lkdGg7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvdGFsUGl4ZWwgPSBjdXJyZW50U2l6ZSAqICgxIC8gKGFuY2VzdG9yQ2hpbGRJdGVtLnNpemUgLyAxMDApKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gKG5ld1NpemUgLyB0b3RhbFBpeGVsKSAqIDEwMDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWx0YSA9IChhbmNlc3RvckNoaWxkSXRlbS5zaXplIC0gcGVyY2VudGFnZSkgLyAoYW5jZXN0b3JJdGVtLmNvbnRlbnRJdGVtcy5sZW5ndGggLSAxKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbmNlc3Rvckl0ZW0uY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuY2VzdG9ySXRlbUNvbnRlbnRJdGVtID0gYW5jZXN0b3JJdGVtLmNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFuY2VzdG9ySXRlbUNvbnRlbnRJdGVtID09PSBhbmNlc3RvckNoaWxkSXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3JJdGVtQ29udGVudEl0ZW0uc2l6ZSA9IHBlcmNlbnRhZ2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNlc3Rvckl0ZW1Db250ZW50SXRlbS5zaXplICs9IGRlbHRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBhbmNlc3Rvckl0ZW0udXBkYXRlU2l6ZShmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2xvc2VzIHRoZSBjb250YWluZXIgaWYgaXQgaXMgY2xvc2FibGUuIENhbiBiZSBjYWxsZWQgYnlcclxuICAgICAqIGJvdGggdGhlIGNvbXBvbmVudCB3aXRoaW4gYXQgYXMgd2VsbCBhcyB0aGUgY29udGVudEl0ZW0gY29udGFpbmluZ1xyXG4gICAgICogaXQuIEVtaXRzIGEgY2xvc2UgZXZlbnQgYmVmb3JlIHRoZSBjb250YWluZXIgaXRzZWxmIGlzIGNsb3NlZC5cclxuICAgICAqL1xyXG4gICAgY2xvc2UoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzQ2xvc2FibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdjbG9zZScpO1xyXG4gICAgICAgICAgICB0aGlzLl9wYXJlbnQuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFJlcGxhY2VzIGNvbXBvbmVudCB3aXRob3V0IGFmZmVjdGluZyBsYXlvdXQgKi9cclxuICAgIHJlcGxhY2VDb21wb25lbnQoaXRlbUNvbmZpZzogQ29tcG9uZW50SXRlbUNvbmZpZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucmVsZWFzZUNvbXBvbmVudCgpO1xyXG5cclxuICAgICAgICBpZiAoIUl0ZW1Db25maWcuaXNDb21wb25lbnQoaXRlbUNvbmZpZykpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXBsYWNlQ29tcG9uZW50IG5vdCBwYXNzZWQgYSBjb21wb25lbnQgSXRlbUNvbmZpZycpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgY29uZmlnID0gQ29tcG9uZW50SXRlbUNvbmZpZy5yZXNvbHZlKGl0ZW1Db25maWcsIGZhbHNlKTtcclxuICAgICAgICAgICAgdGhpcy5faW5pdGlhbFN0YXRlID0gY29uZmlnLmNvbXBvbmVudFN0YXRlO1xyXG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSA9IHRoaXMuX2luaXRpYWxTdGF0ZTtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50VHlwZSA9IGNvbmZpZy5jb21wb25lbnRUeXBlO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlSXRlbUNvbmZpZ0V2ZW50KGNvbmZpZyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9ib3VuZENvbXBvbmVudCA9IHRoaXMubGF5b3V0TWFuYWdlci5iaW5kQ29tcG9uZW50KHRoaXMsIGNvbmZpZyk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRWxlbWVudFBvc2l0aW9uUHJvcGVydHlGcm9tQm91bmRDb21wb25lbnQoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9ib3VuZENvbXBvbmVudC52aXJ0dWFsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy52aXJ0dWFsVmlzaWJpbGl0eUNoYW5nZVJlcXVpcmVkRXZlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlydHVhbFZpc2liaWxpdHlDaGFuZ2VSZXF1aXJlZEV2ZW50KHRoaXMsIHRoaXMuX3Zpc2libGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXlvdXRNYW5hZ2VyLmZpcmVCZWZvcmVWaXJ0dWFsUmVjdGluZ0V2ZW50KDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50KHRoaXMsIHRoaXMuX3dpZHRoLCB0aGlzLl9oZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xheW91dE1hbmFnZXIuZmlyZUFmdGVyVmlydHVhbFJlY3RpbmdFdmVudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0QmFzZUxvZ2ljYWxaSW5kZXgoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdzdGF0ZUNoYW5nZWQnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBpbml0aWFsIGNvbXBvbmVudCBzdGF0ZSBvciB0aGUgbGF0ZXN0IHBhc3NlZCBpbiBzZXRTdGF0ZSgpXHJcbiAgICAgKiBAcmV0dXJucyBzdGF0ZVxyXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAoQ29tcG9uZW50Q29udGFpbmVyOmNsYXNzKS5pbml0aWFsU3RhdGV9XHJcbiAgICAgKi9cclxuICAgIGdldFN0YXRlKCk6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWVyZ2VzIHRoZSBwcm92aWRlZCBzdGF0ZSBpbnRvIHRoZSBjdXJyZW50IG9uZVxyXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAoQ29tcG9uZW50Q29udGFpbmVyOmNsYXNzKS5zdGF0ZVJlcXVlc3RFdmVudH1cclxuICAgICAqL1xyXG4gICAgZXh0ZW5kU3RhdGUoc3RhdGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZXh0ZW5kZWRTdGF0ZSA9IGRlZXBFeHRlbmQodGhpcy5fc3RhdGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHN0YXRlKTtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKGV4dGVuZGVkU3RhdGUgYXMgSnNvblZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvbXBvbmVudCBzdGF0ZVxyXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAoQ29tcG9uZW50Q29udGFpbmVyOmNsYXNzKS5zdGF0ZVJlcXVlc3RFdmVudH1cclxuICAgICAqL1xyXG4gICAgc2V0U3RhdGUoc3RhdGU6IEpzb25WYWx1ZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3N0YXRlID0gc3RhdGU7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmVtaXRCYXNlQnViYmxpbmdFdmVudCgnc3RhdGVDaGFuZ2VkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQncyB0aGUgY29tcG9uZW50cyB0aXRsZVxyXG4gICAgICovXHJcbiAgICBzZXRUaXRsZSh0aXRsZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LnNldFRpdGxlKHRpdGxlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBzZXRUYWIodGFiOiBUYWIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl90YWIgPSB0YWI7XHJcbiAgICAgICAgdGhpcy5lbWl0KCd0YWInLCB0YWIpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc2V0VmlzaWJpbGl0eSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9ib3VuZENvbXBvbmVudC52aXJ0dWFsKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnZpcnR1YWxWaXNpYmlsaXR5Q2hhbmdlUmVxdWlyZWRFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZpcnR1YWxWaXNpYmlsaXR5Q2hhbmdlUmVxdWlyZWRFdmVudCh0aGlzLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX3Zpc2libGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Zpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2hlaWdodCA9PT0gMCAmJiB0aGlzLl93aWR0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzU2hvd25XaXRoWmVyb0RpbWVuc2lvbnMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc1Nob3duV2l0aFplcm9EaW1lbnNpb25zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTaXplVG9Ob2RlU2l6ZSh0aGlzLl93aWR0aCwgdGhpcy5faGVpZ2h0LCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRTaG93KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNTaG93bldpdGhaZXJvRGltZW5zaW9ucyAmJiAodGhpcy5faGVpZ2h0ICE9PSAwIHx8IHRoaXMuX3dpZHRoICE9PSAwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzU2hvd25XaXRoWmVyb0RpbWVuc2lvbnMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFNpemVUb05vZGVTaXplKHRoaXMuX3dpZHRoLCB0aGlzLl9oZWlnaHQsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFNob3coKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl92aXNpYmxlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pc1Nob3duV2l0aFplcm9EaW1lbnNpb25zID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRIaWRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0QmFzZUxvZ2ljYWxaSW5kZXgoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXRMb2dpY2FsWkluZGV4KExvZ2ljYWxaSW5kZXguYmFzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0TG9naWNhbFpJbmRleChsb2dpY2FsWkluZGV4OiBMb2dpY2FsWkluZGV4KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGxvZ2ljYWxaSW5kZXggIT09IHRoaXMuX2xvZ2ljYWxaSW5kZXgpIHtcclxuICAgICAgICAgICAgdGhpcy5fbG9naWNhbFpJbmRleCA9IGxvZ2ljYWxaSW5kZXg7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm5vdGlmeVZpcnR1YWxaSW5kZXhDaGFuZ2VSZXF1aXJlZCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgY29udGFpbmVyJ3Mgc2l6ZSwgYnV0IGNvbnNpZGVyZWQgdGVtcG9yYXJ5IChmb3IgZHJhZ2dpbmcpXHJcbiAgICAgKiBzbyBkb24ndCBlbWl0IGFueSBldmVudHMuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgZW50ZXJEcmFnTW9kZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3dpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgdGhpcy5faGVpZ2h0ID0gaGVpZ2h0O1xyXG4gICAgICAgIHNldEVsZW1lbnRXaWR0aCh0aGlzLl9lbGVtZW50LCB3aWR0aCk7XHJcbiAgICAgICAgc2V0RWxlbWVudEhlaWdodCh0aGlzLl9lbGVtZW50LCBoZWlnaHQpO1xyXG5cclxuICAgICAgICB0aGlzLnNldExvZ2ljYWxaSW5kZXgoTG9naWNhbFpJbmRleC5kcmFnKTtcclxuXHJcbiAgICAgICAgdGhpcy5kcmFnKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhpdERyYWdNb2RlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2V0QmFzZUxvZ2ljYWxaSW5kZXgoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBlbnRlclN0YWNrTWF4aW1pc2VkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3N0YWNrTWF4aW1pc2VkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnNldExvZ2ljYWxaSW5kZXgoTG9naWNhbFpJbmRleC5zdGFja01heGltaXNlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhpdFN0YWNrTWF4aW1pc2VkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2V0QmFzZUxvZ2ljYWxaSW5kZXgoKTtcclxuICAgICAgICB0aGlzLl9zdGFja01heGltaXNlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGRyYWcoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2JvdW5kQ29tcG9uZW50LnZpcnR1YWwpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMudmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2xheW91dE1hbmFnZXIuZmlyZUJlZm9yZVZpcnR1YWxSZWN0aW5nRXZlbnQoMSk7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50KHRoaXMsIHRoaXMuX3dpZHRoLCB0aGlzLl9oZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXlvdXRNYW5hZ2VyLmZpcmVBZnRlclZpcnR1YWxSZWN0aW5nRXZlbnQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvbnRhaW5lcidzIHNpemUuIENhbGxlZCBieSB0aGUgY29udGFpbmVyJ3MgY29tcG9uZW50IGl0ZW0uXHJcbiAgICAgKiBUbyBpbnN0ZWFkIHNldCB0aGUgc2l6ZSBwcm9ncmFtbWF0aWNhbGx5IGZyb20gd2l0aGluIHRoZSBjb21wb25lbnQgaXRzZWxmLFxyXG4gICAgICogdXNlIHRoZSBwdWJsaWMgc2V0U2l6ZSBtZXRob2RcclxuICAgICAqIEBwYXJhbSB3aWR0aCAtIGluIHB4XHJcbiAgICAgKiBAcGFyYW0gaGVpZ2h0IC0gaW4gcHhcclxuICAgICAqIEBwYXJhbSBmb3JjZSAtIHNldCBldmVuIGlmIG5vIGNoYW5nZVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHNldFNpemVUb05vZGVTaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBmb3JjZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGlmICh3aWR0aCAhPT0gdGhpcy5fd2lkdGggfHwgaGVpZ2h0ICE9PSB0aGlzLl9oZWlnaHQgfHwgZm9yY2UpIHtcclxuICAgICAgICAgICAgdGhpcy5fd2lkdGggPSB3aWR0aDtcclxuICAgICAgICAgICAgdGhpcy5faGVpZ2h0ID0gaGVpZ2h0O1xyXG4gICAgICAgICAgICBzZXRFbGVtZW50V2lkdGgodGhpcy5fZWxlbWVudCwgd2lkdGgpO1xyXG4gICAgICAgICAgICBzZXRFbGVtZW50SGVpZ2h0KHRoaXMuX2VsZW1lbnQsIGhlaWdodCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fYm91bmRDb21wb25lbnQudmlydHVhbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRWaXJ0dWFsU2l6ZWRDb250YWluZXJUb0xheW91dE1hbmFnZXIoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgncmVzaXplJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrU2hvd25Gcm9tWmVyb0RpbWVuc2lvbnMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBub3RpZnlWaXJ0dWFsUmVjdGluZ1JlcXVpcmVkKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnZpcnR1YWxSZWN0aW5nUmVxdWlyZWRFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50KHRoaXMsIHRoaXMuX3dpZHRoLCB0aGlzLl9oZWlnaHQpO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3Jlc2l6ZScpO1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrU2hvd25Gcm9tWmVyb0RpbWVuc2lvbnMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBub3RpZnlWaXJ0dWFsWkluZGV4Q2hhbmdlUmVxdWlyZWQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMudmlydHVhbFpJbmRleENoYW5nZVJlcXVpcmVkRXZlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCBsb2dpY2FsWkluZGV4ID0gdGhpcy5fbG9naWNhbFpJbmRleDtcclxuICAgICAgICAgICAgY29uc3QgZGVmYXVsdFpJbmRleCA9IExvZ2ljYWxaSW5kZXhUb0RlZmF1bHRNYXBbbG9naWNhbFpJbmRleF07XHJcbiAgICAgICAgICAgIHRoaXMudmlydHVhbFpJbmRleENoYW5nZVJlcXVpcmVkRXZlbnQodGhpcywgbG9naWNhbFpJbmRleCwgZGVmYXVsdFpJbmRleCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgdXBkYXRlRWxlbWVudFBvc2l0aW9uUHJvcGVydHlGcm9tQm91bmRDb21wb25lbnQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2JvdW5kQ29tcG9uZW50LnZpcnR1YWwpIHtcclxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdzdGF0aWMnO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnJzsgLy8gc2V0IGl0IGJhY2sgdG8gYXR0cmlidXRlIHZhbHVlXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgYWRkVmlydHVhbFNpemVkQ29udGFpbmVyVG9MYXlvdXRNYW5hZ2VyKCkge1xyXG4gICAgICAgIHRoaXMuX2xheW91dE1hbmFnZXIuYmVnaW5WaXJ0dWFsU2l6ZWRDb250YWluZXJBZGRpbmcoKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLl9sYXlvdXRNYW5hZ2VyLmFkZFZpcnR1YWxTaXplZENvbnRhaW5lcih0aGlzKTtcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICB0aGlzLl9sYXlvdXRNYW5hZ2VyLmVuZFZpcnR1YWxTaXplZENvbnRhaW5lckFkZGluZygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGNoZWNrU2hvd25Gcm9tWmVyb0RpbWVuc2lvbnMoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzU2hvd25XaXRoWmVyb0RpbWVuc2lvbnMgJiYgKHRoaXMuX2hlaWdodCAhPT0gMCB8fCB0aGlzLl93aWR0aCAhPT0gMCkpIHtcclxuICAgICAgICAgICAgdGhpcy5faXNTaG93bldpdGhaZXJvRGltZW5zaW9ucyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRTaG93KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgZW1pdFNob3coKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdzaG93bicpO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnc2hvdycpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgZW1pdEhpZGUoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdoaWRlJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWxlYXNlQ29tcG9uZW50KCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9zdGFja01heGltaXNlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmV4aXRTdGFja01heGltaXNlZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmVtaXQoJ2JlZm9yZUNvbXBvbmVudFJlbGVhc2UnLCB0aGlzLl9ib3VuZENvbXBvbmVudC5jb21wb25lbnQpO1xyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci51bmJpbmRDb21wb25lbnQodGhpcywgdGhpcy5fYm91bmRDb21wb25lbnQudmlydHVhbCwgdGhpcy5fYm91bmRDb21wb25lbnQuY29tcG9uZW50KTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBDb21wb25lbnRDb250YWluZXJ9ICovXHJcbmV4cG9ydCB0eXBlIEl0ZW1Db250YWluZXIgPSBDb21wb25lbnRDb250YWluZXI7XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIENvbXBvbmVudENvbnRhaW5lciB7XHJcbiAgICBleHBvcnQgdHlwZSBDb21wb25lbnQgPSB1bmtub3duO1xyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQmluZGFibGVDb21wb25lbnQge1xyXG4gICAgICAgIGNvbXBvbmVudDogQ29tcG9uZW50O1xyXG4gICAgICAgIHZpcnR1YWw6IGJvb2xlYW47XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IHR5cGUgU3RhdGVSZXF1ZXN0RXZlbnRIYW5kbGVyID0gKHRoaXM6IHZvaWQpID0+IEpzb25WYWx1ZSB8IHVuZGVmaW5lZDtcclxuICAgIGV4cG9ydCB0eXBlIFZpcnR1YWxSZWN0aW5nUmVxdWlyZWRFdmVudCA9ICh0aGlzOiB2b2lkLCBjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpID0+IHZvaWQ7XHJcbiAgICBleHBvcnQgdHlwZSBWaXJ0dWFsVmlzaWJpbGl0eUNoYW5nZVJlcXVpcmVkRXZlbnQgPSAodGhpczogdm9pZCwgY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIsIHZpc2libGU6IGJvb2xlYW4pID0+IHZvaWQ7XHJcbiAgICBleHBvcnQgdHlwZSBWaXJ0dWFsWkluZGV4Q2hhbmdlUmVxdWlyZWRFdmVudCA9XHJcbiAgICAgICAgKHRoaXM6IHZvaWQsIGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCBsb2dpY2FsWkluZGV4OiBMb2dpY2FsWkluZGV4LCBkZWZhdWx0WkluZGV4OiBzdHJpbmcpID0+IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBTaG93RXZlbnRIYW5kbGVyID0gKHRoaXM6IHZvaWQpID0+IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBIaWRlRXZlbnRIYW5kbGVyID0gKHRoaXM6IHZvaWQpID0+IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBGb2N1c0V2ZW50SGFuZGxlciA9ICh0aGlzOiB2b2lkLCBzdXBwcmVzc0V2ZW50OiBib29sZWFuKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgQmx1ckV2ZW50SGFuZGxlciA9ICh0aGlzOiB2b2lkLCBzdXBwcmVzc0V2ZW50OiBib29sZWFuKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgVXBkYXRlSXRlbUNvbmZpZ0V2ZW50SGFuZGxlciA9IChpdGVtQ29uZmlnOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcpID0+IHZvaWQ7XHJcbn1cclxuIiwiaW1wb3J0IHsgUmVzb2x2ZWRMYXlvdXRDb25maWcsIFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLCBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9yZXNvbHZlZC1jb25maWcnO1xyXG5pbXBvcnQgeyBQb3BvdXRCbG9ja2VkRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvZXh0ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBVbmV4cGVjdGVkTnVsbEVycm9yLCBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBDb250ZW50SXRlbSB9IGZyb20gJy4uL2l0ZW1zL2NvbnRlbnQtaXRlbSc7XHJcbmltcG9ydCB7IFJvd09yQ29sdW1uIH0gZnJvbSAnLi4vaXRlbXMvcm93LW9yLWNvbHVtbic7XHJcbmltcG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuLi9sYXlvdXQtbWFuYWdlcic7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL3V0aWxzL2V2ZW50LWVtaXR0ZXInO1xyXG5pbXBvcnQgeyBSZWN0LCBJdGVtVHlwZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcclxuaW1wb3J0IHsgZGVlcEV4dGVuZCwgZ2V0RXJyb3JNZXNzYWdlLCBnZXRVbmlxdWVJZCwgZ2V0V2luZG93VG9wTGVmdEJvcmRlciB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuXHJcbi8qKlxyXG4gKiBQb3BzIGEgY29udGVudCBpdGVtIG91dCBpbnRvIGEgbmV3IGJyb3dzZXIgd2luZG93LlxyXG4gKiBUaGlzIGlzIGFjaGlldmVkIGJ5XHJcbiAqXHJcbiAqICAgIC0gQ3JlYXRpbmcgYSBuZXcgY29uZmlndXJhdGlvbiB3aXRoIHRoZSBjb250ZW50IGl0ZW0gYXMgcm9vdCBlbGVtZW50XHJcbiAqICAgIC0gU2VyaWFsaXppbmcgYW5kIG1pbmlmeWluZyB0aGUgY29uZmlndXJhdGlvblxyXG4gKiAgICAtIE9wZW5pbmcgdGhlIGN1cnJlbnQgd2luZG93J3MgVVJMIHdpdGggdGhlIGNvbmZpZ3VyYXRpb24gYXMgYSBHRVQgcGFyYW1ldGVyXHJcbiAqICAgIC0gR29sZGVuTGF5b3V0IHdoZW4gb3BlbmVkIGluIHRoZSBuZXcgd2luZG93IHdpbGwgbG9vayBmb3IgdGhlIEdFVCBwYXJhbWV0ZXJcclxuICogICAgICBhbmQgdXNlIGl0IGluc3RlYWQgb2YgdGhlIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb25cclxuICogQHB1YmxpY1xyXG4gKi9cclxuXHJcbmV4cG9ydCBjbGFzcyBCcm93c2VyUG9wb3V0IGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3BvcG91dFdpbmRvdzogV2luZG93IHwgbnVsbDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2lzSW5pdGlhbGlzZWQ6IGJvb2xlYW47XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9jaGVja1JlYWR5SW50ZXJ2YWw6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfcHJldmVudFBvcEluT25DbG9zZTogYm9vbGVhbjtcclxuXHJcbiAgICBnZXQgaXNJbml0aWFsaXNlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2lzSW5pdGlhbGlzZWQ7IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSBfY29uZmlnIC0gR29sZGVuTGF5b3V0IGl0ZW0gY29uZmlnXHJcbiAgICAgKiBAcGFyYW0gX2luaXRpYWxXaW5kb3dTaXplIC0gQSBtYXAgd2l0aCB3aWR0aCwgaGVpZ2h0LCB0b3AgYW5kIGxlZnRcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfY29uZmlnOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfaW5pdGlhbFdpbmRvd1NpemU6IFJlY3QsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX2xheW91dE1hbmFnZXI6IExheW91dE1hbmFnZXIsXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpc2VkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fcG9wb3V0V2luZG93ID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9wcmV2ZW50UG9wSW5PbkNsb3NlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVXaW5kb3coKTtcclxuICAgIH1cclxuXHJcbiAgICB0b0NvbmZpZygpOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzSW5pdGlhbGlzZWQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FuXFwndCBjcmVhdGUgY29uZmlnLCBsYXlvdXQgbm90IHlldCBpbml0aWFsaXNlZCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZ2xJbnN0YW5jZSA9IHRoaXMuZ2V0R2xJbnN0YW5jZSgpO1xyXG4gICAgICAgIGNvbnN0IGdsSW5zdGFuY2VDb25maWcgPSBnbEluc3RhbmNlLnNhdmVMYXlvdXQoKTtcclxuXHJcbiAgICAgICAgbGV0IGxlZnQ6IG51bWJlciB8IG51bGw7XHJcbiAgICAgICAgbGV0IHRvcDogbnVtYmVyIHwgbnVsbDtcclxuICAgICAgICBpZiAodGhpcy5fcG9wb3V0V2luZG93ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGxlZnQgPSBudWxsO1xyXG4gICAgICAgICAgICB0b3AgPSBudWxsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxlZnQgPSB0aGlzLl9wb3BvdXRXaW5kb3cuc2NyZWVuWCA/PyB0aGlzLl9wb3BvdXRXaW5kb3cuc2NyZWVuTGVmdDtcclxuICAgICAgICAgICAgdG9wID0gdGhpcy5fcG9wb3V0V2luZG93LnNjcmVlblkgPz8gdGhpcy5fcG9wb3V0V2luZG93LnNjcmVlblRvcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHdpbmRvdzogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcuV2luZG93ID0ge1xyXG4gICAgICAgICAgICB3aWR0aDogdGhpcy5nZXRHbEluc3RhbmNlKCkud2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy5nZXRHbEluc3RhbmNlKCkuaGVpZ2h0LFxyXG4gICAgICAgICAgICBsZWZ0LFxyXG4gICAgICAgICAgICB0b3AsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgY29uZmlnOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyA9IHtcclxuICAgICAgICAgICAgcm9vdDogZ2xJbnN0YW5jZUNvbmZpZy5yb290LFxyXG4gICAgICAgICAgICBvcGVuUG9wb3V0czogZ2xJbnN0YW5jZUNvbmZpZy5vcGVuUG9wb3V0cyxcclxuICAgICAgICAgICAgc2V0dGluZ3M6IGdsSW5zdGFuY2VDb25maWcuc2V0dGluZ3MsXHJcbiAgICAgICAgICAgIGRpbWVuc2lvbnM6IGdsSW5zdGFuY2VDb25maWcuZGltZW5zaW9ucyxcclxuICAgICAgICAgICAgaGVhZGVyOiBnbEluc3RhbmNlQ29uZmlnLmhlYWRlcixcclxuICAgICAgICAgICAgd2luZG93LFxyXG4gICAgICAgICAgICBwYXJlbnRJZDogdGhpcy5fY29uZmlnLnBhcmVudElkLFxyXG4gICAgICAgICAgICBpbmRleEluUGFyZW50OiB0aGlzLl9jb25maWcuaW5kZXhJblBhcmVudCxcclxuICAgICAgICAgICAgcmVzb2x2ZWQ6IHRydWUsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGNvbmZpZztcclxuICAgIH1cclxuXHJcbiAgICBnZXRHbEluc3RhbmNlKCk6IExheW91dE1hbmFnZXIge1xyXG4gICAgICAgIGlmICh0aGlzLl9wb3BvdXRXaW5kb3cgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0JQR0dJMjQ2OTMnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BvcG91dFdpbmRvdy5fX2dsSW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIG5hdGl2ZSBCcm93c2VyV2luZG93IGJhY2tpbmcgdGhpcyBwb3BvdXQuXHJcbiAgICAgKiBNaWdodCB0aHJvdyBhbiBVbmV4cGVjdGVkTnVsbEVycm9yIGV4Y2VwdGlvbiB3aGVuIHRoZSB3aW5kb3cgaXMgbm90IGluaXRpYWxpemVkIHlldC5cclxuICAgICAqIEBwdWJsaWNcclxuICAgICAqL1xyXG4gICAgZ2V0V2luZG93KCk6IFdpbmRvdyB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BvcG91dFdpbmRvdyA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignQlBHVzA4NzIxNScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5fcG9wb3V0V2luZG93O1xyXG4gICAgfVxyXG5cclxuICAgIGNsb3NlKHByZXZlbnRQb3BJbiA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHByZXZlbnRQb3BJbikge1xyXG4gICAgICAgICAgICB0aGlzLl9wcmV2ZW50UG9wSW5PbkNsb3NlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmdldEdsSW5zdGFuY2UoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmdldEdsSW5zdGFuY2UoKS5jbG9zZVdpbmRvdygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFdpbmRvdygpLmNsb3NlKCk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBwb3BwZWQgb3V0IGl0ZW0gdG8gaXRzIG9yaWdpbmFsIHBvc2l0aW9uLiBJZiB0aGUgb3JpZ2luYWxcclxuICAgICAqIHBhcmVudCBpc24ndCBhdmFpbGFibGUgYW55bW9yZSBpdCBmYWxscyBiYWNrIHRvIHRoZSBsYXlvdXQncyB0b3Btb3N0IGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgcG9wSW4oKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IHBhcmVudEl0ZW06IENvbnRlbnRJdGVtIHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5fY29uZmlnLmluZGV4SW5QYXJlbnQ7XHJcblxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgKiBUaGUgZGVlcEV4dGVuZCBjYWxsIHNlZW1zIGEgYml0IHBvaW50bGVzcywgYnV0IGl0J3MgY3J1Y2lhbCB0b1xyXG4gICAgICAgICogY29weSB0aGUgY29uZmlnIHJldHVybmVkIGJ5IHRoaXMuZ2V0R2xJbnN0YW5jZSgpLnRvQ29uZmlnKClcclxuICAgICAgICAqIG9udG8gYSBuZXcgb2JqZWN0LiBJbnRlcm5ldCBFeHBsb3JlciBrZWVwcyB0aGUgcmVmZXJlbmNlc1xyXG4gICAgICAgICogdG8gb2JqZWN0cyBvbiB0aGUgY2hpbGQgd2luZG93LCByZXN1bHRpbmcgaW4gdGhlIGZvbGxvd2luZyBlcnJvclxyXG4gICAgICAgICogb25jZSB0aGUgY2hpbGQgd2luZG93IGlzIGNsb3NlZDpcclxuICAgICAgICAqXHJcbiAgICAgICAgKiBUaGUgY2FsbGVlIChzZXJ2ZXIgW25vdCBzZXJ2ZXIgYXBwbGljYXRpb25dKSBpcyBub3QgYXZhaWxhYmxlIGFuZCBkaXNhcHBlYXJlZFxyXG4gICAgICAgICovXHJcbiAgICAgICAgY29uc3QgZ2xJbnN0YW5jZUxheW91dENvbmZpZyA9IHRoaXMuZ2V0R2xJbnN0YW5jZSgpLnNhdmVMYXlvdXQoKTtcclxuICAgICAgICBjb25zdCBjb3BpZWRHbEluc3RhbmNlTGF5b3V0Q29uZmlnID0gZGVlcEV4dGVuZCh7fSwgZ2xJbnN0YW5jZUxheW91dENvbmZpZykgYXMgUmVzb2x2ZWRMYXlvdXRDb25maWc7XHJcbiAgICAgICAgbGV0IGNvcGllZFJvb3QgPSBjb3BpZWRHbEluc3RhbmNlTGF5b3V0Q29uZmlnLnJvb3Q7XHJcbiAgICAgICAgaWYgKGNvcGllZFJvb3QgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGdyb3VuZEl0ZW0gPSB0aGlzLl9sYXlvdXRNYW5hZ2VyLmdyb3VuZEl0ZW07XHJcbiAgICAgICAgaWYgKGdyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdCUFBJRzM0OTcyJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fY29uZmlnLnBhcmVudElkKSB7ICAgIFxyXG4gICAgICAgICAgICBwYXJlbnRJdGVtID0gZ3JvdW5kSXRlbS5nZXRJdGVtc0J5UG9wSW5QYXJlbnRJZCh0aGlzLl9jb25maWcucGFyZW50SWQpWzBdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLypcclxuICAgICAgICAqIEZhbGxiYWNrIGlmIHBhcmVudEl0ZW0gaXMgbm90IGF2YWlsYWJsZS4gRWl0aGVyIGFkZCBpdCB0byB0aGUgdG9wbW9zdFxyXG4gICAgICAgICogaXRlbSBvciBtYWtlIGl0IHRoZSB0b3Btb3N0IGl0ZW0gaWYgdGhlIGxheW91dCBpcyBlbXB0eVxyXG4gICAgICAgICovXHJcbiAgICAgICAgaWYgKCFwYXJlbnRJdGVtKSB7XHJcbiAgICAgICAgICAgIGlmIChncm91bmRJdGVtLmNvbnRlbnRJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRJdGVtID0gZ3JvdW5kSXRlbS5jb250ZW50SXRlbXNbMF07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRJdGVtID0gZ3JvdW5kSXRlbTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpbmRleCA9IHBhcmVudEl0ZW0uY29udGVudEl0ZW1zLmxlbmd0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChwYXJlbnRJdGVtLmlzU3RhY2spIHsgICBcclxuICAgICAgICAgICAgLy8gU3RhY2tzIGNhbiBvbmx5IGhvbGQgY29tcG9uZW50IGl0ZW1zIC0+IHRyeSB0byBmaW5kIG9uZSBieSB1bnJhdmVsaW5nIGNvbnRhaW5lcnMgd2l0aCBhIHNpbmdsZSBjaGlsZFxyXG4gICAgICAgICAgICB3aGlsZSAoY29waWVkUm9vdC50eXBlICE9PSBJdGVtVHlwZS5jb21wb25lbnQgJiYgY29waWVkUm9vdC5jb250ZW50Lmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgY29waWVkUm9vdCA9IGNvcGllZFJvb3QuY29udGVudFswXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gRmFpbGVkIHRvIGZpbmQgYSBjb21wb25lbnQgaXRlbSwgd3JhcCB0aGUgcGFyZW50IGl0ZW0gYW5kIGRvY2tlZCBpdGVtIGluIGEgcm93IGFzIHNpYmxpbmdzXHJcbiAgICAgICAgICAgIGlmIChjb3BpZWRSb290LnR5cGUgIT09IEl0ZW1UeXBlLmNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudEl0ZW0ucGFyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0JQUElHMzQ5NzMnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSBuZXcgUm93T3JDb2x1bW4oZmFsc2UsIHRoaXMuX2xheW91dE1hbmFnZXIsIFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnLmNyZWF0ZURlZmF1bHQoJ3JvdycpLCBwYXJlbnRJdGVtLnBhcmVudCk7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRJdGVtLnBhcmVudC5yZXBsYWNlQ2hpbGQocGFyZW50SXRlbSwgcm93LCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICByb3cuYWRkQ2hpbGQocGFyZW50SXRlbSk7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRJdGVtID0gcm93O1xyXG4gICAgICAgICAgICAgICAgaW5kZXggPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBuZXdDb250ZW50SXRlbSA9IHRoaXMuX2xheW91dE1hbmFnZXIuY3JlYXRlQW5kSW5pdENvbnRlbnRJdGVtKGNvcGllZFJvb3QsIHBhcmVudEl0ZW0pO1xyXG5cclxuICAgICAgICBpbmRleCA9IChpbmRleCAhPT0gbnVsbCkgPyBNYXRoLm1heCgwLCBNYXRoLm1pbihwYXJlbnRJdGVtLmNvbnRlbnRJdGVtcy5sZW5ndGgsIGluZGV4KSkgOiBudWxsO1xyXG4gICAgICAgIHBhcmVudEl0ZW0uYWRkQ2hpbGQobmV3Q29udGVudEl0ZW0sIGluZGV4KTtcclxuICAgICAgICBpZiAodGhpcy5fbGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuc2V0dGluZ3MucG9wSW5PbkNsb3NlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX29uQ2xvc2UoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyB0aGUgVVJMIGFuZCB3aW5kb3cgcGFyYW1ldGVyXHJcbiAgICAgKiBhbmQgb3BlbnMgYSBuZXcgd2luZG93XHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVXaW5kb3coKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5jcmVhdGVVcmwoKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQm9ndXMgdGl0bGUgdG8gcHJldmVudCByZS11c2FnZSBvZiBleGlzdGluZyB3aW5kb3cgd2l0aCB0aGVcclxuICAgICAgICAgKiBzYW1lIHRpdGxlLiBUaGUgYWN0dWFsIHRpdGxlIHdpbGwgYmUgc2V0IGJ5IHRoZSBuZXcgd2luZG93J3NcclxuICAgICAgICAgKiBHb2xkZW5MYXlvdXQgaW5zdGFuY2UgaWYgaXQgZGV0ZWN0cyB0aGF0IGl0IGlzIGluIHN1YldpbmRvd01vZGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCB0YXJnZXQgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwKS50b1N0cmluZygzNik7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBvcHRpb25zIGFzIHVzZWQgaW4gdGhlIHdpbmRvdy5vcGVuIHN0cmluZ1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IGZlYXR1cmVzID0gdGhpcy5zZXJpYWxpemVXaW5kb3dGZWF0dXJlcyh7XHJcbiAgICAgICAgICAgIGxlZnQ6IHRoaXMuX2luaXRpYWxXaW5kb3dTaXplLmxlZnQsXHJcbiAgICAgICAgICAgIHRvcDogdGhpcy5faW5pdGlhbFdpbmRvd1NpemUudG9wLFxyXG4gICAgICAgICAgICB3aWR0aDogdGhpcy5faW5pdGlhbFdpbmRvd1NpemUud2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy5faW5pdGlhbFdpbmRvd1NpemUuaGVpZ2h0LFxyXG4gICAgICAgICAgICBpbm5lcldpZHRoOiB0aGlzLl9pbml0aWFsV2luZG93U2l6ZS53aWR0aCxcclxuICAgICAgICAgICAgaW5uZXJIZWlnaHQ6IHRoaXMuX2luaXRpYWxXaW5kb3dTaXplLmhlaWdodCxcclxuICAgICAgICAgICAgbWVudWJhcjogJ25vJyxcclxuICAgICAgICAgICAgdG9vbGJhcjogJ25vJyxcclxuICAgICAgICAgICAgbG9jYXRpb246ICdubycsXHJcbiAgICAgICAgICAgIHBlcnNvbmFsYmFyOiAnbm8nLFxyXG4gICAgICAgICAgICByZXNpemFibGU6ICd5ZXMnLFxyXG4gICAgICAgICAgICBzY3JvbGxiYXJzOiAnbm8nLFxyXG4gICAgICAgICAgICBzdGF0dXM6ICdubydcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fcG9wb3V0V2luZG93ID0gZ2xvYmFsVGhpcy5vcGVuKHVybCwgdGFyZ2V0LCBmZWF0dXJlcyk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fcG9wb3V0V2luZG93KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9sYXlvdXRNYW5hZ2VyLmxheW91dENvbmZpZy5zZXR0aW5ncy5ibG9ja2VkUG9wb3V0c1Rocm93RXJyb3IgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IFBvcG91dEJsb2NrZWRFcnJvcignUG9wb3V0IGJsb2NrZWQnKTtcclxuICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wb3BvdXRXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHsgICAgXHJcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25BbmRSZXNpemVXaW5kb3coKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9wb3BvdXRXaW5kb3cpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3BvcG91dFdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2xheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLnNldHRpbmdzLnBvcEluT25DbG9zZSAmJiAhdGhpcy5fcHJldmVudFBvcEluT25DbG9zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcEluKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25DbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUG9sbGluZyB0aGUgY2hpbGR3aW5kb3cgdG8gZmluZCBvdXQgaWYgR29sZGVuTGF5b3V0IGhhcyBiZWVuIGluaXRpYWxpc2VkXHJcbiAgICAgICAgICogZG9lc24ndCBzZWVtIG9wdGltYWwsIGJ1dCB0aGUgYWx0ZXJuYXRpdmVzIC0gYWRkaW5nIGEgY2FsbGJhY2sgdG8gdGhlIHBhcmVudFxyXG4gICAgICAgICAqIHdpbmRvdyBvciByYWlzaW5nIGFuIGV2ZW50IG9uIHRoZSB3aW5kb3cgb2JqZWN0IC0gYm90aCB3b3VsZCBpbnRyb2R1Y2Uga25vd2xlZGdlXHJcbiAgICAgICAgICogYWJvdXQgdGhlIHBhcmVudCB0byB0aGUgY2hpbGQgd2luZG93IHdoaWNoIHdlJ2QgcmF0aGVyIGF2b2lkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fY2hlY2tSZWFkeUludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5jaGVja1JlYWR5KCksIDEwKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGNoZWNrUmVhZHkoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BvcG91dFdpbmRvdyA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignQlBDUjAxODQ0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3BvcG91dFdpbmRvdy5fX2dsSW5zdGFuY2UgJiYgdGhpcy5fcG9wb3V0V2luZG93Ll9fZ2xJbnN0YW5jZS5pc0luaXRpYWxpc2VkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9wb3BvdXRXaW5kb3cuX19nbEluc3RhbmNlLnBhcmVudCA9IHRoaXMuX2xheW91dE1hbmFnZXI7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uSW5pdGlhbGlzZWQoKTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jaGVja1JlYWR5SW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5fY2hlY2tSZWFkeUludGVydmFsKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGVja1JlYWR5SW50ZXJ2YWwgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBwb3NpdGlvbkFuZFJlc2l6ZVdpbmRvdygpIHtcclxuICAgICAgICBpZiAodGhpcy5fcG9wb3V0V2luZG93ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdCUFBBUlcxJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJbml0aWFsIHdpbmRvdyBzaXplIHBhcmFtZXRlcnMgZGVzY3JpYmUgY2xpZW50IChpLmUuIGlubmVyKSBwb3NpdGlvbiBhbmQgc2l6ZVxyXG4gICAgICAgIC8vIFNpbmNlIHRoZSBib3JkZXIgb2YgdGhlIHBvcG91dCBtYXkgaGF2ZSBkaWZmZXJlbnQgYm9yZGVycyB0aGFuIHRoZSBtYWluIHdpbmRvdywgd2UgaGF2ZVxyXG4gICAgICAgIC8vIHRvIGFkanVzdCB0aGUgcG9zaXRpb24gYW5kIHNpemUgb25jZSB0aGUgd2luZG93IGhhcyBiZWVuIGNyZWF0ZWQuXHJcbiAgICAgICAgLy8gT25seSBkbyB0aGlzIGlmIHRoZSB3aW5kb3cgcGFyYW1ldGVycyBhcmUgcGxhdXNpYmxlIChlLmcuIG9uIExpbnV4IGlubmVyIGRpbWVuc2lvbiBpcyB6ZXJvIHNvbWV0aW1lcylcclxuICAgICAgICBpZiAodGhpcy5fcG9wb3V0V2luZG93LmlubmVyV2lkdGggPiAwICYmIHRoaXMuX3BvcG91dFdpbmRvdy5pbm5lckhlaWdodCA+IDAgJiZcclxuICAgICAgICAgICAgdGhpcy5fcG9wb3V0V2luZG93Lm91dGVyV2lkdGggPiAwICYmIHRoaXMuX3BvcG91dFdpbmRvdy5vdXRlckhlaWdodCA+IDAgJiZcclxuICAgICAgICAgICAgdGhpcy5fcG9wb3V0V2luZG93LmlubmVyV2lkdGggPD0gdGhpcy5fcG9wb3V0V2luZG93Lm91dGVyV2lkdGggJiZcclxuICAgICAgICAgICAgdGhpcy5fcG9wb3V0V2luZG93LmlubmVySGVpZ2h0IDw9IHRoaXMuX3BvcG91dFdpbmRvdy5vdXRlckhlaWdodCkge1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGNvbnN0IGJvcmRlciA9IGdldFdpbmRvd1RvcExlZnRCb3JkZXIodGhpcy5fcG9wb3V0V2luZG93KTtcclxuICAgICAgICAgICAgdGhpcy5fcG9wb3V0V2luZG93Lm1vdmVUbyhcclxuICAgICAgICAgICAgICAgIHRoaXMuX2luaXRpYWxXaW5kb3dTaXplLmxlZnQgLSBib3JkZXIud2lkdGgsXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pbml0aWFsV2luZG93U2l6ZS50b3AgLSBib3JkZXIuaGVpZ2h0LFxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aGlzLl9wb3BvdXRXaW5kb3cucmVzaXplVG8oXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pbml0aWFsV2luZG93U2l6ZS53aWR0aCArICh0aGlzLl9wb3BvdXRXaW5kb3cub3V0ZXJXaWR0aCAtIHRoaXMuX3BvcG91dFdpbmRvdy5pbm5lcldpZHRoKSxcclxuICAgICAgICAgICAgICAgIHRoaXMuX2luaXRpYWxXaW5kb3dTaXplLmhlaWdodCArICh0aGlzLl9wb3BvdXRXaW5kb3cub3V0ZXJIZWlnaHQgLSB0aGlzLl9wb3BvdXRXaW5kb3cuaW5uZXJIZWlnaHQpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wb3BvdXRXaW5kb3cuZm9jdXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlcmlhbGlzZXMgYSBtYXAgb2Yga2V5OnZhbHVlcyB0byBhIHdpbmRvdyBvcHRpb25zIHN0cmluZ1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB3aW5kb3dPcHRpb25zIC1cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBzZXJpYWxpc2VkIHdpbmRvdyBvcHRpb25zXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzZXJpYWxpemVXaW5kb3dGZWF0dXJlcyh3aW5kb3dPcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+KTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCB3aW5kb3dPcHRpb25zU3RyaW5nOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB3aW5kb3dPcHRpb25zKSB7XHJcbiAgICAgICAgICAgIHdpbmRvd09wdGlvbnNTdHJpbmcucHVzaChrZXkgKyAnPScgKyB3aW5kb3dPcHRpb25zW2tleV0udG9TdHJpbmcoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gd2luZG93T3B0aW9uc1N0cmluZy5qb2luKCcsJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIHRoZSBVUkwgZm9yIHRoZSBuZXcgd2luZG93LCBpbmNsdWRpbmcgdGhlXHJcbiAgICAgKiBjb25maWcgR0VUIHBhcmFtZXRlclxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIFVSTFxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlVXJsKCk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3Qgc3RvcmFnZUtleSA9ICdnbC13aW5kb3ctY29uZmlnLScgKyBnZXRVbmlxdWVJZCgpO1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IFJlc29sdmVkTGF5b3V0Q29uZmlnLm1pbmlmeUNvbmZpZyh0aGlzLl9jb25maWcpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShzdG9yYWdlS2V5LCBKU09OLnN0cmluZ2lmeShjb25maWcpKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3Igd2hpbGUgd3JpdGluZyB0byBsb2NhbFN0b3JhZ2UgJyArIGdldEVycm9yTWVzc2FnZShlKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKCcvZ2wtcG9wb3V0JywgbG9jYXRpb24ub3JpZ2luKTtcclxuICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgnZ2wtd2luZG93Jywgc3RvcmFnZUtleSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHRoZW1lID0gdGhpcy5fbGF5b3V0TWFuYWdlci5jb250YWluZXIuZGF0YXNldC50aGVtZTtcclxuICAgICAgICBpZiAodGhlbWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgnZ2wtdGhlbWUnLCB0aGVtZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdXJsLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayB3aGVuIHRoZSBuZXcgd2luZG93IGlzIG9wZW5lZCBhbmQgdGhlIEdvbGRlbkxheW91dCBpbnN0YW5jZVxyXG4gICAgICogd2l0aGluIGl0IGlzIGluaXRpYWxpc2VkXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvbkluaXRpYWxpc2VkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2lzSW5pdGlhbGlzZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZ2V0R2xJbnN0YW5jZSgpLm9uKCdwb3BJbicsICgpID0+IHRoaXMucG9wSW4oKSk7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdpbml0aWFsaXNlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW52b2tlZCA1MG1zIGFmdGVyIHRoZSB3aW5kb3cgdW5sb2FkIGV2ZW50XHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBfb25DbG9zZSgpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZW1pdCgnY2xvc2VkJyksIDUwKTtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBEcmFnUHJveHkgfSBmcm9tICcuL2RyYWctcHJveHknO1xyXG5pbXBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi4vbGF5b3V0LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBVbmV4cGVjdGVkTnVsbEVycm9yLCBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi91dGlscy9ldmVudC1lbWl0dGVyJztcclxuaW1wb3J0IHsgQ29udGVudEl0ZW0gfSBmcm9tICcuLi9pdGVtcy9jb250ZW50LWl0ZW0nO1xyXG5pbXBvcnQgeyBDb21wb25lbnRJdGVtIH0gZnJvbSAnLi4vaXRlbXMvY29tcG9uZW50LWl0ZW0nO1xyXG5pbXBvcnQgeyBEcmFnTGlzdGVuZXIgfSBmcm9tICcuLi91dGlscy9kcmFnLWxpc3RlbmVyJztcclxuaW1wb3J0IHsgZ2V0V2luZG93SW5uZXJTY3JlZW5Qb3NpdGlvbiB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuY2xhc3MgRHJhZ1RhcmdldCB7XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9vd25lcjogRHJhZ0FjdGlvbixcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9hcmVhOiBDb250ZW50SXRlbS5BcmVhLFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX3BhZ2VYOiBudW1iZXIsXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfcGFnZVk6IG51bWJlcikge1xyXG4gICAgICAgIGlmIChfb3duZXIubGF5b3V0TWFuYWdlciAhPT0gX2FyZWEuY29udGVudEl0ZW0ubGF5b3V0TWFuYWdlcikge1xyXG4gICAgICAgICAgICB0aHJvdyBFcnJvcignTGF5b3V0TWFuYWdlciBvZiBBcmVhIGFuZCBEcmFnUHJveHkgbXVzdCBtYXRjaCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgb3duZXIoKTogRHJhZ0FjdGlvbiB7IHJldHVybiB0aGlzLl9vd25lcjsgfVxyXG4gICAgZ2V0IGFyZWEoKTogQ29udGVudEl0ZW0uQXJlYSB7IHJldHVybiB0aGlzLl9hcmVhOyB9XHJcblxyXG4gICAgZHJvcChpdGVtOiBDb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgdGhpcy5fYXJlYS5jb250ZW50SXRlbS5vbkRyb3AoaXRlbSwgdGhpcy5fYXJlYSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGlnaGxpZ2h0RHJvcFpvbmUoKSB7XHJcbiAgICAgICAgdGhpcy5hcmVhLmNvbnRlbnRJdGVtLmhpZ2hsaWdodERyb3Bab25lKHRoaXMuX3BhZ2VYLCB0aGlzLl9wYWdlWSwgdGhpcy5fYXJlYSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGNsYXNzIERyYWdBY3Rpb24gZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgcHJpdmF0ZSBfZHJhZ1Byb3h5OiBEcmFnUHJveHkgfCBudWxsID0gbnVsbDtcclxuICAgIHByaXZhdGUgX2N1cnJlbnRUYXJnZXQ6IERyYWdUYXJnZXQgfCBudWxsID0gbnVsbDtcclxuICAgIHByaXZhdGUgX2RyYWdMaXN0ZW5lcjogRHJhZ0xpc3RlbmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgICBwcml2YXRlIF9ib3VuZGluZ1JlY3Q6IERPTVJlY3Q7XHJcbiAgICBwcml2YXRlIF9hY3Rpb25zOiBEcmFnQWN0aW9uW10gPSBbXTtcclxuXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kcmFnRXZlbnRIYW5kbGVyID0gKF9vZmZzZXRYOiBudW1iZXIsIF9vZmZzZXRZOiBudW1iZXIsIGV2ZW50OiBFdmVudEVtaXR0ZXIuRHJhZ0V2ZW50KSA9PiB0aGlzLm9uRHJhZyhldmVudCk7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kcmFnU3RvcEV2ZW50SGFuZGxlciA9ICgpID0+IHRoaXMub25EcmFnU3RvcCgpO1xyXG5cclxuICAgIGdldCBsYXlvdXRNYW5hZ2VyKCk6IExheW91dE1hbmFnZXIgeyByZXR1cm4gdGhpcy5fbGF5b3V0TWFuYWdlcjsgfVxyXG4gICAgZ2V0IHBhcmVudCgpOiBEcmFnQWN0aW9uIHwgbnVsbCB7IHJldHVybiB0aGlzLl9wYXJlbnQ7IH1cclxuICAgIGdldCBwcm94eSgpOiBEcmFnUHJveHkgfCBudWxsIHsgcmV0dXJuIHRoaXMuX2RyYWdQcm94eTsgfVxyXG4gICAgcHJpdmF0ZSBnZXQgcGFyZW50T3JTZWxmKCk6IERyYWdBY3Rpb24geyByZXR1cm4gdGhpcy5fcGFyZW50ID8/IHRoaXM7IH1cclxuICAgIGdldCBjdXJyZW50VGFyZ2V0KCk6IERyYWdUYXJnZXQgfCBudWxsIHsgcmV0dXJuIHRoaXMucGFyZW50T3JTZWxmLl9jdXJyZW50VGFyZ2V0OyB9XHJcbiAgICBwcml2YXRlIHNldCBjdXJyZW50VGFyZ2V0KHZhbHVlIDogRHJhZ1RhcmdldCB8IG51bGwpIHsgdGhpcy5wYXJlbnRPclNlbGYuX2N1cnJlbnRUYXJnZXQgPSB2YWx1ZTsgfVxyXG5cclxuICAgIHByaXZhdGUgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfbGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlcixcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9hbGxvd1BvcG91dDogYm9vbGVhbiA9IGZhbHNlLFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX3BhcmVudDogRHJhZ0FjdGlvbiB8IG51bGwgPSBudWxsXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMuX2JvdW5kaW5nUmVjdCA9IHRoaXMuY29tcHV0ZUJvdW5kaW5nUmVjdCgpO1xyXG4gICAgICAgIHRoaXMucGFyZW50T3JTZWxmLl9hY3Rpb25zLnB1c2godGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjb21wdXRlQm91bmRpbmdSZWN0KCk6IERPTVJlY3Qge1xyXG4gICAgICAgIGlmICh0aGlzLl9sYXlvdXRNYW5hZ2VyLmdyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdEQUNCUjExMTIwJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgcmVjdCA9IHRoaXMuX2xheW91dE1hbmFnZXIuZ3JvdW5kSXRlbS5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gRE9NUmVjdC5mcm9tUmVjdCh7XHJcbiAgICAgICAgICAgICAgICB4OiBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQgKyByZWN0LmxlZnQsXHJcbiAgICAgICAgICAgICAgICB5OiBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCArIHJlY3QudG9wLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IHJlY3Qud2lkdGgsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNjcmVlblRvUGFnZShzY3JlZW5YOiBudW1iZXIsIHNjcmVlblk6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IGlubmVyU2NyZWVuID0gZ2V0V2luZG93SW5uZXJTY3JlZW5Qb3NpdGlvbihnbG9iYWxUaGlzKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgeDogZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0ICsgc2NyZWVuWCAtIGlubmVyU2NyZWVuLmxlZnQsXHJcbiAgICAgICAgICAgIHk6IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wICsgc2NyZWVuWSAtIGlubmVyU2NyZWVuLnRvcFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpc1Byb3h5VmlzaWJsZShwcm94eTogRHJhZ1Byb3h5LCBwYWdlWCA6IG51bWJlciwgcGFnZVk6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIHBhZ2VYID49IHRoaXMuX2JvdW5kaW5nUmVjdC5sZWZ0IC0gcHJveHkub3V0ZXJXaWR0aCAmJlxyXG4gICAgICAgICAgICBwYWdlWCA8IHRoaXMuX2JvdW5kaW5nUmVjdC5yaWdodCAmJlxyXG4gICAgICAgICAgICBwYWdlWSA+PSB0aGlzLl9ib3VuZGluZ1JlY3QudG9wIC0gcHJveHkub3V0ZXJIZWlnaHQgJiZcclxuICAgICAgICAgICAgcGFnZVkgPCB0aGlzLl9ib3VuZGluZ1JlY3QuYm90dG9tXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNyZWF0ZVByb3h5KGl0ZW06IENvbXBvbmVudEl0ZW0sIHg6IG51bWJlciwgeTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fZHJhZ1Byb3h5ID0gbmV3IERyYWdQcm94eSh0aGlzLCBpdGVtLCB4LCB5KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRyYWdMb2NhbChwYWdlWDogbnVtYmVyLCBwYWdlWTogbnVtYmVyKTogRHJhZ1RhcmdldCB8IG51bGwge1xyXG4gICAgICAgIGlmICh0aGlzLl9kcmFnUHJveHkgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgY29uc3QgYXJlYSA9IHRoaXMuX2RyYWdQcm94eS5kcmFnKHBhZ2VYLCBwYWdlWSk7XHJcbiAgICAgICAgICAgIHJldHVybiAoYXJlYSAhPT0gbnVsbCkgPyBuZXcgRHJhZ1RhcmdldCh0aGlzLCBhcmVhLCBwYWdlWCwgcGFnZVkpIDogbnVsbDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBkcmFnR2xvYmFsKHNjcmVlblg6IG51bWJlciwgc2NyZWVuWTogbnVtYmVyKTogRHJhZ1RhcmdldCB8IG51bGwge1xyXG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuX3BhcmVudD8uX2RyYWdQcm94eTtcclxuICAgICAgICBpZiAoIXNvdXJjZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignREFERzEnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHsgeDogcGFnZVgsIHk6IHBhZ2VZIH0gPSB0aGlzLnNjcmVlblRvUGFnZShzY3JlZW5YLCBzY3JlZW5ZKTtcclxuICAgICAgICBjb25zdCB2aXNpYmxlID0gZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID09PSAndmlzaWJsZScgJiYgdGhpcy5pc1Byb3h5VmlzaWJsZShzb3VyY2UsIHBhZ2VYLCBwYWdlWSk7XHJcblxyXG4gICAgICAgIGlmICh2aXNpYmxlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kcmFnUHJveHkgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMubGF5b3V0TWFuYWdlci5ncm91bmRJdGVtO1xyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdEQURHMicpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb25maWcgPSBzb3VyY2UuY29tcG9uZW50SXRlbS50b0NvbmZpZygpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZHJhZ0l0ZW0gPSBuZXcgQ29tcG9uZW50SXRlbSh0aGlzLmxheW91dE1hbmFnZXIsIGNvbmZpZywgcGFyZW50KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlUHJveHkoZHJhZ0l0ZW0sIHBhZ2VYLCBwYWdlWSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBQcm94eSBpcyBubyBsb25nZXIgdmlzaWJsZSBhbmQgbm90IGN1cnJlbnRseSB0aGUgZHJhZyB0YXJnZXQgLT4gZGVzdHJveVxyXG4gICAgICAgICAgICBpZiAodGhpcy5fZHJhZ1Byb3h5ICE9PSBudWxsICYmIHRoaXMuY3VycmVudFRhcmdldD8ub3duZXIgIT09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub25EcmFnU3RvcCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5kcmFnTG9jYWwocGFnZVgsIHBhZ2VZKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uRHJhZ1N0b3AoKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgdGhpcy5fYWN0aW9ucykge1xyXG4gICAgICAgICAgICBhY3Rpb24ubGF5b3V0TWFuYWdlci5oaWRlRHJvcFRhcmdldEluZGljYXRvcigpO1xyXG4gICAgICAgICAgICBhY3Rpb24uX2RyYWdQcm94eT8uZHJvcCgpO1xyXG4gICAgICAgICAgICBhY3Rpb24uX2RyYWdQcm94eSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXI/Lm9mZignZHJhZycsIHRoaXMuX2RyYWdFdmVudEhhbmRsZXIpO1xyXG4gICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lcj8ub2ZmKCdkcmFnU3RvcCcsIHRoaXMuX2RyYWdTdG9wRXZlbnRIYW5kbGVyKTtcclxuICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2N1cnJlbnRUYXJnZXQgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb25EcmFnKGV2ZW50OiBFdmVudEVtaXR0ZXIuRHJhZ0V2ZW50KSB7XHJcbiAgICAgICAgbGV0IHRhcmdldDogRHJhZ1RhcmdldCB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgICBcclxuICAgICAgICAvLyBUcnkgdG8gZmluZCBhIGRyYWcgdGFyZ2V0IGJ5IGludm9raW5nIGFsbCBhY3Rpb25zLlxyXG4gICAgICAgIC8vIEZvciBzZWNvbmRhcnkgYWN0aW9ucyB0aGUgc2NyZWVuIHBvc2l0aW9uIG9mIHRoZSBldmVudCBoYXZlIHRvIGJlIHRyYW5zbGF0ZWQuXHJcbiAgICAgICAgLy8gVGhlIGZpcnN0IHZhbGlkIHRhcmdldCBpcyBzZWxlY3RlZCwgc3RpbGwgd2Ugd2FudCB0byBpbnZva2UgYWxsIGFjdGlvbnMgZHVlIHRvIHRoZSBjdWxsaW5nIGxvZ2ljIGluIGRyYWdHbG9iYWwuXHJcbiAgICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgdGhpcy5fYWN0aW9ucykge1xyXG4gICAgICAgICAgICBsZXQgdDogRHJhZ1RhcmdldCB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgaWYgKGFjdGlvbiAhPT0gdGhpcykge1xyXG4gICAgICAgICAgICAgICAgdCA9IGFjdGlvbi5kcmFnR2xvYmFsKGV2ZW50LnNjcmVlblgsIGV2ZW50LnNjcmVlblkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2RyYWdQcm94eSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdCA9IHRoaXMuZHJhZ0xvY2FsKGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIE9ubHkgc2V0IHRhcmdldCBpZiB3ZSBkb24ndCBhbHJlYWR5IGhhdmUgb25lLCB1bmxlc3MgdGhlIHByZWxpbWluYXJ5IHRhcmdldFxyXG4gICAgICAgICAgICAvLyBiZWxvbmdzIHRvIHRoZSBtYWluIHdpbmRvdy4gSW4gdGhhdCBjYXNlIHdlIHNldCB0aGUgbmV3IHRhcmdldCB0byBwcmlvcml0aXplIHBvcG91dCB3aW5kb3dzIG92ZXIgdGhlIG1haW4gd2luZG93LlxyXG4gICAgICAgICAgICBpZiAodGFyZ2V0ID09PSBudWxsIHx8ICh0ICE9PSBudWxsICYmIHRhcmdldC5vd25lci5sYXlvdXRNYW5hZ2VyLnBhcmVudCA9PT0gbnVsbCkpIHtcclxuICAgICAgICAgICAgICAgIHRhcmdldCA9IHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0YXJnZXQgIT09IG51bGwgfHwgdGhpcy5fYWxsb3dQb3BvdXQpIHtcclxuICAgICAgICAgICAgLy8gSWYgd2UgYWxyZWFkeSBoYXZlIGEgZHJvcCBhcmVhIGJ1dCBpdCBpcyBpbiBhIGRpZmZlcmVudCB3aW5kb3csIGhpZGUgdGhlIGluZGljYXRvci5cclxuICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFRhcmdldCAhPT0gbnVsbCAmJiB0aGlzLmN1cnJlbnRUYXJnZXQub3duZXIgIT09IHRhcmdldD8ub3duZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFRhcmdldC5vd25lci5sYXlvdXRNYW5hZ2VyLmhpZGVEcm9wVGFyZ2V0SW5kaWNhdG9yKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0YXJnZXQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vIE1vdmUgdGhlIG93bmVyIG9mIHRoZSB0YXJnZXQgdG8gdGhlIGZyb250LCBzbyBpdCBoYXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgZm9yIGZ1dHVyZSBkcmFnIGV2ZW50cy5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fYWN0aW9ucy5pbmRleE9mKHRhcmdldC5vd25lcik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3Rpb25zLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3Rpb25zLnVuc2hpZnQodGFyZ2V0Lm93bmVyKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0YXJnZXQuaGlnaGxpZ2h0RHJvcFpvbmUoKTtcclxuICAgICAgICAgICAgICAgIHRhcmdldC5vd25lci5sYXlvdXRNYW5hZ2VyLm1vdmVXaW5kb3dUb3AoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50VGFyZ2V0ID0gdGFyZ2V0O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBTcGF3biBhIHNlY29uZGFyeSBkcmFnIGFjdGlvbiwgdGhlIHByb3h5IGVsZW1lbnQgaXMgb25seSBjcmVhdGVkIHdoZW4gdGhlIHBvaW50ZXIgZW50ZXJzIGl0cyB3aW5kb3cuXHJcbiAgICBzdGF0aWMgc3Bhd24obGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlciwgcGFyZW50OiBEcmFnQWN0aW9uKTogRHJhZ0FjdGlvbiB7XHJcbiAgICAgICAgaWYgKHBhcmVudC5fcGFyZW50ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2Vjb25kYXJ5IERyYWdBY3Rpb24gY2Fubm90IHNwYXduIGFub3RoZXIgRHJhZ0FjdGlvbi4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBuZXcgRHJhZ0FjdGlvbihsYXlvdXRNYW5hZ2VyLCBmYWxzZSwgcGFyZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTdGFydCBhIGRyYWcgYWN0aW9uLCBpbW1lZGlhdGVseSBzaG93aW5nIGEgcHJveHkgZWxlbWVudC5cclxuICAgIHN0YXRpYyBzdGFydChsYXlvdXRNYW5hZ2VyOiBMYXlvdXRNYW5hZ2VyLCBsaXN0ZW5lcjogRHJhZ0xpc3RlbmVyLCBpdGVtOiBDb21wb25lbnRJdGVtLCB4OiBudW1iZXIsIHk6IG51bWJlciwgYWxsb3dQb3BvdXQ6IGJvb2xlYW4pOiBEcmFnQWN0aW9uIHsgICAgICAgICAgICBcclxuICAgICAgICBjb25zdCBhY3Rpb24gPSBuZXcgRHJhZ0FjdGlvbihsYXlvdXRNYW5hZ2VyLCBhbGxvd1BvcG91dCk7XHJcbiAgICAgICAgYWN0aW9uLmNyZWF0ZVByb3h5KGl0ZW0sIHgsIHkpO1xyXG4gICAgICAgIGFjdGlvbi5fZHJhZ0xpc3RlbmVyID0gbGlzdGVuZXI7XHJcbiAgICAgICAgbGlzdGVuZXIub24oJ2RyYWcnLCBhY3Rpb24uX2RyYWdFdmVudEhhbmRsZXIpO1xyXG4gICAgICAgIGxpc3RlbmVyLm9uKCdkcmFnU3RvcCcsIGFjdGlvbi5fZHJhZ1N0b3BFdmVudEhhbmRsZXIpO1xyXG4gICAgICAgIHJldHVybiBhY3Rpb247XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9yZXNvbHZlZC1jb25maWcnO1xyXG5pbXBvcnQgeyBVbmV4cGVjdGVkTnVsbEVycm9yLCBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBDb21wb25lbnRJdGVtIH0gZnJvbSAnLi4vaXRlbXMvY29tcG9uZW50LWl0ZW0nO1xyXG5pbXBvcnQgeyBDb250ZW50SXRlbSB9IGZyb20gJy4uL2l0ZW1zL2NvbnRlbnQtaXRlbSc7XHJcbmltcG9ydCB7IFN0YWNrIH0gZnJvbSAnLi4vaXRlbXMvc3RhY2snO1xyXG5pbXBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi4vbGF5b3V0LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBEb21Db25zdGFudHMgfSBmcm9tICcuLi91dGlscy9kb20tY29uc3RhbnRzJztcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vdXRpbHMvZXZlbnQtZW1pdHRlcic7XHJcbmltcG9ydCB7IFNpZGUsIFdpZHRoQW5kSGVpZ2h0IH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnO1xyXG5pbXBvcnQge1xyXG4gICAgZ2V0VW5pcXVlSWQsXHJcbiAgICBnZXRXaW5kb3dJbm5lclNjcmVlblBvc2l0aW9uLFxyXG4gICAgbnVtYmVyVG9QaXhlbHNcclxufSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcbmltcG9ydCB7IERyYWdBY3Rpb24gfSBmcm9tICcuL2RyYWctYWN0aW9uJztcclxuXHJcbi8qKlxyXG4gKiBUaGlzIGNsYXNzIGNyZWF0ZXMgYSB0ZW1wb3JhcnkgY29udGFpbmVyXHJcbiAqIGZvciB0aGUgY29tcG9uZW50IHdoaWxzdCBpdCBpcyBiZWluZyBkcmFnZ2VkXHJcbiAqIGFuZCBoYW5kbGVzIGRyYWcgZXZlbnRzXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIERyYWdQcm94eSBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBwcml2YXRlIF9vdXRlcldpZHRoOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIF9vdXRlckhlaWdodDogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBfc2lkZWQ6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIF9lbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgX3Byb3h5Q29udGFpbmVyRWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbiAgICBwcml2YXRlIF9jb21wb25lbnRJdGVtRm9jdXNlZDogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX29yaWdpbmFsU2l6ZTogV2lkdGhBbmRIZWlnaHQ7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kb2NrUG9pbnQ6IENvbnRlbnRJdGVtLkRvY2tQb2ludCB8IG51bGw7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ncm91bmRBcmVhOiBDb250ZW50SXRlbS5BcmVhO1xyXG4gICAgcHJpdmF0ZSBfbGFzdEFyZWE6IENvbnRlbnRJdGVtLkFyZWEgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICBnZXQgZWxlbWVudCgpOiBIVE1MRWxlbWVudCB7IHJldHVybiB0aGlzLl9lbGVtZW50OyB9XHJcbiAgICBnZXQgb3V0ZXJXaWR0aCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fb3V0ZXJXaWR0aDsgfVxyXG4gICAgZ2V0IG91dGVySGVpZ2h0KCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9vdXRlckhlaWdodDsgfVxyXG4gICAgZ2V0IGNvbXBvbmVudEl0ZW0oKTogQ29tcG9uZW50SXRlbSB7IHJldHVybiB0aGlzLl9jb21wb25lbnRJdGVtOyB9XHJcbiAgICBnZXQgbGF5b3V0TWFuYWdlcigpOiBMYXlvdXRNYW5hZ2VyIHsgcmV0dXJuIHRoaXMuX2FjdGlvbi5sYXlvdXRNYW5hZ2VyOyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0geCAtIFRoZSBpbml0aWFsIHggcG9zaXRpb25cclxuICAgICAqIEBwYXJhbSB5IC0gVGhlIGluaXRpYWwgeSBwb3NpdGlvblxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2FjdGlvbjogRHJhZ0FjdGlvbixcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9jb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtLFxyXG4gICAgICAgIHg6IG51bWJlciwgeTogbnVtYmVyXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICBsZXQgc2l6ZWRDb21wb25lbnQgPSB0aGlzLl9jb21wb25lbnRJdGVtO1xyXG5cclxuICAgICAgICAvLyBJZiB3ZSBhcmUgZHJhZ2dpbmcgYW4gaW5hY3RpdmUgY29tcG9uZW50IG9mIGEgc3RhY2ssIHdlIHdvbid0IGJlIGFibGUgdG8gZ2V0IHJlYXNvbmFibGVcclxuICAgICAgICAvLyBzaXplIGZvciBhIHBvcG91dC4gVXNlIHRoZSBzaXplIG9mIHRoZSBhY3RpdmUgY29tcG9uZW50IGluc3RlYWQgaW4gdGhpcyBjYXNlLlxyXG4gICAgICAgIGlmICh0aGlzLl9jb21wb25lbnRJdGVtLnBhcmVudCBpbnN0YW5jZW9mIFN0YWNrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuX2NvbXBvbmVudEl0ZW0ucGFyZW50LmdldEFjdGl2ZUNvbXBvbmVudEl0ZW0oKTtcclxuICAgICAgICAgICAgaWYgKGFjdGl2ZSkge1xyXG4gICAgICAgICAgICAgICAgc2l6ZWRDb21wb25lbnQgPSBhY3RpdmU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX29yaWdpbmFsU2l6ZSA9IHNpemVkQ29tcG9uZW50LmdldE91dGVyQm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVEcmFnUHJveHlFbGVtZW50cyh4LCB5KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudEl0ZW0ucGFyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBfY29udGVudEl0ZW0gd2lsbCBoYXZlIGR1bW15IEdyb3VuZEl0ZW0gYXMgcGFyZW50IGlmIGluaXRpYXRlZCBieSBhIGV4dGVybmFsIGRyYWcgc291cmNlXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdEUEMxMDA5NycpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbUZvY3VzZWQgPSB0aGlzLl9jb21wb25lbnRJdGVtLmZvY3VzZWQ7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudEl0ZW1Gb2N1c2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudEl0ZW0uYmx1cigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZG9ja1BvaW50ID0gdGhpcy5fY29tcG9uZW50SXRlbS5maW5kRG9ja1BvaW50KCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9jb21wb25lbnRJdGVtLnBhcmVudC5jb250ZW50SXRlbXMuaW5jbHVkZXModGhpcy5fY29tcG9uZW50SXRlbSkpIHtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5wYXJlbnQucmVtb3ZlQ2hpbGQodGhpcy5fY29tcG9uZW50SXRlbSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNldERpbWVuc2lvbnMoKTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLl9lbGVtZW50KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubGF5b3V0TWFuYWdlci5ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignRFBDMTAwOTgnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2dyb3VuZEFyZWEgPSB0aGlzLmxheW91dE1hbmFnZXIuZ3JvdW5kSXRlbS5nZXRFbGVtZW50QXJlYSgpO1xyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5jYWxjdWxhdGVJdGVtQXJlYXMoKTtcclxuICAgICAgICB0aGlzLnNldERyb3BQb3NpdGlvbih4LCB5KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQ3JlYXRlIFN0YWNrLWxpa2Ugc3RydWN0dXJlIHRvIGNvbnRhaW4gdGhlIGRyYWdnZWQgY29tcG9uZW50ICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZURyYWdQcm94eUVsZW1lbnRzKGluaXRpYWxYOiBudW1iZXIsIGluaXRpYWxZOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuRHJhZ1Byb3h5KTtcclxuICAgICAgICBjb25zdCBoZWFkZXJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgaGVhZGVyRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuSGVhZGVyKTtcclxuICAgICAgICBjb25zdCB0YWJzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIHRhYnNFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5UYWJzKTtcclxuICAgICAgICBjb25zdCB0YWJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGFiRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuVGFiKTtcclxuICAgICAgICBjb25zdCB0aXRsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgICAgdGl0bGVFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5UaXRsZSk7XHJcbiAgICAgICAgdGFiRWxlbWVudC5hcHBlbmRDaGlsZCh0aXRsZUVsZW1lbnQpO1xyXG4gICAgICAgIHRhYnNFbGVtZW50LmFwcGVuZENoaWxkKHRhYkVsZW1lbnQpO1xyXG4gICAgICAgIGhlYWRlckVsZW1lbnQuYXBwZW5kQ2hpbGQodGFic0VsZW1lbnQpO1xyXG5cclxuICAgICAgICB0aGlzLl9wcm94eUNvbnRhaW5lckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICB0aGlzLl9wcm94eUNvbnRhaW5lckVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkNvbnRlbnQpO1xyXG5cclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKGhlYWRlckVsZW1lbnQpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fcHJveHlDb250YWluZXJFbGVtZW50KTtcclxuXHJcbiAgICAgICAgY29uc3Qgc2lkZSA9IHRoaXMuX2NvbXBvbmVudEl0ZW0uaGVhZGVyQ29uZmlnPy5zaG93O1xyXG4gICAgICAgIGlmIChzaWRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NpZGVkID0gW1NpZGUucmlnaHQsIFNpZGUubGVmdF0uaW5jbHVkZXMoc2lkZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbG1fJyArIHNpZGUpO1xyXG4gICAgICAgICAgICBpZiAoW1NpZGUucmlnaHQsIFNpZGUuYm90dG9tXS5pbmRleE9mKHNpZGUpID49IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Byb3h5Q29udGFpbmVyRWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgaGVhZGVyRWxlbWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5sZWZ0ID0gbnVtYmVyVG9QaXhlbHMoaW5pdGlhbFgpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUudG9wID0gbnVtYmVyVG9QaXhlbHMoaW5pdGlhbFkpO1xyXG4gICAgICAgIHRhYkVsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsIHRoaXMuX2NvbXBvbmVudEl0ZW0udGl0bGUpO1xyXG4gICAgICAgIHRpdGxlRWxlbWVudC5pbnNlcnRBZGphY2VudFRleHQoJ2FmdGVyYmVnaW4nLCB0aGlzLl9jb21wb25lbnRJdGVtLnRpdGxlKTtcclxuICAgICAgICB0aGlzLl9wcm94eUNvbnRhaW5lckVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fY29tcG9uZW50SXRlbS5lbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxiYWNrIG9uIGV2ZXJ5IG1vdXNlTW92ZSBldmVudCBkdXJpbmcgYSBkcmFnLiBEZXRlcm1pbmVzIGlmIHRoZSBkcmFnIGlzXHJcbiAgICAgKiBzdGlsbCB3aXRoaW4gdGhlIHZhbGlkIGRyYWcgYXJlYSBhbmQgY2FsbHMgdGhlIGxheW91dE1hbmFnZXIgdG8gaGlnaGxpZ2h0IHRoZVxyXG4gICAgICogY3VycmVudCBkcm9wIGFyZWFcclxuICAgICAqXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgZHJhZyh4OiBudW1iZXIsIHk6IG51bWJlcik6IENvbnRlbnRJdGVtLkFyZWEgfCBudWxsIHtcclxuICAgICAgICBjb25zdCBhcmVhID0gdGhpcy5zZXREcm9wUG9zaXRpb24oeCwgeSk7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5kcmFnKCk7XHJcbiAgICAgICAgcmV0dXJuIGFyZWE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB0YXJnZXQgcG9zaXRpb25cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geCAtIFRoZSB4IHBvc2l0aW9uIGluIHB4XHJcbiAgICAgKiBAcGFyYW0geSAtIFRoZSB5IHBvc2l0aW9uIGluIHB4XHJcbiAgICAgKlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc2V0RHJvcFBvc2l0aW9uKHg6IG51bWJlciwgeTogbnVtYmVyKTogQ29udGVudEl0ZW0uQXJlYSB8IG51bGwge1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUubGVmdCA9IG51bWJlclRvUGl4ZWxzKHgpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUudG9wID0gbnVtYmVyVG9QaXhlbHMoeSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGFyZWEgPSB0aGlzLmxheW91dE1hbmFnZXIuZ2V0QXJlYSh4LCB5KTtcclxuXHJcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBubyBtYXRjaGluZyBhcmVhLCByZXR1cm4gdGhlIGxhc3QgYXJlYSBpbnN0ZWFkICh1bmxlc3Mgd2UgYXJlIG91dCBvZiBib3VuZHMgb2YgdGhlIGdyb3VuZCBpdGVtKS5cclxuICAgICAgICAvLyBBdm9pZHMgaXNzdWVzIHdpdGggc3BsaXR0ZXJzIHdoaWNoIGRvbid0IGhhdmUgYW4gYXJlYSB0aGVtc2VsdmVzLlxyXG4gICAgICAgIGlmIChhcmVhICE9PSBudWxsIHx8IHggPCB0aGlzLl9ncm91bmRBcmVhLngxIHx8IHggPj0gdGhpcy5fZ3JvdW5kQXJlYS54MiB8fCB5IDwgdGhpcy5fZ3JvdW5kQXJlYS55MSB8fCB5ID49IHRoaXMuX2dyb3VuZEFyZWEueTIpIHtcclxuICAgICAgICAgICAgdGhpcy5fbGFzdEFyZWEgPSBhcmVhO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3RBcmVhO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGJhY2sgd2hlbiB0aGUgZHJhZyBoYXMgZmluaXNoZWQuIERldGVybWluZXMgdGhlIGRyb3AgYXJlYVxyXG4gICAgICogYW5kIGFkZHMgdGhlIGNoaWxkIHRvIGl0XHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgZHJvcCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRJdGVtLmV4aXREcmFnTW9kZSgpO1xyXG5cclxuICAgICAgICBsZXQgYXJlYTogQ29udGVudEl0ZW0uQXJlYSB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgIGxldCBkcm9wcGVkQ29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLl9hY3Rpb24uY3VycmVudFRhcmdldDtcclxuICAgICAgICBpZiAodGFyZ2V0Py5vd25lciA9PT0gdGhpcy5fYWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGFyZWEgPSB0YXJnZXQuYXJlYTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgKiBWYWxpZCBkcm9wIGFyZWEgZm91bmRcclxuICAgICAgICAqL1xyXG4gICAgICAgIGlmIChhcmVhICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGRyb3BwZWRDb21wb25lbnRJdGVtID0gdGhpcy5fY29tcG9uZW50SXRlbTtcclxuICAgICAgICAgICAgY29uc3QgbmV3UGFyZW50Q29udGVudEl0ZW0gPSBhcmVhLmNvbnRlbnRJdGVtO1xyXG4gICAgICAgICAgICBuZXdQYXJlbnRDb250ZW50SXRlbS5vbkRyb3AoZHJvcHBlZENvbXBvbmVudEl0ZW0sIGFyZWEpO1xyXG4gICAgICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuZm9jdXNXaW5kb3coKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogTm8gdmFsaWQgZHJvcCBhcmVhIGZvdW5kIGR1cmluZyB0aGUgZHVyYXRpb24gb2YgdGhlIGRyYWcuXHJcbiAgICAgICAgICogQ3JlYXRlIGEgcG9wb3V0LlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0ID09PSBudWxsICYmIHRoaXMuX2FjdGlvbi5wYXJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgY29uc3QgaW5uZXJTY3JlZW4gPSBnZXRXaW5kb3dJbm5lclNjcmVlblBvc2l0aW9uKGdsb2JhbFRoaXMpO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgd2luZG93IDogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcuV2luZG93ID0ge1xyXG4gICAgICAgICAgICAgICAgbGVmdDogaW5uZXJTY3JlZW4ubGVmdCArIHRoaXMuZWxlbWVudC5vZmZzZXRMZWZ0LFxyXG4gICAgICAgICAgICAgICAgdG9wOiBpbm5lclNjcmVlbi50b3AgKyB0aGlzLmVsZW1lbnQub2Zmc2V0VG9wLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IHRoaXMuX29yaWdpbmFsU2l6ZS53aWR0aCxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogdGhpcy5fb3JpZ2luYWxTaXplLmhlaWdodFxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuY3JlYXRlUG9wb3V0RnJvbUNvbnRlbnRJdGVtKHRoaXMuX2NvbXBvbmVudEl0ZW0sIHdpbmRvdywgZ2V0VW5pcXVlSWQoKSwgdGhpcy5fZG9ja1BvaW50KTtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5kZXN0cm95KCk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBkcmFnIGRpZG4ndCB1bHRpbWF0ZWx5IGVuZCB1cCB3aXRoIGFkZGluZyB0aGUgY29udGVudCBpdGVtIHRvXHJcbiAgICAgICAgICogYW55IGNvbnRhaW5lci4gSW4gb3JkZXIgdG8gZW5zdXJlIGNsZWFuIHVwIGhhcHBlbnMsIGRlc3Ryb3kgdGhlXHJcbiAgICAgICAgICogY29udGVudCBpdGVtLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudEl0ZW0uZGVzdHJveSgpOyAvLyBjb250ZW50SXRlbSBjaGlsZHJlbiBhcmUgbm93IGRlc3Ryb3llZCBhcyB3ZWxsXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuZW1pdCgnaXRlbURyb3BwZWQnLCB0aGlzLl9jb21wb25lbnRJdGVtKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudEl0ZW1Gb2N1c2VkKSB7XHJcbiAgICAgICAgICAgIGRyb3BwZWRDb21wb25lbnRJdGVtPy5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIERyYWcgUHJveHkncyBkaW1lbnNpb25zXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzZXREaW1lbnNpb25zKCkge1xyXG4gICAgICAgIGNvbnN0IGRpbWVuc2lvbnMgPSB0aGlzLmxheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLmRpbWVuc2lvbnM7XHJcbiAgICAgICAgaWYgKGRpbWVuc2lvbnMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RyYWdQcm94eS5zZXREaW1lbnNpb25zOiBkaW1lbnNpb25zIHVuZGVmaW5lZCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHdpZHRoID0gZGltZW5zaW9ucy5kcmFnUHJveHlXaWR0aDtcclxuICAgICAgICBsZXQgaGVpZ2h0ID0gZGltZW5zaW9ucy5kcmFnUHJveHlIZWlnaHQ7XHJcbiAgICAgICAgaWYgKHdpZHRoID09PSB1bmRlZmluZWQgfHwgaGVpZ2h0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEcmFnUHJveHkuc2V0RGltZW5zaW9uczogd2lkdGggYW5kL29yIGhlaWdodCB1bmRlZmluZWQnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX291dGVyV2lkdGggPSB3aWR0aDtcclxuICAgICAgICB0aGlzLl9vdXRlckhlaWdodCA9IGhlaWdodDtcclxuICAgICAgICBjb25zdCBoZWFkZXJIZWlnaHQgPSB0aGlzLmxheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLmhlYWRlci5zaG93ID09PSBmYWxzZSA/IDAgOiBkaW1lbnNpb25zLmhlYWRlckhlaWdodDtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLndpZHRoID0gbnVtYmVyVG9QaXhlbHMod2lkdGgpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gbnVtYmVyVG9QaXhlbHMoaGVpZ2h0KVxyXG4gICAgICAgIHdpZHRoIC09ICh0aGlzLl9zaWRlZCA/IGhlYWRlckhlaWdodCA6IDApO1xyXG4gICAgICAgIGhlaWdodCAtPSAoIXRoaXMuX3NpZGVkID8gaGVhZGVySGVpZ2h0IDogMCk7XHJcbiAgICAgICAgdGhpcy5fcHJveHlDb250YWluZXJFbGVtZW50LnN0eWxlLndpZHRoID0gbnVtYmVyVG9QaXhlbHMod2lkdGgpO1xyXG4gICAgICAgIHRoaXMuX3Byb3h5Q29udGFpbmVyRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBudW1iZXJUb1BpeGVscyhoZWlnaHQpO1xyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudEl0ZW0uZW50ZXJEcmFnTW9kZSh3aWR0aCwgaGVpZ2h0KTtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRJdGVtLnNob3coKTtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBDb21wb25lbnRJdGVtQ29uZmlnIGFzIENvbmZpZ0NvbXBvbmVudEl0ZW1Db25maWcgfSBmcm9tICcuLi9jb25maWcvY29uZmlnJzsgLy8gcmVtb3ZlIGFsaWFzIGluIHZlcnNpb24gM1xyXG5pbXBvcnQgeyBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyB9IGZyb20gXCIuLi9jb25maWcvcmVzb2x2ZWQtY29uZmlnXCI7XHJcbmltcG9ydCB7IFVuZXhwZWN0ZWROdWxsRXJyb3IsIFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuLi9pdGVtcy9jb21wb25lbnQtaXRlbSc7XHJcbmltcG9ydCB7IEdyb3VuZEl0ZW0gfSBmcm9tICcuLi9pdGVtcy9ncm91bmQtaXRlbSc7XHJcbmltcG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuLi9sYXlvdXQtbWFuYWdlcic7XHJcbmltcG9ydCB7IERyYWdMaXN0ZW5lciB9IGZyb20gJy4uL3V0aWxzL2RyYWctbGlzdGVuZXInO1xyXG5pbXBvcnQgeyBKc29uVmFsdWUgfSBmcm9tICcuLi91dGlscy90eXBlcyc7XHJcbmltcG9ydCB7IERyYWdBY3Rpb24gfSBmcm9tICcuL2RyYWctYWN0aW9uJztcclxuXHJcbi8qKlxyXG4gKiBBbGxvd3MgZm9yIGFueSBET00gaXRlbSB0byBjcmVhdGUgYSBjb21wb25lbnQgb24gZHJhZ1xyXG4gKiBzdGFydCB0byBiZSBkcmFnZ2VkIGludG8gdGhlIExheW91dFxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRHJhZ1NvdXJjZSB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9kcmFnTGlzdGVuZXI6IERyYWdMaXN0ZW5lciB8IG51bGw7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9kdW1teUdyb3VuZENvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9kdW1teUdyb3VuZENvbnRlbnRJdGVtOiBHcm91bmRJdGVtO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9sYXlvdXRNYW5hZ2VyOiBMYXlvdXRNYW5hZ2VyLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9lbGVtZW50OiBIVE1MRWxlbWVudCxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfZXh0cmFBbGxvd2FibGVDaGlsZFRhcmdldHM6IEhUTUxFbGVtZW50W10sXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCBAZGVwcmVjYXRlZCByZXBsYWNlIHdpdGggY29tcG9uZW50SXRlbUNvbmZpZ09yRnRuIGluIHZlcnNpb24gMyAqL1xyXG4gICAgICAgIHByaXZhdGUgX2NvbXBvbmVudFR5cGVPckZ0bjogSnNvblZhbHVlIHwgKCgpID0+IChEcmFnU291cmNlLkNvbXBvbmVudEl0ZW1Db25maWcgfCBDb25maWdDb21wb25lbnRJdGVtQ29uZmlnKSksXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCBAZGVwcmVjYXRlZCByZW1vdmUgaW4gdmVyc2lvbiAzICovXHJcbiAgICAgICAgcHJpdmF0ZSBfY29tcG9uZW50U3RhdGU6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCxcclxuICAgICAgICAvKiogQGludGVybmFsIEBkZXByZWNhdGVkIHJlbW92ZSBpbiB2ZXJzaW9uIDMgKi9cclxuICAgICAgICBwcml2YXRlIF90aXRsZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgQGRlcHJlY2F0ZWQgcmVtb3ZlIGluIHZlcnNpb24gMyAqL1xyXG4gICAgICAgIHByaXZhdGUgX2lkOiBzdHJpbmcgfCB1bmRlZmluZWRcclxuICAgICkge1xyXG4gICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lciA9IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMuX2R1bW15R3JvdW5kQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblxyXG4gICAgICAgIGNvbnN0IGR1bW15Um9vdEl0ZW1Db25maWcgPSBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZy5jcmVhdGVEZWZhdWx0KCdyb3cnKTtcclxuICAgICAgICB0aGlzLl9kdW1teUdyb3VuZENvbnRlbnRJdGVtID0gbmV3IEdyb3VuZEl0ZW0odGhpcy5fbGF5b3V0TWFuYWdlciwgZHVtbXlSb290SXRlbUNvbmZpZywgdGhpcy5fZHVtbXlHcm91bmRDb250YWluZXIpO1xyXG5cclxuICAgICAgICB0aGlzLmNyZWF0ZURyYWdMaXN0ZW5lcigpO1xyXG4gICAgfVxyXG5cclxuXHQvKipcclxuXHQgKiBEaXNwb3NlcyBvZiB0aGUgZHJhZyBsaXN0ZW5lcnMgc28gdGhlIGRyYWcgc291cmNlIGlzIG5vdCB1c2FibGUgYW55IG1vcmUuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuXHQgKi9cclxuXHRkZXN0cm95KCk6IHZvaWQge1xyXG5cdFx0dGhpcy5yZW1vdmVEcmFnTGlzdGVuZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCBpbml0aWFsbHkgYW5kIGFmdGVyIGV2ZXJ5IGRyYWdcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZURyYWdMaXN0ZW5lcigpIHtcclxuICAgICAgICB0aGlzLnJlbW92ZURyYWdMaXN0ZW5lcigpO1xyXG5cclxuICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIgPSBuZXcgRHJhZ0xpc3RlbmVyKHRoaXMuX2VsZW1lbnQsIHRoaXMuX2V4dHJhQWxsb3dhYmxlQ2hpbGRUYXJnZXRzKTtcclxuICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIub24oJ2RyYWdTdGFydCcsICh4LCB5KSA9PiB0aGlzLm9uRHJhZ1N0YXJ0KHgsIHkpKTtcclxuICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIub24oJ2RyYWdTdG9wJywgKCkgPT4gdGhpcy5vbkRyYWdTdG9wKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGJhY2sgZm9yIHRoZSBEcmFnTGlzdGVuZXIncyBkcmFnU3RhcnQgZXZlbnRcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geCAtIFRoZSB4IHBvc2l0aW9uIG9mIHRoZSBtb3VzZSBvbiBkcmFnU3RhcnRcclxuICAgICAqIEBwYXJhbSB5IC0gVGhlIHggcG9zaXRpb24gb2YgdGhlIG1vdXNlIG9uIGRyYWdTdGFydFxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25EcmFnU3RhcnQoeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCB0eXBlID0gJ2NvbXBvbmVudCc7XHJcbiAgICAgICAgbGV0IGRyYWdTb3VyY2VJdGVtQ29uZmlnOiBDb25maWdDb21wb25lbnRJdGVtQ29uZmlnO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX2NvbXBvbmVudFR5cGVPckZ0biA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZ0bkRyYWdTb3VyY2VJdGVtQ29uZmlnID0gdGhpcy5fY29tcG9uZW50VHlwZU9yRnRuKCkgYXMgKERyYWdTb3VyY2UuQ29tcG9uZW50SXRlbUNvbmZpZyB8IENvbmZpZ0NvbXBvbmVudEl0ZW1Db25maWcpO1xyXG4gICAgICAgICAgICAvLyBJZiB0aGUgY29tcG9uZW50VHlwZSBwcm9wZXJ0eSBleGlzdHMsIHRoZW4gaXQgaXMgYWxyZWFkeSBhIENvbXBvbmVudEl0ZW1Db25maWcgc28gbm90aGluZyB0byBkb1xyXG4gICAgICAgICAgICBpZiAoRHJhZ1NvdXJjZS5pc0RyYWdTb3VyY2VDb21wb25lbnRJdGVtQ29uZmlnKGZ0bkRyYWdTb3VyY2VJdGVtQ29uZmlnKSkge1xyXG4gICAgICAgICAgICAgICAgZHJhZ1NvdXJjZUl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHlwZSxcclxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRTdGF0ZTogZnRuRHJhZ1NvdXJjZUl0ZW1Db25maWcuc3RhdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50VHlwZTogZnRuRHJhZ1NvdXJjZUl0ZW1Db25maWcudHlwZSxcclxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogZnRuRHJhZ1NvdXJjZUl0ZW1Db25maWcudGl0bGUgPz8gdGhpcy5fdGl0bGUsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZHJhZ1NvdXJjZUl0ZW1Db25maWcgPSBmdG5EcmFnU291cmNlSXRlbUNvbmZpZztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRyYWdTb3VyY2VJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICAgICAgdHlwZSxcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudFN0YXRlOiB0aGlzLl9jb21wb25lbnRTdGF0ZSxcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudFR5cGU6IHRoaXMuX2NvbXBvbmVudFR5cGVPckZ0bixcclxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLl90aXRsZSxcclxuICAgICAgICAgICAgICAgIGlkOiB0aGlzLl9pZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIENyZWF0ZSBhIGR1bW15IENvbnRlbnRJdGVtIG9ubHkgZm9yIGRyYWcgcHVycG9zZXNcclxuICAgICAgICAvLyBBbGwgQ29udGVudEl0ZW1zIChleGNlcHQgZm9yIEdyb3VuZEl0ZW0pIG5lZWQgYSBwYXJlbnQuICBXaGVuIGRyYWdnaW5nLCB0aGUgcGFyZW50IGlzIG5vdCB1c2VkLlxyXG4gICAgICAgIC8vIEluc3RlYWQgb2YgYWxsb3dpbmcgbnVsbCBwYXJlbnRzIChhcyBKYXZhc2NyaXB0IHZlcnNpb24gZGlkKSwgdXNlIGEgdGVtcG9yYXJ5IGR1bW15IEdyb3VuZEl0ZW0gcGFyZW50IGFuZCBhZGQgQ29udGVudEl0ZW0gdG8gdGhhdFxyXG4gICAgICAgIC8vIElmIHRoaXMgZG9lcyBub3Qgd29yaywgbmVlZCB0byBjcmVhdGUgYWx0ZXJuYXRpdmUgR3JvdW5kSXRlbSBjbGFzc1xyXG5cclxuICAgICAgICBjb25zdCByZXNvbHZlZEl0ZW1Db25maWcgPSBDb25maWdDb21wb25lbnRJdGVtQ29uZmlnLnJlc29sdmUoZHJhZ1NvdXJjZUl0ZW1Db25maWcsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29tcG9uZW50SXRlbSA9IG5ldyBDb21wb25lbnRJdGVtKHRoaXMuX2xheW91dE1hbmFnZXIsIHJlc29sdmVkSXRlbUNvbmZpZywgdGhpcy5fZHVtbXlHcm91bmRDb250ZW50SXRlbSlcclxuICAgICAgICB0aGlzLl9kdW1teUdyb3VuZENvbnRlbnRJdGVtLmNvbnRlbnRJdGVtcy5wdXNoKGNvbXBvbmVudEl0ZW0pO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fZHJhZ0xpc3RlbmVyID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdEU09EU0Q2Njc0NicpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbiA9IERyYWdBY3Rpb24uc3RhcnQodGhpcy5fbGF5b3V0TWFuYWdlciwgdGhpcy5fZHJhZ0xpc3RlbmVyLCBjb21wb25lbnRJdGVtLCB4LCB5LCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0cmFuc2l0aW9uSW5kaWNhdG9yID0gdGhpcy5fbGF5b3V0TWFuYWdlci50cmFuc2l0aW9uSW5kaWNhdG9yO1xyXG4gICAgICAgICAgICBpZiAodHJhbnNpdGlvbkluZGljYXRvciA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0RTT0RTVDY2NzQ2Jyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcm94eUVsZW1lbnQgPSBhY3Rpb24ucHJveHk/LmVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJveHlFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdEU09EU1Q2Njc0NycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb25JbmRpY2F0b3IudHJhbnNpdGlvbkVsZW1lbnRzKHRoaXMuX2VsZW1lbnQsIHByb3h5RWxlbWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBvbkRyYWdTdG9wKCkge1xyXG4gICAgICAgIC8vIGlmICh0aGlzLl9kdW1teUdyb3VuZENvbnRlbnRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAvLyAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignRFNPRFNEUlUwODExNicpO1xyXG4gICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuX2R1bW15R3JvdW5kQ29udGVudEl0ZW0uXyRkZXN0cm95XHJcbiAgICAgICAgLy8gICAgIHRoaXMuX2R1bW15R3JvdW5kQ29udGVudEl0ZW0gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIHRoaXMuY3JlYXRlRHJhZ0xpc3RlbmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcblx0ICogQ2FsbGVkIGFmdGVyIGV2ZXJ5IGRyYWcgYW5kIHdoZW4gdGhlIGRyYWcgc291cmNlIGlzIGJlaW5nIGRpc3Bvc2VkIG9mLlxyXG4gICAgICogQGludGVybmFsXHJcblx0ICovXHJcblx0cHJpdmF0ZSByZW1vdmVEcmFnTGlzdGVuZXIoKSB7XHJcblx0XHRpZiAodGhpcy5fZHJhZ0xpc3RlbmVyICE9PSBudWxsICkge1xyXG4gICAgICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIgPSBudWxsO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBEcmFnU291cmNlIHtcclxuICAgIC8qKiBAZGVwcmVjYXRlZCAgdXNlIENvbmZpZyB7QGxpbmsgKENvbXBvbmVudEl0ZW1Db25maWc6aW50ZXJmYWNlKX0gKi9cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50SXRlbUNvbmZpZyB7XHJcbiAgICAgICAgdHlwZTogSnNvblZhbHVlLFxyXG4gICAgICAgIHN0YXRlPzogSnNvblZhbHVlLFxyXG4gICAgICAgIHRpdGxlPzogc3RyaW5nLFxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAZGVwcmVjYXRlZCByZW1vdmUgaW4gdmVyc2lvbiAzICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNEcmFnU291cmNlQ29tcG9uZW50SXRlbUNvbmZpZyhcclxuICAgICAgICBjb25maWc6IERyYWdTb3VyY2UuQ29tcG9uZW50SXRlbUNvbmZpZyB8IENvbmZpZ0NvbXBvbmVudEl0ZW1Db25maWdcclxuICAgICk6IGNvbmZpZyBpcyBEcmFnU291cmNlLkNvbXBvbmVudEl0ZW1Db25maWcge1xyXG4gICAgICAgIHJldHVybiAhKFwiY29tcG9uZW50VHlwZVwiIGluIGNvbmZpZyk7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgRG9tQ29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbHMvZG9tLWNvbnN0YW50cyc7XHJcbmltcG9ydCB7IEFyZWFMaW5rZWRSZWN0IH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnO1xyXG5pbXBvcnQgeyBudW1iZXJUb1BpeGVscyB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGNsYXNzIERyb3BUYXJnZXRJbmRpY2F0b3Ige1xyXG4gICAgcHJpdmF0ZSBfZWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgLy8gTWF5YmUgdXNlIGNvbnRhaW5lciBpbnN0ZWFkIG9mIERvY3VtZW50IEJvZHk/XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkRyb3BUYXJnZXRJbmRpY2F0b3IpO1xyXG4gICAgICAgIGNvbnN0IGlubmVyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGlubmVyRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuSW5uZXIpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQoaW5uZXJFbGVtZW50KTtcclxuXHJcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLl9lbGVtZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaGlnaGxpZ2h0QXJlYShhcmVhOiBBcmVhTGlua2VkUmVjdCwgbWFyZ2luOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmxlZnQgPSBudW1iZXJUb1BpeGVscyhhcmVhLngxICsgbWFyZ2luKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnRvcCA9IG51bWJlclRvUGl4ZWxzKGFyZWEueTEgKyBtYXJnaW4pO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUud2lkdGggPSBudW1iZXJUb1BpeGVscyhhcmVhLngyIC0gYXJlYS54MSAtIG1hcmdpbiAtIDEpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gbnVtYmVyVG9QaXhlbHMoYXJlYS55MiAtIGFyZWEueTEgLSBtYXJnaW4gLSAxKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XHJcbiAgICB9XHJcblxyXG4gICAgaGlkZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBIZWFkZXIgfSBmcm9tICcuL2hlYWRlcic7XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBjbGFzcyBIZWFkZXJCdXR0b24ge1xyXG4gICAgcHJpdmF0ZSBfZWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbiAgICBwcml2YXRlIF9jbGlja0V2ZW50TGlzdGVuZXIgPSAoZXY6IE1vdXNlRXZlbnQpID0+IHRoaXMub25DbGljayhldik7XHJcbiAgICBwcml2YXRlIF90b3VjaFN0YXJ0RXZlbnRMaXN0ZW5lciA9IChldjogVG91Y2hFdmVudCkgPT4gdGhpcy5vblRvdWNoU3RhcnQoZXYpO1xyXG5cclxuICAgIGdldCBlbGVtZW50KCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7IH1cclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9oZWFkZXI6IEhlYWRlciwgbGFiZWw6IHN0cmluZywgY3NzQ2xhc3M6IHN0cmluZywgcHJpdmF0ZSBfcHVzaEV2ZW50OiBIZWFkZXJCdXR0b24uUHVzaEV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChjc3NDbGFzcyk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC50aXRsZSA9IGxhYmVsO1xyXG4gICAgICAgIHRoaXMuX2hlYWRlci5vbignZGVzdHJveScsICgpID0+IHRoaXMuZGVzdHJveSgpKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fY2xpY2tFdmVudExpc3RlbmVyLCB7IHBhc3NpdmU6IHRydWUgfSk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5fdG91Y2hTdGFydEV2ZW50TGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICB0aGlzLl9oZWFkZXIuY29udHJvbHNDb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2NsaWNrRXZlbnRMaXN0ZW5lcik7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5fdG91Y2hTdGFydEV2ZW50TGlzdGVuZXIpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQodGhpcy5fZWxlbWVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkNsaWNrKGV2OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5fcHVzaEV2ZW50KGV2KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uVG91Y2hTdGFydChldjogVG91Y2hFdmVudCkge1xyXG4gICAgICAgIHRoaXMuX3B1c2hFdmVudChldik7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBIZWFkZXJCdXR0b24ge1xyXG4gICAgZXhwb3J0IHR5cGUgUHVzaEV2ZW50ID0gKHRoaXM6IHZvaWQsIGV2OiBFdmVudCkgPT4gdm9pZDtcclxufVxyXG4iLCJpbXBvcnQgeyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBDb21wb25lbnRJdGVtIH0gZnJvbSAnLi4vaXRlbXMvY29tcG9uZW50LWl0ZW0nO1xyXG5pbXBvcnQgeyBTdGFjayB9IGZyb20gJy4uL2l0ZW1zL3N0YWNrJztcclxuaW1wb3J0IHsgTGF5b3V0TWFuYWdlciB9IGZyb20gJy4uL2xheW91dC1tYW5hZ2VyJztcclxuaW1wb3J0IHsgRG9tQ29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbHMvZG9tLWNvbnN0YW50cyc7XHJcbmltcG9ydCB7IERyYWdMaXN0ZW5lciB9IGZyb20gJy4uL3V0aWxzL2RyYWctbGlzdGVuZXInO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi91dGlscy9ldmVudC1lbWl0dGVyJztcclxuaW1wb3J0IHsgU2lkZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcclxuaW1wb3J0IHsgbnVtYmVyVG9QaXhlbHMsIHNldEVsZW1lbnREaXNwbGF5VmlzaWJpbGl0eSB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuaW1wb3J0IHsgSGVhZGVyQnV0dG9uIH0gZnJvbSAnLi9oZWFkZXItYnV0dG9uJztcclxuaW1wb3J0IHsgVGFiIH0gZnJvbSAnLi90YWInO1xyXG5pbXBvcnQgeyBUYWJzQ29udGFpbmVyIH0gZnJvbSAnLi90YWJzLWNvbnRhaW5lcic7XHJcblxyXG4vKipcclxuICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgaGVhZGVyIGFib3ZlIGEgU3RhY2sgQ29udGVudEl0ZW0uXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBjbGFzcyBIZWFkZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFic0NvbnRhaW5lcjogVGFic0NvbnRhaW5lcjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY29udHJvbHNDb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zaG93OiBib29sZWFuO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcG9wb3V0TGFiZWw6IHN0cmluZztcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX21heGltaXNlTGFiZWw6IHN0cmluZztcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX21pbmltaXNlTGFiZWw6IHN0cmluZztcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Nsb3NlTGFiZWw6IHN0cmluZztcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RhYkRyb3Bkb3duRW5hYmxlZDogYm9vbGVhbjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RhYkRyb3Bkb3duTGFiZWw6IHN0cmluZztcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90YWJDb250cm9sT2Zmc2V0OiBudW1iZXI7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2xpY2tMaXN0ZW5lciA9IChldjogTW91c2VFdmVudCkgPT4gdGhpcy5vbkNsaWNrKGV2KTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RvdWNoU3RhcnRMaXN0ZW5lciA9IChldjogVG91Y2hFdmVudCkgPT4gdGhpcy5vblRvdWNoU3RhcnQoZXYpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZG9jdW1lbnRNb3VzZVVwTGlzdGVuZXI6ICh0aGlzOiB2b2lkKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbGF5b3V0U3RhdGVMaXN0ZW5lciA9ICgpID0+IHRoaXMub25MYXlvdXRDaGFuZ2VkKCk7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfc2lkZTogU2lkZTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2xlZnRSaWdodFNpZGVkOiBib29sZWFuO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2xvc2VCdXR0b246IEhlYWRlckJ1dHRvbjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3BvcG91dEJ1dHRvbjogSGVhZGVyQnV0dG9uO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFiRHJvcGRvd25CdXR0b246IEhlYWRlckJ1dHRvbjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX21heGltaXNlQnV0dG9uOiBIZWFkZXJCdXR0b247XHJcbiAgICAvLyAvKiogQGludGVybmFsICovXHJcbiAgICAvLyBwcml2YXRlIF9hY3RpdmVDb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtIHwgbnVsbCA9IG51bGw7IC8vIG9ubHkgdXNlZCB0byBpZGVudGlmeSBhY3RpdmUgdGFiXHJcblxyXG4gICAgZ2V0IHNob3coKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9zaG93OyB9XHJcbiAgICBnZXQgc2lkZSgpOiBTaWRlIHsgcmV0dXJuIHRoaXMuX3NpZGU7IH1cclxuICAgIGdldCBsZWZ0UmlnaHRTaWRlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2xlZnRSaWdodFNpZGVkOyB9XHJcblxyXG4gICAgZ2V0IGxheW91dE1hbmFnZXIoKTogTGF5b3V0TWFuYWdlciB7IHJldHVybiB0aGlzLl9sYXlvdXRNYW5hZ2VyOyB9XHJcbiAgICBnZXQgcGFyZW50KCk6IFN0YWNrIHsgcmV0dXJuIHRoaXMuX3BhcmVudDsgfVxyXG4gICAgZ2V0IHRhYnMoKTogVGFiW10geyByZXR1cm4gdGhpcy5fdGFic0NvbnRhaW5lci50YWJzOyB9XHJcbiAgICBnZXQgbGFzdFZpc2libGVUYWJJbmRleCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fdGFic0NvbnRhaW5lci5sYXN0VmlzaWJsZVRhYkluZGV4OyB9XHJcblxyXG4gICAgZ2V0IGVsZW1lbnQoKTogSFRNTEVsZW1lbnQgeyByZXR1cm4gdGhpcy5fZWxlbWVudDsgfVxyXG4gICAgZ2V0IHRhYnNDb250YWluZXJFbGVtZW50KCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX3RhYnNDb250YWluZXIuZWxlbWVudDsgfVxyXG4gICAgZ2V0IGNvbnRyb2xzQ29udGFpbmVyRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7IHJldHVybiB0aGlzLl9jb250cm9sc0NvbnRhaW5lckVsZW1lbnQ7IH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfbGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlcixcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfcGFyZW50OiBTdGFjayxcclxuICAgICAgICBzZXR0aW5nczogSGVhZGVyLlNldHRpbmdzLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9nZXRBY3RpdmVDb21wb25lbnRJdGVtRXZlbnQ6IEhlYWRlci5HZXRBY3RpdmVDb21wb25lbnRJdGVtRXZlbnQsXHJcbiAgICAgICAgY2xvc2VFdmVudDogSGVhZGVyLkNsb3NlRXZlbnQsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX3BvcG91dEV2ZW50OiBIZWFkZXIuUG9wb3V0RXZlbnQgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX21heGltaXNlVG9nZ2xlRXZlbnQ6IEhlYWRlci5NYXhpbWlzZVRvZ2dsZUV2ZW50IHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9jbGlja0V2ZW50OiBIZWFkZXIuQ2xpY2tFdmVudCB8IHVuZGVmaW5lZCxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfdG91Y2hTdGFydEV2ZW50OiBIZWFkZXIuVG91Y2hTdGFydEV2ZW50IHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9jb21wb25lbnRSZW1vdmVFdmVudDogSGVhZGVyLkNvbXBvbmVudFJlbW92ZUV2ZW50IHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9jb21wb25lbnRGb2N1c0V2ZW50OiBIZWFkZXIuQ29tcG9uZW50Rm9jdXNFdmVudCB8IHVuZGVmaW5lZCxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfY29tcG9uZW50RHJhZ1N0YXJ0RXZlbnQ6IEhlYWRlci5Db21wb25lbnREcmFnU3RhcnRFdmVudCB8IHVuZGVmaW5lZCxcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3RhYnNDb250YWluZXIgPSBuZXcgVGFic0NvbnRhaW5lcih0aGlzLl9sYXlvdXRNYW5hZ2VyLFxyXG4gICAgICAgICAgICAoaXRlbSkgPT4gdGhpcy5oYW5kbGVUYWJJbml0aWF0ZWRDb21wb25lbnRSZW1vdmVFdmVudChpdGVtKSxcclxuICAgICAgICAgICAgKGl0ZW0pID0+IHRoaXMuaGFuZGxlVGFiSW5pdGlhdGVkQ29tcG9uZW50Rm9jdXNFdmVudChpdGVtKSxcclxuICAgICAgICAgICAgKHgsIHksIGRyYWdMaXN0ZW5lciwgaXRlbSkgPT4gdGhpcy5oYW5kbGVUYWJJbml0aWF0ZWREcmFnU3RhcnRFdmVudCh4LCB5LCBkcmFnTGlzdGVuZXIsIGl0ZW0pLFxyXG4gICAgICAgICAgICAoKSA9PiB0aGlzLnByb2Nlc3NUYWJEcm9wZG93bkFjdGl2ZUNoYW5nZWQoKSxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICB0aGlzLl9zaG93ID0gc2V0dGluZ3Muc2hvdztcclxuICAgICAgICB0aGlzLl9wb3BvdXRMYWJlbCA9IHNldHRpbmdzLnBvcG91dExhYmVsO1xyXG4gICAgICAgIHRoaXMuX21heGltaXNlTGFiZWwgPSBzZXR0aW5ncy5tYXhpbWlzZUxhYmVsO1xyXG4gICAgICAgIHRoaXMuX21pbmltaXNlTGFiZWwgPSBzZXR0aW5ncy5taW5pbWlzZUxhYmVsO1xyXG4gICAgICAgIHRoaXMuX2Nsb3NlTGFiZWwgPSBzZXR0aW5ncy5jbG9zZUxhYmVsO1xyXG4gICAgICAgIHRoaXMuX3RhYkRyb3Bkb3duRW5hYmxlZCA9IHNldHRpbmdzLnRhYkRyb3Bkb3duRW5hYmxlZDtcclxuICAgICAgICB0aGlzLl90YWJEcm9wZG93bkxhYmVsID0gc2V0dGluZ3MudGFiRHJvcGRvd25MYWJlbDtcclxuICAgICAgICB0aGlzLnNldFNpZGUoc2V0dGluZ3Muc2lkZSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWN0aW9uJyk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuSGVhZGVyKTtcclxuICAgICAgICB0aGlzLl9jb250cm9sc0NvbnRhaW5lckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWN0aW9uJyk7XHJcbiAgICAgICAgdGhpcy5fY29udHJvbHNDb250YWluZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Db250cm9scyk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl90YWJzQ29udGFpbmVyLmVsZW1lbnQpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fY29udHJvbHNDb250YWluZXJFbGVtZW50KTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3RhYnNDb250YWluZXIuZHJvcGRvd25FbGVtZW50KTtcclxuXHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2NsaWNrTGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl90b3VjaFN0YXJ0TGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fZG9jdW1lbnRNb3VzZVVwTGlzdGVuZXIgPSAoKSA9PiB0aGlzLl90YWJzQ29udGFpbmVyLmhpZGVBZGRpdGlvbmFsVGFic0Ryb3Bkb3duKClcclxuICAgICAgICBnbG9iYWxUaGlzLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9kb2N1bWVudE1vdXNlVXBMaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG5cclxuICAgICAgICB0aGlzLl90YWJDb250cm9sT2Zmc2V0ID0gdGhpcy5fbGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuc2V0dGluZ3MudGFiQ29udHJvbE9mZnNldDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3RhYkRyb3Bkb3duRW5hYmxlZCkge1xyXG4gICAgICAgICAgICB0aGlzLl90YWJEcm9wZG93bkJ1dHRvbiA9IG5ldyBIZWFkZXJCdXR0b24odGhpcywgdGhpcy5fdGFiRHJvcGRvd25MYWJlbCwgRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5UYWJEcm9wZG93bixcclxuICAgICAgICAgICAgICAgICgpID0+IHRoaXMuX3RhYnNDb250YWluZXIuc2hvd0FkZGl0aW9uYWxUYWJzRHJvcGRvd24oKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcG9wb3V0QnV0dG9uID0gbmV3IEhlYWRlckJ1dHRvbih0aGlzLCB0aGlzLl9wb3BvdXRMYWJlbCwgRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Qb3BvdXQsICgpID0+IHRoaXMuaGFuZGxlQnV0dG9uUG9wb3V0RXZlbnQoKSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIE1heGltaXNlIGNvbnRyb2wgLSBzZXQgdGhlIGNvbXBvbmVudCB0byB0aGUgZnVsbCBzaXplIG9mIHRoZSBsYXlvdXRcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl9tYXhpbWlzZUJ1dHRvbiA9IG5ldyBIZWFkZXJCdXR0b24odGhpcywgdGhpcy5fbWF4aW1pc2VMYWJlbCwgRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5NYXhpbWlzZSxcclxuICAgICAgICAgICAgKGV2KSA9PiB0aGlzLmhhbmRsZUJ1dHRvbk1heGltaXNlVG9nZ2xlRXZlbnQoZXYpXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQ2xvc2UgYnV0dG9uXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fY2xvc2VCdXR0b24gPSBuZXcgSGVhZGVyQnV0dG9uKHRoaXMsIHRoaXMuX2Nsb3NlTGFiZWwsIERvbUNvbnN0YW50cy5DbGFzc05hbWUuQ2xvc2UsICgpID0+IGNsb3NlRXZlbnQoKSk7XHJcblxyXG4gICAgICAgIHRoaXMucHJvY2Vzc1RhYkRyb3Bkb3duQWN0aXZlQ2hhbmdlZCgpO1xyXG5cclxuICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcignc3RhdGVDaGFuZ2VkJywgdGhpcy5fbGF5b3V0U3RhdGVMaXN0ZW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyB0aGUgZW50aXJlIGhlYWRlclxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdkZXN0cm95Jyk7XHJcblxyXG4gICAgICAgIHRoaXMuX3BvcG91dEV2ZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuX21heGltaXNlVG9nZ2xlRXZlbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5fY2xpY2tFdmVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLl90b3VjaFN0YXJ0RXZlbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50UmVtb3ZlRXZlbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50Rm9jdXNFdmVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnREcmFnU3RhcnRFdmVudCA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgdGhpcy5fdGFic0NvbnRhaW5lci5kZXN0cm95KCk7XHJcblxyXG4gICAgICAgIGdsb2JhbFRoaXMuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2RvY3VtZW50TW91c2VVcExpc3RlbmVyKTtcclxuICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignc3RhdGVDaGFuZ2VkJywgdGhpcy5fbGF5b3V0U3RhdGVMaXN0ZW5lcik7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgdGFiIGFuZCBhc3NvY2lhdGVzIGl0IHdpdGggYSBjb250ZW50SXRlbVxyXG4gICAgICogQHBhcmFtIGluZGV4IC0gVGhlIHBvc2l0aW9uIG9mIHRoZSB0YWJcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBjcmVhdGVUYWIoY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3RhYnNDb250YWluZXIuY3JlYXRlVGFiKGNvbXBvbmVudEl0ZW0sIGluZGV4KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbmRzIGEgdGFiIGJhc2VkIG9uIHRoZSBjb250ZW50SXRlbSBpdHMgYXNzb2NpYXRlZCB3aXRoIGFuZCByZW1vdmVzIGl0LlxyXG4gICAgICogQ2Fubm90IHJlbW92ZSB0YWIgaWYgaXQgaGFzIHRoZSBhY3RpdmUgQ29tcG9uZW50SXRlbVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZVRhYihjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdGFic0NvbnRhaW5lci5yZW1vdmVUYWIoY29tcG9uZW50SXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJvY2Vzc0FjdGl2ZUNvbXBvbmVudENoYW5nZWQobmV3QWN0aXZlQ29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3RhYnNDb250YWluZXIucHJvY2Vzc0FjdGl2ZUNvbXBvbmVudENoYW5nZWQobmV3QWN0aXZlQ29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVUYWJTaXplcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHNldFNpZGUodmFsdWU6IFNpZGUpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9zaWRlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5fbGVmdFJpZ2h0U2lkZWQgPSBbU2lkZS5yaWdodCwgU2lkZS5sZWZ0XS5pbmNsdWRlcyh0aGlzLl9zaWRlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGhlYWRlciBidXR0b25zLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdXBkYXRlQnV0dG9ucygpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBhY3RpdmVDb21wb25lbnRJdGVtID0gdGhpcy5fZ2V0QWN0aXZlQ29tcG9uZW50SXRlbUV2ZW50KCk7XHJcbiAgICAgICAgY29uc3QgaXNMYXN0ID0gdGhpcy5fcGFyZW50LmZpbmRBbmNlc3RvcldpdGhTaWJsaW5ncygpID09PSBudWxsO1xyXG4gICAgICAgIGNvbnN0IGlzTWFpbiA9IHRoaXMubGF5b3V0TWFuYWdlci5wYXJlbnQgPT09IG51bGw7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gQ2xvc2UgYnV0dG9uIGlzIG9ubHkgdmlzaWJsZSBpZiBhbGwgaXRlbXMgb2YgdGhlIHN0YWNrIGFyZSBjbG9zYWJsZVxyXG4gICAgICAgIC8vIGFuZCB0aGUgYWN0aXZlIGNvbXBvbmVudCBoYXMgaXRzIGNsb3NlIGJ1dHRvbiBzZXQgdG8gdmlzaWJsZS4gTm90ZSB0aGF0XHJcbiAgICAgICAgLy8gaGlkaW5nIHRoZSBjbG9zZSBidXR0b24gaW4gYSBoZWFkZXIgb2YgYW4gaXRlbSBpcyBub3QgZXF1aXZhbGVudCB0byBtYWtpbmdcclxuICAgICAgICAvLyB0aGF0IGl0ZW0gdW5jbG9zYWJsZS5cclxuICAgICAgICBjb25zdCBhbGxDbG9zYWJsZSA9IHRoaXMudGFicy5ldmVyeSh0YWIgPT4gdGFiLmNvbXBvbmVudEl0ZW0uaXNDbG9zYWJsZSk7XHJcbiAgICAgICAgY29uc3QgY2xvc2UgPSBhY3RpdmVDb21wb25lbnRJdGVtPy5oZWFkZXJDb25maWc/LmNsb3NlICE9PSBmYWxzZTtcclxuICAgICAgICBzZXRFbGVtZW50RGlzcGxheVZpc2liaWxpdHkodGhpcy5fY2xvc2VCdXR0b24uZWxlbWVudCwgYWxsQ2xvc2FibGUgJiYgY2xvc2UpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFBvcG91dCBidXR0b24gaXMgdmlzaWJsZSBpZiB0aGUgYWN0aXZlIGNvbXBvbmVudCBoYXMgaXRzIHBvcG91dCBidXR0b24gZW5hYmxlZC5cclxuICAgICAgICAvLyBBbHNvIHdlIHdhbnQgdG8gcHJldmVudCBwb3BwaW5nIG91dCBpZiB0aGF0IHdvdWxkIGxlYXZlIHVzIHdpdGggYW4gZW1wdHkgbGF5b3V0LlxyXG4gICAgICAgIGxldCBwb3BvdXQgPSBhY3RpdmVDb21wb25lbnRJdGVtPy5oZWFkZXJDb25maWc/LnBvcG91dCAhPT0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuX2xheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLnNldHRpbmdzLnBvcG91dFdob2xlU3RhY2spIHtcclxuICAgICAgICAgICAgcG9wb3V0ICYmPSAoIWlzTGFzdCB8fCBpc01haW4pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHBvcG91dCAmJj0gKCFpc0xhc3QgfHwgdGhpcy50YWJzLmxlbmd0aCA+IDEgfHwgaXNNYWluKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0RWxlbWVudERpc3BsYXlWaXNpYmlsaXR5KHRoaXMuX3BvcG91dEJ1dHRvbi5lbGVtZW50LCBwb3BvdXQpO1xyXG5cclxuICAgICAgICAvLyBNYXhpbWl6ZSBidXR0b24gaXMgdmlzaWJsZSBpZiB0aGUgYWN0aXZlIGNvbXBvbmVudCBoYXMgaXRzIG1heGltaXplIGJ1dHRvbiBlbmFibGVkIG9yIHRoZSBzdGFjayBpcyBhbHJlYWR5IG1heGltaXplZC5cclxuICAgICAgICAvLyBBbHNvIGhpZGUgaXQgaWYgc3RhY2sgaXMgdGhlIGxhc3QgaXRlbSBpbiB0aGUgbGF5b3V0LlxyXG4gICAgICAgIGNvbnN0IG1heGltaXplID0gKGFjdGl2ZUNvbXBvbmVudEl0ZW0/LmhlYWRlckNvbmZpZz8ubWF4aW1pc2UgIT09IGZhbHNlIHx8IHRoaXMuX3BhcmVudC5pc01heGltaXNlZCkgJiYgIWlzTGFzdDtcclxuICAgICAgICBzZXRFbGVtZW50RGlzcGxheVZpc2liaWxpdHkodGhpcy5fbWF4aW1pc2VCdXR0b24uZWxlbWVudCwgbWF4aW1pemUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGFwcGx5Rm9jdXNlZFZhbHVlKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkZvY3VzZWQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShEb21Db25zdGFudHMuQ2xhc3NOYW1lLkZvY3VzZWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcm9jZXNzTWF4aW1pc2VkKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9tYXhpbWlzZUJ1dHRvbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0hQTUFYMTY5OTcnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9tYXhpbWlzZUJ1dHRvbi5lbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCB0aGlzLl9taW5pbWlzZUxhYmVsKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJvY2Vzc01pbmltaXNlZCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fbWF4aW1pc2VCdXR0b24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdIUE1JTjE2OTk3Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fbWF4aW1pc2VCdXR0b24uZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgdGhpcy5fbWF4aW1pc2VMYWJlbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHVzaGVzIHRoZSB0YWJzIHRvIHRoZSB0YWIgZHJvcGRvd24gaWYgdGhlIGF2YWlsYWJsZSBzcGFjZSBpcyBub3Qgc3VmZmljaWVudFxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHVwZGF0ZVRhYlNpemVzKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl90YWJzQ29udGFpbmVyLnRhYkNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBoZWFkZXJIZWlnaHQgPSB0aGlzLl9zaG93ID8gdGhpcy5fbGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuZGltZW5zaW9ucy5oZWFkZXJIZWlnaHQgOiAwO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX2xlZnRSaWdodFNpZGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmhlaWdodCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS53aWR0aCA9IG51bWJlclRvUGl4ZWxzKGhlYWRlckhlaWdodCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLndpZHRoID0gJyc7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmhlaWdodCA9IG51bWJlclRvUGl4ZWxzKGhlYWRlckhlaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGF2YWlsYWJsZVdpZHRoOiBudW1iZXI7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9sZWZ0UmlnaHRTaWRlZCkge1xyXG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSB0aGlzLl9lbGVtZW50Lm9mZnNldEhlaWdodCAtIHRoaXMuX2NvbnRyb2xzQ29udGFpbmVyRWxlbWVudC5vZmZzZXRIZWlnaHQgLSB0aGlzLl90YWJDb250cm9sT2Zmc2V0O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSB0aGlzLl9lbGVtZW50Lm9mZnNldFdpZHRoIC0gdGhpcy5fY29udHJvbHNDb250YWluZXJFbGVtZW50Lm9mZnNldFdpZHRoIC0gdGhpcy5fdGFiQ29udHJvbE9mZnNldDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fdGFic0NvbnRhaW5lci51cGRhdGVUYWJTaXplcyhhdmFpbGFibGVXaWR0aCwgdGhpcy5fZ2V0QWN0aXZlQ29tcG9uZW50SXRlbUV2ZW50KCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZVRhYkluaXRpYXRlZENvbXBvbmVudFJlbW92ZUV2ZW50KGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICBpZiAodGhpcy5fY29tcG9uZW50UmVtb3ZlRXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdISFRDRTIyMjk0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50UmVtb3ZlRXZlbnQoY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlVGFiSW5pdGlhdGVkQ29tcG9uZW50Rm9jdXNFdmVudChjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudEZvY3VzRXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdISFRBRTIyMjk0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50Rm9jdXNFdmVudChjb21wb25lbnRJdGVtKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVUYWJJbml0aWF0ZWREcmFnU3RhcnRFdmVudCh4OiBudW1iZXIsIHk6IG51bWJlciwgZHJhZ0xpc3RlbmVyOiBEcmFnTGlzdGVuZXIsIGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICBpZiAodGhpcy5fY29tcG9uZW50RHJhZ1N0YXJ0RXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdISFREU0UyMjI5NCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudERyYWdTdGFydEV2ZW50KHgsIHksIGRyYWdMaXN0ZW5lciwgY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcHJvY2Vzc1RhYkRyb3Bkb3duQWN0aXZlQ2hhbmdlZCgpIHtcclxuICAgICAgICBpZiAodGhpcy5fdGFiRHJvcGRvd25CdXR0b24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBzZXRFbGVtZW50RGlzcGxheVZpc2liaWxpdHkodGhpcy5fdGFiRHJvcGRvd25CdXR0b24uZWxlbWVudCwgdGhpcy5fdGFic0NvbnRhaW5lci5kcm9wZG93bkFjdGl2ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlQnV0dG9uUG9wb3V0RXZlbnQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2xheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLnNldHRpbmdzLnBvcG91dFdob2xlU3RhY2spIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3BvcG91dEV2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0hIQlBPRTE3ODM0Jyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9wb3BvdXRFdmVudCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgYWN0aXZlQ29tcG9uZW50SXRlbSA9IHRoaXMuX2dldEFjdGl2ZUNvbXBvbmVudEl0ZW1FdmVudCgpO1xyXG4gICAgICAgICAgICBpZiAoYWN0aXZlQ29tcG9uZW50SXRlbSkge1xyXG4gICAgICAgICAgICAgICAgYWN0aXZlQ29tcG9uZW50SXRlbS5wb3BvdXQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBlbHNlOiBpZiB0aGUgc3RhY2sgaXMgZW1wdHkgdGhlcmUgd29uJ3QgYmUgYW4gYWN0aXZlIGl0ZW0gKGFuZCBub3RoaW5nIHRvIHBvcG91dClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVCdXR0b25NYXhpbWlzZVRvZ2dsZUV2ZW50KGV2OiBFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9tYXhpbWlzZVRvZ2dsZUV2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignSEhCTVRFMTY4MzQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9tYXhpbWlzZVRvZ2dsZUV2ZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW52b2tlZCB3aGVuIHRoZSBoZWFkZXIncyBiYWNrZ3JvdW5kIGlzIGNsaWNrZWQgKG5vdCBpdCdzIHRhYnMgb3IgY29udHJvbHMpXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBvbkNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNsaWNrKGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnZva2VkIHdoZW4gdGhlIGhlYWRlcidzIGJhY2tncm91bmQgaXMgdG91Y2hlZCAobm90IGl0J3MgdGFicyBvciBjb250cm9scylcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uVG91Y2hTdGFydChldmVudDogVG91Y2hFdmVudCkge1xyXG4gICAgICAgIGlmIChldmVudC50YXJnZXQgPT09IHRoaXMuX2VsZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5ub3RpZnlUb3VjaFN0YXJ0KGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBvbkxheW91dENoYW5nZWQoKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVCdXR0b25zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBub3RpZnlDbGljayhldjogTW91c2VFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9jbGlja0V2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignSE5IQzQ2ODM0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY2xpY2tFdmVudChldik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgbm90aWZ5VG91Y2hTdGFydChldjogVG91Y2hFdmVudCkge1xyXG4gICAgICAgIGlmICh0aGlzLl90b3VjaFN0YXJ0RXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdITkhUUzQ2ODM0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fdG91Y2hTdGFydEV2ZW50KGV2KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgSGVhZGVyIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIEdldEFjdGl2ZUNvbXBvbmVudEl0ZW1FdmVudCA9ICh0aGlzOiB2b2lkKSA9PiBDb21wb25lbnRJdGVtIHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgQ2xvc2VFdmVudCA9ICh0aGlzOiB2b2lkKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgUG9wb3V0RXZlbnQgPSAodGhpczogdm9pZCkgPT4gdm9pZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIE1heGltaXNlVG9nZ2xlRXZlbnQgPSAodGhpczogdm9pZCkgPT4gdm9pZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCB0eXBlIENsaWNrRXZlbnQgPSAodGhpczogdm9pZCwgZXY6IE1vdXNlRXZlbnQpID0+IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBUb3VjaFN0YXJ0RXZlbnQgPSAodGhpczogdm9pZCwgZXY6IFRvdWNoRXZlbnQpID0+IHZvaWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBDb21wb25lbnRSZW1vdmVFdmVudCA9ICh0aGlzOiB2b2lkLCBjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgQ29tcG9uZW50Rm9jdXNFdmVudCA9ICh0aGlzOiB2b2lkLCBjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgQ29tcG9uZW50RHJhZ1N0YXJ0RXZlbnQgPSAodGhpczogdm9pZCwgeDogbnVtYmVyLCB5OiBudW1iZXIsIGRyYWdMaXN0ZW5lcjogRHJhZ0xpc3RlbmVyLCBjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgU3RhdGVDaGFuZ2VkRXZlbnQgPSAodGhpczogdm9pZCkgPT4gdm9pZDtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzIHtcclxuICAgICAgICBzaG93OiBib29sZWFuO1xyXG4gICAgICAgIHNpZGU6IFNpZGU7XHJcbiAgICAgICAgcG9wb3V0RW5hYmxlZDogYm9vbGVhbjtcclxuICAgICAgICBwb3BvdXRMYWJlbDogc3RyaW5nO1xyXG4gICAgICAgIG1heGltaXNlRW5hYmxlZDogYm9vbGVhbjtcclxuICAgICAgICBtYXhpbWlzZUxhYmVsOiBzdHJpbmc7XHJcbiAgICAgICAgbWluaW1pc2VFbmFibGVkOiBib29sZWFuO1xyXG4gICAgICAgIG1pbmltaXNlTGFiZWw6IHN0cmluZztcclxuICAgICAgICBjbG9zZUVuYWJsZWQ6IGJvb2xlYW47XHJcbiAgICAgICAgY2xvc2VMYWJlbDogc3RyaW5nO1xyXG4gICAgICAgIHRhYkRyb3Bkb3duRW5hYmxlZDogYm9vbGVhbjtcclxuICAgICAgICB0YWJEcm9wZG93bkxhYmVsOiBzdHJpbmc7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgRG9tQ29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbHMvZG9tLWNvbnN0YW50cyc7XHJcbmltcG9ydCB7IERyYWdMaXN0ZW5lciB9IGZyb20gJy4uL3V0aWxzL2RyYWctbGlzdGVuZXInO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi91dGlscy9ldmVudC1lbWl0dGVyJztcclxuaW1wb3J0IHsgbnVtYmVyVG9QaXhlbHMgfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBjbGFzcyBTcGxpdHRlciB7XHJcbiAgICBwcml2YXRlIF9ncmFiU2l6ZTtcclxuICAgIHByaXZhdGUgX2RyYWdMaXN0ZW5lcjogRHJhZ0xpc3RlbmVyO1xyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnQ6IEhUTUxEaXZFbGVtZW50O1xyXG5cclxuICAgIGdldCBlbGVtZW50KCk6IEhUTUxEaXZFbGVtZW50IHsgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7IH1cclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9pc1ZlcnRpY2FsOiBib29sZWFuLCBwcml2YXRlIF9zaXplOiBudW1iZXIsIGdyYWJTaXplOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9ncmFiU2l6ZSA9IGdyYWJTaXplIDwgdGhpcy5fc2l6ZSA/IHRoaXMuX3NpemUgOiBncmFiU2l6ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLlNwbGl0dGVyKTtcclxuICAgICAgICBjb25zdCBkcmFnSGFuZGxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIGRyYWdIYW5kbGVFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5EcmFnSGFuZGxlKTtcclxuXHJcbiAgICAgICAgY29uc3QgaGFuZGxlRXhjZXNzU2l6ZSA9IHRoaXMuX2dyYWJTaXplIC0gdGhpcy5fc2l6ZTtcclxuICAgICAgICBjb25zdCBoYW5kbGVFeGNlc3NQb3MgPSBoYW5kbGVFeGNlc3NTaXplIC8gMjtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2lzVmVydGljYWwpIHtcclxuICAgICAgICAgICAgZHJhZ0hhbmRsZUVsZW1lbnQuc3R5bGUudG9wID0gbnVtYmVyVG9QaXhlbHMoLWhhbmRsZUV4Y2Vzc1Bvcyk7XHJcbiAgICAgICAgICAgIGRyYWdIYW5kbGVFbGVtZW50LnN0eWxlLmhlaWdodCA9IG51bWJlclRvUGl4ZWxzKHRoaXMuX3NpemUgKyBoYW5kbGVFeGNlc3NTaXplKTtcclxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuVmVydGljYWwpO1xyXG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmhlaWdodCA9IG51bWJlclRvUGl4ZWxzKHRoaXMuX3NpemUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRyYWdIYW5kbGVFbGVtZW50LnN0eWxlLmxlZnQgPSBudW1iZXJUb1BpeGVscygtaGFuZGxlRXhjZXNzUG9zKTtcclxuICAgICAgICAgICAgZHJhZ0hhbmRsZUVsZW1lbnQuc3R5bGUud2lkdGggPSBudW1iZXJUb1BpeGVscyh0aGlzLl9zaXplICsgaGFuZGxlRXhjZXNzU2l6ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkhvcml6b250YWwpO1xyXG4gICAgICAgICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLndpZHRoID0gbnVtYmVyVG9QaXhlbHModGhpcy5fc2l6ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKGRyYWdIYW5kbGVFbGVtZW50KTtcclxuXHJcbiAgICAgICAgdGhpcy5fZHJhZ0xpc3RlbmVyID0gbmV3IERyYWdMaXN0ZW5lcih0aGlzLl9lbGVtZW50LCBbZHJhZ0hhbmRsZUVsZW1lbnRdKTtcclxuICAgIH1cclxuXHJcbiAgICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb248SyBleHRlbmRzIGtleW9mIEV2ZW50RW1pdHRlci5FdmVudFBhcmFtc01hcD4oZXZlbnROYW1lOiBLLCBjYWxsYmFjazogRXZlbnRFbWl0dGVyLkNhbGxiYWNrPEs+KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZHJhZ0xpc3RlbmVyLm9uPEs+KGV2ZW50TmFtZSwgY2FsbGJhY2spO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuLi9pdGVtcy9jb21wb25lbnQtaXRlbSc7XHJcbmltcG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuLi9sYXlvdXQtbWFuYWdlcic7XHJcbmltcG9ydCB7IERvbUNvbnN0YW50cyB9IGZyb20gJy4uL3V0aWxzL2RvbS1jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBEcmFnTGlzdGVuZXIgfSBmcm9tICcuLi91dGlscy9kcmFnLWxpc3RlbmVyJztcclxuXHJcbi8qKlxyXG4gKiBSZXByZXNlbnRzIGFuIGluZGl2aWR1YWwgdGFiIHdpdGhpbiBhIFN0YWNrJ3MgaGVhZGVyXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBjbGFzcyBUYWIge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZWxlbWVudDogSFRNTERpdkVsZW1lbnQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90aXRsZUVsZW1lbnQ6IEhUTUxTcGFuRWxlbWVudDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Nsb3NlRWxlbWVudDogSFRNTERpdkVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfZHJhZ0xpc3RlbmVyOiBEcmFnTGlzdGVuZXIgfCB1bmRlZmluZWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9pc0FjdGl2ZSA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RhYkNsaWNrTGlzdGVuZXIgPSAoZXY6IE1vdXNlRXZlbnQpID0+IHRoaXMub25UYWJDbGlja0Rvd24oZXYpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFiVG91Y2hTdGFydExpc3RlbmVyID0gKGV2OiBUb3VjaEV2ZW50KSA9PiB0aGlzLm9uVGFiVG91Y2hTdGFydChldik7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jbG9zZUNsaWNrTGlzdGVuZXIgPSAoKSA9PiB0aGlzLm9uQ2xvc2VDbGljaygpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2xvc2VUb3VjaFN0YXJ0TGlzdGVuZXIgPSAoKSA9PiB0aGlzLm9uQ2xvc2VUb3VjaFN0YXJ0KCk7XHJcbiAgICAvLyAvKiogQGludGVybmFsICovXHJcbiAgICAvLyBwcml2YXRlIHJlYWRvbmx5IF9jbG9zZU1vdXNlRG93bkxpc3RlbmVyID0gKCkgPT4gdGhpcy5vbkNsb3NlTW91c2Vkb3duKCk7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kcmFnU3RhcnRMaXN0ZW5lciA9ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gdGhpcy5vbkRyYWdTdGFydCh4LCB5KTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRlbnRJdGVtRGVzdHJveUxpc3RlbmVyID0gKCkgPT4gdGhpcy5vbkNvbnRlbnRJdGVtRGVzdHJveSgpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdGFiVGl0bGVDaGFuZ2VkTGlzdGVuZXIgPSAodGl0bGU6IHN0cmluZykgPT4gdGhpcy5zZXRUaXRsZSh0aXRsZSlcclxuXHJcbiAgICBnZXQgaXNBY3RpdmUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9pc0FjdGl2ZTsgfVxyXG4gICAgLy8gZ2V0IGhlYWRlcigpOiBIZWFkZXIgeyByZXR1cm4gdGhpcy5faGVhZGVyOyB9XHJcbiAgICBnZXQgY29tcG9uZW50SXRlbSgpOiBDb21wb25lbnRJdGVtIHsgcmV0dXJuIHRoaXMuX2NvbXBvbmVudEl0ZW07IH1cclxuICAgIC8qKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChUYWI6Y2xhc3MpLmNvbXBvbmVudEl0ZW19ICovXHJcbiAgICBnZXQgY29udGVudEl0ZW0oKTogQ29tcG9uZW50SXRlbSB7IHJldHVybiB0aGlzLl9jb21wb25lbnRJdGVtOyB9XHJcbiAgICBnZXQgZWxlbWVudCgpOiBIVE1MRWxlbWVudCB7IHJldHVybiB0aGlzLl9lbGVtZW50OyB9XHJcbiAgICBnZXQgdGl0bGVFbGVtZW50KCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX3RpdGxlRWxlbWVudDsgfVxyXG4gICAgZ2V0IGNsb3NlRWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9jbG9zZUVsZW1lbnQ7IH1cclxuICAgIGdldCByZW9yZGVyRW5hYmxlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2RyYWdMaXN0ZW5lciAhPT0gdW5kZWZpbmVkOyB9XHJcbiAgICBzZXQgcmVvcmRlckVuYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAodmFsdWUgIT09IHRoaXMucmVvcmRlckVuYWJsZWQpIHtcclxuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZVJlb3JkZXIoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZVJlb3JkZXIoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfbGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlcixcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfY2xvc2VFdmVudDogVGFiLkNsb3NlRXZlbnQgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX2ZvY3VzRXZlbnQ6IFRhYi5Gb2N1c0V2ZW50IHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICBwcml2YXRlIF9kcmFnU3RhcnRFdmVudDogVGFiLkRyYWdTdGFydEV2ZW50IHwgdW5kZWZpbmVkXHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuVGFiKTtcclxuICAgICAgICB0aGlzLl90aXRsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7IFxyXG4gICAgICAgIHRoaXMuX3RpdGxlRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuVGl0bGUpO1xyXG4gICAgICAgIHRoaXMuX2Nsb3NlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBcclxuICAgICAgICB0aGlzLl9jbG9zZUVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkNsb3NlVGFiKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3RpdGxlRWxlbWVudCk7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9jbG9zZUVsZW1lbnQpO1xyXG5cclxuICAgICAgICBpZiAoX2NvbXBvbmVudEl0ZW0uaXNDbG9zYWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9jbG9zZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICcnO1xyXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkNsb3NhYmxlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9jbG9zZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0VGl0bGUoX2NvbXBvbmVudEl0ZW0udGl0bGUpO1xyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudEl0ZW0ub24oJ3RpdGxlQ2hhbmdlZCcsIHRoaXMuX3RhYlRpdGxlQ2hhbmdlZExpc3RlbmVyKTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVvcmRlckVuYWJsZWQgPSBfY29tcG9uZW50SXRlbS5yZW9yZGVyRW5hYmxlZCA/PyB0aGlzLl9sYXlvdXRNYW5hZ2VyLmxheW91dENvbmZpZy5zZXR0aW5ncy5yZW9yZGVyRW5hYmxlZDtcclxuXHJcbiAgICAgICAgaWYgKHJlb3JkZXJFbmFibGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlUmVvcmRlcigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX3RhYkNsaWNrTGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl90YWJUb3VjaFN0YXJ0TGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBvbmVudEl0ZW0uaXNDbG9zYWJsZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9jbG9zZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9jbG9zZUNsaWNrTGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgdGhpcy5fY2xvc2VFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl9jbG9zZVRvdWNoU3RhcnRMaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAvLyB0aGlzLl9jbG9zZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fY2xvc2VNb3VzZURvd25MaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlRWxlbWVudC5yZW1vdmUoKTtcclxuICAgICAgICAgICAgdGhpcy5fY2xvc2VFbGVtZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5zZXRUYWIodGhpcyk7XHJcbiAgICAgICAgdGhpcy5fbGF5b3V0TWFuYWdlci5lbWl0KCd0YWJDcmVhdGVkJywgdGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB0YWIncyB0aXRsZSB0byB0aGUgcHJvdmlkZWQgc3RyaW5nIGFuZCBzZXRzXHJcbiAgICAgKiBpdHMgdGl0bGUgYXR0cmlidXRlIHRvIGEgcHVyZSB0ZXh0IHJlcHJlc2VudGF0aW9uICh3aXRob3V0XHJcbiAgICAgKiBodG1sIHRhZ3MpIG9mIHRoZSBzYW1lIHN0cmluZy5cclxuICAgICAqL1xyXG4gICAgc2V0VGl0bGUodGl0bGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3RpdGxlRWxlbWVudC5pbm5lclRleHQgPSB0aXRsZTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LnRpdGxlID0gdGl0bGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoaXMgdGFiJ3MgYWN0aXZlIHN0YXRlLiBUbyBwcm9ncmFtbWF0aWNhbGx5XHJcbiAgICAgKiBzd2l0Y2ggdGFicywgdXNlIFN0YWNrLnNldEFjdGl2ZUNvbXBvbmVudEl0ZW0oIGl0ZW0gKSBpbnN0ZWFkLlxyXG4gICAgICovXHJcbiAgICBzZXRBY3RpdmUoaXNBY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBpZiAoaXNBY3RpdmUgPT09IHRoaXMuX2lzQWN0aXZlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5faXNBY3RpdmUgPSBpc0FjdGl2ZTtcclxuXHJcbiAgICAgICAgaWYgKGlzQWN0aXZlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkFjdGl2ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKERvbUNvbnN0YW50cy5DbGFzc05hbWUuQWN0aXZlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyB0aGUgdGFiXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9jbG9zZUV2ZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuX2ZvY3VzRXZlbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5fZHJhZ1N0YXJ0RXZlbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX3RhYkNsaWNrTGlzdGVuZXIpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX3RhYlRvdWNoU3RhcnRMaXN0ZW5lcik7XHJcbiAgICAgICAgdGhpcy5fY2xvc2VFbGVtZW50Py5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2Nsb3NlQ2xpY2tMaXN0ZW5lcik7XHJcbiAgICAgICAgdGhpcy5fY2xvc2VFbGVtZW50Py5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5fY2xvc2VUb3VjaFN0YXJ0TGlzdGVuZXIpO1xyXG4gICAgICAgIC8vIHRoaXMuX2Nsb3NlRWxlbWVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fY2xvc2VNb3VzZURvd25MaXN0ZW5lcik7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5vZmYoJ3RpdGxlQ2hhbmdlZCcsIHRoaXMuX3RhYlRpdGxlQ2hhbmdlZExpc3RlbmVyKTtcclxuICAgICAgICBpZiAodGhpcy5yZW9yZGVyRW5hYmxlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVSZW9yZGVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc2V0Qmx1cnJlZCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Gb2N1c2VkKTtcclxuICAgICAgICB0aGlzLl90aXRsZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShEb21Db25zdGFudHMuQ2xhc3NOYW1lLkZvY3VzZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHNldEZvY3VzZWQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuRm9jdXNlZCk7XHJcbiAgICAgICAgdGhpcy5fdGl0bGVFbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Gb2N1c2VkKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxiYWNrIGZvciB0aGUgRHJhZ0xpc3RlbmVyXHJcbiAgICAgKiBAcGFyYW0geCAtIFRoZSB0YWJzIGFic29sdXRlIHggcG9zaXRpb25cclxuICAgICAqIEBwYXJhbSB5IC0gVGhlIHRhYnMgYWJzb2x1dGUgeSBwb3NpdGlvblxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25EcmFnU3RhcnQoeDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fZHJhZ0xpc3RlbmVyID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignVE9EU0RMVTEwMDkzJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2RyYWdTdGFydEV2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ1RPRFMyMzMwOScpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZHJhZ1N0YXJ0RXZlbnQoeCwgeSwgdGhpcy5fZHJhZ0xpc3RlbmVyLCB0aGlzLmNvbXBvbmVudEl0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIG9uQ29udGVudEl0ZW1EZXN0cm95KCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9kcmFnTGlzdGVuZXIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGJhY2sgd2hlbiB0aGUgdGFiIGlzIGNsaWNrZWRcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uVGFiQ2xpY2tEb3duKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xyXG4gICAgICAgIGlmICh0YXJnZXQgPT09IHRoaXMuX2VsZW1lbnQgfHwgdGFyZ2V0ID09PSB0aGlzLl90aXRsZUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgLy8gbGVmdCBtb3VzZSBidXR0b25cclxuICAgICAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUZvY3VzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gbWlkZGxlIG1vdXNlIGJ1dHRvblxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gMSAmJiB0aGlzLl9jb21wb25lbnRJdGVtLmlzQ2xvc2FibGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDbG9zZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgb25UYWJUb3VjaFN0YXJ0KGV2ZW50OiBUb3VjaEV2ZW50KSB7XHJcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLm5vdGlmeUZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGJhY2sgd2hlbiB0aGUgdGFiJ3MgY2xvc2UgYnV0dG9uIGlzIGNsaWNrZWRcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uQ2xvc2VDbGljaygpIHtcclxuICAgICAgICB0aGlzLm5vdGlmeUNsb3NlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBvbkNsb3NlVG91Y2hTdGFydCgpIHtcclxuICAgICAgICB0aGlzLm5vdGlmeUNsb3NlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayB0byBjYXB0dXJlIHRhYiBjbG9zZSBidXR0b24gbW91c2Vkb3duXHJcbiAgICAgKiB0byBwcmV2ZW50IHRhYiBmcm9tIGFjdGl2YXRpbmcuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgLy8gcHJpdmF0ZSBvbkNsb3NlTW91c2Vkb3duKCk6IHZvaWQge1xyXG4gICAgLy8gICAgIC8vIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgbm90aWZ5Q2xvc2UoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2Nsb3NlRXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdUTkMxNTAwNycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlRXZlbnQodGhpcy5fY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgbm90aWZ5Rm9jdXMoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2ZvY3VzRXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdUTkExNTAwNycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZvY3VzRXZlbnQodGhpcy5fY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgZW5hYmxlUmVvcmRlcigpIHtcclxuICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIgPSBuZXcgRHJhZ0xpc3RlbmVyKHRoaXMuX2VsZW1lbnQsIFt0aGlzLl90aXRsZUVsZW1lbnRdKTtcclxuICAgICAgICB0aGlzLl9kcmFnTGlzdGVuZXIub24oJ2RyYWdTdGFydCcsIHRoaXMuX2RyYWdTdGFydExpc3RlbmVyKTtcclxuICAgICAgICB0aGlzLl9jb21wb25lbnRJdGVtLm9uKCdkZXN0cm95JywgdGhpcy5fY29udGVudEl0ZW1EZXN0cm95TGlzdGVuZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgZGlzYWJsZVJlb3JkZXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RyYWdMaXN0ZW5lciA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ1REUjg3NzQ1Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50SXRlbS5vZmYoJ2Rlc3Ryb3knLCB0aGlzLl9jb250ZW50SXRlbURlc3Ryb3lMaXN0ZW5lcik7XHJcbiAgICAgICAgICAgIHRoaXMuX2RyYWdMaXN0ZW5lci5vZmYoJ2RyYWdTdGFydCcsIHRoaXMuX2RyYWdTdGFydExpc3RlbmVyKTtcclxuICAgICAgICAgICAgdGhpcy5fZHJhZ0xpc3RlbmVyID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBUYWIge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgQ2xvc2VFdmVudCA9IChjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgRm9jdXNFdmVudCA9IChjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgRHJhZ1N0YXJ0RXZlbnQgPSAoeDogbnVtYmVyLCB5OiBudW1iZXIsIGRyYWdMaXN0ZW5lcjogRHJhZ0xpc3RlbmVyLCBjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG59XHJcbiIsImltcG9ydCB7IEFzc2VydEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgQ29tcG9uZW50SXRlbSB9IGZyb20gJy4uL2l0ZW1zL2NvbXBvbmVudC1pdGVtJztcclxuaW1wb3J0IHsgTGF5b3V0TWFuYWdlciB9IGZyb20gJy4uL2xheW91dC1tYW5hZ2VyJztcclxuaW1wb3J0IHsgRG9tQ29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbHMvZG9tLWNvbnN0YW50cyc7XHJcbmltcG9ydCB7IERyYWdMaXN0ZW5lciB9IGZyb20gJy4uL3V0aWxzL2RyYWctbGlzdGVuZXInO1xyXG5pbXBvcnQgeyBudW1iZXJUb1BpeGVscywgcGl4ZWxzVG9OdW1iZXIgfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcbmltcG9ydCB7IFRhYiB9IGZyb20gJy4vdGFiJztcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGNsYXNzIFRhYnNDb250YWluZXIge1xyXG4gICAgLy8gVGhlcmUgaXMgb25lIHRhYiBwZXIgQ29tcG9uZW50SXRlbSBpbiBzdGFjay4gIEhvd2V2ZXIgdGhleSBtYXkgbm90IGJlIG9yZGVyZWQgdGhlIHNhbWVcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RhYnM6IFRhYltdID0gW107XHJcblxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZHJvcGRvd25FbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG4gICAgcHJpdmF0ZSBfbGFzdFZpc2libGVUYWJJbmRleCA9IC0xO1xyXG4gICAgcHJpdmF0ZSBfZHJvcGRvd25BY3RpdmUgPSBmYWxzZTtcclxuXHJcbiAgICBnZXQgdGFicygpOiBUYWJbXSB7IHJldHVybiB0aGlzLl90YWJzOyB9XHJcbiAgICBnZXQgdGFiQ291bnQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3RhYnMubGVuZ3RoOyB9XHJcbiAgICBnZXQgbGFzdFZpc2libGVUYWJJbmRleCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fbGFzdFZpc2libGVUYWJJbmRleDsgfVxyXG5cclxuICAgIGdldCBlbGVtZW50KCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7IH1cclxuICAgIGdldCBkcm9wZG93bkVsZW1lbnQoKTogSFRNTEVsZW1lbnQgeyByZXR1cm4gdGhpcy5fZHJvcGRvd25FbGVtZW50OyB9XHJcbiAgICBnZXQgZHJvcGRvd25BY3RpdmUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9kcm9wZG93bkFjdGl2ZTsgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2xheW91dE1hbmFnZXI6IExheW91dE1hbmFnZXIsXHJcbiAgICAgICAgcHJpdmF0ZSBfY29tcG9uZW50UmVtb3ZlRXZlbnQ6IFRhYnNDb250YWluZXIuQ29tcG9uZW50SXRlbVJlbW92ZUV2ZW50LFxyXG4gICAgICAgIHByaXZhdGUgX2NvbXBvbmVudEZvY3VzRXZlbnQ6IFRhYnNDb250YWluZXIuQ29tcG9uZW50SXRlbUZvY3VzRXZlbnQsXHJcbiAgICAgICAgcHJpdmF0ZSBfY29tcG9uZW50RHJhZ1N0YXJ0RXZlbnQ6IFRhYnNDb250YWluZXIuQ29tcG9uZW50SXRlbURyYWdTdGFydEV2ZW50LFxyXG4gICAgICAgIHByaXZhdGUgX2Ryb3Bkb3duQWN0aXZlQ2hhbmdlZEV2ZW50OiBUYWJzQ29udGFpbmVyLkRyb3Bkb3duQWN0aXZlQ2hhbmdlZEV2ZW50LFxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlY3Rpb24nKTtcclxuICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5UYWJzKTtcclxuXHJcbiAgICAgICAgdGhpcy5fZHJvcGRvd25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2VjdGlvbicpO1xyXG4gICAgICAgIHRoaXMuX2Ryb3Bkb3duRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuVGFiRHJvcGRvd25MaXN0KTtcclxuICAgICAgICB0aGlzLl9kcm9wZG93bkVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgIH1cclxuXHJcbiAgICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fdGFicy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLl90YWJzW2ldLmRlc3Ryb3koKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHRhYiBhbmQgYXNzb2NpYXRlcyBpdCB3aXRoIGEgY29udGVudEl0ZW1cclxuICAgICAqIEBwYXJhbSBpbmRleCAtIFRoZSBwb3NpdGlvbiBvZiB0aGUgdGFiXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZVRhYihjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgLy9JZiB0aGVyZSdzIGFscmVhZHkgYSB0YWIgcmVsYXRpbmcgdG8gdGhlXHJcbiAgICAgICAgLy9jb250ZW50IGl0ZW0sIGRvbid0IGRvIGFueXRoaW5nXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl90YWJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl90YWJzW2ldLmNvbXBvbmVudEl0ZW0gPT09IGNvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdGFiID0gbmV3IFRhYih0aGlzLl9sYXlvdXRNYW5hZ2VyLFxyXG4gICAgICAgICAgICBjb21wb25lbnRJdGVtLFxyXG4gICAgICAgICAgICAoaXRlbSkgPT4gdGhpcy5oYW5kbGVUYWJDbG9zZUV2ZW50KGl0ZW0pLFxyXG4gICAgICAgICAgICAoaXRlbSkgPT4gdGhpcy5oYW5kbGVUYWJGb2N1c0V2ZW50KGl0ZW0pLFxyXG4gICAgICAgICAgICAoeCwgeSwgZHJhZ0xpc3RlbmVyLCBpdGVtKSA9PiB0aGlzLmhhbmRsZVRhYkRyYWdTdGFydEV2ZW50KHgsIHksIGRyYWdMaXN0ZW5lciwgaXRlbSkpO1xyXG5cclxuICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpbmRleCA9IHRoaXMuX3RhYnMubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fdGFicy5zcGxpY2UoaW5kZXgsIDAsIHRhYik7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCA8IHRoaXMuX2VsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5pbnNlcnRCZWZvcmUodGFiLmVsZW1lbnQsIHRoaXMuX2VsZW1lbnQuY2hpbGROb2Rlc1tpbmRleF0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodGFiLmVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVUYWIoY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSk6IHZvaWQge1xyXG4gICAgICAgIC8vIGNvbXBvbmVudEl0ZW0gY2Fubm90IGJlIEFjdGl2ZUNvbXBvbmVudEl0ZW1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3RhYnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3RhYnNbaV0uY29tcG9uZW50SXRlbSA9PT0gY29tcG9uZW50SXRlbSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFiID0gdGhpcy5fdGFic1tpXTtcclxuICAgICAgICAgICAgICAgIHRhYi5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl90YWJzLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb250ZW50SXRlbSBpcyBub3QgY29udHJvbGxlZCBieSB0aGlzIGhlYWRlcicpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb2Nlc3NBY3RpdmVDb21wb25lbnRDaGFuZ2VkKG5ld0FjdGl2ZUNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pOiB2b2lkIHtcclxuICAgICAgICBsZXQgYWN0aXZlSW5kZXggPSAtMTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX3RhYnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaXNBY3RpdmUgPSB0aGlzLl90YWJzW2ldLmNvbXBvbmVudEl0ZW0gPT09IG5ld0FjdGl2ZUNvbXBvbmVudEl0ZW07XHJcbiAgICAgICAgICAgIHRoaXMuX3RhYnNbaV0uc2V0QWN0aXZlKGlzQWN0aXZlKTtcclxuICAgICAgICAgICAgaWYgKGlzQWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICBhY3RpdmVJbmRleCA9IGk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChhY3RpdmVJbmRleCA8IDApIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdIU0FDSTU2NjMyJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2xheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLnNldHRpbmdzLnJlb3JkZXJPblRhYk1lbnVDbGljaykge1xyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBJZiB0aGUgdGFiIHNlbGVjdGVkIHdhcyBpbiB0aGUgZHJvcGRvd24sIG1vdmUgZXZlcnl0aGluZyBkb3duIG9uZSB0byBtYWtlIHdheSBmb3IgdGhpcyBvbmUgdG8gYmUgdGhlIGZpcnN0LlxyXG4gICAgICAgICAgICAgICAgICogVGhpcyB3aWxsIG1ha2Ugc3VyZSB0aGUgbW9zdCB1c2VkIHRhYnMgc3RheSB2aXNpYmxlLlxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbGFzdFZpc2libGVUYWJJbmRleCAhPT0gLTEgJiYgYWN0aXZlSW5kZXggPiB0aGlzLl9sYXN0VmlzaWJsZVRhYkluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlVGFiID0gdGhpcy5fdGFic1thY3RpdmVJbmRleF07XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IGFjdGl2ZUluZGV4OyBqID4gMDsgai0tKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RhYnNbal0gPSB0aGlzLl90YWJzW2ogLSAxXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFic1swXSA9IGFjdGl2ZVRhYjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlVGFiU2l6ZXMgd2lsbCBhbHdheXMgYmUgY2FsbGVkIGFmdGVyIHRoaXMgYW5kIGl0IHdpbGwgcmVwb3NpdGlvbiB0YWIgZWxlbWVudHNcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFB1c2hlcyB0aGUgdGFicyB0byB0aGUgdGFiIGRyb3Bkb3duIGlmIHRoZSBhdmFpbGFibGUgc3BhY2UgaXMgbm90IHN1ZmZpY2llbnRcclxuICAgICAqL1xyXG4gICAgdXBkYXRlVGFiU2l6ZXMoYXZhaWxhYmxlV2lkdGg6IG51bWJlciwgYWN0aXZlQ29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSB8IHVuZGVmaW5lZCk6IHZvaWQge1xyXG4gICAgICAgIGxldCBkcm9wRG93bkFjdGl2ZSA9IGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0aGlzLnRyeVVwZGF0ZVRhYlNpemVzKGRyb3BEb3duQWN0aXZlLCBhdmFpbGFibGVXaWR0aCwgYWN0aXZlQ29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgaWYgKCFzdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIGRyb3BEb3duQWN0aXZlID0gdHJ1ZTtcclxuICAgICAgICAgICAgLy8gdGhpcyB3aWxsIGFsd2F5cyBzdWNjZWVkXHJcbiAgICAgICAgICAgIHRoaXMudHJ5VXBkYXRlVGFiU2l6ZXMoZHJvcERvd25BY3RpdmUsIGF2YWlsYWJsZVdpZHRoLCBhY3RpdmVDb21wb25lbnRJdGVtKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5tYXhXaWR0aCA9IG51bWJlclRvUGl4ZWxzKE1hdGgubWF4KDAsIGF2YWlsYWJsZVdpZHRoKSk7XHJcblxyXG4gICAgICAgIGlmIChkcm9wRG93bkFjdGl2ZSAhPT0gdGhpcy5fZHJvcGRvd25BY3RpdmUpIHtcclxuICAgICAgICAgICAgdGhpcy5fZHJvcGRvd25BY3RpdmUgPSBkcm9wRG93bkFjdGl2ZTtcclxuICAgICAgICAgICAgdGhpcy5fZHJvcGRvd25BY3RpdmVDaGFuZ2VkRXZlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5VXBkYXRlVGFiU2l6ZXMoZHJvcGRvd25BY3RpdmU6IGJvb2xlYW4sIGF2YWlsYWJsZVdpZHRoOiBudW1iZXIsIGFjdGl2ZUNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAodGhpcy5fdGFicy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGlmIChhY3RpdmVDb21wb25lbnRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm9uLWVtcHR5IHRhYnMgbXVzdCBoYXZlIGFjdGl2ZSBjb21wb25lbnQgaXRlbScpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgY3VtdWxhdGl2ZVRhYldpZHRoID0gMDtcclxuICAgICAgICAgICAgbGV0IHRhYk92ZXJsYXBBbGxvd2FuY2VFeGNlZWRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBjb25zdCB0YWJPdmVybGFwQWxsb3dhbmNlID0gdGhpcy5fbGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuc2V0dGluZ3MudGFiT3ZlcmxhcEFsbG93YW5jZTtcclxuICAgICAgICAgICAgY29uc3QgYWN0aXZlSW5kZXggPSB0aGlzLl90YWJzLmluZGV4T2YoYWN0aXZlQ29tcG9uZW50SXRlbS50YWIpO1xyXG4gICAgICAgICAgICBjb25zdCBhY3RpdmVUYWIgPSB0aGlzLl90YWJzW2FjdGl2ZUluZGV4XTtcclxuICAgICAgICAgICAgdGhpcy5fbGFzdFZpc2libGVUYWJJbmRleCA9IC0xO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl90YWJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJFbGVtZW50ID0gdGhpcy5fdGFic1tpXS5lbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgICAgIC8vUHV0IHRoZSB0YWIgaW4gdGhlIHRhYkNvbnRhaW5lciBzbyBpdHMgdHJ1ZSB3aWR0aCBjYW4gYmUgY2hlY2tlZFxyXG4gICAgICAgICAgICAgICAgaWYgKHRhYkVsZW1lbnQucGFyZW50RWxlbWVudCAhPT0gdGhpcy5fZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodGFiRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJNYXJnaW5SaWdodFBpeGVscyA9IGdldENvbXB1dGVkU3R5bGUoYWN0aXZlVGFiLmVsZW1lbnQpLm1hcmdpblJpZ2h0O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFiTWFyZ2luUmlnaHQgPSBwaXhlbHNUb051bWJlcih0YWJNYXJnaW5SaWdodFBpeGVscyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJXaWR0aCA9IHRhYkVsZW1lbnQub2Zmc2V0V2lkdGggKyB0YWJNYXJnaW5SaWdodDtcclxuXHJcbiAgICAgICAgICAgICAgICBjdW11bGF0aXZlVGFiV2lkdGggKz0gdGFiV2lkdGg7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9JbmNsdWRlIHRoZSBhY3RpdmUgdGFiJ3Mgd2lkdGggaWYgaXQgaXNuJ3QgYWxyZWFkeVxyXG4gICAgICAgICAgICAgICAgLy9UaGlzIGlzIHRvIGVuc3VyZSB0aGVyZSBpcyByb29tIHRvIHNob3cgdGhlIGFjdGl2ZSB0YWJcclxuICAgICAgICAgICAgICAgIGxldCB2aXNpYmxlVGFiV2lkdGggPSAwO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZUluZGV4IDw9IGkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2aXNpYmxlVGFiV2lkdGggPSBjdW11bGF0aXZlVGFiV2lkdGg7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdGl2ZVRhYk1hcmdpblJpZ2h0UGl4ZWxzID0gZ2V0Q29tcHV0ZWRTdHlsZShhY3RpdmVUYWIuZWxlbWVudCkubWFyZ2luUmlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlVGFiTWFyZ2luUmlnaHQgPSBwaXhlbHNUb051bWJlcihhY3RpdmVUYWJNYXJnaW5SaWdodFBpeGVscyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZVRhYldpZHRoID0gY3VtdWxhdGl2ZVRhYldpZHRoICsgYWN0aXZlVGFiLmVsZW1lbnQub2Zmc2V0V2lkdGggKyBhY3RpdmVUYWJNYXJnaW5SaWdodDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdGFicyB3b24ndCBmaXQsIGNoZWNrIHRoZSBvdmVybGFwIGFsbG93YW5jZS5cclxuICAgICAgICAgICAgICAgIGlmICh2aXNpYmxlVGFiV2lkdGggPiBhdmFpbGFibGVXaWR0aCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvL09uY2UgYWxsb3dhbmNlIGlzIGV4Y2VlZGVkLCBhbGwgcmVtYWluaW5nIHRhYnMgZ28gdG8gbWVudS5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRhYk92ZXJsYXBBbGxvd2FuY2VFeGNlZWRlZCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9ObyBvdmVybGFwIGZvciBmaXJzdCB0YWIgb3IgYWN0aXZlIHRhYlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL092ZXJsYXAgc3ByZWFkcyBhbW9uZyBub24tYWN0aXZlLCBub24tZmlyc3QgdGFic1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3ZlcmxhcDogbnVtYmVyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlSW5kZXggPiAwICYmIGFjdGl2ZUluZGV4IDw9IGkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXAgPSAodmlzaWJsZVRhYldpZHRoIC0gYXZhaWxhYmxlV2lkdGgpIC8gKGkgLSAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXAgPSAodmlzaWJsZVRhYldpZHRoIC0gYXZhaWxhYmxlV2lkdGgpIC8gaTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9DaGVjayBvdmVybGFwIGFnYWluc3QgYWxsb3dhbmNlLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3ZlcmxhcCA8IHRhYk92ZXJsYXBBbGxvd2FuY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDw9IGk7IGorKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcmdpbkxlZnQgPSAoaiAhPT0gYWN0aXZlSW5kZXggJiYgaiAhPT0gMCkgPyAnLScgKyBudW1iZXJUb1BpeGVscyhvdmVybGFwKSA6ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RhYnNbal0uZWxlbWVudC5zdHlsZS56SW5kZXggPSBudW1iZXJUb1BpeGVscyhpIC0gaik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFic1tqXS5lbGVtZW50LnN0eWxlLm1hcmdpbkxlZnQgPSBtYXJnaW5MZWZ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFzdFZpc2libGVUYWJJbmRleCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFiRWxlbWVudC5wYXJlbnRFbGVtZW50ICE9PSB0aGlzLl9lbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5hcHBlbmRDaGlsZCh0YWJFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYk92ZXJsYXBBbGxvd2FuY2VFeGNlZWRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpID09PSBhY3RpdmVJbmRleCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL0FjdGl2ZSB0YWIgc2hvdWxkIHNob3cgZXZlbiBpZiBhbGxvd2FuY2UgZXhjZWVkZWQuIChXZSBsZWZ0IHJvb20uKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJFbGVtZW50LnN0eWxlLnpJbmRleCA9ICdhdXRvJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFiRWxlbWVudC5zdHlsZS5tYXJnaW5MZWZ0ID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJFbGVtZW50LnBhcmVudEVsZW1lbnQgIT09IHRoaXMuX2VsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodGFiRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWJPdmVybGFwQWxsb3dhbmNlRXhjZWVkZWQgJiYgaSAhPT0gYWN0aXZlSW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRyb3Bkb3duQWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RhYiBtZW51IGFscmVhZHkgc2hvd24sIHNvIHdlIGp1c3QgYWRkIHRvIGl0LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiRWxlbWVudC5zdHlsZS56SW5kZXggPSAnYXV0byc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJFbGVtZW50LnN0eWxlLm1hcmdpbkxlZnQgPSAnJztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFiRWxlbWVudC5wYXJlbnRFbGVtZW50ICE9PSB0aGlzLl9kcm9wZG93bkVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kcm9wZG93bkVsZW1lbnQuYXBwZW5kQ2hpbGQodGFiRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1dlIG5vdyBrbm93IHRoZSB0YWIgbWVudSBtdXN0IGJlIHNob3duLCBzbyB3ZSBoYXZlIHRvIHJlY2FsY3VsYXRlIGV2ZXJ5dGhpbmcuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXN0VmlzaWJsZVRhYkluZGV4ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICB0YWJFbGVtZW50LnN0eWxlLnpJbmRleCA9ICdhdXRvJztcclxuICAgICAgICAgICAgICAgICAgICB0YWJFbGVtZW50LnN0eWxlLm1hcmdpbkxlZnQgPSAnJztcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGFiRWxlbWVudC5wYXJlbnRFbGVtZW50ICE9PSB0aGlzLl9lbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuYXBwZW5kQ2hpbGQodGFiRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNob3dzIGRyb3AgZG93biBmb3IgYWRkaXRpb25hbCB0YWJzIHdoZW4gdGhlcmUgYXJlIHRvbyBtYW55IHRvIGRpc3BsYXkuXHJcbiAgICAgKi9cclxuICAgIHNob3dBZGRpdGlvbmFsVGFic0Ryb3Bkb3duKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2Ryb3Bkb3duRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIaWRlcyBkcm9wIGRvd24gZm9yIGFkZGl0aW9uYWwgdGFicyB3aGVuIHRoZXJlIGFyZSB0b28gbWFueSB0byBkaXNwbGF5LlxyXG4gICAgICovXHJcbiAgICBoaWRlQWRkaXRpb25hbFRhYnNEcm9wZG93bigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9kcm9wZG93bkVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZVRhYkNsb3NlRXZlbnQoY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSkge1xyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudFJlbW92ZUV2ZW50KGNvbXBvbmVudEl0ZW0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlVGFiRm9jdXNFdmVudChjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50Rm9jdXNFdmVudChjb21wb25lbnRJdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZVRhYkRyYWdTdGFydEV2ZW50KHg6IG51bWJlciwgeTogbnVtYmVyLCBkcmFnTGlzdGVuZXI6IERyYWdMaXN0ZW5lciwgY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSkge1xyXG4gICAgICAgIHRoaXMuX2NvbXBvbmVudERyYWdTdGFydEV2ZW50KHgsIHksIGRyYWdMaXN0ZW5lciwgY29tcG9uZW50SXRlbSk7XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgVGFic0NvbnRhaW5lciB7XHJcbiAgICBleHBvcnQgdHlwZSBDb21wb25lbnRJdGVtUmVtb3ZlRXZlbnQgPSAodGhpczogdm9pZCwgY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSkgPT4gdm9pZDtcclxuICAgIGV4cG9ydCB0eXBlIENvbXBvbmVudEl0ZW1Gb2N1c0V2ZW50ID0gKHRoaXM6IHZvaWQsIGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0pID0+IHZvaWQ7XHJcbiAgICBleHBvcnQgdHlwZSBDb21wb25lbnRJdGVtRHJhZ1N0YXJ0RXZlbnQgPSAodGhpczogdm9pZCwgeDogbnVtYmVyLCB5OiBudW1iZXIsIGRyYWdMaXN0ZW5lcjogRHJhZ0xpc3RlbmVyLCBjb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtKSA9PiB2b2lkO1xyXG4gICAgZXhwb3J0IHR5cGUgRHJvcGRvd25BY3RpdmVDaGFuZ2VkRXZlbnQgPSAodGhpczogdm9pZCkgPT4gdm9pZDtcclxufVxyXG4iLCJpbXBvcnQgeyBEb21Db25zdGFudHMgfSBmcm9tICcuLi91dGlscy9kb20tY29uc3RhbnRzJztcclxuaW1wb3J0IHsgUmVjdCB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcclxuXHJcbi8qKiBAaW50ZXJuYWwgQGRlcHJlY2F0ZWQgVG8gYmUgcmVtb3ZlZCAqL1xyXG5leHBvcnQgY2xhc3MgVHJhbnNpdGlvbkluZGljYXRvciB7XHJcbiAgICBwcml2YXRlIF9lbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgX3RvRWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsO1xyXG4gICAgcHJpdmF0ZSBfZnJvbURpbWVuc2lvbnM6IG51bGw7XHJcbiAgICBwcml2YXRlIF90b3RhbEFuaW1hdGlvbkR1cmF0aW9uOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIF9hbmltYXRpb25TdGFydFRpbWU6IG51bWJlciB8IG51bGw7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLlRyYW5zaXRpb25JbmRpY2F0b3IpO1xyXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5fZWxlbWVudCk7XHJcblxyXG4gICAgICAgIHRoaXMuX3RvRWxlbWVudCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fZnJvbURpbWVuc2lvbnMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3RvdGFsQW5pbWF0aW9uRHVyYXRpb24gPSAyMDA7XHJcbiAgICAgICAgdGhpcy5fYW5pbWF0aW9uU3RhcnRUaW1lID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgdHJhbnNpdGlvbkVsZW1lbnRzKGZyb21FbGVtZW50OiBIVE1MRWxlbWVudCwgdG9FbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRPRE8gLSBUaGlzIGlzIG5vdCBxdWl0ZSBhcyBjb29sIGFzIGV4cGVjdGVkLiBSZXZpZXcuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIC8vIHRoaXMuX3RvRWxlbWVudCA9IHRvRWxlbWVudDtcclxuICAgICAgICAvLyB0aGlzLl9hbmltYXRpb25TdGFydFRpbWUgPSBub3coKTtcclxuICAgICAgICAvLyB0aGlzLl9mcm9tRGltZW5zaW9ucyA9IHRoaXMuX21lYXN1cmUoZnJvbUVsZW1lbnQpO1xyXG4gICAgICAgIC8vIHRoaXMuX2Zyb21EaW1lbnNpb25zLm9wYWNpdHkgPSAwLjg7XHJcbiAgICAgICAgLy8gdGhpcy5fZWxlbWVudC5zaG93KCkuY3NzKHRoaXMuX2Zyb21EaW1lbnNpb25zKTtcclxuICAgICAgICAvLyBhbmltRnJhbWUoZm5CaW5kKHRoaXMuX25leHRBbmltYXRpb25GcmFtZSwgdGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbmV4dEFuaW1hdGlvbkZyYW1lKCk6IHZvaWQge1xyXG4gICAgICAgIC8vIGlmICh0aGlzLl90b0VsZW1lbnQgPT09IG51bGwgfHwgdGhpcy5fZnJvbURpbWVuc2lvbnMgPT09IG51bGwgfHwgdGhpcy5fYW5pbWF0aW9uU3RhcnRUaW1lID09PSBudWxsKSB7XHJcbiAgICAgICAgLy8gICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdUSU5BRlREOTcxMTUnKTtcclxuICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgIC8vICAgICBjb25zdCB0b0RpbWVuc2lvbnMgPSB0aGlzLm1lYXN1cmUodGhpcy5fdG9FbGVtZW50KTtcclxuICAgICAgICAvLyAgICAgY29uc3QgYW5pbWF0aW9uUHJvZ3Jlc3MgPSAobm93KCkgLSB0aGlzLl9hbmltYXRpb25TdGFydFRpbWUpIC8gdGhpcy5fdG90YWxBbmltYXRpb25EdXJhdGlvbjtcclxuICAgICAgICAvLyAgICAgY29uc3QgY3VycmVudEZyYW1lU3R5bGVzID0ge307XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IGNzc1Byb3BlcnR5O1xyXG5cclxuICAgICAgICAvLyAgICAgaWYgKGFuaW1hdGlvblByb2dyZXNzID49IDEpIHtcclxuICAgICAgICAvLyAgICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgICAgICAvLyAgICAgICAgIHJldHVybjtcclxuICAgICAgICAvLyAgICAgfVxyXG5cclxuICAgICAgICAvLyAgICAgdG9EaW1lbnNpb25zLm9wYWNpdHkgPSAwO1xyXG5cclxuICAgICAgICAvLyAgICAgZm9yIChjb25zdCBjc3NQcm9wZXJ0eSBpbiB0aGlzLl9mcm9tRGltZW5zaW9ucykge1xyXG4gICAgICAgIC8vICAgICAgICAgY3VycmVudEZyYW1lU3R5bGVzW2Nzc1Byb3BlcnR5XSA9IHRoaXMuX2Zyb21EaW1lbnNpb25zW2Nzc1Byb3BlcnR5XSArXHJcbiAgICAgICAgLy8gICAgICAgICAgICAgKHRvRGltZW5zaW9uc1tjc3NQcm9wZXJ0eV0gLSB0aGlzLl9mcm9tRGltZW5zaW9uc1tjc3NQcm9wZXJ0eV0pICpcclxuICAgICAgICAvLyAgICAgICAgICAgICBhbmltYXRpb25Qcm9ncmVzcztcclxuICAgICAgICAvLyAgICAgfVxyXG5cclxuICAgICAgICAvLyAgICAgdGhpcy5fZWxlbWVudC5jc3MoY3VycmVudEZyYW1lU3R5bGVzKTtcclxuICAgICAgICAvLyAgICAgYW5pbUZyYW1lKGZuQmluZCh0aGlzLl9uZXh0QW5pbWF0aW9uRnJhbWUsIHRoaXMpKTtcclxuICAgICAgICAvLyB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBtZWFzdXJlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogUmVjdCB7XHJcbiAgICAgICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGxlZnQ6IHJlY3QubGVmdCxcclxuICAgICAgICAgICAgdG9wOiByZWN0LnRvcCxcclxuICAgICAgICAgICAgd2lkdGg6IGVsZW1lbnQub2Zmc2V0V2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodDogZWxlbWVudC5vZmZzZXRIZWlnaHQsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG4iLCIvKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRXh0ZXJuYWxFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgY2xhc3MgQ29uZmlndXJhdGlvbkVycm9yIGV4dGVuZHMgRXh0ZXJuYWxFcnJvciB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHB1YmxpYyByZWFkb25seSBub2RlPzogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoJ0NvbmZpZ3VyYXRpb24nLCBtZXNzYWdlKTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGNsYXNzIFBvcG91dEJsb2NrZWRFcnJvciBleHRlbmRzIEV4dGVybmFsRXJyb3Ige1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoJ1BvcG91dEJsb2NrZWQnLCBtZXNzYWdlKTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGNsYXNzIEFwaUVycm9yIGV4dGVuZHMgRXh0ZXJuYWxFcnJvciB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcignQVBJJywgbWVzc2FnZSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBjbGFzcyBCaW5kRXJyb3IgZXh0ZW5kcyBFeHRlcm5hbEVycm9yIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKCdCaW5kJywgbWVzc2FnZSk7XHJcbiAgICB9XHJcbn1cclxuIiwiLyoqIEBpbnRlcm5hbCAqL1xyXG5hYnN0cmFjdCBjbGFzcyBJbnRlcm5hbEVycm9yIGV4dGVuZHMgRXJyb3Ige1xyXG4gICAgY29uc3RydWN0b3IodHlwZTogc3RyaW5nLCBjb2RlOiBzdHJpbmcsIG1lc3NhZ2U/OiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcihgJHt0eXBlfTogJHtjb2RlfSR7bWVzc2FnZSA9PT0gdW5kZWZpbmVkID8gJycgOiAnOiAnICsgbWVzc2FnZX1gKVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBjbGFzcyBBc3NlcnRFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xyXG4gICAgY29uc3RydWN0b3IoY29kZTogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoJ0Fzc2VydCcsIGNvZGUsIG1lc3NhZ2UpXHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGNsYXNzIFVucmVhY2hhYmxlQ2FzZUVycm9yIGV4dGVuZHMgSW50ZXJuYWxFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3Rvcihjb2RlOiBzdHJpbmcsIHZhcmlhYmxlVmFsdWU6IG5ldmVyLCBtZXNzYWdlPzogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoJ1VucmVhY2hhYmxlQ2FzZScsIGNvZGUsIGAke3ZhcmlhYmxlVmFsdWV9JHttZXNzYWdlID09PSB1bmRlZmluZWQgPyAnJyA6ICc6ICcgKyBtZXNzYWdlfWApXHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGNsYXNzIFVuZXhwZWN0ZWROdWxsRXJyb3IgZXh0ZW5kcyBJbnRlcm5hbEVycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKGNvZGU6IHN0cmluZywgbWVzc2FnZT86IHN0cmluZykge1xyXG4gICAgICAgIHN1cGVyKCdVbmV4cGVjdGVkTnVsbCcsIGNvZGUsIG1lc3NhZ2UpXHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGNsYXNzIFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvciBleHRlbmRzIEludGVybmFsRXJyb3Ige1xyXG4gICAgY29uc3RydWN0b3IoY29kZTogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nKSB7XHJcbiAgICAgICAgc3VwZXIoJ1VuZXhwZWN0ZWRVbmRlZmluZWQnLCBjb2RlLCBtZXNzYWdlKVxyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IExheW91dENvbmZpZyB9IGZyb20gJy4vY29uZmlnL2NvbmZpZyc7XHJcbmltcG9ydCB7IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyB9IGZyb20gJy4vY29uZmlnL3Jlc29sdmVkLWNvbmZpZyc7XHJcbmltcG9ydCB7IENvbXBvbmVudENvbnRhaW5lciB9IGZyb20gJy4vY29udGFpbmVyL2NvbXBvbmVudC1jb250YWluZXInO1xyXG5pbXBvcnQgeyBBcGlFcnJvciwgQmluZEVycm9yIH0gZnJvbSAnLi9lcnJvcnMvZXh0ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBBc3NlcnRFcnJvciwgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yIH0gZnJvbSAnLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBJMThuU3RyaW5nSWQsIGkxOG5TdHJpbmdzIH0gZnJvbSAnLi91dGlscy9pMThuLXN0cmluZ3MnO1xyXG5pbXBvcnQgeyBKc29uVmFsdWUsIExvZ2ljYWxaSW5kZXggfSBmcm9tICcuL3V0aWxzL3R5cGVzJztcclxuaW1wb3J0IHsgZGVlcEV4dGVuZFZhbHVlLCBlbnN1cmVFbGVtZW50UG9zaXRpb25BYnNvbHV0ZSwgbnVtYmVyVG9QaXhlbHMsIHNldEVsZW1lbnREaXNwbGF5VmlzaWJpbGl0eSwgc2V0RWxlbWVudEhlaWdodCwgc2V0RWxlbWVudFdpZHRoIH0gZnJvbSAnLi91dGlscy91dGlscyc7XHJcbmltcG9ydCB7IFZpcnR1YWxMYXlvdXQgfSBmcm9tICcuL3ZpcnR1YWwtbGF5b3V0JztcclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBjbGFzcyBHb2xkZW5MYXlvdXQgZXh0ZW5kcyBWaXJ0dWFsTGF5b3V0IHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2NvbXBvbmVudFR5cGVzTWFwID0gbmV3IE1hcDxzdHJpbmcsIEdvbGRlbkxheW91dC5Db21wb25lbnRJbnN0YW50aWF0b3I+KCk7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9nZXRDb21wb25lbnRDb25zdHJ1Y3RvckZ0bjogR29sZGVuTGF5b3V0LkdldENvbXBvbmVudENvbnN0cnVjdG9yQ2FsbGJhY2s7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfcmVnaXN0ZXJlZENvbXBvbmVudE1hcCA9IG5ldyBNYXA8Q29tcG9uZW50Q29udGFpbmVyLCBDb21wb25lbnRDb250YWluZXIuQ29tcG9uZW50PigpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfdmlydHVhYmxlQ29tcG9uZW50TWFwID0gbmV3IE1hcDxDb21wb25lbnRDb250YWluZXIsIEdvbGRlbkxheW91dC5WaXJ0dWFibGVDb21wb25lbnQ+KCk7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9nb2xkZW5MYXlvdXRCb3VuZGluZ0NsaWVudFJlY3Q6IERPTVJlY3Q7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfY29udGFpbmVyVmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50TGlzdGVuZXIgPVxyXG4gICAgICAgIChjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpID0+IHRoaXMuaGFuZGxlQ29udGFpbmVyVmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50KGNvbnRhaW5lciwgd2lkdGgsIGhlaWdodCk7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9jb250YWluZXJWaXJ0dWFsVmlzaWJpbGl0eUNoYW5nZVJlcXVpcmVkRXZlbnRMaXN0ZW5lciA9XHJcbiAgICAgICAgKGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCB2aXNpYmxlOiBib29sZWFuKSA9PiB0aGlzLmhhbmRsZUNvbnRhaW5lclZpcnR1YWxWaXNpYmlsaXR5Q2hhbmdlUmVxdWlyZWRFdmVudChjb250YWluZXIsIHZpc2libGUpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfY29udGFpbmVyVmlydHVhbFpJbmRleENoYW5nZVJlcXVpcmVkRXZlbnRMaXN0ZW5lciA9XHJcbiAgICAgICAgKGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCBsb2dpY2FsWkluZGV4OiBMb2dpY2FsWkluZGV4LCBkZWZhdWx0WkluZGV4OiBzdHJpbmcpID0+XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQ29udGFpbmVyVmlydHVhbFpJbmRleENoYW5nZVJlcXVpcmVkRXZlbnQoY29udGFpbmVyLCBsb2dpY2FsWkluZGV4LCBkZWZhdWx0WkluZGV4KTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSBjb250YWluZXIgLSBBIERvbSBIVE1MIGVsZW1lbnQuIERlZmF1bHRzIHRvIGJvZHlcclxuICAgICAqIEBwYXJhbSBiaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyIC0gRXZlbnQgaGFuZGxlciB0byBiaW5kIGNvbXBvbmVudHNcclxuICAgICAqIEBwYXJhbSBiaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyIC0gRXZlbnQgaGFuZGxlciB0byB1bmJpbmQgY29tcG9uZW50c1xyXG4gICAgICogSWYgYmluZENvbXBvbmVudEV2ZW50SGFuZGxlciBpcyBkZWZpbmVkLCB0aGVuIGNvbnN0cnVjdG9yIHdpbGwgYmUgZGV0ZXJtaW5hdGUuIEl0IHdpbGwgYWx3YXlzIGNhbGwgdGhlIGluaXQoKVxyXG4gICAgICogZnVuY3Rpb24gYW5kIHRoZSBpbml0KCkgZnVuY3Rpb24gd2lsbCBhbHdheXMgY29tcGxldGUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgYmluZENvbXBvbmVudEV2ZW50SGFuZGxlciB3aWxsIGJlIGNhbGxlZFxyXG4gICAgICogaWYgY29uc3RydWN0b3IgaXMgZm9yIGEgcG9wb3V0IHdpbmRvdy4gTWFrZSBzdXJlIGJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgaXMgcmVhZHkgZm9yIGV2ZW50cy5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgY29udGFpbmVyPzogSFRNTEVsZW1lbnQsXHJcbiAgICAgICAgYmluZENvbXBvbmVudEV2ZW50SGFuZGxlcj86IFZpcnR1YWxMYXlvdXQuQmluZENvbXBvbmVudEV2ZW50SGFuZGxlcixcclxuICAgICAgICB1bmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXI/OiBWaXJ0dWFsTGF5b3V0LlVuYmluZENvbXBvbmVudEV2ZW50SGFuZGxlcixcclxuICAgICk7XHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgc3BlY2lmeSBsYXlvdXRDb25maWcgaW4ge0BsaW5rIChMYXlvdXRNYW5hZ2VyOmNsYXNzKS5sb2FkTGF5b3V0fSAqL1xyXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBMYXlvdXRDb25maWcsIGNvbnRhaW5lcj86IEhUTUxFbGVtZW50KTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZ09yT3B0aW9uYWxDb250YWluZXI6IExheW91dENvbmZpZyB8IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIGNvbnRhaW5lck9yQmluZENvbXBvbmVudEV2ZW50SGFuZGxlcj86IEhUTUxFbGVtZW50IHwgVmlydHVhbExheW91dC5CaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyLFxyXG4gICAgICAgIHVuYmluZENvbXBvbmVudEV2ZW50SGFuZGxlcj86IFZpcnR1YWxMYXlvdXQuVW5iaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyLFxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoY29uZmlnT3JPcHRpb25hbENvbnRhaW5lciwgY29udGFpbmVyT3JCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyLCB1bmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIsIHRydWUpO1xyXG4gICAgICAgIC8vIHdlIHRvbGQgVmlydHVhbExheW91dCB0byBub3QgY2FsbCBpbml0KCkgKHNraXBJbml0IHNldCB0byB0cnVlKSBzbyB0aGF0IEdvbGRlbiBMYXlvdXQgY2FuIGluaXRpYWxpc2UgaXRzIHByb3BlcnRpZXMgYmVmb3JlIGluaXQgaXMgY2FsbGVkXHJcbiAgICAgICAgaWYgKCF0aGlzLmRlcHJlY2F0ZWRDb25zdHJ1Y3Rvcikge1xyXG4gICAgICAgICAgICB0aGlzLmluaXQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWdpc3RlciBhIG5ldyBjb21wb25lbnQgdHlwZSB3aXRoIHRoZSBsYXlvdXQgbWFuYWdlci5cclxuICAgICAqXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBTZWUge0BsaW5rIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQwOTIyNTMxL2hvdy10by1jaGVjay1pZi1hLWphdmFzY3JpcHQtZnVuY3Rpb24taXMtYS1jb25zdHJ1Y3Rvcn1cclxuICAgICAqIGluc3RlYWQgdXNlIHtAbGluayAoR29sZGVuTGF5b3V0OmNsYXNzKS5yZWdpc3RlckNvbXBvbmVudENvbnN0cnVjdG9yfVxyXG4gICAgICogb3Ige0BsaW5rIChHb2xkZW5MYXlvdXQ6Y2xhc3MpLnJlZ2lzdGVyQ29tcG9uZW50RmFjdG9yeUZ1bmN0aW9ufVxyXG4gICAgICovXHJcbiAgICByZWdpc3RlckNvbXBvbmVudChuYW1lOiBzdHJpbmcsXHJcbiAgICAgICAgY29tcG9uZW50Q29uc3RydWN0b3JPckZhY3RvcnlGdG46IEdvbGRlbkxheW91dC5Db21wb25lbnRDb25zdHJ1Y3RvciB8IEdvbGRlbkxheW91dC5Db21wb25lbnRGYWN0b3J5RnVuY3Rpb24sXHJcbiAgICAgICAgdmlydHVhbCA9IGZhbHNlXHJcbiAgICApOiB2b2lkIHtcclxuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudENvbnN0cnVjdG9yT3JGYWN0b3J5RnRuICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBBcGlFcnJvcigncmVnaXN0ZXJDb21wb25lbnQoKSBjb21wb25lbnRDb25zdHJ1Y3Rvck9yRmFjdG9yeUZ0biBwYXJhbWV0ZXIgaXMgbm90IGEgZnVuY3Rpb24nKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChjb21wb25lbnRDb25zdHJ1Y3Rvck9yRmFjdG9yeUZ0bi5oYXNPd25Qcm9wZXJ0eSgncHJvdG90eXBlJykpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudENvbnN0cnVjdG9yID0gY29tcG9uZW50Q29uc3RydWN0b3JPckZhY3RvcnlGdG4gYXMgR29sZGVuTGF5b3V0LkNvbXBvbmVudENvbnN0cnVjdG9yO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWdpc3RlckNvbXBvbmVudENvbnN0cnVjdG9yKG5hbWUsIGNvbXBvbmVudENvbnN0cnVjdG9yLCB2aXJ0dWFsKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEZhY3RvcnlGdG4gPSBjb21wb25lbnRDb25zdHJ1Y3Rvck9yRmFjdG9yeUZ0biBhcyBHb2xkZW5MYXlvdXQuQ29tcG9uZW50RmFjdG9yeUZ1bmN0aW9uO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWdpc3RlckNvbXBvbmVudEZhY3RvcnlGdW5jdGlvbihuYW1lLCBjb21wb25lbnRGYWN0b3J5RnRuLCB2aXJ0dWFsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVyIGEgbmV3IGNvbXBvbmVudCB0eXBlIHdpdGggdGhlIGxheW91dCBtYW5hZ2VyLlxyXG4gICAgICovXHJcbiAgICByZWdpc3RlckNvbXBvbmVudENvbnN0cnVjdG9yKHR5cGVOYW1lOiBzdHJpbmcsIGNvbXBvbmVudENvbnN0cnVjdG9yOiBHb2xkZW5MYXlvdXQuQ29tcG9uZW50Q29uc3RydWN0b3IsIHZpcnR1YWwgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50Q29uc3RydWN0b3IgIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGkxOG5TdHJpbmdzW0kxOG5TdHJpbmdJZC5QbGVhc2VSZWdpc3RlckFDb25zdHJ1Y3RvckZ1bmN0aW9uXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBleGlzdGluZ0NvbXBvbmVudFR5cGUgPSB0aGlzLl9jb21wb25lbnRUeXBlc01hcC5nZXQodHlwZU5hbWUpO1xyXG5cclxuICAgICAgICBpZiAoZXhpc3RpbmdDb21wb25lbnRUeXBlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEJpbmRFcnJvcihgJHtpMThuU3RyaW5nc1tJMThuU3RyaW5nSWQuQ29tcG9uZW50SXNBbHJlYWR5UmVnaXN0ZXJlZF19OiAke3R5cGVOYW1lfWApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50VHlwZXNNYXAuc2V0KHR5cGVOYW1lLCB7XHJcbiAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogY29tcG9uZW50Q29uc3RydWN0b3IsXHJcbiAgICAgICAgICAgICAgICBmYWN0b3J5RnVuY3Rpb246IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIHZpcnR1YWwsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0ZXIgYSBuZXcgY29tcG9uZW50IHdpdGggdGhlIGxheW91dCBtYW5hZ2VyLlxyXG4gICAgICovXHJcbiAgICByZWdpc3RlckNvbXBvbmVudEZhY3RvcnlGdW5jdGlvbih0eXBlTmFtZTogc3RyaW5nLCBjb21wb25lbnRGYWN0b3J5RnVuY3Rpb246IEdvbGRlbkxheW91dC5Db21wb25lbnRGYWN0b3J5RnVuY3Rpb24sIHZpcnR1YWwgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50RmFjdG9yeUZ1bmN0aW9uICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBCaW5kRXJyb3IoJ1BsZWFzZSByZWdpc3RlciBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBleGlzdGluZ0NvbXBvbmVudFR5cGUgPSB0aGlzLl9jb21wb25lbnRUeXBlc01hcC5nZXQodHlwZU5hbWUpO1xyXG5cclxuICAgICAgICBpZiAoZXhpc3RpbmdDb21wb25lbnRUeXBlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEJpbmRFcnJvcihgJHtpMThuU3RyaW5nc1tJMThuU3RyaW5nSWQuQ29tcG9uZW50SXNBbHJlYWR5UmVnaXN0ZXJlZF19OiAke3R5cGVOYW1lfWApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fY29tcG9uZW50VHlwZXNNYXAuc2V0KHR5cGVOYW1lLCB7XHJcbiAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgZmFjdG9yeUZ1bmN0aW9uOiBjb21wb25lbnRGYWN0b3J5RnVuY3Rpb24sXHJcbiAgICAgICAgICAgICAgICB2aXJ0dWFsLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdGVyIGEgY29tcG9uZW50IGZ1bmN0aW9uIHdpdGggdGhlIGxheW91dCBtYW5hZ2VyLiBUaGlzIGZ1bmN0aW9uIHNob3VsZFxyXG4gICAgICogcmV0dXJuIGEgY29uc3RydWN0b3IgZm9yIGEgY29tcG9uZW50IGJhc2VkIG9uIGEgY29uZmlnLlxyXG4gICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBpZiBhIGNvbXBvbmVudCB0eXBlIHdpdGggdGhlIHJlcXVpcmVkIG5hbWUgaXMgbm90IGFscmVhZHkgcmVnaXN0ZXJlZC5cclxuICAgICAqIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgYXBwbGljYXRpb25zIHVzZSB0aGUge0BsaW5rIChWaXJ0dWFsTGF5b3V0OmNsYXNzKS5nZXRDb21wb25lbnRFdmVudH0gYW5kXHJcbiAgICAgKiB7QGxpbmsgKFZpcnR1YWxMYXlvdXQ6Y2xhc3MpLnJlbGVhc2VDb21wb25lbnRFdmVudH0gaW5zdGVhZCBvZiByZWdpc3RlcmluZyBhIGNvbnN0cnVjdG9yIGNhbGxiYWNrXHJcbiAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChHb2xkZW5MYXlvdXQ6Y2xhc3MpLnJlZ2lzdGVyR2V0Q29tcG9uZW50Q29uc3RydWN0b3JDYWxsYmFja31cclxuICAgICAqL1xyXG4gICAgcmVnaXN0ZXJDb21wb25lbnRGdW5jdGlvbihjYWxsYmFjazogR29sZGVuTGF5b3V0LkdldENvbXBvbmVudENvbnN0cnVjdG9yQ2FsbGJhY2spOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJlZ2lzdGVyR2V0Q29tcG9uZW50Q29uc3RydWN0b3JDYWxsYmFjayhjYWxsYmFjayk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWdpc3RlciBhIGNhbGxiYWNrIGNsb3N1cmUgd2l0aCB0aGUgbGF5b3V0IG1hbmFnZXIgd2hpY2ggc3VwcGxpZXMgYSBDb21wb25lbnQgQ29uc3RydWN0b3IuXHJcbiAgICAgKiBUaGlzIGNhbGxiYWNrIHNob3VsZCByZXR1cm4gYSBjb25zdHJ1Y3RvciBmb3IgYSBjb21wb25lbnQgYmFzZWQgb24gYSBjb25maWcuXHJcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGlmIGEgY29tcG9uZW50IHR5cGUgd2l0aCB0aGUgcmVxdWlyZWQgbmFtZSBpcyBub3QgYWxyZWFkeSByZWdpc3RlcmVkLlxyXG4gICAgICogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBhcHBsaWNhdGlvbnMgdXNlIHRoZSB7QGxpbmsgKFZpcnR1YWxMYXlvdXQ6Y2xhc3MpLmdldENvbXBvbmVudEV2ZW50fSBhbmRcclxuICAgICAqIHtAbGluayAoVmlydHVhbExheW91dDpjbGFzcykucmVsZWFzZUNvbXBvbmVudEV2ZW50fSBpbnN0ZWFkIG9mIHJlZ2lzdGVyaW5nIGEgY29uc3RydWN0b3IgY2FsbGJhY2tcclxuICAgICAqL1xyXG4gICAgcmVnaXN0ZXJHZXRDb21wb25lbnRDb25zdHJ1Y3RvckNhbGxiYWNrKGNhbGxiYWNrOiBHb2xkZW5MYXlvdXQuR2V0Q29tcG9uZW50Q29uc3RydWN0b3JDYWxsYmFjayk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgcmVnaXN0ZXIgYSBjYWxsYmFjayBmdW5jdGlvbicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2dldENvbXBvbmVudENvbnN0cnVjdG9yRnRuICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdNdWx0aXBsZSBjb21wb25lbnQgZnVuY3Rpb25zIGFyZSBiZWluZyByZWdpc3RlcmVkLiAgT25seSB0aGUgZmluYWwgcmVnaXN0ZXJlZCBmdW5jdGlvbiB3aWxsIGJlIHVzZWQuJylcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2dldENvbXBvbmVudENvbnN0cnVjdG9yRnRuID0gY2FsbGJhY2s7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UmVnaXN0ZXJlZENvbXBvbmVudFR5cGVOYW1lcygpOiBzdHJpbmdbXSB7XHJcbiAgICAgICAgY29uc3QgdHlwZU5hbWVzSXRlcmFibGVJdGVyYXRvciA9IHRoaXMuX2NvbXBvbmVudFR5cGVzTWFwLmtleXMoKTtcclxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0eXBlTmFtZXNJdGVyYWJsZUl0ZXJhdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgY29tcG9uZW50IGluc3RhbnRpYXRvci4gIEF0dGVtcHRzIHRvIHV0aWxpemUgcmVnaXN0ZXJlZFxyXG4gICAgICogY29tcG9uZW50IHR5cGUgYnkgZmlyc3QsIHRoZW4gZmFsbHMgYmFjayB0byB0aGUgY29tcG9uZW50IGNvbnN0cnVjdG9yIGNhbGxiYWNrIGZ1bmN0aW9uIChpZiByZWdpc3RlcmVkKS5cclxuICAgICAqIElmIG5laXRoZXIgZ2V0cyBhbiBpbnN0YW50aWF0b3IsIHRoZW4gcmV0dXJucyBgdW5kZWZpbmVkYC5cclxuICAgICAqIE5vdGUgdGhhdCBgdW5kZWZpbmVkYCB3aWxsIHJldHVybiBpZiBjb25maWcuY29tcG9uZW50VHlwZSBpcyBub3QgYSBzdHJpbmdcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gY29uZmlnIC0gVGhlIGl0ZW0gY29uZmlnXHJcbiAgICAgKiBAcHVibGljXHJcbiAgICAgKi9cclxuICAgIGdldENvbXBvbmVudEluc3RhbnRpYXRvcihjb25maWc6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyk6IEdvbGRlbkxheW91dC5Db21wb25lbnRJbnN0YW50aWF0b3IgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGxldCBpbnN0YW50aWF0b3I6IEdvbGRlbkxheW91dC5Db21wb25lbnRJbnN0YW50aWF0b3IgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIGNvbnN0IHR5cGVOYW1lID0gUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnLnJlc29sdmVDb21wb25lbnRUeXBlTmFtZShjb25maWcpXHJcbiAgICAgICAgaWYgKHR5cGVOYW1lICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaW5zdGFudGlhdG9yID0gdGhpcy5fY29tcG9uZW50VHlwZXNNYXAuZ2V0KHR5cGVOYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGluc3RhbnRpYXRvciA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9nZXRDb21wb25lbnRDb25zdHJ1Y3RvckZ0biAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpbnN0YW50aWF0b3IgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3I6IHRoaXMuX2dldENvbXBvbmVudENvbnN0cnVjdG9yRnRuKGNvbmZpZyksXHJcbiAgICAgICAgICAgICAgICAgICAgZmFjdG9yeUZ1bmN0aW9uOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdmlydHVhbDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBpbnN0YW50aWF0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgYmluZENvbXBvbmVudChjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgaXRlbUNvbmZpZzogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnKTogQ29tcG9uZW50Q29udGFpbmVyLkJpbmRhYmxlQ29tcG9uZW50IHtcclxuICAgICAgICBsZXQgaW5zdGFudGlhdG9yOiBHb2xkZW5MYXlvdXQuQ29tcG9uZW50SW5zdGFudGlhdG9yIHwgdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICBjb25zdCB0eXBlTmFtZSA9IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZy5yZXNvbHZlQ29tcG9uZW50VHlwZU5hbWUoaXRlbUNvbmZpZyk7XHJcbiAgICAgICAgaWYgKHR5cGVOYW1lICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaW5zdGFudGlhdG9yID0gdGhpcy5fY29tcG9uZW50VHlwZXNNYXAuZ2V0KHR5cGVOYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGluc3RhbnRpYXRvciA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9nZXRDb21wb25lbnRDb25zdHJ1Y3RvckZ0biAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpbnN0YW50aWF0b3IgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3I6IHRoaXMuX2dldENvbXBvbmVudENvbnN0cnVjdG9yRnRuKGl0ZW1Db25maWcpLFxyXG4gICAgICAgICAgICAgICAgICAgIGZhY3RvcnlGdW5jdGlvbjogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIHZpcnR1YWw6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgcmVzdWx0OiBDb21wb25lbnRDb250YWluZXIuQmluZGFibGVDb21wb25lbnQ7XHJcbiAgICAgICAgaWYgKGluc3RhbnRpYXRvciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZpcnR1YWwgPSBpbnN0YW50aWF0b3IudmlydHVhbDtcclxuICAgICAgICAgICAgLy8gaGFuZGxlIGNhc2Ugd2hlcmUgY29tcG9uZW50IGlzIG9idGFpbmVkIGJ5IG5hbWUgb3IgY29tcG9uZW50IGNvbnN0cnVjdG9yIGNhbGxiYWNrXHJcbiAgICAgICAgICAgIGxldCBjb21wb25lbnRTdGF0ZTogSnNvblZhbHVlIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBpZiAoaXRlbUNvbmZpZy5jb21wb25lbnRTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnRTdGF0ZSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIG1ha2UgY29weVxyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50U3RhdGUgPSBkZWVwRXh0ZW5kVmFsdWUoe30sIGl0ZW1Db25maWcuY29tcG9uZW50U3RhdGUpIGFzIEpzb25WYWx1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGNvbXBvbmVudDogQ29tcG9uZW50Q29udGFpbmVyLkNvbXBvbmVudCB8IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50Q29uc3RydWN0b3IgPSBpbnN0YW50aWF0b3IuY29uc3RydWN0b3I7XHJcbiAgICAgICAgICAgIGlmIChjb21wb25lbnRDb25zdHJ1Y3RvciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnQgPSBuZXcgY29tcG9uZW50Q29uc3RydWN0b3IoY29udGFpbmVyLCBjb21wb25lbnRTdGF0ZSwgdmlydHVhbCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmYWN0b3J5RnVuY3Rpb24gPSBpbnN0YW50aWF0b3IuZmFjdG9yeUZ1bmN0aW9uO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZhY3RvcnlGdW5jdGlvbiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50ID0gZmFjdG9yeUZ1bmN0aW9uKGNvbnRhaW5lciwgY29tcG9uZW50U3RhdGUsIHZpcnR1YWwpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNQkNGRlUxMDAwOCcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodmlydHVhbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignR0xCQ1ZDVTk4ODc3NCcpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2aXJ0dWFibGVDb21wb25lbnQgPSBjb21wb25lbnQgYXMgR29sZGVuTGF5b3V0LlZpcnR1YWJsZUNvbXBvbmVudDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRSb290RWxlbWVudCA9IHZpcnR1YWJsZUNvbXBvbmVudC5yb290SHRtbEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFJvb3RFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJpbmRFcnJvcihgJHtpMThuU3RyaW5nc1tJMThuU3RyaW5nSWQuVmlydHVhbENvbXBvbmVudERvZXNOb3RIYXZlUm9vdEh0bWxFbGVtZW50XX06ICR7dHlwZU5hbWV9YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5zdXJlRWxlbWVudFBvc2l0aW9uQWJzb2x1dGUoY29tcG9uZW50Um9vdEVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChjb21wb25lbnRSb290RWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZpcnR1YWJsZUNvbXBvbmVudE1hcC5zZXQoY29udGFpbmVyLCB2aXJ0dWFibGVDb21wb25lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIudmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50ID0gdGhpcy5fY29udGFpbmVyVmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50TGlzdGVuZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci52aXJ0dWFsVmlzaWJpbGl0eUNoYW5nZVJlcXVpcmVkRXZlbnQgPSB0aGlzLl9jb250YWluZXJWaXJ0dWFsVmlzaWJpbGl0eUNoYW5nZVJlcXVpcmVkRXZlbnRMaXN0ZW5lcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLnZpcnR1YWxaSW5kZXhDaGFuZ2VSZXF1aXJlZEV2ZW50ID0gdGhpcy5fY29udGFpbmVyVmlydHVhbFpJbmRleENoYW5nZVJlcXVpcmVkRXZlbnRMaXN0ZW5lcjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyZWRDb21wb25lbnRNYXAuc2V0KGNvbnRhaW5lciwgY29tcG9uZW50KTtcclxuXHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHtcclxuICAgICAgICAgICAgICAgIHZpcnR1YWw6IGluc3RhbnRpYXRvci52aXJ0dWFsLFxyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50LFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBVc2UgZ2V0Q29tcG9uZW50RXZlbnRcclxuICAgICAgICAgICAgcmVzdWx0ID0gc3VwZXIuYmluZENvbXBvbmVudChjb250YWluZXIsIGl0ZW1Db25maWcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBvdmVycmlkZSB1bmJpbmRDb21wb25lbnQoY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIsIHZpcnR1YWw6IGJvb2xlYW4sIGNvbXBvbmVudDogQ29tcG9uZW50Q29udGFpbmVyLkNvbXBvbmVudCB8IHVuZGVmaW5lZCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHJlZ2lzdGVyZWRDb21wb25lbnQgPSB0aGlzLl9yZWdpc3RlcmVkQ29tcG9uZW50TWFwLmdldChjb250YWluZXIpO1xyXG4gICAgICAgIGlmIChyZWdpc3RlcmVkQ29tcG9uZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgc3VwZXIudW5iaW5kQ29tcG9uZW50KGNvbnRhaW5lciwgdmlydHVhbCwgY29tcG9uZW50KTsgLy8gd2FzIG5vdCBjcmVhdGVkIGZyb20gcmVnaXN0cmF0aW9uIHNvIHVzZSB2aXJ0dWFsIHVuYmluZCBldmVudHNcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCB2aXJ0dWFibGVDb21wb25lbnQgPSB0aGlzLl92aXJ0dWFibGVDb21wb25lbnRNYXAuZ2V0KGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIGlmICh2aXJ0dWFibGVDb21wb25lbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50Um9vdEVsZW1lbnQgPSB2aXJ0dWFibGVDb21wb25lbnQucm9vdEh0bWxFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFJvb3RFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0dMVUM3Nzc0MycsIGNvbnRhaW5lci50aXRsZSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUNoaWxkKGNvbXBvbmVudFJvb3RFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl92aXJ0dWFibGVDb21wb25lbnRNYXAuZGVsZXRlKGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb3ZlcnJpZGUgZmlyZUJlZm9yZVZpcnR1YWxSZWN0aW5nRXZlbnQoY291bnQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2dvbGRlbkxheW91dEJvdW5kaW5nQ2xpZW50UmVjdCA9IHRoaXMuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIHN1cGVyLmZpcmVCZWZvcmVWaXJ0dWFsUmVjdGluZ0V2ZW50KGNvdW50KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVDb250YWluZXJWaXJ0dWFsUmVjdGluZ1JlcXVpcmVkRXZlbnQoY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdmlydHVhYmxlQ29tcG9uZW50ID0gdGhpcy5fdmlydHVhYmxlQ29tcG9uZW50TWFwLmdldChjb250YWluZXIpO1xyXG4gICAgICAgIGlmICh2aXJ0dWFibGVDb21wb25lbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdHTEhDU0NFNTU5MzMnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCByb290RWxlbWVudCA9IHZpcnR1YWJsZUNvbXBvbmVudC5yb290SHRtbEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGlmIChyb290RWxlbWVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmluZEVycm9yKGkxOG5TdHJpbmdzW0kxOG5TdHJpbmdJZC5Db21wb25lbnRJc05vdFZpcnR1YWJsZV0gKyAnICcgKyBjb250YWluZXIudGl0bGUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyQm91bmRpbmdDbGllbnRSZWN0ID0gY29udGFpbmVyLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsZWZ0ID0gY29udGFpbmVyQm91bmRpbmdDbGllbnRSZWN0LmxlZnQgLSB0aGlzLl9nb2xkZW5MYXlvdXRCb3VuZGluZ0NsaWVudFJlY3QubGVmdDtcclxuICAgICAgICAgICAgICAgIHJvb3RFbGVtZW50LnN0eWxlLmxlZnQgPSBudW1iZXJUb1BpeGVscyhsZWZ0KTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRvcCA9IGNvbnRhaW5lckJvdW5kaW5nQ2xpZW50UmVjdC50b3AgLSB0aGlzLl9nb2xkZW5MYXlvdXRCb3VuZGluZ0NsaWVudFJlY3QudG9wO1xyXG4gICAgICAgICAgICAgICAgcm9vdEVsZW1lbnQuc3R5bGUudG9wID0gbnVtYmVyVG9QaXhlbHModG9wKTtcclxuICAgICAgICAgICAgICAgIHNldEVsZW1lbnRXaWR0aChyb290RWxlbWVudCwgd2lkdGgpO1xyXG4gICAgICAgICAgICAgICAgc2V0RWxlbWVudEhlaWdodChyb290RWxlbWVudCwgaGVpZ2h0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZUNvbnRhaW5lclZpcnR1YWxWaXNpYmlsaXR5Q2hhbmdlUmVxdWlyZWRFdmVudChjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgdmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHZpcnR1YWJsZUNvbXBvbmVudCA9IHRoaXMuX3ZpcnR1YWJsZUNvbXBvbmVudE1hcC5nZXQoY29udGFpbmVyKTtcclxuICAgICAgICBpZiAodmlydHVhYmxlQ29tcG9uZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignR0xIQ1ZWQ1JFNTU5MzQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCByb290RWxlbWVudCA9IHZpcnR1YWJsZUNvbXBvbmVudC5yb290SHRtbEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGlmIChyb290RWxlbWVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmluZEVycm9yKGkxOG5TdHJpbmdzW0kxOG5TdHJpbmdJZC5Db21wb25lbnRJc05vdFZpcnR1YWJsZV0gKyAnICcgKyBjb250YWluZXIudGl0bGUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2V0RWxlbWVudERpc3BsYXlWaXNpYmlsaXR5KHJvb3RFbGVtZW50LCB2aXNpYmxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZUNvbnRhaW5lclZpcnR1YWxaSW5kZXhDaGFuZ2VSZXF1aXJlZEV2ZW50KGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCBsb2dpY2FsWkluZGV4OiBMb2dpY2FsWkluZGV4LCBkZWZhdWx0WkluZGV4OiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCB2aXJ0dWFibGVDb21wb25lbnQgPSB0aGlzLl92aXJ0dWFibGVDb21wb25lbnRNYXAuZ2V0KGNvbnRhaW5lcik7XHJcbiAgICAgICAgaWYgKHZpcnR1YWJsZUNvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0dMSENWWklDUkU1NTkzNScpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvb3RFbGVtZW50ID0gdmlydHVhYmxlQ29tcG9uZW50LnJvb3RIdG1sRWxlbWVudDtcclxuICAgICAgICAgICAgaWYgKHJvb3RFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBCaW5kRXJyb3IoaTE4blN0cmluZ3NbSTE4blN0cmluZ0lkLkNvbXBvbmVudElzTm90VmlydHVhYmxlXSArICcgJyArIGNvbnRhaW5lci50aXRsZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByb290RWxlbWVudC5zdHlsZS56SW5kZXggPSBkZWZhdWx0WkluZGV4O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIEdvbGRlbkxheW91dCB7XHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIFZpcnR1YWJsZUNvbXBvbmVudCB7XHJcbiAgICAgICAgcm9vdEh0bWxFbGVtZW50OiBIVE1MRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgdHlwZSBDb21wb25lbnRDb25zdHJ1Y3RvciA9IG5ldyhjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgc3RhdGU6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCwgdmlydHVhbDogYm9vbGVhbikgPT4gQ29tcG9uZW50Q29udGFpbmVyLkNvbXBvbmVudDtcclxuICAgIGV4cG9ydCB0eXBlIENvbXBvbmVudEZhY3RvcnlGdW5jdGlvbiA9IChjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgc3RhdGU6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCwgdmlydHVhbDogYm9vbGVhbikgPT4gQ29tcG9uZW50Q29udGFpbmVyLkNvbXBvbmVudCB8IHVuZGVmaW5lZDtcclxuICAgIGV4cG9ydCB0eXBlIEdldENvbXBvbmVudENvbnN0cnVjdG9yQ2FsbGJhY2sgPSAodGhpczogdm9pZCwgY29uZmlnOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcpID0+IENvbXBvbmVudENvbnN0cnVjdG9yO1xyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50SW5zdGFudGlhdG9yIHtcclxuICAgICAgICBjb25zdHJ1Y3RvcjogQ29tcG9uZW50Q29uc3RydWN0b3IgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgZmFjdG9yeUZ1bmN0aW9uOiBDb21wb25lbnRGYWN0b3J5RnVuY3Rpb24gfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgdmlydHVhbDogYm9vbGVhbjtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcsIFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLCBSZXNvbHZlZExheW91dENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9yZXNvbHZlZC1jb25maWcnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRDb250YWluZXIgfSBmcm9tICcuLi9jb250YWluZXIvY29tcG9uZW50LWNvbnRhaW5lcic7XHJcbmltcG9ydCB7IFRhYiB9IGZyb20gJy4uL2NvbnRyb2xzL3RhYic7XHJcbmltcG9ydCB7IFVuZXhwZWN0ZWROdWxsRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi4vbGF5b3V0LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBEb21Db25zdGFudHMgfSBmcm9tICcuLi91dGlscy9kb20tY29uc3RhbnRzJztcclxuaW1wb3J0IHsgSXRlbVR5cGUsIEpzb25WYWx1ZSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcclxuaW1wb3J0IHsgZ2V0RWxlbWVudFdpZHRoQW5kSGVpZ2h0LCBzZXRFbGVtZW50SGVpZ2h0LCBzZXRFbGVtZW50V2lkdGggfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcbmltcG9ydCB7IENvbXBvbmVudFBhcmVudGFibGVJdGVtIH0gZnJvbSAnLi9jb21wb25lbnQtcGFyZW50YWJsZS1pdGVtJztcclxuaW1wb3J0IHsgQ29udGVudEl0ZW0gfSBmcm9tICcuL2NvbnRlbnQtaXRlbSc7XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50SXRlbSBleHRlbmRzIENvbnRlbnRJdGVtIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3Jlb3JkZXJFbmFibGVkOiBib29sZWFuO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaGVhZGVyQ29uZmlnOiBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXIgfCB1bmRlZmluZWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF90aXRsZTogc3RyaW5nO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaW5pdGlhbFdhbnRNYXhpbWlzZTogYm9vbGVhbjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2NvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfdGFiOiBUYWI7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9mb2N1c2VkID0gZmFsc2U7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChDb21wb25lbnRJdGVtOmNsYXNzKS5jb21wb25lbnRUeXBlfSAqL1xyXG4gICAgZ2V0IGNvbXBvbmVudE5hbWUoKTogSnNvblZhbHVlIHsgcmV0dXJuIHRoaXMuX2NvbnRhaW5lci5jb21wb25lbnRUeXBlOyB9XHJcbiAgICBnZXQgY29tcG9uZW50VHlwZSgpOiBKc29uVmFsdWUgeyByZXR1cm4gdGhpcy5fY29udGFpbmVyLmNvbXBvbmVudFR5cGU7IH1cclxuICAgIGdldCByZW9yZGVyRW5hYmxlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3Jlb3JkZXJFbmFibGVkOyB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBnZXQgaW5pdGlhbFdhbnRNYXhpbWlzZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2luaXRpYWxXYW50TWF4aW1pc2U7IH1cclxuICAgIGdldCBjb21wb25lbnQoKTogQ29tcG9uZW50Q29udGFpbmVyLkNvbXBvbmVudCB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9jb250YWluZXIuY29tcG9uZW50OyB9XHJcbiAgICBnZXQgY29udGFpbmVyKCk6IENvbXBvbmVudENvbnRhaW5lciB7IHJldHVybiB0aGlzLl9jb250YWluZXI7IH1cclxuICAgIGdldCBwYXJlbnRJdGVtKCk6IENvbXBvbmVudFBhcmVudGFibGVJdGVtIHsgcmV0dXJuIHRoaXMuX3BhcmVudEl0ZW07IH1cclxuXHJcbiAgICBnZXQgaGVhZGVyQ29uZmlnKCk6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlciB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9oZWFkZXJDb25maWc7IH1cclxuICAgIGdldCB0aXRsZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fdGl0bGU7IH1cclxuICAgIGdldCB0YWIoKTogVGFiIHsgcmV0dXJuIHRoaXMuX3RhYjsgfVxyXG4gICAgZ2V0IGZvY3VzZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9mb2N1c2VkOyB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgbGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlcixcclxuICAgICAgICBjb25maWc6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfcGFyZW50SXRlbTogQ29tcG9uZW50UGFyZW50YWJsZUl0ZW1cclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKGxheW91dE1hbmFnZXIsIGNvbmZpZywgX3BhcmVudEl0ZW0sIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTtcclxuXHJcbiAgICAgICAgdGhpcy5pc0NvbXBvbmVudCA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuX3Jlb3JkZXJFbmFibGVkID0gY29uZmlnLnJlb3JkZXJFbmFibGVkO1xyXG5cclxuICAgICAgICB0aGlzLmFwcGx5VXBkYXRhYmxlQ29uZmlnKGNvbmZpZyk7XHJcblxyXG4gICAgICAgIHRoaXMuX2luaXRpYWxXYW50TWF4aW1pc2UgPSBjb25maWcubWF4aW1pc2VkO1xyXG5cclxuICAgICAgICBjb25zdCBjb250YWluZXJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgY29udGFpbmVyRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuQ29udGVudCk7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKGNvbnRhaW5lckVsZW1lbnQpO1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lciA9IG5ldyBDb21wb25lbnRDb250YWluZXIoY29uZmlnLCB0aGlzLCBsYXlvdXRNYW5hZ2VyLCBjb250YWluZXJFbGVtZW50LFxyXG4gICAgICAgICAgICAoaXRlbUNvbmZpZykgPT4gdGhpcy5oYW5kbGVVcGRhdGVJdGVtQ29uZmlnRXZlbnQoaXRlbUNvbmZpZyksXHJcbiAgICAgICAgICAgICgpID0+IHRoaXMuc2hvdygpLFxyXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmhpZGUoKSxcclxuICAgICAgICAgICAgKHN1cHByZXNzRXZlbnQpID0+IHRoaXMuZm9jdXMoc3VwcHJlc3NFdmVudCksXHJcbiAgICAgICAgICAgIChzdXBwcmVzc0V2ZW50KSA9PiB0aGlzLmJsdXIoc3VwcHJlc3NFdmVudCksXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBvdmVycmlkZSBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5kZXN0cm95KClcclxuICAgICAgICBzdXBlci5kZXN0cm95KCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwbHlVcGRhdGFibGVDb25maWcoY29uZmlnOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNldFRpdGxlKGNvbmZpZy50aXRsZSk7XHJcbiAgICAgICAgdGhpcy5faGVhZGVyQ29uZmlnID0gY29uZmlnLmhlYWRlcjtcclxuICAgIH1cclxuXHJcbiAgICB0b0NvbmZpZygpOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcge1xyXG4gICAgICAgIGNvbnN0IHN0YXRlUmVxdWVzdEV2ZW50ID0gdGhpcy5fY29udGFpbmVyLnN0YXRlUmVxdWVzdEV2ZW50O1xyXG4gICAgICAgIGNvbnN0IHN0YXRlID0gc3RhdGVSZXF1ZXN0RXZlbnQgPT09IHVuZGVmaW5lZCA/IHRoaXMuX2NvbnRhaW5lci5zdGF0ZSA6IHN0YXRlUmVxdWVzdEV2ZW50KCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiBJdGVtVHlwZS5jb21wb25lbnQsXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IFtdLFxyXG4gICAgICAgICAgICBzaXplOiB0aGlzLnNpemUsXHJcbiAgICAgICAgICAgIHNpemVVbml0OiB0aGlzLnNpemVVbml0LFxyXG4gICAgICAgICAgICBtaW5TaXplOiB0aGlzLm1pblNpemUsXHJcbiAgICAgICAgICAgIG1pblNpemVVbml0OiB0aGlzLm1pblNpemVVbml0LFxyXG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcclxuICAgICAgICAgICAgbWF4aW1pc2VkOiBmYWxzZSxcclxuICAgICAgICAgICAgaXNDbG9zYWJsZTogdGhpcy5pc0Nsb3NhYmxlLFxyXG4gICAgICAgICAgICByZW9yZGVyRW5hYmxlZDogdGhpcy5fcmVvcmRlckVuYWJsZWQsXHJcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLl90aXRsZSxcclxuICAgICAgICAgICAgaGVhZGVyOiBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXIuY3JlYXRlQ29weSh0aGlzLl9oZWFkZXJDb25maWcpLFxyXG4gICAgICAgICAgICBjb21wb25lbnRUeXBlOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcuY29weUNvbXBvbmVudFR5cGUodGhpcy5jb21wb25lbnRUeXBlKSxcclxuICAgICAgICAgICAgY29tcG9uZW50U3RhdGU6IHN0YXRlLFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBjbG9zZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5wYXJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0NJQzY4ODgzJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5wYXJlbnQucmVtb3ZlQ2hpbGQodGhpcywgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBVc2VkIGJ5IERyYWcgUHJveHlcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGVudGVyRHJhZ01vZGUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBzZXRFbGVtZW50V2lkdGgodGhpcy5lbGVtZW50LCB3aWR0aCk7XHJcbiAgICAgICAgc2V0RWxlbWVudEhlaWdodCh0aGlzLmVsZW1lbnQsIGhlaWdodCk7XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmVudGVyRHJhZ01vZGUod2lkdGgsIGhlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhpdERyYWdNb2RlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5leGl0RHJhZ01vZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBlbnRlclN0YWNrTWF4aW1pc2VkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5lbnRlclN0YWNrTWF4aW1pc2VkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhpdFN0YWNrTWF4aW1pc2VkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5leGl0U3RhY2tNYXhpbWlzZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBVc2VkIGJ5IERyYWcgUHJveHlcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGRyYWcoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLmRyYWcoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBnZXRPdXRlckJvdW5kaW5nQ2xpZW50UmVjdCgpOiBET01SZWN0IHsgXHJcbiAgICAgICAgY29uc3QgcmVjdCA9IHRoaXMuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBjb25zdCBzaG93ID0gdGhpcy5oZWFkZXJDb25maWc/LnNob3c7XHJcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gUmVzb2x2ZWRMYXlvdXRDb25maWcuRGltZW5zaW9ucy5kZWZhdWx0cy5oZWFkZXJIZWlnaHQ7XHJcblxyXG4gICAgICAgIGNvbnN0IGhlYWRlcldpZHRoID0gKHNob3cgPT09ICdsZWZ0JyB8fCBzaG93ID09PSAncmlnaHQnKSA/IGhlaWdodCA6IDA7XHJcbiAgICAgICAgY29uc3QgaGVhZGVySGVpZ2h0ID0gKHNob3cgPT09ICd0b3AnIHx8IHNob3cgPT09ICdib3R0b20nIHx8IHNob3cgPT09IHVuZGVmaW5lZCkgPyBoZWlnaHQgOiAwO1xyXG5cclxuICAgICAgICByZXR1cm4gRE9NUmVjdC5mcm9tUmVjdCh7XHJcbiAgICAgICAgICAgIHg6IHJlY3QubGVmdCAtIGhlYWRlcldpZHRoLFxyXG4gICAgICAgICAgICB5OiByZWN0LnRvcCAtIGhlYWRlckhlaWdodCxcclxuICAgICAgICAgICAgd2lkdGg6IHJlY3Qud2lkdGggKyBoZWFkZXJXaWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiByZWN0LmhlaWdodCArIGhlYWRlckhlaWdodCxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBvdmVycmlkZSB1cGRhdGVTaXplKGZvcmNlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVOb2RlU2l6ZShmb3JjZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgaW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZU5vZGVTaXplKGZhbHNlKTtcclxuXHJcbiAgICAgICAgc3VwZXIuaW5pdCgpO1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5lbWl0KCdvcGVuJyk7XHJcbiAgICAgICAgdGhpcy5pbml0Q29udGVudEl0ZW1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhpcyBjb21wb25lbnQncyB0aXRsZVxyXG4gICAgICpcclxuICAgICAqIEBwdWJsaWNcclxuICAgICAqIEBwYXJhbSB0aXRsZSAtXHJcbiAgICAgKi9cclxuXHJcbiAgICBzZXRUaXRsZSh0aXRsZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdGl0bGUgPSB0aXRsZTtcclxuICAgICAgICB0aGlzLmVtaXQoJ3RpdGxlQ2hhbmdlZCcsIHRpdGxlKTtcclxuICAgICAgICB0aGlzLmVtaXQoJ3N0YXRlQ2hhbmdlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFRhYih0YWI6IFRhYik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3RhYiA9IHRhYjtcclxuICAgICAgICB0aGlzLmVtaXQoJ3RhYicsIHRhYilcclxuICAgICAgICB0aGlzLl9jb250YWluZXIuc2V0VGFiKHRhYik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgaGlkZSgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyLnNldFZpc2liaWxpdHkoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIG92ZXJyaWRlIHNob3coKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIuc2hvdygpO1xyXG4gICAgICAgIHRoaXMuX2NvbnRhaW5lci5zZXRWaXNpYmlsaXR5KHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRm9jdXNlcyB0aGUgaXRlbSBpZiBpdCBpcyBub3QgYWxyZWFkeSBmb2N1c2VkXHJcbiAgICAgKi9cclxuICAgIGZvY3VzKHN1cHByZXNzRXZlbnQgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGFyZW50SXRlbS5zZXRBY3RpdmVDb21wb25lbnRJdGVtKHRoaXMsIHRydWUsIHN1cHByZXNzRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHNldEZvY3VzZWQoc3VwcHJlc3NFdmVudDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2ZvY3VzZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMudGFiLnNldEZvY3VzZWQoKTtcclxuICAgICAgICBpZiAoIXN1cHByZXNzRXZlbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0QmFzZUJ1YmJsaW5nRXZlbnQoJ2ZvY3VzJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQmx1cnMgKGRlZm9jdXNlcykgdGhlIGl0ZW0gaWYgaXQgaXMgZm9jdXNlZFxyXG4gICAgICovXHJcbiAgICBibHVyKHN1cHByZXNzRXZlbnQgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9mb2N1c2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5zZXRGb2N1c2VkQ29tcG9uZW50SXRlbSh1bmRlZmluZWQsIHN1cHByZXNzRXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBzZXRCbHVycmVkKHN1cHByZXNzRXZlbnQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9mb2N1c2VkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy50YWIuc2V0Qmx1cnJlZCgpO1xyXG4gICAgICAgIGlmICghc3VwcHJlc3NFdmVudCkge1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRCYXNlQnViYmxpbmdFdmVudCgnYmx1cicpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc2V0UGFyZW50KHBhcmVudDogQ29udGVudEl0ZW0pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9wYXJlbnRJdGVtID0gcGFyZW50IGFzIENvbXBvbmVudFBhcmVudGFibGVJdGVtO1xyXG4gICAgICAgIHN1cGVyLnNldFBhcmVudChwYXJlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlVXBkYXRlSXRlbUNvbmZpZ0V2ZW50KGl0ZW1Db25maWc6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZykge1xyXG4gICAgICAgIHRoaXMuYXBwbHlVcGRhdGFibGVDb25maWcoaXRlbUNvbmZpZyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSB1cGRhdGVOb2RlU2l6ZShmb3JjZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmVsZW1lbnQuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnKSB7XHJcbiAgICAgICAgICAgIC8vIERvIG5vdCB1cGRhdGUgc2l6ZSBvZiBoaWRkZW4gY29tcG9uZW50cyB0byBwcmV2ZW50IHVud2FudGVkIHJlZmxvd3NcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gZ2V0RWxlbWVudFdpZHRoQW5kSGVpZ2h0KHRoaXMuZWxlbWVudCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5zZXRTaXplVG9Ob2RlU2l6ZSh3aWR0aCwgaGVpZ2h0LCBmb3JjZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIChDb21wb25lbnRJdGVtOmNsYXNzKX0gKi9cclxuZXhwb3J0IHR5cGUgQ29tcG9uZW50ID0gQ29tcG9uZW50SXRlbTtcclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgQ29tcG9uZW50SXRlbSB7XHJcbiAgICBleHBvcnQgdHlwZSBDb21wb25lbnQgPSBDb21wb25lbnRDb250YWluZXIuQ29tcG9uZW50O1xyXG59XHJcbiIsImltcG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuL2NvbXBvbmVudC1pdGVtJztcclxuaW1wb3J0IHsgQ29udGVudEl0ZW0gfSBmcm9tICcuL2NvbnRlbnQtaXRlbSc7XHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29tcG9uZW50UGFyZW50YWJsZUl0ZW0gZXh0ZW5kcyBDb250ZW50SXRlbSB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9mb2N1c2VkID0gZmFsc2U7XHJcblxyXG4gICAgZ2V0IGZvY3VzZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9mb2N1c2VkOyB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc2V0Rm9jdXNlZFZhbHVlKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZm9jdXNlZCA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFic3RyYWN0IHNldEFjdGl2ZUNvbXBvbmVudEl0ZW0oaXRlbTogQ29tcG9uZW50SXRlbSwgZm9jdXM6IGJvb2xlYW4sIHN1cHByZXNzRm9jdXNFdmVudDogYm9vbGVhbik6IHZvaWQ7XHJcbn1cclxuIiwiaW1wb3J0IHsgUmVzb2x2ZWRJdGVtQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL3Jlc29sdmVkLWNvbmZpZydcclxuaW1wb3J0IHsgQnJvd3NlclBvcG91dCB9IGZyb20gJy4uL2NvbnRyb2xzL2Jyb3dzZXItcG9wb3V0J1xyXG5pbXBvcnQgeyBBc3NlcnRFcnJvciwgVW5leHBlY3RlZE51bGxFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcidcclxuaW1wb3J0IHsgTGF5b3V0TWFuYWdlciB9IGZyb20gJy4uL2xheW91dC1tYW5hZ2VyJ1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuLi91dGlscy9ldmVudC1lbWl0dGVyJ1xyXG5pbXBvcnQgeyBBcmVhTGlua2VkUmVjdCwgSXRlbVR5cGUsIFNpemVVbml0RW51bSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJ1xyXG5pbXBvcnQgeyBnZXRVbmlxdWVJZCwgc2V0RWxlbWVudERpc3BsYXlWaXNpYmlsaXR5IH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnXHJcbmltcG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuL2NvbXBvbmVudC1pdGVtJ1xyXG5pbXBvcnQgeyBDb21wb25lbnRQYXJlbnRhYmxlSXRlbSB9IGZyb20gJy4vY29tcG9uZW50LXBhcmVudGFibGUtaXRlbSdcclxuaW1wb3J0IHsgU3RhY2sgfSBmcm9tICcuL3N0YWNrJ1xyXG5cclxuLyoqXHJcbiAqIFRoaXMgaXMgdGhlIGJhc2VjbGFzcyB0aGF0IGFsbCBjb250ZW50IGl0ZW1zIGluaGVyaXQgZnJvbS5cclxuICogTW9zdCBtZXRob2RzIHByb3ZpZGUgYSBzdWJzZXQgb2Ygd2hhdCB0aGUgc3ViLWNsYXNzZXMgZG8uXHJcbiAqXHJcbiAqIEl0IGFsc28gcHJvdmlkZXMgYSBudW1iZXIgb2YgZnVuY3Rpb25zIGZvciB0cmVlIHRyYXZlcnNhbFxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbnRlbnRJdGVtIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3R5cGU6IEl0ZW1UeXBlO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaWQ6IHN0cmluZztcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3BvcEluUGFyZW50SWRzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfY29udGVudEl0ZW1zOiBDb250ZW50SXRlbVtdO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaXNDbG9zYWJsZTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3BlbmRpbmdFdmVudFByb3BhZ2F0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF90aHJvdHRsZWRFdmVudHM6IHN0cmluZ1tdO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaXNJbml0aWFsaXNlZDtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBzaXplOiBudW1iZXI7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBzaXplVW5pdDogU2l6ZVVuaXRFbnVtO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgbWluU2l6ZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgbWluU2l6ZVVuaXQ6IFNpemVVbml0RW51bTtcclxuXHJcbiAgICBpc0dyb3VuZDogYm9vbGVhblxyXG4gICAgaXNSb3c6IGJvb2xlYW5cclxuICAgIGlzQ29sdW1uOiBib29sZWFuXHJcbiAgICBpc1N0YWNrOiBib29sZWFuXHJcbiAgICBpc0NvbXBvbmVudDogYm9vbGVhblxyXG5cclxuICAgIGdldCB0eXBlKCk6IEl0ZW1UeXBlIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH1cclxuICAgIGdldCBpZCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5faWQ7IH1cclxuICAgIHNldCBpZCh2YWx1ZTogc3RyaW5nKSB7IHRoaXMuX2lkID0gdmFsdWU7IH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGdldCBwb3BJblBhcmVudElkcygpOiBzdHJpbmdbXSB7IHJldHVybiB0aGlzLl9wb3BJblBhcmVudElkczsgfVxyXG4gICAgZ2V0IHBhcmVudCgpOiBDb250ZW50SXRlbSB8IG51bGwgeyByZXR1cm4gdGhpcy5fcGFyZW50OyB9XHJcbiAgICBnZXQgY29udGVudEl0ZW1zKCk6IENvbnRlbnRJdGVtW10geyByZXR1cm4gdGhpcy5fY29udGVudEl0ZW1zOyB9XHJcbiAgICBnZXQgaXNDbG9zYWJsZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2lzQ2xvc2FibGU7IH1cclxuICAgIGdldCBlbGVtZW50KCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7IH1cclxuICAgIGdldCBpc0luaXRpYWxpc2VkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5faXNJbml0aWFsaXNlZDsgfVxyXG5cclxuICAgIHN0YXRpYyBpc1N0YWNrKGl0ZW06IENvbnRlbnRJdGVtKTogaXRlbSBpcyBTdGFjayB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW0uaXNTdGFjaztcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNDb21wb25lbnRJdGVtKGl0ZW06IENvbnRlbnRJdGVtKTogaXRlbSBpcyBDb21wb25lbnRJdGVtIHtcclxuICAgICAgICByZXR1cm4gaXRlbS5pc0NvbXBvbmVudDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNDb21wb25lbnRQYXJlbnRhYmxlSXRlbShpdGVtOiBDb250ZW50SXRlbSk6IGl0ZW0gaXMgQ29tcG9uZW50UGFyZW50YWJsZUl0ZW0ge1xyXG4gICAgICAgIHJldHVybiBpdGVtLmlzU3RhY2sgfHwgaXRlbS5pc0dyb3VuZDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgbGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlcixcclxuICAgICAgICBjb25maWc6IFJlc29sdmVkSXRlbUNvbmZpZyxcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfcGFyZW50OiBDb250ZW50SXRlbSB8IG51bGwsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX2VsZW1lbnQ6IEhUTUxFbGVtZW50XHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICB0aGlzLl90eXBlID0gY29uZmlnLnR5cGU7XHJcbiAgICAgICAgdGhpcy5faWQgPSBjb25maWcuaWQ7XHJcblxyXG4gICAgICAgIHRoaXMuX2lzSW5pdGlhbGlzZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzR3JvdW5kID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc1JvdyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNDb2x1bW4gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzU3RhY2sgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzQ29tcG9uZW50ID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMuc2l6ZSA9IGNvbmZpZy5zaXplO1xyXG4gICAgICAgIHRoaXMuc2l6ZVVuaXQgPSBjb25maWcuc2l6ZVVuaXQ7XHJcbiAgICAgICAgdGhpcy5taW5TaXplID0gY29uZmlnLm1pblNpemU7XHJcbiAgICAgICAgdGhpcy5taW5TaXplVW5pdCA9IGNvbmZpZy5taW5TaXplVW5pdDtcclxuXHJcbiAgICAgICAgdGhpcy5faXNDbG9zYWJsZSA9IGNvbmZpZy5pc0Nsb3NhYmxlO1xyXG5cclxuICAgICAgICB0aGlzLl9wZW5kaW5nRXZlbnRQcm9wYWdhdGlvbnMgPSB7fTtcclxuICAgICAgICB0aGlzLl90aHJvdHRsZWRFdmVudHMgPSBbJ3N0YXRlQ2hhbmdlZCddO1xyXG5cclxuICAgICAgICB0aGlzLl9jb250ZW50SXRlbXMgPSB0aGlzLmNyZWF0ZUNvbnRlbnRJdGVtcyhjb25maWcuY29udGVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVycyB0aGUgc2l6ZSBvZiB0aGUgY29tcG9uZW50IGFuZCBpdHMgY2hpbGRyZW4sIGNhbGxlZCByZWN1cnNpdmVseVxyXG4gICAgICogQHBhcmFtIGZvcmNlIC0gSW4gc29tZSBjYXNlcyB0aGUgc2l6ZSBpcyBub3QgdXBkYXRlZCBpZiBpdCBoYXMgbm90IGNoYW5nZWQuIEluIHRoaXMgY2FzZSwgZXZlbnRzXHJcbiAgICAgKiAoc3VjaCBhcyBDb21wb25lbnRDb250YWluZXIudmlydHVhbFJlY3RpbmdSZXF1aXJlZEV2ZW50KSBhcmUgbm90IGZpcmVkLiBTZXR0aW5nIGZvcmNlIHRvIHRydWUsIGVuc3VyZXMgdGhlIHNpemUgaXMgdXBkYXRlZCByZWdhcmRsZXNzLCBhbmRcclxuICAgICAqIHRoZSByZXNwZWN0aXZlIGV2ZW50cyBhcmUgZmlyZWQuIFRoaXMgaXMgc29tZXRpbWVzIG5lY2Vzc2FyeSB3aGVuIGEgY29tcG9uZW50J3Mgc2l6ZSBoYXMgbm90IGNoYW5nZWQgYnV0IGl0IGhhcyBiZWNvbWUgdmlzaWJsZSwgYW5kIHRoZVxyXG4gICAgICogcmVsZXZhbnQgZXZlbnRzIG5lZWQgdG8gYmUgZmlyZWQuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgYWJzdHJhY3QgdXBkYXRlU2l6ZShmb3JjZTogYm9vbGVhbik6IHZvaWQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGEgY2hpbGQgbm9kZSAoYW5kIGl0cyBjaGlsZHJlbikgZnJvbSB0aGUgdHJlZVxyXG4gICAgICogQHBhcmFtIGNvbnRlbnRJdGVtIC0gVGhlIGNoaWxkIGl0ZW0gdG8gcmVtb3ZlXHJcbiAgICAgKiBAcGFyYW0ga2VlcENoaWxkIC0gV2hldGhlciB0byBkZXN0cm95IHRoZSByZW1vdmVkIGl0ZW1cclxuICAgICAqL1xyXG4gICAgcmVtb3ZlQ2hpbGQoY29udGVudEl0ZW06IENvbnRlbnRJdGVtLCBrZWVwQ2hpbGQgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIC8qXHJcbiAgICAgICAgICogR2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgaXRlbSB0aGF0J3MgdG8gYmUgcmVtb3ZlZCB3aXRoaW4gYWxsIGNvbnRlbnQgaXRlbXMgdGhpcyBub2RlIGNvbnRhaW5zXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9jb250ZW50SXRlbXMuaW5kZXhPZihjb250ZW50SXRlbSk7XHJcblxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgICogTWFrZSBzdXJlIHRoZSBjb250ZW50IGl0ZW0gdG8gYmUgcmVtb3ZlZCBpcyBhY3R1YWxseSBhIGNoaWxkIG9mIHRoaXMgaXRlbVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IHJlbW92ZSBjaGlsZCBpdGVtLiBVbmtub3duIGNvbnRlbnQgaXRlbScpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcblx0XHQgKiBDYWxsIGRlc3Ryb3kgb24gdGhlIGNvbnRlbnQgaXRlbS5cclxuXHRcdCAqIEFsbCBjaGlsZHJlbiBhcmUgZGVzdHJveWVkIGFzIHdlbGxcclxuXHRcdCAqL1xyXG4gICAgICAgIGlmICgha2VlcENoaWxkKSB7XHJcblx0XHRcdHRoaXMuX2NvbnRlbnRJdGVtc1tpbmRleF0uZGVzdHJveSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUmVtb3ZlIHRoZSBjb250ZW50IGl0ZW0gZnJvbSB0aGlzIG5vZGVzIGFycmF5IG9mIGNoaWxkcmVuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fY29udGVudEl0ZW1zLnNwbGljZShpbmRleCwgMSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElmIHRoaXMgbm9kZSBzdGlsbCBjb250YWlucyBvdGhlciBjb250ZW50IGl0ZW1zLCBhZGp1c3QgdGhlaXIgc2l6ZVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICh0aGlzLl9jb250ZW50SXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoZmFsc2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBJZiB0aGlzIHdhcyB0aGUgbGFzdCBjb250ZW50IGl0ZW0sIHJlbW92ZSB0aGlzIG5vZGUgYXMgd2VsbFxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgLy8gaWYgKCF0aGlzLmlzR3JvdW5kICYmIHRoaXMuX2lzQ2xvc2FibGUgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzR3JvdW5kKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcGFyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0NJVUMwMDg3NCcpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHVwIHRoZSB0cmVlIHN0cnVjdHVyZSBmb3IgdGhlIG5ld2x5IGFkZGVkIGNoaWxkXHJcbiAgICAgKiBUaGUgcmVzcG9uc2liaWxpdHkgZm9yIHRoZSBhY3R1YWwgRE9NIG1hbmlwdWxhdGlvbnMgbGllc1xyXG4gICAgICogd2l0aCB0aGUgY29uY3JldGUgaXRlbVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBjb250ZW50SXRlbSAtXHJcbiAgICAgKiBAcGFyYW0gaW5kZXggLSBJZiBvbWl0dGVkIGl0ZW0gd2lsbCBiZSBhcHBlbmRlZFxyXG4gICAgICogQHBhcmFtIHN1c3BlbmRSZXNpemUgLSBVc2VkIGJ5IGRlc2NlbmRlbnQgaW1wbGVtZW50YXRpb25zXHJcbiAgICAgKi9cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIGFkZENoaWxkKGNvbnRlbnRJdGVtOiBDb250ZW50SXRlbSwgaW5kZXg/OiBudW1iZXIgfCBudWxsLCBzdXNwZW5kUmVzaXplPzogYm9vbGVhbik6IG51bWJlciB7XHJcbiAgICAgICAgaW5kZXggPz89IHRoaXMuX2NvbnRlbnRJdGVtcy5sZW5ndGg7XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbnRlbnRJdGVtcy5zcGxpY2UoaW5kZXgsIDAsIGNvbnRlbnRJdGVtKTtcclxuICAgICAgICBjb250ZW50SXRlbS5zZXRQYXJlbnQodGhpcyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9pc0luaXRpYWxpc2VkID09PSB0cnVlICYmIGNvbnRlbnRJdGVtLl9pc0luaXRpYWxpc2VkID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICBjb250ZW50SXRlbS5pbml0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaW5kZXg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXBsYWNlcyBvbGRDaGlsZCB3aXRoIG5ld0NoaWxkXHJcbiAgICAgKiBAcGFyYW0gb2xkQ2hpbGQgLVxyXG4gICAgICogQHBhcmFtIG5ld0NoaWxkIC1cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICByZXBsYWNlQ2hpbGQob2xkQ2hpbGQ6IENvbnRlbnRJdGVtLCBuZXdDaGlsZDogQ29udGVudEl0ZW0sIGRlc3Ryb3lPbGRDaGlsZCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgLy8gRG8gbm90IHRyeSB0byByZXBsYWNlIENvbXBvbmVudEl0ZW0gLSB3aWxsIG5vdCB3b3JrXHJcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9jb250ZW50SXRlbXMuaW5kZXhPZihvbGRDaGlsZCk7XHJcbiAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IG9sZENoaWxkLl9lbGVtZW50LnBhcmVudE5vZGU7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdDSVJDSTIzMjMyJywgJ0NhblxcJ3QgcmVwbGFjZSBjaGlsZC4gb2xkQ2hpbGQgaXMgbm90IGNoaWxkIG9mIHRoaXMnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChwYXJlbnROb2RlID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdDSVJDUDIzMjMyJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobmV3Q2hpbGQuX2VsZW1lbnQsIG9sZENoaWxkLl9lbGVtZW50KTtcclxuXHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICogT3B0aW9uYWxseSBkZXN0cm95IHRoZSBvbGQgY29udGVudCBpdGVtXHJcbiAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGlmIChkZXN0cm95T2xkQ2hpbGQgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIG9sZENoaWxkLl9wYXJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgb2xkQ2hpbGQuZGVzdHJveSgpOyAvLyB3aWxsIG5vdyBhbHNvIGRlc3Ryb3kgYWxsIGNoaWxkcmVuIG9mIG9sZENoaWxkXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICogV2lyZSB0aGUgbmV3IGNvbnRlbnRJdGVtIGludG8gdGhlIHRyZWVcclxuICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgdGhpcy5fY29udGVudEl0ZW1zW2luZGV4XSA9IG5ld0NoaWxkO1xyXG4gICAgICAgICAgICBuZXdDaGlsZC5zZXRQYXJlbnQodGhpcyk7XHJcbiAgICAgICAgICAgIC8vIG5ld0NoaWxkIGluaGVyaXRzIHRoZSBzaXplcyBmcm9tIHRoZSBvbGQgY2hpbGQ6XHJcbiAgICAgICAgICAgIG5ld0NoaWxkLnNpemUgPSBvbGRDaGlsZC5zaXplO1xyXG4gICAgICAgICAgICBuZXdDaGlsZC5zaXplVW5pdCA9IG9sZENoaWxkLnNpemVVbml0O1xyXG4gICAgICAgICAgICBuZXdDaGlsZC5taW5TaXplID0gb2xkQ2hpbGQubWluU2l6ZTtcclxuICAgICAgICAgICAgbmV3Q2hpbGQubWluU2l6ZVVuaXQgPSBvbGRDaGlsZC5taW5TaXplVW5pdDtcclxuXHJcbiAgICAgICAgICAgIC8vVE9ETyBUaGlzIGRvZXNuJ3QgdXBkYXRlIHRoZSBjb25maWcuLi4gcmVmYWN0b3IgdG8gbGVhdmUgaXRlbSBub2RlcyB1bnRvdWNoZWQgYWZ0ZXIgY3JlYXRpb25cclxuICAgICAgICAgICAgaWYgKG5ld0NoaWxkLl9wYXJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdDSVJDTkM0NTY5OScpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKG5ld0NoaWxkLl9wYXJlbnQuX2lzSW5pdGlhbGlzZWQgPT09IHRydWUgJiYgbmV3Q2hpbGQuX2lzSW5pdGlhbGlzZWQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3Q2hpbGQuaW5pdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZShmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QuXHJcbiAgICAgKiBTaG9ydGhhbmQgZm9yIHRoaXMucGFyZW50LnJlbW92ZUNoaWxkKCB0aGlzIClcclxuICAgICAqL1xyXG4gICAgcmVtb3ZlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9wYXJlbnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0NJUjExMTEwJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZXMgdGhlIGNvbXBvbmVudCBmcm9tIHRoZSBsYXlvdXQgYW5kIGNyZWF0ZXMgYSBuZXdcclxuICAgICAqIGJyb3dzZXIgd2luZG93IHdpdGggdGhlIGNvbXBvbmVudCBhbmQgaXRzIGNoaWxkcmVuIGluc2lkZVxyXG4gICAgICovXHJcbiAgICBwb3BvdXQoKTogQnJvd3NlclBvcG91dCB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50SWQgPSBnZXRVbmlxdWVJZCgpO1xyXG4gICAgICAgIGNvbnN0IGJyb3dzZXJQb3BvdXQgPSB0aGlzLmxheW91dE1hbmFnZXIuY3JlYXRlUG9wb3V0RnJvbUNvbnRlbnRJdGVtKHRoaXMsIHVuZGVmaW5lZCwgcGFyZW50SWQsIHVuZGVmaW5lZCk7XHJcbiAgICAgICAgdGhpcy5lbWl0QmFzZUJ1YmJsaW5nRXZlbnQoJ3N0YXRlQ2hhbmdlZCcpO1xyXG4gICAgICAgIHJldHVybiBicm93c2VyUG9wb3V0O1xyXG4gICAgfVxyXG5cclxuICAgIGFic3RyYWN0IHRvQ29uZmlnKCk6IFJlc29sdmVkSXRlbUNvbmZpZztcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjYWxjdWxhdGVDb25maWdDb250ZW50KCk6IFJlc29sdmVkSXRlbUNvbmZpZ1tdIHtcclxuICAgICAgICBjb25zdCBjb250ZW50SXRlbXMgPSB0aGlzLl9jb250ZW50SXRlbXM7XHJcbiAgICAgICAgY29uc3QgY291bnQgPSBjb250ZW50SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxSZXNvbHZlZEl0ZW1Db25maWc+KGNvdW50KTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IGNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgcmVzdWx0W2ldID0gaXRlbS50b0NvbmZpZygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGhpZ2hsaWdodERyb3Bab25lKHg6IG51bWJlciwgeTogbnVtYmVyLCBhcmVhOiBBcmVhTGlua2VkUmVjdCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGRyb3BUYXJnZXRJbmRpY2F0b3IgPSB0aGlzLmxheW91dE1hbmFnZXIuZHJvcFRhcmdldEluZGljYXRvcjtcclxuICAgICAgICBpZiAoZHJvcFRhcmdldEluZGljYXRvciA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignQUNJSERaNTU5MycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRyb3BUYXJnZXRJbmRpY2F0b3IuaGlnaGxpZ2h0QXJlYShhcmVhLCAxKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgb25Ecm9wKGNvbnRlbnRJdGVtOiBDb250ZW50SXRlbSwgYXJlYTogQ29udGVudEl0ZW0uQXJlYSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYWRkQ2hpbGQoY29udGVudEl0ZW0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHNob3coKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmJlZ2luU2l6ZUludmFsaWRhdGlvbigpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vIE5vdCBzdXJlIHdoeSBzaG93QWxsQWN0aXZlQ29udGVudEl0ZW1zKCkgd2FzIGNhbGxlZC4gR29sZGVuTGF5b3V0IHNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IGl0LiAgTGVmdCBjb21tZW50ZWQgY29kZVxyXG4gICAgICAgICAgICAvLyBpbiBzb3VyY2UgaW4gY2FzZSBhIHJlYXNvbiBmb3IgaXQgYmVjb21lcyBhcHBhcmVudC5cclxuICAgICAgICAgICAgLy8gdGhpcy5sYXlvdXRNYW5hZ2VyLnNob3dBbGxBY3RpdmVDb250ZW50SXRlbXMoKTtcclxuICAgICAgICAgICAgc2V0RWxlbWVudERpc3BsYXlWaXNpYmlsaXR5KHRoaXMuX2VsZW1lbnQsIHRydWUpO1xyXG4gICAgICAgICAgICAvLyB0aGlzLmxheW91dE1hbmFnZXIudXBkYXRlU2l6ZUZyb21Db250YWluZXIoKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jb250ZW50SXRlbXNbaV0uc2hvdygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmVuZFNpemVJbnZhbGlkYXRpb24oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyB0aGlzIGl0ZW0gYW5kcyBpdHMgY2hpbGRyZW5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRJdGVtc1tpXS5kZXN0cm95KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2NvbnRlbnRJdGVtcyA9IFtdO1xyXG5cclxuICAgICAgICB0aGlzLmVtaXRCYXNlQnViYmxpbmdFdmVudCgnYmVmb3JlSXRlbURlc3Ryb3llZCcpO1xyXG4gICAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICAgICAgdGhpcy5lbWl0QmFzZUJ1YmJsaW5nRXZlbnQoJ2l0ZW1EZXN0cm95ZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGFyZWEgdGhlIGNvbXBvbmVudCBjdXJyZW50bHkgb2NjdXBpZXNcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBnZXRFbGVtZW50QXJlYShlbGVtZW50PzogSFRNTEVsZW1lbnQpOiBDb250ZW50SXRlbS5BcmVhIHtcclxuICAgICAgICBlbGVtZW50ID0gZWxlbWVudCA/PyB0aGlzLl9lbGVtZW50O1xyXG5cclxuICAgICAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBjb25zdCB0b3AgPSByZWN0LnRvcCArIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wO1xyXG4gICAgICAgIGNvbnN0IGxlZnQgPSByZWN0LmxlZnQgKyBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQ7XHJcblxyXG4gICAgICAgIGNvbnN0IHdpZHRoID0gcmVjdC53aWR0aDtcclxuICAgICAgICBjb25zdCBoZWlnaHQgPSByZWN0LmhlaWdodDtcclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgeDE6IGxlZnQsXHJcbiAgICAgICAgICAgIHkxOiB0b3AsXHJcbiAgICAgICAgICAgIHgyOiBsZWZ0ICsgd2lkdGgsXHJcbiAgICAgICAgICAgIHkyOiB0b3AgKyBoZWlnaHQsXHJcbiAgICAgICAgICAgIHN1cmZhY2U6IHdpZHRoICogaGVpZ2h0LFxyXG4gICAgICAgICAgICBjb250ZW50SXRlbTogdGhpc1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZmluZEFuY2VzdG9yV2l0aFNpYmxpbmdzKCk6IENvbnRlbnRJdGVtIHwgbnVsbCB7XHJcbiAgICAgICAgbGV0IGN1cnI6IENvbnRlbnRJdGVtIHwgbnVsbCA9IHRoaXM7XHJcblxyXG4gICAgICAgIHdoaWxlIChjdXJyICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyLnBhcmVudCAhPT0gbnVsbCAmJiBjdXJyLnBhcmVudC5jb250ZW50SXRlbXMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY3VyciA9IGN1cnIucGFyZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICogRmluZHMgYW4gYW5jZXN0b3IgdGhhdCB3aWxsIGV4aXN0IGV2ZW4gYWZ0ZXIgdGhlIGl0ZW0gaXMgcmVtb3ZlZCBhbmQgcmV0dXJucyBpdCBhcyBkb2NrIHBvaW50LlxyXG4gICAgICogXHJcbiAgICAgKiBAaW50ZXJuYWwgKi9cclxuICAgIGZpbmREb2NrUG9pbnQoKTogQ29udGVudEl0ZW0uRG9ja1BvaW50IHwgbnVsbCB7XHJcbiAgICAgICAgY29uc3QgYW5jaG9yID0gdGhpcy5maW5kQW5jZXN0b3JXaXRoU2libGluZ3MoKTtcclxuXHJcbiAgICAgICAgaWYgKGFuY2hvciAhPT0gbnVsbCAmJiBhbmNob3IucGFyZW50ICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gYW5jaG9yLnBhcmVudC5fY29udGVudEl0ZW1zLmluZGV4T2YoYW5jaG9yKTtcclxuICAgICAgICAgICAgcmV0dXJuIHsgcGFyZW50OiBhbmNob3IucGFyZW50LCBpbmRleCB9O1xyXG5cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubGF5b3V0TWFuYWdlci5ncm91bmRJdGVtKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHBhcmVudDogdGhpcy5sYXlvdXRNYW5hZ2VyLmdyb3VuZEl0ZW0sIGluZGV4OiBudWxsIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB0cmVlIG9mIGNvbnRlbnQgaXRlbXMgaXMgY3JlYXRlZCBpbiB0d28gc3RlcHM6IEZpcnN0IGFsbCBjb250ZW50IGl0ZW1zIGFyZSBpbnN0YW50aWF0ZWQsXHJcbiAgICAgKiB0aGVuIGluaXQgaXMgY2FsbGVkIHJlY3Vyc2l2ZWx5IGZyb20gdG9wIHRvIGJvdHRlbS4gVGhpcyBpcyB0aGUgYmFzaWMgaW5pdCBmdW5jdGlvbixcclxuICAgICAqIGl0IGNhbiBiZSB1c2VkLCBleHRlbmRlZCBvciBvdmVyd3JpdHRlbiBieSB0aGUgY29udGVudCBpdGVtc1xyXG4gICAgICpcclxuICAgICAqIEl0cyBiZWhhdmlvdXIgZGVwZW5kcyBvbiB0aGUgY29udGVudCBpdGVtXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgaW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpc2VkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmVtaXRCYXNlQnViYmxpbmdFdmVudCgnaXRlbUNyZWF0ZWQnKTtcclxuICAgICAgICB0aGlzLmVtaXRVbmtub3duQnViYmxpbmdFdmVudCh0aGlzLnR5cGUgKyAnQ3JlYXRlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByb3RlY3RlZCBzZXRQYXJlbnQocGFyZW50OiBDb250ZW50SXRlbSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBhZGRQb3BJblBhcmVudElkKGlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMucG9wSW5QYXJlbnRJZHMuaW5jbHVkZXMoaWQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMucG9wSW5QYXJlbnRJZHMucHVzaChpZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByb3RlY3RlZCBpbml0Q29udGVudEl0ZW1zKCk6IHZvaWQge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRJdGVtc1tpXS5pbml0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByb3RlY3RlZCBoaWRlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5iZWdpblNpemVJbnZhbGlkYXRpb24oKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBzZXRFbGVtZW50RGlzcGxheVZpc2liaWxpdHkodGhpcy5fZWxlbWVudCwgZmFsc2UpO1xyXG4gICAgICAgICAgICAvLyB0aGlzLmxheW91dE1hbmFnZXIudXBkYXRlU2l6ZUZyb21Db250YWluZXIoKTtcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuZW5kU2l6ZUludmFsaWRhdGlvbigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcm90ZWN0ZWQgdXBkYXRlQ29udGVudEl0ZW1zU2l6ZShmb3JjZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRJdGVtc1tpXS51cGRhdGVTaXplKGZvcmNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBjcmVhdGVzIGFsbCBjb250ZW50IGl0ZW1zIGZvciB0aGlzIG5vZGUgYXQgaW5pdGlhbGlzYXRpb24gdGltZVxyXG4gICAgICogUExFQVNFIE5PVEUsIHBsZWFzZSBzZWUgYWRkQ2hpbGQgZm9yIGFkZGluZyBjb250ZW50SXRlbXMgYXQgcnVudGltZVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlQ29udGVudEl0ZW1zKGNvbnRlbnQ6IHJlYWRvbmx5IFJlc29sdmVkSXRlbUNvbmZpZ1tdKSB7XHJcbiAgICAgICAgY29uc3QgY291bnQgPSBjb250ZW50Lmxlbmd0aDtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXk8Q29udGVudEl0ZW0+KGNvdW50KTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgcmVzdWx0W2ldID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmNyZWF0ZUNvbnRlbnRJdGVtKGNvbnRlbnRbaV0sIHRoaXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGZvciBldmVyeSBldmVudCBvbiB0aGUgaXRlbSB0cmVlLiBEZWNpZGVzIHdoZXRoZXIgdGhlIGV2ZW50IGlzIGEgYnViYmxpbmdcclxuICAgICAqIGV2ZW50IGFuZCBwcm9wYWdhdGVzIGl0IHRvIGl0cyBwYXJlbnRcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudFxyXG4gICAgICogQHBhcmFtIGV2ZW50IC1cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHByb3BhZ2F0ZUV2ZW50KG5hbWU6IHN0cmluZywgYXJnczogdW5rbm93bltdKSB7XHJcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gYXJnc1swXTtcclxuICAgICAgICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyLkJ1YmJsaW5nRXZlbnQgJiZcclxuICAgICAgICAgICAgICAgIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkID09PSBmYWxzZSAmJlxyXG4gICAgICAgICAgICAgICAgdGhpcy5faXNJbml0aWFsaXNlZCA9PT0gdHJ1ZSkge1xyXG5cclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogSW4gc29tZSBjYXNlcyAoZS5nLiBpZiBhbiBlbGVtZW50IGlzIGNyZWF0ZWQgZnJvbSBhIERyYWdTb3VyY2UpIGl0XHJcbiAgICAgICAgICAgICAgICAgKiBkb2Vzbid0IGhhdmUgYSBwYXJlbnQgYW5kIGlzIG5vdCBhIGNoaWxkIG9mIEdyb3VuZEl0ZW0uIElmIHRoYXQncyB0aGUgY2FzZVxyXG4gICAgICAgICAgICAgICAgICogcHJvcGFnYXRlIHRoZSBidWJibGluZyBldmVudCBmcm9tIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIHN1YnN0cmVlIGRpcmVjdGx5XHJcbiAgICAgICAgICAgICAgICAgKiB0byB0aGUgbGF5b3V0TWFuYWdlclxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0dyb3VuZCA9PT0gZmFsc2UgJiYgdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGFyZW50LmVtaXRVbmtub3duKG5hbWUsIGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUV2ZW50UHJvcGFnYXRpb25Ub0xheW91dE1hbmFnZXIobmFtZSwgZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG92ZXJyaWRlIHRyeUJ1YmJsZUV2ZW50KG5hbWU6IHN0cmluZywgYXJnczogdW5rbm93bltdKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gYXJnc1swXTtcclxuICAgICAgICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyLkJ1YmJsaW5nRXZlbnQgJiZcclxuICAgICAgICAgICAgICAgIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkID09PSBmYWxzZSAmJlxyXG4gICAgICAgICAgICAgICAgdGhpcy5faXNJbml0aWFsaXNlZCA9PT0gdHJ1ZVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogSW4gc29tZSBjYXNlcyAoZS5nLiBpZiBhbiBlbGVtZW50IGlzIGNyZWF0ZWQgZnJvbSBhIERyYWdTb3VyY2UpIGl0XHJcbiAgICAgICAgICAgICAgICAgKiBkb2Vzbid0IGhhdmUgYSBwYXJlbnQgYW5kIGlzIG5vdCBhIGNoaWxkIG9mIEdyb3VuZEl0ZW0uIElmIHRoYXQncyB0aGUgY2FzZVxyXG4gICAgICAgICAgICAgICAgICogcHJvcGFnYXRlIHRoZSBidWJibGluZyBldmVudCBmcm9tIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIHN1YnN0cmVlIGRpcmVjdGx5XHJcbiAgICAgICAgICAgICAgICAgKiB0byB0aGUgbGF5b3V0TWFuYWdlclxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0dyb3VuZCA9PT0gZmFsc2UgJiYgdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGFyZW50LmVtaXRVbmtub3duKG5hbWUsIGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUV2ZW50UHJvcGFnYXRpb25Ub0xheW91dE1hbmFnZXIobmFtZSwgZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWxsIHJhdyBldmVudHMgYnViYmxlIHVwIHRvIHRoZSBHcm91bmQgZWxlbWVudC4gU29tZSBldmVudHMgdGhhdFxyXG4gICAgICogYXJlIHByb3BhZ2F0ZWQgdG8gLSBhbmQgZW1pdHRlZCBieSAtIHRoZSBsYXlvdXRNYW5hZ2VyIGhvd2V2ZXIgYXJlXHJcbiAgICAgKiBvbmx5IHN0cmluZy1iYXNlZCwgYmF0Y2hlZCBhbmQgc2FuaXRpemVkIHRvIG1ha2UgdGhlbSBtb3JlIHVzYWJsZVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50XHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzY2hlZHVsZUV2ZW50UHJvcGFnYXRpb25Ub0xheW91dE1hbmFnZXIobmFtZTogc3RyaW5nLCBldmVudDogRXZlbnRFbWl0dGVyLkJ1YmJsaW5nRXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5fdGhyb3R0bGVkRXZlbnRzLmluZGV4T2YobmFtZSkgPT09IC0xKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5lbWl0VW5rbm93bihuYW1lLCBldmVudCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdFdmVudFByb3BhZ2F0aW9uc1tuYW1lXSAhPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ0V2ZW50UHJvcGFnYXRpb25zW25hbWVdID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMucHJvcGFnYXRlRXZlbnRUb0xheW91dE1hbmFnZXIobmFtZSwgZXZlbnQpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsYmFjayBmb3IgZXZlbnRzIHNjaGVkdWxlZCBieSBfc2NoZWR1bGVFdmVudFByb3BhZ2F0aW9uVG9MYXlvdXRNYW5hZ2VyXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHByb3BhZ2F0ZUV2ZW50VG9MYXlvdXRNYW5hZ2VyKG5hbWU6IHN0cmluZywgZXZlbnQ6IEV2ZW50RW1pdHRlci5CdWJibGluZ0V2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5fcGVuZGluZ0V2ZW50UHJvcGFnYXRpb25zW25hbWVdID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmVtaXRVbmtub3duKG5hbWUsIGV2ZW50KTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBDb250ZW50SXRlbSB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIEFyZWEgZXh0ZW5kcyBBcmVhTGlua2VkUmVjdCB7XHJcbiAgICAgICAgc3VyZmFjZTogbnVtYmVyO1xyXG4gICAgICAgIGNvbnRlbnRJdGVtOiBDb250ZW50SXRlbTtcclxuICAgIH1cclxuICAgIC8qKiBAcHVibGljICovXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIERvY2tQb2ludCB7XHJcbiAgICAgICAgcGFyZW50OiBDb250ZW50SXRlbTtcclxuICAgICAgICBpbmRleDogbnVtYmVyIHwgbnVsbDtcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAoQ29udGVudEl0ZW06Y2xhc3MpfSAqL1xyXG5leHBvcnQgdHlwZSBBYnN0cmFjdENvbnRlbnRJdGVtID0gQ29udGVudEl0ZW07XHJcbiIsImltcG9ydCB7IENvbXBvbmVudEl0ZW1Db25maWcsIEl0ZW1Db25maWcsIFJvd09yQ29sdW1uSXRlbUNvbmZpZywgU3RhY2tJdGVtQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL2NvbmZpZyc7XHJcbmltcG9ydCB7IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZywgUmVzb2x2ZWRHcm91bmRJdGVtQ29uZmlnLCBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZywgUmVzb2x2ZWRJdGVtQ29uZmlnLCBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnLCBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy9yZXNvbHZlZC1jb25maWcnO1xyXG5pbXBvcnQgeyBBc3NlcnRFcnJvciwgVW5leHBlY3RlZE51bGxFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuLi9sYXlvdXQtbWFuYWdlcic7XHJcbmltcG9ydCB7IERvbUNvbnN0YW50cyB9IGZyb20gJy4uL3V0aWxzL2RvbS1jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBBcmVhTGlua2VkUmVjdCwgSXRlbVR5cGUsIFNpemVVbml0RW51bSB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcclxuaW1wb3J0IHsgZ2V0RWxlbWVudENsaWVudFdpZHRoQW5kSGVpZ2h0LCBzZXRFbGVtZW50SGVpZ2h0LCBzZXRFbGVtZW50V2lkdGggfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcbmltcG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuL2NvbXBvbmVudC1pdGVtJztcclxuaW1wb3J0IHsgQ29tcG9uZW50UGFyZW50YWJsZUl0ZW0gfSBmcm9tICcuL2NvbXBvbmVudC1wYXJlbnRhYmxlLWl0ZW0nO1xyXG5pbXBvcnQgeyBDb250ZW50SXRlbSB9IGZyb20gJy4vY29udGVudC1pdGVtJztcclxuaW1wb3J0IHsgUm93T3JDb2x1bW4gfSBmcm9tICcuL3Jvdy1vci1jb2x1bW4nO1xyXG5cclxuLyoqXHJcbiAqIEdyb3VuZEl0ZW0gaXMgdGhlIENvbnRlbnRJdGVtIHdob3NlIG9uZSBjaGlsZCBpcyB0aGUgcm9vdCBDb250ZW50SXRlbSAoUm9vdCBpcyBwbGFudGVkIGluIEdyb3VuZCkuXHJcbiAqIChQcmV2aW91c2x5IGl0IHdhcyBjYWxsZWQgcm9vdCBob3dldmVyIHRoaXMgd2FzIGluY29ycmVjdCBhcyBpdHMgY2hpbGQgaXMgdGhlIHJvb3QgaXRlbSlcclxuICogVGhlcmUgaXMgb25seSBvbmUgaW5zdGFuY2Ugb2YgR3JvdW5kSXRlbSBhbmQgaXQgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIGJ5IHRoZSBMYXlvdXQgTWFuYWdlclxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmV4cG9ydCBjbGFzcyBHcm91bmRJdGVtIGV4dGVuZHMgQ29tcG9uZW50UGFyZW50YWJsZUl0ZW0ge1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2hpbGRFbGVtZW50Q29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRhaW5lckVsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGxheW91dE1hbmFnZXI6IExheW91dE1hbmFnZXIsIHJvb3RJdGVtQ29uZmlnOiBSZXNvbHZlZFJvb3RJdGVtQ29uZmlnIHwgdW5kZWZpbmVkLCBjb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCkge1xyXG5cclxuICAgICAgICBzdXBlcihsYXlvdXRNYW5hZ2VyLCBSZXNvbHZlZEdyb3VuZEl0ZW1Db25maWcuY3JlYXRlKHJvb3RJdGVtQ29uZmlnKSwgbnVsbCwgR3JvdW5kSXRlbS5jcmVhdGVFbGVtZW50KGRvY3VtZW50KSk7XHJcblxyXG4gICAgICAgIHRoaXMuaXNHcm91bmQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lciA9IHRoaXMuZWxlbWVudDtcclxuICAgICAgICB0aGlzLl9jb250YWluZXJFbGVtZW50ID0gY29udGFpbmVyRWxlbWVudDtcclxuXHJcbiAgICAgICAgLy8gaW5zZXJ0IGJlZm9yZSBhbnkgcHJlLWV4aXN0aW5nIGNvbnRlbnQgZWxlbWVudHNcclxuICAgICAgICBsZXQgYmVmb3JlOiBDaGlsZE5vZGUgfCBudWxsID0gbnVsbDtcclxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xyXG4gICAgICAgICAgICBjb25zdCBwcmV2OiBDaGlsZE5vZGUgfCBudWxsID1cclxuICAgICAgICAgICAgICAgIGJlZm9yZSA/IGJlZm9yZS5wcmV2aW91c1NpYmxpbmcgOiB0aGlzLl9jb250YWluZXJFbGVtZW50Lmxhc3RDaGlsZDtcclxuICAgICAgICAgICAgaWYgKHByZXYgaW5zdGFuY2VvZiBFbGVtZW50XHJcbiAgICAgICAgICAgICAgICAmJiBwcmV2LmNsYXNzTGlzdC5jb250YWlucyhEb21Db25zdGFudHMuQ2xhc3NOYW1lLkNvbnRlbnQpKSB7XHJcbiAgICAgICAgICAgICAgICBiZWZvcmUgPSBwcmV2O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY29udGFpbmVyRWxlbWVudC5pbnNlcnRCZWZvcmUodGhpcy5lbGVtZW50LCBiZWZvcmUpO1xyXG4gICAgfVxyXG5cclxuICAgIG92ZXJyaWRlIGluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNJbml0aWFsaXNlZCA9PT0gdHJ1ZSkgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZU5vZGVTaXplKCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgdGhpcy5fY2hpbGRFbGVtZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuY29udGVudEl0ZW1zW2ldLmVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3VwZXIuaW5pdCgpO1xyXG5cclxuICAgICAgICB0aGlzLmluaXRDb250ZW50SXRlbXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIExvYWRzIGEgbmV3IExheW91dFxyXG4gICAgICogSW50ZXJuYWwgb25seS4gIFRvIGxvYWQgYSBuZXcgbGF5b3V0IHdpdGggQVBJLCB1c2Uge0BsaW5rIChMYXlvdXRNYW5hZ2VyOmNsYXNzKS5sb2FkTGF5b3V0fVxyXG4gICAgICovXHJcbiAgICBsb2FkUm9vdChyb290SXRlbUNvbmZpZzogUmVzb2x2ZWRSb290SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xyXG4gICAgICAgIC8vIFJlbW92ZSBleGlzdGluZyByb290IGlmIGl0IGV4aXN0c1xyXG4gICAgICAgIHRoaXMuY2xlYXJSb290KCk7XHJcblxyXG4gICAgICAgIGlmIChyb290SXRlbUNvbmZpZyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvb3RDb250ZW50SXRlbSA9IHRoaXMubGF5b3V0TWFuYWdlci5jcmVhdGVBbmRJbml0Q29udGVudEl0ZW0ocm9vdEl0ZW1Db25maWcsIHRoaXMpO1xyXG4gICAgICAgICAgICB0aGlzLmFkZENoaWxkKHJvb3RDb250ZW50SXRlbSwgMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNsZWFyUm9vdCgpOiB2b2lkIHtcclxuICAgICAgICAvLyBSZW1vdmUgZXhpc3Rpbmcgcm9vdCBpZiBpdCBleGlzdHNcclxuICAgICAgICBjb25zdCBjb250ZW50SXRlbXMgPSB0aGlzLmNvbnRlbnRJdGVtcztcclxuICAgICAgICBzd2l0Y2ggKGNvbnRlbnRJdGVtcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgY2FzZSAwOiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSAxOiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1Jvb3RDb250ZW50SXRlbSA9IGNvbnRlbnRJdGVtc1swXTtcclxuICAgICAgICAgICAgICAgIGV4aXN0aW5nUm9vdENvbnRlbnRJdGVtLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignR0lMUjA3NzIxJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgQ29udGVudEl0ZW0gY2hpbGQgdG8gcm9vdCBDb250ZW50SXRlbS5cclxuICAgICAqIEludGVybmFsIG9ubHkuICBUbyBsb2FkIGEgYWRkIHdpdGggQVBJLCB1c2Uge0BsaW5rIChMYXlvdXRNYW5hZ2VyOmNsYXNzKS5hZGRJdGVtfVxyXG4gICAgICogQHJldHVybnMgLTEgaWYgYWRkZWQgYXMgcm9vdCBvdGhlcndpc2UgaW5kZXggaW4gcm9vdCBDb250ZW50SXRlbSdzIGNvbnRlbnRcclxuICAgICAqL1xyXG4gICAgYWRkSXRlbShpdGVtQ29uZmlnOiBSb3dPckNvbHVtbkl0ZW1Db25maWcgfCBTdGFja0l0ZW1Db25maWcgfCBDb21wb25lbnRJdGVtQ29uZmlnLFxyXG4gICAgICAgIGluZGV4PzogbnVtYmVyXHJcbiAgICApOiBudW1iZXIge1xyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5jaGVja01pbmltaXNlTWF4aW1pc2VkU3RhY2soKTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRJdGVtQ29uZmlnID0gSXRlbUNvbmZpZy5yZXNvbHZlKGl0ZW1Db25maWcsIGZhbHNlKTtcclxuICAgICAgICBsZXQgcGFyZW50OiBDb250ZW50SXRlbTtcclxuICAgICAgICBpZiAodGhpcy5jb250ZW50SXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwYXJlbnQgPSB0aGlzLmNvbnRlbnRJdGVtc1swXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcclxuICAgICAgICAgICAgcGFyZW50ID0gdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHBhcmVudC5pc0NvbXBvbmVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhZGQgaXRlbSBhcyBjaGlsZCB0byBDb21wb25lbnRJdGVtJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSB0aGlzLmxheW91dE1hbmFnZXIuY3JlYXRlQW5kSW5pdENvbnRlbnRJdGVtKHJlc29sdmVkSXRlbUNvbmZpZywgcGFyZW50KTtcclxuICAgICAgICAgICAgaW5kZXggPSBwYXJlbnQuYWRkQ2hpbGQoY29udGVudEl0ZW0sIGluZGV4KTtcclxuICAgICAgICAgICAgcmV0dXJuIChwYXJlbnQgPT09IHRoaXMpID8gLTEgOiBpbmRleDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZENvbXBvbmVudEFzUm9vdChpdGVtQ29uZmlnOiBDb21wb25lbnRJdGVtQ29uZmlnKTogdm9pZCB7XHJcbiAgICAgICAgLy8gUmVtb3ZlIGV4aXN0aW5nIHJvb3QgaWYgaXQgZXhpc3RzXHJcbiAgICAgICAgdGhpcy5jbGVhclJvb3QoKTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRJdGVtQ29uZmlnID0gSXRlbUNvbmZpZy5yZXNvbHZlKGl0ZW1Db25maWcsIGZhbHNlKSBhcyBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWc7XHJcblxyXG4gICAgICAgIGlmIChyZXNvbHZlZEl0ZW1Db25maWcubWF4aW1pc2VkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUm9vdCBDb21wb25lbnQgY2Fubm90IGJlIG1heGltaXNlZCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJvb3RDb250ZW50SXRlbSA9IG5ldyBDb21wb25lbnRJdGVtKHRoaXMubGF5b3V0TWFuYWdlciwgcmVzb2x2ZWRJdGVtQ29uZmlnLCB0aGlzKTtcclxuICAgICAgICAgICAgcm9vdENvbnRlbnRJdGVtLmluaXQoKTtcclxuICAgICAgICAgICAgdGhpcy5hZGRDaGlsZChyb290Q29udGVudEl0ZW0sIDApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBSb290IENvbnRlbnRJdGVtLlxyXG4gICAgICogSW50ZXJuYWwgb25seS4gIFRvIHJlcGxhY2UgUm9vdCBDb250ZW50SXRlbSB3aXRoIEFQSSwgdXNlIHtAbGluayAoTGF5b3V0TWFuYWdlcjpjbGFzcykubG9hZExheW91dH1cclxuICAgICAqL1xyXG4gICAgb3ZlcnJpZGUgYWRkQ2hpbGQoY29udGVudEl0ZW06IENvbnRlbnRJdGVtLCBpbmRleD86IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHcm91bmQgbm9kZSBjYW4gb25seSBoYXZlIGEgc2luZ2xlIGNoaWxkJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gY29udGVudEl0ZW0gPSB0aGlzLmxheW91dE1hbmFnZXIuXyRub3JtYWxpemVDb250ZW50SXRlbShjb250ZW50SXRlbSwgdGhpcyk7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lci5hcHBlbmRDaGlsZChjb250ZW50SXRlbS5lbGVtZW50KTtcclxuICAgICAgICAgICAgaW5kZXggPSBzdXBlci5hZGRDaGlsZChjb250ZW50SXRlbSwgaW5kZXgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKGZhbHNlKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0QmFzZUJ1YmJsaW5nRXZlbnQoJ3N0YXRlQ2hhbmdlZCcpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGluZGV4O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBvdmVycmlkZSBjYWxjdWxhdGVDb25maWdDb250ZW50KCk6IFJlc29sdmVkUm9vdEl0ZW1Db25maWdbXSB7XHJcbiAgICAgICAgY29uc3QgY29udGVudEl0ZW1zID0gdGhpcy5jb250ZW50SXRlbXM7XHJcbiAgICAgICAgY29uc3QgY291bnQgPSBjb250ZW50SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxSZXNvbHZlZFJvb3RJdGVtQ29uZmlnPihjb3VudCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1Db25maWcgPSBpdGVtLnRvQ29uZmlnKCk7XHJcbiAgICAgICAgICAgIGlmIChSZXNvbHZlZFJvb3RJdGVtQ29uZmlnLmlzUm9vdEl0ZW1Db25maWcoaXRlbUNvbmZpZykpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IGl0ZW1Db25maWc7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ1JDQ0M2NjgzMicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc2V0U2l6ZSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGlmICh3aWR0aCA9PT0gdW5kZWZpbmVkIHx8IGhlaWdodCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZShmYWxzZSk7IC8vIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIHYxLnggQVBJXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2V0RWxlbWVudFdpZHRoKHRoaXMuZWxlbWVudCwgd2lkdGgpO1xyXG4gICAgICAgICAgICBzZXRFbGVtZW50SGVpZ2h0KHRoaXMuZWxlbWVudCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIC8vIEdyb3VuZEl0ZW0gY2FuIGJlIGVtcHR5XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRFbGVtZW50V2lkdGgodGhpcy5jb250ZW50SXRlbXNbMF0uZWxlbWVudCwgd2lkdGgpO1xyXG4gICAgICAgICAgICAgICAgc2V0RWxlbWVudEhlaWdodCh0aGlzLmNvbnRlbnRJdGVtc1swXS5lbGVtZW50LCBoZWlnaHQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbnRlbnRJdGVtc1NpemUodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIFJvb3QgQ29udGVudEl0ZW0uXHJcbiAgICAgKiBJbnRlcm5hbCBvbmx5LiAgVG8gcmVwbGFjZSBSb290IENvbnRlbnRJdGVtIHdpdGggQVBJLCB1c2Uge0BsaW5rIChMYXlvdXRNYW5hZ2VyOmNsYXNzKS51cGRhdGVSb290U2l6ZX1cclxuICAgICAqL1xyXG4gICAgb3ZlcnJpZGUgdXBkYXRlU2l6ZShmb3JjZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5iZWdpblZpcnR1YWxTaXplZENvbnRhaW5lckFkZGluZygpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTm9kZVNpemUoKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVDb250ZW50SXRlbXNTaXplKGZvcmNlKTtcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuZW5kVmlydHVhbFNpemVkQ29udGFpbmVyQWRkaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVNpZGVBcmVhcygpOiBHcm91bmRJdGVtLkFyZWFbXSB7XHJcbiAgICAgICAgY29uc3QgYXJlYVNpemUgPSA1MDtcclxuXHJcbiAgICAgICAgY29uc3Qgb3Bwb3NpdGVTaWRlcyA9IEdyb3VuZEl0ZW0uQXJlYS5vcHBvc2l0ZVNpZGVzO1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheTxHcm91bmRJdGVtLkFyZWE+KE9iamVjdC5rZXlzKG9wcG9zaXRlU2lkZXMpLmxlbmd0aCk7XHJcbiAgICAgICAgbGV0IGlkeCA9IDA7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9wcG9zaXRlU2lkZXMpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2lkZSA9IGtleSBhcyBrZXlvZiBHcm91bmRJdGVtLkFyZWEuU2lkZXM7XHJcbiAgICAgICAgICAgIGNvbnN0IGFyZWEgPSB0aGlzLmdldEVsZW1lbnRBcmVhKCkgYXMgR3JvdW5kSXRlbS5BcmVhO1xyXG4gICAgICAgICAgICBpZiAoYXJlYSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ1JDU0E3NzU1MycpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXJlYS5zaWRlID0gc2lkZTtcclxuICAgICAgICAgICAgICAgIGlmIChvcHBvc2l0ZVNpZGVzW3NpZGVdWzFdID09PSAnMicgKVxyXG4gICAgICAgICAgICAgICAgICAgIGFyZWFbc2lkZV0gPSBhcmVhW29wcG9zaXRlU2lkZXNbc2lkZV1dIC0gYXJlYVNpemU7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgYXJlYVtzaWRlXSA9IGFyZWFbb3Bwb3NpdGVTaWRlc1tzaWRlXV0gKyBhcmVhU2l6ZTtcclxuICAgICAgICAgICAgICAgIGFyZWEuc3VyZmFjZSA9IChhcmVhLngyIC0gYXJlYS54MSkgKiAoYXJlYS55MiAtIGFyZWEueTEpO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0W2lkeCsrXSA9IGFyZWE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgb3ZlcnJpZGUgaGlnaGxpZ2h0RHJvcFpvbmUoeDogbnVtYmVyLCB5OiBudW1iZXIsIGFyZWE6IEFyZWFMaW5rZWRSZWN0KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLnRhYkRyb3BQbGFjZWhvbGRlci5yZW1vdmUoKTtcclxuICAgICAgICBzdXBlci5oaWdobGlnaHREcm9wWm9uZSh4LCB5LCBhcmVhKTtcclxuICAgIH1cclxuXHJcbiAgICBvdmVycmlkZSBvbkRyb3AoY29udGVudEl0ZW06IENvbnRlbnRJdGVtLCBhcmVhOiBHcm91bmRJdGVtLkFyZWEpOiB2b2lkIHtcclxuXHJcbiAgICAgICAgaWYgKGNvbnRlbnRJdGVtLmlzQ29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1Db25maWcgPSBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZy5jcmVhdGVEZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIC8vIHNpbmNlIFJlc29sdmVkSXRlbUNvbmZpZy5jb250ZW50SXRlbXMgbm90IHNldCB1cCwgd2UgbmVlZCB0byBhZGQgaGVhZGVyIGZyb20gQ29tcG9uZW50XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGNvbnRlbnRJdGVtIGFzIENvbXBvbmVudEl0ZW07XHJcbiAgICAgICAgICAgIGl0ZW1Db25maWcuaGVhZGVyID0gUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcuSGVhZGVyLmNyZWF0ZUNvcHkoY29tcG9uZW50LmhlYWRlckNvbmZpZyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmNyZWF0ZUFuZEluaXRDb250ZW50SXRlbShpdGVtQ29uZmlnLCB0aGlzKTtcclxuICAgICAgICAgICAgc3RhY2suYWRkQ2hpbGQoY29udGVudEl0ZW0pO1xyXG4gICAgICAgICAgICBjb250ZW50SXRlbSA9IHN0YWNrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZENoaWxkKGNvbnRlbnRJdGVtKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvKlxyXG4gICAgICAgICAgICAgKiBJZiB0aGUgY29udGVudEl0ZW0gdGhhdCdzIGJlaW5nIGRyb3BwZWQgaXMgbm90IGRyb3BwZWQgb24gYSBTdGFjayAoY2FzZXMgd2hpY2gganVzdCBwYXNzZWQgYWJvdmUgYW5kXHJcbiAgICAgICAgICAgICAqIHdoaWNoIHdvdWxkIHdyYXAgdGhlIGNvbnRlbnRJdGVtIGluIGEgU3RhY2spIHdlIG5lZWQgdG8gY2hlY2sgd2hldGhlciBjb250ZW50SXRlbSBpcyBhIFJvd09yQ29sdW1uLlxyXG4gICAgICAgICAgICAgKiBJZiBpdCBpcywgd2UgbmVlZCB0byByZS13cmFwIGl0IGluIGEgU3RhY2sgbGlrZSBpdCB3YXMgd2hlbiBpdCB3YXMgZHJhZ2dlZCBieSBpdHMgVGFiIChpdCB3YXMgZHJhZ2dlZCEpLlxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgaWYoY29udGVudEl0ZW0udHlwZSA9PT0gSXRlbVR5cGUucm93IHx8IGNvbnRlbnRJdGVtLnR5cGUgPT09IEl0ZW1UeXBlLmNvbHVtbil7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtQ29uZmlnID0gUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcuY3JlYXRlRGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB0aGlzLmxheW91dE1hbmFnZXIuY3JlYXRlQ29udGVudEl0ZW0oaXRlbUNvbmZpZywgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICBzdGFjay5hZGRDaGlsZChjb250ZW50SXRlbSlcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtID0gc3RhY2tcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgdHlwZSA9IGFyZWEuc2lkZVswXSA9PSAneCcgPyBJdGVtVHlwZS5yb3cgOiBJdGVtVHlwZS5jb2x1bW47XHJcbiAgICAgICAgICAgIGNvbnN0IGluc2VydEJlZm9yZSA9IGFyZWEuc2lkZVsxXSA9PSAnMic7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY29udGVudEl0ZW1zWzBdO1xyXG4gICAgICAgICAgICBpZiAoIShjb2x1bW4gaW5zdGFuY2VvZiBSb3dPckNvbHVtbikgfHwgY29sdW1uLnR5cGUgIT09IHR5cGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1Db25maWcgPSBSZXNvbHZlZEl0ZW1Db25maWcuY3JlYXRlRGVmYXVsdCh0eXBlKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJvd09yQ29sdW1uID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmNyZWF0ZUNvbnRlbnRJdGVtKGl0ZW1Db25maWcsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXBsYWNlQ2hpbGQoY29sdW1uLCByb3dPckNvbHVtbik7XHJcbiAgICAgICAgICAgICAgICByb3dPckNvbHVtbi5hZGRDaGlsZChjb250ZW50SXRlbSwgaW5zZXJ0QmVmb3JlID8gMCA6IHVuZGVmaW5lZCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICByb3dPckNvbHVtbi5hZGRDaGlsZChjb2x1bW4sIGluc2VydEJlZm9yZSA/IHVuZGVmaW5lZCA6IDAsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgY29sdW1uLnNpemUgPSA1MDtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemUgPSA1MDtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemVVbml0ID0gU2l6ZVVuaXRFbnVtLlBlcmNlbnQ7XHJcbiAgICAgICAgICAgICAgICByb3dPckNvbHVtbi51cGRhdGVTaXplKGZhbHNlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmcgPSBjb2x1bW4uY29udGVudEl0ZW1zW2luc2VydEJlZm9yZSA/IDAgOiBjb2x1bW4uY29udGVudEl0ZW1zLmxlbmd0aCAtIDFdXHJcbiAgICAgICAgICAgICAgICBjb2x1bW4uYWRkQ2hpbGQoY29udGVudEl0ZW0sIGluc2VydEJlZm9yZSA/IDAgOiB1bmRlZmluZWQsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgc2libGluZy5zaXplICo9IDAuNTtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemUgPSBzaWJsaW5nLnNpemU7XHJcbiAgICAgICAgICAgICAgICBjb250ZW50SXRlbS5zaXplVW5pdCA9IFNpemVVbml0RW51bS5QZXJjZW50O1xyXG4gICAgICAgICAgICAgICAgY29sdW1uLnVwZGF0ZVNpemUoZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIE5vIENvbnRlbnRJdGVtIGNhbiBkb2NrIHdpdGggZ3JvdW5kSXRlbS4gIEhvd2V2ZXIgU3RhY2sgY2FuIGhhdmUgYSBHcm91bmRJdGVtIHBhcmVudCBhbmQgU3RhY2sgcmVxdWlyZXMgdGhhdFxyXG4gICAgLy8gaXRzIHBhcmVudCBpbXBsZW1lbnQgZG9jaygpIGZ1bmN0aW9uLiAgQWNjb3JkaW5nbHkgdGhpcyBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBidXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBhcyBpdCBzaG91bGRcclxuICAgIC8vIG5ldmVyIGJlIGNhbGxlZFxyXG4gICAgZG9jaygpOiB2b2lkIHtcclxuICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0dJRDg3NzMxJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTm8gQ29udGVudEl0ZW0gY2FuIGRvY2sgd2l0aCBncm91bmRJdGVtLiAgSG93ZXZlciBTdGFjayBjYW4gaGF2ZSBhIEdyb3VuZEl0ZW0gcGFyZW50IGFuZCBTdGFjayByZXF1aXJlcyB0aGF0XHJcbiAgICAvLyBpdHMgcGFyZW50IGltcGxlbWVudCB2YWxpZGF0ZURvY2tpbmcoKSBmdW5jdGlvbi4gIEFjY29yZGluZ2x5IHRoaXMgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgYnV0IHRocm93cyBhbiBleGNlcHRpb24gYXMgaXQgc2hvdWxkXHJcbiAgICAvLyBuZXZlciBiZSBjYWxsZWRcclxuICAgIHZhbGlkYXRlRG9ja2luZygpOiB2b2lkIHtcclxuICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0dJVkQ4NzczMicpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEFsbENvbnRlbnRJdGVtcygpOiBDb250ZW50SXRlbVtdIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IENvbnRlbnRJdGVtW10gPSBbdGhpc107XHJcbiAgICAgICAgdGhpcy5kZWVwR2V0QWxsQ29udGVudEl0ZW1zKHRoaXMuY29udGVudEl0ZW1zLCByZXN1bHQpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QWxsQ29tcG9uZW50SXRlbXMoKTogQ29tcG9uZW50SXRlbVtdIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IENvbnRlbnRJdGVtW10gPSBbXTtcclxuICAgICAgICB0aGlzLmRlZXBGaWx0ZXJDb250ZW50SXRlbXModGhpcy5jb250ZW50SXRlbXMsIHJlc3VsdCwgKGl0ZW0pID0+IGl0ZW0uaXNDb21wb25lbnQpO1xyXG4gICAgICAgIHJldHVybiA8Q29tcG9uZW50SXRlbVtdPnJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDb25maWdNYXhpbWlzZWRJdGVtcygpOiBDb250ZW50SXRlbVtdIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IENvbnRlbnRJdGVtW10gPSBbXTtcclxuICAgICAgICB0aGlzLmRlZXBGaWx0ZXJDb250ZW50SXRlbXModGhpcy5jb250ZW50SXRlbXMsIHJlc3VsdCwgKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgaWYgKENvbnRlbnRJdGVtLmlzU3RhY2soaXRlbSkgJiYgaXRlbS5pbml0aWFsV2FudE1heGltaXNlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChDb250ZW50SXRlbS5pc0NvbXBvbmVudEl0ZW0oaXRlbSkgJiYgaXRlbS5pbml0aWFsV2FudE1heGltaXNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGdldEl0ZW1zQnlQb3BJblBhcmVudElkKHBvcEluUGFyZW50SWQ6IHN0cmluZyk6IENvbnRlbnRJdGVtW10ge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdDogQ29udGVudEl0ZW1bXSA9IFtdO1xyXG4gICAgICAgIHRoaXMuZGVlcEZpbHRlckNvbnRlbnRJdGVtcyh0aGlzLmNvbnRlbnRJdGVtcywgcmVzdWx0LCAoaXRlbSkgPT4gaXRlbS5wb3BJblBhcmVudElkcy5pbmNsdWRlcyhwb3BJblBhcmVudElkKSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICB0b0NvbmZpZygpOiBSZXNvbHZlZEl0ZW1Db25maWcge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGdlbmVyYXRlIEdyb3VuZEl0ZW0gY29uZmlnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xyXG4gICAgc2V0QWN0aXZlQ29tcG9uZW50SXRlbShpdGVtOiBDb21wb25lbnRJdGVtLCBmb2N1czogYm9vbGVhbiwgc3VwcHJlc3NGb2N1c0V2ZW50OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgLy8gb25seSBhcHBsaWNhYmxlIGlmIENvbXBvbmVudEl0ZW0gaXMgcm9vdCBhbmQgdGhlbiBpdCBhbHdheXMgaGFzIGZvY3VzXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVOb2RlU2l6ZSgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGdldEVsZW1lbnRDbGllbnRXaWR0aEFuZEhlaWdodCh0aGlzLl9jb250YWluZXJFbGVtZW50KTtcclxuXHJcbiAgICAgICAgc2V0RWxlbWVudFdpZHRoKHRoaXMuZWxlbWVudCwgd2lkdGgpO1xyXG4gICAgICAgIHNldEVsZW1lbnRIZWlnaHQodGhpcy5lbGVtZW50LCBoZWlnaHQpO1xyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIEdyb3VuZEl0ZW0gY2FuIGJlIGVtcHR5XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgc2V0RWxlbWVudFdpZHRoKHRoaXMuY29udGVudEl0ZW1zWzBdLmVsZW1lbnQsIHdpZHRoKTtcclxuICAgICAgICAgICAgc2V0RWxlbWVudEhlaWdodCh0aGlzLmNvbnRlbnRJdGVtc1swXS5lbGVtZW50LCBoZWlnaHQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRlZXBHZXRBbGxDb250ZW50SXRlbXMoY29udGVudDogcmVhZG9ubHkgQ29udGVudEl0ZW1bXSwgcmVzdWx0OiBDb250ZW50SXRlbVtdKTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gY29udGVudFtpXTtcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2goY29udGVudEl0ZW0pO1xyXG4gICAgICAgICAgICB0aGlzLmRlZXBHZXRBbGxDb250ZW50SXRlbXMoY29udGVudEl0ZW0uY29udGVudEl0ZW1zLCByZXN1bHQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRlZXBGaWx0ZXJDb250ZW50SXRlbXMoY29udGVudDogcmVhZG9ubHkgQ29udGVudEl0ZW1bXSwgcmVzdWx0OiBDb250ZW50SXRlbVtdLFxyXG4gICAgICAgIGNoZWNrQWNjZXB0RnRuOiAoKHRoaXM6IHZvaWQsIGl0ZW06IENvbnRlbnRJdGVtKSA9PiBib29sZWFuKVxyXG4gICAgKTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gY29udGVudFtpXTtcclxuICAgICAgICAgICAgaWYgKGNoZWNrQWNjZXB0RnRuKGNvbnRlbnRJdGVtKSkge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY29udGVudEl0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZGVlcEZpbHRlckNvbnRlbnRJdGVtcyhjb250ZW50SXRlbS5jb250ZW50SXRlbXMsIHJlc3VsdCwgY2hlY2tBY2NlcHRGdG4pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBHcm91bmRJdGVtIHtcclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQXJlYSBleHRlbmRzIENvbnRlbnRJdGVtLkFyZWEge1xyXG4gICAgICAgIHNpZGU6IGtleW9mIHR5cGVvZiBBcmVhLlNpZGU7XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IG5hbWVzcGFjZSBBcmVhIHtcclxuICAgICAgICBleHBvcnQgY29uc3QgZW51bSBTaWRlIHtcclxuICAgICAgICAgICAgeTIsXHJcbiAgICAgICAgICAgIHgyLFxyXG4gICAgICAgICAgICB5MSxcclxuICAgICAgICAgICAgeDEsXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBleHBvcnQgdHlwZSBTaWRlcyA9IHsgW3NpZGUgaW4ga2V5b2YgdHlwZW9mIFNpZGVdOiBrZXlvZiB0eXBlb2YgU2lkZTsgfVxyXG5cclxuICAgICAgICBleHBvcnQgY29uc3Qgb3Bwb3NpdGVTaWRlczogU2lkZXMgPSB7XHJcbiAgICAgICAgICAgIHkyOiAneTEnLFxyXG4gICAgICAgICAgICB4MjogJ3gxJyxcclxuICAgICAgICAgICAgeTE6ICd5MicsXHJcbiAgICAgICAgICAgIHgxOiAneDInLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQoZG9jdW1lbnQ6IERvY3VtZW50KTogSFRNTERpdkVsZW1lbnQge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Hb2xkZW5MYXlvdXQpO1xyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkl0ZW0pO1xyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLlJvb3QpO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IENvbXBvbmVudEl0ZW1Db25maWcsIEl0ZW1Db25maWcsIFJvd09yQ29sdW1uSXRlbUNvbmZpZywgU3RhY2tJdGVtQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL2NvbmZpZydcclxuaW1wb3J0IHsgUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcsIFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL3Jlc29sdmVkLWNvbmZpZydcclxuaW1wb3J0IHsgU3BsaXR0ZXIgfSBmcm9tICcuLi9jb250cm9scy9zcGxpdHRlcidcclxuaW1wb3J0IHsgQXNzZXJ0RXJyb3IsIFVuZXhwZWN0ZWROdWxsRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InXHJcbmltcG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuLi9sYXlvdXQtbWFuYWdlcidcclxuaW1wb3J0IHsgRG9tQ29uc3RhbnRzIH0gZnJvbSAnLi4vdXRpbHMvZG9tLWNvbnN0YW50cydcclxuaW1wb3J0IHsgSXRlbVR5cGUsIEpzb25WYWx1ZSwgU2l6ZVVuaXRFbnVtLCBXaWR0aE9ySGVpZ2h0UHJvcGVydHlOYW1lIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnXHJcbmltcG9ydCB7XHJcbiAgICBkZWJvdW5jZSxcclxuICAgIGdldEVsZW1lbnRIZWlnaHQsXHJcbiAgICBnZXRFbGVtZW50V2lkdGgsXHJcbiAgICBnZXRFbGVtZW50V2lkdGhBbmRIZWlnaHQsXHJcbiAgICBudW1iZXJUb1BpeGVscyxcclxuICAgIHBpeGVsc1RvTnVtYmVyLFxyXG4gICAgc2V0RWxlbWVudEhlaWdodCxcclxuICAgIHNldEVsZW1lbnRXaWR0aFxyXG59IGZyb20gXCIuLi91dGlscy91dGlsc1wiXHJcbmltcG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuL2NvbXBvbmVudC1pdGVtJ1xyXG5pbXBvcnQgeyBDb250ZW50SXRlbSB9IGZyb20gJy4vY29udGVudC1pdGVtJ1xyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGNsYXNzIFJvd09yQ29sdW1uIGV4dGVuZHMgQ29udGVudEl0ZW0ge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2hpbGRFbGVtZW50Q29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NvbmZpZ1R5cGU6ICdyb3cnIHwgJ2NvbHVtbic7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9pc0NvbHVtbjogYm9vbGVhbjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3NwbGl0dGVyU2l6ZTogbnVtYmVyO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfc3BsaXR0ZXJHcmFiU2l6ZTogbnVtYmVyO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZGltZW5zaW9uOiBXaWR0aE9ySGVpZ2h0UHJvcGVydHlOYW1lO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfc3BsaXR0ZXI6IFNwbGl0dGVyW10gPSBbXTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3NwbGl0dGVyUG9zaXRpb246IG51bWJlciB8IG51bGw7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9zcGxpdHRlck1pblBvc2l0aW9uOiBudW1iZXIgfCBudWxsO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfc3BsaXR0ZXJNYXhQb3NpdGlvbjogbnVtYmVyIHwgbnVsbDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2RlYm91bmNlZEVtaXRTdGF0ZUNoYW5nZWRFdmVudCA9IGRlYm91bmNlKCgpID0+IHRoaXMuZW1pdEJhc2VCdWJibGluZ0V2ZW50KCdzdGF0ZUNoYW5nZWQnKSk7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IoaXNDb2x1bW46IGJvb2xlYW4sIGxheW91dE1hbmFnZXI6IExheW91dE1hbmFnZXIsIGNvbmZpZzogUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcsXHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX3Jvd09yQ29sdW1uUGFyZW50OiBDb250ZW50SXRlbVxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIobGF5b3V0TWFuYWdlciwgY29uZmlnLCBfcm93T3JDb2x1bW5QYXJlbnQsIFJvd09yQ29sdW1uLmNyZWF0ZUVsZW1lbnQoZG9jdW1lbnQsIGlzQ29sdW1uKSk7XHJcblxyXG4gICAgICAgIHRoaXMuaXNSb3cgPSAhaXNDb2x1bW47XHJcbiAgICAgICAgdGhpcy5pc0NvbHVtbiA9IGlzQ29sdW1uO1xyXG5cclxuICAgICAgICB0aGlzLl9jaGlsZEVsZW1lbnRDb250YWluZXIgPSB0aGlzLmVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5fc3BsaXR0ZXJTaXplID0gbGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuZGltZW5zaW9ucy5ib3JkZXJXaWR0aDtcclxuICAgICAgICB0aGlzLl9zcGxpdHRlckdyYWJTaXplID0gbGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuZGltZW5zaW9ucy5ib3JkZXJHcmFiV2lkdGg7XHJcbiAgICAgICAgdGhpcy5faXNDb2x1bW4gPSBpc0NvbHVtbjtcclxuICAgICAgICB0aGlzLl9kaW1lbnNpb24gPSBpc0NvbHVtbiA/ICdoZWlnaHQnIDogJ3dpZHRoJztcclxuICAgICAgICB0aGlzLl9zcGxpdHRlclBvc2l0aW9uID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9zcGxpdHRlck1pblBvc2l0aW9uID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9zcGxpdHRlck1heFBvc2l0aW9uID0gbnVsbDtcclxuXHJcbiAgICAgICAgc3dpdGNoIChjb25maWcudHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLnJvdzpcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb2x1bW46XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9jb25maWdUeXBlID0gY29uZmlnLnR5cGU7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignUk9DQ0NUMDA5MjUnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmV3Q29tcG9uZW50KGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZSwgY29tcG9uZW50U3RhdGU/OiBKc29uVmFsdWUsIHRpdGxlPzogc3RyaW5nLCBpbmRleD86IG51bWJlcik6IENvbXBvbmVudEl0ZW0ge1xyXG4gICAgICAgIGNvbnN0IGl0ZW1Db25maWc6IENvbXBvbmVudEl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdjb21wb25lbnQnLFxyXG4gICAgICAgICAgICBjb21wb25lbnRUeXBlLFxyXG4gICAgICAgICAgICBjb21wb25lbnRTdGF0ZSxcclxuICAgICAgICAgICAgdGl0bGUsXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gdGhpcy5uZXdJdGVtKGl0ZW1Db25maWcsIGluZGV4KSBhcyBDb21wb25lbnRJdGVtO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZENvbXBvbmVudChjb21wb25lbnRUeXBlOiBKc29uVmFsdWUsIGNvbXBvbmVudFN0YXRlPzogSnNvblZhbHVlLCB0aXRsZT86IHN0cmluZywgaW5kZXg/OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgIGNvbnN0IGl0ZW1Db25maWc6IENvbXBvbmVudEl0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdjb21wb25lbnQnLFxyXG4gICAgICAgICAgICBjb21wb25lbnRUeXBlLFxyXG4gICAgICAgICAgICBjb21wb25lbnRTdGF0ZSxcclxuICAgICAgICAgICAgdGl0bGUsXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gdGhpcy5hZGRJdGVtKGl0ZW1Db25maWcsIGluZGV4KTtcclxuICAgIH1cclxuXHJcbiAgICBuZXdJdGVtKGl0ZW1Db25maWc6IFJvd09yQ29sdW1uSXRlbUNvbmZpZyB8IFN0YWNrSXRlbUNvbmZpZyB8IENvbXBvbmVudEl0ZW1Db25maWcsICBpbmRleD86IG51bWJlcik6IENvbnRlbnRJdGVtIHtcclxuICAgICAgICBpbmRleCA9IHRoaXMuYWRkSXRlbShpdGVtQ29uZmlnLCBpbmRleCk7XHJcbiAgICAgICAgY29uc3QgY3JlYXRlZEl0ZW0gPSB0aGlzLmNvbnRlbnRJdGVtc1tpbmRleF07XHJcblxyXG4gICAgICAgIGlmIChDb250ZW50SXRlbS5pc1N0YWNrKGNyZWF0ZWRJdGVtKSAmJiAoSXRlbUNvbmZpZy5pc0NvbXBvbmVudChpdGVtQ29uZmlnKSkpIHtcclxuICAgICAgICAgICAgLy8gY3JlYXRlZEl0ZW0gaXMgYSBTdGFjayB3aGljaCB3YXMgY3JlYXRlZCB0byBob2xkIHdhbnRlZCBjb21wb25lbnQuICBSZXR1cm4gY29tcG9uZW50XHJcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVkSXRlbS5jb250ZW50SXRlbXNbMF07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZWRJdGVtO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhZGRJdGVtKGl0ZW1Db25maWc6IFJvd09yQ29sdW1uSXRlbUNvbmZpZyB8IFN0YWNrSXRlbUNvbmZpZyB8IENvbXBvbmVudEl0ZW1Db25maWcsXHJcbiAgICAgICAgaW5kZXg/OiBudW1iZXJcclxuICAgICk6IG51bWJlciB7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmNoZWNrTWluaW1pc2VNYXhpbWlzZWRTdGFjaygpO1xyXG4gICAgICAgIGNvbnN0IHJlc29sdmVkSXRlbUNvbmZpZyA9IEl0ZW1Db25maWcucmVzb2x2ZShpdGVtQ29uZmlnLCBmYWxzZSk7XHJcbiAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSB0aGlzLmxheW91dE1hbmFnZXIuY3JlYXRlQW5kSW5pdENvbnRlbnRJdGVtKHJlc29sdmVkSXRlbUNvbmZpZywgdGhpcyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkQ2hpbGQoY29udGVudEl0ZW0sIGluZGV4LCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgYSBuZXcgY29udGVudEl0ZW0gdG8gdGhlIFJvdyBvciBDb2x1bW5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gY29udGVudEl0ZW0gLVxyXG4gICAgICogQHBhcmFtIGluZGV4IC0gVGhlIHBvc2l0aW9uIG9mIHRoZSBuZXcgaXRlbSB3aXRoaW4gdGhlIFJvdyBvciBDb2x1bW4uXHJcbiAgICAgKiAgICAgICAgICAgICAgICBJZiBubyBpbmRleCBpcyBwcm92aWRlZCB0aGUgaXRlbSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBlbmRcclxuICAgICAqIEBwYXJhbSBzdXNwZW5kUmVzaXplIC0gSWYgdHJ1ZSB0aGUgaXRlbXMgd29uJ3QgYmUgcmVzaXplZC4gVGhpcyB3aWxsIGxlYXZlIHRoZSBpdGVtIGluXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGFuIGluY29uc2lzdGVudCBzdGF0ZSBhbmQgaXMgb25seSBpbnRlbmRlZCB0byBiZSB1c2VkIGlmIG11bHRpcGxlXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuIG5lZWQgdG8gYmUgYWRkZWQgaW4gb25lIGdvIGFuZCByZXNpemUgaXMgY2FsbGVkIGFmdGVyd2FyZHNcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBvdmVycmlkZSBhZGRDaGlsZChjb250ZW50SXRlbTogQ29udGVudEl0ZW0sIGluZGV4PzogbnVtYmVyLCBzdXNwZW5kUmVzaXplPzogYm9vbGVhbik6IG51bWJlciB7XHJcblxyXG4gICAgICAgIC8vIGNvbnRlbnRJdGVtID0gdGhpcy5sYXlvdXRNYW5hZ2VyLl8kbm9ybWFsaXplQ29udGVudEl0ZW0oY29udGVudEl0ZW0sIHRoaXMpO1xyXG5cclxuICAgICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpbmRleCA9IHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNwbGl0dGVyRWxlbWVudCA9IHRoaXMuY3JlYXRlU3BsaXR0ZXIoTWF0aC5tYXgoMCwgaW5kZXggLSAxKSkuZWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgIGlmIChpbmRleCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29udGVudEl0ZW1zW2luZGV4IC0gMV0uZWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgc3BsaXR0ZXJFbGVtZW50KTtcclxuICAgICAgICAgICAgICAgIHNwbGl0dGVyRWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgY29udGVudEl0ZW0uZWxlbWVudCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRJdGVtc1swXS5lbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgnYmVmb3JlYmVnaW4nLCBzcGxpdHRlckVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgc3BsaXR0ZXJFbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgnYmVmb3JlYmVnaW4nLCBjb250ZW50SXRlbS5lbGVtZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lci5hcHBlbmRDaGlsZChjb250ZW50SXRlbS5lbGVtZW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN1cGVyLmFkZENoaWxkKGNvbnRlbnRJdGVtLCBpbmRleCk7XHJcblxyXG4gICAgICAgIGNvbnN0IG5ld0l0ZW1TaXplID0gKDEgLyB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGgpICogMTAwO1xyXG5cclxuICAgICAgICBpZiAoc3VzcGVuZFJlc2l6ZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZWRFdmVudCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gaW5kZXg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ZWRDb250ZW50SXRlbSA9IHRoaXMuY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICBpZiAoaW5kZXhlZENvbnRlbnRJdGVtID09PSBjb250ZW50SXRlbSkge1xyXG4gICAgICAgICAgICAgICAgY29udGVudEl0ZW0uc2l6ZSA9IG5ld0l0ZW1TaXplO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbVNpemUgPSBpbmRleGVkQ29udGVudEl0ZW0uc2l6ZSAqPSAoMTAwIC0gbmV3SXRlbVNpemUpIC8gMTAwO1xyXG4gICAgICAgICAgICAgICAgaW5kZXhlZENvbnRlbnRJdGVtLnNpemUgPSBpdGVtU2l6ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVTaXplKGZhbHNlKTtcclxuICAgICAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZWRFdmVudCgpO1xyXG5cclxuICAgICAgICByZXR1cm4gaW5kZXg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGEgY2hpbGQgb2YgdGhpcyBlbGVtZW50XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGNvbnRlbnRJdGVtIC1cclxuICAgICAqIEBwYXJhbSBrZWVwQ2hpbGQgLSBJZiB0cnVlIHRoZSBjaGlsZCB3aWxsIGJlIHJlbW92ZWQsIGJ1dCBub3QgZGVzdHJveWVkXHJcbiAgICAgKlxyXG4gICAgICovXHJcbiAgICBvdmVycmlkZSByZW1vdmVDaGlsZChjb250ZW50SXRlbTogQ29udGVudEl0ZW0sIGtlZXBDaGlsZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5jb250ZW50SXRlbXMuaW5kZXhPZihjb250ZW50SXRlbSk7XHJcbiAgICAgICAgY29uc3Qgc3BsaXR0ZXJJbmRleCA9IE1hdGgubWF4KGluZGV4IC0gMSwgMCk7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IHJlbW92ZSBjaGlsZC4gQ29udGVudEl0ZW0gaXMgbm90IGNoaWxkIG9mIHRoaXMgUm93IG9yIENvbHVtbicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUmVtb3ZlIHRoZSBzcGxpdHRlciBiZWZvcmUgdGhlIGl0ZW0gb3IgYWZ0ZXIgaWYgdGhlIGl0ZW0gaGFwcGVuc1xyXG4gICAgICAgICAqIHRvIGJlIHRoZSBmaXJzdCBpbiB0aGUgcm93L2NvbHVtblxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICh0aGlzLl9zcGxpdHRlcltzcGxpdHRlckluZGV4XSkge1xyXG4gICAgICAgICAgICB0aGlzLl9zcGxpdHRlcltzcGxpdHRlckluZGV4XS5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NwbGl0dGVyLnNwbGljZShzcGxpdHRlckluZGV4LCAxKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN1cGVyLnJlbW92ZUNoaWxkKGNvbnRlbnRJdGVtLCBrZWVwQ2hpbGQpO1xyXG5cclxuICAgICAgICAvLyBpZiAodGhpcy5jb250ZW50SXRlbXMubGVuZ3RoID09PSAxICYmIHRoaXMuaXNDbG9zYWJsZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIC8vICAgICBjb25zdCBjaGlsZEl0ZW0gPSB0aGlzLmNvbnRlbnRJdGVtc1swXTtcclxuICAgICAgICAvLyAgICAgdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoID0gMDtcclxuICAgICAgICAvLyAgICAgdGhpcy5fcm93T3JDb2x1bW5QYXJlbnQucmVwbGFjZUNoaWxkKHRoaXMsIGNoaWxkSXRlbSwgdHJ1ZSk7XHJcbiAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNpemUoZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuZW1pdFN0YXRlQ2hhbmdlZEV2ZW50KCk7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVwbGFjZXMgYSBjaGlsZCBvZiB0aGlzIFJvdyBvciBDb2x1bW4gd2l0aCBhbm90aGVyIGNvbnRlbnRJdGVtXHJcbiAgICAgKi9cclxuICAgIG92ZXJyaWRlIHJlcGxhY2VDaGlsZChvbGRDaGlsZDogQ29udGVudEl0ZW0sIG5ld0NoaWxkOiBDb250ZW50SXRlbSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHNpemUgPSBvbGRDaGlsZC5zaXplO1xyXG4gICAgICAgIHN1cGVyLnJlcGxhY2VDaGlsZChvbGRDaGlsZCwgbmV3Q2hpbGQpO1xyXG4gICAgICAgIG5ld0NoaWxkLnNpemUgPSBzaXplO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2l6ZShmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5lbWl0U3RhdGVDaGFuZ2VkRXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCB3aGVuZXZlciB0aGUgZGltZW5zaW9ucyBvZiB0aGlzIGl0ZW0gb3Igb25lIG9mIGl0cyBwYXJlbnRzIGNoYW5nZVxyXG4gICAgICovXHJcbiAgICBvdmVycmlkZSB1cGRhdGVTaXplKGZvcmNlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmJlZ2luVmlydHVhbFNpemVkQ29udGFpbmVyQWRkaW5nKCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVOb2RlU2l6ZSgpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbnRlbnRJdGVtc1NpemUoZm9yY2UpO1xyXG4gICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5lbmRWaXJ0dWFsU2l6ZWRDb250YWluZXJBZGRpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnZva2VkIHJlY3Vyc2l2ZWx5IGJ5IHRoZSBsYXlvdXQgbWFuYWdlci4gQ29udGVudEl0ZW0uaW5pdCBhcHBlbmRzXHJcbiAgICAgKiB0aGUgY29udGVudEl0ZW0ncyBET00gZWxlbWVudHMgdG8gdGhlIGNvbnRhaW5lciwgUm93T3JDb2x1bW4gaW5pdCBhZGRzIHNwbGl0dGVyc1xyXG4gICAgICogaW4gYmV0d2VlbiB0aGVtXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgb3ZlcnJpZGUgaW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5pc0luaXRpYWxpc2VkID09PSB0cnVlKSByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlTm9kZVNpemUoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLl9jaGlsZEVsZW1lbnRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5jb250ZW50SXRlbXNbaV0uZWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdXBlci5pbml0KCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoIC0gMTsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGVudEl0ZW1zW2ldLmVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCdhZnRlcmVuZCcsIHRoaXMuY3JlYXRlU3BsaXR0ZXIoaSkuZWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmluaXRDb250ZW50SXRlbXMoKTtcclxuICAgIH1cclxuXHJcbiAgICB0b0NvbmZpZygpOiBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlIGFzICdyb3cnIHwgJ2NvbHVtbicsXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IHRoaXMuY2FsY3VsYXRlQ29uZmlnQ29udGVudCgpIGFzIChSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZyB8IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnKVtdLFxyXG4gICAgICAgICAgICBzaXplOiB0aGlzLnNpemUsXHJcbiAgICAgICAgICAgIHNpemVVbml0OiB0aGlzLnNpemVVbml0LFxyXG4gICAgICAgICAgICBtaW5TaXplOiB0aGlzLm1pblNpemUsXHJcbiAgICAgICAgICAgIG1pblNpemVVbml0OiB0aGlzLm1pblNpemVVbml0LFxyXG4gICAgICAgICAgICBpZDogdGhpcy5pZCxcclxuICAgICAgICAgICAgaXNDbG9zYWJsZTogdGhpcy5pc0Nsb3NhYmxlLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBzZXRQYXJlbnQocGFyZW50OiBDb250ZW50SXRlbSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3Jvd09yQ29sdW1uUGFyZW50ID0gcGFyZW50O1xyXG4gICAgICAgIHN1cGVyLnNldFBhcmVudChwYXJlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgdXBkYXRlTm9kZVNpemUoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVSZWxhdGl2ZVNpemVzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0QWJzb2x1dGVTaXplcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZWRFdmVudCh0cnVlKTtcclxuICAgICAgICB0aGlzLmVtaXQoJ3Jlc2l6ZScpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHVybnMgdGhlIHJlbGF0aXZlIHNpemVzIGNhbGN1bGF0ZWQgYnkgY2FsY3VsYXRlUmVsYXRpdmVTaXplcyBpbnRvXHJcbiAgICAgKiBhYnNvbHV0ZSBwaXhlbCB2YWx1ZXMgYW5kIGFwcGxpZXMgdGhlbSB0byB0aGUgY2hpbGRyZW4ncyBET00gZWxlbWVudHNcclxuICAgICAqXHJcbiAgICAgKiBBc3NpZ25zIGFkZGl0aW9uYWwgcGl4ZWxzIHRvIGNvdW50ZXJhY3QgTWF0aC5mbG9vclxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc2V0QWJzb2x1dGVTaXplcygpIHtcclxuICAgICAgICBjb25zdCBhYnNvbHV0ZVNpemVzID0gdGhpcy5jYWxjdWxhdGVBYnNvbHV0ZVNpemVzKCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGFic29sdXRlU2l6ZXMuYWRkaXRpb25hbFBpeGVsIC0gaSA+IDApIHtcclxuICAgICAgICAgICAgICAgIGFic29sdXRlU2l6ZXMuaXRlbVNpemVzW2ldKys7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9pc0NvbHVtbikge1xyXG4gICAgICAgICAgICAgICAgc2V0RWxlbWVudFdpZHRoKHRoaXMuY29udGVudEl0ZW1zW2ldLmVsZW1lbnQsIGFic29sdXRlU2l6ZXMuY3Jvc3NBeGlzU2l6ZSk7XHJcbiAgICAgICAgICAgICAgICBzZXRFbGVtZW50SGVpZ2h0KHRoaXMuY29udGVudEl0ZW1zW2ldLmVsZW1lbnQsIGFic29sdXRlU2l6ZXMuaXRlbVNpemVzW2ldKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNldEVsZW1lbnRXaWR0aCh0aGlzLmNvbnRlbnRJdGVtc1tpXS5lbGVtZW50LCBhYnNvbHV0ZVNpemVzLml0ZW1TaXplc1tpXSk7XHJcbiAgICAgICAgICAgICAgICBzZXRFbGVtZW50SGVpZ2h0KHRoaXMuY29udGVudEl0ZW1zW2ldLmVsZW1lbnQsIGFic29sdXRlU2l6ZXMuY3Jvc3NBeGlzU2l6ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSBhYnNvbHV0ZSBzaXplcyBvZiBhbGwgb2YgdGhlIGNoaWxkcmVuIG9mIHRoaXMgSXRlbS5cclxuICAgICAqIEByZXR1cm5zIFNldCB3aXRoIGFic29sdXRlIHNpemVzIGFuZCBhZGRpdGlvbmFsIHBpeGVscy5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZUFic29sdXRlU2l6ZXMoKTogUm93T3JDb2x1bW4uQWJzb2x1dGVTaXplcyB7XHJcbiAgICAgICAgY29uc3QgdG90YWxTcGxpdHRlclNpemUgPSAodGhpcy5jb250ZW50SXRlbXMubGVuZ3RoIC0gMSkgKiB0aGlzLl9zcGxpdHRlclNpemU7XHJcbiAgICAgICAgY29uc3QgeyB3aWR0aDogZWxlbWVudFdpZHRoLCBoZWlnaHQ6IGVsZW1lbnRIZWlnaHQgfSA9IGdldEVsZW1lbnRXaWR0aEFuZEhlaWdodCh0aGlzLmVsZW1lbnQpO1xyXG5cclxuICAgICAgICBsZXQgdG90YWxTaXplOiBudW1iZXI7XHJcbiAgICAgICAgbGV0IGNyb3NzQXhpc1NpemU6IG51bWJlcjtcclxuICAgICAgICBpZiAodGhpcy5faXNDb2x1bW4pIHtcclxuICAgICAgICAgICAgdG90YWxTaXplID0gZWxlbWVudEhlaWdodCAtIHRvdGFsU3BsaXR0ZXJTaXplO1xyXG4gICAgICAgICAgICBjcm9zc0F4aXNTaXplID0gZWxlbWVudFdpZHRoO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRvdGFsU2l6ZSA9IGVsZW1lbnRXaWR0aCAtIHRvdGFsU3BsaXR0ZXJTaXplO1xyXG4gICAgICAgICAgICBjcm9zc0F4aXNTaXplID0gZWxlbWVudEhlaWdodDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB0b3RhbEFzc2lnbmVkID0gMDtcclxuICAgICAgICBjb25zdCBpdGVtU2l6ZXM6IG51bWJlcltdID0gW107XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSB0aGlzLmNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgbGV0IGl0ZW1TaXplOiBudW1iZXI7XHJcbiAgICAgICAgICAgIGlmIChjb250ZW50SXRlbS5zaXplVW5pdCA9PT0gU2l6ZVVuaXRFbnVtLlBlcmNlbnQpIHtcclxuICAgICAgICAgICAgICAgIGl0ZW1TaXplID0gTWF0aC5mbG9vcih0b3RhbFNpemUgKiAoY29udGVudEl0ZW0uc2l6ZSAvIDEwMCkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydEVycm9yKCdST0NDQVM2NjkyJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRvdGFsQXNzaWduZWQgKz0gaXRlbVNpemU7XHJcbiAgICAgICAgICAgIGl0ZW1TaXplcy5wdXNoKGl0ZW1TaXplKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWxQaXhlbCA9IE1hdGguZmxvb3IodG90YWxTaXplIC0gdG90YWxBc3NpZ25lZCk7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGl0ZW1TaXplcyxcclxuICAgICAgICAgICAgYWRkaXRpb25hbFBpeGVsLFxyXG4gICAgICAgICAgICB0b3RhbFNpemUsXHJcbiAgICAgICAgICAgIGNyb3NzQXhpc1NpemUsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgdGhlIHJlbGF0aXZlIHNpemVzIG9mIGFsbCBjaGlsZHJlbiBvZiB0aGlzIEl0ZW0uIFRoZSBsb2dpY1xyXG4gICAgICogaXMgYXMgZm9sbG93czpcclxuICAgICAqXHJcbiAgICAgKiAtIEFkZCB1cCB0aGUgdG90YWwgc2l6ZSBvZiBhbGwgaXRlbXMgdGhhdCBoYXZlIGEgY29uZmlndXJlZCBzaXplXHJcbiAgICAgKlxyXG4gICAgICogLSBJZiB0aGUgdG90YWwgPT0gMTAwIChjaGVjayBmb3IgZmxvYXRpbmcgcG9pbnQgZXJyb3JzKVxyXG4gICAgICogICAgICAgIEV4Y2VsbGVudCwgam9iIGRvbmVcclxuICAgICAqXHJcbiAgICAgKiAtIElmIHRoZSB0b3RhbCBpcyBcXD4gMTAwLFxyXG4gICAgICogICAgICAgIHNldCB0aGUgc2l6ZSBvZiBpdGVtcyB3aXRob3V0IHNldCBkaW1lbnNpb25zIHRvIDEvMyBhbmQgYWRkIHRoaXMgdG8gdGhlIHRvdGFsXHJcbiAgICAgKiAgICAgICAgc2V0IHRoZSBzaXplIG9mZiBhbGwgaXRlbXMgc28gdGhhdCB0aGUgdG90YWwgaXMgaHVuZHJlZCByZWxhdGl2ZSB0byB0aGVpciBvcmlnaW5hbCBzaXplXHJcbiAgICAgKlxyXG4gICAgICogLSBJZiB0aGUgdG90YWwgaXMgXFw8IDEwMFxyXG4gICAgICogICAgICAgIElmIHRoZXJlIGFyZSBpdGVtcyB3aXRob3V0IHNldCBkaW1lbnNpb25zLCBkaXN0cmlidXRlIHRoZSByZW1haW5kZXIgdG8gMTAwIGV2ZW5seSBiZXR3ZWVuIHRoZW1cclxuICAgICAqICAgICAgICBJZiB0aGVyZSBhcmUgbm8gaXRlbXMgd2l0aG91dCBzZXQgZGltZW5zaW9ucywgaW5jcmVhc2UgYWxsIGl0ZW1zIHNpemVzIHJlbGF0aXZlIHRvXHJcbiAgICAgKiAgICAgICAgdGhlaXIgb3JpZ2luYWwgc2l6ZSBzbyB0aGF0IHRoZXkgYWRkIHVwIHRvIDEwMFxyXG4gICAgICpcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZVJlbGF0aXZlU2l6ZXMoKSB7XHJcblxyXG4gICAgICAgIGxldCB0b3RhbCA9IDA7XHJcbiAgICAgICAgY29uc3QgaXRlbXNXaXRoRnJhY3Rpb25hbFNpemU6IENvbnRlbnRJdGVtW10gPSBbXTtcclxuICAgICAgICBsZXQgdG90YWxGcmFjdGlvbmFsU2l6ZSA9IDA7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSB0aGlzLmNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgY29uc3Qgc2l6ZVVuaXQgPSBjb250ZW50SXRlbS5zaXplVW5pdDtcclxuICAgICAgICAgICAgc3dpdGNoIChzaXplVW5pdCkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSBTaXplVW5pdEVudW0uUGVyY2VudDoge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGNvbnRlbnRJdGVtLnNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXNlIFNpemVVbml0RW51bS5GcmFjdGlvbmFsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbXNXaXRoRnJhY3Rpb25hbFNpemUucHVzaChjb250ZW50SXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdG90YWxGcmFjdGlvbmFsU2l6ZSArPSBjb250ZW50SXRlbS5zaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ1JPQ0NSUzQ5MTEwJywgSlNPTi5zdHJpbmdpZnkoY29udGVudEl0ZW0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogRXZlcnl0aGluZyBhZGRzIHVwIHRvIGh1bmRyZWQsIGFsbCBnb29kIDotKVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChNYXRoLnJvdW5kKHRvdGFsKSA9PT0gMTAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzcGVjdE1pbkl0ZW1TaXplKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICogQWxsb2NhdGUgdGhlIHJlbWFpbmluZyBzaXplIHRvIHRoZSBpdGVtcyB3aXRoIGEgZnJhY3Rpb25hbCBzaXplXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBpZiAoTWF0aC5yb3VuZCh0b3RhbCkgPCAxMDAgJiYgaXRlbXNXaXRoRnJhY3Rpb25hbFNpemUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZnJhY3Rpb25hbEFsbG9jYXRlZFNpemUgPSAxMDAgLSB0b3RhbDtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXNXaXRoRnJhY3Rpb25hbFNpemUubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IGl0ZW1zV2l0aEZyYWN0aW9uYWxTaXplW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemUgPSBmcmFjdGlvbmFsQWxsb2NhdGVkU2l6ZSAqIChjb250ZW50SXRlbS5zaXplIC8gdG90YWxGcmFjdGlvbmFsU2l6ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEl0ZW0uc2l6ZVVuaXQgPSBTaXplVW5pdEVudW0uUGVyY2VudDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMucmVzcGVjdE1pbkl0ZW1TaXplKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBJZiB0aGUgdG90YWwgaXMgPiAxMDAsIGJ1dCB0aGVyZSBhcmUgYWxzbyBpdGVtcyB3aXRoIGEgZnJhY3Rpb25hbCBzaXplLCBhc3NpZ24gYW5vdGhlciA1MCVcclxuICAgICAgICAgICAgICAgICAqIHRvIHRoZSBmcmFjdGlvbmFsIGl0ZW1zXHJcbiAgICAgICAgICAgICAgICAgKlxyXG4gICAgICAgICAgICAgICAgICogVGhpcyB3aWxsIGJlIHJlc2V0IGluIHRoZSBuZXh0IHN0ZXBcclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgaWYgKE1hdGgucm91bmQodG90YWwpID4gMTAwICYmIGl0ZW1zV2l0aEZyYWN0aW9uYWxTaXplLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zV2l0aEZyYWN0aW9uYWxTaXplLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gaXRlbXNXaXRoRnJhY3Rpb25hbFNpemVbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemUgPSA1MCAqIChjb250ZW50SXRlbS5zaXplIC8gdG90YWxGcmFjdGlvbmFsU2l6ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemVVbml0ID0gU2l6ZVVuaXRFbnVtLlBlcmNlbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IDUwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogU2V0IGV2ZXJ5IGl0ZW1zIHNpemUgcmVsYXRpdmUgdG8gMTAwIHJlbGF0aXZlIHRvIGl0cyBzaXplIHRvIHRvdGFsXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IHRoaXMuY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLnNpemUgPSAoY29udGVudEl0ZW0uc2l6ZSAvIHRvdGFsKSAqIDEwMDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3BlY3RNaW5JdGVtU2l6ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRqdXN0cyB0aGUgY29sdW1uIHdpZHRocyB0byByZXNwZWN0IHRoZSBkaW1lbnNpb25zIG1pbkl0ZW1XaWR0aCBpZiBzZXQuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByZXNwZWN0TWluSXRlbVNpemUoKSB7XHJcbiAgICAgICAgaW50ZXJmYWNlIEVudHJ5IHtcclxuICAgICAgICAgICAgc2l6ZTogbnVtYmVyO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbWluSXRlbVNpemUgPSB0aGlzLmNhbGN1bGF0ZUNvbnRlbnRJdGVtTWluU2l6ZSh0aGlzKTtcclxuXHJcbiAgICAgICAgaWYgKG1pbkl0ZW1TaXplIDw9IDAgfHwgdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoIDw9IDEpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCB0b3RhbE92ZXJNaW4gPSAwO1xyXG4gICAgICAgICAgICBsZXQgdG90YWxVbmRlck1pbiA9IDA7XHJcbiAgICAgICAgICAgIGNvbnN0IGVudHJpZXNPdmVyTWluOiBFbnRyeVtdID0gW107XHJcbiAgICAgICAgICAgIGNvbnN0IGFsbEVudHJpZXM6IEVudHJ5W10gPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGFic29sdXRlU2l6ZXMgPSB0aGlzLmNhbGN1bGF0ZUFic29sdXRlU2l6ZXMoKTtcclxuXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBGaWd1cmUgb3V0IGhvdyBtdWNoIHdlIGFyZSB1bmRlciB0aGUgbWluIGl0ZW0gc2l6ZSB0b3RhbCBhbmQgaG93IG11Y2ggcm9vbSB3ZSBoYXZlIHRvIHVzZS5cclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWJzb2x1dGVTaXplcy5pdGVtU2l6ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1TaXplID0gYWJzb2x1dGVTaXplcy5pdGVtU2l6ZXNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGVudHJ5OiBFbnRyeTtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtU2l6ZSA8IG1pbkl0ZW1TaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG90YWxVbmRlck1pbiArPSBtaW5JdGVtU2l6ZSAtIGl0ZW1TaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIGVudHJ5ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBtaW5JdGVtU2l6ZVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0b3RhbE92ZXJNaW4gKz0gaXRlbVNpemUgLSBtaW5JdGVtU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogaXRlbVNpemVcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIGVudHJpZXNPdmVyTWluLnB1c2goZW50cnkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGFsbEVudHJpZXMucHVzaChlbnRyeSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBJZiB0aGVyZSBpcyBub3RoaW5nIHVuZGVyIG1pbiwgb3IgdGhlcmUgaXMgbm90IGVub3VnaCBvdmVyIHRvIG1ha2UgdXAgdGhlIGRpZmZlcmVuY2UsIGRvIG5vdGhpbmcuXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBpZiAodG90YWxVbmRlck1pbiA9PT0gMCB8fCB0b3RhbFVuZGVyTWluID4gdG90YWxPdmVyTWluKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIEV2ZW5seSByZWR1Y2UgYWxsIGNvbHVtbnMgdGhhdCBhcmUgb3ZlciB0aGUgbWluIGl0ZW0gd2lkdGggdG8gbWFrZSB1cCB0aGUgZGlmZmVyZW5jZS5cclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVkdWNlUGVyY2VudCA9IHRvdGFsVW5kZXJNaW4gLyB0b3RhbE92ZXJNaW47XHJcbiAgICAgICAgICAgICAgICBsZXQgcmVtYWluaW5nU2l6ZSA9IHRvdGFsVW5kZXJNaW47XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXNPdmVyTWluLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzT3Zlck1pbltpXTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWR1Y2VkU2l6ZSA9IE1hdGgucm91bmQoKGVudHJ5LnNpemUgLSBtaW5JdGVtU2l6ZSkgKiByZWR1Y2VQZXJjZW50KTtcclxuICAgICAgICAgICAgICAgICAgICByZW1haW5pbmdTaXplIC09IHJlZHVjZWRTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIGVudHJ5LnNpemUgLT0gcmVkdWNlZFNpemU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgKiBUYWtlIGFueXRoaW5nIHJlbWFpbmluZyBmcm9tIHRoZSBsYXN0IGl0ZW0uXHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmdTaXplICE9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWxsRW50cmllc1thbGxFbnRyaWVzLmxlbmd0aCAtIDFdLnNpemUgLT0gcmVtYWluaW5nU2l6ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIFNldCBldmVyeSBpdGVtcyBzaXplIHJlbGF0aXZlIHRvIDEwMCByZWxhdGl2ZSB0byBpdHMgc2l6ZSB0byB0b3RhbFxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSB0aGlzLmNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50SXRlbS5zaXplID0gKGFsbEVudHJpZXNbaV0uc2l6ZSAvIGFic29sdXRlU2l6ZXMudG90YWxTaXplKSAqIDEwMDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyBTcGxpdHRlciwgYmluZHMgZXZlbnRzIHRvIGl0IGFuZCBhZGRzXHJcbiAgICAgKiBpdCB0byB0aGUgYXJyYXkgb2Ygc3BsaXR0ZXJzIGF0IHRoZSBwb3NpdGlvbiBzcGVjaWZpZWQgYXMgdGhlIGluZGV4IGFyZ3VtZW50XHJcbiAgICAgKlxyXG4gICAgICogV2hhdCBpdCBkb2Vzbid0IGRvIHRob3VnaCBpcyBhcHBlbmQgdGhlIHNwbGl0dGVyIHRvIHRoZSBET01cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaW5kZXggLSBUaGUgcG9zaXRpb24gb2YgdGhlIHNwbGl0dGVyXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZVNwbGl0dGVyKGluZGV4OiBudW1iZXIpOiBTcGxpdHRlciB7XHJcbiAgICAgICAgY29uc3Qgc3BsaXR0ZXIgPSBuZXcgU3BsaXR0ZXIodGhpcy5faXNDb2x1bW4sIHRoaXMuX3NwbGl0dGVyU2l6ZSwgdGhpcy5fc3BsaXR0ZXJHcmFiU2l6ZSk7XHJcbiAgICAgICAgc3BsaXR0ZXIub24oJ2RyYWcnLCAob2Zmc2V0WCwgb2Zmc2V0WSkgPT4gdGhpcy5vblNwbGl0dGVyRHJhZyhzcGxpdHRlciwgb2Zmc2V0WCwgb2Zmc2V0WSkpO1xyXG4gICAgICAgIHNwbGl0dGVyLm9uKCdkcmFnU3RvcCcsICgpID0+IHRoaXMub25TcGxpdHRlckRyYWdTdG9wKHNwbGl0dGVyKSk7XHJcbiAgICAgICAgc3BsaXR0ZXIub24oJ2RyYWdTdGFydCcsICgpID0+IHRoaXMub25TcGxpdHRlckRyYWdTdGFydChzcGxpdHRlcikpO1xyXG4gICAgICAgIHRoaXMuX3NwbGl0dGVyLnNwbGljZShpbmRleCwgMCwgc3BsaXR0ZXIpO1xyXG4gICAgICAgIHJldHVybiBzcGxpdHRlcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIExvY2F0ZXMgdGhlIGluc3RhbmNlIG9mIFNwbGl0dGVyIGluIHRoZSBhcnJheSBvZlxyXG4gICAgICogcmVnaXN0ZXJlZCBzcGxpdHRlcnMgYW5kIHJldHVybnMgYSBtYXAgY29udGFpbmluZyB0aGUgY29udGVudEl0ZW1cclxuICAgICAqIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHNwbGl0dGVycywgYm90aCBvZiB3aGljaCBhcmUgYWZmZWN0ZWQgaWYgdGhlXHJcbiAgICAgKiBzcGxpdHRlciBpcyBtb3ZlZFxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIEEgbWFwIG9mIGNvbnRlbnRJdGVtcyB0aGF0IHRoZSBzcGxpdHRlciBhZmZlY3RzXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRTcGxpdEl0ZW1zKHNwbGl0dGVyOiBTcGxpdHRlcikge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fc3BsaXR0ZXIuaW5kZXhPZihzcGxpdHRlcik7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGJlZm9yZTogdGhpcy5jb250ZW50SXRlbXNbaW5kZXhdLFxyXG4gICAgICAgICAgICBhZnRlcjogdGhpcy5jb250ZW50SXRlbXNbaW5kZXggKyAxXVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVDb250ZW50SXRlbU1pblNpemUoY29udGVudEl0ZW06IENvbnRlbnRJdGVtKSB7XHJcbiAgICAgICAgY29uc3QgbWluU2l6ZSA9IGNvbnRlbnRJdGVtLm1pblNpemU7XHJcbiAgICAgICAgaWYgKG1pblNpemUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZiAoY29udGVudEl0ZW0ubWluU2l6ZVVuaXQgPT09IFNpemVVbml0RW51bS5QaXhlbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1pblNpemU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ1JPQ0dNRDk4ODMxJywgSlNPTi5zdHJpbmdpZnkoY29udGVudEl0ZW0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpbWVuc2lvbnMgPSB0aGlzLmxheW91dE1hbmFnZXIubGF5b3V0Q29uZmlnLmRpbWVuc2lvbnM7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pc0NvbHVtbiA/IGRpbWVuc2lvbnMuZGVmYXVsdE1pbkl0ZW1IZWlnaHQgOiBkaW1lbnNpb25zLmRlZmF1bHRNaW5JdGVtV2lkdGg7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgbWluaW11bSBkaW1lbnNpb25zIGZvciB0aGUgZ2l2ZW4gaXRlbSB0YWtpbmcgaXRzIGNoaWxkcmVuIGludG8gY29uc2lkZXJhdGlvbi5cclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZUNvbnRlbnRJdGVtc1RvdGFsTWluU2l6ZShjb250ZW50SXRlbTogQ29udGVudEl0ZW0pIHtcclxuICAgICAgICBsZXQgY2hpbGRyZW5NaW5TaXplID0gMDtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBjb250ZW50SXRlbS5jb250ZW50SXRlbXMpIHtcclxuICAgICAgICAgICAgY29uc3QgbWluU2l6ZSA9IHRoaXMuY2FsY3VsYXRlQ29udGVudEl0ZW1zVG90YWxNaW5TaXplKGNoaWxkKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjb250ZW50SXRlbSBpbnN0YW5jZW9mIFJvd09yQ29sdW1uICYmIChjb250ZW50SXRlbS5pc0NvbHVtbiA9PT0gdGhpcy5faXNDb2x1bW4pKSB7XHJcbiAgICAgICAgICAgICAgICBjaGlsZHJlbk1pblNpemUgKz0gbWluU2l6ZTsgLy8gUHJvYmFibHkgbm90IHBvc3NpYmxlIChSb3cgaW5zaWRlIHJvdywgb3IgY29sdW1uIGluc2lkZSBjb2x1bW4pXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjaGlsZHJlbk1pblNpemUgPSBNYXRoLm1heChjaGlsZHJlbk1pblNpemUsIG1pblNpemUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBtaW5TaXplID0gdGhpcy5jYWxjdWxhdGVDb250ZW50SXRlbU1pblNpemUoY29udGVudEl0ZW0pO1xyXG4gICAgICAgIHJldHVybiBNYXRoLm1heChtaW5TaXplLCBjaGlsZHJlbk1pblNpemUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW52b2tlZCB3aGVuIGEgc3BsaXR0ZXIncyBkcmFnTGlzdGVuZXIgZmlyZXMgZHJhZ1N0YXJ0LiBDYWxjdWxhdGVzIHRoZSBzcGxpdHRlcnNcclxuICAgICAqIG1vdmVtZW50IGFyZWEgb25jZSAoc28gdGhhdCBpdCBkb2Vzbid0IG5lZWQgY2FsY3VsYXRpbmcgb24gZXZlcnkgbW91c2Vtb3ZlIGV2ZW50KVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25TcGxpdHRlckRyYWdTdGFydChzcGxpdHRlcjogU3BsaXR0ZXIpIHtcclxuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0U3BsaXRJdGVtcyhzcGxpdHRlcik7XHJcblxyXG4gICAgICAgIGNvbnN0IGJlZm9yZVdpZHRoID0gcGl4ZWxzVG9OdW1iZXIoaXRlbXMuYmVmb3JlLmVsZW1lbnQuc3R5bGVbdGhpcy5fZGltZW5zaW9uXSk7XHJcbiAgICAgICAgY29uc3QgYWZ0ZXJTaXplID0gcGl4ZWxzVG9OdW1iZXIoaXRlbXMuYWZ0ZXIuZWxlbWVudC5zdHlsZVt0aGlzLl9kaW1lbnNpb25dKTtcclxuICAgICAgICBjb25zdCBiZWZvcmVNaW5TaXplID0gdGhpcy5jYWxjdWxhdGVDb250ZW50SXRlbXNUb3RhbE1pblNpemUoaXRlbXMuYmVmb3JlKTtcclxuICAgICAgICBjb25zdCBhZnRlck1pblNpemUgPSB0aGlzLmNhbGN1bGF0ZUNvbnRlbnRJdGVtc1RvdGFsTWluU2l6ZShpdGVtcy5hZnRlcik7XHJcblxyXG4gICAgICAgIHRoaXMuX3NwbGl0dGVyUG9zaXRpb24gPSAwO1xyXG4gICAgICAgIHRoaXMuX3NwbGl0dGVyTWluUG9zaXRpb24gPSBNYXRoLm1pbigwLCAtMSAqIChiZWZvcmVXaWR0aCAtIGJlZm9yZU1pblNpemUpKTtcclxuICAgICAgICB0aGlzLl9zcGxpdHRlck1heFBvc2l0aW9uID0gTWF0aC5tYXgoMCwgYWZ0ZXJTaXplIC0gYWZ0ZXJNaW5TaXplKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEludm9rZWQgd2hlbiBhIHNwbGl0dGVyJ3MgRHJhZ0xpc3RlbmVyIGZpcmVzIGRyYWcuIFVwZGF0ZXMgdGhlIHNwbGl0dGVyJ3MgRE9NIHBvc2l0aW9uLFxyXG4gICAgICogYnV0IG5vdCB0aGUgc2l6ZXMgb2YgdGhlIGVsZW1lbnRzIHRoZSBzcGxpdHRlciBjb250cm9scyBpbiBvcmRlciB0byBtaW5pbWl6ZSByZXNpemUgZXZlbnRzXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHNwbGl0dGVyIC1cclxuICAgICAqIEBwYXJhbSBvZmZzZXRYIC0gUmVsYXRpdmUgcGl4ZWwgdmFsdWVzIHRvIHRoZSBzcGxpdHRlcidzIG9yaWdpbmFsIHBvc2l0aW9uLiBDYW4gYmUgbmVnYXRpdmVcclxuICAgICAqIEBwYXJhbSBvZmZzZXRZIC0gUmVsYXRpdmUgcGl4ZWwgdmFsdWVzIHRvIHRoZSBzcGxpdHRlcidzIG9yaWdpbmFsIHBvc2l0aW9uLiBDYW4gYmUgbmVnYXRpdmVcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uU3BsaXR0ZXJEcmFnKHNwbGl0dGVyOiBTcGxpdHRlciwgb2Zmc2V0WDogbnVtYmVyLCBvZmZzZXRZOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgb2Zmc2V0ID0gdGhpcy5faXNDb2x1bW4gPyBvZmZzZXRZIDogb2Zmc2V0WDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3NwbGl0dGVyTWluUG9zaXRpb24gPT09IG51bGwgfHwgdGhpcy5fc3BsaXR0ZXJNYXhQb3NpdGlvbiA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignUk9DT1NENTkyMjYnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb2Zmc2V0ID0gTWF0aC5tYXgob2Zmc2V0LCB0aGlzLl9zcGxpdHRlck1pblBvc2l0aW9uKTtcclxuICAgICAgICBvZmZzZXQgPSBNYXRoLm1pbihvZmZzZXQsIHRoaXMuX3NwbGl0dGVyTWF4UG9zaXRpb24pO1xyXG5cclxuICAgICAgICB0aGlzLl9zcGxpdHRlclBvc2l0aW9uID0gb2Zmc2V0O1xyXG4gICAgICAgIGNvbnN0IG9mZnNldFBpeGVscyA9IG51bWJlclRvUGl4ZWxzKG9mZnNldCk7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzQ29sdW1uKSB7XHJcbiAgICAgICAgICAgIHNwbGl0dGVyLmVsZW1lbnQuc3R5bGUudG9wID0gb2Zmc2V0UGl4ZWxzO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNwbGl0dGVyLmVsZW1lbnQuc3R5bGUubGVmdCA9IG9mZnNldFBpeGVscztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnZva2VkIHdoZW4gYSBzcGxpdHRlcidzIERyYWdMaXN0ZW5lciBmaXJlcyBkcmFnU3RvcC4gUmVzZXRzIHRoZSBzcGxpdHRlcnMgRE9NIHBvc2l0aW9uLFxyXG4gICAgICogYW5kIGFwcGxpZXMgdGhlIG5ldyBzaXplcyB0byB0aGUgZWxlbWVudHMgYmVmb3JlIGFuZCBhZnRlciB0aGUgc3BsaXR0ZXIgYW5kIHRoZWlyIGNoaWxkcmVuXHJcbiAgICAgKiBvbiB0aGUgbmV4dCBhbmltYXRpb24gZnJhbWVcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uU3BsaXR0ZXJEcmFnU3RvcChzcGxpdHRlcjogU3BsaXR0ZXIpIHtcclxuICAgICAgICBpZiAodGhpcy5fc3BsaXR0ZXJQb3NpdGlvbiA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignUk9DT1NEUzY2OTMyJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldFNwbGl0SXRlbXMoc3BsaXR0ZXIpO1xyXG4gICAgICAgICAgICBjb25zdCBzaXplQmVmb3JlID0gcGl4ZWxzVG9OdW1iZXIoaXRlbXMuYmVmb3JlLmVsZW1lbnQuc3R5bGVbdGhpcy5fZGltZW5zaW9uXSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNpemVBZnRlciA9IHBpeGVsc1RvTnVtYmVyKGl0ZW1zLmFmdGVyLmVsZW1lbnQuc3R5bGVbdGhpcy5fZGltZW5zaW9uXSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNwbGl0dGVyUG9zaXRpb25JblJhbmdlID0gKHRoaXMuX3NwbGl0dGVyUG9zaXRpb24gKyBzaXplQmVmb3JlKSAvIChzaXplQmVmb3JlICsgc2l6ZUFmdGVyKTtcclxuICAgICAgICAgICAgY29uc3QgdG90YWxSZWxhdGl2ZVNpemUgPSBpdGVtcy5iZWZvcmUuc2l6ZSArIGl0ZW1zLmFmdGVyLnNpemU7XHJcblxyXG4gICAgICAgICAgICBpdGVtcy5iZWZvcmUuc2l6ZSA9IHNwbGl0dGVyUG9zaXRpb25JblJhbmdlICogdG90YWxSZWxhdGl2ZVNpemU7XHJcbiAgICAgICAgICAgIGl0ZW1zLmFmdGVyLnNpemUgPSAoMSAtIHNwbGl0dGVyUG9zaXRpb25JblJhbmdlKSAqIHRvdGFsUmVsYXRpdmVTaXplO1xyXG5cclxuICAgICAgICAgICAgc3BsaXR0ZXIuZWxlbWVudC5zdHlsZS50b3AgPSBudW1iZXJUb1BpeGVscygwKTtcclxuICAgICAgICAgICAgc3BsaXR0ZXIuZWxlbWVudC5zdHlsZS5sZWZ0ID0gbnVtYmVyVG9QaXhlbHMoMCk7XHJcblxyXG4gICAgICAgICAgICBnbG9iYWxUaGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLnVwZGF0ZVNpemUoZmFsc2UpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBlbWl0U3RhdGVDaGFuZ2VkRXZlbnQoZGVib3VuY2UgPSBmYWxzZSkge1xyXG4gICAgICAgIGlmIChkZWJvdW5jZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9kZWJvdW5jZWRFbWl0U3RhdGVDaGFuZ2VkRXZlbnQoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmVtaXRCYXNlQnViYmxpbmdFdmVudCgnc3RhdGVDaGFuZ2VkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFJvd09yQ29sdW1uIHtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQWJzb2x1dGVTaXplcyB7XHJcbiAgICAgICAgaXRlbVNpemVzOiBudW1iZXJbXSxcclxuICAgICAgICBhZGRpdGlvbmFsUGl4ZWw6IG51bWJlcixcclxuICAgICAgICB0b3RhbFNpemU6IG51bWJlcixcclxuICAgICAgICBjcm9zc0F4aXNTaXplOiBudW1iZXJcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0RWxlbWVudERpbWVuc2lvblNpemUoZWxlbWVudDogSFRNTEVsZW1lbnQsIGRpbWVuc2lvbjogV2lkdGhPckhlaWdodFByb3BlcnR5TmFtZSk6IG51bWJlciB7XHJcbiAgICAgICAgaWYgKGRpbWVuc2lvbiA9PT0gJ3dpZHRoJykge1xyXG4gICAgICAgICAgICByZXR1cm4gZ2V0RWxlbWVudFdpZHRoKGVsZW1lbnQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBnZXRFbGVtZW50SGVpZ2h0KGVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gc2V0RWxlbWVudERpbWVuc2lvblNpemUoZWxlbWVudDogSFRNTEVsZW1lbnQsIGRpbWVuc2lvbjogV2lkdGhPckhlaWdodFByb3BlcnR5TmFtZSwgdmFsdWU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGlmIChkaW1lbnNpb24gPT09ICd3aWR0aCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHNldEVsZW1lbnRXaWR0aChlbGVtZW50LCB2YWx1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHNldEVsZW1lbnRIZWlnaHQoZWxlbWVudCwgdmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlRWxlbWVudChkb2N1bWVudDogRG9jdW1lbnQsIGlzQ29sdW1uOiBib29sZWFuKTogSFRNTERpdkVsZW1lbnQge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5JdGVtKTtcclxuICAgICAgICBpZiAoaXNDb2x1bW4pIHtcclxuICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuQ29sdW1uKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Sb3cpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgeyBDb21wb25lbnRJdGVtQ29uZmlnLCBJdGVtQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL2NvbmZpZyc7XHJcbmltcG9ydCB7IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZywgUmVzb2x2ZWRIZWFkZXJlZEl0ZW1Db25maWcsIFJlc29sdmVkSXRlbUNvbmZpZywgUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcgfSBmcm9tICcuLi9jb25maWcvcmVzb2x2ZWQtY29uZmlnJztcclxuaW1wb3J0IHsgSGVhZGVyIH0gZnJvbSAnLi4vY29udHJvbHMvaGVhZGVyJztcclxuaW1wb3J0IHsgQXNzZXJ0RXJyb3IsIFVuZXhwZWN0ZWROdWxsRXJyb3IsIFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IExheW91dE1hbmFnZXIgfSBmcm9tICcuLi9sYXlvdXQtbWFuYWdlcic7XHJcbmltcG9ydCB7IERvbUNvbnN0YW50cyB9IGZyb20gJy4uL3V0aWxzL2RvbS1jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBEcmFnTGlzdGVuZXIgfSBmcm9tICcuLi91dGlscy9kcmFnLWxpc3RlbmVyJztcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vdXRpbHMvZXZlbnQtZW1pdHRlcic7XHJcbmltcG9ydCB7IEFyZWFMaW5rZWRSZWN0LCBJdGVtVHlwZSwgSnNvblZhbHVlLCBTaWRlLCBTaXplVW5pdEVudW0sIFdpZHRoQW5kSGVpZ2h0LCBXaWR0aE9ySGVpZ2h0UHJvcGVydHlOYW1lIH0gZnJvbSAnLi4vdXRpbHMvdHlwZXMnO1xyXG5pbXBvcnQge1xyXG4gICAgZGVib3VuY2UsXHJcbiAgICBnZXRFbGVtZW50V2lkdGhBbmRIZWlnaHQsXHJcbiAgICBzZXRFbGVtZW50RGlzcGxheVZpc2liaWxpdHksXHJcbiAgICBzZXRFbGVtZW50SGVpZ2h0LFxyXG4gICAgc2V0RWxlbWVudFdpZHRoXHJcbn0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRJdGVtIH0gZnJvbSAnLi9jb21wb25lbnQtaXRlbSc7XHJcbmltcG9ydCB7IENvbXBvbmVudFBhcmVudGFibGVJdGVtIH0gZnJvbSAnLi9jb21wb25lbnQtcGFyZW50YWJsZS1pdGVtJztcclxuaW1wb3J0IHsgQ29udGVudEl0ZW0gfSBmcm9tICcuL2NvbnRlbnQtaXRlbSc7XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgY2xhc3MgU3RhY2sgZXh0ZW5kcyBDb21wb25lbnRQYXJlbnRhYmxlSXRlbSB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9oZWFkZXJDb25maWc6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlciB8IHVuZGVmaW5lZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2hlYWRlcjogSGVhZGVyO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2hpbGRFbGVtZW50Q29udGFpbmVyOiBIVE1MRWxlbWVudDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX21heGltaXNlZEVuYWJsZWQ6IGJvb2xlYW47XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9hY3RpdmVDb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtIHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfZHJvcFNlZ21lbnQ6IFN0YWNrLlNlZ21lbnQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9kcm9wSW5kZXg6IG51bWJlcjtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2NvbnRlbnRBcmVhRGltZW5zaW9uczogU3RhY2suQ29udGVudEFyZWFEaW1lbnNpb25zO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaGVhZGVyU2lkZUNoYW5nZWQgPSBmYWxzZTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2luaXRpYWxXYW50TWF4aW1pc2U6IGJvb2xlYW47XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9pbml0aWFsQWN0aXZlSXRlbUluZGV4OiBudW1iZXI7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfcmVzaXplTGlzdGVuZXIgPSAoKSA9PiB0aGlzLmhhbmRsZVJlc2l6ZSgpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfbWF4aW1pc2VkTGlzdGVuZXIgPSAoKSA9PiB0aGlzLmhhbmRsZU1heGltaXNlZCgpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfbWluaW1pc2VkTGlzdGVuZXIgPSAoKSA9PiB0aGlzLmhhbmRsZU1pbmltaXNlZCgpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZGVib3VuY2VkRW1pdFN0YXRlQ2hhbmdlZEV2ZW50ID0gZGVib3VuY2UoKCkgPT4gdGhpcy5lbWl0QmFzZUJ1YmJsaW5nRXZlbnQoJ3N0YXRlQ2hhbmdlZCcpKTtcclxuXHJcbiAgICBnZXQgY2hpbGRFbGVtZW50Q29udGFpbmVyKCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lcjsgfVxyXG4gICAgZ2V0IGhlYWRlcigpOiBIZWFkZXIgeyByZXR1cm4gdGhpcy5faGVhZGVyOyB9XHJcbiAgICBnZXQgaGVhZGVyU2hvdygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2hlYWRlci5zaG93OyB9XHJcbiAgICBnZXQgaGVhZGVyU2lkZSgpOiBTaWRlIHsgcmV0dXJuIHRoaXMuX2hlYWRlci5zaWRlOyB9XHJcbiAgICBnZXQgaGVhZGVyTGVmdFJpZ2h0U2lkZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9oZWFkZXIubGVmdFJpZ2h0U2lkZWQ7IH1cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGdldCBjb250ZW50QXJlYURpbWVuc2lvbnMoKTogU3RhY2suQ29udGVudEFyZWFEaW1lbnNpb25zIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX2NvbnRlbnRBcmVhRGltZW5zaW9uczsgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZ2V0IGluaXRpYWxXYW50TWF4aW1pc2UoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9pbml0aWFsV2FudE1heGltaXNlOyB9XHJcbiAgICBnZXQgaXNNYXhpbWlzZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzID09PSB0aGlzLmxheW91dE1hbmFnZXIubWF4aW1pc2VkU3RhY2s7IH1cclxuICAgIGdldCBzdGFja1BhcmVudCgpOiBDb250ZW50SXRlbSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnBhcmVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N0YWNrIHNob3VsZCBhbHdheXMgaGF2ZSBhIHBhcmVudCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IobGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlciwgY29uZmlnOiBSZXNvbHZlZFN0YWNrSXRlbUNvbmZpZywgcGFyZW50OiBDb250ZW50SXRlbSkge1xyXG4gICAgICAgIHN1cGVyKGxheW91dE1hbmFnZXIsIGNvbmZpZywgcGFyZW50LCBTdGFjay5jcmVhdGVFbGVtZW50KGRvY3VtZW50KSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2hlYWRlckNvbmZpZyA9IGNvbmZpZy5oZWFkZXI7XHJcbiAgICAgICAgY29uc3QgbGF5b3V0SGVhZGVyQ29uZmlnID0gbGF5b3V0TWFuYWdlci5sYXlvdXRDb25maWcuaGVhZGVyO1xyXG4gICAgICAgIGNvbnN0IGNvbmZpZ0NvbnRlbnQgPSBjb25maWcuY29udGVudDtcclxuICAgICAgICAvLyBJZiBzdGFjayBoYXMgb25seSBvbmUgY29tcG9uZW50LCB0aGVuIHdlIGNhbiBhbHNvIGNoZWNrIHRoaXMgZm9yIGhlYWRlciBzZXR0aW5nc1xyXG4gICAgICAgIGxldCBjb21wb25lbnRIZWFkZXJDb25maWc6IFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlciB8IHVuZGVmaW5lZDtcclxuICAgICAgICBpZiAoY29uZmlnQ29udGVudC5sZW5ndGggIT09IDEpIHtcclxuICAgICAgICAgICAgY29tcG9uZW50SGVhZGVyQ29uZmlnID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0Q2hpbGRJdGVtQ29uZmlnID0gY29uZmlnQ29udGVudFswXTtcclxuICAgICAgICAgICAgY29tcG9uZW50SGVhZGVyQ29uZmlnID0gKGZpcnN0Q2hpbGRJdGVtQ29uZmlnIGFzIFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnKS5oZWFkZXI7IC8vIHdpbGwgYmUgdW5kZWZpbmVkIGlmIG5vdCBjb21wb25lbnQgKGFuZCB3b250IGJlIHN0YWNrKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5faW5pdGlhbFdhbnRNYXhpbWlzZSA9IGNvbmZpZy5tYXhpbWlzZWQ7XHJcbiAgICAgICAgdGhpcy5faW5pdGlhbEFjdGl2ZUl0ZW1JbmRleCA9IGNvbmZpZy5hY3RpdmVJdGVtSW5kZXggPz8gMDsgLy8gbWFrZSBzdXJlIGRlZmluZWRcclxuXHJcbiAgICAgICAgLy8gY2hlY2sgZm9yIGRlZmluZWQgdmFsdWUgZm9yIGVhY2ggaXRlbSBpbiBvcmRlciBvZiBTdGFjayAodGhpcyBJdGVtKSwgQ29tcG9uZW50IChmaXJzdCBjaGlsZCksIE1hbmFnZXIuXHJcbiAgICAgICAgY29uc3Qgc2hvdyA9IHRoaXMuX2hlYWRlckNvbmZpZz8uc2hvdyA/PyBjb21wb25lbnRIZWFkZXJDb25maWc/LnNob3cgPz8gbGF5b3V0SGVhZGVyQ29uZmlnLnNob3c7XHJcbiAgICAgICAgY29uc3QgcG9wb3V0ID0gdGhpcy5faGVhZGVyQ29uZmlnPy5wb3BvdXQgPz8gY29tcG9uZW50SGVhZGVyQ29uZmlnPy5wb3BvdXQgPz8gbGF5b3V0SGVhZGVyQ29uZmlnLnBvcG91dDtcclxuICAgICAgICBjb25zdCBtYXhpbWlzZSA9IHRoaXMuX2hlYWRlckNvbmZpZz8ubWF4aW1pc2UgPz8gY29tcG9uZW50SGVhZGVyQ29uZmlnPy5tYXhpbWlzZSA/PyBsYXlvdXRIZWFkZXJDb25maWcubWF4aW1pc2U7XHJcbiAgICAgICAgY29uc3QgY2xvc2UgPSB0aGlzLl9oZWFkZXJDb25maWc/LmNsb3NlID8/IGNvbXBvbmVudEhlYWRlckNvbmZpZz8uY2xvc2UgPz8gbGF5b3V0SGVhZGVyQ29uZmlnLmNsb3NlO1xyXG4gICAgICAgIGNvbnN0IG1pbmltaXNlID0gdGhpcy5faGVhZGVyQ29uZmlnPy5taW5pbWlzZSA/PyBjb21wb25lbnRIZWFkZXJDb25maWc/Lm1pbmltaXNlID8/IGxheW91dEhlYWRlckNvbmZpZy5taW5pbWlzZTtcclxuICAgICAgICBjb25zdCB0YWJEcm9wZG93biA9IHRoaXMuX2hlYWRlckNvbmZpZz8udGFiRHJvcGRvd24gPz8gY29tcG9uZW50SGVhZGVyQ29uZmlnPy50YWJEcm9wZG93biA/PyBsYXlvdXRIZWFkZXJDb25maWcudGFiRHJvcGRvd247XHJcbiAgICAgICAgdGhpcy5fbWF4aW1pc2VkRW5hYmxlZCA9IG1heGltaXNlICE9PSBmYWxzZTtcclxuICAgICAgICBjb25zdCBoZWFkZXJTZXR0aW5nczogSGVhZGVyLlNldHRpbmdzID0ge1xyXG4gICAgICAgICAgICBzaG93OiBzaG93ICE9PSBmYWxzZSxcclxuICAgICAgICAgICAgc2lkZTogc2hvdyA9PT0gZmFsc2UgPyBTaWRlLnRvcCA6IHNob3csXHJcbiAgICAgICAgICAgIHBvcG91dEVuYWJsZWQ6IHBvcG91dCAhPT0gZmFsc2UsXHJcbiAgICAgICAgICAgIHBvcG91dExhYmVsOiBwb3BvdXQgPT09IGZhbHNlID8gJycgOiBwb3BvdXQsXHJcbiAgICAgICAgICAgIG1heGltaXNlRW5hYmxlZDogdGhpcy5fbWF4aW1pc2VkRW5hYmxlZCxcclxuICAgICAgICAgICAgbWF4aW1pc2VMYWJlbDogbWF4aW1pc2UgPT09IGZhbHNlID8gJycgOiBtYXhpbWlzZSxcclxuICAgICAgICAgICAgY2xvc2VFbmFibGVkOiBjbG9zZSAhPT0gZmFsc2UsXHJcbiAgICAgICAgICAgIGNsb3NlTGFiZWw6IGNsb3NlID09PSBmYWxzZSA/ICcnIDogY2xvc2UsXHJcbiAgICAgICAgICAgIG1pbmltaXNlRW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICAgICAgbWluaW1pc2VMYWJlbDogbWluaW1pc2UsXHJcbiAgICAgICAgICAgIHRhYkRyb3Bkb3duRW5hYmxlZDogdGFiRHJvcGRvd24gIT09IGZhbHNlLFxyXG4gICAgICAgICAgICB0YWJEcm9wZG93bkxhYmVsOiB0YWJEcm9wZG93biA9PT0gZmFsc2UgPyAnJyA6IHRhYkRyb3Bkb3duLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuX2hlYWRlciA9IG5ldyBIZWFkZXIobGF5b3V0TWFuYWdlcixcclxuICAgICAgICAgICAgdGhpcywgaGVhZGVyU2V0dGluZ3MsXHJcbiAgICAgICAgICAgICgpID0+IHRoaXMuZ2V0QWN0aXZlQ29tcG9uZW50SXRlbSgpLFxyXG4gICAgICAgICAgICAoKSA9PiB0aGlzLnJlbW92ZSgpLFxyXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmhhbmRsZVBvcG91dEV2ZW50KCksXHJcbiAgICAgICAgICAgICgpID0+IHRoaXMudG9nZ2xlTWF4aW1pc2UoKSxcclxuICAgICAgICAgICAgKGV2KSA9PiB0aGlzLmhhbmRsZUhlYWRlckNsaWNrRXZlbnQoZXYpLFxyXG4gICAgICAgICAgICAoZXYpID0+IHRoaXMuaGFuZGxlSGVhZGVyVG91Y2hTdGFydEV2ZW50KGV2KSxcclxuICAgICAgICAgICAgKGl0ZW0pID0+IHRoaXMuaGFuZGxlSGVhZGVyQ29tcG9uZW50UmVtb3ZlRXZlbnQoaXRlbSksXHJcbiAgICAgICAgICAgIChpdGVtKSA9PiB0aGlzLmhhbmRsZUhlYWRlckNvbXBvbmVudEZvY3VzRXZlbnQoaXRlbSksXHJcbiAgICAgICAgICAgICh4LCB5LCBkcmFnTGlzdGVuZXIsIGl0ZW0pID0+IHRoaXMuaGFuZGxlSGVhZGVyQ29tcG9uZW50U3RhcnREcmFnRXZlbnQoeCwgeSwgZHJhZ0xpc3RlbmVyLCBpdGVtKSxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvLyB0aGlzLl9kcm9wWm9uZXMgPSB7fTtcclxuXHJcbiAgICAgICAgdGhpcy5pc1N0YWNrID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fY2hpbGRFbGVtZW50Q29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2VjdGlvbicpO1xyXG4gICAgICAgIHRoaXMuX2NoaWxkRWxlbWVudENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuSXRlbXMpO1xyXG5cclxuICAgICAgICB0aGlzLm9uKCdyZXNpemUnLCB0aGlzLl9yZXNpemVMaXN0ZW5lcik7XHJcbiAgICAgICAgaWYgKHRoaXMuX21heGltaXNlZEVuYWJsZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5vbignbWF4aW1pc2VkJywgdGhpcy5fbWF4aW1pc2VkTGlzdGVuZXIpO1xyXG4gICAgICAgICAgICB0aGlzLm9uKCdtaW5pbWlzZWQnLCB0aGlzLl9taW5pbWlzZWRMaXN0ZW5lcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5faGVhZGVyLmVsZW1lbnQpO1xyXG4gICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9jaGlsZEVsZW1lbnRDb250YWluZXIpO1xyXG5cclxuICAgICAgICB0aGlzLnNldHVwSGVhZGVyUG9zaXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBvdmVycmlkZSB1cGRhdGVTaXplKGZvcmNlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLmJlZ2luVmlydHVhbFNpemVkQ29udGFpbmVyQWRkaW5nKCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVOb2RlU2l6ZSgpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbnRlbnRJdGVtc1NpemUoZm9yY2UpO1xyXG4gICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5lbmRWaXJ0dWFsU2l6ZWRDb250YWluZXJBZGRpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgb3ZlcnJpZGUgaW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5pc0luaXRpYWxpc2VkID09PSB0cnVlKSByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlTm9kZVNpemUoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLl9jaGlsZEVsZW1lbnRDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5jb250ZW50SXRlbXNbaV0uZWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdXBlci5pbml0KCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtcyA9IHRoaXMuY29udGVudEl0ZW1zO1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtQ291bnQgPSBjb250ZW50SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgIGlmIChjb250ZW50SXRlbUNvdW50ID4gMCkgeyAvLyBjb250ZW50SXRlbUNvdW50IHdpbGwgYmUgMCBvbiBkcmFnIGRyb3BcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxBY3RpdmVJdGVtSW5kZXggPCAwIHx8IHRoaXMuX2luaXRpYWxBY3RpdmVJdGVtSW5kZXggPj0gY29udGVudEl0ZW1Db3VudCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBY3RpdmVJdGVtSW5kZXggb3V0IG9mIHJhbmdlOiAke3RoaXMuX2luaXRpYWxBY3RpdmVJdGVtSW5kZXh9IGlkOiAke3RoaXMuaWR9YCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnRJdGVtQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKGNvbnRlbnRJdGVtIGluc3RhbmNlb2YgQ29tcG9uZW50SXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdGFjayBDb250ZW50IEl0ZW0gaXMgbm90IG9mIHR5cGUgQ29tcG9uZW50SXRlbTogJHtpfSBpZDogJHt0aGlzLmlkfWApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2hlYWRlci5jcmVhdGVUYWIoY29udGVudEl0ZW0sIGkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50SXRlbS5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRJdGVtLmNvbnRhaW5lci5zZXRCYXNlTG9naWNhbFpJbmRleCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZUNvbXBvbmVudEl0ZW0oY29udGVudEl0ZW1zW3RoaXMuX2luaXRpYWxBY3RpdmVJdGVtSW5kZXhdIGFzIENvbXBvbmVudEl0ZW0sIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9oZWFkZXIudXBkYXRlVGFiU2l6ZXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pbml0Q29udGVudEl0ZW1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgKFN0YWNrOmNsYXNzKS5zZXRBY3RpdmVDb21wb25lbnRJdGVtfSAqL1xyXG4gICAgc2V0QWN0aXZlQ29udGVudEl0ZW0oaXRlbTogQ29udGVudEl0ZW0pOiB2b2lkIHtcclxuICAgICAgICBpZiAoIUNvbnRlbnRJdGVtLmlzQ29tcG9uZW50SXRlbShpdGVtKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N0YWNrLnNldEFjdGl2ZUNvbnRlbnRJdGVtOiBpdGVtIGlzIG5vdCBhIENvbXBvbmVudEl0ZW0nKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNldEFjdGl2ZUNvbXBvbmVudEl0ZW0oaXRlbSwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXRBY3RpdmVDb21wb25lbnRJdGVtKGNvbXBvbmVudEl0ZW06IENvbXBvbmVudEl0ZW0sIGZvY3VzOiBib29sZWFuLCBzdXBwcmVzc0ZvY3VzRXZlbnQgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9hY3RpdmVDb21wb25lbnRJdGVtICE9PSBjb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRJdGVtcy5pbmRleE9mKGNvbXBvbmVudEl0ZW0pID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb21wb25lbnRJdGVtIGlzIG5vdCBhIGNoaWxkIG9mIHRoaXMgc3RhY2snKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5iZWdpblNpemVJbnZhbGlkYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZUNvbXBvbmVudEl0ZW0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmVDb21wb25lbnRJdGVtLmhpZGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWN0aXZlQ29tcG9uZW50SXRlbSA9IGNvbXBvbmVudEl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGVhZGVyLnByb2Nlc3NBY3RpdmVDb21wb25lbnRDaGFuZ2VkKGNvbXBvbmVudEl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEl0ZW0uc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuZW5kU2l6ZUludmFsaWRhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnYWN0aXZlQ29udGVudEl0ZW1DaGFuZ2VkJywgY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuZW1pdCgnYWN0aXZlQ29udGVudEl0ZW1DaGFuZ2VkJywgY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZWRFdmVudCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5mb2N1c2VkIHx8IGZvY3VzKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5zZXRGb2N1c2VkQ29tcG9uZW50SXRlbShjb21wb25lbnRJdGVtLCBzdXBwcmVzc0ZvY3VzRXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAoU3RhY2s6Y2xhc3MpLmdldEFjdGl2ZUNvbXBvbmVudEl0ZW19ICovXHJcbiAgICBnZXRBY3RpdmVDb250ZW50SXRlbSgpOiBDb250ZW50SXRlbSB8IG51bGwge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEFjdGl2ZUNvbXBvbmVudEl0ZW0oKSA/PyBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEFjdGl2ZUNvbXBvbmVudEl0ZW0oKTogQ29tcG9uZW50SXRlbSB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZUNvbXBvbmVudEl0ZW07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZm9jdXNBY3RpdmVDb250ZW50SXRlbSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9hY3RpdmVDb21wb25lbnRJdGVtPy5mb2N1cygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIG92ZXJyaWRlIHNldEZvY3VzZWRWYWx1ZSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2hlYWRlci5hcHBseUZvY3VzZWRWYWx1ZSh2YWx1ZSk7XHJcbiAgICAgICAgc3VwZXIuc2V0Rm9jdXNlZFZhbHVlKHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBuZXdDb21wb25lbnQoY29tcG9uZW50VHlwZTogSnNvblZhbHVlLCBjb21wb25lbnRTdGF0ZT86IEpzb25WYWx1ZSwgdGl0bGU/OiBzdHJpbmcsIGluZGV4PzogbnVtYmVyKTogQ29tcG9uZW50SXRlbSB7XHJcbiAgICAgICAgY29uc3QgaXRlbUNvbmZpZzogQ29tcG9uZW50SXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogJ2NvbXBvbmVudCcsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFR5cGUsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFN0YXRlLFxyXG4gICAgICAgICAgICB0aXRsZSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5ld0l0ZW0oaXRlbUNvbmZpZywgaW5kZXgpIGFzIENvbXBvbmVudEl0ZW07XHJcbiAgICB9XHJcblxyXG4gICAgYWRkQ29tcG9uZW50KGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZSwgY29tcG9uZW50U3RhdGU/OiBKc29uVmFsdWUsIHRpdGxlPzogc3RyaW5nLCBpbmRleD86IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgY29uc3QgaXRlbUNvbmZpZzogQ29tcG9uZW50SXRlbUNvbmZpZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogJ2NvbXBvbmVudCcsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFR5cGUsXHJcbiAgICAgICAgICAgIGNvbXBvbmVudFN0YXRlLFxyXG4gICAgICAgICAgICB0aXRsZSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFkZEl0ZW0oaXRlbUNvbmZpZywgaW5kZXgpO1xyXG4gICAgfVxyXG5cclxuICAgIG5ld0l0ZW0oaXRlbUNvbmZpZzogQ29tcG9uZW50SXRlbUNvbmZpZywgIGluZGV4PzogbnVtYmVyKTogQ29udGVudEl0ZW0ge1xyXG4gICAgICAgIGluZGV4ID0gdGhpcy5hZGRJdGVtKGl0ZW1Db25maWcsIGluZGV4KTtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50SXRlbXNbaW5kZXhdO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZEl0ZW0oaXRlbUNvbmZpZzogQ29tcG9uZW50SXRlbUNvbmZpZywgaW5kZXg/OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5jaGVja01pbmltaXNlTWF4aW1pc2VkU3RhY2soKTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRJdGVtQ29uZmlnID0gSXRlbUNvbmZpZy5yZXNvbHZlKGl0ZW1Db25maWcsIGZhbHNlKTtcclxuICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IHRoaXMubGF5b3V0TWFuYWdlci5jcmVhdGVBbmRJbml0Q29udGVudEl0ZW0ocmVzb2x2ZWRJdGVtQ29uZmlnLCB0aGlzKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5hZGRDaGlsZChjb250ZW50SXRlbSwgaW5kZXgpO1xyXG4gICAgfVxyXG5cclxuICAgIG92ZXJyaWRlIGFkZENoaWxkKGNvbnRlbnRJdGVtOiBDb250ZW50SXRlbSwgaW5kZXg/OiBudW1iZXIsIGZvY3VzID0gZmFsc2UpOiBudW1iZXIge1xyXG4gICAgICAgIGlmKGluZGV4ICE9PSB1bmRlZmluZWQgJiYgaW5kZXggPiB0aGlzLmNvbnRlbnRJdGVtcy5sZW5ndGgpe1xyXG4gICAgICAgICAgICBpbmRleCAtPSAxO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ1NBQzk5NzI4Jyk7IC8vIHVuZGlzcGxheUNoaWxkKCkgcmVtb3ZlZCBzbyB0aGlzIGNvbmRpdGlvbiBzaG91bGQgbm8gbG9uZ2VyIG9jY3VyXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIShjb250ZW50SXRlbSBpbnN0YW5jZW9mIENvbXBvbmVudEl0ZW0pKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignU0FDQzg4NTMyJyk7IC8vIFN0YWNrcyBjYW4gb25seSBoYXZlIENvbXBvbmVudCBjaGlsZHJlblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGluZGV4ID0gc3VwZXIuYWRkQ2hpbGQoY29udGVudEl0ZW0sIGluZGV4KTtcclxuICAgICAgICAgICAgdGhpcy5fY2hpbGRFbGVtZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKGNvbnRlbnRJdGVtLmVsZW1lbnQpO1xyXG4gICAgICAgICAgICB0aGlzLl9oZWFkZXIuY3JlYXRlVGFiKGNvbnRlbnRJdGVtLCBpbmRleCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlQ29tcG9uZW50SXRlbShjb250ZW50SXRlbSwgZm9jdXMpO1xyXG4gICAgICAgICAgICB0aGlzLl9oZWFkZXIudXBkYXRlVGFiU2l6ZXMoKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKGZhbHNlKTtcclxuICAgICAgICAgICAgY29udGVudEl0ZW0uY29udGFpbmVyLnNldEJhc2VMb2dpY2FsWkluZGV4KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdFN0YXRlQ2hhbmdlZEV2ZW50KCk7XHJcbiAgICAgICAgICAgIHJldHVybiBpbmRleDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb3ZlcnJpZGUgcmVtb3ZlQ2hpbGQoY29udGVudEl0ZW06IENvbnRlbnRJdGVtLCBrZWVwQ2hpbGQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBjb21wb25lbnRJdGVtID0gY29udGVudEl0ZW0gYXMgQ29tcG9uZW50SXRlbTtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuY29udGVudEl0ZW1zLmluZGV4T2YoY29tcG9uZW50SXRlbSk7XHJcbiAgICAgICAgY29uc3Qgc3RhY2tXaWxsQmVEZWxldGVkID0gdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoID09PSAxO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fYWN0aXZlQ29tcG9uZW50SXRlbSA9PT0gY29tcG9uZW50SXRlbSkge1xyXG4gICAgICAgICAgICBpZiAoY29tcG9uZW50SXRlbS5mb2N1c2VkKSB7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnRJdGVtLmJsdXIoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIXN0YWNrV2lsbEJlRGVsZXRlZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSdyZSBhbHJlYWR5IHN1cmUgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgY29udGVudCBpdGVtIGxlZnQgKmFmdGVyKlxyXG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZpbmcgY29udGVudEl0ZW0sIHNvIHdlIGNhbiBzYWZlbHkgYXNzdW1lIGluZGV4IDEgaXMgYSB2YWxpZCBvbmUgaWZcclxuICAgICAgICAgICAgICAgIC8vIHRoZSBpbmRleCBvZiBjb250ZW50SXRlbSBpcyAwLCBvdGhlcndpc2Ugd2UganVzdCB1c2UgdGhlIHByZXZpb3VzIGNvbnRlbnQgaXRlbS5cclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0FjdGl2ZUNvbXBvbmVudElkeCA9IGluZGV4ID09PSAwID8gMSA6IGluZGV4IC0gMTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlQ29tcG9uZW50SXRlbSh0aGlzLmNvbnRlbnRJdGVtc1tuZXdBY3RpdmVDb21wb25lbnRJZHhdIGFzIENvbXBvbmVudEl0ZW0sIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5faGVhZGVyLnJlbW92ZVRhYihjb21wb25lbnRJdGVtKTtcclxuXHJcbiAgICAgICAgc3VwZXIucmVtb3ZlQ2hpbGQoY29tcG9uZW50SXRlbSwga2VlcENoaWxkKTtcclxuXHJcbiAgICAgICAgdGhpcy5lbWl0U3RhdGVDaGFuZ2VkRXZlbnQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1heGltaXNlcyB0aGUgSXRlbSBvciBtaW5pbWlzZXMgaXQgaWYgaXQgaXMgYWxyZWFkeSBtYXhpbWlzZWRcclxuICAgICAqL1xyXG4gICAgdG9nZ2xlTWF4aW1pc2UoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNNYXhpbWlzZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5taW5pbWlzZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4aW1pc2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbWF4aW1pc2UoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzTWF4aW1pc2VkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0TWFuYWdlci5zZXRNYXhpbWlzZWRTdGFjayh0aGlzKTtcclxuICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW1zID0gdGhpcy5jb250ZW50SXRlbXM7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtQ291bnQgPSBjb250ZW50SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnRJdGVtQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSBjb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udGVudEl0ZW0gaW5zdGFuY2VvZiBDb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEl0ZW0uZW50ZXJTdGFja01heGltaXNlZCgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ1NNQVhJODc3NzMnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmVtaXRTdGF0ZUNoYW5nZWRFdmVudCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBtaW5pbWlzZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5pc01heGltaXNlZCkge1xyXG4gICAgICAgICAgICB0aGlzLmxheW91dE1hbmFnZXIuc2V0TWF4aW1pc2VkU3RhY2sodW5kZWZpbmVkKTtcclxuICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW1zID0gdGhpcy5jb250ZW50SXRlbXM7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtQ291bnQgPSBjb250ZW50SXRlbXMubGVuZ3RoO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnRJdGVtQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSBjb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udGVudEl0ZW0gaW5zdGFuY2VvZiBDb21wb25lbnRJdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEl0ZW0uZXhpdFN0YWNrTWF4aW1pc2VkKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignU01JTkk4Nzc3MycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdFN0YXRlQ2hhbmdlZEV2ZW50KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIG92ZXJyaWRlIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZUNvbXBvbmVudEl0ZW0/LmZvY3VzZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fYWN0aXZlQ29tcG9uZW50SXRlbS5ibHVyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN1cGVyLmRlc3Ryb3koKTtcclxuICAgICAgICB0aGlzLm9mZigncmVzaXplJywgdGhpcy5fcmVzaXplTGlzdGVuZXIpO1xyXG4gICAgICAgIGlmICh0aGlzLl9tYXhpbWlzZWRFbmFibGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMub2ZmKCdtYXhpbWlzZWQnLCB0aGlzLl9tYXhpbWlzZWRMaXN0ZW5lcik7XHJcbiAgICAgICAgICAgIHRoaXMub2ZmKCdtaW5pbWlzZWQnLCB0aGlzLl9taW5pbWlzZWRMaXN0ZW5lcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2hlYWRlci5kZXN0cm95KCk7XHJcbiAgICB9XHJcblxyXG4gICAgdG9Db25maWcoKTogUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcge1xyXG4gICAgICAgIGxldCBhY3RpdmVJdGVtSW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICAgICAgICBpZiAodGhpcy5fYWN0aXZlQ29tcG9uZW50SXRlbSkge1xyXG4gICAgICAgICAgICBhY3RpdmVJdGVtSW5kZXggPSB0aGlzLmNvbnRlbnRJdGVtcy5pbmRleE9mKHRoaXMuX2FjdGl2ZUNvbXBvbmVudEl0ZW0pO1xyXG4gICAgICAgICAgICBpZiAoYWN0aXZlSXRlbUluZGV4IDwgMCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhY3RpdmUgY29tcG9uZW50IGl0ZW0gbm90IGZvdW5kIGluIHN0YWNrJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY29udGVudEl0ZW1zLmxlbmd0aCA+IDAgJiYgYWN0aXZlSXRlbUluZGV4ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBub24tZW1wdHkgc3RhY2sgdG8gaGF2ZSBhbiBhY3RpdmUgY29tcG9uZW50IGl0ZW0nKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ3N0YWNrJyxcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHRoaXMuY2FsY3VsYXRlQ29uZmlnQ29udGVudCgpIGFzIFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZ1tdLFxyXG4gICAgICAgICAgICAgICAgc2l6ZTogdGhpcy5zaXplLFxyXG4gICAgICAgICAgICAgICAgc2l6ZVVuaXQ6IHRoaXMuc2l6ZVVuaXQsXHJcbiAgICAgICAgICAgICAgICBtaW5TaXplOiB0aGlzLm1pblNpemUsXHJcbiAgICAgICAgICAgICAgICBtaW5TaXplVW5pdDogdGhpcy5taW5TaXplVW5pdCxcclxuICAgICAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxyXG4gICAgICAgICAgICAgICAgaXNDbG9zYWJsZTogdGhpcy5pc0Nsb3NhYmxlLFxyXG4gICAgICAgICAgICAgICAgbWF4aW1pc2VkOiB0aGlzLmlzTWF4aW1pc2VkLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyOiB0aGlzLmNyZWF0ZUhlYWRlckNvbmZpZygpLFxyXG4gICAgICAgICAgICAgICAgYWN0aXZlSXRlbUluZGV4LFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2ssIHRoaXMgb25lIGlzIGdvaW5nIHRvIGJlIHRoZSB0cmlja3kgb25lOiBUaGUgdXNlciBoYXMgZHJvcHBlZCBhIHtAbGluayAoQ29udGVudEl0ZW06Y2xhc3MpfSBvbnRvIHRoaXMgc3RhY2suXHJcbiAgICAgKlxyXG4gICAgICogSXQgd2FzIGRyb3BwZWQgb24gZWl0aGVyIHRoZSBzdGFja3MgaGVhZGVyIG9yIHRoZSB0b3AsIHJpZ2h0LCBib3R0b20gb3IgbGVmdCBiaXQgb2YgdGhlIGNvbnRlbnQgYXJlYVxyXG4gICAgICogKHdoaWNoIG9uZSBvZiB0aG9zZSBpcyBzdG9yZWQgaW4gdGhpcy5fZHJvcFNlZ21lbnQpLiBOb3csIGlmIHRoZSB1c2VyIGhhcyBkcm9wcGVkIG9uIHRoZSBoZWFkZXIgdGhlIGNhc2VcclxuICAgICAqIGlzIHJlbGF0aXZlbHkgY2xlYXI6IFdlIGFkZCB0aGUgaXRlbSB0byB0aGUgZXhpc3Rpbmcgc3RhY2suLi4gam9iIGRvbmUgKG1pZ2h0IGJlIGdvb2QgdG8gaGF2ZVxyXG4gICAgICogdGFiIHJlb3JkZXJpbmcgYXQgc29tZSBwb2ludCwgYnV0IGxldHMgbm90IHN3ZWF0IGl0IHJpZ2h0IG5vdylcclxuICAgICAqXHJcbiAgICAgKiBJZiB0aGUgaXRlbSB3YXMgZHJvcHBlZCBvbiB0aGUgY29udGVudCBwYXJ0IHRoaW5ncyBhcmUgYSBiaXQgbW9yZSBjb21wbGljYXRlZC4gSWYgaXQgd2FzIGRyb3BwZWQgb24gZWl0aGVyIHRoZVxyXG4gICAgICogdG9wIG9yIGJvdHRvbSByZWdpb24gd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgY29sdW1uIGFuZCBwbGFjZSB0aGUgaXRlbXMgYWNjb3JkaW5nbHkuXHJcbiAgICAgKiBVbmxlc3MsIG9mIGNvdXJzZSBpZiB0aGUgc3RhY2sgaXMgYWxyZWFkeSB3aXRoaW4gYSBjb2x1bW4uLi4gaW4gd2hpY2ggY2FzZSB3ZSB3YW50XHJcbiAgICAgKiB0byBhZGQgdGhlIG5ld2x5IGNyZWF0ZWQgaXRlbSB0byB0aGUgZXhpc3RpbmcgY29sdW1uLi4uXHJcbiAgICAgKiBlaXRoZXIgcHJlcGVuZCBvciBhcHBlbmQgaXQsIGRlcGVuZGluZyBvbiB3ZXRoZXIgaXRzIHRvcCBvciBib3R0b20uXHJcbiAgICAgKlxyXG4gICAgICogU2FtZSB0aGluZyBmb3Igcm93cyBhbmQgbGVmdCAvIHJpZ2h0IGRyb3Agc2VnbWVudHMuLi4gc28gaW4gdG90YWwgdGhlcmUgYXJlIDkgdGhpbmdzIHRoYXQgY2FuIHBvdGVudGlhbGx5IGhhcHBlblxyXG4gICAgICogKGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSkgKiBpcyBjaGlsZCBvZiB0aGUgcmlnaHQgcGFyZW50IChyb3csIGNvbHVtbikgKyBoZWFkZXIgZHJvcFxyXG4gICAgICpcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICBvdmVycmlkZSBvbkRyb3AoY29udGVudEl0ZW06IENvbnRlbnRJdGVtLCBhcmVhOiBDb250ZW50SXRlbS5BcmVhKTogdm9pZCB7XHJcbiAgICAgICAgLypcclxuICAgICAgICAgKiBUaGUgaXRlbSB3YXMgZHJvcHBlZCBvbiB0aGUgaGVhZGVyIGFyZWEuIEp1c3QgYWRkIGl0IGFzIGEgY2hpbGQgb2YgdGhpcyBzdGFjayBhbmRcclxuICAgICAgICAgKiBnZXQgdGhlIGhlbGwgb3V0IG9mIHRoaXMgbG9naWNcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAodGhpcy5fZHJvcFNlZ21lbnQgPT09IFN0YWNrLlNlZ21lbnQuSGVhZGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzZXRIZWFkZXJEcm9wWm9uZSgpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZHJvcEluZGV4ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ1NPRERJNjg5OTAnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGQoY29udGVudEl0ZW0sIHRoaXMuX2Ryb3BJbmRleCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgICogVGhlIHN0YWNrIGlzIGVtcHR5LiBMZXQncyBqdXN0IGFkZCB0aGUgZWxlbWVudC5cclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAodGhpcy5fZHJvcFNlZ21lbnQgPT09IFN0YWNrLlNlZ21lbnQuQm9keSkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZENoaWxkKGNvbnRlbnRJdGVtLCAwLCB0cnVlKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLypcclxuICAgICAgICAgKiBUaGUgaXRlbSB3YXMgZHJvcHBlZCBvbiB0aGUgdG9wLSwgbGVmdC0sIGJvdHRvbS0gb3IgcmlnaHQtIHBhcnQgb2YgdGhlIGNvbnRlbnQuIExldCdzXHJcbiAgICAgICAgICogYWdncmVnYXRlIHNvbWUgY29uZGl0aW9ucyB0byBtYWtlIHRoZSBpZiBzdGF0ZW1lbnRzIGxhdGVyIG9uIG1vcmUgcmVhZGFibGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCBpc1ZlcnRpY2FsID0gdGhpcy5fZHJvcFNlZ21lbnQgPT09IFN0YWNrLlNlZ21lbnQuVG9wIHx8IHRoaXMuX2Ryb3BTZWdtZW50ID09PSBTdGFjay5TZWdtZW50LkJvdHRvbTtcclxuICAgICAgICBjb25zdCBpc0hvcml6b250YWwgPSB0aGlzLl9kcm9wU2VnbWVudCA9PT0gU3RhY2suU2VnbWVudC5MZWZ0IHx8IHRoaXMuX2Ryb3BTZWdtZW50ID09PSBTdGFjay5TZWdtZW50LlJpZ2h0O1xyXG4gICAgICAgIGNvbnN0IGluc2VydEJlZm9yZSA9IHRoaXMuX2Ryb3BTZWdtZW50ID09PSBTdGFjay5TZWdtZW50LlRvcCB8fCB0aGlzLl9kcm9wU2VnbWVudCA9PT0gU3RhY2suU2VnbWVudC5MZWZ0O1xyXG4gICAgICAgIGNvbnN0IGhhc0NvcnJlY3RQYXJlbnQgPSAoaXNWZXJ0aWNhbCAmJiB0aGlzLnN0YWNrUGFyZW50LmlzQ29sdW1uKSB8fCAoaXNIb3Jpem9udGFsICYmIHRoaXMuc3RhY2tQYXJlbnQuaXNSb3cpO1xyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIFRoZSBjb250ZW50IGl0ZW0gY2FuIGJlIGVpdGhlciBhIGNvbXBvbmVudCBvciBhIHN0YWNrLiBJZiBpdCBpcyBhIGNvbXBvbmVudCwgd3JhcCBpdCBpbnRvIGEgc3RhY2tcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAoY29udGVudEl0ZW0uaXNDb21wb25lbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbUNvbmZpZyA9IFJlc29sdmVkU3RhY2tJdGVtQ29uZmlnLmNyZWF0ZURlZmF1bHQoKTtcclxuICAgICAgICAgICAgaXRlbUNvbmZpZy5oZWFkZXIgPSAoY29udGVudEl0ZW0gYXMgQ29tcG9uZW50SXRlbSkuaGVhZGVyQ29uZmlnO1xyXG4gICAgICAgICAgICBjb25zdCBzdGFjayA9IHRoaXMubGF5b3V0TWFuYWdlci5jcmVhdGVBbmRJbml0Q29udGVudEl0ZW0oaXRlbUNvbmZpZywgdGhpcyk7XHJcbiAgICAgICAgICAgIHN0YWNrLmFkZENoaWxkKGNvbnRlbnRJdGVtKTtcclxuICAgICAgICAgICAgY29udGVudEl0ZW0gPSBzdGFjaztcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAvKlxyXG4gICAgICAgICAqIElmIHRoZSBjb250ZW50SXRlbSB0aGF0J3MgYmVpbmcgZHJvcHBlZCBpcyBub3QgZHJvcHBlZCBvbiBhIFN0YWNrIChjYXNlcyB3aGljaCBqdXN0IHBhc3NlZCBhYm92ZSBhbmRcclxuICAgICAgICAgKiB3aGljaCB3b3VsZCB3cmFwIHRoZSBjb250ZW50SXRlbSBpbiBhIFN0YWNrKSB3ZSBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgY29udGVudEl0ZW0gaXMgYSBSb3dPckNvbHVtbi5cclxuICAgICAgICAgKiBJZiBpdCBpcywgd2UgbmVlZCB0byByZS13cmFwIGl0IGluIGEgU3RhY2sgbGlrZSBpdCB3YXMgd2hlbiBpdCB3YXMgZHJhZ2dlZCBieSBpdHMgVGFiIChpdCB3YXMgZHJhZ2dlZCEpLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmKGNvbnRlbnRJdGVtLnR5cGUgPT09IEl0ZW1UeXBlLnJvdyB8fCBjb250ZW50SXRlbS50eXBlID09PSBJdGVtVHlwZS5jb2x1bW4pe1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtQ29uZmlnID0gUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcuY3JlYXRlRGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBpdGVtQ29uZmlnLmhlYWRlciA9IHRoaXMuY3JlYXRlSGVhZGVyQ29uZmlnKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmNyZWF0ZUNvbnRlbnRJdGVtKGl0ZW1Db25maWcsIHRoaXMpO1xyXG4gICAgICAgICAgICBzdGFjay5hZGRDaGlsZChjb250ZW50SXRlbSlcclxuICAgICAgICAgICAgY29udGVudEl0ZW0gPSBzdGFja1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLypcclxuICAgICAgICAgKiBJZiB0aGUgaXRlbSBpcyBkcm9wcGVkIG9uIHRvcCBvciBib3R0b20gb2YgYSBjb2x1bW4gb3IgbGVmdCBhbmQgcmlnaHQgb2YgYSByb3csIGl0J3MgYWxyZWFkeVxyXG4gICAgICAgICAqIGxheWQgb3V0IGluIHRoZSBjb3JyZWN0IHdheS4gSnVzdCBhZGQgaXQgYXMgYSBjaGlsZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChoYXNDb3JyZWN0UGFyZW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zdGFja1BhcmVudC5jb250ZW50SXRlbXMuaW5kZXhPZih0aGlzKTtcclxuICAgICAgICAgICAgdGhpcy5zdGFja1BhcmVudC5hZGRDaGlsZChjb250ZW50SXRlbSwgaW5zZXJ0QmVmb3JlID8gaW5kZXggOiBpbmRleCArIDEsIHRydWUpO1xyXG4gICAgICAgICAgICB0aGlzLnNpemUgKj0gMC41O1xyXG4gICAgICAgICAgICBjb250ZW50SXRlbS5zaXplID0gdGhpcy5zaXplO1xyXG4gICAgICAgICAgICBjb250ZW50SXRlbS5zaXplVW5pdCA9IHRoaXMuc2l6ZVVuaXQ7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhY2tQYXJlbnQudXBkYXRlU2l6ZShmYWxzZSk7XHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgICAqIFRoaXMgaGFuZGxlcyBpdGVtcyB0aGF0IGFyZSBkcm9wcGVkIG9uIHRvcCBvciBib3R0b20gb2YgYSByb3cgb3IgbGVmdCAvIHJpZ2h0IG9mIGEgY29sdW1uLiBXZSBuZWVkXHJcbiAgICAgICAgICAgICAqIHRvIGNyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgY29udGVudEl0ZW0gZm9yIHRoZW0gdG8gbGl2ZSBpblxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gaXNWZXJ0aWNhbCA/IEl0ZW1UeXBlLmNvbHVtbiA6IEl0ZW1UeXBlLnJvdztcclxuICAgICAgICAgICAgY29uc3QgaXRlbUNvbmZpZyA9IFJlc29sdmVkSXRlbUNvbmZpZy5jcmVhdGVEZWZhdWx0KHR5cGUpIGFzIFJlc29sdmVkSXRlbUNvbmZpZztcclxuICAgICAgICAgICAgY29uc3Qgcm93T3JDb2x1bW4gPSB0aGlzLmxheW91dE1hbmFnZXIuY3JlYXRlQ29udGVudEl0ZW0oaXRlbUNvbmZpZywgdGhpcyk7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhY2tQYXJlbnQucmVwbGFjZUNoaWxkKHRoaXMsIHJvd09yQ29sdW1uKTtcclxuXHJcbiAgICAgICAgICAgIHJvd09yQ29sdW1uLmFkZENoaWxkKGNvbnRlbnRJdGVtLCBpbnNlcnRCZWZvcmUgPyAwIDogdW5kZWZpbmVkLCB0cnVlKTtcclxuICAgICAgICAgICAgcm93T3JDb2x1bW4uYWRkQ2hpbGQodGhpcywgaW5zZXJ0QmVmb3JlID8gdW5kZWZpbmVkIDogMCwgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNpemUgPSA1MDtcclxuICAgICAgICAgICAgY29udGVudEl0ZW0uc2l6ZSA9IDUwO1xyXG4gICAgICAgICAgICBjb250ZW50SXRlbS5zaXplVW5pdCA9IFNpemVVbml0RW51bS5QZXJjZW50O1xyXG4gICAgICAgICAgICByb3dPckNvbHVtbi51cGRhdGVTaXplKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJZiB0aGUgdXNlciBob3ZlcnMgYWJvdmUgdGhlIGhlYWRlciBwYXJ0IG9mIHRoZSBzdGFjaywgaW5kaWNhdGUgZHJvcCBwb3NpdGlvbnMgZm9yIHRhYnMuXHJcbiAgICAgKiBvdGhlcndpc2UgaW5kaWNhdGUgd2hpY2ggc2VnbWVudCBvZiB0aGUgYm9keSB0aGUgZHJhZ2dlZCBpdGVtIHdvdWxkIGJlIGRyb3BwZWQgb25cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geCAtIEFic29sdXRlIFNjcmVlbiBYXHJcbiAgICAgKiBAcGFyYW0geSAtIEFic29sdXRlIFNjcmVlbiBZXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgb3ZlcnJpZGUgaGlnaGxpZ2h0RHJvcFpvbmUoeDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLl9jb250ZW50QXJlYURpbWVuc2lvbnMpIHtcclxuICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IGtleSBhcyBTdGFjay5TZWdtZW50O1xyXG4gICAgICAgICAgICBjb25zdCBhcmVhID0gdGhpcy5fY29udGVudEFyZWFEaW1lbnNpb25zW3NlZ21lbnRdLmhvdmVyQXJlYTtcclxuXHJcbiAgICAgICAgICAgIGlmIChhcmVhLngxIDwgeCAmJiBhcmVhLngyID4geCAmJiBhcmVhLnkxIDwgeSAmJiBhcmVhLnkyID4geSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChzZWdtZW50ID09PSBTdGFjay5TZWdtZW50LkhlYWRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Ryb3BTZWdtZW50ID0gU3RhY2suU2VnbWVudC5IZWFkZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRIZWFkZXJEcm9wWm9uZSh0aGlzLl9oZWFkZXIubGVmdFJpZ2h0U2lkZWQgPyB5IDogeCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzZXRIZWFkZXJEcm9wWm9uZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0Qm9keURyb3Bab25lKHNlZ21lbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBnZXRBcmVhKCk6IENvbnRlbnRJdGVtLkFyZWEgfCBudWxsIHtcclxuICAgICAgICBpZiAodGhpcy5lbGVtZW50LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGhlYWRlckFyZWEgPSBzdXBlci5nZXRFbGVtZW50QXJlYSh0aGlzLl9oZWFkZXIuZWxlbWVudCk7XHJcbiAgICAgICAgY29uc3QgY29udGVudEFyZWEgPSBzdXBlci5nZXRFbGVtZW50QXJlYSh0aGlzLl9jaGlsZEVsZW1lbnRDb250YWluZXIpO1xyXG4gICAgICAgIGlmIChoZWFkZXJBcmVhID09PSBudWxsIHx8IGNvbnRlbnRBcmVhID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdTR0FIQzEzMDg2Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRXaWR0aCA9IGNvbnRlbnRBcmVhLngyIC0gY29udGVudEFyZWEueDE7XHJcbiAgICAgICAgY29uc3QgY29udGVudEhlaWdodCA9IGNvbnRlbnRBcmVhLnkyIC0gY29udGVudEFyZWEueTE7XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbnRlbnRBcmVhRGltZW5zaW9ucyA9IHtcclxuICAgICAgICAgICAgaGVhZGVyOiB7XHJcbiAgICAgICAgICAgICAgICBob3ZlckFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogaGVhZGVyQXJlYS54MSxcclxuICAgICAgICAgICAgICAgICAgICB5MTogaGVhZGVyQXJlYS55MSxcclxuICAgICAgICAgICAgICAgICAgICB4MjogaGVhZGVyQXJlYS54MixcclxuICAgICAgICAgICAgICAgICAgICB5MjogaGVhZGVyQXJlYS55MlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodEFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogaGVhZGVyQXJlYS54MSxcclxuICAgICAgICAgICAgICAgICAgICB5MTogaGVhZGVyQXJlYS55MSxcclxuICAgICAgICAgICAgICAgICAgICB4MjogaGVhZGVyQXJlYS54MixcclxuICAgICAgICAgICAgICAgICAgICB5MjogaGVhZGVyQXJlYS55MlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSGlnaGxpZ2h0IHRoZSBlbnRpcmUgYm9keSBpZiB0aGUgc3RhY2sgaXMgZW1wdHlcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAodGhpcy5jb250ZW50SXRlbXMubGVuZ3RoID09PSAwKSB7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9jb250ZW50QXJlYURpbWVuc2lvbnMuYm9keSA9IHtcclxuICAgICAgICAgICAgICAgIGhvdmVyQXJlYToge1xyXG4gICAgICAgICAgICAgICAgICAgIHgxOiBjb250ZW50QXJlYS54MSxcclxuICAgICAgICAgICAgICAgICAgICB5MTogY29udGVudEFyZWEueTEsXHJcbiAgICAgICAgICAgICAgICAgICAgeDI6IGNvbnRlbnRBcmVhLngyLFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBjb250ZW50QXJlYS55MlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodEFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogY29udGVudEFyZWEueDEsXHJcbiAgICAgICAgICAgICAgICAgICAgeTE6IGNvbnRlbnRBcmVhLnkxLFxyXG4gICAgICAgICAgICAgICAgICAgIHgyOiBjb250ZW50QXJlYS54MixcclxuICAgICAgICAgICAgICAgICAgICB5MjogY29udGVudEFyZWEueTJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRFbGVtZW50QXJlYSh0aGlzLmVsZW1lbnQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRBcmVhRGltZW5zaW9ucy5sZWZ0ID0ge1xyXG4gICAgICAgICAgICAgICAgaG92ZXJBcmVhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgeDE6IGNvbnRlbnRBcmVhLngxLFxyXG4gICAgICAgICAgICAgICAgICAgIHkxOiBjb250ZW50QXJlYS55MSxcclxuICAgICAgICAgICAgICAgICAgICB4MjogY29udGVudEFyZWEueDEgKyBjb250ZW50V2lkdGggKiAwLjI1LFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBjb250ZW50QXJlYS55MlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodEFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogY29udGVudEFyZWEueDEsXHJcbiAgICAgICAgICAgICAgICAgICAgeTE6IGNvbnRlbnRBcmVhLnkxLFxyXG4gICAgICAgICAgICAgICAgICAgIHgyOiBjb250ZW50QXJlYS54MSArIGNvbnRlbnRXaWR0aCAqIDAuNSxcclxuICAgICAgICAgICAgICAgICAgICB5MjogY29udGVudEFyZWEueTJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRBcmVhRGltZW5zaW9ucy50b3AgPSB7XHJcbiAgICAgICAgICAgICAgICBob3ZlckFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogY29udGVudEFyZWEueDEgKyBjb250ZW50V2lkdGggKiAwLjI1LFxyXG4gICAgICAgICAgICAgICAgICAgIHkxOiBjb250ZW50QXJlYS55MSxcclxuICAgICAgICAgICAgICAgICAgICB4MjogY29udGVudEFyZWEueDEgKyBjb250ZW50V2lkdGggKiAwLjc1LFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBjb250ZW50QXJlYS55MSArIGNvbnRlbnRIZWlnaHQgKiAwLjVcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBoaWdobGlnaHRBcmVhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgeDE6IGNvbnRlbnRBcmVhLngxLFxyXG4gICAgICAgICAgICAgICAgICAgIHkxOiBjb250ZW50QXJlYS55MSxcclxuICAgICAgICAgICAgICAgICAgICB4MjogY29udGVudEFyZWEueDIsXHJcbiAgICAgICAgICAgICAgICAgICAgeTI6IGNvbnRlbnRBcmVhLnkxICsgY29udGVudEhlaWdodCAqIDAuNVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fY29udGVudEFyZWFEaW1lbnNpb25zLnJpZ2h0ID0ge1xyXG4gICAgICAgICAgICAgICAgaG92ZXJBcmVhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgeDE6IGNvbnRlbnRBcmVhLngxICsgY29udGVudFdpZHRoICogMC43NSxcclxuICAgICAgICAgICAgICAgICAgICB5MTogY29udGVudEFyZWEueTEsXHJcbiAgICAgICAgICAgICAgICAgICAgeDI6IGNvbnRlbnRBcmVhLngyLFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBjb250ZW50QXJlYS55MlxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodEFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogY29udGVudEFyZWEueDEgKyBjb250ZW50V2lkdGggKiAwLjUsXHJcbiAgICAgICAgICAgICAgICAgICAgeTE6IGNvbnRlbnRBcmVhLnkxLFxyXG4gICAgICAgICAgICAgICAgICAgIHgyOiBjb250ZW50QXJlYS54MixcclxuICAgICAgICAgICAgICAgICAgICB5MjogY29udGVudEFyZWEueTJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRBcmVhRGltZW5zaW9ucy5ib3R0b20gPSB7XHJcbiAgICAgICAgICAgICAgICBob3ZlckFyZWE6IHtcclxuICAgICAgICAgICAgICAgICAgICB4MTogY29udGVudEFyZWEueDEgKyBjb250ZW50V2lkdGggKiAwLjI1LFxyXG4gICAgICAgICAgICAgICAgICAgIHkxOiBjb250ZW50QXJlYS55MSArIGNvbnRlbnRIZWlnaHQgKiAwLjUsXHJcbiAgICAgICAgICAgICAgICAgICAgeDI6IGNvbnRlbnRBcmVhLngxICsgY29udGVudFdpZHRoICogMC43NSxcclxuICAgICAgICAgICAgICAgICAgICB5MjogY29udGVudEFyZWEueTJcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBoaWdobGlnaHRBcmVhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgeDE6IGNvbnRlbnRBcmVhLngxLFxyXG4gICAgICAgICAgICAgICAgICAgIHkxOiBjb250ZW50QXJlYS55MSArIGNvbnRlbnRIZWlnaHQgKiAwLjUsXHJcbiAgICAgICAgICAgICAgICAgICAgeDI6IGNvbnRlbnRBcmVhLngyLFxyXG4gICAgICAgICAgICAgICAgICAgIHkyOiBjb250ZW50QXJlYS55MlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEVsZW1lbnRBcmVhKHRoaXMuZWxlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvZ3JhbW1hdGljYWxseSBvcGVyYXRlIHdpdGggaGVhZGVyIHBvc2l0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBwb3NpdGlvbiAtXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgcHJldmlvdXMgaGVhZGVyIHBvc2l0aW9uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcG9zaXRpb25IZWFkZXIocG9zaXRpb246IFNpZGUpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5faGVhZGVyLnNpZGUgIT09IHBvc2l0aW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2hlYWRlci5zZXRTaWRlKHBvc2l0aW9uKTtcclxuICAgICAgICAgICAgdGhpcy5faGVhZGVyU2lkZUNoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnNldHVwSGVhZGVyUG9zaXRpb24oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSB1cGRhdGVOb2RlU2l6ZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5lbGVtZW50LnN0eWxlLmRpc3BsYXkgIT09ICdub25lJykge1xyXG4gICAgICAgICAgICBjb25zdCBjb250ZW50OiBXaWR0aEFuZEhlaWdodCA9IGdldEVsZW1lbnRXaWR0aEFuZEhlaWdodCh0aGlzLmVsZW1lbnQpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX2hlYWRlci5zaG93KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaW1lbnNpb24gPSB0aGlzLl9oZWFkZXIubGVmdFJpZ2h0U2lkZWQgPyBXaWR0aE9ySGVpZ2h0UHJvcGVydHlOYW1lLndpZHRoIDogV2lkdGhPckhlaWdodFByb3BlcnR5TmFtZS5oZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICBjb250ZW50W2RpbWVuc2lvbl0gLT0gdGhpcy5sYXlvdXRNYW5hZ2VyLmxheW91dENvbmZpZy5kaW1lbnNpb25zLmhlYWRlckhlaWdodDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZXRFbGVtZW50V2lkdGgodGhpcy5fY2hpbGRFbGVtZW50Q29udGFpbmVyLCBjb250ZW50LndpZHRoKTtcclxuICAgICAgICAgICAgc2V0RWxlbWVudEhlaWdodCh0aGlzLl9jaGlsZEVsZW1lbnRDb250YWluZXIsIGNvbnRlbnQuaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHNldEVsZW1lbnRXaWR0aCh0aGlzLmNvbnRlbnRJdGVtc1tpXS5lbGVtZW50LCBjb250ZW50LndpZHRoKTtcclxuICAgICAgICAgICAgICAgIHNldEVsZW1lbnRIZWlnaHQodGhpcy5jb250ZW50SXRlbXNbaV0uZWxlbWVudCwgY29udGVudC5oZWlnaHQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgncmVzaXplJyk7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdFN0YXRlQ2hhbmdlZEV2ZW50KHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhpZ2hsaWdodEhlYWRlckRyb3Bab25lKHg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHZpc2libGVUYWJzTGVuZ3RoID0gdGhpcy5faGVhZGVyLmxhc3RWaXNpYmxlVGFiSW5kZXggKyAxO1xyXG4gICAgICAgIGNvbnN0IHRhYnNDb250YWluZXJFbGVtZW50ID0gdGhpcy5faGVhZGVyLnRhYnNDb250YWluZXJFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IHRhYnNDb250YWluZXJFbGVtZW50Q2hpbGROb2RlcyA9IHRhYnNDb250YWluZXJFbGVtZW50LmNoaWxkTm9kZXM7XHJcblxyXG4gICAgICAgIC8vIENyZWF0ZSBzaGFsbG93IGNvcHkgb2YgY2hpbGROb2RlcyBsaXN0LCBleGNsdWRpbmcgRHJvcFBsYWNlSG9sZGVyLCBhcyB3ZSB3aWxsIGJlIG1vZGlmeWluZyB0aGUgY2hpbGROb2RlcyBsaXN0XHJcbiAgICAgICAgY29uc3QgdmlzaWJsZVRhYkVsZW1lbnRzID0gbmV3IEFycmF5PEhUTUxFbGVtZW50Pih2aXNpYmxlVGFic0xlbmd0aCk7XHJcbiAgICAgICAgbGV0IHRhYkluZGV4ID0gMDtcclxuICAgICAgICBsZXQgdGFiQ291bnQgPSAwO1xyXG4gICAgICAgIHdoaWxlICh0YWJDb3VudCA8IHZpc2libGVUYWJzTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZpc2libGVUYWJFbGVtZW50ID0gdGFic0NvbnRhaW5lckVsZW1lbnRDaGlsZE5vZGVzW3RhYkluZGV4KytdIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICBpZiAodmlzaWJsZVRhYkVsZW1lbnQgIT09IHRoaXMubGF5b3V0TWFuYWdlci50YWJEcm9wUGxhY2Vob2xkZXIpIHtcclxuICAgICAgICAgICAgICAgIHZpc2libGVUYWJFbGVtZW50c1t0YWJDb3VudCsrXSA9IHZpc2libGVUYWJFbGVtZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkcm9wVGFyZ2V0SW5kaWNhdG9yID0gdGhpcy5sYXlvdXRNYW5hZ2VyLmRyb3BUYXJnZXRJbmRpY2F0b3I7XHJcbiAgICAgICAgaWYgKGRyb3BUYXJnZXRJbmRpY2F0b3IgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ1NISERaRFRJOTcxMTAnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBhcmVhOiBBcmVhTGlua2VkUmVjdDtcclxuXHJcbiAgICAgICAgLy8gRW1wdHkgc3RhY2tcclxuICAgICAgICBpZiAodmlzaWJsZVRhYnNMZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgY29uc3QgaGVhZGVyUmVjdCA9IHRoaXMuX2hlYWRlci5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICBjb25zdCBoZWFkZXJUb3AgPSBoZWFkZXJSZWN0LnRvcCArIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICBjb25zdCBoZWFkZXJMZWZ0ID0gaGVhZGVyUmVjdC5sZWZ0ICsgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0O1xyXG5cclxuICAgICAgICAgICAgYXJlYSA9IHtcclxuICAgICAgICAgICAgICAgIHgxOiBoZWFkZXJMZWZ0LFxyXG4gICAgICAgICAgICAgICAgeDI6IGhlYWRlckxlZnQgKyAxMDAsXHJcbiAgICAgICAgICAgICAgICB5MTogaGVhZGVyVG9wICsgaGVhZGVyUmVjdC5oZWlnaHQgLSAyMCxcclxuICAgICAgICAgICAgICAgIHkyOiBoZWFkZXJUb3AgKyBoZWFkZXJSZWN0LmhlaWdodCxcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2Ryb3BJbmRleCA9IDA7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHRhYkluZGV4ID0gMDtcclxuICAgICAgICAgICAgLy8gVGhpcyBpbmRpY2F0ZXMgd2hldGhlciBvdXIgY3Vyc29yIGlzIGV4YWN0bHkgb3ZlciBhIHRhYlxyXG4gICAgICAgICAgICBsZXQgaXNBYm92ZVRhYiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBsZXQgdGFiVG9wOiBudW1iZXI7XHJcbiAgICAgICAgICAgIGxldCB0YWJMZWZ0OiBudW1iZXI7XHJcbiAgICAgICAgICAgIGxldCB0YWJXaWR0aDogbnVtYmVyO1xyXG4gICAgICAgICAgICBsZXQgdGFiRWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGRvIHtcclxuICAgICAgICAgICAgICAgIHRhYkVsZW1lbnQgPSB2aXNpYmxlVGFiRWxlbWVudHNbdGFiSW5kZXhdIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFiUmVjdCA9IHRhYkVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJSZWN0VG9wID0gdGFiUmVjdC50b3AgKyBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRhYlJlY3RMZWZ0ID0gdGFiUmVjdC5sZWZ0ICsgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9oZWFkZXIubGVmdFJpZ2h0U2lkZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0YWJMZWZ0ID0gdGFiUmVjdFRvcDtcclxuICAgICAgICAgICAgICAgICAgICB0YWJUb3AgPSB0YWJSZWN0TGVmdDtcclxuICAgICAgICAgICAgICAgICAgICB0YWJXaWR0aCA9IHRhYlJlY3QuaGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0YWJMZWZ0ID0gdGFiUmVjdExlZnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFiVG9wID0gdGFiUmVjdFRvcDtcclxuICAgICAgICAgICAgICAgICAgICB0YWJXaWR0aCA9IHRhYlJlY3Qud2lkdGg7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHggPj0gdGFiTGVmdCAmJiB4IDwgdGFiTGVmdCArIHRhYldpZHRoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXNBYm92ZVRhYiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRhYkluZGV4Kys7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gd2hpbGUgKHRhYkluZGV4IDwgdmlzaWJsZVRhYnNMZW5ndGggJiYgIWlzQWJvdmVUYWIpO1xyXG5cclxuICAgICAgICAgICAgLy8gSWYgd2UncmUgbm90IGFib3ZlIGFueSB0YWJzLCBvciB0byB0aGUgcmlnaHQgb2YgYW55IHRhYiwgd2UgYXJlIG91dCBvZiB0aGUgYXJlYSwgc28gZ2l2ZSB1cFxyXG4gICAgICAgICAgICBpZiAoaXNBYm92ZVRhYiA9PT0gZmFsc2UgJiYgeCA8IHRhYkxlZnQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgaGFsZlggPSB0YWJMZWZ0ICsgdGFiV2lkdGggLyAyO1xyXG5cclxuICAgICAgICAgICAgaWYgKHggPCBoYWxmWCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZHJvcEluZGV4ID0gdGFiSW5kZXg7XHJcbiAgICAgICAgICAgICAgICB0YWJFbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgnYmVmb3JlYmVnaW4nLCB0aGlzLmxheW91dE1hbmFnZXIudGFiRHJvcFBsYWNlaG9sZGVyKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2Ryb3BJbmRleCA9IE1hdGgubWluKHRhYkluZGV4ICsgMSwgdmlzaWJsZVRhYnNMZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgdGFiRWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgdGhpcy5sYXlvdXRNYW5hZ2VyLnRhYkRyb3BQbGFjZWhvbGRlcik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHRhYkRyb3BQbGFjZWhvbGRlclJlY3QgPSB0aGlzLmxheW91dE1hbmFnZXIudGFiRHJvcFBsYWNlaG9sZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICBjb25zdCB0YWJEcm9wUGxhY2Vob2xkZXJSZWN0VG9wID0gdGFiRHJvcFBsYWNlaG9sZGVyUmVjdC50b3AgKyBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcDtcclxuICAgICAgICAgICAgY29uc3QgdGFiRHJvcFBsYWNlaG9sZGVyUmVjdExlZnQgPSB0YWJEcm9wUGxhY2Vob2xkZXJSZWN0LmxlZnQgKyBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQ7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5faGVhZGVyLmxlZnRSaWdodFNpZGVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwbGFjZUhvbGRlclRvcCA9IHRhYkRyb3BQbGFjZWhvbGRlclJlY3RUb3A7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJEcm9wUGxhY2Vob2xkZXJSZWN0V2lkdGggPSB0YWJEcm9wUGxhY2Vob2xkZXJSZWN0LmhlaWdodDtcclxuXHJcbiAgICAgICAgICAgICAgICBhcmVhID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHgxOiB0YWJUb3AsXHJcbiAgICAgICAgICAgICAgICAgICAgeDI6IHRhYlRvcCArIHRhYkVsZW1lbnQuY2xpZW50SGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgIHkxOiBwbGFjZUhvbGRlclRvcCxcclxuICAgICAgICAgICAgICAgICAgICB5MjogcGxhY2VIb2xkZXJUb3AgKyB0YWJEcm9wUGxhY2Vob2xkZXJSZWN0V2lkdGgsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGxhY2VIb2xkZXJMZWZ0ID0gdGFiRHJvcFBsYWNlaG9sZGVyUmVjdExlZnQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJEcm9wUGxhY2Vob2xkZXJSZWN0V2lkdGggPSB0YWJEcm9wUGxhY2Vob2xkZXJSZWN0LndpZHRoO1xyXG5cclxuICAgICAgICAgICAgICAgIGFyZWEgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgeDE6IHBsYWNlSG9sZGVyTGVmdCxcclxuICAgICAgICAgICAgICAgICAgICB4MjogcGxhY2VIb2xkZXJMZWZ0ICsgdGFiRHJvcFBsYWNlaG9sZGVyUmVjdFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHkxOiB0YWJUb3AsXHJcbiAgICAgICAgICAgICAgICAgICAgeTI6IHRhYlRvcCArIHRhYkVsZW1lbnQuY2xpZW50SGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZHJvcFRhcmdldEluZGljYXRvci5oaWdobGlnaHRBcmVhKGFyZWEsIDApO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlc2V0SGVhZGVyRHJvcFpvbmUoKSB7XHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLnRhYkRyb3BQbGFjZWhvbGRlci5yZW1vdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHNldHVwSGVhZGVyUG9zaXRpb24oKSB7XHJcbiAgICAgICAgc2V0RWxlbWVudERpc3BsYXlWaXNpYmlsaXR5KHRoaXMuX2hlYWRlci5lbGVtZW50LCB0aGlzLl9oZWFkZXIuc2hvdyk7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5MZWZ0LCBEb21Db25zdGFudHMuQ2xhc3NOYW1lLlJpZ2h0LCBEb21Db25zdGFudHMuQ2xhc3NOYW1lLkJvdHRvbSk7XHJcbiAgICAgICAgaWYgKHRoaXMuX2hlYWRlci5zaWRlICE9PSBTaWRlLnRvcCkge1xyXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbG1fJyArIHRoaXMuX2hlYWRlci5zaWRlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vaWYgKFtTaWRlLnJpZ2h0LCBTaWRlLmJvdHRvbV0uaW5jbHVkZXModGhpcy5faGVhZGVyLnNpZGUpKSB7XHJcbiAgICAgICAgLy8gICAgLy8gbW92ZSB0aGUgaGVhZGVyIGJlaGluZCB0aGUgY29udGVudC5cclxuICAgICAgICAvLyAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5faGVhZGVyLmVsZW1lbnQpO1xyXG4gICAgICAgIC8vfVxyXG4gICAgICAgIHRoaXMudXBkYXRlU2l6ZShmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoaWdobGlnaHRCb2R5RHJvcFpvbmUoc2VnbWVudDogU3RhY2suU2VnbWVudCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9jb250ZW50QXJlYURpbWVuc2lvbnMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdTSEJEWkM4MjI2NScpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhpZ2hsaWdodEFyZWEgPSB0aGlzLl9jb250ZW50QXJlYURpbWVuc2lvbnNbc2VnbWVudF0uaGlnaGxpZ2h0QXJlYTtcclxuICAgICAgICAgICAgY29uc3QgZHJvcFRhcmdldEluZGljYXRvciA9IHRoaXMubGF5b3V0TWFuYWdlci5kcm9wVGFyZ2V0SW5kaWNhdG9yO1xyXG4gICAgICAgICAgICBpZiAoZHJvcFRhcmdldEluZGljYXRvciA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ1NIQkRaRDk2MTEwJyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkcm9wVGFyZ2V0SW5kaWNhdG9yLmhpZ2hsaWdodEFyZWEoaGlnaGxpZ2h0QXJlYSwgMSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kcm9wU2VnbWVudCA9IHNlZ21lbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVSZXNpemUoKSB7XHJcbiAgICAgICAgdGhpcy5faGVhZGVyLnVwZGF0ZVRhYlNpemVzKClcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZU1heGltaXNlZCgpIHtcclxuICAgICAgICB0aGlzLl9oZWFkZXIucHJvY2Vzc01heGltaXNlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlTWluaW1pc2VkKCkge1xyXG4gICAgICAgIHRoaXMuX2hlYWRlci5wcm9jZXNzTWluaW1pc2VkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVQb3BvdXRFdmVudCgpIHtcclxuICAgICAgICB0aGlzLnBvcG91dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlSGVhZGVyQ2xpY2tFdmVudChldjogTW91c2VFdmVudCkge1xyXG4gICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IEV2ZW50RW1pdHRlci5oZWFkZXJDbGlja0V2ZW50TmFtZTtcclxuICAgICAgICBjb25zdCBidWJibGluZ0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlci5DbGlja0J1YmJsaW5nRXZlbnQoZXZlbnROYW1lLCB0aGlzLCBldik7XHJcbiAgICAgICAgdGhpcy5lbWl0KGV2ZW50TmFtZSwgYnViYmxpbmdFdmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBoYW5kbGVIZWFkZXJUb3VjaFN0YXJ0RXZlbnQoZXY6IFRvdWNoRXZlbnQpIHtcclxuICAgICAgICBjb25zdCBldmVudE5hbWUgPSBFdmVudEVtaXR0ZXIuaGVhZGVyVG91Y2hTdGFydEV2ZW50TmFtZTtcclxuICAgICAgICBjb25zdCBidWJibGluZ0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlci5Ub3VjaFN0YXJ0QnViYmxpbmdFdmVudChldmVudE5hbWUsIHRoaXMsIGV2KTtcclxuICAgICAgICB0aGlzLmVtaXQoZXZlbnROYW1lLCBidWJibGluZ0V2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZUhlYWRlckNvbXBvbmVudFJlbW92ZUV2ZW50KGl0ZW06IENvbXBvbmVudEl0ZW0pIHtcclxuICAgICAgICB0aGlzLnJlbW92ZUNoaWxkKGl0ZW0sIGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZUhlYWRlckNvbXBvbmVudEZvY3VzRXZlbnQoaXRlbTogQ29tcG9uZW50SXRlbSkge1xyXG4gICAgICAgIHRoaXMuc2V0QWN0aXZlQ29tcG9uZW50SXRlbShpdGVtLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGhhbmRsZUhlYWRlckNvbXBvbmVudFN0YXJ0RHJhZ0V2ZW50KHg6IG51bWJlciwgeTogbnVtYmVyLCBkcmFnTGlzdGVuZXI6IERyYWdMaXN0ZW5lciwgY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzTWF4aW1pc2VkID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlTWF4aW1pc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5sYXlvdXRNYW5hZ2VyLnN0YXJ0Q29tcG9uZW50RHJhZyh4LCB5LCBkcmFnTGlzdGVuZXIsIGNvbXBvbmVudEl0ZW0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlSGVhZGVyQ29uZmlnKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5faGVhZGVyU2lkZUNoYW5nZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlc29sdmVkSGVhZGVyZWRJdGVtQ29uZmlnLkhlYWRlci5jcmVhdGVDb3B5KHRoaXMuX2hlYWRlckNvbmZpZyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3Qgc2hvdyA9IHRoaXMuX2hlYWRlci5zaG93ID8gdGhpcy5faGVhZGVyLnNpZGUgOiBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBSZXNvbHZlZEhlYWRlcmVkSXRlbUNvbmZpZy5IZWFkZXIuY3JlYXRlQ29weSh0aGlzLl9oZWFkZXJDb25maWcsIHNob3cpO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHtcclxuICAgICAgICAgICAgICAgICAgICBzaG93LFxyXG4gICAgICAgICAgICAgICAgICAgIHBvcG91dDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIG1heGltaXNlOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgY2xvc2U6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICBtaW5pbWlzZTogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgICAgIHRhYkRyb3Bkb3duOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgZW1pdFN0YXRlQ2hhbmdlZEV2ZW50KGRlYm91bmNlID0gZmFsc2UpIHtcclxuICAgICAgICBpZiAoZGVib3VuY2UpIHtcclxuICAgICAgICAgICAgdGhpcy5fZGVib3VuY2VkRW1pdFN0YXRlQ2hhbmdlZEV2ZW50KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0QmFzZUJ1YmJsaW5nRXZlbnQoJ3N0YXRlQ2hhbmdlZCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBTdGFjayB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgY29uc3QgZW51bSBTZWdtZW50IHtcclxuICAgICAgICBIZWFkZXIgPSAnaGVhZGVyJyxcclxuICAgICAgICBCb2R5ID0gJ2JvZHknLFxyXG4gICAgICAgIExlZnQgPSAnbGVmdCcsXHJcbiAgICAgICAgUmlnaHQgPSAncmlnaHQnLFxyXG4gICAgICAgIFRvcCA9ICd0b3AnLFxyXG4gICAgICAgIEJvdHRvbSA9ICdib3R0b20nLFxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29udGVudEFyZWFEaW1lbnNpb24ge1xyXG4gICAgICAgIGhvdmVyQXJlYTogQXJlYUxpbmtlZFJlY3Q7XHJcbiAgICAgICAgaGlnaGxpZ2h0QXJlYTogQXJlYUxpbmtlZFJlY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IHR5cGUgQ29udGVudEFyZWFEaW1lbnNpb25zID0ge1xyXG4gICAgICAgIFtzZWdtZW50OiBzdHJpbmddOiBDb250ZW50QXJlYURpbWVuc2lvbjtcclxuICAgIH07XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQoZG9jdW1lbnQ6IERvY3VtZW50KTogSFRNTERpdkVsZW1lbnQge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5JdGVtKTtcclxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5TdGFjayk7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgQ29tcG9uZW50SXRlbUNvbmZpZywgSXRlbUNvbmZpZywgTGF5b3V0Q29uZmlnLCBSb3dPckNvbHVtbkl0ZW1Db25maWcsIFN0YWNrSXRlbUNvbmZpZyB9IGZyb20gJy4vY29uZmlnL2NvbmZpZyc7XHJcbmltcG9ydCB7XHJcbiAgICBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcsXHJcbiAgICBSZXNvbHZlZEl0ZW1Db25maWcsXHJcbiAgICBSZXNvbHZlZExheW91dENvbmZpZyxcclxuICAgIFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLFxyXG4gICAgUmVzb2x2ZWRSb290SXRlbUNvbmZpZyxcclxuICAgIFJlc29sdmVkUm93T3JDb2x1bW5JdGVtQ29uZmlnLFxyXG4gICAgUmVzb2x2ZWRTdGFja0l0ZW1Db25maWdcclxufSBmcm9tIFwiLi9jb25maWcvcmVzb2x2ZWQtY29uZmlnXCI7XHJcbmltcG9ydCB7IENvbXBvbmVudENvbnRhaW5lciB9IGZyb20gJy4vY29udGFpbmVyL2NvbXBvbmVudC1jb250YWluZXInO1xyXG5pbXBvcnQgeyBCcm93c2VyUG9wb3V0IH0gZnJvbSAnLi9jb250cm9scy9icm93c2VyLXBvcG91dCc7XHJcbmltcG9ydCB7IERyYWdBY3Rpb24gfSBmcm9tICcuL2NvbnRyb2xzL2RyYWctYWN0aW9uJztcclxuaW1wb3J0IHsgRHJhZ1NvdXJjZSB9IGZyb20gJy4vY29udHJvbHMvZHJhZy1zb3VyY2UnO1xyXG5pbXBvcnQgeyBEcm9wVGFyZ2V0SW5kaWNhdG9yIH0gZnJvbSAnLi9jb250cm9scy9kcm9wLXRhcmdldC1pbmRpY2F0b3InO1xyXG5pbXBvcnQgeyBUcmFuc2l0aW9uSW5kaWNhdG9yIH0gZnJvbSAnLi9jb250cm9scy90cmFuc2l0aW9uLWluZGljYXRvcic7XHJcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FcnJvciB9IGZyb20gJy4vZXJyb3JzL2V4dGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgQXNzZXJ0RXJyb3IsIFVuZXhwZWN0ZWROdWxsRXJyb3IsIFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvciwgVW5yZWFjaGFibGVDYXNlRXJyb3IgfSBmcm9tICcuL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuL2l0ZW1zL2NvbXBvbmVudC1pdGVtJztcclxuaW1wb3J0IHsgQ29tcG9uZW50UGFyZW50YWJsZUl0ZW0gfSBmcm9tICcuL2l0ZW1zL2NvbXBvbmVudC1wYXJlbnRhYmxlLWl0ZW0nO1xyXG5pbXBvcnQgeyBDb250ZW50SXRlbSB9IGZyb20gJy4vaXRlbXMvY29udGVudC1pdGVtJztcclxuaW1wb3J0IHsgR3JvdW5kSXRlbSB9IGZyb20gJy4vaXRlbXMvZ3JvdW5kLWl0ZW0nO1xyXG5pbXBvcnQgeyBSb3dPckNvbHVtbiB9IGZyb20gJy4vaXRlbXMvcm93LW9yLWNvbHVtbic7XHJcbmltcG9ydCB7IFN0YWNrIH0gZnJvbSAnLi9pdGVtcy9zdGFjayc7XHJcbmltcG9ydCB7IENvbmZpZ01pbmlmaWVyIH0gZnJvbSAnLi91dGlscy9jb25maWctbWluaWZpZXInO1xyXG5pbXBvcnQgeyBEb21Db25zdGFudHMgfSBmcm9tICcuL3V0aWxzL2RvbS1jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBEcmFnTGlzdGVuZXIgfSBmcm9tICcuL3V0aWxzL2RyYWctbGlzdGVuZXInO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuL3V0aWxzL2V2ZW50LWVtaXR0ZXInO1xyXG5pbXBvcnQgeyBFdmVudEh1YiB9IGZyb20gJy4vdXRpbHMvZXZlbnQtaHViJztcclxuaW1wb3J0IHsgSTE4blN0cmluZ0lkLCBJMThuU3RyaW5ncywgaTE4blN0cmluZ3MgfSBmcm9tICcuL3V0aWxzL2kxOG4tc3RyaW5ncyc7XHJcbmltcG9ydCB7IEl0ZW1UeXBlLCBKc29uVmFsdWUsIFJlY3QsIFJlc3BvbnNpdmVNb2RlLCBXaWR0aEFuZEhlaWdodCB9IGZyb20gJy4vdXRpbHMvdHlwZXMnO1xyXG5pbXBvcnQge1xyXG4gICAgZ2V0RWxlbWVudENsaWVudFdpZHRoQW5kSGVpZ2h0LFxyXG4gICAgZ2V0V2luZG93SW5uZXJTY3JlZW5Qb3NpdGlvbixcclxuICAgIHJlbW92ZUZyb21BcnJheSxcclxuICAgIHNldEVsZW1lbnRIZWlnaHQsXHJcbiAgICBzZXRFbGVtZW50V2lkdGhcclxufSBmcm9tICcuL3V0aWxzL3V0aWxzJztcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZGVjbGFyZSBnbG9iYWwge1xyXG4gICAgaW50ZXJmYWNlIFdpbmRvdyB7XHJcbiAgICAgICAgX19nbEluc3RhbmNlOiBMYXlvdXRNYW5hZ2VyO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogVGhlIG1haW4gY2xhc3MgdGhhdCB3aWxsIGJlIGV4cG9zZWQgYXMgR29sZGVuTGF5b3V0LlxyXG4gKi9cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBMYXlvdXRNYW5hZ2VyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICAgIC8qKiBXaGV0aGVyIHRoZSBsYXlvdXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGJlIHJlc2l6ZWQgdG8gY29udGFpbmVyIHdoZW5ldmVyIHRoZSBjb250YWluZXIncyBzaXplIGlzIGNoYW5nZWRcclxuICAgICAqIERlZmF1bHQgaXMgdHJ1ZSBpZiA8Ym9keT4gaXMgdGhlIGNvbnRhaW5lciBvdGhlcndpc2UgZmFsc2VcclxuICAgICAqIERlZmF1bHQgd2lsbCBiZSBjaGFuZ2VkIHRvIHRydWUgZm9yIGFueSBjb250YWluZXIgaW4gdGhlIGZ1dHVyZVxyXG4gICAgICovXHJcbiAgICByZXNpemVXaXRoQ29udGFpbmVyQXV0b21hdGljYWxseSA9IGZhbHNlO1xyXG4gICAgLyoqIFRoZSBkZWJvdW5jZSBpbnRlcnZhbCAoaW4gbWlsbGlzZWNvbmRzKSB1c2VkIHdoZW5ldmVyIGEgbGF5b3V0IGlzIGF1dG9tYXRpY2FsbHkgcmVzaXplZC4gIDAgbWVhbnMgbmV4dCB0aWNrICovXHJcbiAgICByZXNpemVEZWJvdW5jZUludGVydmFsID0gMTAwO1xyXG4gICAgLyoqIEV4dGVuZCB0aGUgY3VycmVudCBkZWJvdW5jZSBkZWxheSB0aW1lIHBlcmlvZCBpZiBpdCBpcyB0cmlnZ2VyZWQgZHVyaW5nIHRoZSBkZWxheS5cclxuICAgICAqIElmIHRoaXMgaXMgdHJ1ZSwgdGhlIGxheW91dCB3aWxsIG9ubHkgcmVzaXplIHdoZW4gaXRzIGNvbnRhaW5lciBoYXMgc3RvcHBlZCBiZWluZyByZXNpemVkLlxyXG4gICAgICogSWYgaXQgaXMgZmFsc2UsIHRoZSBsYXlvdXQgd2lsbCByZXNpemUgYXQgaW50ZXJ2YWxzIHdoaWxlIGl0cyBjb250YWluZXIgaXMgYmVpbmcgcmVzaXplZC5cclxuICAgICAqL1xyXG4gICAgcmVzaXplRGVib3VuY2VFeHRlbmRlZFdoZW5Qb3NzaWJsZSA9IHRydWU7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfY29udGFpbmVyRWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9pc0luaXRpYWxpc2VkID0gZmFsc2U7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9ncm91bmRJdGVtOiBHcm91bmRJdGVtIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfb3BlblBvcG91dHM6IEJyb3dzZXJQb3BvdXRbXSA9IFtdO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfZHJvcFRhcmdldEluZGljYXRvcjogRHJvcFRhcmdldEluZGljYXRvciB8IG51bGwgPSBudWxsO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfdHJhbnNpdGlvbkluZGljYXRvcjogVHJhbnNpdGlvbkluZGljYXRvciB8IG51bGwgPSBudWxsO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfcmVzaXplVGltZW91dElkOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2l0ZW1BcmVhczogQ29udGVudEl0ZW0uQXJlYVtdID0gW107XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9tYXhpbWlzZWRTdGFjazogU3RhY2sgfCB1bmRlZmluZWQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF9tYXhpbWlzZVBsYWNlaG9sZGVyID0gTGF5b3V0TWFuYWdlci5jcmVhdGVNYXhpbWlzZVBsYWNlRWxlbWVudChkb2N1bWVudCk7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIF90YWJEcm9wUGxhY2Vob2xkZXIgPSBMYXlvdXRNYW5hZ2VyLmNyZWF0ZVRhYkRyb3BQbGFjZWhvbGRlckVsZW1lbnQoZG9jdW1lbnQpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfZHJhZ1NvdXJjZXM6IERyYWdTb3VyY2VbXSA9IFtdO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfdXBkYXRpbmdDb2x1bW5zUmVzcG9uc2l2ZSA9IGZhbHNlO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfZmlyc3RMb2FkID0gdHJ1ZTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2V2ZW50SHViID0gbmV3IEV2ZW50SHViKHRoaXMpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfd2lkdGg6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfaGVpZ2h0OiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2ZvY3VzZWRDb21wb25lbnRJdGVtOiBDb21wb25lbnRJdGVtIHwgdW5kZWZpbmVkO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfdmlydHVhbFNpemVkQ29udGFpbmVyczogQ29tcG9uZW50Q29udGFpbmVyW10gPSBbXTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3ZpcnR1YWxTaXplZENvbnRhaW5lckFkZGluZ0JlZ2luQ291bnQgPSAwO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfc2l6ZUludmFsaWRhdGlvbkJlZ2luQ291bnQgPSAwO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJvdGVjdGVkIF9jb25zdHJ1Y3Rvck9yU3ViV2luZG93TGF5b3V0Q29uZmlnOiBMYXlvdXRDb25maWcgfCB1bmRlZmluZWQ7IC8vIHByb3RlY3RlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3BhcmVudDogTGF5b3V0TWFuYWdlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3Jlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHRoaXMuaGFuZGxlQ29udGFpbmVyUmVzaXplKCkpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCBAZGVwcmVjYXRlZCB0byBiZSByZW1vdmVkIGluIHZlcnNpb24gMyAqL1xyXG4gICAgcHJpdmF0ZSBfd2luZG93QmVmb3JlVW5sb2FkTGlzdGVuZXIgPSAoKSA9PiB0aGlzLm9uQmVmb3JlVW5sb2FkKCk7XHJcbiAgICAvKiogQGludGVybmFsIEBkZXByZWNhdGVkIHRvIGJlIHJlbW92ZWQgaW4gdmVyc2lvbiAzICovXHJcbiAgICBwcml2YXRlIF93aW5kb3dCZWZvcmVVbmxvYWRMaXN0ZW5pbmcgPSBmYWxzZTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX21heGltaXNlZFN0YWNrQmVmb3JlRGVzdHJveWVkTGlzdGVuZXIgPSAoZXY6IEV2ZW50RW1pdHRlci5CdWJibGluZ0V2ZW50KSA9PiB0aGlzLmNsZWFudXBCZWZvcmVNYXhpbWlzZWRTdGFja0Rlc3Ryb3llZChldik7XHJcblxyXG4gICAgcmVhZG9ubHkgaXNTdWJXaW5kb3c6IGJvb2xlYW47XHJcbiAgICBsYXlvdXRDb25maWc6IFJlc29sdmVkTGF5b3V0Q29uZmlnO1xyXG5cclxuICAgIGJlZm9yZVZpcnR1YWxSZWN0aW5nRXZlbnQ6IExheW91dE1hbmFnZXIuQmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudCB8IHVuZGVmaW5lZDtcclxuICAgIGFmdGVyVmlydHVhbFJlY3RpbmdFdmVudDogTGF5b3V0TWFuYWdlci5BZnRlclZpcnR1YWxSZWN0aW5nRXZlbnQgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3ZlcyB0aGUgYXNzb2NpYXRlZCB3aW5kb3cgdG8gdGhlIGZyb250LlxyXG4gICAgICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBoYXMgbm8gZWZmZWN0IChjYW4gYmUgc2V0IGJ5IEVsZWN0cm9uKS5cclxuICAgICAqIEBwdWJsaWMgXHJcbiAgICAgKi9cclxuICAgIG1vdmVXaW5kb3dUb3A6ICh0aGlzOiB2b2lkKSA9PiB2b2lkID0gKCkgPT4ge307XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGb2N1cyB0aGUgYXNzb2NpYXRlZCB3aW5kb3cgd2luZG93LlxyXG4gICAgICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpbnZva2VzIHdpbmRvdy5mb2N1cygpIChjYW4gYmUgc2V0IGJ5IEVsZWN0cm9uKS5cclxuICAgICAqIEBwdWJsaWMgXHJcbiAgICAgKi9cclxuICAgIGZvY3VzV2luZG93OiAodGhpczogdm9pZCkgPT4gdm9pZCA9ICgpID0+IGdsb2JhbFRoaXMuZm9jdXMoKTtcclxuXHJcbiAgICBnZXQgY29udGFpbmVyKCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX2NvbnRhaW5lckVsZW1lbnQ7IH1cclxuICAgIGdldCBpc0luaXRpYWxpc2VkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5faXNJbml0aWFsaXNlZDsgfVxyXG4gICAgZ2V0IGlzRHJhZ2dpbmcoKTogYm9vbGVhbiB7IHJldHVybiBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5jb250YWlucyhEb21Db25zdGFudHMuQ2xhc3NOYW1lLkRyYWdnaW5nKTsgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZ2V0IGdyb3VuZEl0ZW0oKTogR3JvdW5kSXRlbSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9ncm91bmRJdGVtOyB9XHJcbiAgICAvKiogQGludGVybmFsIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKExheW91dE1hbmFnZXI6Y2xhc3MpLmdyb3VuZEl0ZW19IGluc3RlYWQgKi9cclxuICAgIGdldCByb290KCk6IEdyb3VuZEl0ZW0gfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fZ3JvdW5kSXRlbTsgfVxyXG4gICAgZ2V0IG9wZW5Qb3BvdXRzKCk6IEJyb3dzZXJQb3BvdXRbXSB7IHJldHVybiB0aGlzLl9vcGVuUG9wb3V0czsgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZ2V0IGRyb3BUYXJnZXRJbmRpY2F0b3IoKTogRHJvcFRhcmdldEluZGljYXRvciB8IG51bGwgeyByZXR1cm4gdGhpcy5fZHJvcFRhcmdldEluZGljYXRvcjsgfVxyXG4gICAgLyoqIEBpbnRlcm5hbCBAZGVwcmVjYXRlZCBUbyBiZSByZW1vdmVkICovXHJcbiAgICBnZXQgdHJhbnNpdGlvbkluZGljYXRvcigpOiBUcmFuc2l0aW9uSW5kaWNhdG9yIHwgbnVsbCB7IHJldHVybiB0aGlzLl90cmFuc2l0aW9uSW5kaWNhdG9yOyB9XHJcbiAgICBnZXQgd2lkdGgoKTogbnVtYmVyIHwgbnVsbCB7IHJldHVybiB0aGlzLl93aWR0aDsgfVxyXG4gICAgZ2V0IGhlaWdodCgpOiBudW1iZXIgfCBudWxsIHsgcmV0dXJuIHRoaXMuX2hlaWdodDsgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRyaWV2ZXMgdGhlIHtAbGluayAoRXZlbnRIdWI6Y2xhc3MpfSBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBsYXlvdXQgbWFuYWdlci5cclxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gcHJvcGFnYXRlIGV2ZW50cyBiZXR3ZWVuIHRoZSB3aW5kb3dzXHJcbiAgICAgKiBAcHVibGljXHJcbiAgICAgKi9cclxuICAgIGdldCBldmVudEh1YigpOiBFdmVudEh1YiB7IHJldHVybiB0aGlzLl9ldmVudEh1YjsgfVxyXG4gICAgZ2V0IHJvb3RJdGVtKCk6IENvbnRlbnRJdGVtIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGFjY2VzcyByb290SXRlbSBiZWZvcmUgaW5pdCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGdyb3VuZENvbnRlbnRJdGVtcyA9IHRoaXMuX2dyb3VuZEl0ZW0uY29udGVudEl0ZW1zO1xyXG4gICAgICAgICAgICBpZiAoZ3JvdW5kQ29udGVudEl0ZW1zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9ncm91bmRJdGVtLmNvbnRlbnRJdGVtc1swXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGdldCBmb2N1c2VkQ29tcG9uZW50SXRlbSgpOiBDb21wb25lbnRJdGVtIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX2ZvY3VzZWRDb21wb25lbnRJdGVtOyB9XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBnZXQgdGFiRHJvcFBsYWNlaG9sZGVyKCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuX3RhYkRyb3BQbGFjZWhvbGRlcjsgfVxyXG4gICAgZ2V0IG1heGltaXNlZFN0YWNrKCk6IFN0YWNrIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX21heGltaXNlZFN0YWNrOyB9XHJcblxyXG4gICAgLyoqIEBkZXByZWNhdGVkIGluZGljYXRlcyBkZXByZWNhdGVkIGNvbnN0cnVjdG9yIHVzZSAqL1xyXG4gICAgZ2V0IGRlcHJlY2F0ZWRDb25zdHJ1Y3RvcigpOiBib29sZWFuIHsgcmV0dXJuICF0aGlzLmlzU3ViV2luZG93ICYmIHRoaXMuX2NvbnN0cnVjdG9yT3JTdWJXaW5kb3dMYXlvdXRDb25maWcgIT09IHVuZGVmaW5lZDsgfVxyXG5cclxuICAgIGdldCBwYXJlbnQoKTogTGF5b3V0TWFuYWdlciB8IG51bGwgeyByZXR1cm4gdGhpcy5fcGFyZW50OyB9XHJcbiAgICBzZXQgcGFyZW50KHZhbHVlOiBMYXlvdXRNYW5hZ2VyIHwgbnVsbCkgeyB0aGlzLl9wYXJlbnQgPSB2YWx1ZTsgfVxyXG5cclxuICAgIGdldCBpbnN0YW5jZXMoKTogTGF5b3V0TWFuYWdlcltdIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IExheW91dE1hbmFnZXJbXSA9IFtdO1xyXG5cclxuICAgICAgICBjb25zdCByb290ID0gdGhpcy5wYXJlbnQgPz8gdGhpcztcclxuICAgICAgICByZXN1bHQucHVzaChyb290KTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgcG9wb3V0IG9mIHJvb3Qub3BlblBvcG91dHMpIHtcclxuICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBwb3BvdXQuZ2V0R2xJbnN0YW5jZSgpO1xyXG4gICAgICAgICAgICByZXN1bHQucHVzaChjaGlsZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgKiBAcGFyYW0gY29udGFpbmVyIC0gQSBEb20gSFRNTCBlbGVtZW50LiBEZWZhdWx0cyB0byBib2R5XHJcbiAgICAqIEBpbnRlcm5hbFxyXG4gICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnM6IExheW91dE1hbmFnZXIuQ29uc3RydWN0b3JQYXJhbWV0ZXJzKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pc1N1YldpbmRvdyA9IHBhcmFtZXRlcnMuaXNTdWJXaW5kb3c7XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbnN0cnVjdG9yT3JTdWJXaW5kb3dMYXlvdXRDb25maWcgPSBwYXJhbWV0ZXJzLmNvbnN0cnVjdG9yT3JTdWJXaW5kb3dMYXlvdXRDb25maWc7XHJcblxyXG4gICAgICAgIEkxOG5TdHJpbmdzLmNoZWNrSW5pdGlhbGlzZSgpO1xyXG4gICAgICAgIENvbmZpZ01pbmlmaWVyLmNoZWNrSW5pdGlhbGlzZSgpO1xyXG5cclxuICAgICAgICBpZiAocGFyYW1ldGVycy5jb250YWluZXJFbGVtZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyRWxlbWVudCA9IHBhcmFtZXRlcnMuY29udGFpbmVyRWxlbWVudDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyB0aGUgTGF5b3V0TWFuYWdlciBpbnN0YW5jZSBpdHNlbGYgYXMgd2VsbCBhcyBldmVyeSBDb250ZW50SXRlbVxyXG4gICAgICogd2l0aGluIGl0LiBBZnRlciB0aGlzIGlzIGNhbGxlZCBub3RoaW5nIHNob3VsZCBiZSBsZWZ0IG9mIHRoZSBMYXlvdXRNYW5hZ2VyLlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgZnVuY3Rpb24gb25seSBuZWVkcyB0byBiZSBjYWxsZWQgaWYgYW4gYXBwbGljYXRpb24gd2lzaGVzIHRvIGRlc3Ryb3kgdGhlIEdvbGRlbiBMYXlvdXQgb2JqZWN0IHdoaWxlXHJcbiAgICAgKiBhIHBhZ2UgcmVtYWlucyBsb2FkZWQuIFdoZW4gYSBwYWdlIGlzIHVubG9hZGVkLCBhbGwgcmVzb3VyY2VzIGNsYWltZWQgYnkgR29sZGVuIExheW91dCB3aWxsIGF1dG9tYXRpY2FsbHlcclxuICAgICAqIGJlIHJlbGVhc2VkLlxyXG4gICAgICovXHJcbiAgICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9pc0luaXRpYWxpc2VkKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl93aW5kb3dCZWZvcmVVbmxvYWRMaXN0ZW5pbmcpIHtcclxuICAgICAgICAgICAgICAgIGdsb2JhbFRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmVmb3JldW5sb2FkJywgdGhpcy5fd2luZG93QmVmb3JlVW5sb2FkTGlzdGVuZXIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fd2luZG93QmVmb3JlVW5sb2FkTGlzdGVuaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxheW91dENvbmZpZy5zZXR0aW5ncy5jbG9zZVBvcG91dHNPblVubG9hZCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZUFsbE9wZW5Qb3BvdXRzKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3Jlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICAgICAgdGhpcy5jaGVja0NsZWFyUmVzaXplVGltZW91dCgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZ3JvdW5kSXRlbS5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fdGFiRHJvcFBsYWNlaG9sZGVyLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZHJvcFRhcmdldEluZGljYXRvciAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZHJvcFRhcmdldEluZGljYXRvci5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3RyYW5zaXRpb25JbmRpY2F0b3IgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25JbmRpY2F0b3IuZGVzdHJveSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50SHViLmRlc3Ryb3koKTtcclxuXHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZHJhZ1NvdXJjZSBvZiB0aGlzLl9kcmFnU291cmNlcykge1xyXG4gICAgICAgICAgICAgICAgZHJhZ1NvdXJjZS5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fZHJhZ1NvdXJjZXMgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX2lzSW5pdGlhbGlzZWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlcyBhIEdvbGRlbkxheW91dCBjb25maWd1cmF0aW9uIG9iamVjdCBhbmRcclxuICAgICAqIHJlcGxhY2VzIGl0cyBrZXlzIGFuZCB2YWx1ZXMgcmVjdXJzaXZlbHkgd2l0aFxyXG4gICAgICogb25lIGxldHRlciBjb2Rlc1xyXG4gICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAoUmVzb2x2ZWRMYXlvdXRDb25maWc6bmFtZXNwYWNlKS5taW5pZnlDb25maWd9IGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgbWluaWZ5Q29uZmlnKGNvbmZpZzogUmVzb2x2ZWRMYXlvdXRDb25maWcpOiBSZXNvbHZlZExheW91dENvbmZpZyB7XHJcbiAgICAgICAgcmV0dXJuIFJlc29sdmVkTGF5b3V0Q29uZmlnLm1pbmlmeUNvbmZpZyhjb25maWcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGFrZXMgYSBjb25maWd1cmF0aW9uIE9iamVjdCB0aGF0IHdhcyBwcmV2aW91c2x5IG1pbmlmaWVkXHJcbiAgICAgKiB1c2luZyBtaW5pZnlDb25maWcgYW5kIHJldHVybnMgaXRzIG9yaWdpbmFsIHZlcnNpb25cclxuICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgKFJlc29sdmVkTGF5b3V0Q29uZmlnOm5hbWVzcGFjZSkudW5taW5pZnlDb25maWd9IGluc3RlYWRcclxuICAgICAqL1xyXG4gICAgdW5taW5pZnlDb25maWcoY29uZmlnOiBSZXNvbHZlZExheW91dENvbmZpZyk6IFJlc29sdmVkTGF5b3V0Q29uZmlnIHtcclxuICAgICAgICByZXR1cm4gUmVzb2x2ZWRMYXlvdXRDb25maWcudW5taW5pZnlDb25maWcoY29uZmlnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBhYnN0cmFjdCBiaW5kQ29tcG9uZW50KGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyLCBpdGVtQ29uZmlnOiBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcpOiBDb21wb25lbnRDb250YWluZXIuQmluZGFibGVDb21wb25lbnQ7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBhYnN0cmFjdCB1bmJpbmRDb21wb25lbnQoY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIsIHZpcnR1YWw6IGJvb2xlYW4sIGNvbXBvbmVudDogQ29tcG9uZW50Q29udGFpbmVyLkNvbXBvbmVudCB8IHVuZGVmaW5lZCk6IHZvaWQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxsZWQgZnJvbSBHb2xkZW5MYXlvdXQgY2xhc3MuIEZpbmlzaGVzIG9mIGluaXRcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBpbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2V0Q29udGFpbmVyKCk7XHJcbiAgICAgICAgdGhpcy5fZHJvcFRhcmdldEluZGljYXRvciA9IG5ldyBEcm9wVGFyZ2V0SW5kaWNhdG9yKC8qdGhpcy5jb250YWluZXIqLyk7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNpdGlvbkluZGljYXRvciA9IG5ldyBUcmFuc2l0aW9uSW5kaWNhdG9yKCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaXplRnJvbUNvbnRhaW5lcigpO1xyXG5cclxuICAgICAgICB0aGlzLmxheW91dENvbmZpZyA9IFJlc29sdmVkTGF5b3V0Q29uZmlnLmNyZWF0ZURlZmF1bHQoKTsgLy8gd2lsbCBvdmVyd3JpdHRlbiBiZSBsb2FkZWQgdmlhIGxvYWRMYXlvdXRcclxuICAgICAgICB0aGlzLl9ncm91bmRJdGVtID0gbmV3IEdyb3VuZEl0ZW0odGhpcywgdGhpcy5sYXlvdXRDb25maWcucm9vdCwgdGhpcy5fY29udGFpbmVyRWxlbWVudCk7XHJcbiAgICAgICAgdGhpcy5fZ3JvdW5kSXRlbS5pbml0KCk7XHJcblxyXG4gICAgICAgIHRoaXMuY2hlY2tMb2FkZWRMYXlvdXRNYXhpbWlzZUl0ZW0oKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLl9jb250YWluZXJFbGVtZW50KTtcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpc2VkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmFkanVzdENvbHVtbnNSZXNwb25zaXZlKCk7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdpbml0aWFsaXNlZCcpO1xyXG5cclxuICAgICAgICBsZXQgbGF5b3V0ID0gdGhpcy5fY29uc3RydWN0b3JPclN1YldpbmRvd0xheW91dENvbmZpZztcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNTdWJXaW5kb3cgJiYgbGF5b3V0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgLy8gV3JhcCBpbiBzdGFjayBmb3IgbXVsdGl3aW5kb3cgZHJhZy1hbmQtZHJvcCB0byB3b3JrIHByb3Blcmx5XHJcbiAgICAgICAgICAgIGlmIChsYXlvdXQucm9vdD8udHlwZSA9PSBJdGVtVHlwZS5jb21wb25lbnQpIHtcclxuICAgICAgICAgICAgICAgIGxheW91dC5yb290ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IEl0ZW1UeXBlLnN0YWNrLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IFsgbGF5b3V0LnJvb3QgXSxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMubG9hZExheW91dChsYXlvdXQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIExvYWRzIGEgbmV3IGxheW91dFxyXG4gICAgICogQHBhcmFtIGxheW91dENvbmZpZyAtIE5ldyBsYXlvdXQgdG8gYmUgbG9hZGVkXHJcbiAgICAgKi9cclxuICAgIGxvYWRMYXlvdXQobGF5b3V0Q29uZmlnOiBMYXlvdXRDb25maWcpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXNlZCkge1xyXG4gICAgICAgICAgICAvLyBJbiBjYXNlIGFwcGxpY2F0aW9uIG5vdCBjb3JyZWN0bHkgdXNpbmcgbGVnYWN5IGNvbnN0cnVjdG9yXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignR29sZGVuTGF5b3V0OiBOZWVkIHRvIGNhbGwgaW5pdCgpIGlmIExheW91dENvbmZpZyB3aXRoIGRlZmluZWQgcm9vdCBwYXNzZWQgdG8gY29uc3RydWN0b3InKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0xNTEwxMTExOScpO1xyXG4gICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0Q29uZmlnID0gTGF5b3V0Q29uZmlnLnJlc29sdmUobGF5b3V0Q29uZmlnKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlU3ViV2luZG93cygpOyAvLyBzdGlsbCBuZWVkcyB0byBiZSB0ZXN0ZWRcclxuICAgICAgICAgICAgICAgIHRoaXMuX2dyb3VuZEl0ZW0ubG9hZFJvb3QodGhpcy5sYXlvdXRDb25maWcucm9vdCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrTG9hZGVkTGF5b3V0TWF4aW1pc2VJdGVtKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkanVzdENvbHVtbnNSZXNwb25zaXZlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbGF5b3V0IGNvbmZpZ3VyYXRpb24gb2JqZWN0IGJhc2VkIG9uIHRoZSB0aGUgY3VycmVudCBzdGF0ZVxyXG4gICAgICpcclxuICAgICAqIEBwdWJsaWNcclxuICAgICAqIEByZXR1cm5zIEdvbGRlbkxheW91dCBjb25maWd1cmF0aW9uXHJcbiAgICAgKi9cclxuICAgIHNhdmVMYXlvdXQoKTogUmVzb2x2ZWRMYXlvdXRDb25maWcge1xyXG4gICAgICAgIGlmICh0aGlzLl9pc0luaXRpYWxpc2VkID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgY3JlYXRlIGNvbmZpZywgbGF5b3V0IG5vdCB5ZXQgaW5pdGlhbGlzZWQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgLy8gaWYgKHJvb3QgIT09IHVuZGVmaW5lZCAmJiAhKHJvb3QgaW5zdGFuY2VvZiBDb250ZW50SXRlbSkpIHtcclxuICAgICAgICAgICAgLy8gICAgIHRocm93IG5ldyBFcnJvcignUm9vdCBtdXN0IGJlIGEgQ29udGVudEl0ZW0nKTtcclxuICAgICAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgKiBDb250ZW50XHJcbiAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0xNVEMxODI0NCcpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdW5kQ29udGVudCA9IHRoaXMuX2dyb3VuZEl0ZW0uY2FsY3VsYXRlQ29uZmlnQ29udGVudCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCByb290SXRlbUNvbmZpZzogUmVzb2x2ZWRSb290SXRlbUNvbmZpZyB8IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIGlmIChncm91bmRDb250ZW50Lmxlbmd0aCAhPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvb3RJdGVtQ29uZmlnID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByb290SXRlbUNvbmZpZyA9IGdyb3VuZENvbnRlbnRbMF07XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLypcclxuICAgICAgICAgICAgICAgICogUmV0cmlldmUgY29uZmlnIGZvciBzdWJ3aW5kb3dzXHJcbiAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWNvbmNpbGVQb3BvdXRXaW5kb3dzKCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvcGVuUG9wb3V0czogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWdbXSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwb3BvdXQgb2YgdGhpcy5fb3BlblBvcG91dHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocG9wb3V0LmlzSW5pdGlhbGlzZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3BlblBvcG91dHMucHVzaChwb3BvdXQudG9Db25maWcoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpZzogUmVzb2x2ZWRMYXlvdXRDb25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm9vdDogcm9vdEl0ZW1Db25maWcsXHJcbiAgICAgICAgICAgICAgICAgICAgb3BlblBvcG91dHMsXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6ICBSZXNvbHZlZExheW91dENvbmZpZy5TZXR0aW5ncy5jcmVhdGVDb3B5KHRoaXMubGF5b3V0Q29uZmlnLnNldHRpbmdzKSxcclxuICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb25zOiBSZXNvbHZlZExheW91dENvbmZpZy5EaW1lbnNpb25zLmNyZWF0ZUNvcHkodGhpcy5sYXlvdXRDb25maWcuZGltZW5zaW9ucyksXHJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyOiBSZXNvbHZlZExheW91dENvbmZpZy5IZWFkZXIuY3JlYXRlQ29weSh0aGlzLmxheW91dENvbmZpZy5oZWFkZXIpLFxyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVkOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiBjb25maWc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGFueSBleGlzdGluZyBsYXlvdXQuIEVmZmVjdGl2ZWx5LCBhbiBlbXB0eSBsYXlvdXQgd2lsbCBiZSBsb2FkZWQuXHJcbiAgICAgKi9cclxuXHJcbiAgICBjbGVhcigpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0xNQ0wxMTEyOScpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2dyb3VuZEl0ZW0uY2xlYXJSb290KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAoTGF5b3V0TWFuYWdlcjpjbGFzcykuc2F2ZUxheW91dH1cclxuICAgICAqL1xyXG4gICAgdG9Db25maWcoKTogUmVzb2x2ZWRMYXlvdXRDb25maWcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNhdmVMYXlvdXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBuZXcgQ29tcG9uZW50SXRlbS4gIFdpbGwgdXNlIGRlZmF1bHQgbG9jYXRpb24gc2VsZWN0b3JzIHRvIGVuc3VyZSBhIGxvY2F0aW9uIGlzIGZvdW5kIGFuZFxyXG4gICAgICogY29tcG9uZW50IGlzIHN1Y2Nlc3NmdWxseSBhZGRlZFxyXG4gICAgICogQHBhcmFtIGNvbXBvbmVudFR5cGVOYW1lIC0gTmFtZSBvZiBjb21wb25lbnQgdHlwZSB0byBiZSBjcmVhdGVkLlxyXG4gICAgICogQHBhcmFtIHN0YXRlIC0gT3B0aW9uYWwgaW5pdGlhbCBzdGF0ZSB0byBiZSBhc3NpZ25lZCB0byBjb21wb25lbnRcclxuICAgICAqIEByZXR1cm5zIE5ldyBDb21wb25lbnRJdGVtIGNyZWF0ZWQuXHJcbiAgICAgKi9cclxuICAgIG5ld0NvbXBvbmVudChjb21wb25lbnRUeXBlOiBKc29uVmFsdWUsIGNvbXBvbmVudFN0YXRlPzogSnNvblZhbHVlLCB0aXRsZT86IHN0cmluZyk6IENvbXBvbmVudEl0ZW0ge1xyXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudEl0ZW0gPSB0aGlzLm5ld0NvbXBvbmVudEF0TG9jYXRpb24oY29tcG9uZW50VHlwZSwgY29tcG9uZW50U3RhdGUsIHRpdGxlKTtcclxuICAgICAgICBpZiAoY29tcG9uZW50SXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignTE1OQzY1NTg4Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudEl0ZW07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIENvbXBvbmVudEl0ZW0gYXQgdGhlIGZpcnN0IHZhbGlkIHNlbGVjdG9yIGxvY2F0aW9uLlxyXG4gICAgICogQHBhcmFtIGNvbXBvbmVudFR5cGVOYW1lIC0gTmFtZSBvZiBjb21wb25lbnQgdHlwZSB0byBiZSBjcmVhdGVkLlxyXG4gICAgICogQHBhcmFtIHN0YXRlIC0gT3B0aW9uYWwgaW5pdGlhbCBzdGF0ZSB0byBiZSBhc3NpZ25lZCB0byBjb21wb25lbnRcclxuICAgICAqIEBwYXJhbSBsb2NhdGlvblNlbGVjdG9ycyAtIEFycmF5IG9mIGxvY2F0aW9uIHNlbGVjdG9ycyB1c2VkIHRvIGZpbmQgbG9jYXRpb24gaW4gbGF5b3V0IHdoZXJlIGNvbXBvbmVudFxyXG4gICAgICogd2lsbCBiZSBhZGRlZC4gRmlyc3QgbG9jYXRpb24gaW4gYXJyYXkgd2hpY2ggaXMgdmFsaWQgd2lsbCBiZSB1c2VkLiBJZiBsb2NhdGlvblNlbGVjdG9ycyBpcyB1bmRlZmluZWQsXHJcbiAgICAgKiB7QGxpbmsgKExheW91dE1hbmFnZXI6bmFtZXNwYWNlKS5kZWZhdWx0TG9jYXRpb25TZWxlY3RvcnN9IHdpbGwgYmUgdXNlZFxyXG4gICAgICogQHJldHVybnMgTmV3IENvbXBvbmVudEl0ZW0gY3JlYXRlZCBvciB1bmRlZmluZWQgaWYgbm8gdmFsaWQgbG9jYXRpb24gc2VsZWN0b3Igd2FzIGluIGFycmF5LlxyXG4gICAgICovXHJcbiAgICBuZXdDb21wb25lbnRBdExvY2F0aW9uKGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZSwgY29tcG9uZW50U3RhdGU/OiBKc29uVmFsdWUsIHRpdGxlPzogc3RyaW5nLFxyXG4gICAgICAgIGxvY2F0aW9uU2VsZWN0b3JzPzogTGF5b3V0TWFuYWdlci5Mb2NhdGlvblNlbGVjdG9yW11cclxuICAgICk6IENvbXBvbmVudEl0ZW0gfCB1bmRlZmluZWR7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhZGQgY29tcG9uZW50IGJlZm9yZSBpbml0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLmFkZENvbXBvbmVudEF0TG9jYXRpb24oY29tcG9uZW50VHlwZSwgY29tcG9uZW50U3RhdGUsIHRpdGxlLCBsb2NhdGlvblNlbGVjdG9ycyk7XHJcbiAgICAgICAgICAgIGlmIChsb2NhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZEl0ZW0gPSBsb2NhdGlvbi5wYXJlbnRJdGVtLmNvbnRlbnRJdGVtc1tsb2NhdGlvbi5pbmRleF07XHJcbiAgICAgICAgICAgICAgICBpZiAoIUNvbnRlbnRJdGVtLmlzQ29tcG9uZW50SXRlbShjcmVhdGVkSXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNTkM5OTI4Nzc1MzMnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZWRJdGVtO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIG5ldyBDb21wb25lbnRJdGVtLiAgV2lsbCB1c2UgZGVmYXVsdCBsb2NhdGlvbiBzZWxlY3RvcnMgdG8gZW5zdXJlIGEgbG9jYXRpb24gaXMgZm91bmQgYW5kXHJcbiAgICAgKiBjb21wb25lbnQgaXMgc3VjY2Vzc2Z1bGx5IGFkZGVkXHJcbiAgICAgKiBAcGFyYW0gY29tcG9uZW50VHlwZSAtIFR5cGUgb2YgY29tcG9uZW50IHRvIGJlIGNyZWF0ZWQuXHJcbiAgICAgKiBAcGFyYW0gc3RhdGUgLSBPcHRpb25hbCBpbml0aWFsIHN0YXRlIHRvIGJlIGFzc2lnbmVkIHRvIGNvbXBvbmVudFxyXG4gICAgICogQHJldHVybnMgTG9jYXRpb24gb2YgbmV3IENvbXBvbmVudEl0ZW0gY3JlYXRlZC5cclxuICAgICAqL1xyXG4gICAgYWRkQ29tcG9uZW50KGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZSwgY29tcG9uZW50U3RhdGU/OiBKc29uVmFsdWUsIHRpdGxlPzogc3RyaW5nKTogTGF5b3V0TWFuYWdlci5Mb2NhdGlvbiB7XHJcbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSB0aGlzLmFkZENvbXBvbmVudEF0TG9jYXRpb24oY29tcG9uZW50VHlwZSwgY29tcG9uZW50U3RhdGUsIHRpdGxlKTtcclxuICAgICAgICBpZiAobG9jYXRpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNQUM5OTk0MycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgQ29tcG9uZW50SXRlbSBhdCB0aGUgZmlyc3QgdmFsaWQgc2VsZWN0b3IgbG9jYXRpb24uXHJcbiAgICAgKiBAcGFyYW0gY29tcG9uZW50VHlwZSAtIFR5cGUgb2YgY29tcG9uZW50IHRvIGJlIGNyZWF0ZWQuXHJcbiAgICAgKiBAcGFyYW0gc3RhdGUgLSBPcHRpb25hbCBpbml0aWFsIHN0YXRlIHRvIGJlIGFzc2lnbmVkIHRvIGNvbXBvbmVudFxyXG4gICAgICogQHBhcmFtIGxvY2F0aW9uU2VsZWN0b3JzIC0gQXJyYXkgb2YgbG9jYXRpb24gc2VsZWN0b3JzIHVzZWQgdG8gZmluZCBkZXRlcm1pbmUgbG9jYXRpb24gaW4gbGF5b3V0IHdoZXJlIGNvbXBvbmVudFxyXG4gICAgICogd2lsbCBiZSBhZGRlZC4gRmlyc3QgbG9jYXRpb24gaW4gYXJyYXkgd2hpY2ggaXMgdmFsaWQgd2lsbCBiZSB1c2VkLiBJZiB1bmRlZmluZWQsXHJcbiAgICAgKiB7QGxpbmsgKExheW91dE1hbmFnZXI6bmFtZXNwYWNlKS5kZWZhdWx0TG9jYXRpb25TZWxlY3RvcnN9IHdpbGwgYmUgdXNlZC5cclxuICAgICAqIEByZXR1cm5zIExvY2F0aW9uIG9mIG5ldyBDb21wb25lbnRJdGVtIGNyZWF0ZWQgb3IgdW5kZWZpbmVkIGlmIG5vIHZhbGlkIGxvY2F0aW9uIHNlbGVjdG9yIHdhcyBpbiBhcnJheS5cclxuICAgICAqL1xyXG4gICAgYWRkQ29tcG9uZW50QXRMb2NhdGlvbihjb21wb25lbnRUeXBlOiBKc29uVmFsdWUsIGNvbXBvbmVudFN0YXRlPzogSnNvblZhbHVlLCB0aXRsZT86IHN0cmluZyxcclxuICAgICAgICBsb2NhdGlvblNlbGVjdG9ycz86IHJlYWRvbmx5IExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3RvcltdXHJcbiAgICApOiBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBjb25zdCBpdGVtQ29uZmlnOiBDb21wb25lbnRJdGVtQ29uZmlnID0ge1xyXG4gICAgICAgICAgICB0eXBlOiAnY29tcG9uZW50JyxcclxuICAgICAgICAgICAgY29tcG9uZW50VHlwZSxcclxuICAgICAgICAgICAgY29tcG9uZW50U3RhdGUsXHJcbiAgICAgICAgICAgIHRpdGxlLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmFkZEl0ZW1BdExvY2F0aW9uKGl0ZW1Db25maWcsIGxvY2F0aW9uU2VsZWN0b3JzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBuZXcgQ29udGVudEl0ZW0uICBXaWxsIHVzZSBkZWZhdWx0IGxvY2F0aW9uIHNlbGVjdG9ycyB0byBlbnN1cmUgYSBsb2NhdGlvbiBpcyBmb3VuZCBhbmRcclxuICAgICAqIGNvbXBvbmVudCBpcyBzdWNjZXNzZnVsbHkgYWRkZWRcclxuICAgICAqIEBwYXJhbSBpdGVtQ29uZmlnIC0gUmVzb2x2ZWRJdGVtQ29uZmlnIG9mIGNoaWxkIHRvIGJlIGFkZGVkLlxyXG4gICAgICogQHJldHVybnMgTmV3IENvbnRlbnRJdGVtIGNyZWF0ZWQuXHJcbiAgICAqL1xyXG4gICAgbmV3SXRlbShpdGVtQ29uZmlnOiBSb3dPckNvbHVtbkl0ZW1Db25maWcgfCBTdGFja0l0ZW1Db25maWcgfCBDb21wb25lbnRJdGVtQ29uZmlnKTogQ29udGVudEl0ZW0ge1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gdGhpcy5uZXdJdGVtQXRMb2NhdGlvbihpdGVtQ29uZmlnKTtcclxuICAgICAgICBpZiAoY29udGVudEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNTkM2NTU4OCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjb250ZW50SXRlbTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgbmV3IGNoaWxkIENvbnRlbnRJdGVtIHVuZGVyIHRoZSByb290IENvbnRlbnRJdGVtLiAgSWYgYSByb290IGRvZXMgbm90IGV4aXN0LCB0aGVuIGNyZWF0ZSByb290IENvbnRlbnRJdGVtIGluc3RlYWRcclxuICAgICAqIEBwYXJhbSBpdGVtQ29uZmlnIC0gUmVzb2x2ZWRJdGVtQ29uZmlnIG9mIGNoaWxkIHRvIGJlIGFkZGVkLlxyXG4gICAgICogQHBhcmFtIGxvY2F0aW9uU2VsZWN0b3JzIC0gQXJyYXkgb2YgbG9jYXRpb24gc2VsZWN0b3JzIHVzZWQgdG8gZmluZCBkZXRlcm1pbmUgbG9jYXRpb24gaW4gbGF5b3V0IHdoZXJlIENvbnRlbnRJdGVtXHJcbiAgICAgKiB3aWxsIGJlIGFkZGVkLiBGaXJzdCBsb2NhdGlvbiBpbiBhcnJheSB3aGljaCBpcyB2YWxpZCB3aWxsIGJlIHVzZWQuIElmIHVuZGVmaW5lZCxcclxuICAgICAqIHtAbGluayAoTGF5b3V0TWFuYWdlcjpuYW1lc3BhY2UpLmRlZmF1bHRMb2NhdGlvblNlbGVjdG9yc30gd2lsbCBiZSB1c2VkLlxyXG4gICAgICogQHJldHVybnMgTmV3IENvbnRlbnRJdGVtIGNyZWF0ZWQgb3IgdW5kZWZpbmVkIGlmIG5vIHZhbGlkIGxvY2F0aW9uIHNlbGVjdG9yIHdhcyBpbiBhcnJheS4gKi9cclxuICAgIG5ld0l0ZW1BdExvY2F0aW9uKGl0ZW1Db25maWc6IFJvd09yQ29sdW1uSXRlbUNvbmZpZyB8IFN0YWNrSXRlbUNvbmZpZyB8IENvbXBvbmVudEl0ZW1Db25maWcsXHJcbiAgICAgICAgbG9jYXRpb25TZWxlY3RvcnM/OiByZWFkb25seSBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uU2VsZWN0b3JbXVxyXG4gICAgKTogQ29udGVudEl0ZW0gfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWRkIGNvbXBvbmVudCBiZWZvcmUgaW5pdCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gdGhpcy5hZGRJdGVtQXRMb2NhdGlvbihpdGVtQ29uZmlnLCBsb2NhdGlvblNlbGVjdG9ycyk7XHJcbiAgICAgICAgICAgIGlmIChsb2NhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZEl0ZW0gPSBsb2NhdGlvbi5wYXJlbnRJdGVtLmNvbnRlbnRJdGVtc1tsb2NhdGlvbi5pbmRleF07XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlZEl0ZW07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgbmV3IENvbnRlbnRJdGVtLiAgV2lsbCB1c2UgZGVmYXVsdCBsb2NhdGlvbiBzZWxlY3RvcnMgdG8gZW5zdXJlIGEgbG9jYXRpb24gaXMgZm91bmQgYW5kXHJcbiAgICAgKiBjb21wb25lbnQgaXMgc3VjY2Vzc2Z1bGx5IGFkZGVkLlxyXG4gICAgICogQHBhcmFtIGl0ZW1Db25maWcgLSBSZXNvbHZlZEl0ZW1Db25maWcgb2YgY2hpbGQgdG8gYmUgYWRkZWQuXHJcbiAgICAgKiBAcmV0dXJucyBMb2NhdGlvbiBvZiBuZXcgQ29udGVudEl0ZW0gY3JlYXRlZC4gKi9cclxuICAgIGFkZEl0ZW0oaXRlbUNvbmZpZzogUm93T3JDb2x1bW5JdGVtQ29uZmlnIHwgU3RhY2tJdGVtQ29uZmlnIHwgQ29tcG9uZW50SXRlbUNvbmZpZyk6IExheW91dE1hbmFnZXIuTG9jYXRpb24ge1xyXG4gICAgICAgIGNvbnN0IGxvY2F0aW9uID0gdGhpcy5hZGRJdGVtQXRMb2NhdGlvbihpdGVtQ29uZmlnKTtcclxuICAgICAgICBpZiAobG9jYXRpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNQUk5OTk0MycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgQ29udGVudEl0ZW0gYXQgdGhlIGZpcnN0IHZhbGlkIHNlbGVjdG9yIGxvY2F0aW9uLlxyXG4gICAgICogQHBhcmFtIGl0ZW1Db25maWcgLSBSZXNvbHZlZEl0ZW1Db25maWcgb2YgY2hpbGQgdG8gYmUgYWRkZWQuXHJcbiAgICAgKiBAcGFyYW0gbG9jYXRpb25TZWxlY3RvcnMgLSBBcnJheSBvZiBsb2NhdGlvbiBzZWxlY3RvcnMgdXNlZCB0byBmaW5kIGRldGVybWluZSBsb2NhdGlvbiBpbiBsYXlvdXQgd2hlcmUgQ29udGVudEl0ZW1cclxuICAgICAqIHdpbGwgYmUgYWRkZWQuIEZpcnN0IGxvY2F0aW9uIGluIGFycmF5IHdoaWNoIGlzIHZhbGlkIHdpbGwgYmUgdXNlZC4gSWYgdW5kZWZpbmVkLFxyXG4gICAgICoge0BsaW5rIChMYXlvdXRNYW5hZ2VyOm5hbWVzcGFjZSkuZGVmYXVsdExvY2F0aW9uU2VsZWN0b3JzfSB3aWxsIGJlIHVzZWQuXHJcbiAgICAgKiBAcmV0dXJucyBMb2NhdGlvbiBvZiBuZXcgQ29udGVudEl0ZW0gY3JlYXRlZCBvciB1bmRlZmluZWQgaWYgbm8gdmFsaWQgbG9jYXRpb24gc2VsZWN0b3Igd2FzIGluIGFycmF5LiAqL1xyXG4gICAgYWRkSXRlbUF0TG9jYXRpb24oaXRlbUNvbmZpZzogUm93T3JDb2x1bW5JdGVtQ29uZmlnIHwgU3RhY2tJdGVtQ29uZmlnIHwgQ29tcG9uZW50SXRlbUNvbmZpZyxcclxuICAgICAgICBsb2NhdGlvblNlbGVjdG9ycz86IHJlYWRvbmx5IExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3RvcltdXHJcbiAgICApOiBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGFkZCBjb21wb25lbnQgYmVmb3JlIGluaXQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAobG9jYXRpb25TZWxlY3RvcnMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gZGVmYXVsdExvY2F0aW9uU2VsZWN0b3JzIHNob3VsZCBhbHdheXMgZmluZCBhIGxvY2F0aW9uXHJcbiAgICAgICAgICAgICAgICBsb2NhdGlvblNlbGVjdG9ycyA9IExheW91dE1hbmFnZXIuZGVmYXVsdExvY2F0aW9uU2VsZWN0b3JzO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMuZmluZEZpcnN0TG9jYXRpb24obG9jYXRpb25TZWxlY3RvcnMpO1xyXG4gICAgICAgICAgICBpZiAobG9jYXRpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRJdGVtID0gbG9jYXRpb24ucGFyZW50SXRlbTtcclxuICAgICAgICAgICAgICAgIGxldCBhZGRJZHg6IG51bWJlcjtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAocGFyZW50SXRlbS50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5ncm91bmQ6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdW5kSXRlbSA9IHBhcmVudEl0ZW0gYXMgR3JvdW5kSXRlbTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWRkSWR4ID0gZ3JvdW5kSXRlbS5hZGRJdGVtKGl0ZW1Db25maWcsIGxvY2F0aW9uLmluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkZElkeCA+PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRJdGVtID0gdGhpcy5fZ3JvdW5kSXRlbS5jb250ZW50SXRlbXNbMF07IC8vIHdhcyBhZGRlZCB0byByb290SXRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkSWR4ID0gMDsgLy8gd2FzIGFkZGVkIGFzIHJvb3RJdGVtICh3aGljaCBpcyB0aGUgZmlyc3QgYW5kIG9ubHkgQ29udGVudEl0ZW0gaW4gR3JvdW5kSXRlbSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5yb3c6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5jb2x1bW46IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm93T3JDb2x1bW4gPSBwYXJlbnRJdGVtIGFzIFJvd09yQ29sdW1uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRJZHggPSByb3dPckNvbHVtbi5hZGRJdGVtKGl0ZW1Db25maWcsIGxvY2F0aW9uLmluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuc3RhY2s6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFJdGVtQ29uZmlnLmlzQ29tcG9uZW50KGl0ZW1Db25maWcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihpMThuU3RyaW5nc1tJMThuU3RyaW5nSWQuSXRlbUNvbmZpZ0lzTm90VHlwZUNvbXBvbmVudF0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSBwYXJlbnRJdGVtIGFzIFN0YWNrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkSWR4ID0gc3RhY2suYWRkSXRlbShpdGVtQ29uZmlnLCBsb2NhdGlvbi5pbmRleCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIEl0ZW1UeXBlLmNvbXBvbmVudDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNQUlBTEM4NzQ0NDYwMicpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWFjaGFibGVDYXNlRXJyb3IoJ0xNQUlBTFU5ODg4MTczMycsIHBhcmVudEl0ZW0udHlwZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKEl0ZW1Db25maWcuaXNDb21wb25lbnQoaXRlbUNvbmZpZykpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaWYgc3RhY2sgd2FzIGluc2VydGVkXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IHBhcmVudEl0ZW0uY29udGVudEl0ZW1zW2FkZElkeF07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKENvbnRlbnRJdGVtLmlzU3RhY2soaXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50SXRlbSA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZElkeCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxvY2F0aW9uLnBhcmVudEl0ZW0gPSBwYXJlbnRJdGVtO1xyXG4gICAgICAgICAgICAgICAgbG9jYXRpb24uaW5kZXggPSBhZGRJZHg7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBMb2FkcyB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudCBSZXNvbHZlZEl0ZW1Db25maWcgYXMgcm9vdC5cclxuICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gZGlzcGxheSBhIENvbXBvbmVudCBhbGwgYnkgaXRzZWxmLiAgVGhlIGxheW91dCBjYW5ub3QgYmUgY2hhbmdlZCBvdGhlciB0aGFuIGhhdmluZyBhbm90aGVyIG5ldyBsYXlvdXQgbG9hZGVkLlxyXG4gICAgICogTm90ZSB0aGF0LCBpZiB0aGlzIGxheW91dCBpcyBzYXZlZCBhbmQgcmVsb2FkZWQsIGl0IHdpbGwgcmVsb2FkIHdpdGggdGhlIENvbXBvbmVudCBhcyBhIGNoaWxkIG9mIGEgU3RhY2suXHJcbiAgICAqL1xyXG4gICAgbG9hZENvbXBvbmVudEFzUm9vdChpdGVtQ29uZmlnOiBDb21wb25lbnRJdGVtQ29uZmlnKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhZGQgaXRlbSBiZWZvcmUgaW5pdCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2dyb3VuZEl0ZW0ubG9hZENvbXBvbmVudEFzUm9vdChpdGVtQ29uZmlnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgKExheW91dE1hbmFnZXI6Y2xhc3MpLnNldFNpemV9ICovXHJcbiAgICB1cGRhdGVTaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgbGF5b3V0IG1hbmFnZXJzIHNpemVcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gd2lkdGggLSBXaWR0aCBpbiBwaXhlbHNcclxuICAgICAqIEBwYXJhbSBoZWlnaHQgLSBIZWlnaHQgaW4gcGl4ZWxzXHJcbiAgICAgKi9cclxuICAgIHNldFNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl93aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgIHRoaXMuX2hlaWdodCA9IGhlaWdodDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2lzSW5pdGlhbGlzZWQgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1VUzE4ODgxJyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ncm91bmRJdGVtLnNldFNpemUodGhpcy5fd2lkdGgsIHRoaXMuX2hlaWdodCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX21heGltaXNlZFN0YWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBnZXRFbGVtZW50Q2xpZW50V2lkdGhBbmRIZWlnaHQodGhpcy5fY29udGFpbmVyRWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0RWxlbWVudFdpZHRoKHRoaXMuX21heGltaXNlZFN0YWNrLmVsZW1lbnQsIHdpZHRoKTtcclxuICAgICAgICAgICAgICAgICAgICBzZXRFbGVtZW50SGVpZ2h0KHRoaXMuX21heGltaXNlZFN0YWNrLmVsZW1lbnQsIGhlaWdodCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWF4aW1pc2VkU3RhY2sudXBkYXRlU2l6ZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGp1c3RDb2x1bW5zUmVzcG9uc2l2ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGJlZ2luU2l6ZUludmFsaWRhdGlvbigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9zaXplSW52YWxpZGF0aW9uQmVnaW5Db3VudCsrO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGVuZFNpemVJbnZhbGlkYXRpb24oKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKC0tdGhpcy5fc2l6ZUludmFsaWRhdGlvbkJlZ2luQ291bnQgPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplRnJvbUNvbnRhaW5lcigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICB1cGRhdGVTaXplRnJvbUNvbnRhaW5lcigpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGdldEVsZW1lbnRDbGllbnRXaWR0aEFuZEhlaWdodCh0aGlzLl9jb250YWluZXJFbGVtZW50KTtcclxuICAgICAgICB0aGlzLnNldFNpemUod2lkdGgsIGhlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGUgdGhlIHNpemUgb2YgdGhlIHJvb3QgQ29udGVudEl0ZW0uICBUaGlzIHdpbGwgdXBkYXRlIHRoZSBzaXplIG9mIGFsbCBjb250ZW50SXRlbXMgaW4gdGhlIHRyZWVcclxuICAgICAqIEBwYXJhbSBmb3JjZSAtIEluIHNvbWUgY2FzZXMgdGhlIHNpemUgaXMgbm90IHVwZGF0ZWQgaWYgaXQgaGFzIG5vdCBjaGFuZ2VkLiBJbiB0aGlzIGNhc2UsIGV2ZW50c1xyXG4gICAgICogKHN1Y2ggYXMgQ29tcG9uZW50Q29udGFpbmVyLnZpcnR1YWxSZWN0aW5nUmVxdWlyZWRFdmVudCkgYXJlIG5vdCBmaXJlZC4gU2V0dGluZyBmb3JjZSB0byB0cnVlLCBlbnN1cmVzIHRoZSBzaXplIGlzIHVwZGF0ZWQgcmVnYXJkbGVzcywgYW5kXHJcbiAgICAgKiB0aGUgcmVzcGVjdGl2ZSBldmVudHMgYXJlIGZpcmVkLiBUaGlzIGlzIHNvbWV0aW1lcyBuZWNlc3Nhcnkgd2hlbiBhIGNvbXBvbmVudCdzIHNpemUgaGFzIG5vdCBjaGFuZ2VkIGJ1dCBpdCBoYXMgYmVjb21lIHZpc2libGUsIGFuZCB0aGVcclxuICAgICAqIHJlbGV2YW50IGV2ZW50cyBuZWVkIHRvIGJlIGZpcmVkLlxyXG4gICAgICovXHJcbiAgICB1cGRhdGVSb290U2l6ZShmb3JjZSA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTVVSUzI4ODgxJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZ3JvdW5kSXRlbS51cGRhdGVTaXplKGZvcmNlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwdWJsaWMgKi9cclxuICAgIGNyZWF0ZUFuZEluaXRDb250ZW50SXRlbShjb25maWc6IFJlc29sdmVkSXRlbUNvbmZpZywgcGFyZW50OiBDb250ZW50SXRlbSk6IENvbnRlbnRJdGVtIHtcclxuICAgICAgICBjb25zdCBuZXdJdGVtID0gdGhpcy5jcmVhdGVDb250ZW50SXRlbShjb25maWcsIHBhcmVudCk7XHJcbiAgICAgICAgbmV3SXRlbS5pbml0KCk7XHJcbiAgICAgICAgcmV0dXJuIG5ld0l0ZW07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZWN1cnNpdmVseSBjcmVhdGVzIG5ldyBpdGVtIHRyZWUgc3RydWN0dXJlcyBiYXNlZCBvbiBhIHByb3ZpZGVkXHJcbiAgICAgKiBJdGVtQ29uZmlndXJhdGlvbiBvYmplY3RcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gY29uZmlnIC0gUmVzb2x2ZWRJdGVtQ29uZmlnXHJcbiAgICAgKiBAcGFyYW0gcGFyZW50IC0gVGhlIGl0ZW0gdGhlIG5ld2x5IGNyZWF0ZWQgaXRlbSBzaG91bGQgYmUgYSBjaGlsZCBvZlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZUNvbnRlbnRJdGVtKGNvbmZpZzogUmVzb2x2ZWRJdGVtQ29uZmlnLCBwYXJlbnQ6IENvbnRlbnRJdGVtKTogQ29udGVudEl0ZW0ge1xyXG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLnR5cGUgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoJ01pc3NpbmcgcGFyYW1ldGVyIFxcJ3R5cGVcXCcnLCBKU09OLnN0cmluZ2lmeShjb25maWcpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFdlIGFkZCBhbiBhZGRpdGlvbmFsIHN0YWNrIGFyb3VuZCBldmVyeSBjb21wb25lbnQgdGhhdCdzIG5vdCB3aXRoaW4gYSBzdGFjayBhbnl3YXlzLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGNvbXBvbmVudFxyXG4gICAgICAgICAgICBSZXNvbHZlZEl0ZW1Db25maWcuaXNDb21wb25lbnRJdGVtKGNvbmZpZykgJiZcclxuXHJcbiAgICAgICAgICAgIC8vIGFuZCBpdCdzIG5vdCBhbHJlYWR5IHdpdGhpbiBhIHN0YWNrXHJcbiAgICAgICAgICAgICEocGFyZW50IGluc3RhbmNlb2YgU3RhY2spICYmXHJcblxyXG4gICAgICAgICAgICAvLyBhbmQgd2UgaGF2ZSBhIHBhcmVudFxyXG4gICAgICAgICAgICAhIXBhcmVudCAmJlxyXG5cclxuICAgICAgICAgICAgLy8gYW5kIGl0J3Mgbm90IHRoZSB0b3Btb3N0IGl0ZW0gaW4gYSBuZXcgd2luZG93XHJcbiAgICAgICAgICAgICEodGhpcy5pc1N1YldpbmRvdyA9PT0gdHJ1ZSAmJiBwYXJlbnQgaW5zdGFuY2VvZiBHcm91bmRJdGVtKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFja0NvbmZpZzogUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBJdGVtVHlwZS5zdGFjayxcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IFtjb25maWddLFxyXG4gICAgICAgICAgICAgICAgc2l6ZTogY29uZmlnLnNpemUsXHJcbiAgICAgICAgICAgICAgICBzaXplVW5pdDogY29uZmlnLnNpemVVbml0LFxyXG4gICAgICAgICAgICAgICAgbWluU2l6ZTogY29uZmlnLm1pblNpemUsXHJcbiAgICAgICAgICAgICAgICBtaW5TaXplVW5pdDogY29uZmlnLm1pblNpemVVbml0LFxyXG4gICAgICAgICAgICAgICAgaWQ6IGNvbmZpZy5pZCxcclxuICAgICAgICAgICAgICAgIG1heGltaXNlZDogY29uZmlnLm1heGltaXNlZCxcclxuICAgICAgICAgICAgICAgIGlzQ2xvc2FibGU6IGNvbmZpZy5pc0Nsb3NhYmxlLFxyXG4gICAgICAgICAgICAgICAgYWN0aXZlSXRlbUluZGV4OiAwLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjb25maWcgPSBzdGFja0NvbmZpZztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gdGhpcy5jcmVhdGVDb250ZW50SXRlbUZyb21Db25maWcoY29uZmlnLCBwYXJlbnQpO1xyXG4gICAgICAgIHJldHVybiBjb250ZW50SXRlbTtcclxuICAgIH1cclxuXHJcbiAgICBmaW5kRmlyc3RDb21wb25lbnRJdGVtQnlJZChpZDogc3RyaW5nKTogQ29tcG9uZW50SXRlbSB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTUZGQ0lCSTgyNDQ2Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluZEZpcnN0Q29udGVudEl0ZW1UeXBlQnlJZFJlY3Vyc2l2ZShJdGVtVHlwZS5jb21wb25lbnQsIGlkLCB0aGlzLl9ncm91bmRJdGVtKSBhcyBDb21wb25lbnRJdGVtO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjcmVhdGVQb3BvdXRGcm9tQ29udGVudEl0ZW0oaXRlbTogQ29udGVudEl0ZW0sXHJcbiAgICAgICAgd2luZG93OiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZy5XaW5kb3cgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgcGFyZW50SWQ6IHN0cmluZyB8IG51bGwsXHJcbiAgICAgICAgZG9ja1BvaW50OiBDb250ZW50SXRlbS5Eb2NrUG9pbnQgfCBudWxsIHwgdW5kZWZpbmVkLFxyXG4gICAgKTogQnJvd3NlclBvcG91dCB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgdGhlIGl0ZW0gaXMgdGhlIG9ubHkgY29tcG9uZW50IHdpdGhpbiBhIHN0YWNrIG9yIGZvciBzb21lXHJcbiAgICAgICAgICogb3RoZXIgcmVhc29uIHRoZSBvbmx5IGNoaWxkIG9mIGl0cyBwYXJlbnQgdGhlIHBhcmVudCB3aWxsIGJlIGRlc3Ryb3llZFxyXG4gICAgICAgICAqIHdoZW4gdGhlIGNoaWxkIGlzIHJlbW92ZWQuXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiBJbiBvcmRlciB0byBzdXBwb3J0IHRoaXMgd2UgbW92ZSB1cCB0aGUgdHJlZSB1bnRpbCB3ZSBmaW5kIHNvbWV0aGluZ1xyXG4gICAgICAgICAqIHRoYXQgd2lsbCByZW1haW4gYWZ0ZXIgdGhlIGl0ZW0gaXMgYmVpbmcgcG9wcGVkIG91dFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IGRvY2sgPSBkb2NrUG9pbnQgPz8gaXRlbS5maW5kRG9ja1BvaW50KCk7XHJcblxyXG4gICAgICAgIGlmIChkb2NrID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdMTUNQRkNJMDA4MzQnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAocGFyZW50SWQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIGRvY2sucGFyZW50LmFkZFBvcEluUGFyZW50SWQocGFyZW50SWQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAod2luZG93ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyU2NyZWVuID0gZ2V0V2luZG93SW5uZXJTY3JlZW5Qb3NpdGlvbihnbG9iYWxUaGlzKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNsaWVudFJlY3QgPSAoaXRlbSBpbnN0YW5jZW9mIENvbXBvbmVudEl0ZW0pID8gaXRlbS5nZXRPdXRlckJvdW5kaW5nQ2xpZW50UmVjdCgpIDogaXRlbS5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIHdpbmRvdyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiBpbm5lclNjcmVlbi5sZWZ0ICsgY2xpZW50UmVjdC5sZWZ0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRvcDogaW5uZXJTY3JlZW4udG9wICsgY2xpZW50UmVjdC50b3AsXHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGNsaWVudFJlY3Qud2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBjbGllbnRSZWN0LmhlaWdodCxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1Db25maWcgPSBpdGVtLnRvQ29uZmlnKCk7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLnBhcmVudD8uY29udGVudEl0ZW1zLmluY2x1ZGVzKGl0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIVJlc29sdmVkUm9vdEl0ZW1Db25maWcuaXNSb290SXRlbUNvbmZpZyhpdGVtQ29uZmlnKSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2kxOG5TdHJpbmdzW0kxOG5TdHJpbmdJZC5Qb3BvdXRDYW5ub3RCZUNyZWF0ZWRXaXRoR3JvdW5kSXRlbUNvbmZpZ119YCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVQb3BvdXRGcm9tSXRlbUNvbmZpZyhpdGVtQ29uZmlnLCB3aW5kb3csIHBhcmVudElkLCBkb2NrLmluZGV4KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBiZWdpblZpcnR1YWxTaXplZENvbnRhaW5lckFkZGluZygpOiB2b2lkIHtcclxuICAgICAgICBpZiAoKyt0aGlzLl92aXJ0dWFsU2l6ZWRDb250YWluZXJBZGRpbmdCZWdpbkNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZpcnR1YWxTaXplZENvbnRhaW5lcnMubGVuZ3RoID0gMDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgYWRkVmlydHVhbFNpemVkQ29udGFpbmVyKGNvbnRhaW5lcjogQ29tcG9uZW50Q29udGFpbmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdmlydHVhbFNpemVkQ29udGFpbmVycy5wdXNoKGNvbnRhaW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZW5kVmlydHVhbFNpemVkQ29udGFpbmVyQWRkaW5nKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICgtLXRoaXMuX3ZpcnR1YWxTaXplZENvbnRhaW5lckFkZGluZ0JlZ2luQ291bnQgPT09IDApIHtcclxuICAgICAgICAgICAgY29uc3QgY291bnQgPSB0aGlzLl92aXJ0dWFsU2l6ZWRDb250YWluZXJzLmxlbmd0aDtcclxuICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maXJlQmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudChjb3VudCk7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLl92aXJ0dWFsU2l6ZWRDb250YWluZXJzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5ub3RpZnlWaXJ0dWFsUmVjdGluZ1JlcXVpcmVkKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVBZnRlclZpcnR1YWxSZWN0aW5nRXZlbnQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ZpcnR1YWxTaXplZENvbnRhaW5lcnMubGVuZ3RoID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBmaXJlQmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudChjb3VudDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuYmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudChjb3VudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGZpcmVBZnRlclZpcnR1YWxSZWN0aW5nRXZlbnQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuYWZ0ZXJWaXJ0dWFsUmVjdGluZ0V2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5hZnRlclZpcnR1YWxSZWN0aW5nRXZlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVQb3BvdXRGcm9tSXRlbUNvbmZpZyhyb290SXRlbUNvbmZpZzogUmVzb2x2ZWRSb290SXRlbUNvbmZpZyxcclxuICAgICAgICB3aW5kb3c6IFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnLldpbmRvdyxcclxuICAgICAgICBwYXJlbnRJZDogc3RyaW5nIHwgbnVsbCxcclxuICAgICAgICBpbmRleEluUGFyZW50OiBudW1iZXIgfCBudWxsXHJcbiAgICApIHtcclxuICAgICAgICBjb25zdCBsYXlvdXRDb25maWcgPSB0aGlzLnRvQ29uZmlnKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHBvcG91dExheW91dENvbmZpZzogUmVzb2x2ZWRQb3BvdXRMYXlvdXRDb25maWcgPSB7XHJcbiAgICAgICAgICAgIHJvb3Q6IHJvb3RJdGVtQ29uZmlnLFxyXG4gICAgICAgICAgICBvcGVuUG9wb3V0czogW10sXHJcbiAgICAgICAgICAgIHNldHRpbmdzOiBsYXlvdXRDb25maWcuc2V0dGluZ3MsXHJcbiAgICAgICAgICAgIGRpbWVuc2lvbnM6IGxheW91dENvbmZpZy5kaW1lbnNpb25zLFxyXG4gICAgICAgICAgICBoZWFkZXI6IGxheW91dENvbmZpZy5oZWFkZXIsXHJcbiAgICAgICAgICAgIHdpbmRvdyxcclxuICAgICAgICAgICAgcGFyZW50SWQsXHJcbiAgICAgICAgICAgIGluZGV4SW5QYXJlbnQsXHJcbiAgICAgICAgICAgIHJlc29sdmVkOiB0cnVlLFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlUG9wb3V0RnJvbVBvcG91dExheW91dENvbmZpZyhwb3BvdXRMYXlvdXRDb25maWcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNyZWF0ZVBvcG91dEZyb21Qb3BvdXRMYXlvdXRDb25maWcoY29uZmlnOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyk6IEJyb3dzZXJQb3BvdXQge1xyXG4gICAgICAgIC8vIElmIHRoaXMgaXMgYWxyZWFkeSBhIHBvcG91dCwgbGV0IHRoZSBwYXJlbnQgbGF5b3V0IG1hbmFnZXIgaGFuZGxlIHRoZSBuZXcgb25lLlxyXG4gICAgICAgIGlmICh0aGlzLl9wYXJlbnQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudC5jcmVhdGVQb3BvdXRGcm9tUG9wb3V0TGF5b3V0Q29uZmlnKGNvbmZpZyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjb25maWdXaW5kb3cgPSBjb25maWcud2luZG93O1xyXG4gICAgICAgIGNvbnN0IGluaXRpYWxXaW5kb3c6IFJlY3QgPSB7XHJcbiAgICAgICAgICAgIGxlZnQ6IGNvbmZpZ1dpbmRvdy5sZWZ0ID8/IChnbG9iYWxUaGlzLnNjcmVlblggfHwgZ2xvYmFsVGhpcy5zY3JlZW5MZWZ0ICsgMjApLFxyXG4gICAgICAgICAgICB0b3A6IGNvbmZpZ1dpbmRvdy50b3AgPz8gKGdsb2JhbFRoaXMuc2NyZWVuWSB8fCBnbG9iYWxUaGlzLnNjcmVlblRvcCArIDIwKSxcclxuICAgICAgICAgICAgd2lkdGg6IGNvbmZpZ1dpbmRvdy53aWR0aCA/PyA1MDAsXHJcbiAgICAgICAgICAgIGhlaWdodDogY29uZmlnV2luZG93LmhlaWdodCA/PyAzMDksXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgYnJvd3NlclBvcG91dCA9IG5ldyBCcm93c2VyUG9wb3V0KGNvbmZpZywgaW5pdGlhbFdpbmRvdywgdGhpcyk7XHJcblxyXG4gICAgICAgIGJyb3dzZXJQb3BvdXQub24oJ2luaXRpYWxpc2VkJywgKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBsbSA9IGJyb3dzZXJQb3BvdXQuZ2V0R2xJbnN0YW5jZSgpO1xyXG5cclxuICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIHBvcG91dCB3aGVuIHRoZSBsYXN0IGNvbXBvbmVudCBpdGVtIGlzIGRlc3Ryb3llZC5cclxuICAgICAgICAgICAgY29uc3QgZGVzdHJveUlmRW1wdHkgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWxtLmlzRHJhZ2dpbmcgJiYgbG0uZ3JvdW5kSXRlbT8uZ2V0QWxsQ29tcG9uZW50SXRlbXMoKT8ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJvd3NlclBvcG91dC5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgbG0ub24oJ2l0ZW1Ecm9wcGVkJywgZGVzdHJveUlmRW1wdHkpO1xyXG4gICAgICAgICAgICBsbS5vbignaXRlbURlc3Ryb3llZCcsIGRlc3Ryb3lJZkVtcHR5KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnd2luZG93T3BlbmVkJywgYnJvd3NlclBvcG91dCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGJyb3dzZXJQb3BvdXQub24oJ2Nsb3NlZCcsICgpID0+IHRoaXMucmVjb25jaWxlUG9wb3V0V2luZG93cygpKTtcclxuXHJcbiAgICAgICAgdGhpcy5fb3BlblBvcG91dHMucHVzaChicm93c2VyUG9wb3V0KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubGF5b3V0Q29uZmlnLnNldHRpbmdzLmNsb3NlUG9wb3V0c09uVW5sb2FkICYmICF0aGlzLl93aW5kb3dCZWZvcmVVbmxvYWRMaXN0ZW5pbmcpIHtcclxuICAgICAgICAgICAgZ2xvYmFsVGhpcy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCB0aGlzLl93aW5kb3dCZWZvcmVVbmxvYWRMaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB0aGlzLl93aW5kb3dCZWZvcmVVbmxvYWRMaXN0ZW5pbmcgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGJyb3dzZXJQb3BvdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbG9zZXMgYWxsIE9wZW4gUG9wb3V0c1xyXG4gICAgICogQXBwbGljYXRpb25zIGNhbiBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gYSBwYWdlIGlzIHVubG9hZGVkIHRvIHJlbW92ZSBpdHMgb3BlbiBwb3BvdXRzXHJcbiAgICAgKi9cclxuXHJcbiAgICBjbG9zZUFsbE9wZW5Qb3BvdXRzKHByZXZlbnRQb3BJbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9vcGVuUG9wb3V0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICB0aGlzLl9vcGVuUG9wb3V0c1tpXS5jbG9zZShwcmV2ZW50UG9wSW4pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fb3BlblBvcG91dHMubGVuZ3RoID0gMDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3dpbmRvd0JlZm9yZVVubG9hZExpc3RlbmluZykge1xyXG4gICAgICAgICAgICBnbG9iYWxUaGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIHRoaXMuX3dpbmRvd0JlZm9yZVVubG9hZExpc3RlbmVyKTtcclxuICAgICAgICAgICAgdGhpcy5fd2luZG93QmVmb3JlVW5sb2FkTGlzdGVuaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXR0YWNoZXMgRHJhZ0xpc3RlbmVyIHRvIGFueSBnaXZlbiBET00gZWxlbWVudFxyXG4gICAgICogYW5kIHR1cm5zIGl0IGludG8gYSB3YXkgb2YgY3JlYXRpbmcgbmV3IENvbXBvbmVudEl0ZW1zXHJcbiAgICAgKiBieSAnZHJhZ2dpbmcnIHRoZSBET00gZWxlbWVudCBpbnRvIHRoZSBsYXlvdXRcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZWxlbWVudCAtIFRoZSBIVE1MIGVsZW1lbnQgd2hpY2ggd2lsbCBiZSBsaXN0ZW5lZCB0byBmb3IgY29tbWVuY2VtZW50IG9mIGRyYWcuXHJcbiAgICAgKiBAcGFyYW0gY29tcG9uZW50VHlwZU9ySXRlbUNvbmZpZ0NhbGxiYWNrIC0gVHlwZSBvZiBjb21wb25lbnQgdG8gYmUgY3JlYXRlZCwgb3IgYSBjYWxsYmFjayB3aGljaCB3aWxsIHByb3ZpZGUgdGhlIEl0ZW1Db25maWdcclxuICAgICAqIHRvIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBjb21wb25lbnQuXHJcbiAgICAgKiBAcGFyYW0gY29tcG9uZW50U3RhdGUgLSBPcHRpb25hbCBpbml0aWFsIHN0YXRlIG9mIGNvbXBvbmVudC4gIFRoaXMgd2lsbCBiZSBpZ25vcmVkIGlmIGNvbXBvbmVudFR5cGVPckZ0biBpcyBhIGZ1bmN0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIGFuIG9wYXF1ZSBvYmplY3QgdGhhdCBpZGVudGlmaWVzIHRoZSBET00gZWxlbWVudFxyXG5cdCAqICAgICAgICAgIGFuZCB0aGUgYXR0YWNoZWQgaXRlbUNvbmZpZy4gVGhpcyBjYW4gYmUgdXNlZCBpblxyXG5cdCAqICAgICAgICAgIHJlbW92ZURyYWdTb3VyY2UoKSBsYXRlciB0byBnZXQgcmlkIG9mIHRoZSBkcmFnIGxpc3RlbmVycy5cclxuICAgICAqL1xyXG4gICAgbmV3RHJhZ1NvdXJjZShlbGVtZW50OiBIVE1MRWxlbWVudCwgaXRlbUNvbmZpZ0NhbGxiYWNrOiAoKSA9PiAoRHJhZ1NvdXJjZS5Db21wb25lbnRJdGVtQ29uZmlnIHwgQ29tcG9uZW50SXRlbUNvbmZpZykpOiBEcmFnU291cmNlO1xyXG4gICAgLyoqIEBkZXByZWNhdGVkIHdpbGwgYmUgcmVwbGFjZWQgaW4gdmVyc2lvbiAzIHdpdGggbmV3RHJhZ1NvdXJjZShlbGVtZW50OiBIVE1MRWxlbWVudCwgaXRlbUNvbmZpZzogQ29tcG9uZW50SXRlbUNvbmZpZykgKi9cclxuICAgIG5ld0RyYWdTb3VyY2UoZWxlbWVudDogSFRNTEVsZW1lbnQsIGNvbXBvbmVudFR5cGU6IEpzb25WYWx1ZSwgY29tcG9uZW50U3RhdGU/OiBKc29uVmFsdWUsIHRpdGxlPzogSnNvblZhbHVlLCBpZD86IHN0cmluZyk6IERyYWdTb3VyY2U7XHJcbiAgICBuZXdEcmFnU291cmNlKGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxyXG4gICAgICAgIGNvbXBvbmVudFR5cGVPckl0ZW1Db25maWdDYWxsYmFjazogSnNvblZhbHVlIHwgKCgpID0+IChEcmFnU291cmNlLkNvbXBvbmVudEl0ZW1Db25maWcgfCBDb21wb25lbnRJdGVtQ29uZmlnKSksXHJcbiAgICAgICAgY29tcG9uZW50U3RhdGU/OiBKc29uVmFsdWUsXHJcbiAgICAgICAgdGl0bGU/OiBzdHJpbmcsXHJcbiAgICAgICAgaWQ/OiBzdHJpbmcsXHJcbiAgICApOiBEcmFnU291cmNlIHtcclxuICAgICAgICBjb25zdCBkcmFnU291cmNlID0gbmV3IERyYWdTb3VyY2UodGhpcywgZWxlbWVudCwgW10sIGNvbXBvbmVudFR5cGVPckl0ZW1Db25maWdDYWxsYmFjaywgY29tcG9uZW50U3RhdGUsIHRpdGxlLCBpZCk7XHJcbiAgICAgICAgdGhpcy5fZHJhZ1NvdXJjZXMucHVzaChkcmFnU291cmNlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGRyYWdTb3VyY2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcblx0ICogUmVtb3ZlcyBhIERyYWdMaXN0ZW5lciBhZGRlZCBieSBjcmVhdGVEcmFnU291cmNlKCkgc28gdGhlIGNvcnJlc3BvbmRpbmdcclxuXHQgKiBET00gZWxlbWVudCBpcyBub3QgYSBkcmFnIHNvdXJjZSBhbnkgbW9yZS5cclxuXHQgKi9cclxuXHRyZW1vdmVEcmFnU291cmNlKGRyYWdTb3VyY2U6IERyYWdTb3VyY2UpOiB2b2lkIHtcclxuXHRcdHJlbW92ZUZyb21BcnJheShkcmFnU291cmNlLCB0aGlzLl9kcmFnU291cmNlcyApO1xyXG5cdFx0ZHJhZ1NvdXJjZS5kZXN0cm95KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBzdGFydEV4dGVybmFsQ29tcG9uZW50RHJhZyhwYXJlbnQ6IERyYWdBY3Rpb24pIHtcclxuICAgICAgICBEcmFnQWN0aW9uLnNwYXduKHRoaXMsIHBhcmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgc3RhcnRDb21wb25lbnREcmFnKHg6IG51bWJlciwgeTogbnVtYmVyLCBkcmFnTGlzdGVuZXI6IERyYWdMaXN0ZW5lciwgY29tcG9uZW50SXRlbTogQ29tcG9uZW50SXRlbSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGlzTGFzdCA9IGNvbXBvbmVudEl0ZW0uZmluZEFuY2VzdG9yV2l0aFNpYmxpbmdzKCkgPT09IG51bGw7XHJcblxyXG4gICAgICAgIGNvbnN0IGFsbG93UG9wb3V0ID1cclxuICAgICAgICAgICAgdGhpcy5sYXlvdXRDb25maWcuc2V0dGluZ3MuZHJhZ1RvTmV3V2luZG93ICYmXHJcbiAgICAgICAgICAgICh0aGlzLnBhcmVudCA9PT0gbnVsbCB8fCAhaXNMYXN0KTsgICAgICAgICAgICAgICAgICAvLyBQb3BvdXQgaXMgZGVzdHJveWVkIHdoZW4gbGFzdCBjb21wb25lbnQgaXMgcmVtb3ZlZCwgZHJhZyB0byBuZXcgcG9wb3V0IG1ha2VzIG5vIHNlbnNlXHJcblxyXG4gICAgICAgIGNvbnN0IGNhbk1vdmVCZXR3ZWVuV2luZG93cyA9XHJcbiAgICAgICAgICAgIHRoaXMubGF5b3V0Q29uZmlnLnNldHRpbmdzLmRyYWdCZXR3ZWVuV2luZG93cyAmJlxyXG4gICAgICAgICAgICAodGhpcy5fcGFyZW50ID8/IHRoaXMpLl9vcGVuUG9wb3V0cy5sZW5ndGggPiAwOyAgICAgLy8gQXJlIHRoZXJlIGV2ZW4gbXVsdGlwbGUgd2luZG93cz9cclxuXHJcbiAgICAgICAgLy8gQ2FuY2VsIHRoZSBkcmFnIGlmIHRoaXMgaXMgdGhlIGxhc3QgY29tcG9uZW50IGFuZCB0aGVyZSBhcmUgbm8gdmFsaWQgZXh0ZXJuYWwgdGFyZ2V0cy5cclxuICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIG9ubHkgdGhlIGN1cnJlbnQgbGF5b3V0IGNvbmZpZ3VyYXRpb24gaXMgcG9zc2libGUsIHNvIHRoZXJlIGlzIG5vIHBvaW50IGluIGRyYWdnaW5nLlxyXG4gICAgICAgIGlmIChpc0xhc3QgJiYgIWFsbG93UG9wb3V0ICYmICFjYW5Nb3ZlQmV0d2VlbldpbmRvd3MpIHtcclxuICAgICAgICAgICAgZHJhZ0xpc3RlbmVyLmNhbmNlbERyYWcoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgYWN0aW9uID0gRHJhZ0FjdGlvbi5zdGFydCh0aGlzLCBkcmFnTGlzdGVuZXIsIGNvbXBvbmVudEl0ZW0sIHgsIHksIGFsbG93UG9wb3V0KTtcclxuXHJcbiAgICAgICAgaWYgKGNhbk1vdmVCZXR3ZWVuV2luZG93cykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBsbSBvZiB0aGlzLmluc3RhbmNlcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGxtICE9PSB0aGlzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG0uc3RhcnRFeHRlcm5hbENvbXBvbmVudERyYWcoYWN0aW9uKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBoaWRlRHJvcFRhcmdldEluZGljYXRvcigpIHtcclxuICAgICAgICB0aGlzLnRhYkRyb3BQbGFjZWhvbGRlci5yZW1vdmUoKTtcclxuICAgICAgICB0aGlzLmRyb3BUYXJnZXRJbmRpY2F0b3I/LmhpZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb2dyYW1tYXRpY2FsbHkgZm9jdXNlcyBhbiBpdGVtLiBUaGlzIGZvY3VzZXMgdGhlIHNwZWNpZmllZCBjb21wb25lbnQgaXRlbVxyXG4gICAgICogYW5kIHRoZSBpdGVtIGVtaXRzIGEgZm9jdXMgZXZlbnRcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaXRlbSAtIFRoZSBjb21wb25lbnQgaXRlbSB0byBiZSBmb2N1c2VkXHJcbiAgICAgKiBAcGFyYW0gc3VwcHJlc3NFdmVudCAtIFdoZXRoZXIgdG8gZW1pdCBmb2N1cyBldmVudFxyXG4gICAgICovXHJcbiAgICBmb2N1c0NvbXBvbmVudChpdGVtOiBDb21wb25lbnRJdGVtLCBzdXBwcmVzc0V2ZW50ID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICBpdGVtLmZvY3VzKHN1cHByZXNzRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvZ3JhbW1hdGljYWxseSBibHVycyAoZGVmb2N1c2VzKSB0aGUgY3VycmVudGx5IGZvY3VzZWQgY29tcG9uZW50LlxyXG4gICAgICogSWYgYSBjb21wb25lbnQgaXRlbSBpcyBmb2N1c2VkLCB0aGVuIGl0IGlzIGJsdXJyZWQgYW5kIGFuZCB0aGUgaXRlbSBlbWl0cyBhIGJsdXIgZXZlbnRcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaXRlbSAtIFRoZSBjb21wb25lbnQgaXRlbSB0byBiZSBibHVycmVkXHJcbiAgICAgKiBAcGFyYW0gc3VwcHJlc3NFdmVudCAtIFdoZXRoZXIgdG8gZW1pdCBibHVyIGV2ZW50XHJcbiAgICAgKi9cclxuICAgIGNsZWFyQ29tcG9uZW50Rm9jdXMoc3VwcHJlc3NFdmVudCA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXRGb2N1c2VkQ29tcG9uZW50SXRlbSh1bmRlZmluZWQsIHN1cHByZXNzRXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvZ3JhbW1hdGljYWxseSBmb2N1c2VzIGEgY29tcG9uZW50IGl0ZW0gb3IgcmVtb3ZlcyBmb2N1cyAoYmx1cnMpIGZyb20gYW4gZXhpc3RpbmcgZm9jdXNlZCBjb21wb25lbnQgaXRlbS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gaXRlbSAtIElmIGRlZmluZWQsIHNwZWNpZmllcyB0aGUgY29tcG9uZW50IGl0ZW0gdG8gYmUgZ2l2ZW4gZm9jdXMuICBJZiB1bmRlZmluZWQsIGNsZWFyIGNvbXBvbmVudCBmb2N1cy5cclxuICAgICAqIEBwYXJhbSBzdXBwcmVzc0V2ZW50cyAtIFdoZXRoZXIgdG8gZW1pdCBmb2N1cyBhbmQgYmx1ciBldmVudHNcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBzZXRGb2N1c2VkQ29tcG9uZW50SXRlbShpdGVtOiBDb21wb25lbnRJdGVtIHwgdW5kZWZpbmVkLCBzdXBwcmVzc0V2ZW50cyA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGl0ZW0gIT09IHRoaXMuX2ZvY3VzZWRDb21wb25lbnRJdGVtKSB7XHJcblxyXG4gICAgICAgICAgICBsZXQgbmV3Rm9jdXNlZFBhcmVudEl0ZW06IENvbXBvbmVudFBhcmVudGFibGVJdGVtIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBuZXdGb2N1c2VkUGFyZW50SXRlbSA9PT0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbmV3Rm9jdXNlZFBhcmVudEl0ZW0gPSBpdGVtLnBhcmVudEl0ZW07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9mb2N1c2VkQ29tcG9uZW50SXRlbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvbGRGb2N1c2VkSXRlbSA9IHRoaXMuX2ZvY3VzZWRDb21wb25lbnRJdGVtO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNlZENvbXBvbmVudEl0ZW0gPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICBvbGRGb2N1c2VkSXRlbS5zZXRCbHVycmVkKHN1cHByZXNzRXZlbnRzKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9sZEZvY3VzZWRQYXJlbnRJdGVtID0gb2xkRm9jdXNlZEl0ZW0ucGFyZW50SXRlbTtcclxuICAgICAgICAgICAgICAgIGlmIChuZXdGb2N1c2VkUGFyZW50SXRlbSA9PT0gb2xkRm9jdXNlZFBhcmVudEl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXdGb2N1c2VkUGFyZW50SXRlbSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2xkRm9jdXNlZFBhcmVudEl0ZW0uc2V0Rm9jdXNlZFZhbHVlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGl0ZW0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNlZENvbXBvbmVudEl0ZW0gPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgaXRlbS5zZXRGb2N1c2VkKHN1cHByZXNzRXZlbnRzKTtcclxuICAgICAgICAgICAgICAgIGlmIChuZXdGb2N1c2VkUGFyZW50SXRlbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3Rm9jdXNlZFBhcmVudEl0ZW0uc2V0Rm9jdXNlZFZhbHVlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlQ29udGVudEl0ZW1Gcm9tQ29uZmlnKGNvbmZpZzogUmVzb2x2ZWRJdGVtQ29uZmlnLCBwYXJlbnQ6IENvbnRlbnRJdGVtKTogQ29udGVudEl0ZW0ge1xyXG4gICAgICAgIHN3aXRjaCAoY29uZmlnLnR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5ncm91bmQ6IHRocm93IG5ldyBBc3NlcnRFcnJvcignTE1DQ0lGQzY4ODcxJyk7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUucm93OiByZXR1cm4gbmV3IFJvd09yQ29sdW1uKGZhbHNlLCB0aGlzLCBjb25maWcgYXMgUmVzb2x2ZWRSb3dPckNvbHVtbkl0ZW1Db25maWcsIHBhcmVudCk7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29sdW1uOiByZXR1cm4gbmV3IFJvd09yQ29sdW1uKHRydWUsIHRoaXMsIGNvbmZpZyBhcyBSZXNvbHZlZFJvd09yQ29sdW1uSXRlbUNvbmZpZywgcGFyZW50KTtcclxuICAgICAgICAgICAgY2FzZSBJdGVtVHlwZS5zdGFjazogcmV0dXJuIG5ldyBTdGFjayh0aGlzLCBjb25maWcgYXMgUmVzb2x2ZWRTdGFja0l0ZW1Db25maWcsIHBhcmVudCk7XHJcbiAgICAgICAgICAgIGNhc2UgSXRlbVR5cGUuY29tcG9uZW50OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRJdGVtKHRoaXMsIGNvbmZpZyBhcyBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcsIHBhcmVudCBhcyBTdGFjayk7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWFjaGFibGVDYXNlRXJyb3IoJ0NDQzkxMzU2NCcsIGNvbmZpZy50eXBlLCAnSW52YWxpZCBDb25maWcgSXRlbSB0eXBlIHNwZWNpZmllZCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gc3RhY2sgY29tcG9uZW50LlxyXG4gICAgICogU3RhY2sgd2lsbCBsb29rIGFmdGVyIGRvY2tpbmcgcHJvY2Vzc2luZyBhc3NvY2lhdGVkIHdpdGggbWF4aW1pc2UvbWluaW1pc2VcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICoqL1xyXG4gICAgc2V0TWF4aW1pc2VkU3RhY2soc3RhY2s6IFN0YWNrIHwgdW5kZWZpbmVkKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHN0YWNrID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX21heGltaXNlZFN0YWNrICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc01pbmltaXNlTWF4aW1pc2VkU3RhY2soKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChzdGFjayAhPT0gdGhpcy5fbWF4aW1pc2VkU3RhY2spIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXhpbWlzZWRTdGFjayAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzTWluaW1pc2VNYXhpbWlzZWRTdGFjaygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc01heGltaXNlU3RhY2soc3RhY2spO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrTWluaW1pc2VNYXhpbWlzZWRTdGFjaygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fbWF4aW1pc2VkU3RhY2sgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9tYXhpbWlzZWRTdGFjay5taW5pbWlzZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBzaG93QWxsQWN0aXZlQ29udGVudEl0ZW1zKCkgd2FzIGNhbGxlZCBmcm9tIENvbnRlbnRJdGVtLnNob3coKS4gIE5vdCBzdXJlIHdoYXQgaXRzIHB1cnBvc2Ugd2FzIHNvIGhhdmUgY29tbWVudGVkIG91dFxyXG4gICAgLy8gRXZlcnl0aGluZyBzZWVtcyB0byB3b3JrIG9rIHdpdGhvdXQgdGhpcy4gIEhhdmUgbGVmdCBjb21tZW50ZWQgY29kZSBqdXN0IGluIGNhc2UgdGhlcmUgd2FzIGEgcmVhc29uIGZvciBpdCBiZWNvbWVzXHJcbiAgICAvLyBhcHBhcmVudFxyXG5cclxuICAgIC8vIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIC8vIHNob3dBbGxBY3RpdmVDb250ZW50SXRlbXMoKTogdm9pZCB7XHJcbiAgICAvLyAgICAgY29uc3QgYWxsU3RhY2tzID0gdGhpcy5nZXRBbGxTdGFja3MoKTtcclxuXHJcbiAgICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxTdGFja3MubGVuZ3RoOyBpKyspIHtcclxuICAgIC8vICAgICAgICAgY29uc3Qgc3RhY2sgPSBhbGxTdGFja3NbaV07XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGFjdGl2ZUNvbnRlbnRJdGVtID0gc3RhY2suZ2V0QWN0aXZlQ29tcG9uZW50SXRlbSgpO1xyXG5cclxuICAgIC8vICAgICAgICAgaWYgKGFjdGl2ZUNvbnRlbnRJdGVtICE9PSB1bmRlZmluZWQpIHtcclxuICAgIC8vICAgICAgICAgICAgIGlmICghKGFjdGl2ZUNvbnRlbnRJdGVtIGluc3RhbmNlb2YgQ29tcG9uZW50SXRlbSkpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNU0FBQ0lTMjIyOTgnKTtcclxuICAgIC8vICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgYWN0aXZlQ29udGVudEl0ZW0uY29udGFpbmVyLnNob3coKTtcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBoaWRlQWxsQWN0aXZlQ29udGVudEl0ZW1zKCkgd2FzIGNhbGxlZCBmcm9tIENvbnRlbnRJdGVtLmhpZGUoKS4gIE5vdCBzdXJlIHdoYXQgaXRzIHB1cnBvc2Ugd2FzIHNvIGhhdmUgY29tbWVudGVkIG91dFxyXG4gICAgLy8gRXZlcnl0aGluZyBzZWVtcyB0byB3b3JrIG9rIHdpdGhvdXQgdGhpcy4gIEhhdmUgbGVmdCBjb21tZW50ZWQgY29kZSBqdXN0IGluIGNhc2UgdGhlcmUgd2FzIGEgcmVhc29uIGZvciBpdCBiZWNvbWVzXHJcbiAgICAvLyBhcHBhcmVudFxyXG5cclxuICAgIC8vIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIC8vIGhpZGVBbGxBY3RpdmVDb250ZW50SXRlbXMoKTogdm9pZCB7XHJcbiAgICAvLyAgICAgY29uc3QgYWxsU3RhY2tzID0gdGhpcy5nZXRBbGxTdGFja3MoKTtcclxuXHJcbiAgICAvLyAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxTdGFja3MubGVuZ3RoOyBpKyspIHtcclxuICAgIC8vICAgICAgICAgY29uc3Qgc3RhY2sgPSBhbGxTdGFja3NbaV07XHJcbiAgICAvLyAgICAgICAgIGNvbnN0IGFjdGl2ZUNvbnRlbnRJdGVtID0gc3RhY2suZ2V0QWN0aXZlQ29tcG9uZW50SXRlbSgpO1xyXG5cclxuICAgIC8vICAgICAgICAgaWYgKGFjdGl2ZUNvbnRlbnRJdGVtICE9PSB1bmRlZmluZWQpIHtcclxuICAgIC8vICAgICAgICAgICAgIGlmICghKGFjdGl2ZUNvbnRlbnRJdGVtIGluc3RhbmNlb2YgQ29tcG9uZW50SXRlbSkpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNU0FBQ0lIMjIyOTgnKTtcclxuICAgIC8vICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgYWN0aXZlQ29udGVudEl0ZW0uY29udGFpbmVyLmhpZGUoKTtcclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGNsZWFudXBCZWZvcmVNYXhpbWlzZWRTdGFja0Rlc3Ryb3llZChldmVudDogRXZlbnRFbWl0dGVyLkJ1YmJsaW5nRXZlbnQpIHtcclxuXHRcdGlmICh0aGlzLl9tYXhpbWlzZWRTdGFjayAhPT0gbnVsbCAmJiB0aGlzLl9tYXhpbWlzZWRTdGFjayA9PT0gZXZlbnQudGFyZ2V0KSB7XHJcblx0XHRcdHRoaXMuX21heGltaXNlZFN0YWNrLm9mZignYmVmb3JlSXRlbURlc3Ryb3llZCcsIHRoaXMuX21heGltaXNlZFN0YWNrQmVmb3JlRGVzdHJveWVkTGlzdGVuZXIpO1xyXG5cdFx0XHR0aGlzLl9tYXhpbWlzZWRTdGFjayA9IHVuZGVmaW5lZDtcclxuXHRcdH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IGFyb3VuZCBzYW5kYm94ZWQgaWZyYW1lIHJlc3RyaWN0aW9ucy5cclxuICAgICAqIElmICdhbGxvdy10b3AtbmF2aWdhdGlvbicgaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgaWZyYW1lJ3MgJ3NhbmRib3gnIGF0dHJpYnV0ZVxyXG4gICAgICogKGFzIGlzIHRoZSBjYXNlIHdpdGggY29kZXBlbnMpIHRoZSBwYXJlbnQgd2luZG93IGlzIGZvcmJpZGRlbiBmcm9tIGNhbGxpbmcgY2VydGFpblxyXG4gICAgICogbWV0aG9kcyBvbiB0aGUgY2hpbGQsIHN1Y2ggYXMgd2luZG93LmNsb3NlKCkgb3Igc2V0dGluZyBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgcHJldmVudGVkIEdvbGRlbkxheW91dCBwb3BvdXRzIGZyb20gcG9wcGluZyBpbiBpbiBjb2RlcGVucy4gVGhlIGZpeCBpcyB0byBjYWxsXHJcbiAgICAgKiBfJGNsb3NlV2luZG93IG9uIHRoZSBjaGlsZCB3aW5kb3cncyBnbCBpbnN0YW5jZSB3aGljaCAoYWZ0ZXIgYSB0aW1lb3V0IHRvIGRpc2Nvbm5lY3RcclxuICAgICAqIHRoZSBpbnZva2luZyBtZXRob2QgZnJvbSB0aGUgY2xvc2UgY2FsbCkgY2xvc2VzIGl0c2VsZi5cclxuICAgICAqXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgY2xvc2VXaW5kb3coKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsVGhpcy5zZXRUaW1lb3V0KCgpID0+IGdsb2JhbFRoaXMuY2xvc2UoKSwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZ2V0QXJlYSh4OiBudW1iZXIsIHk6IG51bWJlcik6IENvbnRlbnRJdGVtLkFyZWEgfCBudWxsIHtcclxuICAgICAgICBsZXQgbWF0Y2hpbmdBcmVhOiBDb250ZW50SXRlbS5BcmVhIHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgbGV0IHNtYWxsZXN0U3VyZmFjZSA9IEluZmluaXR5O1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2l0ZW1BcmVhcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBhcmVhID0gdGhpcy5faXRlbUFyZWFzW2ldO1xyXG5cclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgeCA+PSBhcmVhLngxICYmXHJcbiAgICAgICAgICAgICAgICB4IDwgYXJlYS54MiAmJiAvLyB4MiBpcyBub3QgaW5jbHVkZWQgaW4gYXJlYVxyXG4gICAgICAgICAgICAgICAgeSA+PSBhcmVhLnkxICYmXHJcbiAgICAgICAgICAgICAgICB5IDwgYXJlYS55MiAmJiAvLyB5MiBpcyBub3QgaW5jbHVkZWQgaW4gYXJlYVxyXG4gICAgICAgICAgICAgICAgc21hbGxlc3RTdXJmYWNlID4gYXJlYS5zdXJmYWNlXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgc21hbGxlc3RTdXJmYWNlID0gYXJlYS5zdXJmYWNlO1xyXG4gICAgICAgICAgICAgICAgbWF0Y2hpbmdBcmVhID0gYXJlYTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG1hdGNoaW5nQXJlYTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBjYWxjdWxhdGVJdGVtQXJlYXMoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgYWxsQ29udGVudEl0ZW1zID0gdGhpcy5nZXRBbGxDb250ZW50SXRlbXMoKTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiB0aGUgbGFzdCBpdGVtIGlzIGRyYWdnZWQgb3V0LCBoaWdobGlnaHQgdGhlIGVudGlyZSBjb250YWluZXIgc2l6ZSB0b1xyXG4gICAgICAgICAqIGFsbG93IHRvIHJlLWRyb3AgaXQuIHRoaXMuZ3JvdW5kLmNvbnRlbnRpSXRlbXMubGVuZ3RoID09PSAwIGF0IHRoaXMgcG9pbnRcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqIERvbid0IGluY2x1ZGUgZ3JvdW5kIGludG8gdGhlIHBvc3NpYmxlIGRyb3AgYXJlYXMgdGhvdWdoIG90aGVyd2lzZSBzaW5jZSBpdFxyXG4gICAgICAgICAqIHdpbGwgdXNlZCBmb3IgZXZlcnkgZ2FwIGluIHRoZSBsYXlvdXQsIGUuZy4gc3BsaXR0ZXJzXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3QgZ3JvdW5kSXRlbSA9IHRoaXMuX2dyb3VuZEl0ZW07XHJcbiAgICAgICAgaWYgKGdyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTUNJQVI0NDM2NScpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChhbGxDb250ZW50SXRlbXMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBObyByb290IENvbnRlbnRJdGVtIChqdXN0IEdyb3VuZCBDb250ZW50SXRlbSlcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VuZEFyZWEgPSBncm91bmRJdGVtLmdldEVsZW1lbnRBcmVhKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdW5kQXJlYSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdMTUNJQVJBNDQzNjUnKVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pdGVtQXJlYXMgPSBbZ3JvdW5kQXJlYV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdW5kSXRlbS5jb250ZW50SXRlbXNbMF0uaXNTdGFjaykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHJvb3QgaXMgU3RhY2ssIHRoZW4gc3BsaXQgc3RhY2sgYW5kIHNpZGVzIG9mIExheW91dCBhcmUgc2FtZSwgc28gc2tpcCBzaWRlc1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2l0ZW1BcmVhcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBzaWRlcyBvZiBsYXlvdXRcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pdGVtQXJlYXMgPSBncm91bmRJdGVtLmNyZWF0ZVNpZGVBcmVhcygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsQ29udGVudEl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSBhbGxDb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKENvbnRlbnRJdGVtLmlzU3RhY2soc3RhY2spKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZWEgPSBzdGFjay5nZXRBcmVhKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJlYSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pdGVtQXJlYXMucHVzaChhcmVhKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrQ29udGVudEFyZWFEaW1lbnNpb25zID0gc3RhY2suY29udGVudEFyZWFEaW1lbnNpb25zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrQ29udGVudEFyZWFEaW1lbnNpb25zID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTUNJQVNDNDU1OTknKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlnaGxpZ2h0QXJlYSA9IHN0YWNrQ29udGVudEFyZWFEaW1lbnNpb25zLmhlYWRlci5oaWdobGlnaHRBcmVhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VyZmFjZSA9IChoaWdobGlnaHRBcmVhLngyIC0gaGlnaGxpZ2h0QXJlYS54MSkgKiAoaGlnaGxpZ2h0QXJlYS55MiAtIGhpZ2hsaWdodEFyZWEueTEpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXI6IENvbnRlbnRJdGVtLkFyZWEgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxOiBoaWdobGlnaHRBcmVhLngxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MjogaGlnaGxpZ2h0QXJlYS54MixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTE6IGhpZ2hsaWdodEFyZWEueTEsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkyOiBoaWdobGlnaHRBcmVhLnkyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50SXRlbTogc3RhY2ssXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pdGVtQXJlYXMucHVzaChoZWFkZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGVkIGFzIHBhcnQgb2YgbG9hZGluZyBhIG5ldyBsYXlvdXQgKGluY2x1ZGluZyBpbml0aWFsIGluaXQoKSkuXHJcbiAgICAgKiBDaGVja3MgdG8gc2VlIGxheW91dCBoYXMgYSBtYXhpbWlzZWQgaXRlbS4gSWYgc28sIGl0IG1heGltaXNlcyB0aGF0IGl0ZW0uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjaGVja0xvYWRlZExheW91dE1heGltaXNlSXRlbSgpIHtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0xNQ0xMTUk0MzQzMicpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZ01heGltaXNlZEl0ZW1zID0gdGhpcy5fZ3JvdW5kSXRlbS5nZXRDb25maWdNYXhpbWlzZWRJdGVtcygpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNvbmZpZ01heGltaXNlZEl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGxldCBpdGVtID0gY29uZmlnTWF4aW1pc2VkSXRlbXNbMF07XHJcbiAgICAgICAgICAgICAgICBpZiAoQ29udGVudEl0ZW0uaXNDb21wb25lbnRJdGVtKGl0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSBpdGVtLnBhcmVudDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2sgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsRXJyb3IoJ0xNWExMTUk2OTk5OScpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBzdGFjaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIUNvbnRlbnRJdGVtLmlzU3RhY2soaXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNQ0xMTUkxOTk5MycpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLm1heGltaXNlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBwcm9jZXNzTWF4aW1pc2VTdGFjayhzdGFjazogU3RhY2spOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9tYXhpbWlzZWRTdGFjayA9IHN0YWNrO1xyXG4gICAgICAgIHN0YWNrLm9uKCdiZWZvcmVJdGVtRGVzdHJveWVkJywgdGhpcy5fbWF4aW1pc2VkU3RhY2tCZWZvcmVEZXN0cm95ZWRMaXN0ZW5lcik7XHJcbiAgICAgICAgc3RhY2suZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuTWF4aW1pc2VkKTtcclxuICAgICAgICBzdGFjay5lbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCB0aGlzLl9tYXhpbWlzZVBsYWNlaG9sZGVyKTtcclxuICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0xNTVhJMTk5OTMnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9ncm91bmRJdGVtLmVsZW1lbnQucHJlcGVuZChzdGFjay5lbGVtZW50KTtcclxuICAgICAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBnZXRFbGVtZW50Q2xpZW50V2lkdGhBbmRIZWlnaHQodGhpcy5fY29udGFpbmVyRWxlbWVudCk7XHJcbiAgICAgICAgICAgIHNldEVsZW1lbnRXaWR0aChzdGFjay5lbGVtZW50LCB3aWR0aCk7XHJcbiAgICAgICAgICAgIHNldEVsZW1lbnRIZWlnaHQoc3RhY2suZWxlbWVudCwgaGVpZ2h0KTtcclxuICAgICAgICAgICAgc3RhY2sudXBkYXRlU2l6ZSh0cnVlKTtcclxuICAgICAgICAgICAgc3RhY2suZm9jdXNBY3RpdmVDb250ZW50SXRlbSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9tYXhpbWlzZWRTdGFjay5lbWl0KCdtYXhpbWlzZWQnKTtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdzdGF0ZUNoYW5nZWQnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBwcm9jZXNzTWluaW1pc2VNYXhpbWlzZWRTdGFjaygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5fbWF4aW1pc2VkU3RhY2sgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNTU1TNzQ0MjInKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBzdGFjayA9IHRoaXMuX21heGltaXNlZFN0YWNrO1xyXG4gICAgICAgICAgICBpZiAoc3RhY2sucGFyZW50ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxFcnJvcignTE1NSTEzNjY4Jyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzdGFjay5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5NYXhpbWlzZWQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4aW1pc2VQbGFjZWhvbGRlci5pbnNlcnRBZGphY2VudEVsZW1lbnQoJ2FmdGVyZW5kJywgc3RhY2suZWxlbWVudCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhpbWlzZVBsYWNlaG9sZGVyLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVSb290U2l6ZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21heGltaXNlZFN0YWNrID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgc3RhY2sub2ZmKCdiZWZvcmVJdGVtRGVzdHJveWVkJywgdGhpcy5fbWF4aW1pc2VkU3RhY2tCZWZvcmVEZXN0cm95ZWRMaXN0ZW5lcik7XHJcbiAgICAgICAgICAgICAgICBzdGFjay5lbWl0KCdtaW5pbWlzZWQnKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnc3RhdGVDaGFuZ2VkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJdGVyYXRlcyB0aHJvdWdoIHRoZSBhcnJheSBvZiBvcGVuIHBvcG91dCB3aW5kb3dzIGFuZCByZW1vdmVzIHRoZSBvbmVzXHJcbiAgICAgKiB0aGF0IGFyZSBlZmZlY3RpdmVseSBjbG9zZWQuIFRoaXMgaXMgbmVjZXNzYXJ5IGR1ZSB0byB0aGUgbGFjayBvZiByZWxpYWJseVxyXG4gICAgICogbGlzdGVuaW5nIGZvciB3aW5kb3cuY2xvc2UgLyB1bmxvYWQgZXZlbnRzIGluIGEgY3Jvc3MgYnJvd3NlciBjb21wYXRpYmxlIGZhc2hpb24uXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByZWNvbmNpbGVQb3BvdXRXaW5kb3dzKCkge1xyXG4gICAgICAgIGNvbnN0IG9wZW5Qb3BvdXRzOiBCcm93c2VyUG9wb3V0W10gPSBbXTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9vcGVuUG9wb3V0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fb3BlblBvcG91dHNbaV0uZ2V0V2luZG93KCkuY2xvc2VkID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgb3BlblBvcG91dHMucHVzaCh0aGlzLl9vcGVuUG9wb3V0c1tpXSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3dpbmRvd0Nsb3NlZCcsIHRoaXMuX29wZW5Qb3BvdXRzW2ldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX29wZW5Qb3BvdXRzLmxlbmd0aCAhPT0gb3BlblBvcG91dHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX29wZW5Qb3BvdXRzID0gb3BlblBvcG91dHM7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnc3RhdGVDaGFuZ2VkJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBmbGF0dGVuZWQgYXJyYXkgb2YgYWxsIGNvbnRlbnQgaXRlbXMsXHJcbiAgICAgKiByZWdhcmRsZXMgb2YgbGV2ZWwgb3IgdHlwZVxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0QWxsQ29udGVudEl0ZW1zKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1HQUNJMTMxMzAnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZ3JvdW5kSXRlbS5nZXRBbGxDb250ZW50SXRlbXMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIFN1YndpbmRvd3MgKGlmIHRoZXJlIGFyZSBhbnkpLiBUaHJvd3MgYW4gZXJyb3JcclxuICAgICAqIGlmIHBvcG91dHMgYXJlIGJsb2NrZWQuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVTdWJXaW5kb3dzKCkge1xyXG4gICAgICAgIGZvciAoY29uc3QgY29uZmlnIG9mIHRoaXMubGF5b3V0Q29uZmlnLm9wZW5Qb3BvdXRzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudENvbmZpZyA9IHRoaXMuc2F2ZUxheW91dCgpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgcG9wb3V0TGF5b3V0Q29uZmlnOiBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyA9IHtcclxuICAgICAgICAgICAgICAgIHJvb3Q6IGNvbmZpZy5yb290LFxyXG4gICAgICAgICAgICAgICAgb3BlblBvcG91dHM6IGNvbmZpZy5vcGVuUG9wb3V0cyxcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzOiBwYXJlbnRDb25maWcuc2V0dGluZ3MsXHJcbiAgICAgICAgICAgICAgICBkaW1lbnNpb25zOiBwYXJlbnRDb25maWcuZGltZW5zaW9ucyxcclxuICAgICAgICAgICAgICAgIGhlYWRlcjogcGFyZW50Q29uZmlnLmhlYWRlcixcclxuICAgICAgICAgICAgICAgIHdpbmRvdzogY29uZmlnLndpbmRvdyxcclxuICAgICAgICAgICAgICAgIHBhcmVudElkOiBjb25maWcucGFyZW50SWQsXHJcbiAgICAgICAgICAgICAgICBpbmRleEluUGFyZW50OiBjb25maWcuaW5kZXhJblBhcmVudCxcclxuICAgICAgICAgICAgICAgIHJlc29sdmVkOiB0cnVlLFxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVBvcG91dEZyb21Qb3BvdXRMYXlvdXRDb25maWcocG9wb3V0TGF5b3V0Q29uZmlnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWJvdW5jZXMgcmVzaXplIGV2ZW50c1xyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlQ29udGFpbmVyUmVzaXplKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnJlc2l6ZVdpdGhDb250YWluZXJBdXRvbWF0aWNhbGx5KSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1Jlc2l6ZVdpdGhEZWJvdW5jZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlYm91bmNlcyByZXNpemUgZXZlbnRzXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBwcm9jZXNzUmVzaXplV2l0aERlYm91bmNlKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnJlc2l6ZURlYm91bmNlRXh0ZW5kZWRXaGVuUG9zc2libGUpIHtcclxuICAgICAgICAgICAgdGhpcy5jaGVja0NsZWFyUmVzaXplVGltZW91dCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3Jlc2l6ZVRpbWVvdXRJZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Jlc2l6ZVRpbWVvdXRJZCA9IHNldFRpbWVvdXQoXHJcbiAgICAgICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVzaXplVGltZW91dElkID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYmVnaW5TaXplSW52YWxpZGF0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmRTaXplSW52YWxpZGF0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXNpemVEZWJvdW5jZUludGVydmFsLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNoZWNrQ2xlYXJSZXNpemVUaW1lb3V0KCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9yZXNpemVUaW1lb3V0SWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fcmVzaXplVGltZW91dElkKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVzaXplVGltZW91dElkID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERldGVybWluZXMgd2hhdCBlbGVtZW50IHRoZSBsYXlvdXQgd2lsbCBiZSBjcmVhdGVkIGluXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzZXRDb250YWluZXIoKSB7XHJcbiAgICAgICAgY29uc3QgYm9keUVsZW1lbnQgPSBkb2N1bWVudC5ib2R5O1xyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSB0aGlzLl9jb250YWluZXJFbGVtZW50ID8/IGJvZHlFbGVtZW50O1xyXG5cclxuICAgICAgICBpZiAoY29udGFpbmVyRWxlbWVudCA9PT0gYm9keUVsZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5yZXNpemVXaXRoQ29udGFpbmVyQXV0b21hdGljYWxseSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBkb2N1bWVudEVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGRvY3VtZW50RWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7XHJcbiAgICAgICAgICAgIGRvY3VtZW50RWxlbWVudC5zdHlsZS5tYXJnaW4gPSAnMCc7XHJcbiAgICAgICAgICAgIGRvY3VtZW50RWxlbWVudC5zdHlsZS5wYWRkaW5nID0gJzAnO1xyXG4gICAgICAgICAgICBkb2N1bWVudEVsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcclxuICAgICAgICAgICAgYm9keUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnO1xyXG4gICAgICAgICAgICBib2R5RWxlbWVudC5zdHlsZS5tYXJnaW4gPSAnMCc7XHJcbiAgICAgICAgICAgIGJvZHlFbGVtZW50LnN0eWxlLnBhZGRpbmcgPSAnMCc7XHJcbiAgICAgICAgICAgIGJvZHlFbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9jb250YWluZXJFbGVtZW50ID0gY29udGFpbmVyRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxlZCB3aGVuIHRoZSB3aW5kb3cgaXMgY2xvc2VkIG9yIHRoZSB1c2VyIG5hdmlnYXRlcyBhd2F5XHJcbiAgICAgKiBmcm9tIHRoZSBwYWdlXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqIEBkZXByZWNhdGVkIHRvIGJlIHJlbW92ZWQgaW4gdmVyc2lvbiAzXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25CZWZvcmVVbmxvYWQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5kZXN0cm95KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGp1c3RzIHRoZSBudW1iZXIgb2YgY29sdW1ucyB0byBiZSBsb3dlciB0byBmaXQgdGhlIHNjcmVlbiBhbmQgc3RpbGwgbWFpbnRhaW4gbWluSXRlbVdpZHRoLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYWRqdXN0Q29sdW1uc1Jlc3BvbnNpdmUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTUFDUjIwODgzJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZmlyc3RMb2FkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIG1pbiB3aWR0aCBzZXQsIG9yIG5vdCBjb250ZW50IGl0ZW1zLCBkbyBub3RoaW5nLlxyXG4gICAgICAgICAgICBpZiAodGhpcy51c2VSZXNwb25zaXZlTGF5b3V0KCkgJiZcclxuICAgICAgICAgICAgICAgICF0aGlzLl91cGRhdGluZ0NvbHVtbnNSZXNwb25zaXZlICYmXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ncm91bmRJdGVtLmNvbnRlbnRJdGVtcy5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9ncm91bmRJdGVtLmNvbnRlbnRJdGVtc1swXS5pc1JvdylcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCB8fCB0aGlzLl93aWR0aCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0xNQUNSNzc0MTInKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgb25seSBvbmUgY29sdW1uLCBkbyBub3RoaW5nLlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbkNvdW50ID0gdGhpcy5fZ3JvdW5kSXRlbS5jb250ZW50SXRlbXNbMF0uY29udGVudEl0ZW1zLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uQ291bnQgPD0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhleSBhbGwgc3RpbGwgZml0LCBkbyBub3RoaW5nLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtaW5JdGVtV2lkdGggPSB0aGlzLmxheW91dENvbmZpZy5kaW1lbnNpb25zLmRlZmF1bHRNaW5JdGVtV2lkdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvdGFsTWluV2lkdGggPSBjb2x1bW5Db3VudCAqIG1pbkl0ZW1XaWR0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvdGFsTWluV2lkdGggPD0gdGhpcy5fd2lkdGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgdXBkYXRlcyB3aGlsZSBpdCBpcyBhbHJlYWR5IGhhcHBlbmluZy5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nQ29sdW1uc1Jlc3BvbnNpdmUgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgaG93IG1hbnkgY29sdW1ucyB0byBzdGFjaywgYW5kIHB1dCB0aGVtIGFsbCBpbiB0aGUgZmlyc3Qgc3RhY2sgY29udGFpbmVyLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmluYWxDb2x1bW5Db3VudCA9IE1hdGgubWF4KE1hdGguZmxvb3IodGhpcy5fd2lkdGggLyBtaW5JdGVtV2lkdGgpLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrQ29sdW1uQ291bnQgPSBjb2x1bW5Db3VudCAtIGZpbmFsQ29sdW1uQ291bnQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm9vdENvbnRlbnRJdGVtID0gdGhpcy5fZ3JvdW5kSXRlbS5jb250ZW50SXRlbXNbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxTdGFja3MgPSB0aGlzLmdldEFsbFN0YWNrcygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsbFN0YWNrcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0RXJyb3IoJ0xNQUNSUzc3NDEzJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3RTdGFja0NvbnRhaW5lciA9IGFsbFN0YWNrc1swXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YWNrQ29sdW1uQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFjayBmcm9tIHJpZ2h0LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW4gPSByb290Q29udGVudEl0ZW0uY29udGVudEl0ZW1zW3Jvb3RDb250ZW50SXRlbS5jb250ZW50SXRlbXMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ2hpbGRDb250ZW50SXRlbXNUb0NvbnRhaW5lcihmaXJzdFN0YWNrQ29udGFpbmVyLCBjb2x1bW4pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdDb2x1bW5zUmVzcG9uc2l2ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGV0ZXJtaW5lcyBpZiByZXNwb25zaXZlIGxheW91dCBzaG91bGQgYmUgdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBUcnVlIGlmIHJlc3BvbnNpdmUgbGF5b3V0IHNob3VsZCBiZSB1c2VkOyBvdGhlcndpc2UgZmFsc2UuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB1c2VSZXNwb25zaXZlTGF5b3V0KCkge1xyXG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5sYXlvdXRDb25maWcuc2V0dGluZ3M7XHJcbiAgICAgICAgY29uc3QgYWx3YXlzUmVzcG9uc2l2ZU1vZGUgPSBzZXR0aW5ncy5yZXNwb25zaXZlTW9kZSA9PT0gUmVzcG9uc2l2ZU1vZGUuYWx3YXlzO1xyXG4gICAgICAgIGNvbnN0IG9uTG9hZFJlc3BvbnNpdmVNb2RlQW5kRmlyc3QgPSBzZXR0aW5ncy5yZXNwb25zaXZlTW9kZSA9PT0gUmVzcG9uc2l2ZU1vZGUub25sb2FkICYmIHRoaXMuX2ZpcnN0TG9hZDtcclxuICAgICAgICByZXR1cm4gYWx3YXlzUmVzcG9uc2l2ZU1vZGUgfHwgb25Mb2FkUmVzcG9uc2l2ZU1vZGVBbmRGaXJzdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYWxsIGNoaWxkcmVuIG9mIGEgbm9kZSB0byBhbm90aGVyIGNvbnRhaW5lciByZWN1cnNpdmVseS5cclxuICAgICAqIEBwYXJhbSBjb250YWluZXIgLSBDb250YWluZXIgdG8gYWRkIGNoaWxkIGNvbnRlbnQgaXRlbXMgdG8uXHJcbiAgICAgKiBAcGFyYW0gbm9kZSAtIE5vZGUgdG8gc2VhcmNoIGZvciBjb250ZW50IGl0ZW1zLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYWRkQ2hpbGRDb250ZW50SXRlbXNUb0NvbnRhaW5lcihjb250YWluZXI6IENvbnRlbnRJdGVtLCBub2RlOiBDb250ZW50SXRlbSkge1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtcyA9IG5vZGUuY29udGVudEl0ZW1zO1xyXG4gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgU3RhY2spIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICBub2RlLnJlbW92ZUNoaWxkKGl0ZW0sIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmFkZENoaWxkKGl0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZENoaWxkQ29udGVudEl0ZW1zVG9Db250YWluZXIoY29udGFpbmVyLCBpdGVtKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbmRzIGFsbCB0aGUgc3RhY2tzLlxyXG4gICAgICogQHJldHVybnMgVGhlIGZvdW5kIHN0YWNrIGNvbnRhaW5lcnMuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRBbGxTdGFja3MoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdMTUZBU0M1Mjc3OCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YWNrczogU3RhY2tbXSA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLmZpbmRBbGxTdGFja3NSZWN1cnNpdmUoc3RhY2tzLCB0aGlzLl9ncm91bmRJdGVtKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBzdGFja3M7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgZmluZEZpcnN0Q29udGVudEl0ZW1UeXBlKHR5cGU6IEl0ZW1UeXBlKTogQ29udGVudEl0ZW0gfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9ncm91bmRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1GRkNJVDgyNDQ2Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmluZEZpcnN0Q29udGVudEl0ZW1UeXBlUmVjdXJzaXZlKHR5cGUsIHRoaXMuX2dyb3VuZEl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGZpbmRGaXJzdENvbnRlbnRJdGVtVHlwZVJlY3Vyc2l2ZSh0eXBlOiBJdGVtVHlwZSwgbm9kZTogQ29udGVudEl0ZW0pOiBDb250ZW50SXRlbSB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgY29uc3QgY29udGVudEl0ZW1zID0gbm9kZS5jb250ZW50SXRlbXM7XHJcbiAgICAgICAgY29uc3QgY29udGVudEl0ZW1Db3VudCA9IGNvbnRlbnRJdGVtcy5sZW5ndGg7XHJcbiAgICAgICAgaWYgKGNvbnRlbnRJdGVtQ291bnQgPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnRJdGVtQ291bnQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY29udGVudEl0ZW0gPSBjb250ZW50SXRlbXNbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udGVudEl0ZW0udHlwZSA9PT0gdHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZW50SXRlbTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50SXRlbUNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZm91bmRDb250ZW50SXRlbSA9IHRoaXMuZmluZEZpcnN0Q29udGVudEl0ZW1UeXBlUmVjdXJzaXZlKHR5cGUsIGNvbnRlbnRJdGVtKTtcclxuICAgICAgICAgICAgICAgIGlmIChmb3VuZENvbnRlbnRJdGVtICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm91bmRDb250ZW50SXRlbTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBmaW5kRmlyc3RDb250ZW50SXRlbVR5cGVCeUlkUmVjdXJzaXZlKHR5cGU6IEl0ZW1UeXBlLCBpZDogc3RyaW5nLCBub2RlOiBDb250ZW50SXRlbSk6IENvbnRlbnRJdGVtIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBjb25zdCBjb250ZW50SXRlbXMgPSBub2RlLmNvbnRlbnRJdGVtcztcclxuICAgICAgICBjb25zdCBjb250ZW50SXRlbUNvdW50ID0gY29udGVudEl0ZW1zLmxlbmd0aDtcclxuICAgICAgICBpZiAoY29udGVudEl0ZW1Db3VudCA9PT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudEl0ZW1Db3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50SXRlbSA9IGNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgIGlmIChjb250ZW50SXRlbS50eXBlID09PSB0eXBlICYmIGNvbnRlbnRJdGVtLmlkID09PSBpZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZW50SXRlbTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50SXRlbUNvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRJdGVtID0gY29udGVudEl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZm91bmRDb250ZW50SXRlbSA9IHRoaXMuZmluZEZpcnN0Q29udGVudEl0ZW1UeXBlQnlJZFJlY3Vyc2l2ZSh0eXBlLCBpZCwgY29udGVudEl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kQ29udGVudEl0ZW0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZENvbnRlbnRJdGVtO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbmRzIGFsbCB0aGUgc3RhY2sgY29udGFpbmVycy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gc3RhY2tzIC0gU2V0IG9mIGNvbnRhaW5lcnMgdG8gcG9wdWxhdGUuXHJcbiAgICAgKiBAcGFyYW0gbm9kZSAtIEN1cnJlbnQgbm9kZSB0byBwcm9jZXNzLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZmluZEFsbFN0YWNrc1JlY3Vyc2l2ZShzdGFja3M6IFN0YWNrW10sIG5vZGU6IENvbnRlbnRJdGVtKSB7XHJcbiAgICAgICAgY29uc3QgY29udGVudEl0ZW1zID0gbm9kZS5jb250ZW50SXRlbXM7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IGNvbnRlbnRJdGVtc1tpXTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBTdGFjaykge1xyXG4gICAgICAgICAgICAgICAgc3RhY2tzLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWl0ZW0uaXNDb21wb25lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRBbGxTdGFja3NSZWN1cnNpdmUoc3RhY2tzLCBpdGVtKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGZpbmRGaXJzdExvY2F0aW9uKHNlbGVjdG9yczogcmVhZG9ubHkgTGF5b3V0TWFuYWdlci5Mb2NhdGlvblNlbGVjdG9yW10pOiBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBjb25zdCBjb3VudCA9IHNlbGVjdG9ycy5sZW5ndGg7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gc2VsZWN0b3JzW2ldO1xyXG4gICAgICAgICAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMuZmluZExvY2F0aW9uKHNlbGVjdG9yKTtcclxuICAgICAgICAgICAgaWYgKGxvY2F0aW9uICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgZmluZExvY2F0aW9uKHNlbGVjdG9yOiBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uU2VsZWN0b3IpOiBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBjb25zdCBzZWxlY3RvckluZGV4ID0gc2VsZWN0b3IuaW5kZXg7XHJcbiAgICAgICAgc3dpdGNoIChzZWxlY3Rvci50eXBlSWQpIHtcclxuICAgICAgICAgICAgY2FzZSBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uU2VsZWN0b3IuVHlwZUlkLkZvY3VzZWRJdGVtOiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZm9jdXNlZENvbXBvbmVudEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50SXRlbSA9IHRoaXMuX2ZvY3VzZWRDb21wb25lbnRJdGVtLnBhcmVudEl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50Q29udGVudEl0ZW1zID0gcGFyZW50SXRlbS5jb250ZW50SXRlbXM7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50Q29udGVudEl0ZW1Db3VudCA9IHBhcmVudENvbnRlbnRJdGVtcy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9ySW5kZXggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBwYXJlbnRJdGVtLCBpbmRleDogcGFyZW50Q29udGVudEl0ZW1Db3VudCB9O1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvY3VzZWRJbmRleCA9IHBhcmVudENvbnRlbnRJdGVtcy5pbmRleE9mKHRoaXMuX2ZvY3VzZWRDb21wb25lbnRJdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBmb2N1c2VkSW5kZXggKyBzZWxlY3RvckluZGV4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gcGFyZW50Q29udGVudEl0ZW1Db3VudCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHBhcmVudEl0ZW0sIGluZGV4IH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uU2VsZWN0b3IuVHlwZUlkLkZvY3VzZWRTdGFjazoge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2ZvY3VzZWRDb21wb25lbnRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudEl0ZW0gPSB0aGlzLl9mb2N1c2VkQ29tcG9uZW50SXRlbS5wYXJlbnRJdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyeUNyZWF0ZUxvY2F0aW9uRnJvbVBhcmVudEl0ZW0ocGFyZW50SXRlbSwgc2VsZWN0b3JJbmRleCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uU2VsZWN0b3IuVHlwZUlkLkZpcnN0U3RhY2s6IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudEl0ZW0gPSB0aGlzLmZpbmRGaXJzdENvbnRlbnRJdGVtVHlwZShJdGVtVHlwZS5zdGFjayk7XHJcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50SXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJ5Q3JlYXRlTG9jYXRpb25Gcm9tUGFyZW50SXRlbShwYXJlbnRJdGVtLCBzZWxlY3RvckluZGV4KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuRmlyc3RSb3dPckNvbHVtbjoge1xyXG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudEl0ZW0gPSB0aGlzLmZpbmRGaXJzdENvbnRlbnRJdGVtVHlwZShJdGVtVHlwZS5yb3cpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudEl0ZW0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyeUNyZWF0ZUxvY2F0aW9uRnJvbVBhcmVudEl0ZW0ocGFyZW50SXRlbSwgc2VsZWN0b3JJbmRleCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudEl0ZW0gPSB0aGlzLmZpbmRGaXJzdENvbnRlbnRJdGVtVHlwZShJdGVtVHlwZS5jb2x1bW4pO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRJdGVtICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJ5Q3JlYXRlTG9jYXRpb25Gcm9tUGFyZW50SXRlbShwYXJlbnRJdGVtLCBzZWxlY3RvckluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIExheW91dE1hbmFnZXIuTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuRmlyc3RSb3c6IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudEl0ZW0gPSB0aGlzLmZpbmRGaXJzdENvbnRlbnRJdGVtVHlwZShJdGVtVHlwZS5yb3cpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyeUNyZWF0ZUxvY2F0aW9uRnJvbVBhcmVudEl0ZW0ocGFyZW50SXRlbSwgc2VsZWN0b3JJbmRleCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uU2VsZWN0b3IuVHlwZUlkLkZpcnN0Q29sdW1uOiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRJdGVtID0gdGhpcy5maW5kRmlyc3RDb250ZW50SXRlbVR5cGUoSXRlbVR5cGUuY29sdW1uKTtcclxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRJdGVtID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cnlDcmVhdGVMb2NhdGlvbkZyb21QYXJlbnRJdGVtKHBhcmVudEl0ZW0sIHNlbGVjdG9ySW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgTGF5b3V0TWFuYWdlci5Mb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5FbXB0eToge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2dyb3VuZEl0ZW0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ0xNRkxSSUYxODI0NCcpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yb290SXRlbSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9ySW5kZXggPT09IHVuZGVmaW5lZCB8fCBzZWxlY3RvckluZGV4ID09PSAwKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgcGFyZW50SXRlbTogdGhpcy5fZ3JvdW5kSXRlbSwgaW5kZXg6IDAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgTGF5b3V0TWFuYWdlci5Mb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5Sb290OiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZ3JvdW5kSXRlbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvcignTE1GTEYxODI0NCcpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91bmRDb250ZW50SXRlbXMgPSB0aGlzLl9ncm91bmRJdGVtLmNvbnRlbnRJdGVtcztcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdW5kQ29udGVudEl0ZW1zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3JJbmRleCA9PT0gdW5kZWZpbmVkIHx8IHNlbGVjdG9ySW5kZXggPT09IDApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBwYXJlbnRJdGVtOiB0aGlzLl9ncm91bmRJdGVtLCBpbmRleDogMCB9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRJdGVtID0gZ3JvdW5kQ29udGVudEl0ZW1zWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cnlDcmVhdGVMb2NhdGlvbkZyb21QYXJlbnRJdGVtKHBhcmVudEl0ZW0sIHNlbGVjdG9ySW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHRyeUNyZWF0ZUxvY2F0aW9uRnJvbVBhcmVudEl0ZW0ocGFyZW50SXRlbTogQ29udGVudEl0ZW0sXHJcbiAgICAgICAgc2VsZWN0b3JJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkXHJcbiAgICApOiBMYXlvdXRNYW5hZ2VyLkxvY2F0aW9uIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBjb25zdCBwYXJlbnRDb250ZW50SXRlbXMgPSBwYXJlbnRJdGVtLmNvbnRlbnRJdGVtcztcclxuICAgICAgICBjb25zdCBwYXJlbnRDb250ZW50SXRlbUNvdW50ID0gcGFyZW50Q29udGVudEl0ZW1zLmxlbmd0aDtcclxuICAgICAgICBpZiAoc2VsZWN0b3JJbmRleCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHBhcmVudEl0ZW0sIGluZGV4OiBwYXJlbnRDb250ZW50SXRlbUNvdW50IH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdG9ySW5kZXggPCAwIHx8IHNlbGVjdG9ySW5kZXggPiBwYXJlbnRDb250ZW50SXRlbUNvdW50KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcGFyZW50SXRlbSwgaW5kZXg6IHNlbGVjdG9ySW5kZXggfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBMYXlvdXRNYW5hZ2VyIHtcclxuICAgIGV4cG9ydCB0eXBlIEJlZm9yZVZpcnR1YWxSZWN0aW5nRXZlbnQgPSAodGhpczogdm9pZCwgY291bnQ6IG51bWJlcikgPT4gdm9pZDtcclxuICAgIGV4cG9ydCB0eXBlIEFmdGVyVmlydHVhbFJlY3RpbmdFdmVudCA9ICh0aGlzOiB2b2lkKSA9PiB2b2lkO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgQ29uc3RydWN0b3JQYXJhbWV0ZXJzIHtcclxuICAgICAgICBjb25zdHJ1Y3Rvck9yU3ViV2luZG93TGF5b3V0Q29uZmlnOiBMYXlvdXRDb25maWcgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgaXNTdWJXaW5kb3c6IGJvb2xlYW47XHJcbiAgICAgICAgY29udGFpbmVyRWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1heGltaXNlUGxhY2VFbGVtZW50KGRvY3VtZW50OiBEb2N1bWVudCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuTWF4aW1pc2VQbGFjZSk7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRhYkRyb3BQbGFjZWhvbGRlckVsZW1lbnQoZG9jdW1lbnQ6IERvY3VtZW50KTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Ecm9wVGFiUGxhY2Vob2xkZXIpO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3BlY2lmaWVzIGEgbG9jYXRpb24gb2YgYSBDb250ZW50SXRlbSB3aXRob3V0IHJlZmVyZW5jaW5nIHRoZSBjb250ZW50IGl0ZW0uXHJcbiAgICAgKiBVc2VkIHRvIHNwZWNpZnkgd2hlcmUgYSBuZXcgaXRlbSBpcyB0byBiZSBhZGRlZFxyXG4gICAgICogQHB1YmxpY1xyXG4gICAgICovXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIExvY2F0aW9uIHtcclxuICAgICAgICBwYXJlbnRJdGVtOiBDb250ZW50SXRlbTtcclxuICAgICAgICBpbmRleDogbnVtYmVyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBzZWxlY3RvciB1c2VkIHRvIHNwZWNpZnkgYSB1bmlxdWUgbG9jYXRpb24gaW4gdGhlIGxheW91dFxyXG4gICAgICogQHB1YmxpY1xyXG4gICAgICovXHJcbiAgICBleHBvcnQgaW50ZXJmYWNlIExvY2F0aW9uU2VsZWN0b3Ige1xyXG4gICAgICAgIC8qKiBTcGVjaWZpZXMgc2VsZWN0b3IgYWxnb3JpdGhtICovXHJcbiAgICAgICAgdHlwZUlkOiBMb2NhdGlvblNlbGVjdG9yLlR5cGVJZDtcclxuICAgICAgICAvKiogVXNlZCBieSBhbGdvcml0aG0gdG8gZGV0ZXJtaW5lIGluZGV4IGluIGZvdW5kIENvbnRlbnRJdGVtICovXHJcbiAgICAgICAgaW5kZXg/OiBudW1iZXI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBwdWJsaWMgKi9cclxuICAgIGV4cG9ydCBuYW1lc3BhY2UgTG9jYXRpb25TZWxlY3RvciB7XHJcbiAgICAgICAgZXhwb3J0IGNvbnN0IGVudW0gVHlwZUlkIHtcclxuICAgICAgICAgICAgLyoqIFN0YWNrIHdpdGggZm9jdXNlZCBJdGVtLiBJbmRleCBzcGVjaWZpZXMgb2Zmc2V0IGZyb20gaW5kZXggb2YgZm9jdXNlZCBpdGVtIChlZyAxIGlzIHRoZSBwb3NpdGlvbiBhZnRlciBmb2N1c2VkIGl0ZW0pICovXHJcbiAgICAgICAgICAgIEZvY3VzZWRJdGVtLFxyXG4gICAgICAgICAgICAvKiogU3RhY2sgd2l0aCBmb2N1c2VkIEl0ZW0uIEluZGV4IHNwZWNmaWVzIENvbnRlbnRJdGVtcyBpbmRleCAqL1xyXG4gICAgICAgICAgICBGb2N1c2VkU3RhY2ssXHJcbiAgICAgICAgICAgIC8qKiBGaXJzdCBzdGFjayBmb3VuZCBpbiBsYXlvdXQgKi9cclxuICAgICAgICAgICAgRmlyc3RTdGFjayxcclxuICAgICAgICAgICAgLyoqIEZpcnN0IFJvdyBvciBDb2x1bW4gZm91bmQgaW4gbGF5b3V0IChyb3dzIGFyZSBzZWFyY2hlZCBmaXJzdCkgKi9cclxuICAgICAgICAgICAgRmlyc3RSb3dPckNvbHVtbixcclxuICAgICAgICAgICAgLyoqIEZpcnN0IFJvdyBpbiBsYXlvdXQgKi9cclxuICAgICAgICAgICAgRmlyc3RSb3csXHJcbiAgICAgICAgICAgIC8qKiBGaXJzdCBDb2x1bW4gaW4gbGF5b3V0ICovXHJcbiAgICAgICAgICAgIEZpcnN0Q29sdW1uLFxyXG4gICAgICAgICAgICAvKiogRmluZHMgYSBsb2NhdGlvbiBpZiBsYXlvdXQgaXMgZW1wdHkuIFRoZSBmb3VuZCBsb2NhdGlvbiB3aWxsIGJlIHRoZSByb290IENvbnRlbnRJdGVtLiAqL1xyXG4gICAgICAgICAgICBFbXB0eSxcclxuICAgICAgICAgICAgLyoqIEZpbmRzIHJvb3QgaWYgbGF5b3V0IGlzIGVtcHR5LCBvdGhlcndpc2UgYSBjaGlsZCB1bmRlciByb290ICovXHJcbiAgICAgICAgICAgIFJvb3QsXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGVmYXVsdCBMb2NhdGlvblNlbGVjdG9ycyBhcnJheSB1c2VkIGlmIG5vbmUgaXMgc3BlY2lmaWVkLiAgV2lsbCBhbHdheXMgZmluZCBhIGxvY2F0aW9uLlxyXG4gICAgICogQHB1YmxpY1xyXG4gICAgICovXHJcbiAgICBleHBvcnQgY29uc3QgZGVmYXVsdExvY2F0aW9uU2VsZWN0b3JzOiByZWFkb25seSBMb2NhdGlvblNlbGVjdG9yW10gPSBbXHJcbiAgICAgICAgeyB0eXBlSWQ6IExvY2F0aW9uU2VsZWN0b3IuVHlwZUlkLkZvY3VzZWRTdGFjaywgaW5kZXg6IHVuZGVmaW5lZCB9LFxyXG4gICAgICAgIHsgdHlwZUlkOiBMb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5GaXJzdFN0YWNrLCBpbmRleDogdW5kZWZpbmVkIH0sXHJcbiAgICAgICAgeyB0eXBlSWQ6IExvY2F0aW9uU2VsZWN0b3IuVHlwZUlkLkZpcnN0Um93T3JDb2x1bW4sIGluZGV4OiB1bmRlZmluZWQgfSxcclxuICAgICAgICB7IHR5cGVJZDogTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuUm9vdCwgaW5kZXg6IHVuZGVmaW5lZCB9LFxyXG4gICAgXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIExvY2F0aW9uU2VsZWN0b3JzIHRvIHRyeSB0byBnZXQgbG9jYXRpb24gbmV4dCB0byBleGlzdGluZyBmb2N1c2VkIGl0ZW1cclxuICAgICAqIEBwdWJsaWNcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGNvbnN0IGFmdGVyRm9jdXNlZEl0ZW1JZlBvc3NpYmxlTG9jYXRpb25TZWxlY3RvcnM6IHJlYWRvbmx5IExvY2F0aW9uU2VsZWN0b3JbXSA9IFtcclxuICAgICAgICB7IHR5cGVJZDogTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuRm9jdXNlZEl0ZW0sIGluZGV4OiAxIH0sXHJcbiAgICAgICAgeyB0eXBlSWQ6IExvY2F0aW9uU2VsZWN0b3IuVHlwZUlkLkZpcnN0U3RhY2ssIGluZGV4OiB1bmRlZmluZWQgfSxcclxuICAgICAgICB7IHR5cGVJZDogTG9jYXRpb25TZWxlY3Rvci5UeXBlSWQuRmlyc3RSb3dPckNvbHVtbiwgaW5kZXg6IHVuZGVmaW5lZCB9LFxyXG4gICAgICAgIHsgdHlwZUlkOiBMb2NhdGlvblNlbGVjdG9yLlR5cGVJZC5Sb290LCBpbmRleDogdW5kZWZpbmVkIH0sXHJcbiAgICBdO1xyXG59XHJcbiIsIi8qKlxyXG4gKiBNaW5pZmllcyBhbmQgdW5taW5pZmllcyBjb25maWdzIGJ5IHJlcGxhY2luZyBmcmVxdWVudCBrZXlzXHJcbiAqIGFuZCB2YWx1ZXMgd2l0aCBvbmUgbGV0dGVyIHN1YnN0aXR1dGVzLiBDb25maWcgb3B0aW9ucyBtdXN0XHJcbiAqIHJldGFpbiBhcnJheSBwb3NpdGlvbi9pbmRleCwgYWRkIG5ldyBvcHRpb25zIGF0IHRoZSBlbmQuXHJcbiAqIEBpbnRlcm5hbFxyXG4qL1xyXG5cclxuZXhwb3J0IG5hbWVzcGFjZSBDb25maWdNaW5pZmllciB7XHJcblxyXG4gICAgZXhwb3J0IHR5cGUgWVkgPSAnaWQnIHwgJ3RpdGxlJztcclxuICAgIGV4cG9ydCBjb25zdCBlbnVtIFhYIHtcclxuICAgICAgICBpZCA9ICdpZCdcclxuICAgIH1cclxuICAgIGNvbnN0IGtleXM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xyXG4gICAgICAgICdzZXR0aW5ncycsXHJcbiAgICAgICAgJ2hhc0hlYWRlcnMnLFxyXG4gICAgICAgICdkcmFnQmV0d2VlbldpbmRvd3MnLFxyXG4gICAgICAgICdkcmFnVG9OZXdXaW5kb3cnLFxyXG4gICAgICAgICdzZWxlY3Rpb25FbmFibGVkJyxcclxuICAgICAgICAnZGltZW5zaW9ucycsXHJcbiAgICAgICAgJ2JvcmRlcldpZHRoJyxcclxuICAgICAgICAnbWluSXRlbUhlaWdodCcsXHJcbiAgICAgICAgJ21pbkl0ZW1XaWR0aCcsXHJcbiAgICAgICAgJ2hlYWRlckhlaWdodCcsXHJcbiAgICAgICAgJ2RyYWdQcm94eVdpZHRoJyxcclxuICAgICAgICAnZHJhZ1Byb3h5SGVpZ2h0JyxcclxuICAgICAgICAnbGFiZWxzJyxcclxuICAgICAgICAnY2xvc2UnLFxyXG4gICAgICAgICdtYXhpbWlzZScsXHJcbiAgICAgICAgJ21pbmltaXNlJyxcclxuICAgICAgICAncG9wb3V0JyxcclxuICAgICAgICAnY29udGVudCcsXHJcbiAgICAgICAgJ2NvbXBvbmVudFR5cGUnLFxyXG4gICAgICAgICdjb21wb25lbnRTdGF0ZScsXHJcbiAgICAgICAgJ2lkJyxcclxuICAgICAgICAnd2lkdGgnLFxyXG4gICAgICAgICd0eXBlJyxcclxuICAgICAgICAnaGVpZ2h0JyxcclxuICAgICAgICAnaXNDbG9zYWJsZScsXHJcbiAgICAgICAgJ3RpdGxlJyxcclxuICAgICAgICAncG9wb3V0V2hvbGVTdGFjaycsXHJcbiAgICAgICAgJ29wZW5Qb3BvdXRzJyxcclxuICAgICAgICAncGFyZW50SWQnLFxyXG4gICAgICAgICdhY3RpdmVJdGVtSW5kZXgnLFxyXG4gICAgICAgICdyZW9yZGVyRW5hYmxlZCcsXHJcbiAgICAgICAgJ2JvcmRlckdyYWJXaWR0aCcsXHJcblxyXG5cclxuXHJcbiAgICAgICAgLy9NYXhpbXVtIDM2IGVudHJpZXMsIGRvIG5vdCBjcm9zcyB0aGlzIGxpbmUhXHJcbiAgICBdO1xyXG5cclxuICAgIGNvbnN0IHZhbHVlczogcmVhZG9ubHkgKGJvb2xlYW4gfCBzdHJpbmcpW10gPSBbXHJcbiAgICAgICAgdHJ1ZSxcclxuICAgICAgICBmYWxzZSxcclxuICAgICAgICAncm93JyxcclxuICAgICAgICAnY29sdW1uJyxcclxuICAgICAgICAnc3RhY2snLFxyXG4gICAgICAgICdjb21wb25lbnQnLFxyXG4gICAgICAgICdjbG9zZScsXHJcbiAgICAgICAgJ21heGltaXNlJyxcclxuICAgICAgICAnbWluaW1pc2UnLFxyXG4gICAgICAgICdvcGVuIGluIG5ldyB3aW5kb3cnXHJcbiAgICBdO1xyXG5cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjaGVja0luaXRpYWxpc2UoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKGtleXMubGVuZ3RoID4gMzYpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb28gbWFueSBrZXlzIGluIGNvbmZpZyBtaW5pZmllciBtYXAnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZU9iamVjdChmcm9tOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgbWluaWZ5OiBib29sZWFuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xyXG4gICAgICAgIGNvbnN0IHRvOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGZyb20pIHtcclxuICAgICAgICAgICAgaWYgKGZyb20uaGFzT3duUHJvcGVydHkoa2V5KSkgeyAvLyBJbiBjYXNlIHNvbWV0aGluZyBoYXMgZXh0ZW5kZWQgT2JqZWN0IHByb3RvdHlwZXNcclxuICAgICAgICAgICAgICAgIGxldCB0cmFuc2xhdGVkS2V5OiBzdHJpbmc7XHJcbiAgICAgICAgICAgICAgICBpZiAobWluaWZ5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlZEtleSA9IG1pbmlmeUtleShrZXkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVkS2V5ID0gdW5taW5pZnlLZXkoa2V5KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBmcm9tVmFsdWUgPSBmcm9tW2tleV07XHJcbiAgICAgICAgICAgICAgICB0b1t0cmFuc2xhdGVkS2V5XSA9IHRyYW5zbGF0ZVZhbHVlKGZyb21WYWx1ZSwgbWluaWZ5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRvO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZUFycmF5KGZyb206IHVua25vd25bXSwgbWluaWZ5OiBib29sZWFuKSB7XHJcbiAgICAgICAgY29uc3QgbGVuZ3RoID0gZnJvbS5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgdG8gPSBuZXcgQXJyYXk8dW5rbm93bj4obGVuZ3RoKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIC8vIEluIG9yaWdpbmFsIGNvZGUsIGFycmF5IGluZGljZXMgd2VyZSBudW1iZXJzIGFuZCBub3QgdHJhbnNsYXRlZFxyXG4gICAgICAgICAgICBjb25zdCBmcm9tVmFsdWUgPSBmcm9tW2ldO1xyXG4gICAgICAgICAgICB0b1tpXSA9IHRyYW5zbGF0ZVZhbHVlKGZyb21WYWx1ZSwgbWluaWZ5KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRvO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZVZhbHVlKGZyb206IHVua25vd24sIG1pbmlmeTogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICh0eXBlb2YgZnJvbSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgICAgICAgaWYgKGZyb20gPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZnJvbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlQXJyYXkoZnJvbSwgbWluaWZ5KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZU9iamVjdChmcm9tIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBtaW5pZnkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKG1pbmlmeSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG1pbmlmeVZhbHVlKGZyb20pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVubWluaWZ5VmFsdWUoZnJvbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbWluaWZ5S2V5KHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBJZiBhIHZhbHVlIGFjdHVhbGx5IGlzIGEgc2luZ2xlIGNoYXJhY3RlciwgcHJlZml4IGl0XHJcbiAgICAgICAgICogd2l0aCBfX18gdG8gYXZvaWQgbWlzdGFraW5nIGl0IGZvciBhIG1pbmlmaWNhdGlvbiBjb2RlXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnX19fJyArIHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gaW5kZXhPZktleSh2YWx1ZSk7XHJcbiAgICBcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiB2YWx1ZSBub3QgZm91bmQgaW4gdGhlIGRpY3Rpb25hcnksIHJldHVybiBpdCB1bm1vZGlmaWVkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICBcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIHZhbHVlIGZvdW5kIGluIGRpY3Rpb25hcnksIHJldHVybiBpdHMgYmFzZTM2IGNvdW50ZXJwYXJ0XHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpbmRleC50b1N0cmluZygzNik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHVubWluaWZ5S2V5KGtleTogc3RyaW5nKSB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogdmFsdWUgaXMgYSBzaW5nbGUgY2hhcmFjdGVyLiBBc3N1bWUgdGhhdCBpdCdzIGEgdHJhbnNsYXRpb25cclxuICAgICAgICAgKiBhbmQgcmV0dXJuIHRoZSBvcmlnaW5hbCB2YWx1ZSBmcm9tIHRoZSBkaWN0aW9uYXJ5XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKGtleS5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGtleXNbcGFyc2VJbnQoa2V5LCAzNildO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIHZhbHVlIG9yaWdpbmFsbHkgd2FzIGEgc2luZ2xlIGNoYXJhY3RlciBhbmQgd2FzIHByZWZpeGVkIHdpdGggX19fXHJcbiAgICAgICAgICogdG8gYXZvaWQgbWlzdGFraW5nIGl0IGZvciBhIHRyYW5zbGF0aW9uLiBSZW1vdmUgdGhlIHByZWZpeFxyXG4gICAgICAgICAqIGFuZCByZXR1cm4gdGhlIG9yaWdpbmFsIGNoYXJhY3RlclxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChrZXkuc3Vic3RyKDAsIDMpID09PSAnX19fJykge1xyXG4gICAgICAgICAgICByZXR1cm4ga2V5WzNdO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiB2YWx1ZSB3YXMgbm90IG1pbmlmaWVkXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcmV0dXJuIGtleTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBtaW5pZnlWYWx1ZSh2YWx1ZTogdW5rbm93bikge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElmIGEgdmFsdWUgYWN0dWFsbHkgaXMgYSBzaW5nbGUgY2hhcmFjdGVyLCBwcmVmaXggaXRcclxuICAgICAgICAgKiB3aXRoIF9fXyB0byBhdm9pZCBtaXN0YWtpbmcgaXQgZm9yIGEgbWluaWZpY2F0aW9uIGNvZGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdfX18nICsgdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBpbmRleE9mVmFsdWUodmFsdWUpO1xyXG4gICAgXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogdmFsdWUgbm90IGZvdW5kIGluIHRoZSBkaWN0aW9uYXJ5LCByZXR1cm4gaXQgdW5tb2RpZmllZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiB2YWx1ZSBmb3VuZCBpbiBkaWN0aW9uYXJ5LCByZXR1cm4gaXRzIGJhc2UzNiBjb3VudGVycGFydFxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gaW5kZXgudG9TdHJpbmcoMzYpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiB1bm1pbmlmeVZhbHVlKHZhbHVlOiB1bmtub3duKSB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogdmFsdWUgaXMgYSBzaW5nbGUgY2hhcmFjdGVyLiBBc3N1bWUgdGhhdCBpdCdzIGEgdHJhbnNsYXRpb25cclxuICAgICAgICAgKiBhbmQgcmV0dXJuIHRoZSBvcmlnaW5hbCB2YWx1ZSBmcm9tIHRoZSBkaWN0aW9uYXJ5XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZXNbcGFyc2VJbnQodmFsdWUsIDM2KV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiB2YWx1ZSBvcmlnaW5hbGx5IHdhcyBhIHNpbmdsZSBjaGFyYWN0ZXIgYW5kIHdhcyBwcmVmaXhlZCB3aXRoIF9fX1xyXG4gICAgICAgICAqIHRvIGF2b2lkIG1pc3Rha2luZyBpdCBmb3IgYSB0cmFuc2xhdGlvbi4gUmVtb3ZlIHRoZSBwcmVmaXhcclxuICAgICAgICAgKiBhbmQgcmV0dXJuIHRoZSBvcmlnaW5hbCBjaGFyYWN0ZXJcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5zdWJzdHIoMCwgMykgPT09ICdfX18nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZVszXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogdmFsdWUgd2FzIG5vdCBtaW5pZmllZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBpbmRleE9mS2V5KGtleTogc3RyaW5nKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChrZXlzW2ldID09PSBrZXkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAtMTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBpbmRleE9mVmFsdWUodmFsdWU6IHVua25vd24pIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAodmFsdWVzW2ldID09PSB2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IERvbUNvbnN0YW50cyB9IGZyb20gJy4vZG9tLWNvbnN0YW50cyc7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4vZXZlbnQtZW1pdHRlcic7XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBjbGFzcyBEcmFnTGlzdGVuZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgcHJpdmF0ZSBfdGltZW91dDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XHJcbiAgICBwcml2YXRlIF9hbGxvd2FibGVUYXJnZXRzOiBIVE1MRWxlbWVudFtdO1xyXG4gICAgcHJpdmF0ZSBfb0RvY3VtZW50OiBEb2N1bWVudDtcclxuICAgIHByaXZhdGUgX2VCb2R5OiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgX25EZWxheTogbnVtYmVyO1xyXG4gICAgcHJpdmF0ZSBfbkRpc3RhbmNlOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIF9vcmlnaW5hbEV2ZW50OiBFdmVudEVtaXR0ZXIuRHJhZ0V2ZW50O1xyXG4gICAgcHJpdmF0ZSBfZHJhZ2dpbmc6IGJvb2xlYW47XHJcbiAgICBwcml2YXRlIF9wb2ludGVyVHJhY2tpbmcgPSBmYWxzZTtcclxuXHJcbiAgICBwcml2YXRlIF9wb2ludGVyRG93bkV2ZW50TGlzdGVuZXIgPSAoZXY6IFBvaW50ZXJFdmVudCkgPT4gdGhpcy5vblBvaW50ZXJEb3duKGV2KTtcclxuICAgIHByaXZhdGUgX3BvaW50ZXJNb3ZlRXZlbnRMaXN0ZW5lciA9IChldjogUG9pbnRlckV2ZW50KSA9PiB0aGlzLm9uUG9pbnRlck1vdmUoZXYpO1xyXG4gICAgcHJpdmF0ZSBfcG9pbnRlclVwRXZlbnRMaXN0ZW5lciA9IChldjogUG9pbnRlckV2ZW50KSA9PiB0aGlzLm9uUG9pbnRlclVwKGV2KTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9lRWxlbWVudDogSFRNTEVsZW1lbnQsIGV4dHJhQWxsb3dhYmxlQ2hpbGRUYXJnZXRzOiBIVE1MRWxlbWVudFtdKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fdGltZW91dCA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgdGhpcy5fYWxsb3dhYmxlVGFyZ2V0cyA9IFtfZUVsZW1lbnQsIC4uLmV4dHJhQWxsb3dhYmxlQ2hpbGRUYXJnZXRzXTtcclxuICAgICAgICB0aGlzLl9vRG9jdW1lbnQgPSBkb2N1bWVudDtcclxuICAgICAgICB0aGlzLl9lQm9keSA9IGRvY3VtZW50LmJvZHk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBkZWxheSBhZnRlciB3aGljaCB0byBzdGFydCB0aGUgZHJhZyBpbiBtaWxsaXNlY29uZHNcclxuICAgICAgICAgKiBEbyBOT1QgbWFrZSB0b28gc2hvcnQgKHByZXZpb3VzIHZhbHVlIG9mIDIwMCB3YXMgbm90IGxvbmcgZW5vdWdoIGZvciBteSB0b3VjaHBhZClcclxuICAgICAgICAgKiBTaG91bGQgZ2VuZXJhbGx5IHJlbHkgb24gdGhlIG1vdXNlIG1vdmUgdG8gc3RhcnQgZHJhZy4gIE5vdCB0aGlzIGRlbGF5LlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX25EZWxheSA9IDE4MDA7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBkaXN0YW5jZSB0aGUgbW91c2UgbmVlZHMgdG8gYmUgbW92ZWQgdG8gcXVhbGlmeSBhcyBhIGRyYWdcclxuICAgICAgICAgKiBQcmV2aW91cyBjb21tZW50OiB3b3JrcyBiZXR0ZXIgd2l0aCBkZWxheSBvbmx5XHJcbiAgICAgICAgICogPz8/XHJcbiAgICAgICAgICogUHJvYmFibHkgc29tZWhvdyBuZWVkcyB0dW5pbmcgZm9yIGRpZmZlcmVudCBkZXZpY2VzXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5fbkRpc3RhbmNlID0gMTA7XHJcblxyXG4gICAgICAgIHRoaXMuX29yaWdpbmFsRXZlbnQgPSB7IHBhZ2VYOiAwLCBwYWdlWTogMCwgc2NyZWVuWDogMCwgc2NyZWVuWTogMH07XHJcblxyXG4gICAgICAgIHRoaXMuX2RyYWdnaW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMuX2VFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5fcG9pbnRlckRvd25FdmVudExpc3RlbmVyLCB7IHBhc3NpdmU6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNoZWNrUmVtb3ZlUG9pbnRlclRyYWNraW5nRXZlbnRMaXN0ZW5lcnMoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmRvd24nLCB0aGlzLl9wb2ludGVyRG93bkV2ZW50TGlzdGVuZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGNhbmNlbERyYWcoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wcm9jZXNzRHJhZ1N0b3AodW5kZWZpbmVkKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uUG9pbnRlckRvd24ob0V2ZW50OiBQb2ludGVyRXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5fYWxsb3dhYmxlVGFyZ2V0cy5pbmNsdWRlcyhvRXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KSAmJiBvRXZlbnQuaXNQcmltYXJ5KSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1BvaW50ZXJEb3duKG9FdmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcHJvY2Vzc1BvaW50ZXJEb3duKGV2ZW50OiBQb2ludGVyRXZlbnQpIHtcclxuICAgICAgICB0aGlzLl9vcmlnaW5hbEV2ZW50ID0gZXZlbnQ7XHJcblxyXG4gICAgICAgIHRoaXMuX29Eb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIHRoaXMuX3BvaW50ZXJNb3ZlRXZlbnRMaXN0ZW5lcik7XHJcbiAgICAgICAgdGhpcy5fb0RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIHRoaXMuX3BvaW50ZXJVcEV2ZW50TGlzdGVuZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICB0aGlzLl9lQm9keS5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuUG9pbnRlclRyYWNraW5nKTtcclxuICAgICAgICB0aGlzLl9wb2ludGVyVHJhY2tpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLl90aW1lb3V0ID0gc2V0VGltZW91dChcclxuICAgICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0RHJhZygpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAsIHRoaXMuX25EZWxheSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvblBvaW50ZXJNb3ZlKG9FdmVudDogUG9pbnRlckV2ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BvaW50ZXJUcmFja2luZykge1xyXG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NEcmFnTW92ZShvRXZlbnQpO1xyXG4gICAgICAgICAgICBvRXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwcm9jZXNzRHJhZ01vdmUoZXZlbnQ6IFBvaW50ZXJFdmVudCkge1xyXG4gICAgICAgIGNvbnN0IG9mZnNldFggPSBldmVudC5wYWdlWCAtIHRoaXMuX29yaWdpbmFsRXZlbnQucGFnZVg7XHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0WSA9IGV2ZW50LnBhZ2VZIC0gdGhpcy5fb3JpZ2luYWxFdmVudC5wYWdlWTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2RyYWdnaW5nID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICBNYXRoLmFicyhvZmZzZXRYKSA+IHRoaXMuX25EaXN0YW5jZSB8fFxyXG4gICAgICAgICAgICAgICAgTWF0aC5hYnMob2Zmc2V0WSkgPiB0aGlzLl9uRGlzdGFuY2VcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0RHJhZygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fZHJhZ2dpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdkcmFnJywgb2Zmc2V0WCwgb2Zmc2V0WSwgZXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uUG9pbnRlclVwKG9FdmVudDogUG9pbnRlckV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5wcm9jZXNzRHJhZ1N0b3Aob0V2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHByb2Nlc3NEcmFnU3RvcChkcmFnRXZlbnQ/OiBQb2ludGVyRXZlbnQpIHtcclxuICAgICAgICBpZiAodGhpcy5fdGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KTtcclxuICAgICAgICAgICAgdGhpcy5fdGltZW91dCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuY2hlY2tSZW1vdmVQb2ludGVyVHJhY2tpbmdFdmVudExpc3RlbmVycygpO1xyXG4gICAgXHJcbiAgICAgICAgaWYgKHRoaXMuX2RyYWdnaW5nID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2VCb2R5LmNsYXNzTGlzdC5yZW1vdmUoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5EcmFnZ2luZyk7XHJcbiAgICAgICAgICAgIHRoaXMuX2VFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5EcmFnZ2luZyk7XHJcbiAgICAgICAgICAgIHRoaXMuX2RyYWdnaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZHJhZ1N0b3AnLCBkcmFnRXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNoZWNrUmVtb3ZlUG9pbnRlclRyYWNraW5nRXZlbnRMaXN0ZW5lcnMoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3BvaW50ZXJUcmFja2luZykge1xyXG4gICAgICAgICAgICB0aGlzLl9vRG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcm1vdmUnLCB0aGlzLl9wb2ludGVyTW92ZUV2ZW50TGlzdGVuZXIpO1xyXG4gICAgICAgICAgICB0aGlzLl9vRG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcnVwJywgdGhpcy5fcG9pbnRlclVwRXZlbnRMaXN0ZW5lcik7XHJcbiAgICAgICAgICAgIHRoaXMuX2VCb2R5LmNsYXNzTGlzdC5yZW1vdmUoRG9tQ29uc3RhbnRzLkNsYXNzTmFtZS5Qb2ludGVyVHJhY2tpbmcpO1xyXG4gICAgICAgICAgICB0aGlzLl9wb2ludGVyVHJhY2tpbmcgPSBmYWxzZTtcclxuICAgICAgICB9ICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhcnREcmFnKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl90aW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpO1xyXG4gICAgICAgICAgICB0aGlzLl90aW1lb3V0ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9kcmFnZ2luZyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fZUJvZHkuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkRyYWdnaW5nKTtcclxuICAgICAgICB0aGlzLl9lRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuRHJhZ2dpbmcpO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnZHJhZ1N0YXJ0JywgdGhpcy5fb3JpZ2luYWxFdmVudC5wYWdlWCwgdGhpcy5fb3JpZ2luYWxFdmVudC5wYWdlWSk7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdkcmFnJywgMCwgMCwgdGhpcy5fb3JpZ2luYWxFdmVudCk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgeyBCcm93c2VyUG9wb3V0IH0gZnJvbSAnLi4vY29udHJvbHMvYnJvd3Nlci1wb3BvdXQnO1xyXG5pbXBvcnQgeyBUYWIgfSBmcm9tICcuLi9jb250cm9scy90YWInO1xyXG5pbXBvcnQgeyBDb21wb25lbnRJdGVtIH0gZnJvbSAnLi4vaXRlbXMvY29tcG9uZW50LWl0ZW0nO1xyXG5cclxuLyoqXHJcbiAqIEEgZ2VuZXJpYyBhbmQgdmVyeSBmYXN0IEV2ZW50RW1pdHRlciBpbXBsZW1lbnRhdGlvbi4gT24gdG9wIG9mIGVtaXR0aW5nIHRoZSBhY3R1YWwgZXZlbnQgaXQgZW1pdHMgYW5cclxuICoge0BsaW5rIChFdmVudEVtaXR0ZXI6bmFtZXNwYWNlKS5BTExfRVZFTlR9IGV2ZW50IGZvciBldmVyeSBldmVudCB0cmlnZ2VyZWQuIFRoaXMgYWxsb3dzIHRvIGhvb2sgaW50byBpdCBhbmQgcHJveHkgZXZlbnRzIGZvcndhcmRzXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBjbGFzcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgcHJpdmF0ZSBfYWxsRXZlbnRTdWJzY3JpcHRpb25zOiBFdmVudEVtaXR0ZXIuVW5rbm93bkNhbGxiYWNrW10gPSBbXTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX3N1YnNjcmlwdGlvbnNNYXAgPSBuZXcgTWFwPHN0cmluZywgRXZlbnRFbWl0dGVyLlVua25vd25DYWxsYmFja1tdPigpO1xyXG5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICAgIHRyeUJ1YmJsZUV2ZW50KG5hbWU6IHN0cmluZywgYXJnczogdW5rbm93bltdKTogdm9pZCB7XHJcbiAgICAgICAgLy8gb3ZlcnJpZGRlbiBieSBDb250ZW50SXRlbVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRW1pdCBhbiBldmVudCBhbmQgbm90aWZ5IGxpc3RlbmVyc1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcclxuICAgICAqIEBwYXJhbSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgbGlzdGVuZXJcclxuICAgICAqL1xyXG4gICAgZW1pdDxLIGV4dGVuZHMga2V5b2YgRXZlbnRFbWl0dGVyLkV2ZW50UGFyYW1zTWFwPihldmVudE5hbWU6IEssIC4uLmFyZ3M6IEV2ZW50RW1pdHRlci5FdmVudFBhcmFtc01hcFtLXSk6IHZvaWQge1xyXG4gICAgICAgIGxldCBzdWJjcmlwdGlvbnMgPSB0aGlzLl9zdWJzY3JpcHRpb25zTWFwLmdldChldmVudE5hbWUpO1xyXG5cclxuICAgICAgICBpZiAoc3ViY3JpcHRpb25zICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgc3ViY3JpcHRpb25zID0gc3ViY3JpcHRpb25zLnNsaWNlKCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3ViY3JpcHRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBzdWJjcmlwdGlvbnNbaV07XHJcbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24oLi4uYXJncyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZW1pdEFsbEV2ZW50KGV2ZW50TmFtZSwgYXJncyk7XHJcbiAgICAgICAgdGhpcy50cnlCdWJibGVFdmVudChldmVudE5hbWUsIGFyZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGVtaXRVbmtub3duKGV2ZW50TmFtZTogc3RyaW5nLCAuLi5hcmdzOiBFdmVudEVtaXR0ZXIuVW5rbm93blBhcmFtcyk6IHZvaWQge1xyXG4gICAgICAgIGxldCBzdWJzID0gdGhpcy5fc3Vic2NyaXB0aW9uc01hcC5nZXQoZXZlbnROYW1lKTtcclxuXHJcbiAgICAgICAgaWYgKHN1YnMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBzdWJzID0gc3Vicy5zbGljZSgpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1YnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHN1YnNbaV0oLi4uYXJncyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZW1pdEFsbEV2ZW50KGV2ZW50TmFtZSwgYXJncyk7XHJcbiAgICAgICAgdGhpcy50cnlCdWJibGVFdmVudChldmVudE5hbWUsIGFyZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qIEBpbnRlcm5hbCAqKi9cclxuICAgIGVtaXRCYXNlQnViYmxpbmdFdmVudDxLIGV4dGVuZHMga2V5b2YgRXZlbnRFbWl0dGVyLkV2ZW50UGFyYW1zTWFwPihldmVudE5hbWU6IEspOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudEVtaXR0ZXIuQnViYmxpbmdFdmVudChldmVudE5hbWUsIHRoaXMpO1xyXG4gICAgICAgIHRoaXMuZW1pdFVua25vd24oZXZlbnROYW1lLCBldmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZW1pdFVua25vd25CdWJibGluZ0V2ZW50KGV2ZW50TmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyLkJ1YmJsaW5nRXZlbnQoZXZlbnROYW1lLCB0aGlzKTtcclxuICAgICAgICB0aGlzLmVtaXRVbmtub3duKGV2ZW50TmFtZSwgZXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhIGxpc3RlbmVyIGZvciBhbiBldmVudC5cclxuICAgICAqIEBwYXJhbSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcclxuICAgICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgY2FsbGJhY2sgbWV0aG9kIChvcHRpb25hbClcclxuICAgICAqL1xyXG4gICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcjxLIGV4dGVuZHMga2V5b2YgRXZlbnRFbWl0dGVyLkV2ZW50UGFyYW1zTWFwPihldmVudE5hbWU6IEssIGNhbGxiYWNrOiBFdmVudEVtaXR0ZXIuQ2FsbGJhY2s8Sz4pOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB1bmtub3duQ2FsbGJhY2sgPSBjYWxsYmFjayBhcyBFdmVudEVtaXR0ZXIuVW5rbm93bkNhbGxiYWNrO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlVW5rbm93bkV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCB1bmtub3duQ2FsbGJhY2spO1xyXG4gICAgfVxyXG5cclxuICAgIG9mZjxLIGV4dGVuZHMga2V5b2YgRXZlbnRFbWl0dGVyLkV2ZW50UGFyYW1zTWFwPihldmVudE5hbWU6IEssIGNhbGxiYWNrOiBFdmVudEVtaXR0ZXIuQ2FsbGJhY2s8Sz4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBjYWxsYmFjayk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbGlhcyBmb3Igb2ZmXHJcbiAgICAgKi9cclxuICAgIHVuYmluZCA9IHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFsaWFzIGZvciBlbWl0XHJcbiAgICAgKi9cclxuICAgIHRyaWdnZXIgPSB0aGlzLmVtaXQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBMaXN0ZW4gZm9yIGV2ZW50c1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gbGlzdGVuIHRvXHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZSB3aGVuIHRoZSBldmVudCBvY2N1cnNcclxuICAgICAqL1xyXG4gICAgYWRkRXZlbnRMaXN0ZW5lcjxLIGV4dGVuZHMga2V5b2YgRXZlbnRFbWl0dGVyLkV2ZW50UGFyYW1zTWFwPihldmVudE5hbWU6IEssIGNhbGxiYWNrOiBFdmVudEVtaXR0ZXIuQ2FsbGJhY2s8Sz4pOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB1bmtub3duQ2FsbGJhY2sgPSBjYWxsYmFjayBhcyBFdmVudEVtaXR0ZXIuVW5rbm93bkNhbGxiYWNrO1xyXG4gICAgICAgIHRoaXMuYWRkVW5rbm93bkV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCB1bmtub3duQ2FsbGJhY2spO1xyXG4gICAgfVxyXG5cclxuICAgIG9uPEsgZXh0ZW5kcyBrZXlvZiBFdmVudEVtaXR0ZXIuRXZlbnRQYXJhbXNNYXA+KGV2ZW50TmFtZTogSywgY2FsbGJhY2s6IEV2ZW50RW1pdHRlci5DYWxsYmFjazxLPik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGNhbGxiYWNrKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGFkZFVua25vd25FdmVudExpc3RlbmVyKGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogRXZlbnRFbWl0dGVyLlVua25vd25DYWxsYmFjayk6IHZvaWQge1xyXG4gICAgICAgIGlmIChldmVudE5hbWUgPT09IEV2ZW50RW1pdHRlci5BTExfRVZFTlQpIHtcclxuICAgICAgICAgICAgdGhpcy5fYWxsRXZlbnRTdWJzY3JpcHRpb25zLnB1c2goY2FsbGJhY2spO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBzdWJzY3JpcHRpb25zID0gdGhpcy5fc3Vic2NyaXB0aW9uc01hcC5nZXQoZXZlbnROYW1lKTtcclxuICAgICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbnMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9ucy5wdXNoKGNhbGxiYWNrKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbnMgPSBbY2FsbGJhY2tdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uc01hcC5zZXQoZXZlbnROYW1lLCBzdWJzY3JpcHRpb25zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIHJlbW92ZVVua25vd25FdmVudExpc3RlbmVyKGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogRXZlbnRFbWl0dGVyLlVua25vd25DYWxsYmFjayk6IHZvaWQge1xyXG4gICAgICAgIGlmIChldmVudE5hbWUgPT09IEV2ZW50RW1pdHRlci5BTExfRVZFTlQpIHtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVTdWJzY3JpcHRpb24oZXZlbnROYW1lLCB0aGlzLl9hbGxFdmVudFN1YnNjcmlwdGlvbnMsIGNhbGxiYWNrKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBzdWJzY3JpcHRpb25zID0gdGhpcy5fc3Vic2NyaXB0aW9uc01hcC5nZXQoZXZlbnROYW1lKTtcclxuICAgICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbnMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBzdWJzY3JpYnRpb25zIHRvIHVuc3Vic2NyaWJlIGZvciBldmVudCAnICsgZXZlbnROYW1lKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlU3Vic2NyaXB0aW9uKGV2ZW50TmFtZSwgc3Vic2NyaXB0aW9ucywgY2FsbGJhY2spO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgcmVtb3ZlU3Vic2NyaXB0aW9uKGV2ZW50TmFtZTogc3RyaW5nLCBzdWJzY3JpcHRpb25zOiBFdmVudEVtaXR0ZXIuVW5rbm93bkNhbGxiYWNrW10sIGNhbGxiYWNrOiBFdmVudEVtaXR0ZXIuVW5rbm93bkNhbGxiYWNrKSB7XHJcbiAgICAgICAgY29uc3QgaWR4ID0gc3Vic2NyaXB0aW9ucy5pbmRleE9mKGNhbGxiYWNrKTtcclxuICAgICAgICBpZiAoaWR4IDwgMCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdGhpbmcgdG8gdW5iaW5kIGZvciAnICsgZXZlbnROYW1lKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzdWJzY3JpcHRpb25zLnNwbGljZShpZHgsIDEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBwcml2YXRlIGVtaXRBbGxFdmVudChldmVudE5hbWU6IHN0cmluZywgYXJnczogdW5rbm93bltdKSB7XHJcbiAgICAgICAgY29uc3QgYWxsRXZlbnRTdWJzY3JpcHRpb25zQ291bnQgPSB0aGlzLl9hbGxFdmVudFN1YnNjcmlwdGlvbnMubGVuZ3RoO1xyXG4gICAgICAgIGlmIChhbGxFdmVudFN1YnNjcmlwdGlvbnNDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3QgdW5rbm93bkFyZ3MgPSBhcmdzLnNsaWNlKCkgYXMgRXZlbnRFbWl0dGVyLlVua25vd25QYXJhbXM7XHJcbiAgICAgICAgICAgIHVua25vd25BcmdzLnVuc2hpZnQoZXZlbnROYW1lKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGFsbEV2ZW50U3ViY3JpcHRpb25zID0gdGhpcy5fYWxsRXZlbnRTdWJzY3JpcHRpb25zLnNsaWNlKCk7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbEV2ZW50U3Vic2NyaXB0aW9uc0NvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGFsbEV2ZW50U3ViY3JpcHRpb25zW2ldKC4uLnVua25vd25BcmdzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBFdmVudEVtaXR0ZXIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdGhhdCdzIHRyaWdnZXJlZCBmb3IgZXZlcnkgZXZlbnRcclxuICAgICAqL1xyXG4gICAgZXhwb3J0IGNvbnN0IEFMTF9FVkVOVCA9ICdfX2FsbCc7XHJcblxyXG4gICAgZXhwb3J0IGNvbnN0IGhlYWRlckNsaWNrRXZlbnROYW1lID0gJ3N0YWNrSGVhZGVyQ2xpY2snO1xyXG4gICAgZXhwb3J0IGNvbnN0IGhlYWRlclRvdWNoU3RhcnRFdmVudE5hbWUgPSAnc3RhY2tIZWFkZXJUb3VjaFN0YXJ0JztcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBVbmtub3duQ2FsbGJhY2sgPSAodGhpczogdm9pZCwgLi4uYXJnczogVW5rbm93blBhcmFtcykgPT4gdm9pZDtcclxuICAgIGV4cG9ydCB0eXBlIENhbGxiYWNrPEsgZXh0ZW5kcyBrZXlvZiBFdmVudEVtaXR0ZXIuRXZlbnRQYXJhbXNNYXA+ID0gKHRoaXM6IHZvaWQsIC4uLmFyZ3M6IEV2ZW50UGFyYW1zTWFwW0tdKSA9PiB2b2lkO1xyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgRXZlbnRQYXJhbXNNYXAge1xyXG4gICAgICAgIFwiX19hbGxcIjogVW5rbm93blBhcmFtcztcclxuICAgICAgICBcImFjdGl2ZUNvbnRlbnRJdGVtQ2hhbmdlZFwiOiBDb21wb25lbnRJdGVtUGFyYW07XHJcbiAgICAgICAgXCJjbG9zZVwiOiBOb1BhcmFtcztcclxuICAgICAgICBcImNsb3NlZFwiOiBOb1BhcmFtcztcclxuICAgICAgICBcImRlc3Ryb3lcIjogTm9QYXJhbXM7XHJcbiAgICAgICAgXCJkcmFnXCI6IERyYWdQYXJhbXM7XHJcbiAgICAgICAgXCJkcmFnU3RhcnRcIjogRHJhZ1N0YXJ0UGFyYW1zO1xyXG4gICAgICAgIFwiZHJhZ1N0b3BcIjogRHJhZ1N0b3BQYXJhbXM7XHJcbiAgICAgICAgXCJoaWRlXCI6IE5vUGFyYW1zO1xyXG4gICAgICAgIFwiaW5pdGlhbGlzZWRcIjogTm9QYXJhbXM7XHJcbiAgICAgICAgXCJpdGVtRHJvcHBlZFwiOiBDb21wb25lbnRJdGVtUGFyYW07XHJcbiAgICAgICAgXCJtYXhpbWlzZWRcIjogTm9QYXJhbXM7XHJcbiAgICAgICAgXCJtaW5pbWlzZWRcIjogTm9QYXJhbXM7XHJcbiAgICAgICAgXCJvcGVuXCI6IE5vUGFyYW1zO1xyXG4gICAgICAgIFwicG9wSW5cIjogTm9QYXJhbXM7XHJcbiAgICAgICAgXCJyZXNpemVcIjogTm9QYXJhbXM7XHJcbiAgICAgICAgXCJzaG93XCI6IE5vUGFyYW1zO1xyXG4gICAgICAgIC8qKiBAZGVwcmVjYXRlZCAtIHVzZSBzaG93IGluc3RlYWQgKi9cclxuICAgICAgICBcInNob3duXCI6IE5vUGFyYW1zO1xyXG4gICAgICAgIFwic3RhdGVDaGFuZ2VkXCI6IE5vUGFyYW1zO1xyXG4gICAgICAgIFwidGFiXCI6IFRhYlBhcmFtO1xyXG4gICAgICAgIFwidGFiQ3JlYXRlZFwiOiBUYWJQYXJhbTtcclxuICAgICAgICBcInRpdGxlQ2hhbmdlZFwiOiBTdHJpbmdQYXJhbTtcclxuICAgICAgICBcIndpbmRvd0Nsb3NlZFwiOiBQb3BvdXRQYXJhbTtcclxuICAgICAgICBcIndpbmRvd09wZW5lZFwiOiBQb3BvdXRQYXJhbTtcclxuICAgICAgICBcImJlZm9yZUNvbXBvbmVudFJlbGVhc2VcIjogQmVmb3JlQ29tcG9uZW50UmVsZWFzZVBhcmFtcztcclxuICAgICAgICBcImJlZm9yZUl0ZW1EZXN0cm95ZWRcIjogQnViYmxpbmdFdmVudFBhcmFtO1xyXG4gICAgICAgIFwiaXRlbUNyZWF0ZWRcIjogQnViYmxpbmdFdmVudFBhcmFtO1xyXG4gICAgICAgIFwiaXRlbURlc3Ryb3llZFwiOiBCdWJibGluZ0V2ZW50UGFyYW07XHJcbiAgICAgICAgXCJmb2N1c1wiOiBCdWJibGluZ0V2ZW50UGFyYW07XHJcbiAgICAgICAgXCJibHVyXCI6IEJ1YmJsaW5nRXZlbnRQYXJhbTtcclxuICAgICAgICBcInN0YWNrSGVhZGVyQ2xpY2tcIjogQ2xpY2tCdWJibGluZ0V2ZW50UGFyYW07XHJcbiAgICAgICAgXCJzdGFja0hlYWRlclRvdWNoU3RhcnRcIjogVG91Y2hTdGFydEJ1YmJsaW5nRXZlbnRQYXJhbTtcclxuICAgICAgICBcInVzZXJCcm9hZGNhc3RcIjogVW5rbm93blBhcmFtcztcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgdHlwZSBVbmtub3duUGFyYW1zID0gdW5rbm93bltdO1xyXG4gICAgZXhwb3J0IHR5cGUgTm9QYXJhbXMgPSBbXTtcclxuICAgIGV4cG9ydCB0eXBlIFVua25vd25QYXJhbSA9IFt1bmtub3duXTtcclxuICAgIGV4cG9ydCB0eXBlIFBvcG91dFBhcmFtID0gW0Jyb3dzZXJQb3BvdXRdO1xyXG4gICAgZXhwb3J0IHR5cGUgQ29tcG9uZW50SXRlbVBhcmFtID0gW0NvbXBvbmVudEl0ZW1dO1xyXG4gICAgZXhwb3J0IHR5cGUgVGFiUGFyYW0gPSBbVGFiXTtcclxuICAgIGV4cG9ydCB0eXBlIEJ1YmJsaW5nRXZlbnRQYXJhbSA9IFtFdmVudEVtaXR0ZXIuQnViYmxpbmdFdmVudF1cclxuICAgIGV4cG9ydCB0eXBlIFN0cmluZ1BhcmFtID0gW3N0cmluZ107XHJcbiAgICBleHBvcnQgdHlwZSBEcmFnU3RhcnRQYXJhbXMgPSBbb3JpZ2luYWxYOiBudW1iZXIsIG9yaWdpbmFsWTogbnVtYmVyXTtcclxuICAgIGV4cG9ydCB0eXBlIERyYWdTdG9wUGFyYW1zID0gW2V2ZW50OiBQb2ludGVyRXZlbnQgfCB1bmRlZmluZWRdO1xyXG4gICAgZXhwb3J0IHR5cGUgRHJhZ1BhcmFtcyA9IFtvZmZzZXRYOiBudW1iZXIsIG9mZnNldFk6IG51bWJlciwgZXZlbnQ6IEV2ZW50RW1pdHRlci5EcmFnRXZlbnRdO1xyXG4gICAgZXhwb3J0IHR5cGUgQmVmb3JlQ29tcG9uZW50UmVsZWFzZVBhcmFtcyA9IFtjb21wb25lbnQ6IHVua25vd25dO1xyXG4gICAgZXhwb3J0IHR5cGUgQ2xpY2tCdWJibGluZ0V2ZW50UGFyYW0gPSBbQ2xpY2tCdWJibGluZ0V2ZW50XTtcclxuICAgIGV4cG9ydCB0eXBlIFRvdWNoU3RhcnRCdWJibGluZ0V2ZW50UGFyYW0gPSBbVG91Y2hTdGFydEJ1YmJsaW5nRXZlbnRdO1xyXG5cclxuICAgIGV4cG9ydCBpbnRlcmZhY2UgRHJhZ0V2ZW50IHtcclxuICAgICAgICByZWFkb25seSBwYWdlWDogbnVtYmVyO1xyXG4gICAgICAgIHJlYWRvbmx5IHBhZ2VZOiBudW1iZXI7XHJcbiAgICAgICAgcmVhZG9ubHkgc2NyZWVuWDogbnVtYmVyO1xyXG4gICAgICAgIHJlYWRvbmx5IHNjcmVlblk6IG51bWJlcjtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgY2xhc3MgQnViYmxpbmdFdmVudCB7XHJcbiAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgIHByaXZhdGUgX2lzUHJvcGFnYXRpb25TdG9wcGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGdldCBuYW1lKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9uYW1lOyB9XHJcbiAgICAgICAgZ2V0IHRhcmdldCgpOiBFdmVudEVtaXR0ZXIgeyByZXR1cm4gdGhpcy5fdGFyZ2V0OyB9XHJcbiAgICAgICAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgKEV2ZW50RW1pdHRlcjpuYW1lc3BhY2UpLihCdWJibGluZ0V2ZW50OmNsYXNzKS50YXJnZXR9IGluc3RlYWQgKi9cclxuICAgICAgICBnZXQgb3JpZ2luKCk6IEV2ZW50RW1pdHRlciB7IHJldHVybiB0aGlzLl90YXJnZXQ7IH1cclxuICAgICAgICBnZXQgaXNQcm9wYWdhdGlvblN0b3BwZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9pc1Byb3BhZ2F0aW9uU3RvcHBlZDsgfVxyXG5cclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfbmFtZTogc3RyaW5nLFxyXG4gICAgICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX3RhcmdldDogRXZlbnRFbWl0dGVyKSB7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzdG9wUHJvcGFnYXRpb24oKTogdm9pZCB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzUHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGNsYXNzIENsaWNrQnViYmxpbmdFdmVudCBleHRlbmRzIEJ1YmJsaW5nRXZlbnQge1xyXG4gICAgICAgIGdldCBtb3VzZUV2ZW50KCk6IE1vdXNlRXZlbnQgeyByZXR1cm4gdGhpcy5fbW91c2VFdmVudDsgfVxyXG5cclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCB0YXJnZXQ6IEV2ZW50RW1pdHRlcixcclxuICAgICAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9tb3VzZUV2ZW50OiBNb3VzZUV2ZW50XHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHN1cGVyKG5hbWUsIHRhcmdldCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBjbGFzcyBUb3VjaFN0YXJ0QnViYmxpbmdFdmVudCBleHRlbmRzIEJ1YmJsaW5nRXZlbnQge1xyXG4gICAgICAgIGdldCB0b3VjaEV2ZW50KCk6IFRvdWNoRXZlbnQgeyByZXR1cm4gdGhpcy5fdG91Y2hFdmVudDsgfVxyXG5cclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCB0YXJnZXQ6IEV2ZW50RW1pdHRlcixcclxuICAgICAgICAgICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF90b3VjaEV2ZW50OiBUb3VjaEV2ZW50XHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHN1cGVyKG5hbWUsIHRhcmdldCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsImltcG9ydCB7IFVuZXhwZWN0ZWROdWxsRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBMYXlvdXRNYW5hZ2VyIH0gZnJvbSAnLi4vbGF5b3V0LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuL2V2ZW50LWVtaXR0ZXInO1xyXG5cclxuLy8gQWRkIG91ciBDaGlsZEV2ZW50IHRvIFdpbmRvd0V2ZW50TWFwIGZvciB0eXBlIHNhZmV0eVxyXG4vKiogQHB1YmxpYyAqL1xyXG5kZWNsYXJlIGdsb2JhbCB7XHJcbiAgICBpbnRlcmZhY2UgV2luZG93RXZlbnRNYXAge1xyXG4gICAgICAgIFtFdmVudEh1Yi5DaGlsZEV2ZW50TmFtZV06IEN1c3RvbUV2ZW50PEV2ZW50SHViLkNoaWxkRXZlbnREZXRhaWw+O1xyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogQW4gRXZlbnRFbWl0dGVyIHNpbmdsZXRvbiB0aGF0IHByb3BhZ2F0ZXMgZXZlbnRzXHJcbiAqIGFjcm9zcyBtdWx0aXBsZSB3aW5kb3dzLiBUaGlzIGlzIGEgbGl0dGxlIGJpdCB0cmlja2llciBzaW5jZVxyXG4gKiB3aW5kb3dzIGFyZSBhbGxvd2VkIHRvIG9wZW4gY2hpbGRXaW5kb3dzIGluIHRoZWlyIG93biByaWdodC5cclxuICpcclxuICogVGhpcyBtZWFucyB0aGF0IHdlIGRlYWwgd2l0aCBhIHRyZWUgb2Ygd2luZG93cy4gVGhlcmVmb3JlLCB3ZSBkbyB0aGUgZXZlbnQgcHJvcGFnYXRpb24gaW4gdHdvIHBoYXNlczpcclxuICpcclxuICogLSBQcm9wYWdhdGUgZXZlbnRzIGZyb20gdGhpcyBsYXlvdXQgdG8gdGhlIHBhcmVudCBsYXlvdXRcclxuICogICAtIFJlcGVhdCB1bnRpbCB0aGUgZXZlbnQgYXJyaXZlZCBhdCB0aGUgcm9vdCBsYXlvdXRcclxuICogLSBQcm9wYWdhdGUgZXZlbnRzIHRvIHRoaXMgbGF5b3V0IGFuZCB0byBhbGwgY2hpbGRyZW5cclxuICogICAtIFJlcGVhdCB1bnRpbCBhbGwgbGF5b3V0cyBnb3QgdGhlIGV2ZW50XHJcbiAqXHJcbiAqICoqV0FSTklORyoqOiBPbmx5IHVzZXJCcm9hZGNhc3QgZXZlbnRzIGFyZSBwcm9wYWdhdGVkIGJldHdlZW4gd2luZG93cy5cclxuICogVGhpcyBtZWFucyB0aGUgeW91IGhhdmUgdG8gdGFrZSBjYXJlIG9mIHByb3BhZ2F0aW5nIHN0YXRlIGNoYW5nZXMgYmV0d2VlbiB3aW5kb3dzIHlvdXJzZWxmLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRXZlbnRIdWIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIHByaXZhdGUgX2NoaWxkRXZlbnRMaXN0ZW5lciA9IChjaGlsZEV2ZW50OiBDdXN0b21FdmVudDxFdmVudEh1Yi5DaGlsZEV2ZW50RGV0YWlsPikgPT4gdGhpcy5vbkV2ZW50RnJvbUNoaWxkKGNoaWxkRXZlbnQpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIG5ldyBFdmVudEh1YiBpbnN0YW5jZVxyXG4gICAgICogQHBhcmFtIF9sYXlvdXRNYW5hZ2VyIC0gdGhlIGxheW91dCBtYW5hZ2VyIHRvIHN5bmNocm9uaXplIGJldHdlZW4gdGhlIHdpbmRvd3NcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICAvKiogQGludGVybmFsICovXHJcbiAgICAgICAgcHJpdmF0ZSBfbGF5b3V0TWFuYWdlcjogTGF5b3V0TWFuYWdlclxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICBnbG9iYWxUaGlzLmFkZEV2ZW50TGlzdGVuZXIoRXZlbnRIdWIuQ2hpbGRFdmVudE5hbWUsIHRoaXMuX2NoaWxkRXZlbnRMaXN0ZW5lciwgeyBwYXNzaXZlOiB0cnVlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRW1pdCBhbiBldmVudCBhbmQgbm90aWZ5IGxpc3RlbmVyc1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnRcclxuICAgICAqIEBwYXJhbSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgbGlzdGVuZXJcclxuICAgICAqIEBwdWJsaWNcclxuICAgICAqL1xyXG4gICAgb3ZlcnJpZGUgZW1pdDxLIGV4dGVuZHMga2V5b2YgRXZlbnRFbWl0dGVyLkV2ZW50UGFyYW1zTWFwPihldmVudE5hbWU6IEssIC4uLmFyZ3M6IEV2ZW50RW1pdHRlci5FdmVudFBhcmFtc01hcFtLXSk6IHZvaWQge1xyXG4gICAgICAgIGlmIChldmVudE5hbWUgPT09ICd1c2VyQnJvYWRjYXN0Jykge1xyXG4gICAgICAgICAgICAvLyBFeHBsaWNpdGx5IHJlZGlyZWN0IHRoZSB1c2VyIGJyb2FkY2FzdCB0byBvdXIgb3ZlcnJpZGRlbiBtZXRob2QuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdFVzZXJCcm9hZGNhc3QoLi4uYXJncyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc3VwZXIuZW1pdChldmVudE5hbWUsIC4uLmFyZ3MpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEJyb2FkY2FzdHMgYSBtZXNzYWdlIHRvIGFsbCBvdGhlciBjdXJyZW50bHkgb3BlbmVkIHdpbmRvd3MuXHJcbiAgICAgKiBAcHVibGljXHJcbiAgICAgKi9cclxuICAgIGVtaXRVc2VyQnJvYWRjYXN0KC4uLmFyZ3M6IEV2ZW50RW1pdHRlci5Vbmtub3duUGFyYW1zKTogdm9pZCB7XHJcbiAgICAgICAgLy8gU3RlcCAxOiBCdWJibGUgdXAgdGhlIGV2ZW50XHJcbiAgICAgICAgdGhpcy5oYW5kbGVVc2VyQnJvYWRjYXN0RXZlbnQoJ3VzZXJCcm9hZGNhc3QnLCBhcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlc3Ryb3lzIHRoZSBFdmVudEh1YlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgZ2xvYmFsVGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKEV2ZW50SHViLkNoaWxkRXZlbnROYW1lLCB0aGlzLl9jaGlsZEV2ZW50TGlzdGVuZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJuYWwgcHJvY2Vzc29yIHRvIHByb2Nlc3MgbG9jYWwgZXZlbnRzLlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlVXNlckJyb2FkY2FzdEV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBhcmdzOiB1bmtub3duW10pIHtcclxuICAgICAgICBpZiAodGhpcy5fbGF5b3V0TWFuYWdlci5pc1N1YldpbmRvdykge1xyXG4gICAgICAgICAgICAvLyBXZSBhcmUgYSBzdWIgd2luZG93IGFuZCByZWNlaXZlZCBhbiBldmVudCBmcm9tIG9uZSBvZiBvdXIgY2hpbGRyZW4uXHJcbiAgICAgICAgICAgIC8vIFNvIHByb3BhZ2F0ZSBpdCB0byB0aGUgUm9vdC5cclxuICAgICAgICAgICAgdGhpcy5wcm9wYWdhdGVUb1BhcmVudChldmVudE5hbWUsIGFyZ3MpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIFdlIGFyZSB0aGUgcm9vdCB3aW5kb3csIHByb3BhZ2F0ZSBpdCB0byB0aGUgc3VidHJlZSBiZWxvdyB1cy5cclxuICAgICAgICAgICAgdGhpcy5wcm9wYWdhdGVUb1RoaXNBbmRTdWJ0cmVlKGV2ZW50TmFtZSwgYXJncyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsbGJhY2sgZm9yIGNoaWxkIGV2ZW50cyByYWlzZWQgb24gdGhlIHdpbmRvd1xyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25FdmVudEZyb21DaGlsZChldmVudDogQ3VzdG9tRXZlbnQ8RXZlbnRIdWIuQ2hpbGRFdmVudERldGFpbD4pIHtcclxuICAgICAgICBjb25zdCBkZXRhaWwgPSBldmVudC5kZXRhaWw7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVVc2VyQnJvYWRjYXN0RXZlbnQoZGV0YWlsLmV2ZW50TmFtZSwgZGV0YWlsLmFyZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvcGFnYXRlcyB0aGUgZXZlbnQgdG8gdGhlIHBhcmVudCBieSBlbWl0dGluZ1xyXG4gICAgICogaXQgb24gdGhlIHBhcmVudCdzIERPTSB3aW5kb3dcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHByb3BhZ2F0ZVRvUGFyZW50KGV2ZW50TmFtZTogc3RyaW5nLCBhcmdzOiB1bmtub3duW10pIHtcclxuICAgICAgICBjb25zdCBkZXRhaWw6IEV2ZW50SHViLkNoaWxkRXZlbnREZXRhaWwgPSB7XHJcbiAgICAgICAgICAgIGxheW91dE1hbmFnZXI6IHRoaXMuX2xheW91dE1hbmFnZXIsXHJcbiAgICAgICAgICAgIGV2ZW50TmFtZSxcclxuICAgICAgICAgICAgYXJnczogYXJncyxcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGV2ZW50SW5pdDogRXZlbnRIdWIuQ2hpbGRFdmVudEluaXQgPSB7XHJcbiAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsXHJcbiAgICAgICAgICAgIGNhbmNlbGFibGU6IHRydWUsXHJcbiAgICAgICAgICAgIGRldGFpbCxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBldmVudCA9IG5ldyBDdXN0b21FdmVudDxFdmVudEh1Yi5DaGlsZEV2ZW50RGV0YWlsPihFdmVudEh1Yi5DaGlsZEV2ZW50TmFtZSwgZXZlbnRJbml0KTtcclxuICAgICAgICBjb25zdCBvcGVuZXIgPSBnbG9iYWxUaGlzLm9wZW5lcjtcclxuICAgICAgICBpZiAob3BlbmVyID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkTnVsbEVycm9yKCdFSFBUUDE1Nzc4JylcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG9wZW5lci5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb3BhZ2F0ZSBldmVudHMgdG8gdGhlIHdob2xlIHN1YnRyZWUgdW5kZXIgdGhpcyBldmVudCBodWIuXHJcbiAgICAgKiBAaW50ZXJuYWxcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBwcm9wYWdhdGVUb1RoaXNBbmRTdWJ0cmVlKGV2ZW50TmFtZTogc3RyaW5nLCBhcmdzOiB1bmtub3duW10pIHtcclxuICAgICAgICB0aGlzLmVtaXRVbmtub3duKGV2ZW50TmFtZSwgLi4uYXJncyk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9sYXlvdXRNYW5hZ2VyLm9wZW5Qb3BvdXRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkR2wgPSB0aGlzLl9sYXlvdXRNYW5hZ2VyLm9wZW5Qb3BvdXRzW2ldLmdldEdsSW5zdGFuY2UoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjaGlsZEdsKSB7XHJcbiAgICAgICAgICAgICAgICBjaGlsZEdsLmV2ZW50SHViLnByb3BhZ2F0ZVRvVGhpc0FuZFN1YnRyZWUoZXZlbnROYW1lLCBhcmdzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBFdmVudEh1YiB7XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgZXhwb3J0IGNvbnN0IENoaWxkRXZlbnROYW1lID0gJ2dsX2NoaWxkX2V2ZW50JztcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBDaGlsZEV2ZW50RGV0YWlsID0ge1xyXG4gICAgICAgIGxheW91dE1hbmFnZXI6IExheW91dE1hbmFnZXI7XHJcbiAgICAgICAgZXZlbnROYW1lOiBzdHJpbmc7XHJcbiAgICAgICAgYXJnczogdW5rbm93bltdO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBleHBvcnQgdHlwZSBDaGlsZEV2ZW50SW5pdCA9IEN1c3RvbUV2ZW50SW5pdDxDaGlsZEV2ZW50RGV0YWlsPjtcclxufVxyXG4iLCJpbXBvcnQgeyBBc3NlcnRFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9pbnRlcm5hbC1lcnJvcic7XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgY29uc3QgZW51bSBJMThuU3RyaW5nSWQge1xyXG4gICAgUG9wb3V0Q2Fubm90QmVDcmVhdGVkV2l0aEdyb3VuZEl0ZW1Db25maWcsXHJcbiAgICBQbGVhc2VSZWdpc3RlckFDb25zdHJ1Y3RvckZ1bmN0aW9uLFxyXG4gICAgQ29tcG9uZW50VHlwZU5vdFJlZ2lzdGVyZWRBbmRCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyTm90QXNzaWduZWQsXHJcbiAgICBDb21wb25lbnRJc0FscmVhZHlSZWdpc3RlcmVkLFxyXG4gICAgQ29tcG9uZW50SXNOb3RWaXJ0dWFibGUsXHJcbiAgICBWaXJ0dWFsQ29tcG9uZW50RG9lc05vdEhhdmVSb290SHRtbEVsZW1lbnQsXHJcbiAgICBJdGVtQ29uZmlnSXNOb3RUeXBlQ29tcG9uZW50LFxyXG4gICAgSW52YWxpZE51bWJlclBhcnRJblNpemVTdHJpbmcsXHJcbiAgICBVbmtub3duVW5pdEluU2l6ZVN0cmluZyxcclxuICAgIFVuc3VwcG9ydGVkVW5pdEluU2l6ZVN0cmluZyxcclxufVxyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBJMThuU3RyaW5ncyB7XHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBsZXQgaW5pdGlhbGlzZWQgPSBmYWxzZTtcclxuXHJcbiAgICAvKiogQGludGVybmFsICovXHJcbiAgICBpbnRlcmZhY2UgSW5mbyB7XHJcbiAgICAgICAgcmVhZG9ubHkgaWQ6IEkxOG5TdHJpbmdJZDtcclxuICAgICAgICByZWFkb25seSBkZWZhdWx0OiBzdHJpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgdHlwZSBJbmZvc09iamVjdCA9IHsgW2lkIGluIGtleW9mIHR5cGVvZiBJMThuU3RyaW5nSWRdOiBJbmZvIH07XHJcblxyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3QgaW5mb3NPYmplY3Q6IEluZm9zT2JqZWN0ID0ge1xyXG4gICAgICAgIFBvcG91dENhbm5vdEJlQ3JlYXRlZFdpdGhHcm91bmRJdGVtQ29uZmlnOiB7XHJcbiAgICAgICAgICAgIGlkOiBJMThuU3RyaW5nSWQuUG9wb3V0Q2Fubm90QmVDcmVhdGVkV2l0aEdyb3VuZEl0ZW1Db25maWcsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6ICdQb3BvdXQgY2Fubm90IGJlIGNyZWF0ZWQgd2l0aCBncm91bmQgSXRlbUNvbmZpZydcclxuICAgICAgICB9LFxyXG4gICAgICAgIFBsZWFzZVJlZ2lzdGVyQUNvbnN0cnVjdG9yRnVuY3Rpb246IHtcclxuICAgICAgICAgICAgaWQ6IEkxOG5TdHJpbmdJZC5QbGVhc2VSZWdpc3RlckFDb25zdHJ1Y3RvckZ1bmN0aW9uLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAnUGxlYXNlIHJlZ2lzdGVyIGEgY29uc3RydWN0b3IgZnVuY3Rpb24nXHJcbiAgICAgICAgfSxcclxuICAgICAgICBDb21wb25lbnRUeXBlTm90UmVnaXN0ZXJlZEFuZEJpbmRDb21wb25lbnRFdmVudEhhbmRsZXJOb3RBc3NpZ25lZDoge1xyXG4gICAgICAgICAgICBpZDogSTE4blN0cmluZ0lkLkNvbXBvbmVudFR5cGVOb3RSZWdpc3RlcmVkQW5kQmluZENvbXBvbmVudEV2ZW50SGFuZGxlck5vdEFzc2lnbmVkLFxyXG4gICAgICAgICAgICBkZWZhdWx0OiAnQ29tcG9uZW50IHR5cGUgbm90IHJlZ2lzdGVyZWQgYW5kIEJpbmRDb21wb25lbnRFdmVudCBoYW5kbGVyIG5vdCBhc3NpZ25lZCcsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBDb21wb25lbnRJc0FscmVhZHlSZWdpc3RlcmVkOiB7XHJcbiAgICAgICAgICAgIGlkOiBJMThuU3RyaW5nSWQuQ29tcG9uZW50SXNBbHJlYWR5UmVnaXN0ZXJlZCxcclxuICAgICAgICAgICAgZGVmYXVsdDogJ0NvbXBvbmVudCBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQnLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgQ29tcG9uZW50SXNOb3RWaXJ0dWFibGU6IHtcclxuICAgICAgICAgICAgaWQ6IEkxOG5TdHJpbmdJZC5Db21wb25lbnRJc05vdFZpcnR1YWJsZSxcclxuICAgICAgICAgICAgZGVmYXVsdDogJ0NvbXBvbmVudCBpcyBub3QgdmlydHVhYmxlLiBSZXF1aXJlcyByb290SHRtbEVsZW1lbnQgZmllbGQvZ2V0dGVyJyxcclxuICAgICAgICB9LFxyXG4gICAgICAgIFZpcnR1YWxDb21wb25lbnREb2VzTm90SGF2ZVJvb3RIdG1sRWxlbWVudDoge1xyXG4gICAgICAgICAgICBpZDogSTE4blN0cmluZ0lkLlZpcnR1YWxDb21wb25lbnREb2VzTm90SGF2ZVJvb3RIdG1sRWxlbWVudCxcclxuICAgICAgICAgICAgZGVmYXVsdDogJ1ZpcnR1YWwgY29tcG9uZW50IGRvZXMgbm90IGhhdmUgZ2V0dGVyIFwicm9vdEh0bWxFbGVtZW50XCInLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgSXRlbUNvbmZpZ0lzTm90VHlwZUNvbXBvbmVudDoge1xyXG4gICAgICAgICAgICBpZDogSTE4blN0cmluZ0lkLkl0ZW1Db25maWdJc05vdFR5cGVDb21wb25lbnQsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6ICdJdGVtQ29uZmlnIGlzIG5vdCBvZiB0eXBlIGNvbXBvbmVudCcsXHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgSW52YWxpZE51bWJlclBhcnRJblNpemVTdHJpbmc6IHtcclxuICAgICAgICAgICAgaWQ6IEkxOG5TdHJpbmdJZC5JbnZhbGlkTnVtYmVyUGFydEluU2l6ZVN0cmluZyxcclxuICAgICAgICAgICAgZGVmYXVsdDogJ0ludmFsaWQgbnVtYmVyIHBhcnQgaW4gc2l6ZSBzdHJpbmcnLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgVW5rbm93blVuaXRJblNpemVTdHJpbmc6IHtcclxuICAgICAgICAgICAgaWQ6IEkxOG5TdHJpbmdJZC5Vbmtub3duVW5pdEluU2l6ZVN0cmluZyxcclxuICAgICAgICAgICAgZGVmYXVsdDogJ1Vua25vd24gdW5pdCBpbiBzaXplIHN0cmluZycsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBVbnN1cHBvcnRlZFVuaXRJblNpemVTdHJpbmc6IHtcclxuICAgICAgICAgICAgaWQ6IEkxOG5TdHJpbmdJZC5VbnN1cHBvcnRlZFVuaXRJblNpemVTdHJpbmcsXHJcbiAgICAgICAgICAgIGRlZmF1bHQ6ICdVbnN1cHBvcnRlZCB1bml0IGluIHNpemUgc3RyaW5nJyxcclxuICAgICAgICB9LFxyXG4gICAgfVxyXG5cclxuICAgIGV4cG9ydCBjb25zdCBpZENvdW50ID0gT2JqZWN0LmtleXMoaW5mb3NPYmplY3QpLmxlbmd0aDtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0IGluZm9zID0gT2JqZWN0LnZhbHVlcyhpbmZvc09iamVjdCk7XHJcblxyXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSW5pdGlhbGlzZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIWluaXRpYWxpc2VkKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWRDb3VudDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbmZvID0gaW5mb3NbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5mby5pZCAhPT0gaSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRFcnJvcignSU5TSTAwMTEwJywgYCR7aX06ICR7aW5mby5pZH1gKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaTE4blN0cmluZ3NbaV0gPSBpbmZvLmRlZmF1bHQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaW5pdGlhbGlzZWQgPSB0cnVlO1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgY29uc3QgaTE4blN0cmluZ3MgPSBuZXcgQXJyYXk8c3RyaW5nPihJMThuU3RyaW5ncy5pZENvdW50KTtcclxuIiwiLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBTdHlsZUNvbnN0YW50cyB7XHJcbiAgICBleHBvcnQgY29uc3QgZGVmYXVsdENvbXBvbmVudEJhc2VaSW5kZXggPSAnYXV0byc7XHJcbiAgICBleHBvcnQgY29uc3QgZGVmYXVsdENvbXBvbmVudERyYWdaSW5kZXggPSAnMzInO1xyXG4gICAgZXhwb3J0IGNvbnN0IGRlZmF1bHRDb21wb25lbnRTdGFja01heGltaXNlZFpJbmRleCA9ICc0MSc7XHJcbn1cclxuIiwiaW1wb3J0IHsgVW5yZWFjaGFibGVDYXNlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvaW50ZXJuYWwtZXJyb3InO1xyXG5pbXBvcnQgeyBTdHlsZUNvbnN0YW50cyB9IGZyb20gJy4vc3R5bGUtY29uc3RhbnRzJztcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IHR5cGUgV2lkdGhPckhlaWdodFByb3BlcnR5TmFtZSA9ICd3aWR0aCcgfCAnaGVpZ2h0JztcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBXaWR0aE9ySGVpZ2h0UHJvcGVydHlOYW1lIHtcclxuICAgIGV4cG9ydCBjb25zdCB3aWR0aCA9ICd3aWR0aCc7XHJcbiAgICBleHBvcnQgY29uc3QgaGVpZ2h0ID0gJ2hlaWdodCc7XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGludGVyZmFjZSBXaWR0aEFuZEhlaWdodCB7XHJcbiAgICB3aWR0aDogbnVtYmVyO1xyXG4gICAgaGVpZ2h0OiBudW1iZXI7XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGludGVyZmFjZSBMZWZ0QW5kVG9wIHtcclxuICAgIGxlZnQ6IG51bWJlcjtcclxuICAgIHRvcDogbnVtYmVyO1xyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgdHlwZSBTaWRlID0gJ3RvcCcgfCAnbGVmdCcgfCAncmlnaHQnIHwgJ2JvdHRvbSc7XHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgU2lkZSB7XHJcbiAgICBleHBvcnQgY29uc3QgdG9wID0gJ3RvcCc7XHJcbiAgICBleHBvcnQgY29uc3QgbGVmdCA9ICdsZWZ0JztcclxuICAgIGV4cG9ydCBjb25zdCByaWdodCA9ICdyaWdodCc7XHJcbiAgICBleHBvcnQgY29uc3QgYm90dG9tID0gJ2JvdHRvbSc7XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCB0eXBlIExvZ2ljYWxaSW5kZXggPSAnYmFzZScgfCAnZHJhZycgfCAnc3RhY2tNYXhpbWlzZWQnO1xyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIExvZ2ljYWxaSW5kZXgge1xyXG4gICAgZXhwb3J0IGNvbnN0IGJhc2UgPSAnYmFzZSc7XHJcbiAgICBleHBvcnQgY29uc3QgZHJhZyA9ICdkcmFnJztcclxuICAgIGV4cG9ydCBjb25zdCBzdGFja01heGltaXNlZCA9ICdzdGFja01heGltaXNlZCc7XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBjb25zdCBMb2dpY2FsWkluZGV4VG9EZWZhdWx0TWFwID0ge1xyXG4gICAgYmFzZTogU3R5bGVDb25zdGFudHMuZGVmYXVsdENvbXBvbmVudEJhc2VaSW5kZXgsXHJcbiAgICBkcmFnOiBTdHlsZUNvbnN0YW50cy5kZWZhdWx0Q29tcG9uZW50RHJhZ1pJbmRleCxcclxuICAgIHN0YWNrTWF4aW1pc2VkOiBTdHlsZUNvbnN0YW50cy5kZWZhdWx0Q29tcG9uZW50U3RhY2tNYXhpbWlzZWRaSW5kZXgsXHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGludGVyZmFjZSBSZWN0IHtcclxuICAgIGxlZnQ6IG51bWJlcixcclxuICAgIHRvcDogbnVtYmVyLFxyXG4gICAgd2lkdGg6IG51bWJlcixcclxuICAgIGhlaWdodDogbnVtYmVyLFxyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXJlYUxpbmtlZFJlY3Qge1xyXG4gICAgeDE6IG51bWJlciwgLy8gbGVmdFxyXG4gICAgeDI6IG51bWJlciwgLy8gbmV4dExlZnRcclxuICAgIHkxOiBudW1iZXIsIC8vIHRvcFxyXG4gICAgeTI6IG51bWJlciwgLy8gbmV4dFRvcFxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xyXG5leHBvcnQgdHlwZSBKc29uVmFsdWUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCB8IEpzb24gfCBvYmplY3QgfCBKc29uVmFsdWVBcnJheTtcclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBKc29uIHtcclxuICAgIFtuYW1lOiBzdHJpbmddOiBKc29uVmFsdWU7XHJcbn1cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IHR5cGUgSnNvblZhbHVlQXJyYXkgPSBBcnJheTxKc29uVmFsdWU+XHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgSnNvblZhbHVlIHtcclxuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0pzb24odmFsdWU6IEpzb25WYWx1ZSk6IHZhbHVlIGlzIEpzb24ge1xyXG4gICAgICAgIHJldHVybiBpc0pzb25PYmplY3QodmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNKc29uT2JqZWN0KHZhbHVlOiBKc29uVmFsdWUpOiB2YWx1ZSBpcyBKc29uIHwgb2JqZWN0IHtcclxuICAgICAgICByZXR1cm4gIUFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCc7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCB0eXBlIEl0ZW1UeXBlID0gJ2dyb3VuZCcgfCAncm93JyB8ICdjb2x1bW4nIHwgJ3N0YWNrJyB8ICdjb21wb25lbnQnO1xyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IG5hbWVzcGFjZSBJdGVtVHlwZSB7XHJcbiAgICBleHBvcnQgY29uc3QgZ3JvdW5kID0gJ2dyb3VuZCc7XHJcbiAgICBleHBvcnQgY29uc3Qgcm93ID0gJ3Jvdyc7XHJcbiAgICBleHBvcnQgY29uc3QgY29sdW1uID0gJ2NvbHVtbic7XHJcbiAgICBleHBvcnQgY29uc3Qgc3RhY2sgPSAnc3RhY2snO1xyXG4gICAgZXhwb3J0IGNvbnN0IGNvbXBvbmVudCA9ICdjb21wb25lbnQnO1xyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgdHlwZSBSZXNwb25zaXZlTW9kZSA9ICdub25lJyB8ICdhbHdheXMnIHwgJ29ubG9hZCc7XHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgUmVzcG9uc2l2ZU1vZGUge1xyXG4gICAgZXhwb3J0IGNvbnN0IG5vbmUgPSAnbm9uZSc7XHJcbiAgICBleHBvcnQgY29uc3QgYWx3YXlzID0gJ2Fsd2F5cyc7XHJcbiAgICBleHBvcnQgY29uc3Qgb25sb2FkID0gJ29ubG9hZCc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBMZW5ndGggdW5pdHMgd2hpY2ggY2FuIHNwZWNpZnkgdGhlIHNpemUgb2YgYSBDb21wb25lbnQgSXRlbVxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBTaXplVW5pdCA9ICdweCcgfCAnJScgfCAnZnInIHwgJ2VtJztcclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBlbnVtIFNpemVVbml0RW51bSB7XHJcbiAgICBQaXhlbCA9ICdweCcsXHJcbiAgICBQZXJjZW50ID0gJyUnLFxyXG4gICAgRnJhY3Rpb25hbCA9ICdmcicsXHJcbiAgICBFbSA9ICdlbScsXHJcbn1cclxuXHJcbi8qKiBAcHVibGljICovXHJcbmV4cG9ydCBuYW1lc3BhY2UgU2l6ZVVuaXRFbnVtIHtcclxuICAgIGV4cG9ydCBmdW5jdGlvbiB0cnlQYXJzZSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xyXG4gICAgICAgICAgICBjYXNlIFNpemVVbml0RW51bS5QaXhlbDogcmV0dXJuIFNpemVVbml0RW51bS5QaXhlbDtcclxuICAgICAgICAgICAgY2FzZSBTaXplVW5pdEVudW0uUGVyY2VudDogcmV0dXJuIFNpemVVbml0RW51bS5QZXJjZW50O1xyXG4gICAgICAgICAgICBjYXNlIFNpemVVbml0RW51bS5GcmFjdGlvbmFsOiByZXR1cm4gU2l6ZVVuaXRFbnVtLkZyYWN0aW9uYWw7XHJcbiAgICAgICAgICAgIGNhc2UgU2l6ZVVuaXRFbnVtLkVtOiByZXR1cm4gU2l6ZVVuaXRFbnVtLkVtO1xyXG4gICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgZnVuY3Rpb24gZm9ybWF0KHZhbHVlOiBTaXplVW5pdEVudW0pIHtcclxuICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgU2l6ZVVuaXRFbnVtLlBpeGVsOiByZXR1cm4gU2l6ZVVuaXRFbnVtLlBpeGVsO1xyXG4gICAgICAgICAgICBjYXNlIFNpemVVbml0RW51bS5QZXJjZW50OiByZXR1cm4gU2l6ZVVuaXRFbnVtLlBlcmNlbnQ7XHJcbiAgICAgICAgICAgIGNhc2UgU2l6ZVVuaXRFbnVtLkZyYWN0aW9uYWw6IHJldHVybiBTaXplVW5pdEVudW0uRnJhY3Rpb25hbDtcclxuICAgICAgICAgICAgY2FzZSBTaXplVW5pdEVudW0uRW06IHJldHVybiBTaXplVW5pdEVudW0uRW07XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWFjaGFibGVDYXNlRXJyb3IoJ1NVRUY0NDk5OCcsIHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgTGVmdEFuZFRvcCwgV2lkdGhBbmRIZWlnaHQgfSBmcm9tICcuL3R5cGVzJztcclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG51bWJlclRvUGl4ZWxzKHZhbHVlOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKDEwKSArICdweCc7XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHBpeGVsc1RvTnVtYmVyKHZhbHVlOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgY29uc3QgbnVtYmVyU3RyID0gdmFsdWUucmVwbGFjZShcInB4XCIsIFwiXCIpO1xyXG4gICAgcmV0dXJuIHBhcnNlRmxvYXQobnVtYmVyU3RyKTtcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNwbGl0U3RyaW5nQXRGaXJzdE5vbk51bWVyaWNDaGFyUmVzdWx0IHtcclxuICAgIG51bWVyaWNQYXJ0OiBzdHJpbmc7XHJcbiAgICBmaXJzdE5vbk51bWVyaWNDaGFyUGFydDogc3RyaW5nO1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBzcGxpdFN0cmluZ0F0Rmlyc3ROb25OdW1lcmljQ2hhcih2YWx1ZTogc3RyaW5nKTogU3BsaXRTdHJpbmdBdEZpcnN0Tm9uTnVtZXJpY0NoYXJSZXN1bHQge1xyXG4gICAgdmFsdWUgPSB2YWx1ZS50cmltU3RhcnQoKTtcclxuXHJcbiAgICBjb25zdCBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XHJcbiAgICBpZiAobGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIHsgbnVtZXJpY1BhcnQ6ICcnLCBmaXJzdE5vbk51bWVyaWNDaGFyUGFydDogJycgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgZmlyc3ROb25EaWdpdFBhcnRJbmRleCA9IGxlbmd0aDtcclxuICAgICAgICBsZXQgZ290RGVjaW1hbFBvaW50ID0gZmFsc2U7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjaGFyID0gdmFsdWVbaV07XHJcbiAgICAgICAgICAgIGlmICghaXNEaWdpdChjaGFyKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNoYXIgIT09ICcuJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpcnN0Tm9uRGlnaXRQYXJ0SW5kZXggPSBpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZ290RGVjaW1hbFBvaW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Tm9uRGlnaXRQYXJ0SW5kZXggPSBpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBnb3REZWNpbWFsUG9pbnQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBkaWdpdHNQYXJ0ID0gdmFsdWUuc3Vic3RyaW5nKDAsIGZpcnN0Tm9uRGlnaXRQYXJ0SW5kZXgpO1xyXG4gICAgICAgIGNvbnN0IGZpcnN0Tm9uRGlnaXRQYXJ0ID0gdmFsdWUuc3Vic3RyaW5nKGZpcnN0Tm9uRGlnaXRQYXJ0SW5kZXgpLnRyaW0oKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHsgbnVtZXJpY1BhcnQ6IGRpZ2l0c1BhcnQsIGZpcnN0Tm9uTnVtZXJpY0NoYXJQYXJ0OiBmaXJzdE5vbkRpZ2l0UGFydCB9O1xyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0RpZ2l0KGNoYXI6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIGNoYXIgPj0gJzAnICYmIGNoYXIgPD0gJzknO1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRFbGVtZW50V2lkdGgoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIGVsZW1lbnQub2Zmc2V0V2lkdGg7XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNldEVsZW1lbnRXaWR0aChlbGVtZW50OiBIVE1MRWxlbWVudCwgd2lkdGg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgY29uc3Qgd2lkdGhBc1BpeGVscyA9IG51bWJlclRvUGl4ZWxzKE1hdGgubWF4KDAsIHdpZHRoKSk7XHJcbiAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gd2lkdGhBc1BpeGVscztcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWxlbWVudEhlaWdodChlbGVtZW50OiBIVE1MRWxlbWVudCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gZWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbn1cclxuXHJcbi8qKiBAaW50ZXJuYWwgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHNldEVsZW1lbnRIZWlnaHQoZWxlbWVudDogSFRNTEVsZW1lbnQsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBjb25zdCBoZWlnaHRBc1BpeGVscyA9IG51bWJlclRvUGl4ZWxzKE1hdGgubWF4KDAsIGhlaWdodCkpO1xyXG4gICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSBoZWlnaHRBc1BpeGVscztcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWxlbWVudFdpZHRoQW5kSGVpZ2h0KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogV2lkdGhBbmRIZWlnaHQge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICB3aWR0aDogZWxlbWVudC5vZmZzZXRXaWR0aCxcclxuICAgICAgICBoZWlnaHQ6IGVsZW1lbnQub2Zmc2V0SGVpZ2h0LFxyXG4gICAgfTtcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWxlbWVudENsaWVudFdpZHRoQW5kSGVpZ2h0KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogV2lkdGhBbmRIZWlnaHQge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICB3aWR0aDogZWxlbWVudC5jbGllbnRXaWR0aCxcclxuICAgICAgICBoZWlnaHQ6IGVsZW1lbnQuY2xpZW50SGVpZ2h0LFxyXG4gICAgfTtcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2luZG93VG9wTGVmdEJvcmRlcih3aW5kb3c6IFdpbmRvdyB8IHR5cGVvZiBnbG9iYWxUaGlzKTogV2lkdGhBbmRIZWlnaHQge1xyXG4gICAgbGV0IGlubmVyU2NyZWVuWDogbnVtYmVyIHwgdW5kZWZpbmVkID0gKDxhbnk+d2luZG93KS5tb3pJbm5lclNjcmVlblg7XHJcbiAgICBsZXQgaW5uZXJTY3JlZW5ZOiBudW1iZXIgfCB1bmRlZmluZWQgPSAoPGFueT53aW5kb3cpLm1veklubmVyU2NyZWVuWTtcclxuICAgIGxldCBib3JkZXJYOiBudW1iZXIsIGJvcmRlclk6IG51bWJlcjtcclxuXHJcbiAgICBpZiAoaW5uZXJTY3JlZW5YID09PSB1bmRlZmluZWQgfHwgaW5uZXJTY3JlZW5ZID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBib3JkZXJYID0gKHdpbmRvdy5vdXRlcldpZHRoIC0gd2luZG93LmlubmVyV2lkdGgpIC8gMjsgICAgICAgIC8vIEFzc3VtZSBsZWZ0IC8gcmlnaHQgYm9yZGVyIGlzIHRoZSBzYW1lXHJcbiAgICAgICAgYm9yZGVyWSA9IHdpbmRvdy5vdXRlckhlaWdodCAtIHdpbmRvdy5pbm5lckhlaWdodCAtIGJvcmRlclg7ICAvLyBBc3N1bWUgYm90dG9tIGJvcmRlciBpcyB0aGUgc2FtZSBhcyBsZWZ0IC8gcmlnaHRcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYm9yZGVyWCA9IGlubmVyU2NyZWVuWCAtIHdpbmRvdy5zY3JlZW5YO1xyXG4gICAgICAgIGJvcmRlclkgPSBpbm5lclNjcmVlblkgLSB3aW5kb3cuc2NyZWVuWTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyB3aWR0aDogTWF0aC5tYXgoMCwgYm9yZGVyWCksIGhlaWdodDogTWF0aC5tYXgoMCwgYm9yZGVyWSkgfVxyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRXaW5kb3dJbm5lclNjcmVlblBvc2l0aW9uKHdpbmRvdzogV2luZG93IHwgdHlwZW9mIGdsb2JhbFRoaXMpOiBMZWZ0QW5kVG9wIHtcclxuICAgIGxldCBpbm5lclNjcmVlblg6IG51bWJlciB8IHVuZGVmaW5lZCA9ICg8YW55PndpbmRvdykubW96SW5uZXJTY3JlZW5YO1xyXG4gICAgbGV0IGlubmVyU2NyZWVuWTogbnVtYmVyIHwgdW5kZWZpbmVkID0gKDxhbnk+d2luZG93KS5tb3pJbm5lclNjcmVlblk7XHJcblxyXG4gICAgaWYgKGlubmVyU2NyZWVuWCA9PT0gdW5kZWZpbmVkIHx8IGlubmVyU2NyZWVuWSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgY29uc3QgYm9yZGVyID0gZ2V0V2luZG93VG9wTGVmdEJvcmRlcih3aW5kb3cpO1xyXG4gICAgICAgIGlubmVyU2NyZWVuWCA9IHdpbmRvdy5zY3JlZW5YICsgYm9yZGVyLndpZHRoO1xyXG4gICAgICAgIGlubmVyU2NyZWVuWSA9IHdpbmRvdy5zY3JlZW5ZICsgYm9yZGVyLmhlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyBsZWZ0OiBpbm5lclNjcmVlblgsIHRvcDogaW5uZXJTY3JlZW5ZIH07XHJcbn1cclxuXHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRFbGVtZW50RGlzcGxheVZpc2liaWxpdHkoZWxlbWVudDogSFRNTEVsZW1lbnQsIHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmICh2aXNpYmxlKSB7XHJcbiAgICAgICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlRWxlbWVudFBvc2l0aW9uQWJzb2x1dGUoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGFic29sdXRlUG9zaXRpb24gPSAnYWJzb2x1dGUnO1xyXG4gICAgaWYgKGVsZW1lbnQuc3R5bGUucG9zaXRpb24gIT09IGFic29sdXRlUG9zaXRpb24pIHtcclxuICAgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gYWJzb2x1dGVQb3NpdGlvbjtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFJlcGxhY2VtZW50IGZvciBKUXVlcnkgJC5leHRlbmQodGFyZ2V0LCBvYmopXHJcbiAqIEBpbnRlcm5hbFxyXG4qL1xyXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kKHRhcmdldDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcclxuICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICAgICAgdGFyZ2V0W2tleV0gPSBvYmpba2V5XTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGFyZ2V0O1xyXG59XHJcblxyXG4vKipcclxuICogUmVwbGFjZW1lbnQgZm9yIEpRdWVyeSAkLmV4dGVuZCh0cnVlLCB0YXJnZXQsIG9iailcclxuICogQGludGVybmFsXHJcbiovXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWVwRXh0ZW5kKHRhcmdldDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XHJcbiAgICBpZiAob2JqICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcclxuICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdUYXJnZXQgPSB0YXJnZXRba2V5XTtcclxuICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gZGVlcEV4dGVuZFZhbHVlKGV4aXN0aW5nVGFyZ2V0LCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRhcmdldDtcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZGVlcEV4dGVuZFZhbHVlKGV4aXN0aW5nVGFyZ2V0OiB1bmtub3duLCB2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICAgICAgICBjb25zdCBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7XHJcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldEFycmF5ID0gbmV3IEFycmF5PHVua25vd24+KGxlbmd0aCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB2YWx1ZVtpXTtcclxuICAgICAgICAgICAgICAgIHRhcmdldEFycmF5W2ldID0gZGVlcEV4dGVuZFZhbHVlKHt9LCBlbGVtZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0QXJyYXk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlT2JqID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XHJcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdUYXJnZXQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWVwRXh0ZW5kKHt9LCB2YWx1ZU9iaik7IC8vIG92ZXJ3cml0ZVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV4aXN0aW5nVGFyZ2V0ICE9PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWVwRXh0ZW5kKHt9LCB2YWx1ZU9iaik7IC8vIG92ZXJ3cml0ZVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGV4aXN0aW5nVGFyZ2V0KSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZXBFeHRlbmQoe30sIHZhbHVlT2JqKTsgLy8gb3ZlcndyaXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdUYXJnZXQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVlcEV4dGVuZCh7fSwgdmFsdWVPYmopOyAvLyBvdmVyd3JpdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdUYXJnZXRPYmogPSBleGlzdGluZ1RhcmdldCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVlcEV4dGVuZChleGlzdGluZ1RhcmdldE9iaiwgdmFsdWVPYmopOyAvLyBtZXJnZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVGcm9tQXJyYXk8VD4oaXRlbTogVCwgYXJyYXk6IFRbXSk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5kZXggPSBhcnJheS5pbmRleE9mKGl0ZW0pO1xyXG5cclxuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgcmVtb3ZlIGl0ZW0gZnJvbSBhcnJheS4gSXRlbSBpcyBub3QgaW4gdGhlIGFycmF5Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXJyYXkuc3BsaWNlKGluZGV4LCAxKTtcclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VW5pcXVlSWQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDAwMDAwMDAwMDApXHJcbiAgICAgICAgLnRvU3RyaW5nKDM2KVxyXG4gICAgICAgIC5yZXBsYWNlKCcuJywgJycpO1xyXG59XHJcblxyXG4vKiogQGludGVybmFsICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRFcnJvck1lc3NhZ2UoZTogdW5rbm93bik6IHN0cmluZyB7XHJcbiAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yKSB7XHJcbiAgICAgICAgcmV0dXJuIGUubWVzc2FnZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICByZXR1cm4gZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gJ1Vua25vd24gRXJyb3InO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuLyoqIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZGVib3VuY2U8RiBleHRlbmRzICguLi5hcmdzOiBQYXJhbWV0ZXJzPEY+KSA9PiBSZXR1cm5UeXBlPEY+PihmdW5jOiBGLCB3YWl0Rm9yID0gMTUwKSB7XHJcbiAgICBsZXQgdGltZW91dDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XHJcblxyXG4gICAgY29uc3QgZGVib3VuY2VkID0gKC4uLmFyZ3M6IFBhcmFtZXRlcnM8Rj4pID0+IHtcclxuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XHJcbiAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gZnVuYyguLi5hcmdzKSwgd2FpdEZvcik7XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBkZWJvdW5jZWQ7XHJcbn0iLCJpbXBvcnQgeyBMYXlvdXRDb25maWcgfSBmcm9tICcuL2NvbmZpZy9jb25maWcnO1xyXG5pbXBvcnQgeyBSZXNvbHZlZENvbXBvbmVudEl0ZW1Db25maWcsIFJlc29sdmVkTGF5b3V0Q29uZmlnLCBSZXNvbHZlZFBvcG91dExheW91dENvbmZpZyB9IGZyb20gJy4vY29uZmlnL3Jlc29sdmVkLWNvbmZpZyc7XHJcbmltcG9ydCB7IENvbXBvbmVudENvbnRhaW5lciB9IGZyb20gJy4vY29udGFpbmVyL2NvbXBvbmVudC1jb250YWluZXInO1xyXG5pbXBvcnQgeyBCaW5kRXJyb3IgfSBmcm9tICcuL2Vycm9ycy9leHRlcm5hbC1lcnJvcic7XHJcbmltcG9ydCB7IFVuZXhwZWN0ZWRVbmRlZmluZWRFcnJvciB9IGZyb20gJy4vZXJyb3JzL2ludGVybmFsLWVycm9yJztcclxuaW1wb3J0IHsgTGF5b3V0TWFuYWdlciB9IGZyb20gJy4vbGF5b3V0LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBEb21Db25zdGFudHMgfSBmcm9tICcuL3V0aWxzL2RvbS1jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBJMThuU3RyaW5nSWQsIGkxOG5TdHJpbmdzIH0gZnJvbSAnLi91dGlscy9pMThuLXN0cmluZ3MnO1xyXG5cclxuLyoqIEBwdWJsaWMgKi9cclxuZXhwb3J0IGNsYXNzIFZpcnR1YWxMYXlvdXQgZXh0ZW5kcyBMYXlvdXRNYW5hZ2VyIHtcclxuICAgIC8qKlxyXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAoVmlydHVhbExheW91dDpjbGFzcykuYmluZENvbXBvbmVudEV2ZW50fSBhbmRcclxuICAgICAqIHtAbGluayAoVmlydHVhbExheW91dDpjbGFzcykudW5iaW5kQ29tcG9uZW50RXZlbnR9IHdpdGggdmlydHVhbCBjb21wb25lbnRzXHJcbiAgICAgKi9cclxuICAgIGdldENvbXBvbmVudEV2ZW50OiBWaXJ0dWFsTGF5b3V0LkdldENvbXBvbmVudEV2ZW50SGFuZGxlciB8IHVuZGVmaW5lZDtcclxuICAgIC8qKlxyXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAoVmlydHVhbExheW91dDpjbGFzcykuYmluZENvbXBvbmVudEV2ZW50fSBhbmRcclxuICAgICAqIHtAbGluayAoVmlydHVhbExheW91dDpjbGFzcykudW5iaW5kQ29tcG9uZW50RXZlbnR9IHdpdGggdmlydHVhbCBjb21wb25lbnRzXHJcbiAgICAgKi9cclxuICAgIHJlbGVhc2VDb21wb25lbnRFdmVudDogVmlydHVhbExheW91dC5SZWxlYXNlQ29tcG9uZW50RXZlbnRIYW5kbGVyIHwgdW5kZWZpbmVkO1xyXG5cclxuICAgIGJpbmRDb21wb25lbnRFdmVudDogVmlydHVhbExheW91dC5CaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyIHwgdW5kZWZpbmVkO1xyXG4gICAgdW5iaW5kQ29tcG9uZW50RXZlbnQ6IFZpcnR1YWxMYXlvdXQuVW5iaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyIHwgdW5kZWZpbmVkO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgQGRlcHJlY2F0ZWQgdXNlIHdoaWxlIGNvbnN0cnVjdG9yIGlzIG5vdCBkZXRlcm1pbmF0ZSAqL1xyXG4gICAgcHJpdmF0ZSBfYmluZENvbXBvbmVudEV2ZW50SGFubGRlclBhc3NlZEluQ29uc3RydWN0b3IgPSBmYWxzZTsgLy8gcmVtb3ZlIHdoZW4gY29uc3RydWN0b3IgaXMgZGV0ZXJtaW5hdGVcclxuICAgIC8qKiBAaW50ZXJuYWwgIEBkZXByZWNhdGVkIHVzZSB3aGlsZSBjb25zdHJ1Y3RvciBpcyBub3QgZGV0ZXJtaW5hdGUgKi9cclxuICAgIHByaXZhdGUgX2NyZWF0aW9uVGltZW91dFBhc3NlZCA9IGZhbHNlOyAvLyByZW1vdmUgd2hlbiBjb25zdHJ1Y3RvciBpcyBkZXRlcm1pbmF0ZVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIGNvbnRhaW5lciAtIEEgRG9tIEhUTUwgZWxlbWVudC4gRGVmYXVsdHMgdG8gYm9keVxyXG4gICAgICogQHBhcmFtIGJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIHRvIGJpbmQgY29tcG9uZW50c1xyXG4gICAgICogQHBhcmFtIGJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIHRvIHVuYmluZCBjb21wb25lbnRzXHJcbiAgICAgKiBJZiBiaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyIGlzIGRlZmluZWQsIHRoZW4gY29uc3RydWN0b3Igd2lsbCBiZSBkZXRlcm1pbmF0ZS4gSXQgd2lsbCBhbHdheXMgY2FsbCB0aGUgaW5pdCgpXHJcbiAgICAgKiBmdW5jdGlvbiBhbmQgdGhlIGluaXQoKSBmdW5jdGlvbiB3aWxsIGFsd2F5cyBjb21wbGV0ZS4gVGhpcyBtZWFucyB0aGF0IHRoZSBiaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyIHdpbGwgYmUgY2FsbGVkXHJcbiAgICAgKiBpZiBjb25zdHJ1Y3RvciBpcyBmb3IgYSBwb3BvdXQgd2luZG93LiBNYWtlIHN1cmUgYmluZENvbXBvbmVudEV2ZW50SGFuZGxlciBpcyByZWFkeSBmb3IgZXZlbnRzLlxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBjb250YWluZXI/OiBIVE1MRWxlbWVudCxcclxuICAgICAgICBiaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyPzogVmlydHVhbExheW91dC5CaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyLFxyXG4gICAgICAgIHVuYmluZENvbXBvbmVudEV2ZW50SGFuZGxlcj86IFZpcnR1YWxMYXlvdXQuVW5iaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyLFxyXG4gICAgKTtcclxuICAgIC8qKiBAZGVwcmVjYXRlZCBzcGVjaWZ5IGxheW91dENvbmZpZyBpbiB7QGxpbmsgKExheW91dE1hbmFnZXI6Y2xhc3MpLmxvYWRMYXlvdXR9ICovXHJcbiAgICBjb25zdHJ1Y3Rvcihjb25maWc6IExheW91dENvbmZpZywgY29udGFpbmVyPzogSFRNTEVsZW1lbnQpO1xyXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xyXG4gICAgY29uc3RydWN0b3IoY29uZmlnT3JPcHRpb25hbENvbnRhaW5lcjogTGF5b3V0Q29uZmlnIHwgSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgY29udGFpbmVyT3JCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyOiBIVE1MRWxlbWVudCB8IFZpcnR1YWxMYXlvdXQuQmluZENvbXBvbmVudEV2ZW50SGFuZGxlciB8IHVuZGVmaW5lZCxcclxuICAgICAgICB1bmJpbmRDb21wb25lbnRFdmVudEhhbmRsZXI6IFZpcnR1YWxMYXlvdXQuVW5iaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIHNraXBJbml0OiB0cnVlLFxyXG4gICAgKTtcclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZ09yT3B0aW9uYWxDb250YWluZXI6IExheW91dENvbmZpZyB8IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIGNvbnRhaW5lck9yQmluZENvbXBvbmVudEV2ZW50SGFuZGxlcj86IEhUTUxFbGVtZW50IHwgVmlydHVhbExheW91dC5CaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyLFxyXG4gICAgICAgIHVuYmluZENvbXBvbmVudEV2ZW50SGFuZGxlcj86IFZpcnR1YWxMYXlvdXQuVW5iaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyLFxyXG4gICAgICAgIHNraXBJbml0PzogdHJ1ZSxcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKFZpcnR1YWxMYXlvdXQuY3JlYXRlTGF5b3V0TWFuYWdlckNvbnN0cnVjdG9yUGFyYW1ldGVycyhjb25maWdPck9wdGlvbmFsQ29udGFpbmVyLCBjb250YWluZXJPckJpbmRDb21wb25lbnRFdmVudEhhbmRsZXIpKTtcclxuXHJcbiAgICAgICAgaWYgKGNvbnRhaW5lck9yQmluZENvbXBvbmVudEV2ZW50SGFuZGxlciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGFpbmVyT3JCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmRDb21wb25lbnRFdmVudCA9IGNvbnRhaW5lck9yQmluZENvbXBvbmVudEV2ZW50SGFuZGxlcjtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2JpbmRDb21wb25lbnRFdmVudEhhbmxkZXJQYXNzZWRJbkNvbnN0cnVjdG9yID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodW5iaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVuYmluZENvbXBvbmVudEV2ZW50ID0gdW5iaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2JpbmRDb21wb25lbnRFdmVudEhhbmxkZXJQYXNzZWRJbkNvbnN0cnVjdG9yKSB7XHJcbiAgICAgICAgICAgIC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzU3ViV2luZG93KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBkb2N1bWVudC5ib2R5LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcclxuICAgICAgICAgICAgICAgIC8vIFNldCB1cCBsYXlvdXRDb25maWcgc2luY2UgY29uc3RydWN0b3IgaXMgbm90IGRldGVybWluYXRlIGFuZCBtYXkgZXhpdCBlYXJseS4gT3RoZXIgZnVuY3Rpb25zIG1heSBuZWVkXHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmxheW91dENvbmZpZy4gdGhpcy5sYXlvdXRDb25maWcgaXMgYWdhaW4gY2FsY3VsYXRlZCBpbiB0aGUgc2FtZSB3YXkgd2hlbiBpbml0KCkgY29tcGxldGVzLlxyXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoaXMgd2hlbiBjb25zdHJ1Y3RvciBpcyBkZXRlcm1pbmF0ZS5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jb25zdHJ1Y3Rvck9yU3ViV2luZG93TGF5b3V0Q29uZmlnID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZFVuZGVmaW5lZEVycm9yKCdWTEM5ODgyMycpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZExheW91dENvbmZpZyA9IExheW91dENvbmZpZy5yZXNvbHZlKHRoaXMuX2NvbnN0cnVjdG9yT3JTdWJXaW5kb3dMYXlvdXRDb25maWcpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSByb290IGZyb20gbGF5b3V0Q29uZmlnXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRDb25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJlc29sdmVkTGF5b3V0Q29uZmlnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByb290OiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2tpcEluaXQgIT09IHRydWUpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmRlcHJlY2F0ZWRDb25zdHJ1Y3Rvcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb3ZlcnJpZGUgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmJpbmRDb21wb25lbnRFdmVudCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLnVuYmluZENvbXBvbmVudEV2ZW50ID0gdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICBzdXBlci5kZXN0cm95KCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyB0aGUgYWN0dWFsIGxheW91dC4gTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYWxsIGluaXRpYWwgY29tcG9uZW50c1xyXG4gICAgICogYXJlIHJlZ2lzdGVyZWQuIFJlY3Vyc2VzIHRocm91Z2ggdGhlIGNvbmZpZ3VyYXRpb24gYW5kIHNldHMgdXBcclxuICAgICAqIHRoZSBpdGVtIHRyZWUuXHJcbiAgICAgKlxyXG4gICAgICogSWYgY2FsbGVkIGJlZm9yZSB0aGUgZG9jdW1lbnQgaXMgcmVhZHkgaXQgYWRkcyBpdHNlbGYgYXMgYSBsaXN0ZW5lclxyXG4gICAgICogdG8gdGhlIGRvY3VtZW50LnJlYWR5IGV2ZW50XHJcbiAgICAgKiBAZGVwcmVjYXRlZCBMYXlvdXRDb25maWcgc2hvdWxkIG5vdCBiZSBsb2FkZWQgaW4ge0BsaW5rIChMYXlvdXRNYW5hZ2VyOmNsYXNzKX0gY29uc3RydWN0b3IsIGJ1dCByYXRoZXIgaW4gYVxyXG4gICAgICoge0BsaW5rIChMYXlvdXRNYW5hZ2VyOmNsYXNzKS5sb2FkTGF5b3V0fSBjYWxsLiAgSWYgTGF5b3V0Q29uZmlnIGlzIG5vdCBzcGVjaWZpZWQgaW4ge0BsaW5rIChMYXlvdXRNYW5hZ2VyOmNsYXNzKX0gY29uc3RydWN0b3IsXHJcbiAgICAgKiB0aGVuIGluaXQoKSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY2FsbGVkIGludGVybmFsbHkgYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGV4dGVybmFsbHkuXHJcbiAgICAgKi9cclxuICAgIG92ZXJyaWRlIGluaXQoKTogdm9pZCB7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElmIHRoZSBkb2N1bWVudCBpc24ndCByZWFkeSB5ZXQsIHdhaXQgZm9yIGl0LlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICghdGhpcy5fYmluZENvbXBvbmVudEV2ZW50SGFubGRlclBhc3NlZEluQ29uc3RydWN0b3IgJiYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJyB8fCBkb2N1bWVudC5ib2R5ID09PSBudWxsKSkge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4gdGhpcy5pbml0KCksIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogSWYgdGhpcyBpcyBhIHN1YndpbmRvdywgd2FpdCBhIGZldyBtaWxsaXNlY29uZHMgZm9yIHRoZSBvcmlnaW5hbFxyXG4gICAgICAgICAqIHBhZ2UncyBqcyBjYWxscyB0byBiZSBleGVjdXRlZCwgdGhlbiByZXBsYWNlIHRoZSBib2RpZXMgY29udGVudFxyXG4gICAgICAgICAqIHdpdGggR29sZGVuTGF5b3V0XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgaWYgKCF0aGlzLl9iaW5kQ29tcG9uZW50RXZlbnRIYW5sZGVyUGFzc2VkSW5Db25zdHJ1Y3RvciAmJiB0aGlzLmlzU3ViV2luZG93ID09PSB0cnVlICYmICF0aGlzLl9jcmVhdGlvblRpbWVvdXRQYXNzZWQpIHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmluaXQoKSwgNyk7XHJcbiAgICAgICAgICAgIHRoaXMuX2NyZWF0aW9uVGltZW91dFBhc3NlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzU3ViV2luZG93ID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fYmluZENvbXBvbmVudEV2ZW50SGFubGRlclBhc3NlZEluQ29uc3RydWN0b3IpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJIdG1sQW5kQWRqdXN0U3R5bGVzRm9yU3ViV2luZG93KCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIEV4cG9zZSB0aGlzIGluc3RhbmNlIG9uIHRoZSB3aW5kb3cgb2JqZWN0IHRvIGFsbG93IHRoZSBvcGVuaW5nIHdpbmRvdyB0byBpbnRlcmFjdCB3aXRoIGl0XHJcbiAgICAgICAgICAgIHdpbmRvdy5fX2dsSW5zdGFuY2UgPSB0aGlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3VwZXIuaW5pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2xlYXJzIGV4aXN0aW5nIEhUTUwgYW5kIGFkanVzdHMgc3R5bGUgdG8gbWFrZSB3aW5kb3cgc3VpdGFibGUgdG8gYmUgYSBwb3BvdXQgc3ViIHdpbmRvd1xyXG4gICAgICogQ3VyZW50bHkgaXMgYXV0b21hdGljYWxseSBjYWxsZWQgd2hlbiB3aW5kb3cgaXMgYSBzdWJXaW5kb3cgYW5kIGJpbmRDb21wb25lbnRFdmVudCBpcyBub3QgcGFzc2VkIGluIHRoZSBjb25zdHJ1Y3RvclxyXG4gICAgICogSWYgYmluZENvbXBvbmVudEV2ZW50IGlzIG5vdCBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yLCB0aGUgYXBwbGljYXRpb24gbXVzdCBlaXRoZXIgY2FsbCB0aGlzIGZ1bmN0aW9uIGV4cGxpY2l0bHkgb3JcclxuICAgICAqIChwcmVmZXJhYmx5KSBtYWtlIHRoZSB3aW5kb3cgc3VpdGFibGUgYXMgYSBzdWJ3aW5kb3cuXHJcbiAgICAgKiBJbiB0aGUgZnV0dXJlLCBpdCBpcyBwbGFubmVkIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBOT1QgYXV0b21hdGljYWxseSBjYWxsZWQgaW4gYW55IGNpcmN1bXN0YW5jZXMuICBBcHBsaWNhdGlvbnMgd2lsbFxyXG4gICAgICogbmVlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhIHdpbmRvdyBpcyBhIEdvbGRlbiBMYXlvdXQgcG9wb3V0IHdpbmRvdyBhbmQgZWl0aGVyIGNhbGwgdGhpcyBmdW5jdGlvbiBleHBsaWNpdGx5IG9yXHJcbiAgICAgKiBoaWRlIEhUTUwgbm90IHJlbGV2YW50IHRvIHRoZSBwb3BvdXQuXHJcbiAgICAgKiBTZWUgYXBpdGVzdCBmb3IgYW4gZXhhbXBsZSBvZiBob3cgSFRNTCBpcyBoaWRkZW4gd2hlbiBwb3BvdXQgd2luZG93cyBhcmUgZGlzcGxheWVkXHJcbiAgICAgKi9cclxuICAgIGNsZWFySHRtbEFuZEFkanVzdFN0eWxlc0ZvclN1YldpbmRvdygpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBoZWFkRWxlbWVudCA9IGRvY3VtZW50LmhlYWQ7XHJcblxyXG4gICAgICAgIGNvbnN0IGFwcGVuZE5vZGVMaXN0cyA9IG5ldyBBcnJheTxOb2RlTGlzdE9mPEVsZW1lbnQ+Pig0KTtcclxuICAgICAgICBhcHBlbmROb2RlTGlzdHNbMF0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdib2R5IGxpbmsnKTtcclxuICAgICAgICBhcHBlbmROb2RlTGlzdHNbMV0gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdib2R5IHN0eWxlJyk7XHJcbiAgICAgICAgYXBwZW5kTm9kZUxpc3RzWzJdID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgndGVtcGxhdGUnKTtcclxuICAgICAgICBhcHBlbmROb2RlTGlzdHNbM10gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZ2xfa2VlcCcpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBsaXN0SWR4ID0gMDsgbGlzdElkeCA8IGFwcGVuZE5vZGVMaXN0cy5sZW5ndGg7IGxpc3RJZHgrKykge1xyXG4gICAgICAgICAgICBjb25zdCBhcHBlbmROb2RlTGlzdCA9IGFwcGVuZE5vZGVMaXN0c1tsaXN0SWR4XTtcclxuICAgICAgICAgICAgZm9yIChsZXQgbm9kZUlkeCA9IDA7IG5vZGVJZHggPCBhcHBlbmROb2RlTGlzdC5sZW5ndGg7IG5vZGVJZHgrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IGFwcGVuZE5vZGVMaXN0W25vZGVJZHhdO1xyXG4gICAgICAgICAgICAgICAgaGVhZEVsZW1lbnQuYXBwZW5kQ2hpbGQobm9kZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGJvZHlFbGVtZW50ID0gZG9jdW1lbnQuYm9keTtcclxuICAgICAgICBib2R5RWxlbWVudC5pbm5lckhUTUwgPSAnJztcclxuICAgICAgICBib2R5RWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xyXG4gICAgICAgIHRoaXMuY2hlY2tBZGREZWZhdWx0UG9waW5CdXR0b24oKTtcclxuXHJcbiAgICAgICAgLypcclxuICAgICAgICAqIFRoaXMgc2VlbXMgYSBiaXQgcG9pbnRsZXNzLCBidXQgYWN0dWFsbHkgY2F1c2VzIGEgcmVmbG93L3JlLWV2YWx1YXRpb24gZ2V0dGluZyBhcm91bmRcclxuICAgICAgICAqIHNsaWNrZ3JpZCdzIFwiQ2Fubm90IGZpbmQgc3R5bGVzaGVldC5cIiBidWcgaW4gY2hyb21lXHJcbiAgICAgICAgKi9cclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXHJcbiAgICAgICAgY29uc3QgeCA9IGRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0O1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBXaWxsIGFkZCBidXR0b24gaWYgbm90IHBvcGluT25DbG9zZSBzcGVjaWZpZWQgaW4gc2V0dGluZ3NcclxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgYWRkZWQgb3RoZXJ3aXNlIGZhbHNlXHJcbiAgICAgKi9cclxuICAgIGNoZWNrQWRkRGVmYXVsdFBvcGluQnV0dG9uKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICh0aGlzLmxheW91dENvbmZpZy5zZXR0aW5ncy5wb3BJbk9uQ2xvc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvcEluQnV0dG9uRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgICAgICBwb3BJbkJ1dHRvbkVsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLlBvcGluKTtcclxuICAgICAgICAgICAgcG9wSW5CdXR0b25FbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCB0aGlzLmxheW91dENvbmZpZy5oZWFkZXIucG9waW4pO1xyXG4gICAgICAgICAgICBjb25zdCBpY29uRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgICAgICBpY29uRWxlbWVudC5jbGFzc0xpc3QuYWRkKERvbUNvbnN0YW50cy5DbGFzc05hbWUuSWNvbik7XHJcbiAgICAgICAgICAgIGNvbnN0IGJnRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgICAgICBiZ0VsZW1lbnQuY2xhc3NMaXN0LmFkZChEb21Db25zdGFudHMuQ2xhc3NOYW1lLkJnKTtcclxuICAgICAgICAgICAgcG9wSW5CdXR0b25FbGVtZW50LmFwcGVuZENoaWxkKGljb25FbGVtZW50KTtcclxuICAgICAgICAgICAgcG9wSW5CdXR0b25FbGVtZW50LmFwcGVuZENoaWxkKGJnRWxlbWVudCk7XHJcbiAgICAgICAgICAgIHBvcEluQnV0dG9uRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuZW1pdCgncG9wSW4nKSk7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocG9wSW5CdXR0b25FbGVtZW50KTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIG92ZXJyaWRlIGJpbmRDb21wb25lbnQoY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIsIGl0ZW1Db25maWc6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZyk6IENvbXBvbmVudENvbnRhaW5lci5CaW5kYWJsZUNvbXBvbmVudCB7XHJcbiAgICAgICAgaWYgKHRoaXMuYmluZENvbXBvbmVudEV2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY29uc3QgYmluZGFibGVDb21wb25lbnQgPSB0aGlzLmJpbmRDb21wb25lbnRFdmVudChjb250YWluZXIsIGl0ZW1Db25maWcpO1xyXG4gICAgICAgICAgICByZXR1cm4gYmluZGFibGVDb21wb25lbnQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZ2V0Q29tcG9uZW50RXZlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHRoaXMuZ2V0Q29tcG9uZW50RXZlbnQoY29udGFpbmVyLCBpdGVtQ29uZmlnKSxcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIGNvbXBvbmVudCByZWdpc3RlcmVkIGZvciB0aGlzIHR5cGUsIGFuZCB3ZSBkb24ndCBoYXZlIGEgZ2V0Q29tcG9uZW50RXZlbnQgZGVmaW5lZC5cclxuICAgICAgICAgICAgICAgIC8vIFRoaXMgbWlnaHQgaGFwcGVuIHdoZW4gdGhlIHVzZXIgcG9wcyBvdXQgYSBkaWFsb2cgYW5kIHRoZSBjb21wb25lbnQgdHlwZXMgYXJlIG5vdCByZWdpc3RlcmVkIHVwZnJvbnQuXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gaTE4blN0cmluZ3NbSTE4blN0cmluZ0lkLkNvbXBvbmVudFR5cGVOb3RSZWdpc3RlcmVkQW5kQmluZENvbXBvbmVudEV2ZW50SGFuZGxlck5vdEFzc2lnbmVkXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgJHt0ZXh0fTogJHtKU09OLnN0cmluZ2lmeShpdGVtQ29uZmlnKX1gXHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmluZEVycm9yKG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIG92ZXJyaWRlIHVuYmluZENvbXBvbmVudChjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgdmlydHVhbDogYm9vbGVhbiwgY29tcG9uZW50OiBDb21wb25lbnRDb250YWluZXIuQ29tcG9uZW50IHwgdW5kZWZpbmVkKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMudW5iaW5kQ29tcG9uZW50RXZlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLnVuYmluZENvbXBvbmVudEV2ZW50KGNvbnRhaW5lcik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKCF2aXJ0dWFsICYmIHRoaXMucmVsZWFzZUNvbXBvbmVudEV2ZW50ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkVW5kZWZpbmVkRXJyb3IoJ1ZDVUNSQ1UzMzM5OTgnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWxlYXNlQ29tcG9uZW50RXZlbnQoY29udGFpbmVyLCBjb21wb25lbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG4vKiogQHB1YmxpYyAqL1xyXG5leHBvcnQgbmFtZXNwYWNlIFZpcnR1YWxMYXlvdXQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgdmlydHVhbCBjb21wb25lbnRzIHdpdGgge0BsaW5rIChWaXJ0dWFsTGF5b3V0OmNsYXNzKS5iaW5kQ29tcG9uZW50RXZlbnR9IGFuZFxyXG4gICAgICoge0BsaW5rIChWaXJ0dWFsTGF5b3V0OmNsYXNzKS51bmJpbmRDb21wb25lbnRFdmVudH0gZXZlbnRzLlxyXG4gICAgICovXHJcbiAgICBleHBvcnQgdHlwZSBHZXRDb21wb25lbnRFdmVudEhhbmRsZXIgPVxyXG4gICAgICAgICh0aGlzOiB2b2lkLCBjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lciwgaXRlbUNvbmZpZzogUmVzb2x2ZWRDb21wb25lbnRJdGVtQ29uZmlnKSA9PiBDb21wb25lbnRDb250YWluZXIuQ29tcG9uZW50O1xyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgdmlydHVhbCBjb21wb25lbnRzIHdpdGgge0BsaW5rIChWaXJ0dWFsTGF5b3V0OmNsYXNzKS5iaW5kQ29tcG9uZW50RXZlbnR9IGFuZFxyXG4gICAgICoge0BsaW5rIChWaXJ0dWFsTGF5b3V0OmNsYXNzKS51bmJpbmRDb21wb25lbnRFdmVudH0gZXZlbnRzLlxyXG4gICAgICovXHJcbiAgICBleHBvcnQgdHlwZSBSZWxlYXNlQ29tcG9uZW50RXZlbnRIYW5kbGVyID1cclxuICAgICAgICAodGhpczogdm9pZCwgY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIsIGNvbXBvbmVudDogQ29tcG9uZW50Q29udGFpbmVyLkNvbXBvbmVudCkgPT4gdm9pZDtcclxuXHJcbiAgICBleHBvcnQgdHlwZSBCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyID1cclxuICAgICAgICAodGhpczogdm9pZCwgY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIsIGl0ZW1Db25maWc6IFJlc29sdmVkQ29tcG9uZW50SXRlbUNvbmZpZykgPT4gQ29tcG9uZW50Q29udGFpbmVyLkJpbmRhYmxlQ29tcG9uZW50O1xyXG4gICAgZXhwb3J0IHR5cGUgVW5iaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyID1cclxuICAgICAgICAodGhpczogdm9pZCwgY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIpID0+IHZvaWQ7XHJcblxyXG4gICAgZXhwb3J0IHR5cGUgQmVmb3JlVmlydHVhbFJlY3RpbmdFdmVudCA9ICh0aGlzOiB2b2lkKSA9PiB2b2lkO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWxcclxuICAgICAqIFZlcmlhYmxlIHRvIGhvbGQgdGhlIHN0YXRlIHdoZXRoZXIgd2UgYWxyZWFkeSBjaGVja2VkIGlmIHdlIGFyZSBydW5uaW5nIGluIGEgc3ViIHdpbmRvdy5cclxuICAgICAqIEZpeGVzIHBvcG91dCBhbmQgY3JlYXRpb24gb2YgbmVzdGVkIGdvbGRlbi1sYXlvdXRzLlxyXG4gICAgICovXHJcbiAgICBsZXQgc3ViV2luZG93Q2hlY2tlZCA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBAaW50ZXJuYWwgKi9cclxuICAgIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMYXlvdXRNYW5hZ2VyQ29uc3RydWN0b3JQYXJhbWV0ZXJzKGNvbmZpZ09yT3B0aW9uYWxDb250YWluZXI6IExheW91dENvbmZpZyB8IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIGNvbnRhaW5lck9yQmluZENvbXBvbmVudEV2ZW50SGFuZGxlcj86IEhUTUxFbGVtZW50IHwgIFZpcnR1YWxMYXlvdXQuQmluZENvbXBvbmVudEV2ZW50SGFuZGxlcik6XHJcbiAgICAgICAgTGF5b3V0TWFuYWdlci5Db25zdHJ1Y3RvclBhcmFtZXRlcnNcclxuICAgIHtcclxuICAgICAgICBjb25zdCB3aW5kb3dDb25maWdLZXkgPSBzdWJXaW5kb3dDaGVja2VkID8gbnVsbCA6IG5ldyBVUkwoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuc2VhcmNoUGFyYW1zLmdldCgnZ2wtd2luZG93Jyk7XHJcbiAgICAgICAgc3ViV2luZG93Q2hlY2tlZCA9IHRydWU7XHJcbiAgICAgICAgY29uc3QgaXNTdWJXaW5kb3cgPSB3aW5kb3dDb25maWdLZXkgIT09IG51bGw7XHJcblxyXG4gICAgICAgIGxldCBjb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZDtcclxuICAgICAgICBsZXQgY29uZmlnOiBMYXlvdXRDb25maWcgfCB1bmRlZmluZWQ7XHJcbiAgICAgICAgaWYgKHdpbmRvd0NvbmZpZ0tleSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjb25zdCB3aW5kb3dDb25maWdTdHIgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh3aW5kb3dDb25maWdLZXkpO1xyXG4gICAgICAgICAgICBpZiAod2luZG93Q29uZmlnU3RyID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ051bGwgZ2wtd2luZG93IENvbmZpZycpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHdpbmRvd0NvbmZpZ0tleSk7XHJcbiAgICAgICAgICAgIGNvbnN0IG1pbmlmaWVkV2luZG93Q29uZmlnID0gSlNPTi5wYXJzZSh3aW5kb3dDb25maWdTdHIpIGFzIFJlc29sdmVkUG9wb3V0TGF5b3V0Q29uZmlnO1xyXG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZENvbmZpZyA9IFJlc29sdmVkTGF5b3V0Q29uZmlnLnVubWluaWZ5Q29uZmlnKG1pbmlmaWVkV2luZG93Q29uZmlnKTtcclxuICAgICAgICAgICAgY29uZmlnID0gTGF5b3V0Q29uZmlnLmZyb21SZXNvbHZlZChyZXNvbHZlZENvbmZpZylcclxuXHJcbiAgICAgICAgICAgIGlmIChjb25maWdPck9wdGlvbmFsQ29udGFpbmVyIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lckVsZW1lbnQgPSBjb25maWdPck9wdGlvbmFsQ29udGFpbmVyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGNvbmZpZ09yT3B0aW9uYWxDb250YWluZXIgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY29uZmlnID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZ09yT3B0aW9uYWxDb250YWluZXIgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJFbGVtZW50ID0gY29uZmlnT3JPcHRpb25hbENvbnRhaW5lcjtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcclxuICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBjb25maWdPck9wdGlvbmFsQ29udGFpbmVyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY29udGFpbmVyRWxlbWVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyT3JCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXJFbGVtZW50ID0gY29udGFpbmVyT3JCaW5kQ29tcG9uZW50RXZlbnRIYW5kbGVyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBjb25zdHJ1Y3Rvck9yU3ViV2luZG93TGF5b3V0Q29uZmlnOiBjb25maWcsXHJcbiAgICAgICAgICAgIGlzU3ViV2luZG93LFxyXG4gICAgICAgICAgICBjb250YWluZXJFbGVtZW50LFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbn1cclxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJleHBvcnQgKiBmcm9tICcuL3RzL2NvbmZpZy9jb25maWcnO1xyXG5leHBvcnQgKiBmcm9tICcuL3RzL2NvbmZpZy9yZXNvbHZlZC1jb25maWcnO1xyXG5leHBvcnQgeyBDb21wb25lbnRDb250YWluZXIgfSBmcm9tICcuL3RzL2NvbnRhaW5lci9jb21wb25lbnQtY29udGFpbmVyJztcclxuZXhwb3J0IHsgQnJvd3NlclBvcG91dCB9IGZyb20gJy4vdHMvY29udHJvbHMvYnJvd3Nlci1wb3BvdXQnO1xyXG5leHBvcnQgeyBEcmFnU291cmNlIH0gZnJvbSAnLi90cy9jb250cm9scy9kcmFnLXNvdXJjZSc7XHJcbmV4cG9ydCB7IEhlYWRlciB9IGZyb20gJy4vdHMvY29udHJvbHMvaGVhZGVyJztcclxuZXhwb3J0IHsgVGFiIH0gZnJvbSAnLi90cy9jb250cm9scy90YWInO1xyXG5leHBvcnQgKiBmcm9tICcuL3RzL2Vycm9ycy9leHRlcm5hbC1lcnJvcic7XHJcbmV4cG9ydCB7IEdvbGRlbkxheW91dCB9IGZyb20gJy4vdHMvZ29sZGVuLWxheW91dCc7XHJcbmV4cG9ydCB7IENvbXBvbmVudEl0ZW0gfSBmcm9tICcuL3RzL2l0ZW1zL2NvbXBvbmVudC1pdGVtJztcclxuZXhwb3J0IHsgQ29udGVudEl0ZW0gfSBmcm9tICcuL3RzL2l0ZW1zL2NvbnRlbnQtaXRlbSc7XHJcbmV4cG9ydCB7IFJvd09yQ29sdW1uIH0gZnJvbSAnLi90cy9pdGVtcy9yb3ctb3ItY29sdW1uJztcclxuZXhwb3J0IHsgU3RhY2sgfSBmcm9tICcuL3RzL2l0ZW1zL3N0YWNrJztcclxuZXhwb3J0IHsgTGF5b3V0TWFuYWdlciB9IGZyb20gJy4vdHMvbGF5b3V0LW1hbmFnZXInO1xyXG5leHBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICcuL3RzL3V0aWxzL2V2ZW50LWVtaXR0ZXInO1xyXG5leHBvcnQgeyBFdmVudEh1YiB9IGZyb20gJy4vdHMvdXRpbHMvZXZlbnQtaHViJztcclxuZXhwb3J0ICogZnJvbSAnLi90cy91dGlscy9pMThuLXN0cmluZ3MnO1xyXG5leHBvcnQgeyBTdHlsZUNvbnN0YW50cyB9IGZyb20gJy4vdHMvdXRpbHMvc3R5bGUtY29uc3RhbnRzJztcclxuZXhwb3J0ICogZnJvbSAnLi90cy91dGlscy90eXBlcyc7XHJcbmV4cG9ydCB7IFZpcnR1YWxMYXlvdXQgfSBmcm9tICcuL3RzL3ZpcnR1YWwtbGF5b3V0JztcclxuXHJcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/src/Aardvark.UI.Primitives/resources/golden-layout/bundle/umd/golden-layout.min.js b/src/Aardvark.UI.Primitives/resources/golden-layout/bundle/umd/golden-layout.min.js index 26043716..93e516a5 100644 --- a/src/Aardvark.UI.Primitives/resources/golden-layout/bundle/umd/golden-layout.min.js +++ b/src/Aardvark.UI.Primitives/resources/golden-layout/bundle/umd/golden-layout.min.js @@ -1 +1 @@ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.goldenLayout=e():t.goldenLayout=e()}(globalThis,(()=>(()=>{"use strict";var t,e={d:(t,i)=>{for(var n in i)e.o(i,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:i[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},i={};e.r(i),e.d(i,{ApiError:()=>r,BindError:()=>a,BrowserPopout:()=>ht,ComponentContainer:()=>ot,ComponentItem:()=>dt,ComponentItemConfig:()=>W,ConfigurationError:()=>o,ContentItem:()=>at,DragSource:()=>wt,EventEmitter:()=>nt,EventHub:()=>St,ExternalError:()=>n,GoldenLayout:()=>zt,Header:()=>_t,HeaderedItemConfig:()=>R,I18nStrings:()=>t,ItemConfig:()=>D,ItemType:()=>y,JsonValue:()=>C,LayoutConfig:()=>B,LayoutManager:()=>Et,LogicalZIndex:()=>f,LogicalZIndexToDefaultMap:()=>v,PopoutBlockedError:()=>s,PopoutLayoutConfig:()=>O,ResolvedComponentItemConfig:()=>z,ResolvedGroundItemConfig:()=>P,ResolvedHeaderedItemConfig:()=>E,ResolvedItemConfig:()=>S,ResolvedLayoutConfig:()=>T,ResolvedPopoutLayoutConfig:()=>A,ResolvedRootItemConfig:()=>L,ResolvedRowOrColumnItemConfig:()=>M,ResolvedStackItemConfig:()=>x,ResponsiveMode:()=>w,RootItemConfig:()=>H,RowOrColumn:()=>lt,RowOrColumnItemConfig:()=>U,Side:()=>_,SizeUnitEnum:()=>I,Stack:()=>ft,StackItemConfig:()=>k,StyleConstants:()=>p,Tab:()=>pt,VirtualLayout:()=>xt,WidthOrHeightPropertyName:()=>g,formatSize:()=>et,formatUndefinableSize:()=>it,i18nStrings:()=>m,parseSize:()=>tt});class n extends Error{constructor(t,e){super(e),this.type=t}}class o extends n{constructor(t,e){super("Configuration",t),this.node=e}}class s extends n{constructor(t){super("PopoutBlocked",t)}}class r extends n{constructor(t){super("API",t)}}class a extends n{constructor(t){super("Bind",t)}}class l extends Error{constructor(t,e,i){super(`${t}: ${e}${void 0===i?"":": "+i}`)}}class h extends l{constructor(t,e){super("Assert",t,e)}}class d extends l{constructor(t,e,i){super("UnreachableCase",t,`${e}${void 0===i?"":": "+i}`)}}class c extends l{constructor(t,e){super("UnexpectedNull",t,e)}}class u extends l{constructor(t,e){super("UnexpectedUndefined",t,e)}}!function(t){let e=!1;const i={PopoutCannotBeCreatedWithGroundItemConfig:{id:0,default:"Popout cannot be created with ground ItemConfig"},PleaseRegisterAConstructorFunction:{id:1,default:"Please register a constructor function"},ComponentTypeNotRegisteredAndBindComponentEventHandlerNotAssigned:{id:2,default:"Component type not registered and BindComponentEvent handler not assigned"},ComponentIsAlreadyRegistered:{id:3,default:"Component is already registered"},ComponentIsNotVirtuable:{id:4,default:"Component is not virtuable. Requires rootHtmlElement field/getter"},VirtualComponentDoesNotHaveRootHtmlElement:{id:5,default:'Virtual component does not have getter "rootHtmlElement"'},ItemConfigIsNotTypeComponent:{id:6,default:"ItemConfig is not of type component"},InvalidNumberPartInSizeString:{id:7,default:"Invalid number part in size string"},UnknownUnitInSizeString:{id:8,default:"Unknown unit in size string"},UnsupportedUnitInSizeString:{id:9,default:"Unsupported unit in size string"}};t.idCount=Object.keys(i).length;const n=Object.values(i);t.checkInitialise=function(){if(!e)for(let e=0;e="0"&&t<="9"}function G(t,e){const i=F(Math.max(0,e));t.style.width=i}function Z(t,e){const i=F(Math.max(0,e));t.style.height=i}function q(t){return{width:t.offsetWidth,height:t.offsetHeight}}function j(t){return{width:t.clientWidth,height:t.clientHeight}}function $(t){let e,i,n=t.mozInnerScreenX,o=t.mozInnerScreenY;return void 0===n||void 0===o?(e=(t.outerWidth-t.innerWidth)/2,i=t.outerHeight-t.innerHeight-e):(e=n-t.screenX,i=o-t.screenY),{width:Math.max(0,e),height:Math.max(0,i)}}function X(t){let e=t.mozInnerScreenX,i=t.mozInnerScreenY;if(void 0===e||void 0===i){const n=$(t);e=t.screenX+n.width,i=t.screenY+n.height}return{left:e,top:i}}function Y(t,e){t.style.display=e?"":"none"}function J(t,e){if(void 0!==e)for(const i in e)if(e.hasOwnProperty(i)){const n=e[i],o=t[i];t[i]=K(o,n)}return t}function K(t,e){if("object"!=typeof e)return e;if(Array.isArray(e)){const t=e.length,i=new Array(t);for(let n=0;n36)throw new Error("Too many keys in config minifier map")},t.translateObject=n}(b||(b={})),function(t){t.defaults={type:y.ground,content:[],size:1,sizeUnit:I.Fractional,minSize:void 0,minSizeUnit:I.Pixel,id:"",isClosable:!0},t.createCopy=function(t,e){switch(t.type){case y.ground:case y.row:case y.column:return M.createCopy(t,e);case y.stack:return x.createCopy(t,e);case y.component:return z.createCopy(t);default:throw new d("CICC91354",t.type,"Invalid Config Item type specified")}},t.createDefault=function(t){switch(t){case y.ground:throw new h("CICCDR91562");case y.row:case y.column:return M.createDefault(t);case y.stack:return x.createDefault();case y.component:return z.createDefault();default:throw new d("CICCDD91563",t,"Invalid Config Item type specified")}},t.isComponentItem=function(t){return t.type===y.component},t.isStackItem=function(t){return t.type===y.stack},t.isGroundItem=function(t){return t.type===y.ground}}(S||(S={})),function(t){let e;t.defaultMaximised=!1,function(t){t.createCopy=function(t,e){return void 0===t?void 0:{show:null!=e?e:t.show,popout:t.popout,close:t.close,maximise:t.maximise,minimise:t.minimise,tabDropdown:t.tabDropdown}}}(e=t.Header||(t.Header={}))}(E||(E={})),function(t){function e(t){const e=t.length,i=new Array(e);for(let n=0;n"__glMaximised"===t));t>0&&(o=!0,n=n.splice(t,1)),e=n.length>0?n[0]:S.defaults.id}else e=n;return i=void 0!==t.maximised?t.maximised:o,{id:e,maximised:i}}}(R||(R={})),function(t){function e(t){if(void 0===t)return[];{const e=t.length,i=new Array(e);for(let n=0;n0?e.content[0]:void 0,{resolved:!0,root:H.resolve(i),openPopouts:t.resolveOpenPopouts(e.openPopouts),dimensions:t.Dimensions.resolve(e.dimensions),settings:t.Settings.resolve(e.settings),header:t.Header.resolve(e.header,e.settings,e.labels)}}},t.fromResolved=function(e){return{root:H.fromResolvedOrUndefined(e.root),openPopouts:O.fromResolvedArray(e.openPopouts),settings:T.Settings.createCopy(e.settings),dimensions:t.Dimensions.fromResolved(e.dimensions),header:T.Header.createCopy(e.header)}},t.isResolved=function(t){const e=t;return void 0!==e.resolved&&!0===e.resolved},t.resolveOpenPopouts=function(t){if(void 0===t)return[];{const e=t.length,i=new Array(e);for(let n=0;n0?e.content[0]:void 0,{root:H.resolve(o),openPopouts:B.resolveOpenPopouts(e.openPopouts),dimensions:B.Dimensions.resolve(e.dimensions),settings:B.Settings.resolve(e.settings),header:B.Header.resolve(e.header,e.settings,e.labels),parentId:null!==(i=e.parentId)&&void 0!==i?i:null,indexInParent:null!==(n=e.indexInParent)&&void 0!==n?n:null,window:t.Window.resolve(e.window,e.dimensions),resolved:!0}},t.fromResolved=function(e){return{root:H.fromResolvedOrUndefined(e.root),openPopouts:i(e.openPopouts),dimensions:B.Dimensions.fromResolved(e.dimensions),settings:T.Settings.createCopy(e.settings),header:T.Header.createCopy(e.header),parentId:e.parentId,indexInParent:e.indexInParent,window:t.Window.fromResolved(e.window)}},t.fromResolvedArray=i}(O||(O={}));class nt{constructor(){this._allEventSubscriptions=[],this._subscriptionsMap=new Map,this.unbind=this.removeEventListener,this.trigger=this.emit}tryBubbleEvent(t,e){}emit(t,...e){let i=this._subscriptionsMap.get(t);if(void 0!==i){i=i.slice();for(let t=0;t0){const n=e.slice();n.unshift(t);const o=this._allEventSubscriptions.slice();for(let t=0;tthis.onPointerDown(t),this._pointerMoveEventListener=t=>this.onPointerMove(t),this._pointerUpEventListener=t=>this.onPointerUp(t),this._timeout=void 0,this._allowableTargets=[t,...e],this._oDocument=document,this._eBody=document.body,this._nDelay=1800,this._nDistance=10,this._originalEvent={pageX:0,pageY:0,screenX:0,screenY:0},this._dragging=!1,this._eElement.addEventListener("pointerdown",this._pointerDownEventListener,{passive:!0})}destroy(){this.checkRemovePointerTrackingEventListeners(),this._eElement.removeEventListener("pointerdown",this._pointerDownEventListener)}cancelDrag(){this.processDragStop(void 0)}onPointerDown(t){this._allowableTargets.includes(t.target)&&t.isPrimary&&this.processPointerDown(t)}processPointerDown(t){this._originalEvent=t,this._oDocument.addEventListener("pointermove",this._pointerMoveEventListener),this._oDocument.addEventListener("pointerup",this._pointerUpEventListener,{passive:!0}),this._eBody.classList.add("lm_pointer_tracking"),this._pointerTracking=!0,this._timeout=setTimeout((()=>{try{this.startDrag()}catch(t){throw console.error(t),t}}),this._nDelay)}onPointerMove(t){this._pointerTracking&&(this.processDragMove(t),t.preventDefault())}processDragMove(t){const e=t.pageX-this._originalEvent.pageX,i=t.pageY-this._originalEvent.pageY;!1===this._dragging&&(Math.abs(e)>this._nDistance||Math.abs(i)>this._nDistance)&&this.startDrag(),this._dragging&&this.emit("drag",e,i,t)}onPointerUp(t){this.processDragStop(t)}processDragStop(t){void 0!==this._timeout&&(clearTimeout(this._timeout),this._timeout=void 0),this.checkRemovePointerTrackingEventListeners(),!0===this._dragging&&(this._eBody.classList.remove("lm_dragging"),this._eElement.classList.remove("lm_dragging"),this._dragging=!1,this.emit("dragStop",t))}checkRemovePointerTrackingEventListeners(){this._pointerTracking&&(this._oDocument.removeEventListener("pointermove",this._pointerMoveEventListener),this._oDocument.removeEventListener("pointerup",this._pointerUpEventListener),this._eBody.classList.remove("lm_pointer_tracking"),this._pointerTracking=!1)}startDrag(){void 0!==this._timeout&&(clearTimeout(this._timeout),this._timeout=void 0),this._dragging=!0,this._eBody.classList.add("lm_dragging"),this._eElement.classList.add("lm_dragging"),this.emit("dragStart",this._originalEvent.pageX,this._originalEvent.pageY),this.emit("drag",0,0,this._originalEvent)}}class rt{constructor(t,e,i){this._isVertical=t,this._size=e,this._grabSize=i0)this.updateSize(!1);else if(!this.isGround){if(null===this._parent)throw new c("CIUC00874");this._parent.removeChild(this)}}addChild(t,e,i){return null!=e||(e=this._contentItems.length),this._contentItems.splice(e,0,t),t.setParent(this),!0===this._isInitialised&&!1===t._isInitialised&&t.init(),e}replaceChild(t,e,i=!1){const n=this._contentItems.indexOf(t),o=t._element.parentNode;if(-1===n)throw new h("CIRCI23232","Can't replace child. oldChild is not child of this");if(null===o)throw new c("CIRCP23232");if(o.replaceChild(e._element,t._element),!0===i&&(t._parent=null,t.destroy()),this._contentItems[n]=e,e.setParent(this),e.size=t.size,e.sizeUnit=t.sizeUnit,e.minSize=t.minSize,e.minSizeUnit=t.minSizeUnit,null===e._parent)throw new c("CIRCNC45699");!0===e._parent._isInitialised&&!1===e._isInitialised&&e.init(),this.updateSize(!1)}remove(){if(null===this._parent)throw new c("CIR11110");this._parent.removeChild(this)}popout(){const t=Q(),e=this.layoutManager.createPopoutFromContentItem(this,void 0,t,void 0);return this.emitBaseBubblingEvent("stateChanged"),e}calculateConfigContent(){const t=this._contentItems,e=t.length,i=new Array(e);for(let n=0;n1)return t;t=t.parent}return null}findDockPoint(){const t=this.findAncestorWithSiblings();if(null!==t&&null!==t.parent){const e=t.parent._contentItems.indexOf(t);return{parent:t.parent,index:e}}return this.layoutManager.groundItem?{parent:this.layoutManager.groundItem,index:null}:null}init(){this._isInitialised=!0,this.emitBaseBubblingEvent("itemCreated"),this.emitUnknownBubblingEvent(this.type+"Created")}setParent(t){this._parent=t}addPopInParentId(t){this.popInParentIds.includes(t)||this.popInParentIds.push(t)}initContentItems(){for(let t=0;tthis.propagateEventToLayoutManager(t,e))))}propagateEventToLayoutManager(t,e){this._pendingEventPropagations[t]=!1,this.layoutManager.emitUnknown(t,e)}}class lt extends at{constructor(t,e,i,n){switch(super(e,i,n,lt.createElement(document,t)),this._rowOrColumnParent=n,this._splitter=[],this.isRow=!t,this.isColumn=t,this._childElementContainer=this.element,this._splitterSize=e.layoutConfig.dimensions.borderWidth,this._splitterGrabSize=e.layoutConfig.dimensions.borderGrabWidth,this._isColumn=t,this._dimension=t?"height":"width",this._splitterPosition=null,this._splitterMinPosition=null,this._splitterMaxPosition=null,i.type){case y.row:case y.column:this._configType=i.type;break;default:throw new h("ROCCCT00925")}}newComponent(t,e,i,n){const o={type:"component",componentType:t,componentState:e,title:i};return this.newItem(o,n)}addComponent(t,e,i,n){const o={type:"component",componentType:t,componentState:e,title:i};return this.addItem(o,n)}newItem(t,e){e=this.addItem(t,e);const i=this.contentItems[e];return at.isStack(i)&&D.isComponent(t)?i.contentItems[0]:i}addItem(t,e){this.layoutManager.checkMinimiseMaximisedStack();const i=D.resolve(t,!1),n=this.layoutManager.createAndInitContentItem(i,this);return this.addChild(n,e,!1)}addChild(t,e,i){if(void 0===e&&(e=this.contentItems.length),this.contentItems.length>0){const i=this.createSplitter(Math.max(0,e-1)).element;e>0?(this.contentItems[e-1].element.insertAdjacentElement("afterend",i),i.insertAdjacentElement("afterend",t.element)):(this.contentItems[0].element.insertAdjacentElement("beforebegin",i),i.insertAdjacentElement("beforebegin",t.element))}else this._childElementContainer.appendChild(t.element);super.addChild(t,e);const n=1/this.contentItems.length*100;if(!0===i)return this.emitBaseBubblingEvent("stateChanged"),e;for(let e=0;e0&&(this.calculateRelativeSizes(),this.setAbsoluteSizes()),this.emitBaseBubblingEvent("stateChanged"),this.emit("resize")}setAbsoluteSizes(){const t=this.calculateAbsoluteSizes();for(let e=0;e0&&t.itemSizes[e]++,this._isColumn?(G(this.contentItems[e].element,t.crossAxisSize),Z(this.contentItems[e].element,t.itemSizes[e])):(G(this.contentItems[e].element,t.itemSizes[e]),Z(this.contentItems[e].element,t.crossAxisSize))}calculateAbsoluteSizes(){const t=(this.contentItems.length-1)*this._splitterSize,{width:e,height:i}=q(this.element);let n,o;this._isColumn?(n=i-t,o=e):(n=e-t,o=i);let s=0;const r=[];for(let t=0;t0){const n=100-t;for(let t=0;t100&&e.length>0){for(let t=0;te)return;{const r=i/e;let a=i;for(let e=0;ethis.onSplitterDrag(e,t,i))),e.on("dragStop",(()=>this.onSplitterDragStop(e))),e.on("dragStart",(()=>this.onSplitterDragStart(e))),this._splitter.splice(t,0,e),e}getSplitItems(t){const e=this._splitter.indexOf(t);return{before:this.contentItems[e],after:this.contentItems[e+1]}}calculateContentItemMinSize(t){const e=t.minSize;if(void 0!==e){if(t.minSizeUnit===I.Pixel)return e;throw new h("ROCGMD98831",JSON.stringify(t))}{const t=this.layoutManager.layoutConfig.dimensions;return this._isColumn?t.defaultMinItemHeight:t.defaultMinItemWidth}}calculateContentItemsTotalMinSize(t){let e=0;for(const i of t.contentItems){const n=this.calculateContentItemsTotalMinSize(i);t instanceof lt&&t.isColumn===this._isColumn?e+=n:e=Math.max(e,n)}const i=this.calculateContentItemMinSize(t);return Math.max(i,e)}onSplitterDragStart(t){const e=this.getSplitItems(t),i=V(e.before.element.style[this._dimension]),n=V(e.after.element.style[this._dimension]),o=this.calculateContentItemsTotalMinSize(e.before),s=this.calculateContentItemsTotalMinSize(e.after);this._splitterPosition=0,this._splitterMinPosition=Math.min(0,-1*(i-o)),this._splitterMaxPosition=Math.max(0,n-s)}onSplitterDrag(t,e,i){let n=this._isColumn?i:e;if(null===this._splitterMinPosition||null===this._splitterMaxPosition)throw new c("ROCOSD59226");n=Math.max(n,this._splitterMinPosition),n=Math.min(n,this._splitterMaxPosition),this._splitterPosition=n;const o=F(n);this._isColumn?t.element.style.top=o:t.element.style.left=o}onSplitterDragStop(t){if(null===this._splitterPosition)throw new c("ROCOSDS66932");{const e=this.getSplitItems(t),i=V(e.before.element.style[this._dimension]),n=V(e.after.element.style[this._dimension]),o=(this._splitterPosition+i)/(i+n),s=e.before.size+e.after.size;e.before.size=o*s,e.after.size=(1-o)*s,t.element.style.top=F(0),t.element.style.left=F(0),globalThis.requestAnimationFrame((()=>this.updateSize(!1)))}}}!function(t){t.getElementDimensionSize=function(t,e){return"width"===e?function(t){return t.offsetWidth}(t):function(t){return t.offsetHeight}(t)},t.setElementDimensionSize=function(t,e,i){return"width"===e?G(t,i):Z(t,i)},t.createElement=function(t,e){const i=t.createElement("div");return i.classList.add("lm_item"),e?i.classList.add("lm_column"):i.classList.add("lm_row"),i}}(lt||(lt={}));class ht extends nt{constructor(t,e,i){super(),this._config=t,this._initialWindowSize=e,this._layoutManager=i,this._isInitialised=!1,this._popoutWindow=null,this._preventPopInOnClose=!1,this.createWindow()}toConfig(){var t,e;if(!1===this._isInitialised)throw new Error("Can't create config, layout not yet initialised");const i=this.getGlInstance().saveLayout();let n,o;null===this._popoutWindow?(n=null,o=null):(n=null!==(t=this._popoutWindow.screenX)&&void 0!==t?t:this._popoutWindow.screenLeft,o=null!==(e=this._popoutWindow.screenY)&&void 0!==e?e:this._popoutWindow.screenTop);const s={width:this.getGlInstance().width,height:this.getGlInstance().height,left:n,top:o};return{root:i.root,openPopouts:i.openPopouts,settings:i.settings,dimensions:i.dimensions,header:i.header,window:s,parentId:this._config.parentId,indexInParent:this._config.indexInParent,resolved:!0}}getGlInstance(){if(null===this._popoutWindow)throw new c("BPGGI24693");return this._popoutWindow.__glInstance}getWindow(){if(null===this._popoutWindow)throw new c("BPGW087215");return this._popoutWindow}close(t=!1){if(t&&(this._preventPopInOnClose=!0),this.getGlInstance())this.getGlInstance().closeWindow();else try{this.getWindow().close()}catch(t){}}popIn(){let t,e=this._config.indexInParent;if(!this._config.parentId)return;let i=J({},this.getGlInstance().saveLayout()).root;if(void 0===i)return;const n=this._layoutManager.groundItem;if(void 0===n)throw new u("BPPIG34972");if(t=n.getItemsByPopInParentId(this._config.parentId)[0],t||(t=n.contentItems.length>0?n.contentItems[0]:n,e=t.contentItems.length),t.isStack){for(;i.type!==y.component&&1===i.content.length;)i=i.content[0];if(i.type!==y.component){if(null===t.parent)throw new c("BPPIG34973");const i=new lt(!1,this._layoutManager,M.createDefault("row"),t.parent);t.parent.replaceChild(t,i,!1),i.addChild(t),t=i,e=1}}const o=this._layoutManager.createAndInitContentItem(i,t);e=null!==e?Math.max(0,Math.min(t.contentItems.length,e)):null,t.addChild(o,e),this._layoutManager.layoutConfig.settings.popInOnClose?this._onClose():this.close()}createWindow(){const t=this.createUrl(),e=Math.floor(1e6*Math.random()).toString(36),i=this.serializeWindowFeatures({left:this._initialWindowSize.left,top:this._initialWindowSize.top,width:this._initialWindowSize.width,height:this._initialWindowSize.height,innerWidth:this._initialWindowSize.width,innerHeight:this._initialWindowSize.height,menubar:"no",toolbar:"no",location:"no",personalbar:"no",resizable:"yes",scrollbars:"no",status:"no"});if(this._popoutWindow=globalThis.open(t,e,i),this._popoutWindow)this._popoutWindow.addEventListener("load",(()=>{this.positionAndResizeWindow(),this._popoutWindow&&this._popoutWindow.addEventListener("beforeunload",(()=>{this._layoutManager.layoutConfig.settings.popInOnClose&&!this._preventPopInOnClose?this.popIn():this._onClose()}),{passive:!0})}),{passive:!0}),this._checkReadyInterval=setInterval((()=>this.checkReady()),10);else if(!0===this._layoutManager.layoutConfig.settings.blockedPopoutsThrowError)throw new s("Popout blocked")}checkReady(){if(null===this._popoutWindow)throw new c("BPCR01844");this._popoutWindow.__glInstance&&this._popoutWindow.__glInstance.isInitialised&&(this._popoutWindow.__glInstance.parent=this._layoutManager,this.onInitialised(),void 0!==this._checkReadyInterval&&(clearInterval(this._checkReadyInterval),this._checkReadyInterval=void 0))}positionAndResizeWindow(){if(null===this._popoutWindow)throw new c("BPPARW1");if(this._popoutWindow.innerWidth>0&&this._popoutWindow.innerHeight>0&&this._popoutWindow.outerWidth>0&&this._popoutWindow.outerHeight>0&&this._popoutWindow.innerWidth<=this._popoutWindow.outerWidth&&this._popoutWindow.innerHeight<=this._popoutWindow.outerHeight){const t=$(this._popoutWindow);this._popoutWindow.moveTo(this._initialWindowSize.left-t.width,this._initialWindowSize.top-t.height),this._popoutWindow.resizeTo(this._initialWindowSize.width+(this._popoutWindow.outerWidth-this._popoutWindow.innerWidth),this._initialWindowSize.height+(this._popoutWindow.outerHeight-this._popoutWindow.innerHeight))}this._popoutWindow.focus()}serializeWindowFeatures(t){const e=[];for(const i in t)e.push(i+"="+t[i].toString());return e.join(",")}createUrl(){const t="gl-window-config-"+Q(),e=T.minifyConfig(this._config);try{localStorage.setItem(t,JSON.stringify(e))}catch(t){throw new Error("Error while writing to localStorage "+function(t){return t instanceof Error?t.message:"string"==typeof t?t:"Unknown Error"}(t))}const i=new URL("/gl-popout",location.origin);i.searchParams.set("gl-window",t);const n=this._layoutManager.container.dataset.theme;return void 0!==n&&i.searchParams.set("gl-theme",n),i.toString()}onInitialised(){this._isInitialised=!0,this.getGlInstance().on("popIn",(()=>this.popIn())),this.emit("initialised")}_onClose(){setTimeout((()=>this.emit("closed")),50)}}class dt extends at{constructor(t,e,i){super(t,e,i,document.createElement("div")),this._parentItem=i,this._focused=!1,this.isComponent=!0,this._reorderEnabled=e.reorderEnabled,this.applyUpdatableConfig(e),this._initialWantMaximise=e.maximised;const n=document.createElement("div");n.classList.add("lm_content"),this.element.appendChild(n),this._container=new ot(e,this,t,n,(t=>this.handleUpdateItemConfigEvent(t)),(()=>this.show()),(()=>this.hide()),(t=>this.focus(t)),(t=>this.blur(t)))}get componentName(){return this._container.componentType}get componentType(){return this._container.componentType}get reorderEnabled(){return this._reorderEnabled}get initialWantMaximise(){return this._initialWantMaximise}get component(){return this._container.component}get container(){return this._container}get parentItem(){return this._parentItem}get headerConfig(){return this._headerConfig}get title(){return this._title}get tab(){return this._tab}get focused(){return this._focused}destroy(){this._container.destroy(),super.destroy()}applyUpdatableConfig(t){this.setTitle(t.title),this._headerConfig=t.header}toConfig(){const t=this._container.stateRequestEvent,e=void 0===t?this._container.state:t();return{type:y.component,content:[],size:this.size,sizeUnit:this.sizeUnit,minSize:this.minSize,minSizeUnit:this.minSizeUnit,id:this.id,maximised:!1,isClosable:this.isClosable,reorderEnabled:this._reorderEnabled,title:this._title,header:E.Header.createCopy(this._headerConfig),componentType:z.copyComponentType(this.componentType),componentState:e}}close(){if(null===this.parent)throw new c("CIC68883");this.parent.removeChild(this,!1)}enterDragMode(t,e){G(this.element,t),Z(this.element,e),this._container.enterDragMode(t,e)}exitDragMode(){this._container.exitDragMode()}enterStackMaximised(){this._container.enterStackMaximised()}exitStackMaximised(){this._container.exitStackMaximised()}drag(){this._container.drag()}getOuterBoundingClientRect(){var t;const e=this.element.getBoundingClientRect(),i=null===(t=this.headerConfig)||void 0===t?void 0:t.show,n=T.Dimensions.defaults.headerHeight,o="left"===i||"right"===i?n:0,s="top"===i||"bottom"===i||void 0===i?n:0;return DOMRect.fromRect({x:e.left-o,y:e.top-s,width:e.width+o,height:e.height+s})}updateSize(t){this.updateNodeSize(t)}init(){this.updateNodeSize(!1),super.init(),this._container.emit("open"),this.initContentItems()}setTitle(t){this._title=t,this.emit("titleChanged",t),this.emit("stateChanged")}setTab(t){this._tab=t,this.emit("tab",t),this._container.setTab(t)}hide(){super.hide(),this._container.setVisibility(!1)}show(){super.show(),this._container.setVisibility(!0)}focus(t=!1){this.parentItem.setActiveComponentItem(this,!0,t)}setFocused(t){this._focused=!0,this.tab.setFocused(),t||this.emitBaseBubblingEvent("focus")}blur(t=!1){this._focused&&this.layoutManager.setFocusedComponentItem(void 0,t)}setBlurred(t){this._focused=!1,this.tab.setBlurred(),t||this.emitBaseBubblingEvent("blur")}setParent(t){this._parentItem=t,super.setParent(t)}handleUpdateItemConfigEvent(t){this.applyUpdatableConfig(t)}updateNodeSize(t){if("none"!==this.element.style.display){const{width:e,height:i}=q(this.element);this._container.setSizeToNodeSize(e,i,t)}}}class ct extends at{constructor(){super(...arguments),this._focused=!1}get focused(){return this._focused}setFocusedValue(t){this._focused=t}}class ut extends ct{constructor(t,e,i){super(t,P.create(e),null,ut.createElement(document)),this.isGround=!0,this._childElementContainer=this.element,this._containerElement=i;let n=null;for(;;){const t=n?n.previousSibling:this._containerElement.lastChild;if(!(t instanceof Element&&t.classList.contains("lm_content")))break;n=t}this._containerElement.insertBefore(this.element,n)}init(){if(!0!==this.isInitialised){this.updateNodeSize();for(let t=0;t0?this.contentItems[0]:this,n.isComponent)throw new Error("Cannot add item as child to ComponentItem");{const t=this.layoutManager.createAndInitContentItem(i,n);return e=n.addChild(t,e),n===this?-1:e}}loadComponentAsRoot(t){this.clearRoot();const e=D.resolve(t,!1);if(e.maximised)throw new Error("Root Component cannot be maximised");{const t=new dt(this.layoutManager,e,this);t.init(),this.addChild(t,0)}}addChild(t,e){if(this.contentItems.length>0)throw new Error("Ground node can only have a single child");return this._childElementContainer.appendChild(t.element),e=super.addChild(t,e),this.updateSize(!1),this.emitBaseBubblingEvent("stateChanged"),e}calculateConfigContent(){const t=this.contentItems,e=t.length,i=new Array(e);for(let n=0;n0&&(G(this.contentItems[0].element,t),Z(this.contentItems[0].element,e)),this.updateContentItemsSize(!0))}updateSize(t){this.layoutManager.beginVirtualSizedContainerAdding();try{this.updateNodeSize(),this.updateContentItemsSize(t)}finally{this.layoutManager.endVirtualSizedContainerAdding()}}createSideAreas(){const t=ut.Area.oppositeSides,e=new Array(Object.keys(t).length);let i=0;for(const n in t){const o=n,s=this.getElementArea();if(null===s)throw new c("RCSA77553");s.side=o,"2"===t[o][1]?s[o]=s[t[o]]-50:s[o]=s[t[o]]+50,s.surface=(s.x2-s.x1)*(s.y2-s.y1),e[i++]=s}return e}highlightDropZone(t,e,i){this.layoutManager.tabDropPlaceholder.remove(),super.highlightDropZone(t,e,i)}onDrop(t,e){if(t.isComponent){const e=x.createDefault(),i=t;e.header=E.Header.createCopy(i.headerConfig);const n=this.layoutManager.createAndInitContentItem(e,this);n.addChild(t),t=n}if(0===this.contentItems.length)this.addChild(t);else{if(t.type===y.row||t.type===y.column){const e=x.createDefault(),i=this.layoutManager.createContentItem(e,this);i.addChild(t),t=i}const i="x"==e.side[0]?y.row:y.column,n="2"==e.side[1],o=this.contentItems[0];if(o instanceof lt&&o.type===i){const e=o.contentItems[n?0:o.contentItems.length-1];o.addChild(t,n?0:void 0,!0),e.size*=.5,t.size=e.size,t.sizeUnit=I.Percent,o.updateSize(!1)}else{const e=S.createDefault(i),s=this.layoutManager.createContentItem(e,this);this.replaceChild(o,s),s.addChild(t,n?0:void 0,!0),s.addChild(o,n?void 0:0,!0),o.size=50,t.size=50,t.sizeUnit=I.Percent,s.updateSize(!1)}}}dock(){throw new h("GID87731")}validateDocking(){throw new h("GIVD87732")}getAllContentItems(){const t=[this];return this.deepGetAllContentItems(this.contentItems,t),t}getAllComponentItems(){const t=[];return this.deepFilterContentItems(this.contentItems,t,(t=>t.isComponent)),t}getConfigMaximisedItems(){const t=[];return this.deepFilterContentItems(this.contentItems,t,(t=>!(!at.isStack(t)||!t.initialWantMaximise)||!(!at.isComponentItem(t)||!t.initialWantMaximise))),t}getItemsByPopInParentId(t){const e=[];return this.deepFilterContentItems(this.contentItems,e,(e=>e.popInParentIds.includes(t))),e}toConfig(){throw new Error("Cannot generate GroundItem config")}setActiveComponentItem(t,e,i){}updateNodeSize(){const{width:t,height:e}=j(this._containerElement);G(this.element,t),Z(this.element,e),this.contentItems.length>0&&(G(this.contentItems[0].element,t),Z(this.contentItems[0].element,e))}deepGetAllContentItems(t,e){for(let i=0;ithis.onClick(t),this._touchStartEventListener=t=>this.onTouchStart(t),this._element=document.createElement("div"),this._element.classList.add(i),this._element.title=e,this._header.on("destroy",(()=>this.destroy())),this._element.addEventListener("click",this._clickEventListener,{passive:!0}),this._element.addEventListener("touchstart",this._touchStartEventListener,{passive:!0}),this._header.controlsContainerElement.appendChild(this._element)}get element(){return this._element}destroy(){var t;this._element.removeEventListener("click",this._clickEventListener),this._element.removeEventListener("touchstart",this._touchStartEventListener),null===(t=this._element.parentNode)||void 0===t||t.removeChild(this._element)}onClick(t){this._pushEvent(t)}onTouchStart(t){this._pushEvent(t)}}class pt{constructor(t,e,i,n,o){var s;this._layoutManager=t,this._componentItem=e,this._closeEvent=i,this._focusEvent=n,this._dragStartEvent=o,this._isActive=!1,this._tabClickListener=t=>this.onTabClickDown(t),this._tabTouchStartListener=t=>this.onTabTouchStart(t),this._closeClickListener=()=>this.onCloseClick(),this._closeTouchStartListener=()=>this.onCloseTouchStart(),this._dragStartListener=(t,e)=>this.onDragStart(t,e),this._contentItemDestroyListener=()=>this.onContentItemDestroy(),this._tabTitleChangedListener=t=>this.setTitle(t),this._element=document.createElement("div"),this._element.classList.add("lm_tab"),this._titleElement=document.createElement("span"),this._titleElement.classList.add("lm_title"),this._closeElement=document.createElement("div"),this._closeElement.classList.add("lm_close_tab"),this._element.appendChild(this._titleElement),this._element.appendChild(this._closeElement),e.isClosable?(this._closeElement.style.display="",this.element.classList.add("lm_closable")):this._closeElement.style.display="none",this.setTitle(e.title),this._componentItem.on("titleChanged",this._tabTitleChangedListener),(null!==(s=e.reorderEnabled)&&void 0!==s?s:this._layoutManager.layoutConfig.settings.reorderEnabled)&&this.enableReorder(),this._element.addEventListener("click",this._tabClickListener,{passive:!0}),this._element.addEventListener("touchstart",this._tabTouchStartListener,{passive:!0}),this._componentItem.isClosable?(this._closeElement.addEventListener("click",this._closeClickListener,{passive:!0}),this._closeElement.addEventListener("touchstart",this._closeTouchStartListener,{passive:!0})):(this._closeElement.remove(),this._closeElement=void 0),this._componentItem.setTab(this),this._layoutManager.emit("tabCreated",this)}get isActive(){return this._isActive}get componentItem(){return this._componentItem}get contentItem(){return this._componentItem}get element(){return this._element}get titleElement(){return this._titleElement}get closeElement(){return this._closeElement}get reorderEnabled(){return void 0!==this._dragListener}set reorderEnabled(t){t!==this.reorderEnabled&&(t?this.enableReorder():this.disableReorder())}setTitle(t){this._titleElement.innerText=t,this._element.title=t}setActive(t){t!==this._isActive&&(this._isActive=t,t?this._element.classList.add("lm_active"):this._element.classList.remove("lm_active"))}destroy(){var t,e;this._closeEvent=void 0,this._focusEvent=void 0,this._dragStartEvent=void 0,this._element.removeEventListener("click",this._tabClickListener),this._element.removeEventListener("touchstart",this._tabTouchStartListener),null===(t=this._closeElement)||void 0===t||t.removeEventListener("click",this._closeClickListener),null===(e=this._closeElement)||void 0===e||e.removeEventListener("touchstart",this._closeTouchStartListener),this._componentItem.off("titleChanged",this._tabTitleChangedListener),this.reorderEnabled&&this.disableReorder(),this._element.remove()}setBlurred(){this._element.classList.remove("lm_focused"),this._titleElement.classList.remove("lm_focused")}setFocused(){this._element.classList.add("lm_focused"),this._titleElement.classList.add("lm_focused")}onDragStart(t,e){if(void 0===this._dragListener)throw new u("TODSDLU10093");if(void 0===this._dragStartEvent)throw new u("TODS23309");this._dragStartEvent(t,e,this._dragListener,this.componentItem)}onContentItemDestroy(){void 0!==this._dragListener&&(this._dragListener.destroy(),this._dragListener=void 0)}onTabClickDown(t){const e=t.target;e!==this._element&&e!==this._titleElement||(0===t.button?this.notifyFocus():1===t.button&&this._componentItem.isClosable&&this.notifyClose())}onTabTouchStart(t){t.target===this._element&&this.notifyFocus()}onCloseClick(){this.notifyClose()}onCloseTouchStart(){this.notifyClose()}notifyClose(){if(void 0===this._closeEvent)throw new u("TNC15007");this._closeEvent(this._componentItem)}notifyFocus(){if(void 0===this._focusEvent)throw new u("TNA15007");this._focusEvent(this._componentItem)}enableReorder(){this._dragListener=new st(this._element,[this._titleElement]),this._dragListener.on("dragStart",this._dragStartListener),this._componentItem.on("destroy",this._contentItemDestroyListener)}disableReorder(){if(void 0===this._dragListener)throw new u("TDR87745");this._componentItem.off("destroy",this._contentItemDestroyListener),this._dragListener.off("dragStart",this._dragStartListener),this._dragListener=void 0}}class gt{constructor(t,e,i,n,o){this._layoutManager=t,this._componentRemoveEvent=e,this._componentFocusEvent=i,this._componentDragStartEvent=n,this._dropdownActiveChangedEvent=o,this._tabs=[],this._lastVisibleTabIndex=-1,this._dropdownActive=!1,this._element=document.createElement("section"),this._element.classList.add("lm_tabs"),this._dropdownElement=document.createElement("section"),this._dropdownElement.classList.add("lm_tabdropdown_list"),this._dropdownElement.style.display="none"}get tabs(){return this._tabs}get tabCount(){return this._tabs.length}get lastVisibleTabIndex(){return this._lastVisibleTabIndex}get element(){return this._element}get dropdownElement(){return this._dropdownElement}get dropdownActive(){return this._dropdownActive}destroy(){for(let t=0;tthis.handleTabCloseEvent(t)),(t=>this.handleTabFocusEvent(t)),((t,e,i,n)=>this.handleTabDragStartEvent(t,e,i,n)));void 0===e&&(e=this._tabs.length),this._tabs.splice(e,0,i),ethis._lastVisibleTabIndex){const t=this._tabs[e];for(let t=e;t>0;t--)this._tabs[t]=this._tabs[t-1];this._tabs[0]=t}}updateTabSizes(t,e){let i=!1;this.tryUpdateTabSizes(i,t,e)||(i=!0,this.tryUpdateTabSizes(i,t,e)),this._element.style.maxWidth=F(Math.max(0,t)),i!==this._dropdownActive&&(this._dropdownActive=i,this._dropdownActiveChangedEvent())}tryUpdateTabSizes(t,e,i){if(this._tabs.length>0){if(void 0===i)throw new Error("non-empty tabs must have active component item");let n=0,o=!1;const s=this._layoutManager.layoutConfig.settings.tabOverlapAllowance,r=this._tabs.indexOf(i.tab),a=this._tabs[r];this._lastVisibleTabIndex=-1;for(let i=0;ie){if(o)i===r&&(l.style.zIndex="auto",l.style.marginLeft="",l.parentElement!==this._element&&this._element.appendChild(l));else{let t;if(t=r>0&&r<=i?(d-e)/(i-1):(d-e)/i,tthis.onClick(t),this._touchStartListener=t=>this.onTouchStart(t),this._layoutStateListener=()=>this.onLayoutChanged(),this._tabsContainer=new gt(this._layoutManager,(t=>this.handleTabInitiatedComponentRemoveEvent(t)),(t=>this.handleTabInitiatedComponentFocusEvent(t)),((t,e,i,n)=>this.handleTabInitiatedDragStartEvent(t,e,i,n)),(()=>this.processTabDropdownActiveChanged())),this._show=i.show,this._popoutLabel=i.popoutLabel,this._maximiseLabel=i.maximiseLabel,this._minimiseLabel=i.minimiseLabel,this._closeLabel=i.closeLabel,this._tabDropdownEnabled=i.tabDropdownEnabled,this._tabDropdownLabel=i.tabDropdownLabel,this.setSide(i.side),this._element=document.createElement("section"),this._element.classList.add("lm_header"),this._controlsContainerElement=document.createElement("section"),this._controlsContainerElement.classList.add("lm_controls"),this._element.appendChild(this._tabsContainer.element),this._element.appendChild(this._controlsContainerElement),this._element.appendChild(this._tabsContainer.dropdownElement),this._element.addEventListener("click",this._clickListener,{passive:!0}),this._element.addEventListener("touchstart",this._touchStartListener,{passive:!0}),this._documentMouseUpListener=()=>this._tabsContainer.hideAdditionalTabsDropdown(),globalThis.document.addEventListener("mouseup",this._documentMouseUpListener,{passive:!0}),this._tabControlOffset=this._layoutManager.layoutConfig.settings.tabControlOffset,this._tabDropdownEnabled&&(this._tabDropdownButton=new mt(this,this._tabDropdownLabel,"lm_tabdropdown",(()=>this._tabsContainer.showAdditionalTabsDropdown()))),this._popoutButton=new mt(this,this._popoutLabel,"lm_popout",(()=>this.handleButtonPopoutEvent())),this._maximiseButton=new mt(this,this._maximiseLabel,"lm_maximise",(t=>this.handleButtonMaximiseToggleEvent(t))),this._closeButton=new mt(this,this._closeLabel,"lm_close",(()=>o())),this.processTabDropdownActiveChanged(),this.layoutManager.addEventListener("stateChanged",this._layoutStateListener)}get show(){return this._show}get side(){return this._side}get leftRightSided(){return this._leftRightSided}get layoutManager(){return this._layoutManager}get parent(){return this._parent}get tabs(){return this._tabsContainer.tabs}get lastVisibleTabIndex(){return this._tabsContainer.lastVisibleTabIndex}get element(){return this._element}get tabsContainerElement(){return this._tabsContainer.element}get controlsContainerElement(){return this._controlsContainerElement}destroy(){this.emit("destroy"),this._popoutEvent=void 0,this._maximiseToggleEvent=void 0,this._clickEvent=void 0,this._touchStartEvent=void 0,this._componentRemoveEvent=void 0,this._componentFocusEvent=void 0,this._componentDragStartEvent=void 0,this._tabsContainer.destroy(),globalThis.document.removeEventListener("mouseup",this._documentMouseUpListener),this.layoutManager.removeEventListener("stateChanged",this._layoutStateListener),this._element.remove()}createTab(t,e){this._tabsContainer.createTab(t,e)}removeTab(t){this._tabsContainer.removeTab(t)}processActiveComponentChanged(t){this._tabsContainer.processActiveComponentChanged(t),this.updateTabSizes()}setSide(t){this._side=t,this._leftRightSided=[_.right,_.left].includes(this._side)}updateButtons(){var t,e,i;const n=this._getActiveComponentItemEvent(),o=null===this._parent.findAncestorWithSiblings(),s=null===this.layoutManager.parent,r=this.tabs.every((t=>t.componentItem.isClosable)),a=!1!==(null===(t=null==n?void 0:n.headerConfig)||void 0===t?void 0:t.close);Y(this._closeButton.element,r&&a);let l=!1!==(null===(e=null==n?void 0:n.headerConfig)||void 0===e?void 0:e.popout);this._layoutManager.layoutConfig.settings.popoutWholeStack?l&&(l=!o||s):l&&(l=!o||this.tabs.length>1||s),Y(this._popoutButton.element,l);const h=(!1!==(null===(i=null==n?void 0:n.headerConfig)||void 0===i?void 0:i.maximise)||this._parent.isMaximised)&&!o;Y(this._maximiseButton.element,h)}applyFocusedValue(t){t?this._element.classList.add("lm_focused"):this._element.classList.remove("lm_focused")}processMaximised(){if(void 0===this._maximiseButton)throw new u("HPMAX16997");this._maximiseButton.element.setAttribute("title",this._minimiseLabel)}processMinimised(){if(void 0===this._maximiseButton)throw new u("HPMIN16997");this._maximiseButton.element.setAttribute("title",this._maximiseLabel)}updateTabSizes(){if(this._tabsContainer.tabCount>0){const t=this._show?this._layoutManager.layoutConfig.dimensions.headerHeight:0;let e;this._leftRightSided?(this._element.style.height="",this._element.style.width=F(t)):(this._element.style.width="",this._element.style.height=F(t)),e=this._leftRightSided?this._element.offsetHeight-this._controlsContainerElement.offsetHeight-this._tabControlOffset:this._element.offsetWidth-this._controlsContainerElement.offsetWidth-this._tabControlOffset,this._tabsContainer.updateTabSizes(e,this._getActiveComponentItemEvent())}}handleTabInitiatedComponentRemoveEvent(t){if(void 0===this._componentRemoveEvent)throw new u("HHTCE22294");this._componentRemoveEvent(t)}handleTabInitiatedComponentFocusEvent(t){if(void 0===this._componentFocusEvent)throw new u("HHTAE22294");this._componentFocusEvent(t)}handleTabInitiatedDragStartEvent(t,e,i,n){if(void 0===this._componentDragStartEvent)throw new u("HHTDSE22294");this._componentDragStartEvent(t,e,i,n)}processTabDropdownActiveChanged(){void 0!==this._tabDropdownButton&&Y(this._tabDropdownButton.element,this._tabsContainer.dropdownActive)}handleButtonPopoutEvent(){if(this._layoutManager.layoutConfig.settings.popoutWholeStack){if(void 0===this._popoutEvent)throw new u("HHBPOE17834");this._popoutEvent()}else{const t=this._getActiveComponentItemEvent();t&&t.popout()}}handleButtonMaximiseToggleEvent(t){if(void 0===this._maximiseToggleEvent)throw new u("HHBMTE16834");this._maximiseToggleEvent()}onClick(t){t.target===this._element&&this.notifyClick(t)}onTouchStart(t){t.target===this._element&&this.notifyTouchStart(t)}onLayoutChanged(){this.updateButtons()}notifyClick(t){if(void 0===this._clickEvent)throw new u("HNHC46834");this._clickEvent(t)}notifyTouchStart(t){if(void 0===this._touchStartEvent)throw new u("HNHTS46834");this._touchStartEvent(t)}}class ft extends ct{constructor(t,e,i){var n,o,s,r,a,l,h,d,c,u,m,p,g,f,v,C,y,w,I;super(t,e,i,ft.createElement(document)),this._headerSideChanged=!1,this._resizeListener=()=>this.handleResize(),this._maximisedListener=()=>this.handleMaximised(),this._minimisedListener=()=>this.handleMinimised(),this._headerConfig=e.header;const b=t.layoutConfig.header,S=e.content;let E;E=1!==S.length?void 0:S[0].header,this._initialWantMaximise=e.maximised,this._initialActiveItemIndex=null!==(n=e.activeItemIndex)&&void 0!==n?n:0;const x=null!==(r=null!==(s=null===(o=this._headerConfig)||void 0===o?void 0:o.show)&&void 0!==s?s:null==E?void 0:E.show)&&void 0!==r?r:b.show,z=null!==(h=null!==(l=null===(a=this._headerConfig)||void 0===a?void 0:a.popout)&&void 0!==l?l:null==E?void 0:E.popout)&&void 0!==h?h:b.popout,M=null!==(u=null!==(c=null===(d=this._headerConfig)||void 0===d?void 0:d.maximise)&&void 0!==c?c:null==E?void 0:E.maximise)&&void 0!==u?u:b.maximise,L=null!==(g=null!==(p=null===(m=this._headerConfig)||void 0===m?void 0:m.close)&&void 0!==p?p:null==E?void 0:E.close)&&void 0!==g?g:b.close,P=null!==(C=null!==(v=null===(f=this._headerConfig)||void 0===f?void 0:f.minimise)&&void 0!==v?v:null==E?void 0:E.minimise)&&void 0!==C?C:b.minimise,T=null!==(I=null!==(w=null===(y=this._headerConfig)||void 0===y?void 0:y.tabDropdown)&&void 0!==w?w:null==E?void 0:E.tabDropdown)&&void 0!==I?I:b.tabDropdown;this._maximisedEnabled=!1!==M;const A={show:!1!==x,side:!1===x?_.top:x,popoutEnabled:!1!==z,popoutLabel:!1===z?"":z,maximiseEnabled:this._maximisedEnabled,maximiseLabel:!1===M?"":M,closeEnabled:!1!==L,closeLabel:!1===L?"":L,minimiseEnabled:!0,minimiseLabel:P,tabDropdownEnabled:!1!==T,tabDropdownLabel:!1===T?"":T};this._header=new _t(t,this,A,(()=>this.getActiveComponentItem()),(()=>this.remove()),(()=>this.handlePopoutEvent()),(()=>this.toggleMaximise()),(t=>this.handleHeaderClickEvent(t)),(t=>this.handleHeaderTouchStartEvent(t)),(t=>this.handleHeaderComponentRemoveEvent(t)),(t=>this.handleHeaderComponentFocusEvent(t)),((t,e,i,n)=>this.handleHeaderComponentStartDragEvent(t,e,i,n))),this.isStack=!0,this._childElementContainer=document.createElement("section"),this._childElementContainer.classList.add("lm_items"),this.on("resize",this._resizeListener),this._maximisedEnabled&&(this.on("maximised",this._maximisedListener),this.on("minimised",this._minimisedListener)),this.element.appendChild(this._header.element),this.element.appendChild(this._childElementContainer),this.setupHeaderPosition()}get childElementContainer(){return this._childElementContainer}get header(){return this._header}get headerShow(){return this._header.show}get headerSide(){return this._header.side}get headerLeftRightSided(){return this._header.leftRightSided}get contentAreaDimensions(){return this._contentAreaDimensions}get initialWantMaximise(){return this._initialWantMaximise}get isMaximised(){return this===this.layoutManager.maximisedStack}get stackParent(){if(!this.parent)throw new Error("Stack should always have a parent");return this.parent}updateSize(t){this.layoutManager.beginVirtualSizedContainerAdding();try{this.updateNodeSize(),this.updateContentItemsSize(t)}finally{this.layoutManager.endVirtualSizedContainerAdding()}}init(){if(!0===this.isInitialised)return;this.updateNodeSize();for(let t=0;t0){if(this._initialActiveItemIndex<0||this._initialActiveItemIndex>=e)throw new Error(`ActiveItemIndex out of range: ${this._initialActiveItemIndex} id: ${this.id}`);for(let i=0;ithis.contentItems.length)throw e-=1,new h("SAC99728");if(t instanceof dt)return e=super.addChild(t,e),this._childElementContainer.appendChild(t.element),this._header.createTab(t,e),this.setActiveComponentItem(t,i),this._header.updateTabSizes(),this.updateSize(!1),t.container.setBaseLogicalZIndex(),this.emitStateChangedEvent(),e;throw new h("SACC88532")}removeChild(t,e){const i=t,n=this.contentItems.indexOf(i),o=1===this.contentItems.length;if(this._activeComponentItem===i&&(i.focused&&i.blur(),!o)){const t=0===n?1:n-1;this.setActiveComponentItem(this.contentItems[t],!1)}this._header.removeTab(i),super.removeChild(i,e),this.emitStateChangedEvent()}toggleMaximise(){this.isMaximised?this.minimise():this.maximise()}maximise(){if(!this.isMaximised){this.layoutManager.setMaximisedStack(this);const t=this.contentItems,e=t.length;for(let i=0;i0&&void 0===t)throw new Error("expected non-empty stack to have an active component item");return{type:"stack",content:this.calculateConfigContent(),size:this.size,sizeUnit:this.sizeUnit,minSize:this.minSize,minSizeUnit:this.minSizeUnit,id:this.id,isClosable:this.isClosable,maximised:this.isMaximised,header:this.createHeaderConfig(),activeItemIndex:t}}onDrop(t,e){if("header"===this._dropSegment){if(this.resetHeaderDropZone(),void 0===this._dropIndex)throw new u("SODDI68990");return void this.addChild(t,this._dropIndex)}if("body"===this._dropSegment)return void this.addChild(t,0,!0);const i="top"===this._dropSegment||"bottom"===this._dropSegment,n="left"===this._dropSegment||"right"===this._dropSegment,o="top"===this._dropSegment||"left"===this._dropSegment,s=i&&this.stackParent.isColumn||n&&this.stackParent.isRow;if(t.isComponent){const e=x.createDefault();e.header=t.headerConfig;const i=this.layoutManager.createAndInitContentItem(e,this);i.addChild(t),t=i}if(t.type===y.row||t.type===y.column){const e=x.createDefault();e.header=this.createHeaderConfig();const i=this.layoutManager.createContentItem(e,this);i.addChild(t),t=i}if(s){const e=this.stackParent.contentItems.indexOf(this);this.stackParent.addChild(t,o?e:e+1,!0),this.size*=.5,t.size=this.size,t.sizeUnit=this.sizeUnit,this.stackParent.updateSize(!1)}else{const e=i?y.column:y.row,n=S.createDefault(e),s=this.layoutManager.createContentItem(n,this);this.stackParent.replaceChild(this,s),s.addChild(t,o?0:void 0,!0),s.addChild(this,o?void 0:0,!0),this.size=50,t.size=50,t.sizeUnit=I.Percent,s.updateSize(!1)}}highlightDropZone(t,e){for(const i in this._contentAreaDimensions){const n=i,o=this._contentAreaDimensions[n].hoverArea;if(o.x1t&&o.y1e)return void("header"===n?(this._dropSegment="header",this.highlightHeaderDropZone(this._header.leftRightSided?e:t)):(this.resetHeaderDropZone(),this.highlightBodyDropZone(n)))}}getArea(){if("none"===this.element.style.display)return null;const t=super.getElementArea(this._header.element),e=super.getElementArea(this._childElementContainer);if(null===t||null===e)throw new c("SGAHC13086");const i=e.x2-e.x1,n=e.y2-e.y1;return this._contentAreaDimensions={header:{hoverArea:{x1:t.x1,y1:t.y1,x2:t.x2,y2:t.y2},highlightArea:{x1:t.x1,y1:t.y1,x2:t.x2,y2:t.y2}}},0===this.contentItems.length?(this._contentAreaDimensions.body={hoverArea:{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2},highlightArea:{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2}},super.getElementArea(this.element)):(this._contentAreaDimensions.left={hoverArea:{x1:e.x1,y1:e.y1,x2:e.x1+.25*i,y2:e.y2},highlightArea:{x1:e.x1,y1:e.y1,x2:e.x1+.5*i,y2:e.y2}},this._contentAreaDimensions.top={hoverArea:{x1:e.x1+.25*i,y1:e.y1,x2:e.x1+.75*i,y2:e.y1+.5*n},highlightArea:{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y1+.5*n}},this._contentAreaDimensions.right={hoverArea:{x1:e.x1+.75*i,y1:e.y1,x2:e.x2,y2:e.y2},highlightArea:{x1:e.x1+.5*i,y1:e.y1,x2:e.x2,y2:e.y2}},this._contentAreaDimensions.bottom={hoverArea:{x1:e.x1+.25*i,y1:e.y1+.5*n,x2:e.x1+.75*i,y2:e.y2},highlightArea:{x1:e.x1,y1:e.y1+.5*n,x2:e.x2,y2:e.y2}},super.getElementArea(this.element))}positionHeader(t){this._header.side!==t&&(this._header.setSide(t),this._headerSideChanged=!0,this.setupHeaderPosition())}updateNodeSize(){if("none"!==this.element.style.display){const t=q(this.element);this._header.show&&(t[this._header.leftRightSided?g.width:g.height]-=this.layoutManager.layoutConfig.dimensions.headerHeight),G(this._childElementContainer,t.width),Z(this._childElementContainer,t.height);for(let e=0;e=o&&t=0&&this._proxyContainerElement.insertAdjacentElement("afterend",n)),this._element.style.left=F(t),this._element.style.top=F(e),s.setAttribute("title",this._componentItem.title),r.insertAdjacentText("afterbegin",this._componentItem.title),this._proxyContainerElement.appendChild(this._componentItem.element)}drag(t,e){const i=this.setDropPosition(t,e);return this._componentItem.drag(),i}setDropPosition(t,e){this._element.style.left=F(t),this._element.style.top=F(e);const i=this.layoutManager.getArea(t,e);return(null!==i||t=this._groundArea.x2||e=this._groundArea.y2)&&(this._lastArea=i),this._lastArea}drop(){this._componentItem.exitDragMode();let t=null,e=null;const i=this._action.currentTarget;if((null==i?void 0:i.owner)===this._action&&(t=i.area),null!==t)e=this._componentItem,t.contentItem.onDrop(e,t),this.layoutManager.focusWindow();else if(null===i&&null===this._action.parent){const t=X(globalThis),e={left:t.left+this.element.offsetLeft,top:t.top+this.element.offsetTop,width:this._originalSize.width,height:this._originalSize.height};this.layoutManager.createPopoutFromContentItem(this._componentItem,e,Q(),this._dockPoint),this._componentItem.destroy()}else this._componentItem.destroy();this.layoutManager.emit("itemDropped",this._componentItem),this._componentItemFocused&&(null==e||e.focus()),this._element.remove()}setDimensions(){const t=this.layoutManager.layoutConfig.dimensions;if(void 0===t)throw new Error("DragProxy.setDimensions: dimensions undefined");let e=t.dragProxyWidth,i=t.dragProxyHeight;if(void 0===e||void 0===i)throw new Error("DragProxy.setDimensions: width and/or height undefined");this._outerWidth=e,this._outerHeight=i;const n=!1===this.layoutManager.layoutConfig.header.show?0:t.headerHeight;this._element.style.width=F(e),this._element.style.height=F(i),e-=this._sided?n:0,i-=this._sided?0:n,this._proxyContainerElement.style.width=F(e),this._proxyContainerElement.style.height=F(i),this._componentItem.enterDragMode(e,i),this._componentItem.show()}}class Ct{constructor(t,e,i,n){if(this._owner=t,this._area=e,this._pageX=i,this._pageY=n,t.layoutManager!==e.contentItem.layoutManager)throw Error("LayoutManager of Area and DragProxy must match")}get owner(){return this._owner}get area(){return this._area}drop(t){this._area.contentItem.onDrop(t,this._area)}highlightDropZone(){this.area.contentItem.highlightDropZone(this._pageX,this._pageY,this._area)}}class yt extends nt{constructor(t,e=!1,i=null){super(),this._layoutManager=t,this._allowPopout=e,this._parent=i,this._dragProxy=null,this._currentTarget=null,this._dragListener=null,this._actions=[],this._dragEventHandler=(t,e,i)=>this.onDrag(i),this._dragStopEventHandler=()=>this.onDragStop(),this._boundingRect=this.computeBoundingRect(),this.parentOrSelf._actions.push(this)}get layoutManager(){return this._layoutManager}get parent(){return this._parent}get proxy(){return this._dragProxy}get parentOrSelf(){var t;return null!==(t=this._parent)&&void 0!==t?t:this}get currentTarget(){return this.parentOrSelf._currentTarget}set currentTarget(t){this.parentOrSelf._currentTarget=t}computeBoundingRect(){if(void 0===this._layoutManager.groundItem)throw new u("DACBR11120");{const t=this._layoutManager.groundItem.element.getBoundingClientRect();return DOMRect.fromRect({x:document.body.scrollLeft+t.left,y:document.body.scrollTop+t.top,width:t.width,height:t.height})}}screenToPage(t,e){const i=X(globalThis);return{x:document.body.scrollLeft+t-i.left,y:document.body.scrollTop+e-i.top}}isProxyVisible(t,e,i){return e>=this._boundingRect.left-t.outerWidth&&e=this._boundingRect.top-t.outerHeight&&ithis.onDragStart(t,e))),this._dragListener.on("dragStop",(()=>this.onDragStop()))}onDragStart(t,e){var i,n;const o="component";let s;if("function"==typeof this._componentTypeOrFtn){const t=this._componentTypeOrFtn();s=wt.isDragSourceComponentItemConfig(t)?{type:o,componentState:t.state,componentType:t.type,title:null!==(i=t.title)&&void 0!==i?i:this._title}:t}else s={type:o,componentState:this._componentState,componentType:this._componentTypeOrFtn,title:this._title,id:this._id};const r=W.resolve(s,!1),a=new dt(this._layoutManager,r,this._dummyGroundContentItem);if(this._dummyGroundContentItem.contentItems.push(a),null===this._dragListener)throw new c("DSODSD66746");{const i=yt.start(this._layoutManager,this._dragListener,a,t,e,!1),o=this._layoutManager.transitionIndicator;if(null===o)throw new c("DSODST66746");{const t=null===(n=i.proxy)||void 0===n?void 0:n.element;if(void 0===t)throw new u("DSODST66747");o.transitionElements(this._element,t)}}}onDragStop(){this.createDragListener()}removeDragListener(){null!==this._dragListener&&(this._dragListener.destroy(),this._dragListener=null)}}!function(t){t.isDragSourceComponentItemConfig=function(t){return!("componentType"in t)}}(wt||(wt={}));class It{constructor(){this._element=document.createElement("div"),this._element.classList.add("lm_dropTargetIndicator");const t=document.createElement("div");t.classList.add("lm_inner"),this._element.appendChild(t),document.body.appendChild(this._element)}destroy(){this._element.remove()}highlightArea(t,e){this._element.style.left=F(t.x1+e),this._element.style.top=F(t.y1+e),this._element.style.width=F(t.x2-t.x1-e-1),this._element.style.height=F(t.y2-t.y1-e-1),this._element.style.visibility="visible"}hide(){this._element.style.visibility="hidden"}}class bt{constructor(){this._element=document.createElement("div"),this._element.classList.add("lm_transition_indicator"),document.body.appendChild(this._element),this._toElement=null,this._fromDimensions=null,this._totalAnimationDuration=200,this._animationStartTime=null}destroy(){this._element.remove()}transitionElements(t,e){}nextAnimationFrame(){}measure(t){const e=t.getBoundingClientRect();return{left:e.left,top:e.top,width:t.offsetWidth,height:t.offsetHeight}}}class St extends nt{constructor(t){super(),this._layoutManager=t,this._childEventListener=t=>this.onEventFromChild(t),globalThis.addEventListener(St.ChildEventName,this._childEventListener,{passive:!0})}emit(t,...e){"userBroadcast"===t?this.emitUserBroadcast(...e):super.emit(t,...e)}emitUserBroadcast(...t){this.handleUserBroadcastEvent("userBroadcast",t)}destroy(){globalThis.removeEventListener(St.ChildEventName,this._childEventListener)}handleUserBroadcastEvent(t,e){this._layoutManager.isSubWindow?this.propagateToParent(t,e):this.propagateToThisAndSubtree(t,e)}onEventFromChild(t){const e=t.detail;this.handleUserBroadcastEvent(e.eventName,e.args)}propagateToParent(t,e){const i={bubbles:!0,cancelable:!0,detail:{layoutManager:this._layoutManager,eventName:t,args:e}},n=new CustomEvent(St.ChildEventName,i),o=globalThis.opener;if(null===o)throw new c("EHPTP15778");o.dispatchEvent(n)}propagateToThisAndSubtree(t,e){this.emitUnknown(t,...e);for(let i=0;ithis.handleContainerResize())),this._windowBeforeUnloadListener=()=>this.onBeforeUnload(),this._windowBeforeUnloadListening=!1,this._maximisedStackBeforeDestroyedListener=t=>this.cleanupBeforeMaximisedStackDestroyed(t),this.moveWindowTop=()=>{},this.focusWindow=()=>globalThis.focus(),this.isSubWindow=e.isSubWindow,this._constructorOrSubWindowLayoutConfig=e.constructorOrSubWindowLayoutConfig,t.checkInitialise(),b.checkInitialise(),void 0!==e.containerElement&&(this._containerElement=e.containerElement)}get container(){return this._containerElement}get isInitialised(){return this._isInitialised}get isDragging(){return document.body.classList.contains("lm_dragging")}get groundItem(){return this._groundItem}get root(){return this._groundItem}get openPopouts(){return this._openPopouts}get dropTargetIndicator(){return this._dropTargetIndicator}get transitionIndicator(){return this._transitionIndicator}get width(){return this._width}get height(){return this._height}get eventHub(){return this._eventHub}get rootItem(){if(void 0===this._groundItem)throw new Error("Cannot access rootItem before init");return 0===this._groundItem.contentItems.length?void 0:this._groundItem.contentItems[0]}get focusedComponentItem(){return this._focusedComponentItem}get tabDropPlaceholder(){return this._tabDropPlaceholder}get maximisedStack(){return this._maximisedStack}get deprecatedConstructor(){return!this.isSubWindow&&void 0!==this._constructorOrSubWindowLayoutConfig}get parent(){return this._parent}set parent(t){this._parent=t}get instances(){var t;const e=[],i=null!==(t=this.parent)&&void 0!==t?t:this;e.push(i);for(let t of i.openPopouts){const i=t.getGlInstance();e.push(i)}return e}destroy(){if(this._isInitialised){this._windowBeforeUnloadListening&&(globalThis.removeEventListener("beforeunload",this._windowBeforeUnloadListener),this._windowBeforeUnloadListening=!1),!0===this.layoutConfig.settings.closePopoutsOnUnload&&this.closeAllOpenPopouts(),this._resizeObserver.disconnect(),this.checkClearResizeTimeout(),void 0!==this._groundItem&&this._groundItem.destroy(),this._tabDropPlaceholder.remove(),null!==this._dropTargetIndicator&&this._dropTargetIndicator.destroy(),null!==this._transitionIndicator&&this._transitionIndicator.destroy(),this._eventHub.destroy();for(const t of this._dragSources)t.destroy();this._dragSources=[],this._isInitialised=!1}}minifyConfig(t){return T.minifyConfig(t)}unminifyConfig(t){return T.unminifyConfig(t)}init(){var t;this.setContainer(),this._dropTargetIndicator=new It,this._transitionIndicator=new bt,this.updateSizeFromContainer(),this.layoutConfig=T.createDefault(),this._groundItem=new ut(this,this.layoutConfig.root,this._containerElement),this._groundItem.init(),this.checkLoadedLayoutMaximiseItem(),this._resizeObserver.observe(this._containerElement),this._isInitialised=!0,this.adjustColumnsResponsive(),this.emit("initialised");let e=this._constructorOrSubWindowLayoutConfig;this.isSubWindow&&void 0!==e&&((null===(t=e.root)||void 0===t?void 0:t.type)==y.component&&(e.root={type:y.stack,content:[e.root]}),this.loadLayout(e))}loadLayout(t){if(!this.isInitialised)throw new Error("GoldenLayout: Need to call init() if LayoutConfig with defined root passed to constructor");if(void 0===this._groundItem)throw new u("LMLL11119");this.layoutConfig=B.resolve(t),this.createSubWindows(),this._groundItem.loadRoot(this.layoutConfig.root),this.checkLoadedLayoutMaximiseItem(),this.adjustColumnsResponsive()}saveLayout(){if(!1===this._isInitialised)throw new Error("Can't create config, layout not yet initialised");if(void 0===this._groundItem)throw new u("LMTC18244");{const t=this._groundItem.calculateConfigContent();let e;e=1!==t.length?void 0:t[0],this.reconcilePopoutWindows();const i=[];for(let t=0;t=0?n=this._groundItem.contentItems[0]:e=0;break;case y.row:case y.column:e=n.addItem(t,i.index);break;case y.stack:if(D.isComponent(t)){e=n.addItem(t,i.index);break}throw Error(m[6]);case y.component:throw new h("LMAIALC87444602");default:throw new d("LMAIALU98881733",n.type)}if(D.isComponent(t)){const t=n.contentItems[e];at.isStack(t)&&(n=t,e=0)}return i.parentItem=n,i.index=e,i}}}loadComponentAsRoot(t){if(void 0===this._groundItem)throw new Error("Cannot add item before init");this._groundItem.loadComponentAsRoot(t)}updateSize(t,e){this.setSize(t,e)}setSize(t,e){if(this._width=t,this._height=e,!0===this._isInitialised){if(void 0===this._groundItem)throw new u("LMUS18881");if(this._groundItem.setSize(this._width,this._height),this._maximisedStack){const{width:t,height:e}=j(this._containerElement);G(this._maximisedStack.element,t),Z(this._maximisedStack.element,e),this._maximisedStack.updateSize(!1)}this.adjustColumnsResponsive()}}beginSizeInvalidation(){this._sizeInvalidationBeginCount++}endSizeInvalidation(){0==--this._sizeInvalidationBeginCount&&this.updateSizeFromContainer()}updateSizeFromContainer(){const{width:t,height:e}=j(this._containerElement);this.setSize(t,e)}updateRootSize(t=!1){if(void 0===this._groundItem)throw new u("LMURS28881");this._groundItem.updateSize(t)}createAndInitContentItem(t,e){const i=this.createContentItem(t,e);return i.init(),i}createContentItem(t,e){if("string"!=typeof t.type)throw new o("Missing parameter 'type'",JSON.stringify(t));return!S.isComponentItem(t)||e instanceof ft||!e||!0===this.isSubWindow&&e instanceof ut||(t={type:y.stack,content:[t],size:t.size,sizeUnit:t.sizeUnit,minSize:t.minSize,minSizeUnit:t.minSizeUnit,id:t.id,maximised:t.maximised,isClosable:t.isClosable,activeItemIndex:0,header:void 0}),this.createContentItemFromConfig(t,e)}findFirstComponentItemById(t){if(void 0===this._groundItem)throw new u("LMFFCIBI82446");return this.findFirstContentItemTypeByIdRecursive(y.component,t,this._groundItem)}createPopoutFromContentItem(t,e,i,n){var o;const s=null!=n?n:t.findDockPoint();if(null===s)throw new c("LMCPFCI00834");{if(null!==i&&s.parent.addPopInParentId(i),void 0===e){const i=X(globalThis),n=t instanceof dt?t.getOuterBoundingClientRect():t.element.getBoundingClientRect();e={left:i.left+n.left,top:i.top+n.top,width:n.width,height:n.height}}const n=t.toConfig();if((null===(o=t.parent)||void 0===o?void 0:o.contentItems.includes(t))&&t.remove(),L.isRootItemConfig(n))return this.createPopoutFromItemConfig(n,e,i,s.index);throw new Error(`${m[0]}`)}}beginVirtualSizedContainerAdding(){0==++this._virtualSizedContainerAddingBeginCount&&(this._virtualSizedContainers.length=0)}addVirtualSizedContainer(t){this._virtualSizedContainers.push(t)}endVirtualSizedContainerAdding(){if(0==--this._virtualSizedContainerAddingBeginCount){const t=this._virtualSizedContainers.length;if(t>0){this.fireBeforeVirtualRectingEvent(t);for(let e=0;e{const t=a.getGlInstance(),e=function(){var e,i;t.isDragging||0!==(null===(i=null===(e=t.groundItem)||void 0===e?void 0:e.getAllComponentItems())||void 0===i?void 0:i.length)||a.close()};t.on("itemDropped",e),t.on("itemDestroyed",e),this.emit("windowOpened",a)})),a.on("closed",(()=>this.reconcilePopoutWindows())),this._openPopouts.push(a),this.layoutConfig.settings.closePopoutsOnUnload&&!this._windowBeforeUnloadListening&&(globalThis.addEventListener("beforeunload",this._windowBeforeUnloadListener,{passive:!0}),this._windowBeforeUnloadListening=!0),a}closeAllOpenPopouts(t=!1){for(let e=0;e0;if(s&&!r&&!a)return void i.cancelDrag();const l=yt.start(this,i,n,t,e,r);if(a)for(let t of this.instances)t!==this&&t.startExternalComponentDrag(l)}hideDropTargetIndicator(){var t;this.tabDropPlaceholder.remove(),null===(t=this.dropTargetIndicator)||void 0===t||t.hide()}focusComponent(t,e=!1){t.focus(e)}clearComponentFocus(t=!1){this.setFocusedComponentItem(void 0,t)}setFocusedComponentItem(t,e=!1){if(t!==this._focusedComponentItem){let i;if(void 0===t||(i=t.parentItem),void 0!==this._focusedComponentItem){const t=this._focusedComponentItem;this._focusedComponentItem=void 0,t.setBlurred(e);const n=t.parentItem;i===n?i=void 0:n.setFocusedValue(!1)}void 0!==t&&(this._focusedComponentItem=t,t.setFocused(e),void 0!==i&&i.setFocusedValue(!0))}}createContentItemFromConfig(t,e){switch(t.type){case y.ground:throw new h("LMCCIFC68871");case y.row:return new lt(!1,this,t,e);case y.column:return new lt(!0,this,t,e);case y.stack:return new ft(this,t,e);case y.component:return new dt(this,t,e);default:throw new d("CCC913564",t.type,"Invalid Config Item type specified")}}setMaximisedStack(t){void 0===t?void 0!==this._maximisedStack&&this.processMinimiseMaximisedStack():t!==this._maximisedStack&&(void 0!==this._maximisedStack&&this.processMinimiseMaximisedStack(),this.processMaximiseStack(t))}checkMinimiseMaximisedStack(){void 0!==this._maximisedStack&&this._maximisedStack.minimise()}cleanupBeforeMaximisedStackDestroyed(t){null!==this._maximisedStack&&this._maximisedStack===t.target&&(this._maximisedStack.off("beforeItemDestroyed",this._maximisedStackBeforeDestroyedListener),this._maximisedStack=void 0)}closeWindow(){globalThis.setTimeout((()=>globalThis.close()),1)}getArea(t,e){let i=null,n=1/0;for(let o=0;o=s.x1&&t=s.y1&&es.surface&&(n=s.surface,i=s)}return i}calculateItemAreas(){const t=this.getAllContentItems(),e=this._groundItem;if(void 0===e)throw new u("LMCIAR44365");if(1!==t.length){e.contentItems[0].isStack?this._itemAreas=[]:this._itemAreas=e.createSideAreas();for(let e=0;e0){let e=t[0];if(at.isComponentItem(e)){const t=e.parent;if(null===t)throw new c("LMXLLMI69999");e=t}if(!at.isStack(e))throw new h("LMCLLMI19993");e.maximise()}}}processMaximiseStack(t){if(this._maximisedStack=t,t.on("beforeItemDestroyed",this._maximisedStackBeforeDestroyedListener),t.element.classList.add("lm_maximised"),t.element.insertAdjacentElement("afterend",this._maximisePlaceholder),void 0===this._groundItem)throw new u("LMMXI19993");{this._groundItem.element.prepend(t.element);const{width:e,height:i}=j(this._containerElement);G(t.element,e),Z(t.element,i),t.updateSize(!0),t.focusActiveContentItem(),this._maximisedStack.emit("maximised"),this.emit("stateChanged")}}processMinimiseMaximisedStack(){if(void 0===this._maximisedStack)throw new h("LMMMS74422");{const t=this._maximisedStack;if(null===t.parent)throw new c("LMMI13668");t.element.classList.remove("lm_maximised"),this._maximisePlaceholder.insertAdjacentElement("afterend",t.element),this._maximisePlaceholder.remove(),this.updateRootSize(!0),this._maximisedStack=void 0,t.off("beforeItemDestroyed",this._maximisedStackBeforeDestroyedListener),t.emit("minimised"),this.emit("stateChanged")}}reconcilePopoutWindows(){const t=[];for(let e=0;e{this._resizeTimeoutId=void 0,this.beginSizeInvalidation(),this.endSizeInvalidation()}),this.resizeDebounceInterval))}checkClearResizeTimeout(){void 0!==this._resizeTimeoutId&&(clearTimeout(this._resizeTimeoutId),this._resizeTimeoutId=void 0)}setContainer(){var t;const e=document.body,i=null!==(t=this._containerElement)&&void 0!==t?t:e;if(i===e){this.resizeWithContainerAutomatically=!0;const t=document.documentElement;t.style.height="100%",t.style.margin="0",t.style.padding="0",t.style.overflow="hidden",e.style.height="100%",e.style.margin="0",e.style.padding="0",e.style.overflow="hidden"}this._containerElement=i}onBeforeUnload(){this.destroy()}adjustColumnsResponsive(){if(void 0===this._groundItem)throw new u("LMACR20883");if(this._firstLoad=!1,this.useResponsiveLayout()&&!this._updatingColumnsResponsive&&this._groundItem.contentItems.length>0&&this._groundItem.contentItems[0].isRow){if(void 0===this._groundItem||null===this._width)throw new u("LMACR77412");{const t=this._groundItem.contentItems[0].contentItems.length;if(t<=1)return;{const e=this.layoutConfig.dimensions.defaultMinItemWidth;if(t*e<=this._width)return;{this._updatingColumnsResponsive=!0;const i=t-Math.max(Math.floor(this._width/e),1),n=this._groundItem.contentItems[0],o=this.getAllStacks();if(0===o.length)throw new h("LMACRS77413");{const t=o[0];for(let e=0;en?void 0:{parentItem:t,index:o}}}case 1:if(void 0===this._focusedComponentItem)return;{const t=this._focusedComponentItem.parentItem;return this.tryCreateLocationFromParentItem(t,e)}case 2:{const t=this.findFirstContentItemType(y.stack);return void 0===t?void 0:this.tryCreateLocationFromParentItem(t,e)}case 3:{let t=this.findFirstContentItemType(y.row);return void 0!==t?this.tryCreateLocationFromParentItem(t,e):(t=this.findFirstContentItemType(y.column),void 0!==t?this.tryCreateLocationFromParentItem(t,e):void 0)}case 4:{const t=this.findFirstContentItemType(y.row);return void 0===t?void 0:this.tryCreateLocationFromParentItem(t,e)}case 5:{const t=this.findFirstContentItemType(y.column);return void 0===t?void 0:this.tryCreateLocationFromParentItem(t,e)}case 6:if(void 0===this._groundItem)throw new u("LMFLRIF18244");return void 0!==this.rootItem?void 0:void 0===e||0===e?{parentItem:this._groundItem,index:0}:void 0;case 7:if(void 0===this._groundItem)throw new u("LMFLF18244");{const t=this._groundItem.contentItems;if(0===t.length)return void 0===e||0===e?{parentItem:this._groundItem,index:0}:void 0;{const i=t[0];return this.tryCreateLocationFromParentItem(i,e)}}}}tryCreateLocationFromParentItem(t,e){const i=t.contentItems.length;return void 0===e?{parentItem:t,index:i}:e<0||e>i?void 0:{parentItem:t,index:e}}}!function(t){t.createMaximisePlaceElement=function(t){const e=t.createElement("div");return e.classList.add("lm_maximise_place"),e},t.createTabDropPlaceholderElement=function(t){const e=t.createElement("div");return e.classList.add("lm_drop_tab_placeholder"),e},t.defaultLocationSelectors=[{typeId:1,index:void 0},{typeId:2,index:void 0},{typeId:3,index:void 0},{typeId:7,index:void 0}],t.afterFocusedItemIfPossibleLocationSelectors=[{typeId:0,index:1},{typeId:2,index:void 0},{typeId:3,index:void 0},{typeId:7,index:void 0}]}(Et||(Et={}));class xt extends Et{constructor(t,e,i,n){if(super(xt.createLayoutManagerConstructorParameters(t,e)),this._bindComponentEventHanlderPassedInConstructor=!1,this._creationTimeoutPassed=!1,void 0!==e&&"function"==typeof e&&(this.bindComponentEvent=e,this._bindComponentEventHanlderPassedInConstructor=!0,void 0!==i&&(this.unbindComponentEvent=i)),!this._bindComponentEventHanlderPassedInConstructor&&this.isSubWindow){if(void 0===this._constructorOrSubWindowLayoutConfig)throw new u("VLC98823");{const t=B.resolve(this._constructorOrSubWindowLayoutConfig);this.layoutConfig=Object.assign(Object.assign({},t),{root:void 0})}}!0!==n&&(this.deprecatedConstructor||this.init())}destroy(){this.bindComponentEvent=void 0,this.unbindComponentEvent=void 0,super.destroy()}init(){if(this._bindComponentEventHanlderPassedInConstructor||"loading"!==document.readyState&&null!==document.body){if(!this._bindComponentEventHanlderPassedInConstructor&&!0===this.isSubWindow&&!this._creationTimeoutPassed)return setTimeout((()=>this.init()),7),void(this._creationTimeoutPassed=!0);!0===this.isSubWindow&&(this._bindComponentEventHanlderPassedInConstructor||this.clearHtmlAndAdjustStylesForSubWindow(),window.__glInstance=this),super.init()}else document.addEventListener("DOMContentLoaded",(()=>this.init()),{passive:!0})}clearHtmlAndAdjustStylesForSubWindow(){const t=document.head,e=new Array(4);e[0]=document.querySelectorAll("body link"),e[1]=document.querySelectorAll("body style"),e[2]=document.querySelectorAll("template"),e[3]=document.querySelectorAll(".gl_keep");for(let i=0;ithis.emit("popIn"))),document.body.appendChild(t),!0}}bindComponent(t,e){if(void 0!==this.bindComponentEvent)return this.bindComponentEvent(t,e);if(void 0!==this.getComponentEvent)return{virtual:!1,component:this.getComponentEvent(t,e)};{const t=`${m[2]}: ${JSON.stringify(e)}`;throw new a(t)}}unbindComponent(t,e,i){if(void 0!==this.unbindComponentEvent)this.unbindComponentEvent(t);else if(!e&&void 0!==this.releaseComponentEvent){if(void 0===i)throw new u("VCUCRCU333998");this.releaseComponentEvent(t,i)}}}!function(t){let e=!1;t.createLayoutManagerConstructorParameters=function(t,i){const n=e?null:new URL(document.location.href).searchParams.get("gl-window");e=!0;const o=null!==n;let s,r;if(null!==n){const e=localStorage.getItem(n);if(null===e)throw new Error("Null gl-window Config");localStorage.removeItem(n);const i=JSON.parse(e),o=T.unminifyConfig(i);r=B.fromResolved(o),t instanceof HTMLElement&&(s=t)}else void 0===t?r=void 0:t instanceof HTMLElement?(r=void 0,s=t):r=t,void 0===s&&i instanceof HTMLElement&&(s=i);return{constructorOrSubWindowLayoutConfig:r,isSubWindow:o,containerElement:s}}}(xt||(xt={}));class zt extends xt{constructor(t,e,i){super(t,e,i,!0),this._componentTypesMap=new Map,this._registeredComponentMap=new Map,this._virtuableComponentMap=new Map,this._containerVirtualRectingRequiredEventListener=(t,e,i)=>this.handleContainerVirtualRectingRequiredEvent(t,e,i),this._containerVirtualVisibilityChangeRequiredEventListener=(t,e)=>this.handleContainerVirtualVisibilityChangeRequiredEvent(t,e),this._containerVirtualZIndexChangeRequiredEventListener=(t,e,i)=>this.handleContainerVirtualZIndexChangeRequiredEvent(t,e,i),this.deprecatedConstructor||this.init()}registerComponent(t,e,i=!1){if("function"!=typeof e)throw new r("registerComponent() componentConstructorOrFactoryFtn parameter is not a function");if(e.hasOwnProperty("prototype")){const n=e;this.registerComponentConstructor(t,n,i)}else{const n=e;this.registerComponentFactoryFunction(t,n,i)}}registerComponentConstructor(t,e,i=!1){if("function"!=typeof e)throw new Error(m[1]);if(void 0!==this._componentTypesMap.get(t))throw new a(`${m[3]}: ${t}`);this._componentTypesMap.set(t,{constructor:e,factoryFunction:void 0,virtual:i})}registerComponentFactoryFunction(t,e,i=!1){if("function"!=typeof e)throw new a("Please register a constructor function");if(void 0!==this._componentTypesMap.get(t))throw new a(`${m[3]}: ${t}`);this._componentTypesMap.set(t,{constructor:void 0,factoryFunction:e,virtual:i})}registerComponentFunction(t){this.registerGetComponentConstructorCallback(t)}registerGetComponentConstructorCallback(t){if("function"!=typeof t)throw new Error("Please register a callback function");void 0!==this._getComponentConstructorFtn&&console.warn("Multiple component functions are being registered. Only the final registered function will be used."),this._getComponentConstructorFtn=t}getRegisteredComponentTypeNames(){const t=this._componentTypesMap.keys();return Array.from(t)}getComponentInstantiator(t){let e;const i=z.resolveComponentTypeName(t);return void 0!==i&&(e=this._componentTypesMap.get(i)),void 0===e&&void 0!==this._getComponentConstructorFtn&&(e={constructor:this._getComponentConstructorFtn(t),factoryFunction:void 0,virtual:!1}),e}bindComponent(t,e){let i;const n=z.resolveComponentTypeName(e);let o;if(void 0!==n&&(i=this._componentTypesMap.get(n)),void 0===i&&void 0!==this._getComponentConstructorFtn&&(i={constructor:this._getComponentConstructorFtn(e),factoryFunction:void 0,virtual:!1}),void 0!==i){const s=i.virtual;let r,l;r=void 0===e.componentState?void 0:K({},e.componentState);const d=i.constructor;if(void 0!==d)l=new d(t,r,s);else{const e=i.factoryFunction;if(void 0===e)throw new h("LMBCFFU10008");l=e(t,r,s)}if(s){if(void 0===l)throw new u("GLBCVCU988774");{const e=l,i=e.rootHtmlElement;if(void 0===i)throw new a(`${m[5]}: ${n}`);!function(t){const e="absolute";t.style.position!==e&&(t.style.position=e)}(i),this.container.appendChild(i),this._virtuableComponentMap.set(t,e),t.virtualRectingRequiredEvent=this._containerVirtualRectingRequiredEventListener,t.virtualVisibilityChangeRequiredEvent=this._containerVirtualVisibilityChangeRequiredEventListener,t.virtualZIndexChangeRequiredEvent=this._containerVirtualZIndexChangeRequiredEventListener}}this._registeredComponentMap.set(t,l),o={virtual:i.virtual,component:l}}else o=super.bindComponent(t,e);return o}unbindComponent(t,e,i){if(void 0===this._registeredComponentMap.get(t))super.unbindComponent(t,e,i);else{const e=this._virtuableComponentMap.get(t);if(void 0!==e){const i=e.rootHtmlElement;if(void 0===i)throw new h("GLUC77743",t.title);this.container.removeChild(i),this._virtuableComponentMap.delete(t)}}}fireBeforeVirtualRectingEvent(t){this._goldenLayoutBoundingClientRect=this.container.getBoundingClientRect(),super.fireBeforeVirtualRectingEvent(t)}handleContainerVirtualRectingRequiredEvent(t,e,i){const n=this._virtuableComponentMap.get(t);if(void 0===n)throw new u("GLHCSCE55933");{const o=n.rootHtmlElement;if(void 0===o)throw new a(m[4]+" "+t.title);{const n=t.element.getBoundingClientRect(),s=n.left-this._goldenLayoutBoundingClientRect.left;o.style.left=F(s);const r=n.top-this._goldenLayoutBoundingClientRect.top;o.style.top=F(r),G(o,e),Z(o,i)}}}handleContainerVirtualVisibilityChangeRequiredEvent(t,e){const i=this._virtuableComponentMap.get(t);if(void 0===i)throw new u("GLHCVVCRE55934");{const n=i.rootHtmlElement;if(void 0===n)throw new a(m[4]+" "+t.title);Y(n,e)}}handleContainerVirtualZIndexChangeRequiredEvent(t,e,i){const n=this._virtuableComponentMap.get(t);if(void 0===n)throw new u("GLHCVZICRE55935");{const e=n.rootHtmlElement;if(void 0===e)throw new a(m[4]+" "+t.title);e.style.zIndex=i}}}return i})())); \ No newline at end of file +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.goldenLayout=e():t.goldenLayout=e()}(globalThis,(()=>(()=>{"use strict";var t,e={d:(t,i)=>{for(var n in i)e.o(i,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:i[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},i={};e.r(i),e.d(i,{ApiError:()=>r,BindError:()=>a,BrowserPopout:()=>dt,ComponentContainer:()=>st,ComponentItem:()=>ct,ComponentItemConfig:()=>W,ConfigurationError:()=>o,ContentItem:()=>lt,DragSource:()=>It,EventEmitter:()=>ot,EventHub:()=>Et,ExternalError:()=>n,GoldenLayout:()=>Mt,Header:()=>ft,HeaderedItemConfig:()=>R,I18nStrings:()=>t,ItemConfig:()=>D,ItemType:()=>y,JsonValue:()=>C,LayoutConfig:()=>B,LayoutManager:()=>xt,LogicalZIndex:()=>f,LogicalZIndexToDefaultMap:()=>v,PopoutBlockedError:()=>s,PopoutLayoutConfig:()=>O,ResolvedComponentItemConfig:()=>z,ResolvedGroundItemConfig:()=>P,ResolvedHeaderedItemConfig:()=>E,ResolvedItemConfig:()=>S,ResolvedLayoutConfig:()=>T,ResolvedPopoutLayoutConfig:()=>A,ResolvedRootItemConfig:()=>L,ResolvedRowOrColumnItemConfig:()=>M,ResolvedStackItemConfig:()=>x,ResponsiveMode:()=>w,RootItemConfig:()=>H,RowOrColumn:()=>ht,RowOrColumnItemConfig:()=>U,Side:()=>_,SizeUnitEnum:()=>I,Stack:()=>vt,StackItemConfig:()=>k,StyleConstants:()=>p,Tab:()=>gt,VirtualLayout:()=>zt,WidthOrHeightPropertyName:()=>g,formatSize:()=>it,formatUndefinableSize:()=>nt,i18nStrings:()=>m,parseSize:()=>et});class n extends Error{constructor(t,e){super(e),this.type=t}}class o extends n{constructor(t,e){super("Configuration",t),this.node=e}}class s extends n{constructor(t){super("PopoutBlocked",t)}}class r extends n{constructor(t){super("API",t)}}class a extends n{constructor(t){super("Bind",t)}}class l extends Error{constructor(t,e,i){super(`${t}: ${e}${void 0===i?"":": "+i}`)}}class h extends l{constructor(t,e){super("Assert",t,e)}}class d extends l{constructor(t,e,i){super("UnreachableCase",t,`${e}${void 0===i?"":": "+i}`)}}class c extends l{constructor(t,e){super("UnexpectedNull",t,e)}}class u extends l{constructor(t,e){super("UnexpectedUndefined",t,e)}}!function(t){let e=!1;const i={PopoutCannotBeCreatedWithGroundItemConfig:{id:0,default:"Popout cannot be created with ground ItemConfig"},PleaseRegisterAConstructorFunction:{id:1,default:"Please register a constructor function"},ComponentTypeNotRegisteredAndBindComponentEventHandlerNotAssigned:{id:2,default:"Component type not registered and BindComponentEvent handler not assigned"},ComponentIsAlreadyRegistered:{id:3,default:"Component is already registered"},ComponentIsNotVirtuable:{id:4,default:"Component is not virtuable. Requires rootHtmlElement field/getter"},VirtualComponentDoesNotHaveRootHtmlElement:{id:5,default:'Virtual component does not have getter "rootHtmlElement"'},ItemConfigIsNotTypeComponent:{id:6,default:"ItemConfig is not of type component"},InvalidNumberPartInSizeString:{id:7,default:"Invalid number part in size string"},UnknownUnitInSizeString:{id:8,default:"Unknown unit in size string"},UnsupportedUnitInSizeString:{id:9,default:"Unsupported unit in size string"}};t.idCount=Object.keys(i).length;const n=Object.values(i);t.checkInitialise=function(){if(!e)for(let e=0;e="0"&&t<="9"}function G(t,e){const i=F(Math.max(0,e));t.style.width=i}function Z(t,e){const i=F(Math.max(0,e));t.style.height=i}function q(t){return{width:t.offsetWidth,height:t.offsetHeight}}function j(t){return{width:t.clientWidth,height:t.clientHeight}}function $(t){let e,i,n=t.mozInnerScreenX,o=t.mozInnerScreenY;return void 0===n||void 0===o?(e=(t.outerWidth-t.innerWidth)/2,i=t.outerHeight-t.innerHeight-e):(e=n-t.screenX,i=o-t.screenY),{width:Math.max(0,e),height:Math.max(0,i)}}function X(t){let e=t.mozInnerScreenX,i=t.mozInnerScreenY;if(void 0===e||void 0===i){const n=$(t);e=t.screenX+n.width,i=t.screenY+n.height}return{left:e,top:i}}function Y(t,e){t.style.display=e?"":"none"}function J(t,e){if(void 0!==e)for(const i in e)if(e.hasOwnProperty(i)){const n=e[i],o=t[i];t[i]=K(o,n)}return t}function K(t,e){if("object"!=typeof e)return e;if(Array.isArray(e)){const t=e.length,i=new Array(t);for(let n=0;n{clearTimeout(i),i=setTimeout((()=>t(...n)),e)}}function et(t,e){const{numericPart:i,firstNonNumericCharPart:n}=function(t){const e=(t=t.trimStart()).length;if(0===e)return{numericPart:"",firstNonNumericCharPart:""};{let i=e,n=!1;for(let o=0;o36)throw new Error("Too many keys in config minifier map")},t.translateObject=n}(b||(b={})),function(t){t.defaults={type:y.ground,content:[],size:1,sizeUnit:I.Fractional,minSize:void 0,minSizeUnit:I.Pixel,id:"",isClosable:!0},t.createCopy=function(t,e){switch(t.type){case y.ground:case y.row:case y.column:return M.createCopy(t,e);case y.stack:return x.createCopy(t,e);case y.component:return z.createCopy(t);default:throw new d("CICC91354",t.type,"Invalid Config Item type specified")}},t.createDefault=function(t){switch(t){case y.ground:throw new h("CICCDR91562");case y.row:case y.column:return M.createDefault(t);case y.stack:return x.createDefault();case y.component:return z.createDefault();default:throw new d("CICCDD91563",t,"Invalid Config Item type specified")}},t.isComponentItem=function(t){return t.type===y.component},t.isStackItem=function(t){return t.type===y.stack},t.isGroundItem=function(t){return t.type===y.ground}}(S||(S={})),function(t){let e;t.defaultMaximised=!1,function(t){t.createCopy=function(t,e){return void 0===t?void 0:{show:null!=e?e:t.show,popout:t.popout,close:t.close,maximise:t.maximise,minimise:t.minimise,tabDropdown:t.tabDropdown}}}(e=t.Header||(t.Header={}))}(E||(E={})),function(t){function e(t){const e=t.length,i=new Array(e);for(let n=0;n"__glMaximised"===t));t>0&&(o=!0,n=n.splice(t,1)),e=n.length>0?n[0]:S.defaults.id}else e=n;return i=void 0!==t.maximised?t.maximised:o,{id:e,maximised:i}}}(R||(R={})),function(t){function e(t){if(void 0===t)return[];{const e=t.length,i=new Array(e);for(let n=0;n0?e.content[0]:void 0,{resolved:!0,root:H.resolve(i),openPopouts:t.resolveOpenPopouts(e.openPopouts),dimensions:t.Dimensions.resolve(e.dimensions),settings:t.Settings.resolve(e.settings),header:t.Header.resolve(e.header,e.settings,e.labels)}}},t.fromResolved=function(e){return{root:H.fromResolvedOrUndefined(e.root),openPopouts:O.fromResolvedArray(e.openPopouts),settings:T.Settings.createCopy(e.settings),dimensions:t.Dimensions.fromResolved(e.dimensions),header:T.Header.createCopy(e.header)}},t.isResolved=function(t){const e=t;return void 0!==e.resolved&&!0===e.resolved},t.resolveOpenPopouts=function(t){if(void 0===t)return[];{const e=t.length,i=new Array(e);for(let n=0;n0?e.content[0]:void 0,{root:H.resolve(o),openPopouts:B.resolveOpenPopouts(e.openPopouts),dimensions:B.Dimensions.resolve(e.dimensions),settings:B.Settings.resolve(e.settings),header:B.Header.resolve(e.header,e.settings,e.labels),parentId:null!==(i=e.parentId)&&void 0!==i?i:null,indexInParent:null!==(n=e.indexInParent)&&void 0!==n?n:null,window:t.Window.resolve(e.window,e.dimensions),resolved:!0}},t.fromResolved=function(e){return{root:H.fromResolvedOrUndefined(e.root),openPopouts:i(e.openPopouts),dimensions:B.Dimensions.fromResolved(e.dimensions),settings:T.Settings.createCopy(e.settings),header:T.Header.createCopy(e.header),parentId:e.parentId,indexInParent:e.indexInParent,window:t.Window.fromResolved(e.window)}},t.fromResolvedArray=i}(O||(O={}));class ot{constructor(){this._allEventSubscriptions=[],this._subscriptionsMap=new Map,this.unbind=this.removeEventListener,this.trigger=this.emit}tryBubbleEvent(t,e){}emit(t,...e){let i=this._subscriptionsMap.get(t);if(void 0!==i){i=i.slice();for(let t=0;t0){const n=e.slice();n.unshift(t);const o=this._allEventSubscriptions.slice();for(let t=0;tthis.onPointerDown(t),this._pointerMoveEventListener=t=>this.onPointerMove(t),this._pointerUpEventListener=t=>this.onPointerUp(t),this._timeout=void 0,this._allowableTargets=[t,...e],this._oDocument=document,this._eBody=document.body,this._nDelay=1800,this._nDistance=10,this._originalEvent={pageX:0,pageY:0,screenX:0,screenY:0},this._dragging=!1,this._eElement.addEventListener("pointerdown",this._pointerDownEventListener,{passive:!0})}destroy(){this.checkRemovePointerTrackingEventListeners(),this._eElement.removeEventListener("pointerdown",this._pointerDownEventListener)}cancelDrag(){this.processDragStop(void 0)}onPointerDown(t){this._allowableTargets.includes(t.target)&&t.isPrimary&&this.processPointerDown(t)}processPointerDown(t){this._originalEvent=t,this._oDocument.addEventListener("pointermove",this._pointerMoveEventListener),this._oDocument.addEventListener("pointerup",this._pointerUpEventListener,{passive:!0}),this._eBody.classList.add("lm_pointer_tracking"),this._pointerTracking=!0,this._timeout=setTimeout((()=>{try{this.startDrag()}catch(t){throw console.error(t),t}}),this._nDelay)}onPointerMove(t){this._pointerTracking&&(this.processDragMove(t),t.preventDefault())}processDragMove(t){const e=t.pageX-this._originalEvent.pageX,i=t.pageY-this._originalEvent.pageY;!1===this._dragging&&(Math.abs(e)>this._nDistance||Math.abs(i)>this._nDistance)&&this.startDrag(),this._dragging&&this.emit("drag",e,i,t)}onPointerUp(t){this.processDragStop(t)}processDragStop(t){void 0!==this._timeout&&(clearTimeout(this._timeout),this._timeout=void 0),this.checkRemovePointerTrackingEventListeners(),!0===this._dragging&&(this._eBody.classList.remove("lm_dragging"),this._eElement.classList.remove("lm_dragging"),this._dragging=!1,this.emit("dragStop",t))}checkRemovePointerTrackingEventListeners(){this._pointerTracking&&(this._oDocument.removeEventListener("pointermove",this._pointerMoveEventListener),this._oDocument.removeEventListener("pointerup",this._pointerUpEventListener),this._eBody.classList.remove("lm_pointer_tracking"),this._pointerTracking=!1)}startDrag(){void 0!==this._timeout&&(clearTimeout(this._timeout),this._timeout=void 0),this._dragging=!0,this._eBody.classList.add("lm_dragging"),this._eElement.classList.add("lm_dragging"),this.emit("dragStart",this._originalEvent.pageX,this._originalEvent.pageY),this.emit("drag",0,0,this._originalEvent)}}class at{constructor(t,e,i){this._isVertical=t,this._size=e,this._grabSize=i0)this.updateSize(!1);else if(!this.isGround){if(null===this._parent)throw new c("CIUC00874");this._parent.removeChild(this)}}addChild(t,e,i){return null!=e||(e=this._contentItems.length),this._contentItems.splice(e,0,t),t.setParent(this),!0===this._isInitialised&&!1===t._isInitialised&&t.init(),e}replaceChild(t,e,i=!1){const n=this._contentItems.indexOf(t),o=t._element.parentNode;if(-1===n)throw new h("CIRCI23232","Can't replace child. oldChild is not child of this");if(null===o)throw new c("CIRCP23232");if(o.replaceChild(e._element,t._element),!0===i&&(t._parent=null,t.destroy()),this._contentItems[n]=e,e.setParent(this),e.size=t.size,e.sizeUnit=t.sizeUnit,e.minSize=t.minSize,e.minSizeUnit=t.minSizeUnit,null===e._parent)throw new c("CIRCNC45699");!0===e._parent._isInitialised&&!1===e._isInitialised&&e.init(),this.updateSize(!1)}remove(){if(null===this._parent)throw new c("CIR11110");this._parent.removeChild(this)}popout(){const t=Q(),e=this.layoutManager.createPopoutFromContentItem(this,void 0,t,void 0);return this.emitBaseBubblingEvent("stateChanged"),e}calculateConfigContent(){const t=this._contentItems,e=t.length,i=new Array(e);for(let n=0;n1)return t;t=t.parent}return null}findDockPoint(){const t=this.findAncestorWithSiblings();if(null!==t&&null!==t.parent){const e=t.parent._contentItems.indexOf(t);return{parent:t.parent,index:e}}return this.layoutManager.groundItem?{parent:this.layoutManager.groundItem,index:null}:null}init(){this._isInitialised=!0,this.emitBaseBubblingEvent("itemCreated"),this.emitUnknownBubblingEvent(this.type+"Created")}setParent(t){this._parent=t}addPopInParentId(t){this.popInParentIds.includes(t)||this.popInParentIds.push(t)}initContentItems(){for(let t=0;tthis.propagateEventToLayoutManager(t,e))))}propagateEventToLayoutManager(t,e){this._pendingEventPropagations[t]=!1,this.layoutManager.emitUnknown(t,e)}}class ht extends lt{constructor(t,e,i,n){switch(super(e,i,n,ht.createElement(document,t)),this._rowOrColumnParent=n,this._splitter=[],this._debouncedEmitStateChangedEvent=tt((()=>this.emitBaseBubblingEvent("stateChanged"))),this.isRow=!t,this.isColumn=t,this._childElementContainer=this.element,this._splitterSize=e.layoutConfig.dimensions.borderWidth,this._splitterGrabSize=e.layoutConfig.dimensions.borderGrabWidth,this._isColumn=t,this._dimension=t?"height":"width",this._splitterPosition=null,this._splitterMinPosition=null,this._splitterMaxPosition=null,i.type){case y.row:case y.column:this._configType=i.type;break;default:throw new h("ROCCCT00925")}}newComponent(t,e,i,n){const o={type:"component",componentType:t,componentState:e,title:i};return this.newItem(o,n)}addComponent(t,e,i,n){const o={type:"component",componentType:t,componentState:e,title:i};return this.addItem(o,n)}newItem(t,e){e=this.addItem(t,e);const i=this.contentItems[e];return lt.isStack(i)&&D.isComponent(t)?i.contentItems[0]:i}addItem(t,e){this.layoutManager.checkMinimiseMaximisedStack();const i=D.resolve(t,!1),n=this.layoutManager.createAndInitContentItem(i,this);return this.addChild(n,e,!1)}addChild(t,e,i){if(void 0===e&&(e=this.contentItems.length),this.contentItems.length>0){const i=this.createSplitter(Math.max(0,e-1)).element;e>0?(this.contentItems[e-1].element.insertAdjacentElement("afterend",i),i.insertAdjacentElement("afterend",t.element)):(this.contentItems[0].element.insertAdjacentElement("beforebegin",i),i.insertAdjacentElement("beforebegin",t.element))}else this._childElementContainer.appendChild(t.element);super.addChild(t,e);const n=1/this.contentItems.length*100;if(!0===i)return this.emitStateChangedEvent(),e;for(let e=0;e0&&(this.calculateRelativeSizes(),this.setAbsoluteSizes()),this.emitStateChangedEvent(!0),this.emit("resize")}setAbsoluteSizes(){const t=this.calculateAbsoluteSizes();for(let e=0;e0&&t.itemSizes[e]++,this._isColumn?(G(this.contentItems[e].element,t.crossAxisSize),Z(this.contentItems[e].element,t.itemSizes[e])):(G(this.contentItems[e].element,t.itemSizes[e]),Z(this.contentItems[e].element,t.crossAxisSize))}calculateAbsoluteSizes(){const t=(this.contentItems.length-1)*this._splitterSize,{width:e,height:i}=q(this.element);let n,o;this._isColumn?(n=i-t,o=e):(n=e-t,o=i);let s=0;const r=[];for(let t=0;t0){const n=100-t;for(let t=0;t100&&e.length>0){for(let t=0;te)return;{const r=i/e;let a=i;for(let e=0;ethis.onSplitterDrag(e,t,i))),e.on("dragStop",(()=>this.onSplitterDragStop(e))),e.on("dragStart",(()=>this.onSplitterDragStart(e))),this._splitter.splice(t,0,e),e}getSplitItems(t){const e=this._splitter.indexOf(t);return{before:this.contentItems[e],after:this.contentItems[e+1]}}calculateContentItemMinSize(t){const e=t.minSize;if(void 0!==e){if(t.minSizeUnit===I.Pixel)return e;throw new h("ROCGMD98831",JSON.stringify(t))}{const t=this.layoutManager.layoutConfig.dimensions;return this._isColumn?t.defaultMinItemHeight:t.defaultMinItemWidth}}calculateContentItemsTotalMinSize(t){let e=0;for(const i of t.contentItems){const n=this.calculateContentItemsTotalMinSize(i);t instanceof ht&&t.isColumn===this._isColumn?e+=n:e=Math.max(e,n)}const i=this.calculateContentItemMinSize(t);return Math.max(i,e)}onSplitterDragStart(t){const e=this.getSplitItems(t),i=V(e.before.element.style[this._dimension]),n=V(e.after.element.style[this._dimension]),o=this.calculateContentItemsTotalMinSize(e.before),s=this.calculateContentItemsTotalMinSize(e.after);this._splitterPosition=0,this._splitterMinPosition=Math.min(0,-1*(i-o)),this._splitterMaxPosition=Math.max(0,n-s)}onSplitterDrag(t,e,i){let n=this._isColumn?i:e;if(null===this._splitterMinPosition||null===this._splitterMaxPosition)throw new c("ROCOSD59226");n=Math.max(n,this._splitterMinPosition),n=Math.min(n,this._splitterMaxPosition),this._splitterPosition=n;const o=F(n);this._isColumn?t.element.style.top=o:t.element.style.left=o}onSplitterDragStop(t){if(null===this._splitterPosition)throw new c("ROCOSDS66932");{const e=this.getSplitItems(t),i=V(e.before.element.style[this._dimension]),n=V(e.after.element.style[this._dimension]),o=(this._splitterPosition+i)/(i+n),s=e.before.size+e.after.size;e.before.size=o*s,e.after.size=(1-o)*s,t.element.style.top=F(0),t.element.style.left=F(0),globalThis.requestAnimationFrame((()=>this.updateSize(!1)))}}emitStateChangedEvent(t=!1){t?this._debouncedEmitStateChangedEvent():this.emitBaseBubblingEvent("stateChanged")}}!function(t){t.getElementDimensionSize=function(t,e){return"width"===e?function(t){return t.offsetWidth}(t):function(t){return t.offsetHeight}(t)},t.setElementDimensionSize=function(t,e,i){return"width"===e?G(t,i):Z(t,i)},t.createElement=function(t,e){const i=t.createElement("div");return i.classList.add("lm_item"),e?i.classList.add("lm_column"):i.classList.add("lm_row"),i}}(ht||(ht={}));class dt extends ot{constructor(t,e,i){super(),this._config=t,this._initialWindowSize=e,this._layoutManager=i,this._isInitialised=!1,this._popoutWindow=null,this._preventPopInOnClose=!1,this.createWindow()}get isInitialised(){return this._isInitialised}toConfig(){var t,e;if(!1===this._isInitialised)throw new Error("Can't create config, layout not yet initialised");const i=this.getGlInstance().saveLayout();let n,o;null===this._popoutWindow?(n=null,o=null):(n=null!==(t=this._popoutWindow.screenX)&&void 0!==t?t:this._popoutWindow.screenLeft,o=null!==(e=this._popoutWindow.screenY)&&void 0!==e?e:this._popoutWindow.screenTop);const s={width:this.getGlInstance().width,height:this.getGlInstance().height,left:n,top:o};return{root:i.root,openPopouts:i.openPopouts,settings:i.settings,dimensions:i.dimensions,header:i.header,window:s,parentId:this._config.parentId,indexInParent:this._config.indexInParent,resolved:!0}}getGlInstance(){if(null===this._popoutWindow)throw new c("BPGGI24693");return this._popoutWindow.__glInstance}getWindow(){if(null===this._popoutWindow)throw new c("BPGW087215");return this._popoutWindow}close(t=!1){if(t&&(this._preventPopInOnClose=!0),this.getGlInstance())this.getGlInstance().closeWindow();else try{this.getWindow().close()}catch(t){}}popIn(){let t=null,e=this._config.indexInParent,i=J({},this.getGlInstance().saveLayout()).root;if(void 0===i)return;const n=this._layoutManager.groundItem;if(void 0===n)throw new u("BPPIG34972");if(this._config.parentId&&(t=n.getItemsByPopInParentId(this._config.parentId)[0]),t||(t=n.contentItems.length>0?n.contentItems[0]:n,e=t.contentItems.length),t.isStack){for(;i.type!==y.component&&1===i.content.length;)i=i.content[0];if(i.type!==y.component){if(null===t.parent)throw new c("BPPIG34973");const i=new ht(!1,this._layoutManager,M.createDefault("row"),t.parent);t.parent.replaceChild(t,i,!1),i.addChild(t),t=i,e=1}}const o=this._layoutManager.createAndInitContentItem(i,t);e=null!==e?Math.max(0,Math.min(t.contentItems.length,e)):null,t.addChild(o,e),this._layoutManager.layoutConfig.settings.popInOnClose?this._onClose():this.close()}createWindow(){const t=this.createUrl(),e=Math.floor(1e6*Math.random()).toString(36),i=this.serializeWindowFeatures({left:this._initialWindowSize.left,top:this._initialWindowSize.top,width:this._initialWindowSize.width,height:this._initialWindowSize.height,innerWidth:this._initialWindowSize.width,innerHeight:this._initialWindowSize.height,menubar:"no",toolbar:"no",location:"no",personalbar:"no",resizable:"yes",scrollbars:"no",status:"no"});if(this._popoutWindow=globalThis.open(t,e,i),this._popoutWindow)this._popoutWindow.addEventListener("load",(()=>{this.positionAndResizeWindow(),this._popoutWindow&&this._popoutWindow.addEventListener("beforeunload",(()=>{this._layoutManager.layoutConfig.settings.popInOnClose&&!this._preventPopInOnClose?this.popIn():this._onClose()}),{passive:!0})}),{passive:!0}),this._checkReadyInterval=setInterval((()=>this.checkReady()),10);else if(!0===this._layoutManager.layoutConfig.settings.blockedPopoutsThrowError)throw new s("Popout blocked")}checkReady(){if(null===this._popoutWindow)throw new c("BPCR01844");this._popoutWindow.__glInstance&&this._popoutWindow.__glInstance.isInitialised&&(this._popoutWindow.__glInstance.parent=this._layoutManager,this.onInitialised(),void 0!==this._checkReadyInterval&&(clearInterval(this._checkReadyInterval),this._checkReadyInterval=void 0))}positionAndResizeWindow(){if(null===this._popoutWindow)throw new c("BPPARW1");if(this._popoutWindow.innerWidth>0&&this._popoutWindow.innerHeight>0&&this._popoutWindow.outerWidth>0&&this._popoutWindow.outerHeight>0&&this._popoutWindow.innerWidth<=this._popoutWindow.outerWidth&&this._popoutWindow.innerHeight<=this._popoutWindow.outerHeight){const t=$(this._popoutWindow);this._popoutWindow.moveTo(this._initialWindowSize.left-t.width,this._initialWindowSize.top-t.height),this._popoutWindow.resizeTo(this._initialWindowSize.width+(this._popoutWindow.outerWidth-this._popoutWindow.innerWidth),this._initialWindowSize.height+(this._popoutWindow.outerHeight-this._popoutWindow.innerHeight))}this._popoutWindow.focus()}serializeWindowFeatures(t){const e=[];for(const i in t)e.push(i+"="+t[i].toString());return e.join(",")}createUrl(){const t="gl-window-config-"+Q(),e=T.minifyConfig(this._config);try{localStorage.setItem(t,JSON.stringify(e))}catch(t){throw new Error("Error while writing to localStorage "+function(t){return t instanceof Error?t.message:"string"==typeof t?t:"Unknown Error"}(t))}const i=new URL("/gl-popout",location.origin);i.searchParams.set("gl-window",t);const n=this._layoutManager.container.dataset.theme;return void 0!==n&&i.searchParams.set("gl-theme",n),i.toString()}onInitialised(){this._isInitialised=!0,this.getGlInstance().on("popIn",(()=>this.popIn())),this.emit("initialised")}_onClose(){setTimeout((()=>this.emit("closed")),50)}}class ct extends lt{constructor(t,e,i){super(t,e,i,document.createElement("div")),this._parentItem=i,this._focused=!1,this.isComponent=!0,this._reorderEnabled=e.reorderEnabled,this.applyUpdatableConfig(e),this._initialWantMaximise=e.maximised;const n=document.createElement("div");n.classList.add("lm_content"),this.element.appendChild(n),this._container=new st(e,this,t,n,(t=>this.handleUpdateItemConfigEvent(t)),(()=>this.show()),(()=>this.hide()),(t=>this.focus(t)),(t=>this.blur(t)))}get componentName(){return this._container.componentType}get componentType(){return this._container.componentType}get reorderEnabled(){return this._reorderEnabled}get initialWantMaximise(){return this._initialWantMaximise}get component(){return this._container.component}get container(){return this._container}get parentItem(){return this._parentItem}get headerConfig(){return this._headerConfig}get title(){return this._title}get tab(){return this._tab}get focused(){return this._focused}destroy(){this._container.destroy(),super.destroy()}applyUpdatableConfig(t){this.setTitle(t.title),this._headerConfig=t.header}toConfig(){const t=this._container.stateRequestEvent,e=void 0===t?this._container.state:t();return{type:y.component,content:[],size:this.size,sizeUnit:this.sizeUnit,minSize:this.minSize,minSizeUnit:this.minSizeUnit,id:this.id,maximised:!1,isClosable:this.isClosable,reorderEnabled:this._reorderEnabled,title:this._title,header:E.Header.createCopy(this._headerConfig),componentType:z.copyComponentType(this.componentType),componentState:e}}close(){if(null===this.parent)throw new c("CIC68883");this.parent.removeChild(this,!1)}enterDragMode(t,e){G(this.element,t),Z(this.element,e),this._container.enterDragMode(t,e)}exitDragMode(){this._container.exitDragMode()}enterStackMaximised(){this._container.enterStackMaximised()}exitStackMaximised(){this._container.exitStackMaximised()}drag(){this._container.drag()}getOuterBoundingClientRect(){var t;const e=this.element.getBoundingClientRect(),i=null===(t=this.headerConfig)||void 0===t?void 0:t.show,n=T.Dimensions.defaults.headerHeight,o="left"===i||"right"===i?n:0,s="top"===i||"bottom"===i||void 0===i?n:0;return DOMRect.fromRect({x:e.left-o,y:e.top-s,width:e.width+o,height:e.height+s})}updateSize(t){this.updateNodeSize(t)}init(){this.updateNodeSize(!1),super.init(),this._container.emit("open"),this.initContentItems()}setTitle(t){this._title=t,this.emit("titleChanged",t),this.emit("stateChanged")}setTab(t){this._tab=t,this.emit("tab",t),this._container.setTab(t)}hide(){super.hide(),this._container.setVisibility(!1)}show(){super.show(),this._container.setVisibility(!0)}focus(t=!1){this.parentItem.setActiveComponentItem(this,!0,t)}setFocused(t){this._focused=!0,this.tab.setFocused(),t||this.emitBaseBubblingEvent("focus")}blur(t=!1){this._focused&&this.layoutManager.setFocusedComponentItem(void 0,t)}setBlurred(t){this._focused=!1,this.tab.setBlurred(),t||this.emitBaseBubblingEvent("blur")}setParent(t){this._parentItem=t,super.setParent(t)}handleUpdateItemConfigEvent(t){this.applyUpdatableConfig(t)}updateNodeSize(t){if("none"!==this.element.style.display){const{width:e,height:i}=q(this.element);this._container.setSizeToNodeSize(e,i,t)}}}class ut extends lt{constructor(){super(...arguments),this._focused=!1}get focused(){return this._focused}setFocusedValue(t){this._focused=t}}class mt extends ut{constructor(t,e,i){super(t,P.create(e),null,mt.createElement(document)),this.isGround=!0,this._childElementContainer=this.element,this._containerElement=i;let n=null;for(;;){const t=n?n.previousSibling:this._containerElement.lastChild;if(!(t instanceof Element&&t.classList.contains("lm_content")))break;n=t}this._containerElement.insertBefore(this.element,n)}init(){if(!0!==this.isInitialised){this.updateNodeSize();for(let t=0;t0?this.contentItems[0]:this,n.isComponent)throw new Error("Cannot add item as child to ComponentItem");{const t=this.layoutManager.createAndInitContentItem(i,n);return e=n.addChild(t,e),n===this?-1:e}}loadComponentAsRoot(t){this.clearRoot();const e=D.resolve(t,!1);if(e.maximised)throw new Error("Root Component cannot be maximised");{const t=new ct(this.layoutManager,e,this);t.init(),this.addChild(t,0)}}addChild(t,e){if(this.contentItems.length>0)throw new Error("Ground node can only have a single child");return this._childElementContainer.appendChild(t.element),e=super.addChild(t,e),this.updateSize(!1),this.emitBaseBubblingEvent("stateChanged"),e}calculateConfigContent(){const t=this.contentItems,e=t.length,i=new Array(e);for(let n=0;n0&&(G(this.contentItems[0].element,t),Z(this.contentItems[0].element,e)),this.updateContentItemsSize(!0))}updateSize(t){this.layoutManager.beginVirtualSizedContainerAdding();try{this.updateNodeSize(),this.updateContentItemsSize(t)}finally{this.layoutManager.endVirtualSizedContainerAdding()}}createSideAreas(){const t=mt.Area.oppositeSides,e=new Array(Object.keys(t).length);let i=0;for(const n in t){const o=n,s=this.getElementArea();if(null===s)throw new c("RCSA77553");s.side=o,"2"===t[o][1]?s[o]=s[t[o]]-50:s[o]=s[t[o]]+50,s.surface=(s.x2-s.x1)*(s.y2-s.y1),e[i++]=s}return e}highlightDropZone(t,e,i){this.layoutManager.tabDropPlaceholder.remove(),super.highlightDropZone(t,e,i)}onDrop(t,e){if(t.isComponent){const e=x.createDefault(),i=t;e.header=E.Header.createCopy(i.headerConfig);const n=this.layoutManager.createAndInitContentItem(e,this);n.addChild(t),t=n}if(0===this.contentItems.length)this.addChild(t);else{if(t.type===y.row||t.type===y.column){const e=x.createDefault(),i=this.layoutManager.createContentItem(e,this);i.addChild(t),t=i}const i="x"==e.side[0]?y.row:y.column,n="2"==e.side[1],o=this.contentItems[0];if(o instanceof ht&&o.type===i){const e=o.contentItems[n?0:o.contentItems.length-1];o.addChild(t,n?0:void 0,!0),e.size*=.5,t.size=e.size,t.sizeUnit=I.Percent,o.updateSize(!1)}else{const e=S.createDefault(i),s=this.layoutManager.createContentItem(e,this);this.replaceChild(o,s),s.addChild(t,n?0:void 0,!0),s.addChild(o,n?void 0:0,!0),o.size=50,t.size=50,t.sizeUnit=I.Percent,s.updateSize(!1)}}}dock(){throw new h("GID87731")}validateDocking(){throw new h("GIVD87732")}getAllContentItems(){const t=[this];return this.deepGetAllContentItems(this.contentItems,t),t}getAllComponentItems(){const t=[];return this.deepFilterContentItems(this.contentItems,t,(t=>t.isComponent)),t}getConfigMaximisedItems(){const t=[];return this.deepFilterContentItems(this.contentItems,t,(t=>!(!lt.isStack(t)||!t.initialWantMaximise)||!(!lt.isComponentItem(t)||!t.initialWantMaximise))),t}getItemsByPopInParentId(t){const e=[];return this.deepFilterContentItems(this.contentItems,e,(e=>e.popInParentIds.includes(t))),e}toConfig(){throw new Error("Cannot generate GroundItem config")}setActiveComponentItem(t,e,i){}updateNodeSize(){const{width:t,height:e}=j(this._containerElement);G(this.element,t),Z(this.element,e),this.contentItems.length>0&&(G(this.contentItems[0].element,t),Z(this.contentItems[0].element,e))}deepGetAllContentItems(t,e){for(let i=0;ithis.onClick(t),this._touchStartEventListener=t=>this.onTouchStart(t),this._element=document.createElement("div"),this._element.classList.add(i),this._element.title=e,this._header.on("destroy",(()=>this.destroy())),this._element.addEventListener("click",this._clickEventListener,{passive:!0}),this._element.addEventListener("touchstart",this._touchStartEventListener,{passive:!0}),this._header.controlsContainerElement.appendChild(this._element)}get element(){return this._element}destroy(){var t;this._element.removeEventListener("click",this._clickEventListener),this._element.removeEventListener("touchstart",this._touchStartEventListener),null===(t=this._element.parentNode)||void 0===t||t.removeChild(this._element)}onClick(t){this._pushEvent(t)}onTouchStart(t){this._pushEvent(t)}}class gt{constructor(t,e,i,n,o){var s;this._layoutManager=t,this._componentItem=e,this._closeEvent=i,this._focusEvent=n,this._dragStartEvent=o,this._isActive=!1,this._tabClickListener=t=>this.onTabClickDown(t),this._tabTouchStartListener=t=>this.onTabTouchStart(t),this._closeClickListener=()=>this.onCloseClick(),this._closeTouchStartListener=()=>this.onCloseTouchStart(),this._dragStartListener=(t,e)=>this.onDragStart(t,e),this._contentItemDestroyListener=()=>this.onContentItemDestroy(),this._tabTitleChangedListener=t=>this.setTitle(t),this._element=document.createElement("div"),this._element.classList.add("lm_tab"),this._titleElement=document.createElement("span"),this._titleElement.classList.add("lm_title"),this._closeElement=document.createElement("div"),this._closeElement.classList.add("lm_close_tab"),this._element.appendChild(this._titleElement),this._element.appendChild(this._closeElement),e.isClosable?(this._closeElement.style.display="",this.element.classList.add("lm_closable")):this._closeElement.style.display="none",this.setTitle(e.title),this._componentItem.on("titleChanged",this._tabTitleChangedListener),(null!==(s=e.reorderEnabled)&&void 0!==s?s:this._layoutManager.layoutConfig.settings.reorderEnabled)&&this.enableReorder(),this._element.addEventListener("click",this._tabClickListener,{passive:!0}),this._element.addEventListener("touchstart",this._tabTouchStartListener,{passive:!0}),this._componentItem.isClosable?(this._closeElement.addEventListener("click",this._closeClickListener,{passive:!0}),this._closeElement.addEventListener("touchstart",this._closeTouchStartListener,{passive:!0})):(this._closeElement.remove(),this._closeElement=void 0),this._componentItem.setTab(this),this._layoutManager.emit("tabCreated",this)}get isActive(){return this._isActive}get componentItem(){return this._componentItem}get contentItem(){return this._componentItem}get element(){return this._element}get titleElement(){return this._titleElement}get closeElement(){return this._closeElement}get reorderEnabled(){return void 0!==this._dragListener}set reorderEnabled(t){t!==this.reorderEnabled&&(t?this.enableReorder():this.disableReorder())}setTitle(t){this._titleElement.innerText=t,this._element.title=t}setActive(t){t!==this._isActive&&(this._isActive=t,t?this._element.classList.add("lm_active"):this._element.classList.remove("lm_active"))}destroy(){var t,e;this._closeEvent=void 0,this._focusEvent=void 0,this._dragStartEvent=void 0,this._element.removeEventListener("click",this._tabClickListener),this._element.removeEventListener("touchstart",this._tabTouchStartListener),null===(t=this._closeElement)||void 0===t||t.removeEventListener("click",this._closeClickListener),null===(e=this._closeElement)||void 0===e||e.removeEventListener("touchstart",this._closeTouchStartListener),this._componentItem.off("titleChanged",this._tabTitleChangedListener),this.reorderEnabled&&this.disableReorder(),this._element.remove()}setBlurred(){this._element.classList.remove("lm_focused"),this._titleElement.classList.remove("lm_focused")}setFocused(){this._element.classList.add("lm_focused"),this._titleElement.classList.add("lm_focused")}onDragStart(t,e){if(void 0===this._dragListener)throw new u("TODSDLU10093");if(void 0===this._dragStartEvent)throw new u("TODS23309");this._dragStartEvent(t,e,this._dragListener,this.componentItem)}onContentItemDestroy(){void 0!==this._dragListener&&(this._dragListener.destroy(),this._dragListener=void 0)}onTabClickDown(t){const e=t.target;e!==this._element&&e!==this._titleElement||(0===t.button?this.notifyFocus():1===t.button&&this._componentItem.isClosable&&this.notifyClose())}onTabTouchStart(t){t.target===this._element&&this.notifyFocus()}onCloseClick(){this.notifyClose()}onCloseTouchStart(){this.notifyClose()}notifyClose(){if(void 0===this._closeEvent)throw new u("TNC15007");this._closeEvent(this._componentItem)}notifyFocus(){if(void 0===this._focusEvent)throw new u("TNA15007");this._focusEvent(this._componentItem)}enableReorder(){this._dragListener=new rt(this._element,[this._titleElement]),this._dragListener.on("dragStart",this._dragStartListener),this._componentItem.on("destroy",this._contentItemDestroyListener)}disableReorder(){if(void 0===this._dragListener)throw new u("TDR87745");this._componentItem.off("destroy",this._contentItemDestroyListener),this._dragListener.off("dragStart",this._dragStartListener),this._dragListener=void 0}}class _t{constructor(t,e,i,n,o){this._layoutManager=t,this._componentRemoveEvent=e,this._componentFocusEvent=i,this._componentDragStartEvent=n,this._dropdownActiveChangedEvent=o,this._tabs=[],this._lastVisibleTabIndex=-1,this._dropdownActive=!1,this._element=document.createElement("section"),this._element.classList.add("lm_tabs"),this._dropdownElement=document.createElement("section"),this._dropdownElement.classList.add("lm_tabdropdown_list"),this._dropdownElement.style.display="none"}get tabs(){return this._tabs}get tabCount(){return this._tabs.length}get lastVisibleTabIndex(){return this._lastVisibleTabIndex}get element(){return this._element}get dropdownElement(){return this._dropdownElement}get dropdownActive(){return this._dropdownActive}destroy(){for(let t=0;tthis.handleTabCloseEvent(t)),(t=>this.handleTabFocusEvent(t)),((t,e,i,n)=>this.handleTabDragStartEvent(t,e,i,n)));void 0===e&&(e=this._tabs.length),this._tabs.splice(e,0,i),ethis._lastVisibleTabIndex){const t=this._tabs[e];for(let t=e;t>0;t--)this._tabs[t]=this._tabs[t-1];this._tabs[0]=t}}updateTabSizes(t,e){let i=!1;this.tryUpdateTabSizes(i,t,e)||(i=!0,this.tryUpdateTabSizes(i,t,e)),this._element.style.maxWidth=F(Math.max(0,t)),i!==this._dropdownActive&&(this._dropdownActive=i,this._dropdownActiveChangedEvent())}tryUpdateTabSizes(t,e,i){if(this._tabs.length>0){if(void 0===i)throw new Error("non-empty tabs must have active component item");let n=0,o=!1;const s=this._layoutManager.layoutConfig.settings.tabOverlapAllowance,r=this._tabs.indexOf(i.tab),a=this._tabs[r];this._lastVisibleTabIndex=-1;for(let i=0;ie){if(o)i===r&&(l.style.zIndex="auto",l.style.marginLeft="",l.parentElement!==this._element&&this._element.appendChild(l));else{let t;if(t=r>0&&r<=i?(d-e)/(i-1):(d-e)/i,tthis.onClick(t),this._touchStartListener=t=>this.onTouchStart(t),this._layoutStateListener=()=>this.onLayoutChanged(),this._tabsContainer=new _t(this._layoutManager,(t=>this.handleTabInitiatedComponentRemoveEvent(t)),(t=>this.handleTabInitiatedComponentFocusEvent(t)),((t,e,i,n)=>this.handleTabInitiatedDragStartEvent(t,e,i,n)),(()=>this.processTabDropdownActiveChanged())),this._show=i.show,this._popoutLabel=i.popoutLabel,this._maximiseLabel=i.maximiseLabel,this._minimiseLabel=i.minimiseLabel,this._closeLabel=i.closeLabel,this._tabDropdownEnabled=i.tabDropdownEnabled,this._tabDropdownLabel=i.tabDropdownLabel,this.setSide(i.side),this._element=document.createElement("section"),this._element.classList.add("lm_header"),this._controlsContainerElement=document.createElement("section"),this._controlsContainerElement.classList.add("lm_controls"),this._element.appendChild(this._tabsContainer.element),this._element.appendChild(this._controlsContainerElement),this._element.appendChild(this._tabsContainer.dropdownElement),this._element.addEventListener("click",this._clickListener,{passive:!0}),this._element.addEventListener("touchstart",this._touchStartListener,{passive:!0}),this._documentMouseUpListener=()=>this._tabsContainer.hideAdditionalTabsDropdown(),globalThis.document.addEventListener("mouseup",this._documentMouseUpListener,{passive:!0}),this._tabControlOffset=this._layoutManager.layoutConfig.settings.tabControlOffset,this._tabDropdownEnabled&&(this._tabDropdownButton=new pt(this,this._tabDropdownLabel,"lm_tabdropdown",(()=>this._tabsContainer.showAdditionalTabsDropdown()))),this._popoutButton=new pt(this,this._popoutLabel,"lm_popout",(()=>this.handleButtonPopoutEvent())),this._maximiseButton=new pt(this,this._maximiseLabel,"lm_maximise",(t=>this.handleButtonMaximiseToggleEvent(t))),this._closeButton=new pt(this,this._closeLabel,"lm_close",(()=>o())),this.processTabDropdownActiveChanged(),this.layoutManager.addEventListener("stateChanged",this._layoutStateListener)}get show(){return this._show}get side(){return this._side}get leftRightSided(){return this._leftRightSided}get layoutManager(){return this._layoutManager}get parent(){return this._parent}get tabs(){return this._tabsContainer.tabs}get lastVisibleTabIndex(){return this._tabsContainer.lastVisibleTabIndex}get element(){return this._element}get tabsContainerElement(){return this._tabsContainer.element}get controlsContainerElement(){return this._controlsContainerElement}destroy(){this.emit("destroy"),this._popoutEvent=void 0,this._maximiseToggleEvent=void 0,this._clickEvent=void 0,this._touchStartEvent=void 0,this._componentRemoveEvent=void 0,this._componentFocusEvent=void 0,this._componentDragStartEvent=void 0,this._tabsContainer.destroy(),globalThis.document.removeEventListener("mouseup",this._documentMouseUpListener),this.layoutManager.removeEventListener("stateChanged",this._layoutStateListener),this._element.remove()}createTab(t,e){this._tabsContainer.createTab(t,e)}removeTab(t){this._tabsContainer.removeTab(t)}processActiveComponentChanged(t){this._tabsContainer.processActiveComponentChanged(t),this.updateTabSizes()}setSide(t){this._side=t,this._leftRightSided=[_.right,_.left].includes(this._side)}updateButtons(){var t,e,i;const n=this._getActiveComponentItemEvent(),o=null===this._parent.findAncestorWithSiblings(),s=null===this.layoutManager.parent,r=this.tabs.every((t=>t.componentItem.isClosable)),a=!1!==(null===(t=null==n?void 0:n.headerConfig)||void 0===t?void 0:t.close);Y(this._closeButton.element,r&&a);let l=!1!==(null===(e=null==n?void 0:n.headerConfig)||void 0===e?void 0:e.popout);this._layoutManager.layoutConfig.settings.popoutWholeStack?l&&(l=!o||s):l&&(l=!o||this.tabs.length>1||s),Y(this._popoutButton.element,l);const h=(!1!==(null===(i=null==n?void 0:n.headerConfig)||void 0===i?void 0:i.maximise)||this._parent.isMaximised)&&!o;Y(this._maximiseButton.element,h)}applyFocusedValue(t){t?this._element.classList.add("lm_focused"):this._element.classList.remove("lm_focused")}processMaximised(){if(void 0===this._maximiseButton)throw new u("HPMAX16997");this._maximiseButton.element.setAttribute("title",this._minimiseLabel)}processMinimised(){if(void 0===this._maximiseButton)throw new u("HPMIN16997");this._maximiseButton.element.setAttribute("title",this._maximiseLabel)}updateTabSizes(){if(this._tabsContainer.tabCount>0){const t=this._show?this._layoutManager.layoutConfig.dimensions.headerHeight:0;let e;this._leftRightSided?(this._element.style.height="",this._element.style.width=F(t)):(this._element.style.width="",this._element.style.height=F(t)),e=this._leftRightSided?this._element.offsetHeight-this._controlsContainerElement.offsetHeight-this._tabControlOffset:this._element.offsetWidth-this._controlsContainerElement.offsetWidth-this._tabControlOffset,this._tabsContainer.updateTabSizes(e,this._getActiveComponentItemEvent())}}handleTabInitiatedComponentRemoveEvent(t){if(void 0===this._componentRemoveEvent)throw new u("HHTCE22294");this._componentRemoveEvent(t)}handleTabInitiatedComponentFocusEvent(t){if(void 0===this._componentFocusEvent)throw new u("HHTAE22294");this._componentFocusEvent(t)}handleTabInitiatedDragStartEvent(t,e,i,n){if(void 0===this._componentDragStartEvent)throw new u("HHTDSE22294");this._componentDragStartEvent(t,e,i,n)}processTabDropdownActiveChanged(){void 0!==this._tabDropdownButton&&Y(this._tabDropdownButton.element,this._tabsContainer.dropdownActive)}handleButtonPopoutEvent(){if(this._layoutManager.layoutConfig.settings.popoutWholeStack){if(void 0===this._popoutEvent)throw new u("HHBPOE17834");this._popoutEvent()}else{const t=this._getActiveComponentItemEvent();t&&t.popout()}}handleButtonMaximiseToggleEvent(t){if(void 0===this._maximiseToggleEvent)throw new u("HHBMTE16834");this._maximiseToggleEvent()}onClick(t){t.target===this._element&&this.notifyClick(t)}onTouchStart(t){t.target===this._element&&this.notifyTouchStart(t)}onLayoutChanged(){this.updateButtons()}notifyClick(t){if(void 0===this._clickEvent)throw new u("HNHC46834");this._clickEvent(t)}notifyTouchStart(t){if(void 0===this._touchStartEvent)throw new u("HNHTS46834");this._touchStartEvent(t)}}class vt extends ut{constructor(t,e,i){var n,o,s,r,a,l,h,d,c,u,m,p,g,f,v,C,y,w,I;super(t,e,i,vt.createElement(document)),this._headerSideChanged=!1,this._resizeListener=()=>this.handleResize(),this._maximisedListener=()=>this.handleMaximised(),this._minimisedListener=()=>this.handleMinimised(),this._debouncedEmitStateChangedEvent=tt((()=>this.emitBaseBubblingEvent("stateChanged"))),this._headerConfig=e.header;const b=t.layoutConfig.header,S=e.content;let E;E=1!==S.length?void 0:S[0].header,this._initialWantMaximise=e.maximised,this._initialActiveItemIndex=null!==(n=e.activeItemIndex)&&void 0!==n?n:0;const x=null!==(r=null!==(s=null===(o=this._headerConfig)||void 0===o?void 0:o.show)&&void 0!==s?s:null==E?void 0:E.show)&&void 0!==r?r:b.show,z=null!==(h=null!==(l=null===(a=this._headerConfig)||void 0===a?void 0:a.popout)&&void 0!==l?l:null==E?void 0:E.popout)&&void 0!==h?h:b.popout,M=null!==(u=null!==(c=null===(d=this._headerConfig)||void 0===d?void 0:d.maximise)&&void 0!==c?c:null==E?void 0:E.maximise)&&void 0!==u?u:b.maximise,L=null!==(g=null!==(p=null===(m=this._headerConfig)||void 0===m?void 0:m.close)&&void 0!==p?p:null==E?void 0:E.close)&&void 0!==g?g:b.close,P=null!==(C=null!==(v=null===(f=this._headerConfig)||void 0===f?void 0:f.minimise)&&void 0!==v?v:null==E?void 0:E.minimise)&&void 0!==C?C:b.minimise,T=null!==(I=null!==(w=null===(y=this._headerConfig)||void 0===y?void 0:y.tabDropdown)&&void 0!==w?w:null==E?void 0:E.tabDropdown)&&void 0!==I?I:b.tabDropdown;this._maximisedEnabled=!1!==M;const A={show:!1!==x,side:!1===x?_.top:x,popoutEnabled:!1!==z,popoutLabel:!1===z?"":z,maximiseEnabled:this._maximisedEnabled,maximiseLabel:!1===M?"":M,closeEnabled:!1!==L,closeLabel:!1===L?"":L,minimiseEnabled:!0,minimiseLabel:P,tabDropdownEnabled:!1!==T,tabDropdownLabel:!1===T?"":T};this._header=new ft(t,this,A,(()=>this.getActiveComponentItem()),(()=>this.remove()),(()=>this.handlePopoutEvent()),(()=>this.toggleMaximise()),(t=>this.handleHeaderClickEvent(t)),(t=>this.handleHeaderTouchStartEvent(t)),(t=>this.handleHeaderComponentRemoveEvent(t)),(t=>this.handleHeaderComponentFocusEvent(t)),((t,e,i,n)=>this.handleHeaderComponentStartDragEvent(t,e,i,n))),this.isStack=!0,this._childElementContainer=document.createElement("section"),this._childElementContainer.classList.add("lm_items"),this.on("resize",this._resizeListener),this._maximisedEnabled&&(this.on("maximised",this._maximisedListener),this.on("minimised",this._minimisedListener)),this.element.appendChild(this._header.element),this.element.appendChild(this._childElementContainer),this.setupHeaderPosition()}get childElementContainer(){return this._childElementContainer}get header(){return this._header}get headerShow(){return this._header.show}get headerSide(){return this._header.side}get headerLeftRightSided(){return this._header.leftRightSided}get contentAreaDimensions(){return this._contentAreaDimensions}get initialWantMaximise(){return this._initialWantMaximise}get isMaximised(){return this===this.layoutManager.maximisedStack}get stackParent(){if(!this.parent)throw new Error("Stack should always have a parent");return this.parent}updateSize(t){this.layoutManager.beginVirtualSizedContainerAdding();try{this.updateNodeSize(),this.updateContentItemsSize(t)}finally{this.layoutManager.endVirtualSizedContainerAdding()}}init(){if(!0===this.isInitialised)return;this.updateNodeSize();for(let t=0;t0){if(this._initialActiveItemIndex<0||this._initialActiveItemIndex>=e)throw new Error(`ActiveItemIndex out of range: ${this._initialActiveItemIndex} id: ${this.id}`);for(let i=0;ithis.contentItems.length)throw e-=1,new h("SAC99728");if(t instanceof ct)return e=super.addChild(t,e),this._childElementContainer.appendChild(t.element),this._header.createTab(t,e),this.setActiveComponentItem(t,i),this._header.updateTabSizes(),this.updateSize(!1),t.container.setBaseLogicalZIndex(),this.emitStateChangedEvent(),e;throw new h("SACC88532")}removeChild(t,e){const i=t,n=this.contentItems.indexOf(i),o=1===this.contentItems.length;if(this._activeComponentItem===i&&(i.focused&&i.blur(),!o)){const t=0===n?1:n-1;this.setActiveComponentItem(this.contentItems[t],!1)}this._header.removeTab(i),super.removeChild(i,e),this.emitStateChangedEvent()}toggleMaximise(){this.isMaximised?this.minimise():this.maximise()}maximise(){if(!this.isMaximised){this.layoutManager.setMaximisedStack(this);const t=this.contentItems,e=t.length;for(let i=0;i0&&void 0===t)throw new Error("expected non-empty stack to have an active component item");return{type:"stack",content:this.calculateConfigContent(),size:this.size,sizeUnit:this.sizeUnit,minSize:this.minSize,minSizeUnit:this.minSizeUnit,id:this.id,isClosable:this.isClosable,maximised:this.isMaximised,header:this.createHeaderConfig(),activeItemIndex:t}}onDrop(t,e){if("header"===this._dropSegment){if(this.resetHeaderDropZone(),void 0===this._dropIndex)throw new u("SODDI68990");return void this.addChild(t,this._dropIndex)}if("body"===this._dropSegment)return void this.addChild(t,0,!0);const i="top"===this._dropSegment||"bottom"===this._dropSegment,n="left"===this._dropSegment||"right"===this._dropSegment,o="top"===this._dropSegment||"left"===this._dropSegment,s=i&&this.stackParent.isColumn||n&&this.stackParent.isRow;if(t.isComponent){const e=x.createDefault();e.header=t.headerConfig;const i=this.layoutManager.createAndInitContentItem(e,this);i.addChild(t),t=i}if(t.type===y.row||t.type===y.column){const e=x.createDefault();e.header=this.createHeaderConfig();const i=this.layoutManager.createContentItem(e,this);i.addChild(t),t=i}if(s){const e=this.stackParent.contentItems.indexOf(this);this.stackParent.addChild(t,o?e:e+1,!0),this.size*=.5,t.size=this.size,t.sizeUnit=this.sizeUnit,this.stackParent.updateSize(!1)}else{const e=i?y.column:y.row,n=S.createDefault(e),s=this.layoutManager.createContentItem(n,this);this.stackParent.replaceChild(this,s),s.addChild(t,o?0:void 0,!0),s.addChild(this,o?void 0:0,!0),this.size=50,t.size=50,t.sizeUnit=I.Percent,s.updateSize(!1)}}highlightDropZone(t,e){for(const i in this._contentAreaDimensions){const n=i,o=this._contentAreaDimensions[n].hoverArea;if(o.x1t&&o.y1e)return void("header"===n?(this._dropSegment="header",this.highlightHeaderDropZone(this._header.leftRightSided?e:t)):(this.resetHeaderDropZone(),this.highlightBodyDropZone(n)))}}getArea(){if("none"===this.element.style.display)return null;const t=super.getElementArea(this._header.element),e=super.getElementArea(this._childElementContainer);if(null===t||null===e)throw new c("SGAHC13086");const i=e.x2-e.x1,n=e.y2-e.y1;return this._contentAreaDimensions={header:{hoverArea:{x1:t.x1,y1:t.y1,x2:t.x2,y2:t.y2},highlightArea:{x1:t.x1,y1:t.y1,x2:t.x2,y2:t.y2}}},0===this.contentItems.length?(this._contentAreaDimensions.body={hoverArea:{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2},highlightArea:{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2}},super.getElementArea(this.element)):(this._contentAreaDimensions.left={hoverArea:{x1:e.x1,y1:e.y1,x2:e.x1+.25*i,y2:e.y2},highlightArea:{x1:e.x1,y1:e.y1,x2:e.x1+.5*i,y2:e.y2}},this._contentAreaDimensions.top={hoverArea:{x1:e.x1+.25*i,y1:e.y1,x2:e.x1+.75*i,y2:e.y1+.5*n},highlightArea:{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y1+.5*n}},this._contentAreaDimensions.right={hoverArea:{x1:e.x1+.75*i,y1:e.y1,x2:e.x2,y2:e.y2},highlightArea:{x1:e.x1+.5*i,y1:e.y1,x2:e.x2,y2:e.y2}},this._contentAreaDimensions.bottom={hoverArea:{x1:e.x1+.25*i,y1:e.y1+.5*n,x2:e.x1+.75*i,y2:e.y2},highlightArea:{x1:e.x1,y1:e.y1+.5*n,x2:e.x2,y2:e.y2}},super.getElementArea(this.element))}positionHeader(t){this._header.side!==t&&(this._header.setSide(t),this._headerSideChanged=!0,this.setupHeaderPosition())}updateNodeSize(){if("none"!==this.element.style.display){const t=q(this.element);this._header.show&&(t[this._header.leftRightSided?g.width:g.height]-=this.layoutManager.layoutConfig.dimensions.headerHeight),G(this._childElementContainer,t.width),Z(this._childElementContainer,t.height);for(let e=0;e=o&&t=0&&this._proxyContainerElement.insertAdjacentElement("afterend",n)),this._element.style.left=F(t),this._element.style.top=F(e),s.setAttribute("title",this._componentItem.title),r.insertAdjacentText("afterbegin",this._componentItem.title),this._proxyContainerElement.appendChild(this._componentItem.element)}drag(t,e){const i=this.setDropPosition(t,e);return this._componentItem.drag(),i}setDropPosition(t,e){this._element.style.left=F(t),this._element.style.top=F(e);const i=this.layoutManager.getArea(t,e);return(null!==i||t=this._groundArea.x2||e=this._groundArea.y2)&&(this._lastArea=i),this._lastArea}drop(){this._componentItem.exitDragMode();let t=null,e=null;const i=this._action.currentTarget;if((null==i?void 0:i.owner)===this._action&&(t=i.area),null!==t)e=this._componentItem,t.contentItem.onDrop(e,t),this.layoutManager.focusWindow();else if(null===i&&null===this._action.parent){const t=X(globalThis),e={left:t.left+this.element.offsetLeft,top:t.top+this.element.offsetTop,width:this._originalSize.width,height:this._originalSize.height};this.layoutManager.createPopoutFromContentItem(this._componentItem,e,Q(),this._dockPoint),this._componentItem.destroy()}else this._componentItem.destroy();this.layoutManager.emit("itemDropped",this._componentItem),this._componentItemFocused&&(null==e||e.focus()),this._element.remove()}setDimensions(){const t=this.layoutManager.layoutConfig.dimensions;if(void 0===t)throw new Error("DragProxy.setDimensions: dimensions undefined");let e=t.dragProxyWidth,i=t.dragProxyHeight;if(void 0===e||void 0===i)throw new Error("DragProxy.setDimensions: width and/or height undefined");this._outerWidth=e,this._outerHeight=i;const n=!1===this.layoutManager.layoutConfig.header.show?0:t.headerHeight;this._element.style.width=F(e),this._element.style.height=F(i),e-=this._sided?n:0,i-=this._sided?0:n,this._proxyContainerElement.style.width=F(e),this._proxyContainerElement.style.height=F(i),this._componentItem.enterDragMode(e,i),this._componentItem.show()}}class yt{constructor(t,e,i,n){if(this._owner=t,this._area=e,this._pageX=i,this._pageY=n,t.layoutManager!==e.contentItem.layoutManager)throw Error("LayoutManager of Area and DragProxy must match")}get owner(){return this._owner}get area(){return this._area}drop(t){this._area.contentItem.onDrop(t,this._area)}highlightDropZone(){this.area.contentItem.highlightDropZone(this._pageX,this._pageY,this._area)}}class wt extends ot{constructor(t,e=!1,i=null){super(),this._layoutManager=t,this._allowPopout=e,this._parent=i,this._dragProxy=null,this._currentTarget=null,this._dragListener=null,this._actions=[],this._dragEventHandler=(t,e,i)=>this.onDrag(i),this._dragStopEventHandler=()=>this.onDragStop(),this._boundingRect=this.computeBoundingRect(),this.parentOrSelf._actions.push(this)}get layoutManager(){return this._layoutManager}get parent(){return this._parent}get proxy(){return this._dragProxy}get parentOrSelf(){var t;return null!==(t=this._parent)&&void 0!==t?t:this}get currentTarget(){return this.parentOrSelf._currentTarget}set currentTarget(t){this.parentOrSelf._currentTarget=t}computeBoundingRect(){if(void 0===this._layoutManager.groundItem)throw new u("DACBR11120");{const t=this._layoutManager.groundItem.element.getBoundingClientRect();return DOMRect.fromRect({x:document.body.scrollLeft+t.left,y:document.body.scrollTop+t.top,width:t.width,height:t.height})}}screenToPage(t,e){const i=X(globalThis);return{x:document.body.scrollLeft+t-i.left,y:document.body.scrollTop+e-i.top}}isProxyVisible(t,e,i){return e>=this._boundingRect.left-t.outerWidth&&e=this._boundingRect.top-t.outerHeight&&ithis.onDragStart(t,e))),this._dragListener.on("dragStop",(()=>this.onDragStop()))}onDragStart(t,e){var i,n;const o="component";let s;if("function"==typeof this._componentTypeOrFtn){const t=this._componentTypeOrFtn();s=It.isDragSourceComponentItemConfig(t)?{type:o,componentState:t.state,componentType:t.type,title:null!==(i=t.title)&&void 0!==i?i:this._title}:t}else s={type:o,componentState:this._componentState,componentType:this._componentTypeOrFtn,title:this._title,id:this._id};const r=W.resolve(s,!1),a=new ct(this._layoutManager,r,this._dummyGroundContentItem);if(this._dummyGroundContentItem.contentItems.push(a),null===this._dragListener)throw new c("DSODSD66746");{const i=wt.start(this._layoutManager,this._dragListener,a,t,e,!1),o=this._layoutManager.transitionIndicator;if(null===o)throw new c("DSODST66746");{const t=null===(n=i.proxy)||void 0===n?void 0:n.element;if(void 0===t)throw new u("DSODST66747");o.transitionElements(this._element,t)}}}onDragStop(){this.createDragListener()}removeDragListener(){null!==this._dragListener&&(this._dragListener.destroy(),this._dragListener=null)}}!function(t){t.isDragSourceComponentItemConfig=function(t){return!("componentType"in t)}}(It||(It={}));class bt{constructor(){this._element=document.createElement("div"),this._element.classList.add("lm_dropTargetIndicator");const t=document.createElement("div");t.classList.add("lm_inner"),this._element.appendChild(t),document.body.appendChild(this._element)}destroy(){this._element.remove()}highlightArea(t,e){this._element.style.left=F(t.x1+e),this._element.style.top=F(t.y1+e),this._element.style.width=F(t.x2-t.x1-e-1),this._element.style.height=F(t.y2-t.y1-e-1),this._element.style.visibility="visible"}hide(){this._element.style.visibility="hidden"}}class St{constructor(){this._element=document.createElement("div"),this._element.classList.add("lm_transition_indicator"),document.body.appendChild(this._element),this._toElement=null,this._fromDimensions=null,this._totalAnimationDuration=200,this._animationStartTime=null}destroy(){this._element.remove()}transitionElements(t,e){}nextAnimationFrame(){}measure(t){const e=t.getBoundingClientRect();return{left:e.left,top:e.top,width:t.offsetWidth,height:t.offsetHeight}}}class Et extends ot{constructor(t){super(),this._layoutManager=t,this._childEventListener=t=>this.onEventFromChild(t),globalThis.addEventListener(Et.ChildEventName,this._childEventListener,{passive:!0})}emit(t,...e){"userBroadcast"===t?this.emitUserBroadcast(...e):super.emit(t,...e)}emitUserBroadcast(...t){this.handleUserBroadcastEvent("userBroadcast",t)}destroy(){globalThis.removeEventListener(Et.ChildEventName,this._childEventListener)}handleUserBroadcastEvent(t,e){this._layoutManager.isSubWindow?this.propagateToParent(t,e):this.propagateToThisAndSubtree(t,e)}onEventFromChild(t){const e=t.detail;this.handleUserBroadcastEvent(e.eventName,e.args)}propagateToParent(t,e){const i={bubbles:!0,cancelable:!0,detail:{layoutManager:this._layoutManager,eventName:t,args:e}},n=new CustomEvent(Et.ChildEventName,i),o=globalThis.opener;if(null===o)throw new c("EHPTP15778");o.dispatchEvent(n)}propagateToThisAndSubtree(t,e){this.emitUnknown(t,...e);for(let i=0;ithis.handleContainerResize())),this._windowBeforeUnloadListener=()=>this.onBeforeUnload(),this._windowBeforeUnloadListening=!1,this._maximisedStackBeforeDestroyedListener=t=>this.cleanupBeforeMaximisedStackDestroyed(t),this.moveWindowTop=()=>{},this.focusWindow=()=>globalThis.focus(),this.isSubWindow=e.isSubWindow,this._constructorOrSubWindowLayoutConfig=e.constructorOrSubWindowLayoutConfig,t.checkInitialise(),b.checkInitialise(),void 0!==e.containerElement&&(this._containerElement=e.containerElement)}get container(){return this._containerElement}get isInitialised(){return this._isInitialised}get isDragging(){return document.body.classList.contains("lm_dragging")}get groundItem(){return this._groundItem}get root(){return this._groundItem}get openPopouts(){return this._openPopouts}get dropTargetIndicator(){return this._dropTargetIndicator}get transitionIndicator(){return this._transitionIndicator}get width(){return this._width}get height(){return this._height}get eventHub(){return this._eventHub}get rootItem(){if(void 0===this._groundItem)throw new Error("Cannot access rootItem before init");return 0===this._groundItem.contentItems.length?void 0:this._groundItem.contentItems[0]}get focusedComponentItem(){return this._focusedComponentItem}get tabDropPlaceholder(){return this._tabDropPlaceholder}get maximisedStack(){return this._maximisedStack}get deprecatedConstructor(){return!this.isSubWindow&&void 0!==this._constructorOrSubWindowLayoutConfig}get parent(){return this._parent}set parent(t){this._parent=t}get instances(){var t;const e=[],i=null!==(t=this.parent)&&void 0!==t?t:this;e.push(i);for(let t of i.openPopouts){const i=t.getGlInstance();e.push(i)}return e}destroy(){if(this._isInitialised){this._windowBeforeUnloadListening&&(globalThis.removeEventListener("beforeunload",this._windowBeforeUnloadListener),this._windowBeforeUnloadListening=!1),!0===this.layoutConfig.settings.closePopoutsOnUnload&&this.closeAllOpenPopouts(),this._resizeObserver.disconnect(),this.checkClearResizeTimeout(),void 0!==this._groundItem&&this._groundItem.destroy(),this._tabDropPlaceholder.remove(),null!==this._dropTargetIndicator&&this._dropTargetIndicator.destroy(),null!==this._transitionIndicator&&this._transitionIndicator.destroy(),this._eventHub.destroy();for(const t of this._dragSources)t.destroy();this._dragSources=[],this._isInitialised=!1}}minifyConfig(t){return T.minifyConfig(t)}unminifyConfig(t){return T.unminifyConfig(t)}init(){var t;this.setContainer(),this._dropTargetIndicator=new bt,this._transitionIndicator=new St,this.updateSizeFromContainer(),this.layoutConfig=T.createDefault(),this._groundItem=new mt(this,this.layoutConfig.root,this._containerElement),this._groundItem.init(),this.checkLoadedLayoutMaximiseItem(),this._resizeObserver.observe(this._containerElement),this._isInitialised=!0,this.adjustColumnsResponsive(),this.emit("initialised");let e=this._constructorOrSubWindowLayoutConfig;this.isSubWindow&&void 0!==e&&((null===(t=e.root)||void 0===t?void 0:t.type)==y.component&&(e.root={type:y.stack,content:[e.root]}),this.loadLayout(e))}loadLayout(t){if(!this.isInitialised)throw new Error("GoldenLayout: Need to call init() if LayoutConfig with defined root passed to constructor");if(void 0===this._groundItem)throw new u("LMLL11119");this.layoutConfig=B.resolve(t),this.createSubWindows(),this._groundItem.loadRoot(this.layoutConfig.root),this.checkLoadedLayoutMaximiseItem(),this.adjustColumnsResponsive()}saveLayout(){if(!1===this._isInitialised)throw new Error("Can't create config, layout not yet initialised");if(void 0===this._groundItem)throw new u("LMTC18244");{const t=this._groundItem.calculateConfigContent();let e;e=1!==t.length?void 0:t[0],this.reconcilePopoutWindows();const i=[];for(const t of this._openPopouts)t.isInitialised&&i.push(t.toConfig());return{root:e,openPopouts:i,settings:T.Settings.createCopy(this.layoutConfig.settings),dimensions:T.Dimensions.createCopy(this.layoutConfig.dimensions),header:T.Header.createCopy(this.layoutConfig.header),resolved:!0}}}clear(){if(void 0===this._groundItem)throw new u("LMCL11129");this._groundItem.clearRoot()}toConfig(){return this.saveLayout()}newComponent(t,e,i){const n=this.newComponentAtLocation(t,e,i);if(void 0===n)throw new h("LMNC65588");return n}newComponentAtLocation(t,e,i,n){if(void 0===this._groundItem)throw new Error("Cannot add component before init");{const o=this.addComponentAtLocation(t,e,i,n);if(void 0===o)return;{const t=o.parentItem.contentItems[o.index];if(lt.isComponentItem(t))return t;throw new h("LMNC992877533")}}}addComponent(t,e,i){const n=this.addComponentAtLocation(t,e,i);if(void 0===n)throw new h("LMAC99943");return n}addComponentAtLocation(t,e,i,n){const o={type:"component",componentType:t,componentState:e,title:i};return this.addItemAtLocation(o,n)}newItem(t){const e=this.newItemAtLocation(t);if(void 0===e)throw new h("LMNC65588");return e}newItemAtLocation(t,e){if(void 0===this._groundItem)throw new Error("Cannot add component before init");{const i=this.addItemAtLocation(t,e);if(void 0===i)return;return i.parentItem.contentItems[i.index]}}addItem(t){const e=this.addItemAtLocation(t);if(void 0===e)throw new h("LMAI99943");return e}addItemAtLocation(t,e){if(void 0===this._groundItem)throw new Error("Cannot add component before init");{void 0===e&&(e=xt.defaultLocationSelectors);const i=this.findFirstLocation(e);if(void 0===i)return;{let e,n=i.parentItem;switch(n.type){case y.ground:e=n.addItem(t,i.index),e>=0?n=this._groundItem.contentItems[0]:e=0;break;case y.row:case y.column:e=n.addItem(t,i.index);break;case y.stack:if(D.isComponent(t)){e=n.addItem(t,i.index);break}throw Error(m[6]);case y.component:throw new h("LMAIALC87444602");default:throw new d("LMAIALU98881733",n.type)}if(D.isComponent(t)){const t=n.contentItems[e];lt.isStack(t)&&(n=t,e=0)}return i.parentItem=n,i.index=e,i}}}loadComponentAsRoot(t){if(void 0===this._groundItem)throw new Error("Cannot add item before init");this._groundItem.loadComponentAsRoot(t)}updateSize(t,e){this.setSize(t,e)}setSize(t,e){if(this._width=t,this._height=e,!0===this._isInitialised){if(void 0===this._groundItem)throw new u("LMUS18881");if(this._groundItem.setSize(this._width,this._height),this._maximisedStack){const{width:t,height:e}=j(this._containerElement);G(this._maximisedStack.element,t),Z(this._maximisedStack.element,e),this._maximisedStack.updateSize(!1)}this.adjustColumnsResponsive()}}beginSizeInvalidation(){this._sizeInvalidationBeginCount++}endSizeInvalidation(){0==--this._sizeInvalidationBeginCount&&this.updateSizeFromContainer()}updateSizeFromContainer(){const{width:t,height:e}=j(this._containerElement);this.setSize(t,e)}updateRootSize(t=!1){if(void 0===this._groundItem)throw new u("LMURS28881");this._groundItem.updateSize(t)}createAndInitContentItem(t,e){const i=this.createContentItem(t,e);return i.init(),i}createContentItem(t,e){if("string"!=typeof t.type)throw new o("Missing parameter 'type'",JSON.stringify(t));return!S.isComponentItem(t)||e instanceof vt||!e||!0===this.isSubWindow&&e instanceof mt||(t={type:y.stack,content:[t],size:t.size,sizeUnit:t.sizeUnit,minSize:t.minSize,minSizeUnit:t.minSizeUnit,id:t.id,maximised:t.maximised,isClosable:t.isClosable,activeItemIndex:0,header:void 0}),this.createContentItemFromConfig(t,e)}findFirstComponentItemById(t){if(void 0===this._groundItem)throw new u("LMFFCIBI82446");return this.findFirstContentItemTypeByIdRecursive(y.component,t,this._groundItem)}createPopoutFromContentItem(t,e,i,n){var o;const s=null!=n?n:t.findDockPoint();if(null===s)throw new c("LMCPFCI00834");{if(null!==i&&s.parent.addPopInParentId(i),void 0===e){const i=X(globalThis),n=t instanceof ct?t.getOuterBoundingClientRect():t.element.getBoundingClientRect();e={left:i.left+n.left,top:i.top+n.top,width:n.width,height:n.height}}const n=t.toConfig();if((null===(o=t.parent)||void 0===o?void 0:o.contentItems.includes(t))&&t.remove(),L.isRootItemConfig(n))return this.createPopoutFromItemConfig(n,e,i,s.index);throw new Error(`${m[0]}`)}}beginVirtualSizedContainerAdding(){0==++this._virtualSizedContainerAddingBeginCount&&(this._virtualSizedContainers.length=0)}addVirtualSizedContainer(t){this._virtualSizedContainers.push(t)}endVirtualSizedContainerAdding(){if(0==--this._virtualSizedContainerAddingBeginCount){const t=this._virtualSizedContainers.length;if(t>0){this.fireBeforeVirtualRectingEvent(t);for(let e=0;e{const t=a.getGlInstance(),e=function(){var e,i;t.isDragging||0!==(null===(i=null===(e=t.groundItem)||void 0===e?void 0:e.getAllComponentItems())||void 0===i?void 0:i.length)||a.close()};t.on("itemDropped",e),t.on("itemDestroyed",e),this.emit("windowOpened",a)})),a.on("closed",(()=>this.reconcilePopoutWindows())),this._openPopouts.push(a),this.layoutConfig.settings.closePopoutsOnUnload&&!this._windowBeforeUnloadListening&&(globalThis.addEventListener("beforeunload",this._windowBeforeUnloadListener,{passive:!0}),this._windowBeforeUnloadListening=!0),a}closeAllOpenPopouts(t=!1){for(let e=0;e0;if(s&&!r&&!a)return void i.cancelDrag();const l=wt.start(this,i,n,t,e,r);if(a)for(let t of this.instances)t!==this&&t.startExternalComponentDrag(l)}hideDropTargetIndicator(){var t;this.tabDropPlaceholder.remove(),null===(t=this.dropTargetIndicator)||void 0===t||t.hide()}focusComponent(t,e=!1){t.focus(e)}clearComponentFocus(t=!1){this.setFocusedComponentItem(void 0,t)}setFocusedComponentItem(t,e=!1){if(t!==this._focusedComponentItem){let i;if(void 0===t||(i=t.parentItem),void 0!==this._focusedComponentItem){const t=this._focusedComponentItem;this._focusedComponentItem=void 0,t.setBlurred(e);const n=t.parentItem;i===n?i=void 0:n.setFocusedValue(!1)}void 0!==t&&(this._focusedComponentItem=t,t.setFocused(e),void 0!==i&&i.setFocusedValue(!0))}}createContentItemFromConfig(t,e){switch(t.type){case y.ground:throw new h("LMCCIFC68871");case y.row:return new ht(!1,this,t,e);case y.column:return new ht(!0,this,t,e);case y.stack:return new vt(this,t,e);case y.component:return new ct(this,t,e);default:throw new d("CCC913564",t.type,"Invalid Config Item type specified")}}setMaximisedStack(t){void 0===t?void 0!==this._maximisedStack&&this.processMinimiseMaximisedStack():t!==this._maximisedStack&&(void 0!==this._maximisedStack&&this.processMinimiseMaximisedStack(),this.processMaximiseStack(t))}checkMinimiseMaximisedStack(){void 0!==this._maximisedStack&&this._maximisedStack.minimise()}cleanupBeforeMaximisedStackDestroyed(t){null!==this._maximisedStack&&this._maximisedStack===t.target&&(this._maximisedStack.off("beforeItemDestroyed",this._maximisedStackBeforeDestroyedListener),this._maximisedStack=void 0)}closeWindow(){globalThis.setTimeout((()=>globalThis.close()),1)}getArea(t,e){let i=null,n=1/0;for(let o=0;o=s.x1&&t=s.y1&&es.surface&&(n=s.surface,i=s)}return i}calculateItemAreas(){const t=this.getAllContentItems(),e=this._groundItem;if(void 0===e)throw new u("LMCIAR44365");if(1!==t.length){e.contentItems[0].isStack?this._itemAreas=[]:this._itemAreas=e.createSideAreas();for(let e=0;e0){let e=t[0];if(lt.isComponentItem(e)){const t=e.parent;if(null===t)throw new c("LMXLLMI69999");e=t}if(!lt.isStack(e))throw new h("LMCLLMI19993");e.maximise()}}}processMaximiseStack(t){if(this._maximisedStack=t,t.on("beforeItemDestroyed",this._maximisedStackBeforeDestroyedListener),t.element.classList.add("lm_maximised"),t.element.insertAdjacentElement("afterend",this._maximisePlaceholder),void 0===this._groundItem)throw new u("LMMXI19993");{this._groundItem.element.prepend(t.element);const{width:e,height:i}=j(this._containerElement);G(t.element,e),Z(t.element,i),t.updateSize(!0),t.focusActiveContentItem(),this._maximisedStack.emit("maximised"),this.emit("stateChanged")}}processMinimiseMaximisedStack(){if(void 0===this._maximisedStack)throw new h("LMMMS74422");{const t=this._maximisedStack;if(null===t.parent)throw new c("LMMI13668");t.element.classList.remove("lm_maximised"),this._maximisePlaceholder.insertAdjacentElement("afterend",t.element),this._maximisePlaceholder.remove(),this.updateRootSize(!0),this._maximisedStack=void 0,t.off("beforeItemDestroyed",this._maximisedStackBeforeDestroyedListener),t.emit("minimised"),this.emit("stateChanged")}}reconcilePopoutWindows(){const t=[];for(let e=0;e{this._resizeTimeoutId=void 0,this.beginSizeInvalidation(),this.endSizeInvalidation()}),this.resizeDebounceInterval))}checkClearResizeTimeout(){void 0!==this._resizeTimeoutId&&(clearTimeout(this._resizeTimeoutId),this._resizeTimeoutId=void 0)}setContainer(){var t;const e=document.body,i=null!==(t=this._containerElement)&&void 0!==t?t:e;if(i===e){this.resizeWithContainerAutomatically=!0;const t=document.documentElement;t.style.height="100%",t.style.margin="0",t.style.padding="0",t.style.overflow="hidden",e.style.height="100%",e.style.margin="0",e.style.padding="0",e.style.overflow="hidden"}this._containerElement=i}onBeforeUnload(){this.destroy()}adjustColumnsResponsive(){if(void 0===this._groundItem)throw new u("LMACR20883");if(this._firstLoad=!1,this.useResponsiveLayout()&&!this._updatingColumnsResponsive&&this._groundItem.contentItems.length>0&&this._groundItem.contentItems[0].isRow){if(void 0===this._groundItem||null===this._width)throw new u("LMACR77412");{const t=this._groundItem.contentItems[0].contentItems.length;if(t<=1)return;{const e=this.layoutConfig.dimensions.defaultMinItemWidth;if(t*e<=this._width)return;{this._updatingColumnsResponsive=!0;const i=t-Math.max(Math.floor(this._width/e),1),n=this._groundItem.contentItems[0],o=this.getAllStacks();if(0===o.length)throw new h("LMACRS77413");{const t=o[0];for(let e=0;en?void 0:{parentItem:t,index:o}}}case 1:if(void 0===this._focusedComponentItem)return;{const t=this._focusedComponentItem.parentItem;return this.tryCreateLocationFromParentItem(t,e)}case 2:{const t=this.findFirstContentItemType(y.stack);return void 0===t?void 0:this.tryCreateLocationFromParentItem(t,e)}case 3:{let t=this.findFirstContentItemType(y.row);return void 0!==t?this.tryCreateLocationFromParentItem(t,e):(t=this.findFirstContentItemType(y.column),void 0!==t?this.tryCreateLocationFromParentItem(t,e):void 0)}case 4:{const t=this.findFirstContentItemType(y.row);return void 0===t?void 0:this.tryCreateLocationFromParentItem(t,e)}case 5:{const t=this.findFirstContentItemType(y.column);return void 0===t?void 0:this.tryCreateLocationFromParentItem(t,e)}case 6:if(void 0===this._groundItem)throw new u("LMFLRIF18244");return void 0!==this.rootItem?void 0:void 0===e||0===e?{parentItem:this._groundItem,index:0}:void 0;case 7:if(void 0===this._groundItem)throw new u("LMFLF18244");{const t=this._groundItem.contentItems;if(0===t.length)return void 0===e||0===e?{parentItem:this._groundItem,index:0}:void 0;{const i=t[0];return this.tryCreateLocationFromParentItem(i,e)}}}}tryCreateLocationFromParentItem(t,e){const i=t.contentItems.length;return void 0===e?{parentItem:t,index:i}:e<0||e>i?void 0:{parentItem:t,index:e}}}!function(t){t.createMaximisePlaceElement=function(t){const e=t.createElement("div");return e.classList.add("lm_maximise_place"),e},t.createTabDropPlaceholderElement=function(t){const e=t.createElement("div");return e.classList.add("lm_drop_tab_placeholder"),e},t.defaultLocationSelectors=[{typeId:1,index:void 0},{typeId:2,index:void 0},{typeId:3,index:void 0},{typeId:7,index:void 0}],t.afterFocusedItemIfPossibleLocationSelectors=[{typeId:0,index:1},{typeId:2,index:void 0},{typeId:3,index:void 0},{typeId:7,index:void 0}]}(xt||(xt={}));class zt extends xt{constructor(t,e,i,n){if(super(zt.createLayoutManagerConstructorParameters(t,e)),this._bindComponentEventHanlderPassedInConstructor=!1,this._creationTimeoutPassed=!1,void 0!==e&&"function"==typeof e&&(this.bindComponentEvent=e,this._bindComponentEventHanlderPassedInConstructor=!0,void 0!==i&&(this.unbindComponentEvent=i)),!this._bindComponentEventHanlderPassedInConstructor&&this.isSubWindow){if(void 0===this._constructorOrSubWindowLayoutConfig)throw new u("VLC98823");{const t=B.resolve(this._constructorOrSubWindowLayoutConfig);this.layoutConfig=Object.assign(Object.assign({},t),{root:void 0})}}!0!==n&&(this.deprecatedConstructor||this.init())}destroy(){this.bindComponentEvent=void 0,this.unbindComponentEvent=void 0,super.destroy()}init(){if(this._bindComponentEventHanlderPassedInConstructor||"loading"!==document.readyState&&null!==document.body){if(!this._bindComponentEventHanlderPassedInConstructor&&!0===this.isSubWindow&&!this._creationTimeoutPassed)return setTimeout((()=>this.init()),7),void(this._creationTimeoutPassed=!0);!0===this.isSubWindow&&(this._bindComponentEventHanlderPassedInConstructor||this.clearHtmlAndAdjustStylesForSubWindow(),window.__glInstance=this),super.init()}else document.addEventListener("DOMContentLoaded",(()=>this.init()),{passive:!0})}clearHtmlAndAdjustStylesForSubWindow(){const t=document.head,e=new Array(4);e[0]=document.querySelectorAll("body link"),e[1]=document.querySelectorAll("body style"),e[2]=document.querySelectorAll("template"),e[3]=document.querySelectorAll(".gl_keep");for(let i=0;ithis.emit("popIn"))),document.body.appendChild(t),!0}}bindComponent(t,e){if(void 0!==this.bindComponentEvent)return this.bindComponentEvent(t,e);if(void 0!==this.getComponentEvent)return{virtual:!1,component:this.getComponentEvent(t,e)};{const t=`${m[2]}: ${JSON.stringify(e)}`;throw new a(t)}}unbindComponent(t,e,i){if(void 0!==this.unbindComponentEvent)this.unbindComponentEvent(t);else if(!e&&void 0!==this.releaseComponentEvent){if(void 0===i)throw new u("VCUCRCU333998");this.releaseComponentEvent(t,i)}}}!function(t){let e=!1;t.createLayoutManagerConstructorParameters=function(t,i){const n=e?null:new URL(document.location.href).searchParams.get("gl-window");e=!0;const o=null!==n;let s,r;if(null!==n){const e=localStorage.getItem(n);if(null===e)throw new Error("Null gl-window Config");localStorage.removeItem(n);const i=JSON.parse(e),o=T.unminifyConfig(i);r=B.fromResolved(o),t instanceof HTMLElement&&(s=t)}else void 0===t?r=void 0:t instanceof HTMLElement?(r=void 0,s=t):r=t,void 0===s&&i instanceof HTMLElement&&(s=i);return{constructorOrSubWindowLayoutConfig:r,isSubWindow:o,containerElement:s}}}(zt||(zt={}));class Mt extends zt{constructor(t,e,i){super(t,e,i,!0),this._componentTypesMap=new Map,this._registeredComponentMap=new Map,this._virtuableComponentMap=new Map,this._containerVirtualRectingRequiredEventListener=(t,e,i)=>this.handleContainerVirtualRectingRequiredEvent(t,e,i),this._containerVirtualVisibilityChangeRequiredEventListener=(t,e)=>this.handleContainerVirtualVisibilityChangeRequiredEvent(t,e),this._containerVirtualZIndexChangeRequiredEventListener=(t,e,i)=>this.handleContainerVirtualZIndexChangeRequiredEvent(t,e,i),this.deprecatedConstructor||this.init()}registerComponent(t,e,i=!1){if("function"!=typeof e)throw new r("registerComponent() componentConstructorOrFactoryFtn parameter is not a function");if(e.hasOwnProperty("prototype")){const n=e;this.registerComponentConstructor(t,n,i)}else{const n=e;this.registerComponentFactoryFunction(t,n,i)}}registerComponentConstructor(t,e,i=!1){if("function"!=typeof e)throw new Error(m[1]);if(void 0!==this._componentTypesMap.get(t))throw new a(`${m[3]}: ${t}`);this._componentTypesMap.set(t,{constructor:e,factoryFunction:void 0,virtual:i})}registerComponentFactoryFunction(t,e,i=!1){if("function"!=typeof e)throw new a("Please register a constructor function");if(void 0!==this._componentTypesMap.get(t))throw new a(`${m[3]}: ${t}`);this._componentTypesMap.set(t,{constructor:void 0,factoryFunction:e,virtual:i})}registerComponentFunction(t){this.registerGetComponentConstructorCallback(t)}registerGetComponentConstructorCallback(t){if("function"!=typeof t)throw new Error("Please register a callback function");void 0!==this._getComponentConstructorFtn&&console.warn("Multiple component functions are being registered. Only the final registered function will be used."),this._getComponentConstructorFtn=t}getRegisteredComponentTypeNames(){const t=this._componentTypesMap.keys();return Array.from(t)}getComponentInstantiator(t){let e;const i=z.resolveComponentTypeName(t);return void 0!==i&&(e=this._componentTypesMap.get(i)),void 0===e&&void 0!==this._getComponentConstructorFtn&&(e={constructor:this._getComponentConstructorFtn(t),factoryFunction:void 0,virtual:!1}),e}bindComponent(t,e){let i;const n=z.resolveComponentTypeName(e);let o;if(void 0!==n&&(i=this._componentTypesMap.get(n)),void 0===i&&void 0!==this._getComponentConstructorFtn&&(i={constructor:this._getComponentConstructorFtn(e),factoryFunction:void 0,virtual:!1}),void 0!==i){const s=i.virtual;let r,l;r=void 0===e.componentState?void 0:K({},e.componentState);const d=i.constructor;if(void 0!==d)l=new d(t,r,s);else{const e=i.factoryFunction;if(void 0===e)throw new h("LMBCFFU10008");l=e(t,r,s)}if(s){if(void 0===l)throw new u("GLBCVCU988774");{const e=l,i=e.rootHtmlElement;if(void 0===i)throw new a(`${m[5]}: ${n}`);!function(t){const e="absolute";t.style.position!==e&&(t.style.position=e)}(i),this.container.appendChild(i),this._virtuableComponentMap.set(t,e),t.virtualRectingRequiredEvent=this._containerVirtualRectingRequiredEventListener,t.virtualVisibilityChangeRequiredEvent=this._containerVirtualVisibilityChangeRequiredEventListener,t.virtualZIndexChangeRequiredEvent=this._containerVirtualZIndexChangeRequiredEventListener}}this._registeredComponentMap.set(t,l),o={virtual:i.virtual,component:l}}else o=super.bindComponent(t,e);return o}unbindComponent(t,e,i){if(void 0===this._registeredComponentMap.get(t))super.unbindComponent(t,e,i);else{const e=this._virtuableComponentMap.get(t);if(void 0!==e){const i=e.rootHtmlElement;if(void 0===i)throw new h("GLUC77743",t.title);this.container.removeChild(i),this._virtuableComponentMap.delete(t)}}}fireBeforeVirtualRectingEvent(t){this._goldenLayoutBoundingClientRect=this.container.getBoundingClientRect(),super.fireBeforeVirtualRectingEvent(t)}handleContainerVirtualRectingRequiredEvent(t,e,i){const n=this._virtuableComponentMap.get(t);if(void 0===n)throw new u("GLHCSCE55933");{const o=n.rootHtmlElement;if(void 0===o)throw new a(m[4]+" "+t.title);{const n=t.element.getBoundingClientRect(),s=n.left-this._goldenLayoutBoundingClientRect.left;o.style.left=F(s);const r=n.top-this._goldenLayoutBoundingClientRect.top;o.style.top=F(r),G(o,e),Z(o,i)}}}handleContainerVirtualVisibilityChangeRequiredEvent(t,e){const i=this._virtuableComponentMap.get(t);if(void 0===i)throw new u("GLHCVVCRE55934");{const n=i.rootHtmlElement;if(void 0===n)throw new a(m[4]+" "+t.title);Y(n,e)}}handleContainerVirtualZIndexChangeRequiredEvent(t,e,i){const n=this._virtuableComponentMap.get(t);if(void 0===n)throw new u("GLHCVZICRE55935");{const e=n.rootHtmlElement;if(void 0===e)throw new a(m[4]+" "+t.title);e.style.zIndex=i}}}return i})())); \ No newline at end of file diff --git a/src/Aardvark.UI.Primitives/resources/golden-layout/golden-layout-aard.js b/src/Aardvark.UI.Primitives/resources/golden-layout/golden-layout-aard.js index 53fc238e..e1d05b04 100644 --- a/src/Aardvark.UI.Primitives/resources/golden-layout/golden-layout-aard.js +++ b/src/Aardvark.UI.Primitives/resources/golden-layout/golden-layout-aard.js @@ -11,6 +11,24 @@ if (!aardvark.golden) { instances: new Map() }; + const minifyLayout = function (layout) { + const strip = function (l) { + delete l.header; + delete l.settings; + delete l.dimensions; + delete l.resolved; + delete l.parentId; + delete l.indexInParent; + } + + strip(layout); + for (const p of layout.openPopouts) { + strip(p); + } + + return layout; + } + /** * @param {{element: HTMLElement}} container * @param {HTMLElement} element @@ -52,8 +70,9 @@ if (!aardvark.golden) { * @param {HTMLElement} layoutElement * @param {boolean} isPopout * @param {boolean} setPopoutTitle + * @param {boolean} serializeLayout */ - const createInstance = function (layoutElement, isPopout, setPopoutTitle) { + const createInstance = function (layoutElement, isPopout, setPopoutTitle, serializeLayout) { /** @type {Map} */ const components = new Map(); // Currently bound @@ -129,6 +148,12 @@ if (!aardvark.golden) { const addLayoutChangedHandler = function (layout) { layout.addEventListener('stateChanged', () => { aardvark.processEvent(layoutElement.id, 'onLayoutChanged'); + + if (serializeLayout) { + const root = layout.parent ?? layout; + const newLayout = minifyLayout(root.saveLayout()); + aardvark.processEvent(layoutElement.id, 'onSerializedLayoutChanged', newLayout); + } }, { passive: true }); }; @@ -239,14 +264,15 @@ if (!aardvark.golden) { /** * @param {HTMLElement} layoutElement * @param {*} config + * @param {boolean} serializeLayout */ - aardvark.golden.createLayout = function (layoutElement, config) { + aardvark.golden.createLayout = function (layoutElement, config, serializeLayout) { var instance = aardvark.golden.instances.get(layoutElement.id); const isPopout = (config === undefined); const setPopoutTitle = (config?.settings?.setPopoutTitle === true); if (instance === undefined) { - instance = createInstance(layoutElement, isPopout, setPopoutTitle); + instance = createInstance(layoutElement, isPopout, setPopoutTitle, serializeLayout); aardvark.golden.instances.set(layoutElement.id, instance); } diff --git a/src/Examples (dotnetcore)/27 - GoldenLayout/App.fs b/src/Examples (dotnetcore)/27 - GoldenLayout/App.fs index 28695c80..e0c42c01 100644 --- a/src/Examples (dotnetcore)/27 - GoldenLayout/App.fs +++ b/src/Examples (dotnetcore)/27 - GoldenLayout/App.fs @@ -20,7 +20,7 @@ let layoutConfig = LayoutConfig.Default let defaultLayout = - row { + layout { column { element { id "render" @@ -34,15 +34,18 @@ let defaultLayout = header Header.Left buttons (Buttons.All ^^^ Buttons.Close) } - - weight 2 } - element { - id "aux2" - title "Some pretty long title" - buttons (Buttons.All ^^^ Buttons.Maximize) - weight 1 + popout { + element { + id "aux2" + title "Some pretty long title" + buttons (Buttons.All ^^^ Buttons.Maximize) + weight 1 + } + + width 300 + height 600 } } @@ -126,7 +129,7 @@ let view (model : AdaptiveModel) = body [style "width: 100%; height: 100%; overflow: hidden; margin: 0"] [ let attributes = [ style "width: 100%; height: 100%; min-width: 400px; min-height: 400px; overflow: hidden" - onLayoutChanged (fun _ -> LayoutChanged) + onLayoutChanged' (fun _ -> LayoutChanged) ] GoldenLayout.view attributes model.golden